diff --git a/ref/vk/vk_beams.c b/ref/vk/vk_beams.c index 7e3aa73f..1de632d1 100644 --- a/ref/vk/vk_beams.c +++ b/ref/vk/vk_beams.c @@ -152,11 +152,16 @@ static float clampf(float v, float min, float max) { return v; } +// FIXME unclear how to organize this static void applyBrightness( float brightness, rgba_t out ) { out[0] = out[1] = out[2] = clampf(brightness, 0, 1) * 255.f; out[3] = 255; } +static void TriBrightness( float brightness ) { + TriColor4f( brightness, brightness, brightness, 1.f ); +} + static void R_DrawSegs( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments, int flags, const vec4_t color, int texture, int render_mode ) { int noiseIndex, noiseStep; @@ -399,7 +404,7 @@ static void R_DrawSegs( vec3_t source, vec3_t delta, float width, float scale, f } } -static void R_DrawTorus( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments ) +static void R_DrawTorus( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments, const vec4_t color ) { int i, noiseIndex, noiseStep; float div, length, fraction, factor, vLast, vStep; @@ -426,6 +431,8 @@ static void R_DrawTorus( vec3_t source, vec3_t delta, float width, float scale, noiseStep = (int)((float)( NOISE_DIVISIONS - 1 ) * div * 65536.0f ); noiseIndex = 0; + TriBegin( TRI_TRIANGLE_STRIP ); + for( i = 0; i < segments; i++ ) { float s, c; @@ -479,13 +486,12 @@ static void R_DrawTorus( vec3_t source, vec3_t delta, float width, float scale, VectorCopy( screen, screenLast ); noiseIndex += noiseStep; } + + TriEndEx(color, "beam torus"); } -static void R_DrawDisk( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments ) +static void R_DrawDisk( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments, const vec4_t color ) { - PRINT_NOT_IMPLEMENTED(); - -/* FIXME VK float div, length, fraction; float w, vLast, vStep; vec3_t point; @@ -509,6 +515,8 @@ static void R_DrawDisk( vec3_t source, vec3_t delta, float width, float scale, f // clamp the beam width w = fmod( freq, width * 0.1f ) * delta[2]; + TriBegin( TRI_TRIANGLE_STRIP ); + // NOTE: we must force the degenerate triangles to be on the edge for( i = 0; i < segments; i++ ) { @@ -532,14 +540,12 @@ static void R_DrawDisk( vec3_t source, vec3_t delta, float width, float scale, f vLast += vStep; // advance texture scroll (v axis only) } - */ + + TriEndEx(color, "beam disk"); } -static void R_DrawCylinder( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments ) +static void R_DrawCylinder( vec3_t source, vec3_t delta, float width, float scale, float freq, float speed, int segments, const vec4_t color ) { - PRINT_NOT_IMPLEMENTED(); - -/* FIXME VK float div, length, fraction; float vLast, vStep; vec3_t point; @@ -561,6 +567,7 @@ static void R_DrawCylinder( vec3_t source, vec3_t delta, float width, float scal vLast = fmod( freq * speed, 1 ); scale = scale * length; + TriBegin( TRI_TRIANGLE_STRIP ); for ( i = 0; i < segments; i++ ) { float s, c; @@ -586,14 +593,11 @@ static void R_DrawCylinder( vec3_t source, vec3_t delta, float width, float scal vLast += vStep; // Advance texture scroll (v axis only) } -*/ + TriEndEx(color, "beam cylinder"); } -static void R_DrawBeamFollow( BEAM *pbeam, float frametime ) +static void R_DrawBeamFollow( BEAM *pbeam, float frametime, const vec4_t color ) { - PRINT_NOT_IMPLEMENTED(); - -/* FIXME VK particle_t *pnew, *particles; float fraction, div, vLast, vStep; vec3_t last1, last2, tmp, screen; @@ -678,6 +682,7 @@ static void R_DrawBeamFollow( BEAM *pbeam, float frametime ) vLast = 0.0f; vStep = 1.0f; + TriBegin( TRI_QUADS ); while( particles ) { TriBrightness( fraction ); @@ -733,10 +738,11 @@ static void R_DrawBeamFollow( BEAM *pbeam, float frametime ) VectorMA( particles->org, frametime, particles->vel, particles->org ); particles = particles->next; } -*/ + + TriEndEx(color, "beam follow"); } -static void R_DrawRing( vec3_t source, vec3_t delta, float width, float amplitude, float freq, float speed, int segments ) +static void R_DrawRing( vec3_t source, vec3_t delta, float width, float amplitude, float freq, float speed, int segments, const vec4_t color ) { int i, j, noiseIndex, noiseStep; float div, length, fraction, factor, vLast, vStep; @@ -798,6 +804,7 @@ static void R_DrawRing( vec3_t source, vec3_t delta, float width, float amplitud j = segments / 8; + TriBegin( TRI_TRIANGLE_STRIP ); for( i = 0; i < segments + 1; i++ ) { fraction = i * div; @@ -851,6 +858,7 @@ static void R_DrawRing( vec3_t source, vec3_t delta, float width, float amplitud FracNoise( rgNoise, NOISE_DIVISIONS ); } } + TriEndEx( color, "beam ring" ); } /* @@ -1114,37 +1122,26 @@ void R_BeamDraw( BEAM *pbeam, float frametime ) { case TE_BEAMTORUS: // FIXME VK GL_Cull( GL_NONE ); - TriBegin( TRI_TRIANGLE_STRIP ); - R_DrawTorus( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments ); - TriEnd(); + R_DrawTorus( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments, color ); break; case TE_BEAMDISK: // FIXME VK GL_Cull( GL_NONE ); - TriBegin( TRI_TRIANGLE_STRIP ); - R_DrawDisk( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments ); - TriEnd(); + R_DrawDisk( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments, color ); break; case TE_BEAMCYLINDER: // FIXME VK GL_Cull( GL_NONE ); - TriBegin( TRI_TRIANGLE_STRIP ); - R_DrawCylinder( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments ); - TriEnd(); + R_DrawCylinder( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments, color ); break; case TE_BEAMPOINTS: case TE_BEAMHOSE: R_DrawSegs( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments, pbeam->flags, color, texturenum, render_mode ); break; case TE_BEAMFOLLOW: - // FIXME VK TriBegin( TRI_QUADS ); - //TriColor4f( color[0], color[1], color[2], color[3] ); - //R_DrawBeamFollow( pbeam, frametime ); - //TriEnd(); + R_DrawBeamFollow( pbeam, frametime, color ); break; case TE_BEAMRING: // FIXME VK GL_Cull( GL_NONE ); - TriBegin( TRI_TRIANGLE_STRIP ); - R_DrawRing( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments ); - TriEnd(); + R_DrawRing( pbeam->source, pbeam->delta, pbeam->width, pbeam->amplitude, pbeam->freq, pbeam->speed, pbeam->segments, color ); break; } diff --git a/ref/vk/vk_triapi.c b/ref/vk/vk_triapi.c index 7631950b..c511375f 100644 --- a/ref/vk/vk_triapi.c +++ b/ref/vk/vk_triapi.c @@ -94,7 +94,7 @@ static int genTriangleStripIndices(void) { return num_indices; } -static void emitDynamicGeometry(int num_indices) { +static void emitDynamicGeometry(int num_indices, const vec4_t color, const char* name ) { if (!num_indices) return; @@ -110,13 +110,9 @@ static void emitDynamicGeometry(int num_indices) { R_GeometryBufferUnlock( &buffer ); { - // FIXME pass these properly - const vec4_t color = {1, 1, 1, 1}; - const char* name = "FIXME triapi"; - const vk_render_geometry_t geometry = { .texture = g_triapi.texture_index, - .material = kXVkMaterialEmissive, + .material = (g_triapi.render_type == kVkRenderTypeSolid) ? kXVkMaterialRegular : kXVkMaterialEmissive, .max_vertex = g_triapi.num_vertices, .vertex_offset = buffer.vertices.unit_offset, @@ -140,6 +136,18 @@ void TriEnd( void ) { if (!g_triapi.num_vertices) return; + const vk_vertex_t *const v = g_triapi.vertices + g_triapi.num_vertices - 1; + const vec4_t color = {v->color[0] / 255.f, v->color[1] / 255.f, v->color[2] / 255.f, 1.f}; + TriEndEx( color, "unnamed triapi" ); +} + +void TriEndEx( const vec4_t color, const char* name ) { + if (!g_triapi.primitive_mode) + return; + + if (!g_triapi.num_vertices) + return; + int num_indices = 0; switch(g_triapi.primitive_mode - 1) { /* case TRI_TRIANGLES: */ @@ -153,7 +161,7 @@ void TriEnd( void ) { break; } - emitDynamicGeometry(num_indices); + emitDynamicGeometry(num_indices, color, name); g_triapi.num_vertices = 0; g_triapi.primitive_mode = 0; diff --git a/ref/vk/vk_triapi.h b/ref/vk/vk_triapi.h index 860d5e30..953533b3 100644 --- a/ref/vk/vk_triapi.h +++ b/ref/vk/vk_triapi.h @@ -15,3 +15,4 @@ void TriVertex3fv( const float *v ); void TriVertex3f( float x, float y, float z ); void TriEnd( void ); +void TriEndEx( const vec4_t color, const char* name );