Fix issue with first frame of camera animation

This commit is contained in:
James Lambert 2023-04-22 09:03:33 -06:00
parent ba5f97b346
commit 0c8bc76732
4 changed files with 30 additions and 9 deletions

View file

@ -245,6 +245,7 @@ static void gameProc(void* arg) {
controllersTriggerRead();
controllerHandlePlayback();
skAnimatorSync();
if (inputIgnore) {
--inputIgnore;

View file

@ -34,6 +34,13 @@ void mainMenuInit(struct MainMenu* mainMenu) {
mainMenu->loadGameText = menuBuildText(&gDejaVuSansFont, "LOAD GAME", 30, 147);
mainMenu->optionsText = menuBuildText(&gDejaVuSansFont, "OPTIONS", 30, 159);
mainMenuReadCamera(mainMenu);
gScene.camera.fov = 56.0f;
}
void mainMenuUpdate(struct MainMenu* mainMenu) {
if (!skAnimatorIsRunning(&gScene.animator.animators[TEST_CHAMBER_00_TEST_CHAMBER_00_ARMATURE_CAMERA])) {
sceneAnimatorPlay(
&gScene.animator,
TEST_CHAMBER_00_TEST_CHAMBER_00_ARMATURE_CAMERA,
@ -41,15 +48,10 @@ void mainMenuInit(struct MainMenu* mainMenu) {
1.0f,
SKAnimatorFlagsLoop
);
mainMenuReadCamera(mainMenu);
gScene.camera.fov = 56.0f;
}
void mainMenuUpdate(struct MainMenu* mainMenu) {
sceneAnimatorUpdate(&gScene.animator);
mainMenuReadCamera(mainMenu);
sceneAnimatorUpdate(&gScene.animator);
}
extern Lights1 gSceneLights;

View file

@ -11,6 +11,7 @@ OSMesgQueue gAnimationQueue;
OSMesg gAnimationQueueEntries[MAX_ANIMATION_QUEUE_ENTRIES];
OSIoMesg gAnimationIOMesg[MAX_ANIMATION_QUEUE_ENTRIES];
int gAnimationNextMessage;
int gPendingAnimationRequests;
void skAnimatorCopy(u32 romAddress, void* target, u32 size) {
if (!gAnimationPiHandle) {
@ -18,6 +19,12 @@ void skAnimatorCopy(u32 romAddress, void* target, u32 size) {
osCreateMesgQueue(&gAnimationQueue, gAnimationQueueEntries, MAX_ANIMATION_QUEUE_ENTRIES);
}
if (gPendingAnimationRequests == MAX_ANIMATION_QUEUE_ENTRIES) {
OSMesg msg;
osRecvMesg(&gAnimationQueue, &msg, OS_MESG_BLOCK);
--gPendingAnimationRequests;
}
// request new chunk
OSIoMesg* ioMesg = &gAnimationIOMesg[gAnimationNextMessage];
gAnimationNextMessage = (gAnimationNextMessage + 1) % MAX_ANIMATION_QUEUE_ENTRIES;
@ -29,6 +36,15 @@ void skAnimatorCopy(u32 romAddress, void* target, u32 size) {
ioMesg->size = size;
osEPiStartDma(gAnimationPiHandle, ioMesg, OS_READ);
++gPendingAnimationRequests;
}
void skAnimatorSync() {
while (gPendingAnimationRequests) {
OSMesg msg;
osRecvMesg(&gAnimationQueue, &msg, OS_MESG_BLOCK);
--gPendingAnimationRequests;
}
}
void skAnimatorInit(struct SKAnimator* animator, int nBones) {

View file

@ -28,6 +28,8 @@ void skAnimatorRunClip(struct SKAnimator* animator, struct SKAnimationClip* clip
int skAnimatorIsRunning(struct SKAnimator* animator);
void skAnimatorSync();
#define SK_SEGMENT_COUNT 16
void skSetSegmentLocation(unsigned segmentNumber, unsigned segmentLocatoin);