Add car model

This commit is contained in:
Miloslav Ciz 2024-08-30 01:04:07 +02:00
parent a3bc8aa655
commit 4e645b4c0f
3 changed files with 614 additions and 66 deletions

View file

@ -29,17 +29,18 @@
#define LCR_RENDERER_CHUNKS_TOTAL (LCR_RENDERER_CHUNK_RESOLUTION * \
LCR_RENDERER_CHUNK_RESOLUTION * LCR_RENDERER_CHUNK_RESOLUTION)
#define LCR_RENDERER_MODEL_COUNT 8
#define LCR_RENDERER_MODEL_COUNT 9
struct
{
S3L_Scene scene;
S3L_Model3D mapModel; ///< whole map model
S3L_Model3D *carModel;
/**
The scene model array.
0, 1, 2, 3, 4, 5, 6, 7: nearest map chunk models
8: car model
*/
S3L_Model3D models[LCR_RENDERER_MODEL_COUNT];
@ -69,84 +70,102 @@ struct
uint8_t texSubsampleCount;
} LCR_renderer;
uint16_t ccc;
int cnt = 0;
void LCR_pixelFunc3D(S3L_PixelInfo *pixel)
{
// once we get a new triangle, we precompute things for it:
if (pixel->triangleIndex != LCR_renderer.previousTriID)
if (pixel->triangleID != LCR_renderer.previousTriID)
{
const S3L_Index *t =
LCR_renderer.models[pixel->modelIndex].triangles +
3 * pixel->triangleIndex;
S3L_Unit *v[3];
LCR_renderer.previousTriID = pixel->triangleID;
#if LCR_SETTING_TEXTURE_SUBSAMPLE != 0
LCR_renderer.texSubsampleCount = 0;
#endif
for (int i = 0; i < 3; ++i)
v[i] = LCR_renderer.mapVerts + 3 * t[i];
const uint8_t *triData =
LCR_renderer.mapTriangleData +
LCR_renderer.chunkStarts[LCR_renderer.loadedChunks[
pixel->modelIndex]];
uint8_t type = triData[pixel->triangleIndex] >> 4;
LCR_loadImage(triData[pixel->triangleIndex] & 0x0f);
if (type == 0) // floor?
if (pixel->modelIndex == 8)
{
if (v[0][1] != v[1][1] || v[1][1] != v[2][1]) // angled floor?
LCR_imageChangeBrightness(1);
// car model
for (int i = 0; i < 6; ++i)
LCR_renderer.triUVs[i] = ((
(v[i / 2][(i % 2) * 2]) *
LCR_IMAGE_SIZE) / LCR_RENDERER_UNIT);
}
else
{
if (type == 1)
LCR_imageChangeBrightness(0);
LCR_loadImage(LCR_IMAGE_CAR);
for (int i = 0; i < 6; ++i)
{
LCR_renderer.triUVs[i] = ((
(v[i / 2][i % 2 ? 1 : (type == 1 ? 2 : 0)]) *
LCR_IMAGE_SIZE) / LCR_RENDERER_UNIT);
LCR_renderer.triUVs[i] =
(LCR_carUvs[2 * LCR_carTriangleUvs[
3 * pixel->triangleIndex + i / 2] + i % 2] * LCR_IMAGE_SIZE) / 512;
if (i % 2)
LCR_renderer.triUVs[i] = LCR_IMAGE_SIZE -
LCR_renderer.triUVs[i] = 64 -
LCR_renderer.triUVs[i];
}
}
// shift the UVs to the origin (prevent high values of UV coords)
for (int i = 0; i < 2; ++i)
else
{
uint8_t minCoord = LCR_renderer.triUVs[i] <
LCR_renderer.triUVs[2 + i] ? (0 + i) : (2 + i);
// map model
const S3L_Index *t =
LCR_renderer.models[pixel->modelIndex].triangles +
3 * pixel->triangleIndex;
S3L_Unit *v[3];
if (LCR_renderer.triUVs[4 + i] < LCR_renderer.triUVs[minCoord])
minCoord = 4 + i;
#if LCR_SETTING_TEXTURE_SUBSAMPLE != 0
LCR_renderer.texSubsampleCount = 0;
#endif
S3L_Unit shiftBy = LCR_renderer.triUVs[minCoord] % LCR_IMAGE_SIZE;
for (int i = 0; i < 3; ++i)
v[i] = LCR_renderer.mapVerts + 3 * t[i];
if (shiftBy < 0)
shiftBy += LCR_IMAGE_SIZE;
const uint8_t *triData =
LCR_renderer.mapTriangleData +
LCR_renderer.chunkStarts[LCR_renderer.loadedChunks[
pixel->modelIndex]];
shiftBy -= LCR_renderer.triUVs[minCoord];
uint8_t type = triData[pixel->triangleIndex] >> 4;
LCR_renderer.triUVs[i] += shiftBy;
LCR_renderer.triUVs[2 + i] += shiftBy;
LCR_renderer.triUVs[4 + i] += shiftBy;
LCR_loadImage(triData[pixel->triangleIndex] & 0x0f);
if (type == 0) // floor?
{
if (v[0][1] != v[1][1] || v[1][1] != v[2][1]) // angled floor?
LCR_imageChangeBrightness(1);
for (int i = 0; i < 6; ++i)
LCR_renderer.triUVs[i] = ((
(v[i / 2][(i % 2) * 2]) *
LCR_IMAGE_SIZE) / LCR_RENDERER_UNIT);
}
else
{
if (type == 1)
LCR_imageChangeBrightness(0);
for (int i = 0; i < 6; ++i)
{
LCR_renderer.triUVs[i] = ((
(v[i / 2][i % 2 ? 1 : (type == 1 ? 2 : 0)]) *
LCR_IMAGE_SIZE) / LCR_RENDERER_UNIT);
if (i % 2)
LCR_renderer.triUVs[i] = LCR_IMAGE_SIZE -
LCR_renderer.triUVs[i];
}
}
// shift the UVs to the origin (prevent high values of UV coords)
for (int i = 0; i < 2; ++i)
{
uint8_t minCoord = LCR_renderer.triUVs[i] <
LCR_renderer.triUVs[2 + i] ? (0 + i) : (2 + i);
if (LCR_renderer.triUVs[4 + i] < LCR_renderer.triUVs[minCoord])
minCoord = 4 + i;
S3L_Unit shiftBy = LCR_renderer.triUVs[minCoord] % LCR_IMAGE_SIZE;
if (shiftBy < 0)
shiftBy += LCR_IMAGE_SIZE;
shiftBy -= LCR_renderer.triUVs[minCoord];
LCR_renderer.triUVs[i] += shiftBy;
LCR_renderer.triUVs[2 + i] += shiftBy;
LCR_renderer.triUVs[4 + i] += shiftBy;
}
}
LCR_renderer.previousTriID = pixel->triangleIndex;
}
uint16_t color;
@ -701,9 +720,26 @@ uint8_t LCR_rendererInit(void)
return 0;
_LCR_makeMapChunks();
_LCR_rendererComputeLOD();
LCR_renderer.carModel = LCR_renderer.models + 8;
S3L_model3DInit(
LCR_carVertices,LCR_CAR_VERTEX_COUNT,
LCR_carTriangles,LCR_CAR_TRIANGLE_COUNT,
LCR_renderer.carModel);
LCR_renderer.carModel->transform.translation.x -= 2 * LCR_RENDERER_UNIT;
LCR_renderer.carModel->transform.scale.x = LCR_RENDERER_UNIT / 3;
LCR_renderer.carModel->transform.scale.y =
LCR_renderer.carModel->transform.scale.x;
LCR_renderer.carModel->transform.scale.z =
LCR_renderer.carModel->transform.scale.x;
S3L_sceneInit(
LCR_renderer.models,LCR_RENDERER_MODEL_COUNT,&LCR_renderer.scene);
@ -1140,6 +1176,22 @@ void LCR_rendererDraw(void)
LCR_drawLevelFloor();
LCR_rendererDrawLOD();
LCR_renderer.carModel->transform.translation =
LCR_renderer.scene.camera.transform.translation;
LCR_renderer.carModel->transform.translation.x +=
LCR_RENDERER_UNIT * 2;
LCR_renderer.carModel->transform.translation.z -=
LCR_RENDERER_UNIT * 1;
LCR_renderer.carModel->transform.translation.y -=
LCR_RENDERER_UNIT * 2;
S3L_drawScene(LCR_renderer.scene);
}