Fix some camera bugs
This commit is contained in:
parent
b6d28c2886
commit
ffbe827f22
2 changed files with 42 additions and 7 deletions
5
game.h
5
game.h
|
@ -170,9 +170,14 @@ uint8_t LCR_gameStep(uint32_t time)
|
||||||
LCR_keyStates[i] = LCR_keyPressed(i) ?
|
LCR_keyStates[i] = LCR_keyPressed(i) ?
|
||||||
(LCR_keyStates[i] < 255 ? LCR_keyStates[i] + 1 : 255) : 0;
|
(LCR_keyStates[i] < 255 ? LCR_keyStates[i] + 1 : 255) : 0;
|
||||||
|
|
||||||
|
//S3L_logTransform3D(LCR_renderer.scene.camera.transform);
|
||||||
|
|
||||||
if ((LCR_racing.tick % 32) == 0)
|
if ((LCR_racing.tick % 32) == 0)
|
||||||
|
{
|
||||||
printf("speed: %d\n",LCR_racingGetCarSpeed());
|
printf("speed: %d\n",LCR_racingGetCarSpeed());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t sleep = 0;
|
uint32_t sleep = 0;
|
||||||
|
|
||||||
if (LCR_keyStates[LCR_KEY_B] == 1)
|
if (LCR_keyStates[LCR_KEY_B] == 1)
|
||||||
|
|
44
renderer.h
44
renderer.h
|
@ -897,7 +897,15 @@ void LCR_rendererMoveCamera(LCR_GameUnit forwRightUpOffset[3],
|
||||||
LCR_renderer.scene.camera.transform.translation.z +=
|
LCR_renderer.scene.camera.transform.translation.z +=
|
||||||
((f.z * forwRightUpOffset[0] + r.z * forwRightUpOffset[1] +
|
((f.z * forwRightUpOffset[0] + r.z * forwRightUpOffset[1] +
|
||||||
u.z * forwRightUpOffset[2]) * S3L_F) / LCR_GAME_UNIT;
|
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.x +=
|
||||||
|
(yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap(
|
LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap(
|
||||||
LCR_renderer.scene.camera.transform.rotation.y +
|
LCR_renderer.scene.camera.transform.rotation.y +
|
||||||
(yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT,
|
(yawPitchOffset[0] * S3L_F) / LCR_GAME_UNIT,
|
||||||
|
@ -907,6 +915,8 @@ void LCR_rendererMoveCamera(LCR_GameUnit forwRightUpOffset[3],
|
||||||
LCR_renderer.scene.camera.transform.rotation.x +
|
LCR_renderer.scene.camera.transform.rotation.x +
|
||||||
(yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT,
|
(yawPitchOffset[1] * S3L_F) / LCR_GAME_UNIT,
|
||||||
-1 * S3L_F / 4,S3L_F / 4);
|
-1 * S3L_F / 4,S3L_F / 4);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define chk(o,c,l) \
|
#define chk(o,c,l) \
|
||||||
if (LCR_renderer.scene.camera.transform.translation.c o l) \
|
if (LCR_renderer.scene.camera.transform.translation.c o l) \
|
||||||
|
@ -1189,6 +1199,9 @@ 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,
|
S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew,
|
||||||
unsigned int amount)
|
unsigned int amount)
|
||||||
{
|
{
|
||||||
|
// angleOld = S3L_wrap(angleOld,S3L_F);
|
||||||
|
// angleNew = S3L_wrap(angleNew,S3L_F);
|
||||||
|
|
||||||
S3L_Unit angleDiff = angleNew - angleOld;
|
S3L_Unit angleDiff = angleNew - angleOld;
|
||||||
|
|
||||||
if (angleDiff == 0)
|
if (angleDiff == 0)
|
||||||
|
@ -1198,16 +1211,17 @@ S3L_Unit _LCR_smoothRotation(S3L_Unit angleOld, S3L_Unit angleNew,
|
||||||
|
|
||||||
if (angleDiffAbs > S3L_F / 2) // consider e.g. 350 degrees minus 1 degree
|
if (angleDiffAbs > S3L_F / 2) // consider e.g. 350 degrees minus 1 degree
|
||||||
{
|
{
|
||||||
angleDiffAbs -= S3L_F / 2;
|
angleDiffAbs = S3L_F - angleDiffAbs;
|
||||||
angleDiff += (angleDiff > 0) ? -1 * (S3L_F / 2) : (S3L_F / 2);
|
angleDiff = (angleDiff > 0) ? -1 * angleDiffAbs : angleDiffAbs;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (angleDiffAbs > (3 * S3L_F) / 8) // angle too big, rotate immediately
|
// if (angleDiffAbs > (3 * S3L_F) / 8) // angle too big, rotate immediately
|
||||||
return angleNew;
|
// return angleNew;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (angleDiffAbs < S3L_F / 32)
|
printf("%d %d %d\n",angleOld,angleNew,
|
||||||
return angleOld;
|
angleOld + (angleDiff >> amount)
|
||||||
|
);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return angleOld + (angleDiff >> amount); // smoothly interpolate
|
return angleOld + (angleDiff >> amount); // smoothly interpolate
|
||||||
|
@ -1439,6 +1453,15 @@ void LCR_rendererCameraFollow(void)
|
||||||
LCR_renderer.scene.camera.transform.rotation.x = _LCR_smoothRotation(
|
LCR_renderer.scene.camera.transform.rotation.x = _LCR_smoothRotation(
|
||||||
transPrev.rotation.x,LCR_renderer.scene.camera.transform.rotation.x,2);
|
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)
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
LCR_renderer.scene.camera.transform.rotation.y = _LCR_smoothRotation(
|
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,3);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1454,6 +1477,13 @@ void LCR_rendererSetWheelState(LCR_GameUnit rotation, LCR_GameUnit steer)
|
||||||
|
|
||||||
void LCR_rendererDraw(void)
|
void LCR_rendererDraw(void)
|
||||||
{
|
{
|
||||||
|
// first make sure rotations are in correct range:
|
||||||
|
LCR_renderer.scene.camera.transform.rotation.y = S3L_wrap(
|
||||||
|
LCR_renderer.scene.camera.transform.rotation.y, S3L_F);
|
||||||
|
|
||||||
|
LCR_renderer.scene.camera.transform.rotation.x = S3L_clamp(
|
||||||
|
LCR_renderer.scene.camera.transform.rotation.x,-1 * S3L_F / 4,S3L_F / 4);
|
||||||
|
|
||||||
LCR_renderer.previousTriID = -1;
|
LCR_renderer.previousTriID = -1;
|
||||||
S3L_newFrame();
|
S3L_newFrame();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue