Add particles

This commit is contained in:
Miloslav Ciz 2025-04-20 19:38:13 +02:00
parent 06c1d1c42e
commit d905718bab
6 changed files with 105 additions and 51 deletions

View file

@ -112,51 +112,24 @@ struct
unsigned int flatAndTransparent; /**< If non-zero, transparent (dithered)
polygons will be drawn without texture,
with color stored in this variable. */
#if LCR_SETTING_PARTICLES
uint16_t particleColor; /**< 0x0000 means no particles active. */
#endif
} LCR_renderer;
void aaa(void)
/**
Sets particle effects drawn around wheels. The parameter says particle color,
0x0000 turns particles off.
*/
void LCR_rendererSetParticles(uint16_t color)
{
printf("BAD TRIS (%d):\n",LCR_renderer.mapModel.triangleCount);
for (int i = 0; i < LCR_renderer.mapModel.triangleCount; ++i)
{
TPE_Unit sss =
TPE_max(
TPE_abs(LCR_renderer.mapModel.vertices[
LCR_renderer.mapModel.triangles[i * 3] * 3] -
LCR_renderer.mapModel.vertices[
LCR_renderer.mapModel.triangles[i * 3 + 1] * 3]),
TPE_abs(LCR_renderer.mapModel.vertices[
LCR_renderer.mapModel.triangles[i * 3 + 1] * 3] -
LCR_renderer.mapModel.vertices[
LCR_renderer.mapModel.triangles[i * 3 + 2] * 3])
);
if (sss > LCR_RENDERER_UNIT * 2)
printf(" - %d (%d %d %d, %d %d %d, %d %d %d) %d %d %d\n",i,
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i]],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i] + 1],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i] + 2],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i + 1]],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i + 1] + 1],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i + 1] + 2],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i + 2]],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i + 2] + 1],
LCR_renderer.mapModel.vertices[LCR_renderer.mapModel.triangles[3 * i + 2] + 2],
LCR_renderer.mapModel.triangles[3 * i],
LCR_renderer.mapModel.triangles[3 * i + 1],
LCR_renderer.mapModel.triangles[3 * i + 2]
);
}
#if LCR_SETTING_PARTICLES
LCR_renderer.particleColor = color;
#else
return;
#endif
}
void _LCR_rendererSetModelTransform(S3L_Model3D *model,
LCR_GameUnit position[3], LCR_GameUnit rotation[3])
{
@ -2100,6 +2073,51 @@ void LCR_rendererDraw3D(void)
LCR_renderer.frame++;
#if LCR_SETTING_PARTICLES
if (LCR_renderer.particleColor)
{
S3L_Vec4 p, r, s;
S3L_rotationToDirections(LCR_renderer.carModel->transform.rotation,
LCR_RENDERER_UNIT / 2,&p,&r,0);
#define LCR_PARTICLE_SIZE (16 << (LCR_EFFECTIVE_RESOLUTION_X / 640))
p.w = LCR_PARTICLE_SIZE;
r.x /= 2;
r.y /= 2;
r.z /= 2;
S3L_vec3Add(&p,LCR_renderer.carModel->transform.translation);
for (int i = 0; i < 2; ++i) // for both wheels
{
S3L_vec3Add(&p,r);
S3L_project3DPointToScreen(p,LCR_renderer.scene.camera,&s);
if (s.w > 0)
for (int j = 0; j < 4; ++j) // 4 particles
{
int pSize =
((LCR_renderer.frame + 4 * j) << 2) % (2 * LCR_PARTICLE_SIZE);
LCR_rendererDrawRect(
s.x - pSize / 2 + ((j % 2) ? -1 * pSize : pSize),
s.y - pSize / 2 + ((j / 2) ? -1 * pSize : pSize),
pSize,pSize,LCR_renderer.particleColor,1);
}
r.x *= -2;
r.y *= -2;
r.z *= -2;
}
}
#undef LCR_PARTICLE_SIZE
#endif
LCR_LOG2("3D rendering (end)");
LCR_LOG2("rendering frame (end)");
}