From 4b9b6ad8ae788aa6c47b88d2af79b26368a64989 Mon Sep 17 00:00:00 2001 From: Miloslav Ciz Date: Wed, 11 Sep 2024 02:12:04 +0200 Subject: [PATCH] Fix some more stuff --- racing.h | 10 +++---- renderer.h | 83 +++++++++++++++++------------------------------------- settings.h | 6 ++-- 3 files changed, 33 insertions(+), 66 deletions(-) diff --git a/racing.h b/racing.h index 05d452a..af7d8b3 100644 --- a/racing.h +++ b/racing.h @@ -27,7 +27,7 @@ typedef int32_t LCR_GameUnit; ///< abstract game unit #define LCR_CAR_TURN_FRICTION (4 * TPE_F / 4) #define LCR_CAR_ELASTICITY (TPE_F / 100) #define LCR_CAR_ACCELERATION (LCR_PHYSICS_UNIT / 15) -#define LCR_CAR_TURN_SPEED (LCR_GAME_UNIT / 16) +#define LCR_CAR_TURN_SPEED (LCR_GAME_UNIT / 20) #define LCR_CAR_TURN_MAX (LCR_GAME_UNIT / 4) /* @@ -149,7 +149,6 @@ void LCR_racingInit(void) void LCR_racingGetCarTransform(LCR_GameUnit position[3], LCR_GameUnit rotation[3], LCR_GameUnit interpolationParam) { - #if LCR_SETTING_SMOOTH_ANIMATIONS TPE_Vec3 v = TPE_vec3Plus( LCR_racing.carPositions[1], @@ -175,7 +174,6 @@ void LCR_racingGetCarTransform(LCR_GameUnit position[3], rotation[0] = (v.x * LCR_GAME_UNIT) / TPE_F; rotation[1] = (v.y * LCR_GAME_UNIT) / TPE_F; rotation[2] = (v.z * LCR_GAME_UNIT) / TPE_F; - // TODO: also smooth out rotation? } void _LCR_drawPhysicsDebugPixel(uint16_t x, uint16_t y, uint8_t color) @@ -360,9 +358,9 @@ LCR_racing.carPositions[0] = LCR_racing.carPositions[1], LCR_racing.carPositions[0], TPE_vec3( - LCR_PHYSICS_UNIT / 64, // TODO: 64 - LCR_PHYSICS_UNIT / 64, - LCR_PHYSICS_UNIT / 64 + LCR_PHYSICS_UNIT / 50, // TODO: constant + LCR_PHYSICS_UNIT / 50, + LCR_PHYSICS_UNIT / 50 ) ); diff --git a/renderer.h b/renderer.h index 70ebf4c..171ffdd 100644 --- a/renderer.h +++ b/renderer.h @@ -101,20 +101,22 @@ void LCR_rendererSetCarTransform(LCR_GameUnit position[3], // TODO: make a separate function that does the smoothing (updateCarTransform) LCR_renderer.carModel->transform.rotation.x = _LCR_smoothRotation(LCR_renderer.carModel->transform.rotation.x, - S3L_wrap((rotation[0] * S3L_F) / LCR_GAME_UNIT,S3L_F),1); + S3L_wrap((rotation[0] * S3L_F) / LCR_GAME_UNIT,S3L_F),3); +/* LCR_renderer.carModel->transform.rotation.y = S3L_wrap((rotation[1] * S3L_F) / LCR_GAME_UNIT,S3L_F); // don't smooth for faster reaction? -/* +*/ + LCR_renderer.carModel->transform.rotation.y = _LCR_smoothRotation(LCR_renderer.carModel->transform.rotation.y, S3L_wrap((rotation[1] * S3L_F) / LCR_GAME_UNIT,S3L_F),1); -*/ + LCR_renderer.carModel->transform.rotation.z = _LCR_smoothRotation(LCR_renderer.carModel->transform.rotation.z, - S3L_wrap((rotation[2] * S3L_F) / LCR_GAME_UNIT,S3L_F),1); + S3L_wrap((rotation[2] * S3L_F) / LCR_GAME_UNIT,S3L_F),3); /* LCR_renderer.carModel->transform.rotation.x = S3L_wrap((rotation[0] * @@ -898,26 +900,12 @@ void LCR_rendererMoveCamera(LCR_GameUnit forwRightUpOffset[3], ((f.z * forwRightUpOffset[0] + r.z * forwRightUpOffset[1] + u.z * forwRightUpOffset[2]) * S3L_F) / LCR_GAME_UNIT; -LCR_renderer.scene.camera.transform.rotation.y += - (yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT; + LCR_renderer.scene.camera.transform.rotation.y += + (yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT; -LCR_renderer.scene.camera.transform.rotation.x += - (yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT; + LCR_renderer.scene.camera.transform.rotation.x += + (yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT; - -/* - LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap( - LCR_renderer.scene.camera.transform.rotation.y + - (yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT, - S3L_F); - - LCR_renderer.scene.camera.transform.rotation.x = S3L_clamp( - LCR_renderer.scene.camera.transform.rotation.x + - (yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT, - -1 * S3L_F / 4,S3L_F / 4); -*/ - - #define chk(o,c,l) \ if (LCR_renderer.scene.camera.transform.translation.c o l) \ LCR_renderer.scene.camera.transform.translation.c = l; @@ -1199,10 +1187,10 @@ void _LCR_rendererLoadMapChunk(uint8_t chunk, int8_t x, int8_t y, int8_t z) S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew, unsigned int amount) { -// angleOld = S3L_wrap(angleOld,S3L_F); -// angleNew = S3L_wrap(angleNew,S3L_F); - - S3L_Unit angleDiff = angleNew - angleOld; + /* We have to do the following angle correction -- even if keep angles in + correct range at the start of frame, subsequent steps may alter the rotations + and here we could end up with bad ranges again. */ + S3L_Unit angleDiff = S3L_wrap(angleNew,S3L_F) - S3L_wrap(angleOld,S3L_F); if (angleDiff == 0) return angleNew; @@ -1215,16 +1203,10 @@ S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew, angleDiff = (angleDiff > 0) ? -1 * angleDiffAbs : angleDiffAbs; } -// if (angleDiffAbs > (3 * S3L_F) / 8) // angle too big, rotate immediately -// return angleNew; + if (angleDiffAbs > (3 * S3L_F) / 8) // angle too big, rotate immediately + return angleNew; -/* -printf("%d %d %d\n",angleOld,angleNew, - angleOld + (angleDiff >> amount) -); -*/ - - return angleOld + (angleDiff >> amount); // smoothly interpolate + return angleOld + (angleDiff / S3L_nonZero(amount)); } /** @@ -1344,8 +1326,8 @@ void _LCR_rendererAnimateCar(void) { if (LCR_carVertexTypes[i] > 0) { - S3L_Unit s = S3L_sin(LCR_renderer.wheelRotation), - c = S3L_cos(LCR_renderer.wheelRotation); + S3L_Unit s = S3L_sin(-1 * LCR_renderer.wheelRotation), + c = S3L_cos(-1 * LCR_renderer.wheelRotation); S3L_Unit v[2], tmp; @@ -1388,8 +1370,7 @@ void _LCR_rendererAnimateCar(void) void LCR_rendererCameraFollow(void) { - S3L_Transform3D transPrev = - LCR_renderer.scene.camera.transform; + S3L_Transform3D transPrev = LCR_renderer.scene.camera.transform; LCR_renderer.scene.camera.transform.translation.y = S3L_clamp( @@ -1401,14 +1382,11 @@ void LCR_rendererCameraFollow(void) (LCR_SETTING_CAMERA_HEIGHT + LCR_SETTING_CAMERA_HEIGHT_BAND) * LCR_RENDERER_UNIT / 8); - S3L_Vec4 toCam = - LCR_renderer.scene.camera.transform.translation; + S3L_Vec4 toCam = LCR_renderer.scene.camera.transform.translation; - S3L_vec3Sub(&toCam, - LCR_renderer.carModel->transform.translation); + S3L_vec3Sub(&toCam,LCR_renderer.carModel->transform.translation); - S3L_Unit horizontalDist = - S3L_sqrt(toCam.x * toCam.x + toCam.z * toCam.z); + S3L_Unit horizontalDist = S3L_sqrt(toCam.x * toCam.x + toCam.z * toCam.z); if (horizontalDist == 0) { @@ -1449,21 +1427,12 @@ void LCR_rendererCameraFollow(void) LCR_renderer.scene.camera.transform.translation.x /= 2; LCR_renderer.scene.camera.transform.translation.y /= 2; LCR_renderer.scene.camera.transform.translation.z /= 2; - + LCR_renderer.scene.camera.transform.rotation.x = _LCR_smoothRotation( - transPrev.rotation.x,LCR_renderer.scene.camera.transform.rotation.x,2); - -/* -printf("aaa %d %d %d\n", -transPrev.rotation.y, -LCR_renderer.scene.camera.transform.rotation.y, - _LCR_smoothRotation( - transPrev.rotation.y,LCR_renderer.scene.camera.transform.rotation.y,3) -); -*/ + transPrev.rotation.x,LCR_renderer.scene.camera.transform.rotation.x,8); LCR_renderer.scene.camera.transform.rotation.y = _LCR_smoothRotation( - transPrev.rotation.y,LCR_renderer.scene.camera.transform.rotation.y,3); + transPrev.rotation.y,LCR_renderer.scene.camera.transform.rotation.y,6); #endif } diff --git a/settings.h b/settings.h index 5887ce7..f4cc812 100644 --- a/settings.h +++ b/settings.h @@ -102,7 +102,7 @@ #ifndef LCR_SETTING_CAMERA_HEIGHT /** Base height of the car follow camera, in 4ths of map block height. */ - #define LCR_SETTING_CAMERA_HEIGHT 5 + #define LCR_SETTING_CAMERA_HEIGHT 4 #endif #ifndef LCR_SETTING_CAMERA_HEIGHT_BAND @@ -113,12 +113,12 @@ #ifndef LCR_SETTING_CAMERA_DISTANCE /** Base horizontal distance of the car follow camera, in 4ths of map block width. */ - #define LCR_SETTING_CAMERA_DISTANCE 4 + #define LCR_SETTING_CAMERA_DISTANCE 3 #endif #ifndef LCR_SETTING_CAMERA_DISTANCE_BAND /** Band for distance of the car follow camera, in same units as base dist. */ - #define LCR_SETTING_CAMERA_DISTANCE_BAND 3 + #define LCR_SETTING_CAMERA_DISTANCE_BAND 2 #endif #ifndef LCR_SETTING_GHOST_COLOR