From 03c41994ba1761eb9f273cdaabaa9773c9a769c2 Mon Sep 17 00:00:00 2001 From: Matthias Bentrup Date: Wed, 13 Sep 2017 15:31:10 +0200 Subject: [PATCH] Fix RE_RotatedPic and RE_StretchPicGradient rendering. --- src/engine/renderer/tr_backend.cpp | 90 +++++++++++++----------------- src/engine/renderer/tr_cmds.cpp | 8 +-- src/engine/renderer/tr_local.h | 11 +++- 3 files changed, 51 insertions(+), 58 deletions(-) diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index c3b381e552..8cc7402844 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -5236,28 +5236,21 @@ const RenderCommand *Poly2dIndexedCommand::ExecuteSelf( ) const // NERVE - SMF -#if 0 // unused ? /* ============= RB_RotatedPic ============= */ -const void *RB_RotatedPic( const void *data ) +const RenderCommand *RotatedPicCommand::ExecuteSelf( ) const { - const stretchPicCommand_t *cmd; - shader_t *shader; int numVerts, numIndexes; float mx, my, cosA, sinA, cw, ch, sw, sh; - cmd = ( const stretchPicCommand_t * ) data; - if ( !backEnd.projection2D ) { RB_SetGL2D(); } - shader = cmd->shader; - if ( shader != tess.surfaceShader ) { if ( tess.numIndexes ) @@ -5287,50 +5280,50 @@ const void *RB_RotatedPic( const void *data ) tess.indexes[ numIndexes + 4 ] = numVerts + 0; tess.indexes[ numIndexes + 5 ] = numVerts + 1; - mx = cmd->x + ( cmd->w / 2 ); - my = cmd->y + ( cmd->h / 2 ); - cosA = cos( DEG2RAD( cmd->angle ) ); - sinA = sin( DEG2RAD( cmd->angle ) ); - cw = cosA * ( cmd->w / 2 ); - ch = cosA * ( cmd->h / 2 ); - sw = sinA * ( cmd->w / 2 ); - sh = sinA * ( cmd->h / 2 ); + mx = x + ( w / 2 ); + my = y + ( h / 2 ); + cosA = cos( DEG2RAD( angle ) ); + sinA = sin( DEG2RAD( angle ) ); + cw = cosA * ( w / 2 ); + ch = cosA * ( h / 2 ); + sw = sinA * ( w / 2 ); + sh = sinA * ( h / 2 ); tess.verts[ numVerts ].xyz[ 0 ] = mx - cw - sh; tess.verts[ numVerts ].xyz[ 1 ] = my + sw - ch; tess.verts[ numVerts ].xyz[ 2 ] = 0.0f; tess.verts[ numVerts + 0 ].color = backEnd.color2D; - tess.verts[ numVerts ].texCoords[ 0 ] = floatToHalf( cmd->s1 ); - tess.verts[ numVerts ].texCoords[ 1 ] = floatToHalf( cmd->t1 ); + tess.verts[ numVerts ].texCoords[ 0 ] = floatToHalf( s1 ); + tess.verts[ numVerts ].texCoords[ 1 ] = floatToHalf( t1 ); tess.verts[ numVerts + 1 ].xyz[ 0 ] = mx + cw - sh; tess.verts[ numVerts + 1 ].xyz[ 1 ] = my - sw - ch; tess.verts[ numVerts + 1 ].xyz[ 2 ] = 0.0f; tess.verts[ numVerts + 1 ].color = backEnd.color2D; - tess.verts[ numVerts + 1 ].texCoords[ 0 ] = floatToHalf( cmd->s2 ); - tess.verts[ numVerts + 1 ].texCoords[ 1 ] = floatToHalf( cmd->t1 ); + tess.verts[ numVerts + 1 ].texCoords[ 0 ] = floatToHalf( s2 ); + tess.verts[ numVerts + 1 ].texCoords[ 1 ] = floatToHalf( t1 ); tess.verts[ numVerts + 2 ].xyz[ 0 ] = mx + cw + sh; tess.verts[ numVerts + 2 ].xyz[ 1 ] = my - sw + ch; tess.verts[ numVerts + 2 ].xyz[ 2 ] = 0.0f; tess.verts[ numVerts + 2 ].color = backEnd.color2D; - tess.verts[ numVerts + 2 ].texCoords[ 0 ] = floatToHalf( cmd->s2 ); - tess.verts[ numVerts + 2 ].texCoords[ 1 ] = floatToHalf( cmd->t2 ); + tess.verts[ numVerts + 2 ].texCoords[ 0 ] = floatToHalf( s2 ); + tess.verts[ numVerts + 2 ].texCoords[ 1 ] = floatToHalf( t2 ); tess.verts[ numVerts + 3 ].xyz[ 0 ] = mx - cw + sh; tess.verts[ numVerts + 3 ].xyz[ 1 ] = my + sw + ch; tess.verts[ numVerts + 3 ].xyz[ 2 ] = 0.0f; tess.verts[ numVerts + 3 ].color = backEnd.color2D; - tess.verts[ numVerts + 3 ].texCoords[ 0 ] = floatToHalf( cmd->s1 ); - tess.verts[ numVerts + 3 ].texCoords[ 1 ] = floatToHalf( cmd->t2 ); + tess.verts[ numVerts + 3 ].texCoords[ 0 ] = floatToHalf( s1 ); + tess.verts[ numVerts + 3 ].texCoords[ 1 ] = floatToHalf( t2 ); tess.attribsSet |= ATTR_POSITION | ATTR_TEXCOORD | ATTR_COLOR; - return ( const void * )( cmd + 1 ); + return this + 1; } // -NERVE - SMF @@ -5340,21 +5333,15 @@ const void *RB_RotatedPic( const void *data ) RB_StretchPicGradient ============== */ -const void *RB_StretchPicGradient( const void *data ) +const RenderCommand *GradientPicCommand::ExecuteSelf( ) const { - const stretchPicCommand_t *cmd; - shader_t *shader; int numVerts, numIndexes; - cmd = ( const stretchPicCommand_t * ) data; - if ( !backEnd.projection2D ) { RB_SetGL2D(); } - shader = cmd->shader; - if ( shader != tess.surfaceShader ) { if ( tess.numIndexes ) @@ -5386,41 +5373,40 @@ const void *RB_StretchPicGradient( const void *data ) tess.verts[ numVerts + 0 ].color = backEnd.color2D; tess.verts[ numVerts + 1 ].color = backEnd.color2D; - tess.verts[ numVerts + 2 ].color = cmd->gradientColor; - tess.verts[ numVerts + 3 ].color = cmd->gradientColor; + tess.verts[ numVerts + 2 ].color = gradientColor; + tess.verts[ numVerts + 3 ].color = gradientColor; - tess.verts[ numVerts ].xyz[ 0 ] = cmd->x; - tess.verts[ numVerts ].xyz[ 1 ] = cmd->y; + tess.verts[ numVerts ].xyz[ 0 ] = x; + tess.verts[ numVerts ].xyz[ 1 ] = y; tess.verts[ numVerts ].xyz[ 2 ] = 0.0f; - tess.verts[ numVerts ].texCoords[ 0 ] = floatToHalf( cmd->s1 ); - tess.verts[ numVerts ].texCoords[ 1 ] = floatToHalf( cmd->t1 ); + tess.verts[ numVerts ].texCoords[ 0 ] = floatToHalf( s1 ); + tess.verts[ numVerts ].texCoords[ 1 ] = floatToHalf( t1 ); - tess.verts[ numVerts + 1 ].xyz[ 0 ] = cmd->x + cmd->w; - tess.verts[ numVerts + 1 ].xyz[ 1 ] = cmd->y; + tess.verts[ numVerts + 1 ].xyz[ 0 ] = x + w; + tess.verts[ numVerts + 1 ].xyz[ 1 ] = y; tess.verts[ numVerts + 1 ].xyz[ 2 ] = 0.0f; - tess.verts[ numVerts + 1 ].texCoords[ 0 ] = floatToHalf( cmd->s2 ); - tess.verts[ numVerts + 1 ].texCoords[ 1 ] = floatToHalf( cmd->t1 ); + tess.verts[ numVerts + 1 ].texCoords[ 0 ] = floatToHalf( s2 ); + tess.verts[ numVerts + 1 ].texCoords[ 1 ] = floatToHalf( t1 ); - tess.verts[ numVerts + 2 ].xyz[ 0 ] = cmd->x + cmd->w; - tess.verts[ numVerts + 2 ].xyz[ 1 ] = cmd->y + cmd->h; + tess.verts[ numVerts + 2 ].xyz[ 0 ] = x + w; + tess.verts[ numVerts + 2 ].xyz[ 1 ] = y + h; tess.verts[ numVerts + 2 ].xyz[ 2 ] = 0.0f; - tess.verts[ numVerts + 2 ].texCoords[ 0 ] = floatToHalf( cmd->s2 ); - tess.verts[ numVerts + 2 ].texCoords[ 1 ] = floatToHalf( cmd->t2 ); + tess.verts[ numVerts + 2 ].texCoords[ 0 ] = floatToHalf( s2 ); + tess.verts[ numVerts + 2 ].texCoords[ 1 ] = floatToHalf( t2 ); - tess.verts[ numVerts + 3 ].xyz[ 0 ] = cmd->x; - tess.verts[ numVerts + 3 ].xyz[ 1 ] = cmd->y + cmd->h; + tess.verts[ numVerts + 3 ].xyz[ 0 ] = x; + tess.verts[ numVerts + 3 ].xyz[ 1 ] = y + h; tess.verts[ numVerts + 3 ].xyz[ 2 ] = 0.0f; - tess.verts[ numVerts + 3 ].texCoords[ 0 ] = floatToHalf( cmd->s1 ); - tess.verts[ numVerts + 3 ].texCoords[ 1 ] = floatToHalf( cmd->t2 ); + tess.verts[ numVerts + 3 ].texCoords[ 0 ] = floatToHalf( s1 ); + tess.verts[ numVerts + 3 ].texCoords[ 1 ] = floatToHalf( t2 ); tess.attribsSet |= ATTR_POSITION | ATTR_TEXCOORD | ATTR_COLOR; - return ( const void * )( cmd + 1 ); + return this + 1; } -#endif /* ============= diff --git a/src/engine/renderer/tr_cmds.cpp b/src/engine/renderer/tr_cmds.cpp index 16140f9e68..5b1ea608c7 100644 --- a/src/engine/renderer/tr_cmds.cpp +++ b/src/engine/renderer/tr_cmds.cpp @@ -691,9 +691,9 @@ RE_RotatedPic */ void RE_RotatedPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t hShader, float angle ) { - StretchPicCommand *cmd; + RotatedPicCommand *cmd; - cmd = R_GetRenderCommand(); + cmd = R_GetRenderCommand(); if ( !cmd ) { @@ -725,9 +725,9 @@ void RE_StretchPicGradient( float x, float y, float w, float h, qhandle_t hShader, const Color::Color& gradientColor, int gradientType ) { - StretchPicCommand *cmd; + GradientPicCommand *cmd; - cmd = R_GetRenderCommand(); + cmd = R_GetRenderCommand(); if ( !cmd ) { diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 70f62cb94c..0b5c9d5327 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -3765,10 +3765,17 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) float w, h; float s1, t1; float s2, t2; + }; + struct RotatedPicCommand : public StretchPicCommand { + const RenderCommand *ExecuteSelf() const; + + float angle; + }; + struct GradientPicCommand : public StretchPicCommand { + const RenderCommand *ExecuteSelf() const; Color::Color32Bit gradientColor; // color values 0-255 - int gradientType; //----(SA) added - float angle; // NERVE - SMF + int gradientType; }; struct Poly2dCommand : public RenderCommand { const RenderCommand *ExecuteSelf() const;