mirror of
https://git.coom.tech/drummyfish/small3dlib.git
synced 2024-11-21 20:39:57 +01:00
Add triangleID to PixelInfo
This commit is contained in:
parent
8c4649640f
commit
a7657c0951
4 changed files with 14 additions and 12 deletions
|
@ -75,12 +75,11 @@ void sampleTexture(uint8_t *texture, int32_t u, int32_t v, uint8_t *r, uint8_t *
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t previousTriangle = -1;
|
int16_t previousTriangle = -1;
|
||||||
int16_t previousModel = -1;
|
|
||||||
S3L_Unit uv0[2], uv1[2], uv2[2];
|
S3L_Unit uv0[2], uv1[2], uv2[2];
|
||||||
|
|
||||||
void drawPixel(S3L_PixelInfo *p)
|
void drawPixel(S3L_PixelInfo *p)
|
||||||
{
|
{
|
||||||
if (p->triangleIndex != previousTriangle || p->modelIndex != previousModel)
|
if (p->triangleID != previousTriangle)
|
||||||
{
|
{
|
||||||
S3L_Index *uvIndices;
|
S3L_Index *uvIndices;
|
||||||
S3L_Unit *uvs;
|
S3L_Unit *uvs;
|
||||||
|
@ -119,8 +118,7 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
uv2[0] = uvs[index];
|
uv2[0] = uvs[index];
|
||||||
uv2[1] = uvs[index + 1];
|
uv2[1] = uvs[index + 1];
|
||||||
|
|
||||||
previousTriangle = p->triangleIndex;
|
previousTriangle = p->triangleID;
|
||||||
previousModel = p->modelIndex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t r,g,b;
|
uint8_t r,g,b;
|
||||||
|
|
|
@ -85,7 +85,6 @@ S3L_Model3D models[MODELS_TOTAL];
|
||||||
S3L_Scene scene;
|
S3L_Scene scene;
|
||||||
|
|
||||||
int previousTriangle = -1;
|
int previousTriangle = -1;
|
||||||
int previousModel = -1;
|
|
||||||
|
|
||||||
S3L_Vec4 toLightDirection;
|
S3L_Vec4 toLightDirection;
|
||||||
|
|
||||||
|
@ -169,7 +168,7 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
normals = waterNormals; break;
|
normals = waterNormals; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->triangleIndex != previousTriangle || p->modelIndex != previousModel)
|
if (p->triangleID != previousTriangle)
|
||||||
{
|
{
|
||||||
int index = scene.models[p->modelIndex].triangles[p->triangleIndex * 3] * 3;
|
int index = scene.models[p->modelIndex].triangles[p->triangleIndex * 3] * 3;
|
||||||
|
|
||||||
|
@ -226,8 +225,7 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
uv2[1] = treeUVs[index];
|
uv2[1] = treeUVs[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
previousTriangle = p->triangleIndex;
|
previousTriangle = p->triangleID;
|
||||||
previousModel = p->modelIndex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
S3L_correctBarycentricCoords(p->barycentric);
|
S3L_correctBarycentricCoords(p->barycentric);
|
||||||
|
|
|
@ -158,7 +158,7 @@ S3L_Vec4 n0, n1, n2, nt;
|
||||||
|
|
||||||
void drawPixel(S3L_PixelInfo *p)
|
void drawPixel(S3L_PixelInfo *p)
|
||||||
{
|
{
|
||||||
if (p->triangleIndex != previousTriangle)
|
if (p->triangleID != previousTriangle)
|
||||||
{
|
{
|
||||||
int16_t index;
|
int16_t index;
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ void drawPixel(S3L_PixelInfo *p)
|
||||||
l2 = 256 + S3L_clamp(S3L_dotProductVec3(n2,toLight),-511,511) / 2;
|
l2 = 256 + S3L_clamp(S3L_dotProductVec3(n2,toLight),-511,511) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
previousTriangle = p->triangleIndex;
|
previousTriangle = p->triangleID;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wire)
|
if (wire)
|
||||||
|
|
10
small3dlib.h
10
small3dlib.h
|
@ -472,8 +472,11 @@ typedef struct
|
||||||
for the price of some performance). The sum of
|
for the price of some performance). The sum of
|
||||||
the three coordinates will always be exactly
|
the three coordinates will always be exactly
|
||||||
S3L_FRACTIONS_PER_UNIT. */
|
S3L_FRACTIONS_PER_UNIT. */
|
||||||
S3L_Index triangleIndex; ///< Triangle index.
|
S3L_Index modelIndex; ///< Model index within the scene.
|
||||||
S3L_Index modelIndex;
|
S3L_Index triangleIndex; ///< Triangle index within the model.
|
||||||
|
uint32_t triangleID; /**< Unique ID of the triangle withing the whole
|
||||||
|
scene. This can be used e.g. by a cache to
|
||||||
|
quickly find out if a triangle has changed. */
|
||||||
S3L_Unit depth; ///< Depth (only if depth is turned on).
|
S3L_Unit depth; ///< Depth (only if depth is turned on).
|
||||||
S3L_Unit previousZ; /**< Z-buffer value (not necessarily world depth in
|
S3L_Unit previousZ; /**< Z-buffer value (not necessarily world depth in
|
||||||
S3L_Units!) that was in the z-buffer on the
|
S3L_Units!) that was in the z-buffer on the
|
||||||
|
@ -1444,7 +1447,9 @@ void S3L_initPixelInfo(S3L_PixelInfo *p) // TODO: maybe non-pointer for p
|
||||||
p->barycentric[0] = S3L_FRACTIONS_PER_UNIT;
|
p->barycentric[0] = S3L_FRACTIONS_PER_UNIT;
|
||||||
p->barycentric[1] = 0;
|
p->barycentric[1] = 0;
|
||||||
p->barycentric[2] = 0;
|
p->barycentric[2] = 0;
|
||||||
|
p->modelIndex = 0;
|
||||||
p->triangleIndex = 0;
|
p->triangleIndex = 0;
|
||||||
|
p->triangleID = 0;
|
||||||
p->depth = 0;
|
p->depth = 0;
|
||||||
p->previousZ = 0;
|
p->previousZ = 0;
|
||||||
}
|
}
|
||||||
|
@ -1631,6 +1636,7 @@ void S3L_drawTriangle(
|
||||||
S3L_initPixelInfo(&p);
|
S3L_initPixelInfo(&p);
|
||||||
p.modelIndex = modelIndex;
|
p.modelIndex = modelIndex;
|
||||||
p.triangleIndex = triangleIndex;
|
p.triangleIndex = triangleIndex;
|
||||||
|
p.triangleID = modelIndex << 16 | triangleIndex;
|
||||||
|
|
||||||
#if !S3L_STRICT_NEAR_CULLING
|
#if !S3L_STRICT_NEAR_CULLING
|
||||||
point0.z = point0.z >= S3L_NEAR ? point0.z : S3L_NEAR;
|
point0.z = point0.z >= S3L_NEAR ? point0.z : S3L_NEAR;
|
||||||
|
|
Loading…
Reference in a new issue