diff --git a/game.h b/game.h index 82174dc..1acc502 100644 --- a/game.h +++ b/game.h @@ -179,9 +179,7 @@ uint8_t LCR_gameGetNextAudioSample(void); #define LCR_GAME_STATE_RUN 0x02 #define LCR_GAME_STATE_RUN_FINISHED 0x03 -#define LCR_GAME_STATE_LOADING_RUN 0x04 -#define LCR_GAME_STATE_LOADING_REP1 0x05 -#define LCR_GAME_STATE_LOADING_REP2 0x06 +#define LCR_GAME_STATE_LOADING 0x04 #define LCR_GAME_STATE_END 0xff @@ -284,7 +282,7 @@ struct uint8_t stretch; /**< Stretch of the base sample step, as a bit shift (i.e. 1 means the step will be 2x as long etc.). This is to allow ghosts for even long replays. */ - const uint8_t *currentSample; + uint8_t *currentSample; uint16_t nextSampleIn; } ghost; #endif @@ -352,6 +350,12 @@ void LCR_gameResetRun(uint8_t replay) LCR_game.runTimeMS = 0; } +void LCR_gameGhostReset(void) +{ + LCR_game.ghost.currentSample = LCR_game.ghost.samples; + LCR_game.ghost.nextSampleIn = 0; +} + void _LCR_gamePrepareGhost(void) { LCR_GameUnit carTransform[6]; @@ -360,6 +364,7 @@ void _LCR_gamePrepareGhost(void) LCR_gameResetRun(1); LCR_game.ghost.stretch = 0; + LCR_game.ghost.currentSample = LCR_game.ghost.samples; while (((int) LCR_replay.achievedTime) > (LCR_SETTING_GHOST_STEP << LCR_game.ghost.stretch) * @@ -375,10 +380,28 @@ void _LCR_gamePrepareGhost(void) == 0) { LCR_racingGetCarTransform(carTransform,carTransform + 3,0); + + LCR_game.ghost.currentSample[0] = carTransform[0]; + LCR_game.ghost.currentSample[1] = + ((carTransform[0] >> 8) & 0x01) | + (carTransform[1] << 1); + LCR_game.ghost.currentSample[2] = + ((carTransform[1] >> 7) & 0x03) | + (carTransform[2] << 2); + LCR_game.ghost.currentSample[3] = + ((carTransform[2] >> 6) & 0x0f) | + (carTransform[3] << 4); + LCR_game.ghost.currentSample[4] = + (carTransform[4] >> 4) | + (carTransform[5] << 4); + + LCR_game.ghost.currentSample += LCR_GHOST_SAMPLE_SIZE; } LCR_racingStep(0); } + + LCR_gameGhostReset(); } LCR_GameUnit LCR_carSpeedKMH(void) @@ -742,14 +765,6 @@ void LCR_gameTimeToStr(uint32_t timeMS, char *str) str[2] = '\''; } -int _LCR_gameIsLoading(void) -{ - return - (LCR_game.state == LCR_GAME_STATE_LOADING_RUN) || - (LCR_game.state == LCR_GAME_STATE_LOADING_REP1) || - (LCR_game.state == LCR_GAME_STATE_LOADING_REP2); -} - void LCR_gameDraw3DView(void) { LCR_GameUnit carTransform[6]; @@ -951,7 +966,7 @@ void LCR_gameHandleInput(void) case 1: LCR_gameLoadMap(LCR_game.dataFile.firstItemIndex + LCR_game.menu.selectedItem); - LCR_gameSetState(LCR_GAME_STATE_LOADING_RUN); + LCR_gameSetState(LCR_GAME_STATE_LOADING); break; case 2: @@ -969,8 +984,7 @@ void LCR_gameHandleInput(void) LCR_LOG1("couldn't load replay map"); } else - LCR_gameSetState(LCR_game.menu.selectedTab == 2 ? - LCR_GAME_STATE_LOADING_REP1 : LCR_GAME_STATE_LOADING_REP2); + LCR_gameSetState(LCR_GAME_STATE_LOADING); break; } @@ -1063,17 +1077,16 @@ uint8_t LCR_gameStep(uint32_t time) LCR_game.keyStates[i] = LCR_keyPressed(i) ? (LCR_game.keyStates[i] < 255 ? LCR_game.keyStates[i] + 1 : 255) : 0; - if (_LCR_gameIsLoading()) + if (LCR_game.state == LCR_GAME_STATE_LOADING) { LCR_rendererLoadMap(); - if (LCR_game.state == LCR_GAME_STATE_LOADING_REP2) + if (LCR_game.menu.selectedTab == 3) { _LCR_gamePrepareGhost(); } - LCR_gameResetRun( - LCR_game.state == LCR_GAME_STATE_LOADING_REP1); + LCR_gameResetRun(LCR_game.menu.selectedTab == 2); } LCR_gameHandleInput(); @@ -1144,7 +1157,8 @@ LCR_replayOutputStr(_LCR_gameDataCharWrite); while (time >= LCR_game.nextRenderFrameTime) LCR_game.nextRenderFrameTime += 1000 / LCR_SETTING_FPS; - if ((LCR_game.state == LCR_GAME_STATE_MENU) || _LCR_gameIsLoading()) + if ((LCR_game.state == LCR_GAME_STATE_MENU) || + LCR_game.state == LCR_GAME_STATE_LOADING) LCR_rendererDrawMenu(LCR_texts[LCR_TEXTS_TABS + LCR_game.menu.selectedTab],LCR_game.menu.itemNamePtrs, LCR_game.menu.itemCount + 1,LCR_game.menu.selectedItem); @@ -1157,7 +1171,7 @@ LCR_replayOutputStr(_LCR_gameDataCharWrite); sleep = tmp < sleep ? tmp : sleep; } - if (_LCR_gameIsLoading()) + if (LCR_game.state == LCR_GAME_STATE_LOADING) { // show the "loading" screen diff --git a/renderer.h b/renderer.h index c619ccb..6d5c7bb 100644 --- a/renderer.h +++ b/renderer.h @@ -115,11 +115,31 @@ struct with color stored in this variable. */ } LCR_renderer; +void _LCR_rendererSetModelTransofmr(S3L_Model3D *model, + LCR_GameUnit position[3], LCR_GameUnit rotation[3]) +{ + model->transform.translation.x = + (position[0] * LCR_RENDERER_UNIT) / LCR_GAME_UNIT; + model->transform.translation.y = + (position[1] * LCR_RENDERER_UNIT) / LCR_GAME_UNIT; + model->transform.translation.z = + (position[2] * LCR_RENDERER_UNIT) / LCR_GAME_UNIT; + + model->transform.rotation.x = S3L_wrap((rotation[0] * + S3L_F) / LCR_GAME_UNIT,S3L_F); + model->transform.rotation.y = S3L_wrap((rotation[1] * + S3L_F) / LCR_GAME_UNIT,S3L_F); + model->transform.rotation.z = S3L_wrap((rotation[2] * + S3L_F) / LCR_GAME_UNIT,S3L_F); +} + void LCR_rendererSetCarTransform(LCR_GameUnit position[3], LCR_GameUnit rotation[3]) { LCR_LOG2("setting car transform"); + _LCR_rendererSetModelTransofmr(LCR_renderer.carModel,position,rotation); +/* LCR_renderer.carModel->transform.translation.x = (position[0] * LCR_RENDERER_UNIT) / LCR_GAME_UNIT; LCR_renderer.carModel->transform.translation.y = @@ -133,6 +153,15 @@ void LCR_rendererSetCarTransform(LCR_GameUnit position[3], S3L_F) / LCR_GAME_UNIT,S3L_F); LCR_renderer.carModel->transform.rotation.z = S3L_wrap((rotation[2] * S3L_F) / LCR_GAME_UNIT,S3L_F); +*/ +} + +void LCR_rendererSetGhostTransform(LCR_GameUnit position[3], + LCR_GameUnit rotation[3]) +{ + LCR_LOG2("setting ghost transform"); + + _LCR_rendererSetModelTransofmr(LCR_renderer.ghostModel,position,rotation); } void LCR_rendererSetCarVisibility(uint8_t visible) @@ -140,6 +169,11 @@ void LCR_rendererSetCarVisibility(uint8_t visible) LCR_renderer.carModel->config.visible = visible; } +void LCR_rendererSetGhostVisibility(uint8_t visible) +{ + LCR_renderer.ghostModel->config.visible = visible; +} + void _LCR_rendererDrawFontPixel(int x, int y, uint16_t color) { #if LCR_FONT_PIXEL_SIZE == 1