Files
PodeCaradoxandClaude Opus 5.5 9bd10a2d81 Steam Frame: native Linux arm64 build
- Cross-build against the Steam Runtime 4 arm64 SDK (build_linux.sh,
  cmake/steamrt4-arm64.cmake): the executable sits at 0x98000000 next to
  the game's 32-bit window, with the OpenXR loader and jsoncpp beside it
  (RPATH $ORIGIN); build_linux.sh also packs a release archive.
- OpenXR on SteamVR: EGL surfaceless through XR_MNDX_egl_enable, the
  Frame controller profile (both names), a flick or a wrist turn as the
  Wii Remote's shake, the D-pad as look; the refresh rate goes to 120 Hz
  through vrcmd where the runtime offers only its current rate.
- Timewarp in the app: SteamVR shows frames that arrive in time as they
  were rendered, so at 120 Hz every game frame stood still for two
  refreshes while the head turned.  The game frame's eyes now go into a
  scene set, and every refresh composites the last finished set turned
  to its own head pose (timewarp.h, checked by tools/timewarp_test and
  by the simulator's PETARI_XRSIM_WARP); sharpening runs once per game
  frame; the pacing changes only after a new display period has held.
- Fixes found on the way: libstdc++'s <cstdio>/<cwchar> against the MSL
  renames (compat.h), language archives a disc carries damaged (cook.py
  takes another language's), host allocations on the DVD and DSP
  threads, quitting without waiting on the game's threads, case of two
  include names.
- ANLEITUNG-STEAM-FRAME.md: the player's guide in German.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 17:26:28 +02:00

77 lines
2.6 KiB
C

#ifndef RVL_FACE_LIBRARY_INTERNAL_DATABASE_H
#define RVL_FACE_LIBRARY_INTERNAL_DATABASE_H
#include "RFLi_HiddenDatabase.h"
#include "RFLi_Types.h"
#include <revolution/mem.h>
#include <revolution/os.h>
#include <revolution/types.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct RFLiDatabase {
u32 identifier; // at 0x0
RFLiCharData rawData[RFL_DB_CHAR_MAX]; // at 0x4
// at 0x1CEC
u32 isolation : 1;
u32 padding1 : 31;
u8 specialInvite[13]; // at 0x1CF0
u8 nwc24Month; // at 0x1CFD
u8 mwc24Day; // at 0x1CFE
u8 padding2; // at 0x1CFF
RFLiHiddenDB hidden; // at 0x1D00
} RFLiDatabase;
typedef struct RFLiCRCInfo {
void* head; // at 0x0
u32 size; // at 0x4
u8* current; // at 0x8
u32 count; // at 0xC
u16 crc; // at 0x10
OSAlarm alarm; // at 0x18
RFLiExCallback callback; // at 0x48
} RFLiCRCInfo;
typedef struct RFLiDBManager {
RFLiDatabase* database; // at 0x0
RFLiCallback saveCb; // at 0x4
RFLiCallback formatCb; // at 0x8
RFLiCallback bootloadCb; // at 0xC
RFLiOpenType saveType; // at 0x10
RFLiCharData trg; // at 0x14
RFLiCRCInfo crcInfo; // at 0x60
} RFLiDBManager;
void RFLiInitDatabase(MEMiHeapHead* heap);
RFLErrcode RFLiBootLoadDatabaseAsync(RFLiCallback callback);
RFLErrcode RFLiSaveDatabaseAsync(RFLiCallback callback);
RFLiCharData* RFLiGetCharData(u16 index);
void RFLiConvertRaw2Info(const RFLiCharData* data, RFLiCharInfo* out);
void RFLiConvertHRaw2Info(const RFLiHiddenCharData* data, RFLiCharInfo* out);
void RFLiConvertInfo2Raw(const RFLiCharInfo* info, RFLiCharData* out);
void RFLiConvertInfo2HRaw(const RFLiCharInfo* info, RFLiHiddenCharData* out);
void RFLiConvertRaw2HRaw(const RFLiCharData* data, RFLiHiddenCharData* out);
RFLErrcode RFLiGetCharRawData(RFLiCharData* out, u16 index);
RFLErrcode RFLiGetCharInfo(RFLiCharInfo* out, u16 index);
void RFLiSetTemporaryID(RFLiCharInfo* info);
BOOL RFLiIsSameID(const RFLCreateID* id1, const RFLCreateID* id2);
BOOL RFLiIsValidID(const RFLCreateID* id);
BOOL RFLiIsSpecialID(const RFLCreateID* id);
BOOL RFLiIsTemporaryID(const RFLCreateID* id);
BOOL RFLiIsValidName(const RFLiCharData* data);
BOOL RFLiIsValidName2(const RFLiCharInfo* info);
BOOL RFLiGetIsolation(void);
RFLiHiddenDB* RFLiGetHiddenHeader(void);
BOOL RFLiDBIsLoaded(void);
u16 RFLiCalculateCRC(const void* p, u32 len);
void RFLiCreateHeaderCRCAsync(RFLiExCallback callback);
void RFLiCheckHeaderCRCAsync(RFLiExCallback callback);
#ifdef __cplusplus
}
#endif
#endif