Change some names

This commit is contained in:
Miloslav Ciz 2024-08-14 15:19:54 +02:00
parent 0078bbf1cd
commit 71b1230880

View file

@ -33,15 +33,13 @@
struct
{
S3L_Scene scene;
S3L_Model3D models[9]; /**< 0: whole map model,
1, 2, 3, 4, 5, 6, 7, 8: nearest map chunks
models */
/* TODO: separate the whole model from the array? it's confusing if it's
in the array and then doesn't get rendered? */
S3L_Model3D mapModel; ///< whole map model
S3L_Model3D models[8];
/**< 0, 1, 2, 3, 4, 5, 6, 7: nearest map chunk models */
uint8_t loadedChunks[8];
S3L_Model3D *mapModel;
S3L_Unit mapVerts[LCR_SETTING_MAX_MAP_VERTICES * 3];
S3L_Index mapTris[LCR_SETTING_MAX_MAP_TRIANGLES * 3];
@ -71,7 +69,7 @@ void LCR_pixelFunc3D(S3L_PixelInfo *pixel)
if (pixel->triangleIndex != LCR_renderer.previousTriID)
{
const S3L_Index *t =
LCR_renderer.models[1 + pixel->modelIndex].triangles +
LCR_renderer.models[pixel->modelIndex].triangles +
3 * pixel->triangleIndex;
S3L_Unit *v[3];
@ -174,12 +172,12 @@ void LCR_pixelFunc3D(S3L_PixelInfo *pixel)
LCR_drawPixelXYUnsafe(pixel->x,pixel->y,color);
}
S3L_Index _LCR_addMapVert(S3L_Unit x, S3L_Unit y, S3L_Unit z)
S3L_Index _LCR_rendererAddMapVert(S3L_Unit x, S3L_Unit y, S3L_Unit z)
{
S3L_Index index = 0;
S3L_Unit *verts = LCR_renderer.mapVerts;
while (index < LCR_renderer.mapModel->vertexCount) // if exists, return index
while (index < LCR_renderer.mapModel.vertexCount) // if exists, return index
{
if (verts[0] == x && verts[1] == y && verts[2] == z)
return index;
@ -189,13 +187,13 @@ S3L_Index _LCR_addMapVert(S3L_Unit x, S3L_Unit y, S3L_Unit z)
}
// if it doesn't exist, add it
if (LCR_renderer.mapModel->vertexCount < LCR_SETTING_MAX_MAP_VERTICES)
if (LCR_renderer.mapModel.vertexCount < LCR_SETTING_MAX_MAP_VERTICES)
{
*verts = x; verts++;
*verts = y; verts++;
*verts = z;
LCR_renderer.mapModel->vertexCount++;
return LCR_renderer.mapModel->vertexCount - 1;
LCR_renderer.mapModel.vertexCount++;
return LCR_renderer.mapModel.vertexCount - 1;
}
LCR_log("couldn't add map vertex!");
@ -203,25 +201,25 @@ S3L_Index _LCR_addMapVert(S3L_Unit x, S3L_Unit y, S3L_Unit z)
return 0;
}
void _LCR_addMapTri(S3L_Index a, S3L_Index b, S3L_Index c, uint8_t mat)
void _LCR_rendererAddMapTri(S3L_Index a, S3L_Index b, S3L_Index c, uint8_t mat)
{
if (LCR_renderer.mapModel->triangleCount < LCR_SETTING_MAX_MAP_TRIANGLES)
if (LCR_renderer.mapModel.triangleCount < LCR_SETTING_MAX_MAP_TRIANGLES)
{
S3L_Index *t =
&(LCR_renderer.mapTris[LCR_renderer.mapModel->triangleCount * 3]);
&(LCR_renderer.mapTris[LCR_renderer.mapModel.triangleCount * 3]);
*t = a; t++;
*t = b; t++;
*t = c;
LCR_renderer.mapTriangleData[LCR_renderer.mapModel->triangleCount] =
LCR_renderer.mapTriangleData[LCR_renderer.mapModel.triangleCount] =
mat;
LCR_renderer.mapModel->triangleCount++;
LCR_renderer.mapModel.triangleCount++;
}
}
void _LCR_swapMapTris(unsigned int index1, unsigned int index2)
void _LCR_rendererSwapMapTris(unsigned int index1, unsigned int index2)
{
uint8_t tmpMat;
S3L_Index tmpIndex,
@ -240,7 +238,7 @@ void _LCR_swapMapTris(unsigned int index1, unsigned int index2)
LCR_renderer.mapTriangleData[index2] = tmpMat;
}
int _LCR_quadCoversTri(const S3L_Unit quad[8], const S3L_Unit tri[6])
int _LCR_rendererQuadCoversTri(const S3L_Unit quad[8], const S3L_Unit tri[6])
{
for (int i = 0; i < 3; ++i) // for each triangle point
{
@ -284,7 +282,7 @@ int _LCR_quadCoversTri(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_checkMapTriCover(const S3L_Index *t1,
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]) &&
@ -338,7 +336,7 @@ uint8_t _LCR_checkMapTriCover(const S3L_Index *t1,
points2D[13] = (4 * points2D[7] + 3 * points2D[9] + points2D[11]) / 8;
// first: does the triangle alone cover the other one?
if (_LCR_quadCoversTri(points2D + 6,points2D))
if (_LCR_rendererQuadCoversTri(points2D + 6,points2D))
result |= 1 << j;
else
{
@ -346,7 +344,7 @@ uint8_t _LCR_checkMapTriCover(const S3L_Index *t1,
S3L_Index *t3 = LCR_renderer.mapTris;
for (int i = 0; i < LCR_renderer.mapModel->triangleCount; ++i)
for (int i = 0; i < LCR_renderer.mapModel.triangleCount; ++i)
{
uint8_t sharedVerts =
(t3[0] == t2[0] || t3[0] == t2[1] || t3[0] == t2[2]) |
@ -372,7 +370,7 @@ uint8_t _LCR_checkMapTriCover(const S3L_Index *t1,
points2D[12] = LCR_renderer.mapVerts[3 * t3[freeVert] + coordX];
points2D[13] = LCR_renderer.mapVerts[3 * t3[freeVert] + coordY];
if (_LCR_quadCoversTri(points2D + 6,points2D))
if (_LCR_rendererQuadCoversTri(points2D + 6,points2D))
{
result |= 1 << j;
break;
@ -419,24 +417,24 @@ void _LCR_cullHiddenMapTris(void)
We'll be moving the covered triangles to the end of the array, then at the
end we'll just shorten the array by number of removed triangles.
*/
while (i < LCR_renderer.mapModel->triangleCount - n)
while (i < LCR_renderer.mapModel.triangleCount - n)
{
t2 = t1 + 3; // t2 is the the other triangle against which we check
int t1Covered = 0;
for (int j = i + 1; j < LCR_renderer.mapModel->triangleCount; ++j)
for (int j = i + 1; j < LCR_renderer.mapModel.triangleCount; ++j)
{
uint8_t cover = _LCR_checkMapTriCover(t1,t2);
uint8_t cover = _LCR_rendererCheckMapTriCover(t1,t2);
t1Covered |= cover & 0x01;
if (cover & 0x02)
{
if (j < LCR_renderer.mapModel->triangleCount - n)
if (j < LCR_renderer.mapModel.triangleCount - n)
{
_LCR_swapMapTris(j,
LCR_renderer.mapModel->triangleCount - 1 - n);
_LCR_rendererSwapMapTris(j,
LCR_renderer.mapModel.triangleCount - 1 - n);
n++;
}
@ -447,8 +445,8 @@ void _LCR_cullHiddenMapTris(void)
if (t1Covered)
{
_LCR_swapMapTris(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
@ -460,17 +458,17 @@ void _LCR_cullHiddenMapTris(void)
}
}
LCR_renderer.mapModel->triangleCount -= n; // cut off the removed triangles
LCR_renderer.mapModel.triangleCount -= n; // cut off the removed triangles
// remove unused vertices:
i = 0;
while (i < LCR_renderer.mapModel->vertexCount)
while (i < LCR_renderer.mapModel.vertexCount)
{
int used = 0;
for (int j = 0; j < LCR_renderer.mapModel->triangleCount * 3; ++j)
for (int j = 0; j < LCR_renderer.mapModel.triangleCount * 3; ++j)
if (LCR_renderer.mapTris[j] == i)
{
used = 1;
@ -483,13 +481,13 @@ void _LCR_cullHiddenMapTris(void)
{
for (int j = 0; j < 3; ++j)
LCR_renderer.mapVerts[3 * i + j] =
LCR_renderer.mapVerts[(LCR_renderer.mapModel->vertexCount - 1) * 3 + j];
LCR_renderer.mapVerts[(LCR_renderer.mapModel.vertexCount - 1) * 3 + j];
for (int j = 0; j < LCR_renderer.mapModel->triangleCount * 3; ++j)
if (LCR_renderer.mapTris[j] == LCR_renderer.mapModel->vertexCount - 1)
for (int j = 0; j < LCR_renderer.mapModel.triangleCount * 3; ++j)
if (LCR_renderer.mapTris[j] == LCR_renderer.mapModel.vertexCount - 1)
LCR_renderer.mapTris[j] = i;
LCR_renderer.mapModel->vertexCount--;
LCR_renderer.mapModel.vertexCount--;
}
}
}
@ -515,7 +513,7 @@ void _LCR_makeMapChunks(void)
chunkCorner[1] -= LCR_MAP_SIZE_BLOCKS * LCR_RENDERER_UNIT / 4;
chunkCorner[2] -= LCR_MAP_SIZE_BLOCKS * LCR_RENDERER_UNIT / 2;
for (int i = start; i < LCR_renderer.mapModel->triangleCount; ++i)
for (int i = start; i < LCR_renderer.mapModel.triangleCount; ++i)
{
const S3L_Unit *v = LCR_renderer.mapVerts + 3 * tri[0];
@ -526,7 +524,7 @@ void _LCR_makeMapChunks(void)
v[2] >= chunkCorner[2] &&
v[2] < chunkCorner[2] + LCR_RENDERER_CHUNK_SIZE_HORIZONTAL)
{
_LCR_swapMapTris(i,start);
_LCR_rendererSwapMapTris(i,start);
start++;
}
@ -546,7 +544,8 @@ uint8_t _LCR_buildMapModel(void)
uint8_t blockShapeBytes[LCR_MAP_BLOCK_SHAPE_MAX_BYTES];
uint8_t blockShapeByteCount;
S3L_model3DInit(LCR_renderer.mapVerts,0,LCR_renderer.mapTris,0,LCR_renderer.mapModel);
S3L_model3DInit(LCR_renderer.mapVerts,0,LCR_renderer.mapTris,0,
&LCR_renderer.mapModel);
for (int j = 0; j < LCR_currentMap.blockCount; ++j)
{
@ -584,7 +583,7 @@ uint8_t _LCR_buildMapModel(void)
((vx == 0) << 2) | ((vx == LCR_BLOCK_SHAPE_COORD_MAX) << 3) |
((vz == 0) << 4) | ((vz == LCR_BLOCK_SHAPE_COORD_MAX) << 5);
triIndices[vi] = _LCR_addMapVert(
triIndices[vi] = _LCR_rendererAddMapVert(
originOffset + (((S3L_Unit) bx) * LCR_RENDERER_UNIT) +
(LCR_RENDERER_UNIT * ((S3L_Unit) vx)) / LCR_BLOCK_SHAPE_COORD_MAX,
(originOffset + (((S3L_Unit) by) * LCR_RENDERER_UNIT)) / 2 +
@ -647,7 +646,7 @@ uint8_t _LCR_buildMapModel(void)
}
}
_LCR_addMapTri(triIndices[0],triIndices[1],triIndices[2],triData);
_LCR_rendererAddMapTri(triIndices[0],triIndices[1],triIndices[2],triData);
}
vi = 0;
@ -664,7 +663,7 @@ uint8_t _LCR_buildMapModel(void)
return 1;
}
void _LCR_computeLOD(void)
void _LCR_rendererComputeLOD(void)
{
LCR_log("computing LOD");
@ -689,17 +688,15 @@ uint8_t LCR_rendererInit(void)
{
LCR_log("initializing renderer");
LCR_renderer.mapModel = LCR_renderer.models;
if (!_LCR_buildMapModel())
return 0;
_LCR_makeMapChunks();
_LCR_computeLOD();
_LCR_rendererComputeLOD();
S3L_sceneInit(
LCR_renderer.models + 1,8,&LCR_renderer.scene);
LCR_renderer.models,8,&LCR_renderer.scene);
return 1;
}
@ -809,7 +806,7 @@ void LCR_rendererDrawRect(int x, int y, unsigned int w, unsigned int h,
}
}
void _LCR_drawLODBlock(int blockX, int blockY, int blockZ, unsigned int size,
void _LCR_rendererDrawLODBlock(int blockX, int blockY, int blockZ, unsigned int size,
uint16_t color)
{
S3L_Vec4 p, r;
@ -965,15 +962,15 @@ void LCR_rendererDrawSky(int sky, S3L_Unit offsetH, S3L_Unit offsetV)
}
}
void _LCR_loadMapChunk(uint8_t chunk, int8_t x, int8_t y, int8_t z)
void _LCR_rendererLoadMapChunk(uint8_t chunk, int8_t x, int8_t y, int8_t z)
{
LCR_renderer.models[chunk + 1] = LCR_renderer.models[0];
LCR_renderer.models[chunk] = LCR_renderer.mapModel;
if (x < 0 || x >= LCR_RENDERER_CHUNK_RESOLUTION ||
y < 0 || y >= LCR_RENDERER_CHUNK_RESOLUTION ||
z < 0 || z >= LCR_RENDERER_CHUNK_RESOLUTION)
{
LCR_renderer.models[chunk + 1].triangleCount = 0;
LCR_renderer.models[chunk].triangleCount = 0;
LCR_renderer.loadedChunks[chunk] = 0;
}
else
@ -984,21 +981,25 @@ void _LCR_loadMapChunk(uint8_t chunk, int8_t x, int8_t y, int8_t z)
int triCount =
(blockNum == LCR_RENDERER_CHUNKS_TOTAL - 1 ?
(LCR_renderer.mapModel->triangleCount - 1) :
(LCR_renderer.mapModel.triangleCount - 1) :
LCR_renderer.chunkStarts[blockNum + 1])
- LCR_renderer.chunkStarts[blockNum];
if (triCount < 0)
triCount = 0;
LCR_renderer.models[chunk + 1].triangles =
LCR_renderer.models[chunk].triangles =
LCR_renderer.mapTris + LCR_renderer.chunkStarts[blockNum] * 3;
LCR_renderer.models[chunk + 1].triangleCount = triCount;
LCR_renderer.models[chunk].triangleCount = triCount;
}
}
void _LCR_loadMapChunks(void)
/**
Loads the map models with 8 chunks that are nearest to a certain point
towards which camera is looking.
*/
void _LCR_rendererLoadMapChunks(void)
{
int8_t camChunk[3], chunkOffsets[3];
S3L_Vec4 cp = LCR_renderer.scene.camera.transform.translation;
@ -1029,14 +1030,18 @@ void _LCR_loadMapChunks(void)
(cf.z >= (LCR_RENDERER_CHUNK_SIZE_HORIZONTAL / 2)) ? 1 : -1;
for (uint8_t i = 0; i < 8; ++i)
_LCR_loadMapChunk(i,
_LCR_rendererLoadMapChunk(i,
camChunk[0] + ((i & 0x01) ? chunkOffsets[0] : 0),
camChunk[1] + ((i & 0x02) ? chunkOffsets[1] : 0),
camChunk[2] + ((i & 0x04) ? chunkOffsets[2] : 0));
}
/**
Draws the LOD overlay.
*/
void LCR_rendererDrawLOD(void)
{
#if LCR_SETTING_LOD_DISTANCE < 64
for (unsigned int i = 0; i < LCR_RENDERER_LOD_BLOCKS; ++i)
if (LCR_renderer.gridLOD[i])
{
@ -1046,18 +1051,24 @@ void LCR_rendererDrawLOD(void)
bz = (i / 8) * 8 + 4;
by = (i % 8) * 8 + 4;
int var = 0;
for (unsigned int j = 0; j < 8; ++j)
{
if (byte & 0x01)
{
var = var < 2 ? var + 1 : 0;
bx = j * 8 + 4;
_LCR_drawLODBlock(bx,by,bz,(LCR_EFFECTIVE_RESOLUTION_X * 3) / 2,
LCR_SETTING_LOD_COLOR);
} // TODO: this ^
_LCR_rendererDrawLODBlock(bx,by,bz,
(LCR_EFFECTIVE_RESOLUTION_X * (2 + var)) / 2,
LCR_SETTING_LOD_COLOR | (0x4108 >> var));
}
byte >>= 1;
}
}
#endif
}
void LCR_rendererDraw(void)
@ -1065,7 +1076,7 @@ void LCR_rendererDraw(void)
LCR_renderer.previousTriID = -1;
S3L_newFrame();
_LCR_loadMapChunks();
_LCR_rendererLoadMapChunks(); // TODO: call only once in a while?
LCR_rendererDrawSky(2,
LCR_renderer.scene.camera.transform.rotation.y,