Add car model
This commit is contained in:
parent
a3bc8aa655
commit
4e645b4c0f
3 changed files with 614 additions and 66 deletions
172
renderer.h
172
renderer.h
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue