diff options
Diffstat (limited to 'src/video/trail_render.c')
-rw-r--r-- | src/video/trail_render.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/video/trail_render.c b/src/video/trail_render.c new file mode 100644 index 0000000..60f4188 --- /dev/null +++ b/src/video/trail_render.c @@ -0,0 +1,73 @@ +#include "video/trail_geometry.h" + +void trailStatesNormal(Player *pPlayer, int texture) { + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + // glEnable(GL_CULL_FACE); + glDisable(GL_CULL_FACE); + glShadeModel(GL_SMOOTH); + glEnable(GL_TEXTURE_2D); + // glDisable(GL_TEXTURE_2D); + // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + // glDisable(GL_LIGHTING); + glBindTexture(GL_TEXTURE_2D, texture); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + + { + float black[] = { 0, 0, 0, 1 }; + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black); + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + } + + if(gSettingsCache.alpha_trails) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } +} + +void trailStatesShadowed(void) { + glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + // glEnable(GL_CULL_FACE); + glDisable(GL_CULL_FACE); + glDisable(GL_TEXTURE_2D); + // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDisable(GL_LIGHTING); +} + +void trailStatesRestore(void) { + glDisable(GL_COLOR_MATERIAL); + glCullFace(GL_BACK); + glDisable(GL_CULL_FACE); + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} + +void trailRender(TrailMesh *pMesh) { + if(pMesh->iUsed == 0) + return; + + glVertexPointer(3, GL_FLOAT, 0, pMesh->pVertices); + glNormalPointer(GL_FLOAT, 0, pMesh->pNormals); + glTexCoordPointer(2, GL_FLOAT, 0, pMesh->pTexCoords); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, pMesh->pColors); + + checkGLError("texcoord pointer"); + + glDrawElements(GL_TRIANGLES, pMesh->iUsed, GL_UNSIGNED_SHORT, pMesh->pIndices); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + + checkGLError("trail"); +} |