vk: draw the rest of the beams

This commit is contained in:
Ivan 'provod' Avdeev 2023-02-27 09:49:56 -08:00
parent 2daa130453
commit 30334db159
3 changed files with 46 additions and 40 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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 );