Fix issue with first frame of camera animation
This commit is contained in:
parent
ba5f97b346
commit
0c8bc76732
|
@ -245,6 +245,7 @@ static void gameProc(void* arg) {
|
|||
|
||||
controllersTriggerRead();
|
||||
controllerHandlePlayback();
|
||||
skAnimatorSync();
|
||||
|
||||
if (inputIgnore) {
|
||||
--inputIgnore;
|
||||
|
|
|
@ -34,22 +34,24 @@ void mainMenuInit(struct MainMenu* mainMenu) {
|
|||
mainMenu->loadGameText = menuBuildText(&gDejaVuSansFont, "LOAD GAME", 30, 147);
|
||||
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);
|
||||
|
||||
gScene.camera.fov = 56.0f;
|
||||
}
|
||||
|
||||
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);
|
||||
sceneAnimatorUpdate(&gScene.animator);
|
||||
}
|
||||
|
||||
extern Lights1 gSceneLights;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue