This commit is contained in:
Miloslav Ciz 2025-02-01 23:11:25 +01:00
parent 4cb558b85c
commit ccbb9dfdc3
3 changed files with 32 additions and 78 deletions

View file

@ -79,11 +79,7 @@ struct
S3L_Model3D models[LCR_RENDERER_MODEL_COUNT];
uint32_t frame;
uint8_t carVisibilityDist;
uint8_t ghostVisibilityDist;
uint8_t loadedChunks[8]; ///< numbers of loaded map chunks
uint8_t loadedChunks[8]; ///< Numbers of loaded map chunks.
S3L_Unit mapVerts[LCR_SETTING_MAX_MAP_VERTICES * 3];
S3L_Index mapTris[LCR_SETTING_MAX_MAP_TRIANGLES * 3];
@ -119,7 +115,7 @@ struct
with color stored in this variable. */
} LCR_renderer;
void _LCR_rendererSetModelTransofmr(S3L_Model3D *model,
void _LCR_rendererSetModelTransform(S3L_Model3D *model,
LCR_GameUnit position[3], LCR_GameUnit rotation[3])
{
model->transform.translation.x =
@ -141,31 +137,14 @@ 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 =
(position[1] * LCR_RENDERER_UNIT) / LCR_GAME_UNIT;
LCR_renderer.carModel->transform.translation.z =
(position[2] * LCR_RENDERER_UNIT) / LCR_GAME_UNIT;
LCR_renderer.carModel->transform.rotation.x = S3L_wrap((rotation[0] *
S3L_F) / LCR_GAME_UNIT,S3L_F);
LCR_renderer.carModel->transform.rotation.y = S3L_wrap((rotation[1] *
S3L_F) / LCR_GAME_UNIT,S3L_F);
LCR_renderer.carModel->transform.rotation.z = S3L_wrap((rotation[2] *
S3L_F) / LCR_GAME_UNIT,S3L_F);
*/
_LCR_rendererSetModelTransform(LCR_renderer.carModel,position,rotation);
}
void LCR_rendererSetGhostTransform(LCR_GameUnit position[3],
LCR_GameUnit rotation[3])
{
LCR_LOG2("setting ghost transform");
_LCR_rendererSetModelTransofmr(LCR_renderer.ghostModel,position,rotation);
_LCR_rendererSetModelTransform(LCR_renderer.ghostModel,position,rotation);
}
void LCR_rendererSetCarVisibility(uint8_t visible)
@ -203,7 +182,7 @@ int LCR_rendererComputeTextWidth(const char *text, int size)
r += 2 * size;
if (text[1])
r += 3 * size / 4;
r += 3 * size / 4;
}
return r + LCR_FONT_PIXEL_SIZE - 1;
@ -259,7 +238,6 @@ int _LCR_rendererQuadLooksConvex(S3L_Unit quad[8])
{
S3L_Unit cx = (quad[0] + quad[2] + quad[4] + quad[6]) / 4;
S3L_Unit cy = (quad[1] + quad[3] + quad[5] + quad[7]) / 4;
S3L_Unit r = 0;
for (int i = 0; i < 8; i += 2)
@ -392,8 +370,8 @@ void _LCR_pixelFunc3D(S3L_PixelInfo *pixel)
case LCR_RENDERER_MAT_FIN:
LCR_renderer.flatAndTransparent = LCR_SETTING_FINISH_COLOR | CL;
#undef CL
break;
#undef CL
default:
LCR_loadImage(mat);
@ -445,6 +423,7 @@ void _LCR_pixelFunc3D(S3L_PixelInfo *pixel)
LCR_renderer.triUVs[2 + i] += shiftBy;
LCR_renderer.triUVs[4 + i] += shiftBy;
}
break;
}
}
@ -456,7 +435,7 @@ void _LCR_pixelFunc3D(S3L_PixelInfo *pixel)
LCR_drawPixelXYUnsafe(pixel->x,pixel->y,LCR_renderer.flatAndTransparent);
else
S3L_zBufferWrite(pixel->x,pixel->y,S3L_MAX_DEPTH);
/* ^ Clear z-buffer if we don't draw the pixel. Without this further
/* ^ Clear z-buffer if we didn't draw the pixel. Without this further
geometry drawn later on won't be seen through transparent objects which
looks bad. With this "fix" glitches may still appear (wrong draw order)
but it generally looks better this way. */
@ -571,17 +550,14 @@ int _LCR_rendererQuadCoversTri(const S3L_Unit quad[8], const S3L_Unit tri[6])
for (int k = 0; k < 3; ++k) // for each subtriangle side
{
S3L_Unit w = // triangle winding
S3L_Unit w = // triangle winding
(quad[(2 * (j + ((k + 1) % 3))) % 8 + 1] -
quad[(2 * (j + k)) % 8 + 1]) *
(tri[2 * i] - quad[(2 * (j + (k + 1) % 3)) % 8]) -
(quad[(2 * (j + ((k + 1) % 3))) % 8] - quad[(2 * (j + k)) % 8])
* (tri[2 * i + 1] - quad[(2 * (j + (k + 1) % 3)) % 8 + 1]);
if (w > 0)
winds |= 1;
else if (w < 0)
winds |= 2;
winds |= (w > 0) | ((w < 0) << 1 );
}
if (winds != 3) // no opposite winds?
@ -603,8 +579,7 @@ int _LCR_rendererQuadCoversTri(const S3L_Unit quad[8], const S3L_Unit tri[6])
other, in return values lowest bit means whether t1 is covered and the second
lowest bit means whether t2 is covered.
*/
uint8_t _LCR_rendererCheckMapTriCover(const S3L_Index *t1,
const S3L_Index *t2)
uint8_t _LCR_rendererCheckMapTriCover(const S3L_Index *t1, const S3L_Index *t2)
{
if ((t1[0] == t2[0] || t1[0] == t2[1] || t1[0] == t2[2]) &&
(t1[1] == t2[0] || t1[1] == t2[1] || t1[1] == t2[2]) &&
@ -748,25 +723,20 @@ void _LCR_cullHiddenMapTris(void)
t1Covered |= cover & 0x01;
if (cover & 0x02)
if ((cover & 0x02) && (j < LCR_renderer.mapModel.triangleCount - n))
{
if (j < LCR_renderer.mapModel.triangleCount - n)
{
_LCR_rendererSwapMapTris(j,
LCR_renderer.mapModel.triangleCount - 1 - n);
_LCR_rendererSwapMapTris(j,
LCR_renderer.mapModel.triangleCount - 1 - n);
n++;
}
n++;
}
t2 += 3; // check next triangle
}
if (t1Covered)
{
_LCR_rendererSwapMapTris(i,
LCR_renderer.mapModel.triangleCount - 1 - n);
_LCR_rendererSwapMapTris(i,LCR_renderer.mapModel.triangleCount - 1 - n);
n++;
// we stay at this position because we've swapped the triangle here
}
@ -1004,8 +974,8 @@ uint8_t _LCR_buildMapModel(void)
_LCR_rendererAddMapTri(triIndices[0],triIndices[1],triIndices[2],
triData);
}
}
vi = 0;
}
}
@ -1195,8 +1165,7 @@ void LCR_rendererGetCameraTransform(LCR_GameUnit position[3],
rotation[2] = (LCR_renderer.scene.camera.transform.rotation.z *
LCR_GAME_UNIT) / S3L_F;
*fov = (LCR_renderer.scene.camera.focalLength * LCR_GAME_UNIT)
/ S3L_F;
*fov = (LCR_renderer.scene.camera.focalLength * LCR_GAME_UNIT) / S3L_F;
}
/**
@ -1873,8 +1842,7 @@ void LCR_rendererDrawMenu(const char *tabName,const char **items,
++i;
}
i = stripHeight +
(stripHeight2 - LCR_rendererComputeTextHeight(3)) / 2;
i = stripHeight + (stripHeight2 - LCR_rendererComputeTextHeight(3)) / 2;
for (int j = 0; j < itemCount + 1; ++j)
{
@ -1984,8 +1952,7 @@ void LCR_rendererDraw3D(void)
{
carGhostVisibility |= 1;
m->config.visible = (S3L_distanceManhattan(
m->transform.translation,
m->config.visible = (S3L_distanceManhattan(m->transform.translation,
LCR_renderer.scene.camera.transform.translation) / LCR_RENDERER_UNIT)
<= LCR_SETTING_CAR_RENDER_DISTANCE;
}