Continue pruning tris

This commit is contained in:
Miloslav Ciz 2024-07-28 02:00:36 +02:00
parent 2d99091cf1
commit 34cfa9adac
3 changed files with 130 additions and 9 deletions

View file

@ -15,9 +15,7 @@ static const uint8_t map1[] =
0,
LCR_MAP_BLOCK(LCR_BLOCK_FULL,32,32,32,LCR_BLOCK_MATERIAL_CONCRETE,0),
LCR_MAP_BLOCK(LCR_BLOCK_FULL,33,32,32,LCR_BLOCK_MATERIAL_CONCRETE,0),
LCR_MAP_BLOCK(LCR_BLOCK_RAMP_CURVED_WALL,34,32,32,LCR_BLOCK_MATERIAL_CONCRETE,LCR_BLOCK_TRANSFORM_ROT_90),
LCR_MAP_BLOCK(LCR_BLOCK_RAMP_CURVED_WALL,34,32,32,LCR_BLOCK_MATERIAL_CONCRETE,/*LCR_BLOCK_TRANSFORM_ROT_90*/0),
LCR_MAP_BLOCK(LCR_BLOCK_FULL,32,33,32,LCR_BLOCK_MATERIAL_CONCRETE,0),
LCR_MAP_BLOCK(LCR_BLOCK_FULL,33,33,32,LCR_BLOCK_MATERIAL_CONCRETE,0),
LCR_MAP_BLOCK(LCR_BLOCK_FULL,32,33,33,LCR_BLOCK_MATERIAL_CONCRETE,0),

View file

@ -3,5 +3,5 @@
clear
clear
gcc -std=c99 -Wall -Wextra -pedantic -O3 -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers `sdl2-config --libs --static-libs` -o game main_sdl.c && ./game
gcc -std=c99 -g -Wall -Wextra -pedantic -O1 -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers `sdl2-config --libs --static-libs` -o game frontend_sdl.c && ./game

View file

@ -102,11 +102,137 @@ uint8_t _LCR_rendererCheckMapTriangleCover(const S3L_Index *t1,
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]) &&
(t1[2] == t2[0] || t1[2] == t2[1] || t1[2] == t2[2]))
return 0x03; // same indices => both are covered
return 0x03;
uint8_t result = 0;
int plane = -1;
for (int i = 0; i < 3; ++i)
if (LCR_mapVertices[3 * t1[0] + i] == LCR_mapVertices[3 * t1[1] + i] &&
LCR_mapVertices[3 * t1[1] + i] == LCR_mapVertices[3 * t1[2] + i] &&
LCR_mapVertices[3 * t1[2] + i] == LCR_mapVertices[3 * t2[0] + i] &&
LCR_mapVertices[3 * t2[0] + i] == LCR_mapVertices[3 * t2[1] + i] &&
LCR_mapVertices[3 * t2[1] + i] == LCR_mapVertices[3 * t2[2] + i])
{
plane = i;
break;
}
if (plane >= 0) // both triangles in the same plane => then do more checks
{
for (int j = 0; j < 2; ++j)
{
S3L_Unit points2D[14]; // tri1, quad (tri2 + 1 extra vert)
int coordX = plane == 0 ? 1 : 0,
coordY = plane == 2 ? 1 : 2;
for (int i = 0; i < 3; ++i)
{
points2D[i * 2] = LCR_mapVertices[3 * t1[i] + coordX];
points2D[i * 2 + 1] = LCR_mapVertices[3 * t1[i] + coordY];
points2D[6 + i * 2] = LCR_mapVertices[3 * t2[i] + coordX];
points2D[6 + i * 2 + 1] = LCR_mapVertices[3 * t2[i] + coordY];
}
points2D[12] = (4 * points2D[6] + 3 * points2D[8] + points2D[10]) / 8;
points2D[13] = (4 * points2D[7] + 3 * points2D[9] + points2D[11]) / 8;
// first: does the triangle alone cover the other one?
if (_LCR_quadCoversTriangle(points2D + 6,points2D))
result |= 1 << j;
else
{
// now check if this triangle along with a neighbor cover the other one
S3L_Index *t3 = LCR_mapTriangles;
for (int i = 0; i < LCR_mapModel->triangleCount; ++i)
{
uint8_t sharedVerts =
(t3[0] == t2[0] || t3[0] == t2[1] || t3[0] == t2[2]) |
((t3[1] == t2[0] || t3[1] == t2[1] || t3[1] == t2[2]) << 1) |
((t3[2] == t2[0] || t3[2] == t2[1] || t3[2] == t2[2]) << 2);
if (
t3 != t1 && t3 != t2 &&
(sharedVerts == 3 || sharedVerts == 5 || sharedVerts == 6) &&
LCR_mapVertices[3 * t3[0] + plane] ==
LCR_mapVertices[3 * t3[1] + plane] &&
LCR_mapVertices[3 * t3[1] + plane] ==
LCR_mapVertices[3 * t3[2] + plane] &&
LCR_mapVertices[3 * t3[0] + plane] ==
LCR_mapVertices[3 * t1[0] + plane]
)
{
// here shares exactly two vertices and is in the same plane
uint8_t freeVert =
sharedVerts == 3 ? 2 : (sharedVerts == 5 ? 1 : 0);
points2D[12] = LCR_mapVertices[3 * t3[freeVert] + coordX];
points2D[13] = LCR_mapVertices[3 * t3[freeVert] + coordY];
if (_LCR_quadCoversTriangle(points2D + 6,points2D))
{
result |= 1 << j;
break;
}
}
t3 += 3;
}
}
const S3L_Index *tmp = t1;
t1 = t2;
t2 = tmp;
}
}
return result;
}
int _LCR_quadCoversTriangle(const S3L_Unit quad[8], const S3L_Unit tri[6])
{
for (int i = 0; i < 3; ++i) // for each triangle point
{
int covered = 0;
for (int j = 0; j < 3; ++j) // for each quad subtriangle
{
uint8_t winds = 0;
for (int k = 0; k < 3; ++k) // for each subtriangle side
{
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;
}
if (winds != 3) // no opposite winds?
{
covered = 1;
break;
}
}
if (!covered)
return 0;
}
return 1;
}
/**
Removes map triangles that are covered by other triangles (and also vertices
that by this become unused). This makes the map model smaller, faster and
@ -168,8 +294,6 @@ void _LCR_rendererPruneHiddenMapTriangles(void)
i = 0;
printf("ASASA %d\n",LCR_mapModel->vertexCount);
while (i < LCR_mapModel->vertexCount)
{
int used = 0;
@ -196,7 +320,6 @@ printf("ASASA %d\n",LCR_mapModel->vertexCount);
LCR_mapModel->vertexCount--;
}
}
printf("ASASA %d\n",LCR_mapModel->vertexCount);
}
/**