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(); controllersTriggerRead();
controllerHandlePlayback(); controllerHandlePlayback();
skAnimatorSync();
if (inputIgnore) { if (inputIgnore) {
--inputIgnore; --inputIgnore;

View file

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

View file

@ -11,6 +11,7 @@ OSMesgQueue gAnimationQueue;
OSMesg gAnimationQueueEntries[MAX_ANIMATION_QUEUE_ENTRIES]; OSMesg gAnimationQueueEntries[MAX_ANIMATION_QUEUE_ENTRIES];
OSIoMesg gAnimationIOMesg[MAX_ANIMATION_QUEUE_ENTRIES]; OSIoMesg gAnimationIOMesg[MAX_ANIMATION_QUEUE_ENTRIES];
int gAnimationNextMessage; int gAnimationNextMessage;
int gPendingAnimationRequests;
void skAnimatorCopy(u32 romAddress, void* target, u32 size) { void skAnimatorCopy(u32 romAddress, void* target, u32 size) {
if (!gAnimationPiHandle) { if (!gAnimationPiHandle) {
@ -18,6 +19,12 @@ void skAnimatorCopy(u32 romAddress, void* target, u32 size) {
osCreateMesgQueue(&gAnimationQueue, gAnimationQueueEntries, MAX_ANIMATION_QUEUE_ENTRIES); 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 // request new chunk
OSIoMesg* ioMesg = &gAnimationIOMesg[gAnimationNextMessage]; OSIoMesg* ioMesg = &gAnimationIOMesg[gAnimationNextMessage];
gAnimationNextMessage = (gAnimationNextMessage + 1) % MAX_ANIMATION_QUEUE_ENTRIES; gAnimationNextMessage = (gAnimationNextMessage + 1) % MAX_ANIMATION_QUEUE_ENTRIES;
@ -29,6 +36,15 @@ void skAnimatorCopy(u32 romAddress, void* target, u32 size) {
ioMesg->size = size; ioMesg->size = size;
osEPiStartDma(gAnimationPiHandle, ioMesg, OS_READ); 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) { 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); int skAnimatorIsRunning(struct SKAnimator* animator);
void skAnimatorSync();
#define SK_SEGMENT_COUNT 16 #define SK_SEGMENT_COUNT 16
void skSetSegmentLocation(unsigned segmentNumber, unsigned segmentLocatoin); void skSetSegmentLocation(unsigned segmentNumber, unsigned segmentLocatoin);