This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to tag 1.51b
in repository iortcw.

commit aecd5bcc8e30e8ea8df4f5c5b31c94c3fd3bdfb1
Author: MAN-AT-ARMS <m4n4t4...@gmail.com>
Date:   Sat Aug 5 08:05:53 2017 -0400

    All: Fix floating point precision loss in renderer
---
 MP/code/rend2/tr_backend.c       |  8 ++++--
 MP/code/rend2/tr_local.h         | 59 +++++++++++++++++++++-------------------
 MP/code/rend2/tr_noise.c         |  2 +-
 MP/code/rend2/tr_scene.c         |  2 +-
 MP/code/rend2/tr_shade.c         |  4 +--
 MP/code/rend2/tr_shade_calc.c    | 18 ++++++------
 MP/code/renderer/tr_backend.c    |  8 ++++--
 MP/code/renderer/tr_local.h      | 10 +++----
 MP/code/renderer/tr_noise.c      |  2 +-
 MP/code/renderer/tr_scene.c      |  2 +-
 MP/code/renderer/tr_shade.c      |  4 +--
 MP/code/renderer/tr_shade_calc.c | 24 ++++++++--------
 SP/code/rend2/tr_backend.c       |  8 ++++--
 SP/code/rend2/tr_local.h         | 59 +++++++++++++++++++++-------------------
 SP/code/rend2/tr_noise.c         |  2 +-
 SP/code/rend2/tr_scene.c         |  2 +-
 SP/code/rend2/tr_shade.c         |  4 +--
 SP/code/rend2/tr_shade_calc.c    | 18 ++++++------
 SP/code/renderer/tr_backend.c    |  8 ++++--
 SP/code/renderer/tr_local.h      | 10 +++----
 SP/code/renderer/tr_noise.c      |  2 +-
 SP/code/renderer/tr_scene.c      |  2 +-
 SP/code/renderer/tr_shade.c      |  4 +--
 SP/code/renderer/tr_shade_calc.c | 24 ++++++++--------
 24 files changed, 150 insertions(+), 136 deletions(-)

diff --git a/MP/code/rend2/tr_backend.c b/MP/code/rend2/tr_backend.c
index 5e9b271..4bd525c 100644
--- a/MP/code/rend2/tr_backend.c
+++ b/MP/code/rend2/tr_backend.c
@@ -503,7 +503,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
        int i;
        drawSurf_t      *drawSurf;
        int oldSort;
-       float originalTime;
+       double originalTime;
        FBO_t*                  fbo = NULL;
        qboolean                inQuery = qfalse;
 
@@ -568,7 +568,9 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
 
                        if ( entityNum != REFENTITYNUM_WORLD ) {
                                backEnd.currentEntity = 
&backEnd.refdef.entities[entityNum];
-                               backEnd.refdef.floatTime = originalTime; // - 
backEnd.currentEntity->e.shaderTime; // JPW NERVE pulled this to match q3ta
+
+                               // FIXME: e.shaderTime must be passed as int to 
avoid fp-precision loss issues
+                               backEnd.refdef.floatTime = originalTime; // - 
(double)backEnd.currentEntity->e.shaderTime; // JPW NERVE pulled this to match 
q3ta
 
                                // we have to reset the shaderTime as well 
otherwise image animations start
                                // from the wrong frame
@@ -734,7 +736,7 @@ void    RB_SetGL2D( void ) {
 
        // set time for 2D shaders
        backEnd.refdef.time = ri.Milliseconds();
-       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001f;
+       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001;
 }
 
 
diff --git a/MP/code/rend2/tr_local.h b/MP/code/rend2/tr_local.h
index 6c7e30f..2e9d099 100644
--- a/MP/code/rend2/tr_local.h
+++ b/MP/code/rend2/tr_local.h
@@ -518,37 +518,14 @@ typedef struct shader_s {
 
        void ( *optimalStageIteratorFunc )( void );
 
-       float clampTime;                                    // time this shader 
is clamped to
-       float timeOffset;                                   // current time 
offset for this shader
+       double clampTime;                                    // time this 
shader is clamped to
+       double timeOffset;                                   // current time 
offset for this shader
 
        struct shader_s *remappedShader;                    // current shader 
this one is remapped too
 
        struct shader_s *next;
 } shader_t;
 
-static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
-{
-       if(shader->numDeforms)
-       {
-               const deformStage_t *ds = &shader->deforms[0];
-
-               if (shader->numDeforms > 1)
-                       return qtrue;
-
-               switch (ds->deformation)
-               {
-                       case DEFORM_WAVE:
-                       case DEFORM_BULGE:
-                               return qfalse;
-
-                       default:
-                               return qtrue;
-               }
-       }
-
-       return qfalse;
-}
-
 typedef struct cubemap_s {
        char name[MAX_QPATH];
        vec3_t origin;
@@ -823,7 +800,7 @@ typedef struct {
        byte areamask[MAX_MAP_AREA_BYTES];
        qboolean areamaskModified;      // qtrue if areamask changed since last 
scene
 
-       float floatTime;                // tr.refdef.time / 1000.0
+       double floatTime;                // tr.refdef.time / 1000.0
 
        float           blurFactor;
 
@@ -1997,9 +1974,35 @@ extern cvar_t   *r_wolffog;
 extern cvar_t  *r_highQualityVideo;
 //====================================================================
 
-float R_NoiseGet4f( float x, float y, float z, float t );
+float R_NoiseGet4f( float x, float y, float z, double t );
 void  R_NoiseInit( void );
 
+static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
+{
+       if(shader->numDeforms)
+       {
+               const deformStage_t *ds = &shader->deforms[0];
+
+               if (shader->numDeforms > 1)
+                       return qtrue;
+
+               switch (ds->deformation)
+               {
+                       case DEFORM_WAVE:
+                       case DEFORM_BULGE:
+                               // need CPU deforms at high level-times to 
avoid floating point percision loss
+                               return ( backEnd.refdef.floatTime != 
(float)backEnd.refdef.floatTime );
+
+                       default:
+                               return qtrue;
+               }
+       }
+
+       return qfalse;
+}
+
+//====================================================================
+
 void R_SwapBuffers( int );
 
 void R_RenderView( viewParms_t *parms );
@@ -2214,7 +2217,7 @@ typedef struct shaderCommands_s
        //color4ub_t    constantColor255[SHADER_MAX_VERTEXES] QALIGN(16);
 
        shader_t    *shader;
-       float shaderTime;
+       double shaderTime;
        int fogNum;
        int         cubemapIndex;
 
diff --git a/MP/code/rend2/tr_noise.c b/MP/code/rend2/tr_noise.c
index 2ad2385..7505680 100644
--- a/MP/code/rend2/tr_noise.c
+++ b/MP/code/rend2/tr_noise.c
@@ -56,7 +56,7 @@ void R_NoiseInit( void ) {
        }
 }
 
-float R_NoiseGet4f( float x, float y, float z, float t ) {
+float R_NoiseGet4f( float x, float y, float z, double t ) {
        int i;
        int ix, iy, iz, it;
        float fx, fy, fz, ft;
diff --git a/MP/code/rend2/tr_scene.c b/MP/code/rend2/tr_scene.c
index cffe6c9..8a81480 100644
--- a/MP/code/rend2/tr_scene.c
+++ b/MP/code/rend2/tr_scene.c
@@ -516,7 +516,7 @@ void RE_BeginScene(const refdef_t *fd)
 
        // derived info
 
-       tr.refdef.floatTime = tr.refdef.time * 0.001f;
+       tr.refdef.floatTime = tr.refdef.time * 0.001;
 
        tr.refdef.numDrawSurfs = r_firstSceneDrawSurf;
        tr.refdef.drawSurfs = backEndData->drawSurfs;
diff --git a/MP/code/rend2/tr_shade.c b/MP/code/rend2/tr_shade.c
index 424297e..83b9fbf 100644
--- a/MP/code/rend2/tr_shade.c
+++ b/MP/code/rend2/tr_shade.c
@@ -71,7 +71,7 @@ R_BindAnimatedImageToTMU
 =================
 */
 static void R_BindAnimatedImageToTMU( textureBundle_t *bundle, int tmu ) {
-       int             index;
+       int64_t index;
 
        if ( bundle->isVideoMap ) {
                ri.CIN_RunCinematic(bundle->videoMapHandle);
@@ -91,7 +91,7 @@ static void R_BindAnimatedImageToTMU( textureBundle_t 
*bundle, int tmu ) {
 
        // it is necessary to do this messy calc to make sure animations line up
        // exactly with waveforms of the same frequency
-       index = ri.ftol(tess.shaderTime * bundle->imageAnimationSpeed * 
FUNCTABLE_SIZE);
+       index = tess.shaderTime * bundle->imageAnimationSpeed * FUNCTABLE_SIZE;
        index >>= FUNCTABLE_SIZE2;
 
        if ( index < 0 ) {
diff --git a/MP/code/rend2/tr_shade_calc.c b/MP/code/rend2/tr_shade_calc.c
index cc1ed17..e99ccc5 100644
--- a/MP/code/rend2/tr_shade_calc.c
+++ b/MP/code/rend2/tr_shade_calc.c
@@ -30,7 +30,7 @@ If you have questions concerning this license or the 
applicable additional terms
 
 #include "tr_local.h"
 
-#define        WAVEVALUE( table, base, amplitude, phase, freq )  ((base) + 
table[ ri.ftol( ( ( (phase) + tess.shaderTime * (freq) ) * FUNCTABLE_SIZE ) ) & 
FUNCTABLE_MASK ] * (amplitude))
+#define        WAVEVALUE( table, base, amplitude, phase, freq )  ( ( base ) + 
table[ ( ( int64_t ) ( ( ( phase ) + tess.shaderTime * ( freq ) ) * 
FUNCTABLE_SIZE ) ) & FUNCTABLE_MASK ] * ( amplitude ) )
 
 static float *TableForFunc( genFunc_t func ) {
        switch ( func )
@@ -259,12 +259,12 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) {
        const float     *st = ( const float * ) tess.texCoords[0];
        float           *xyz = ( float * ) tess.xyz;
        int16_t *normal = tess.normal[0];
-       float now;
+       double now;
 
-       now = backEnd.refdef.time * ds->bulgeSpeed * 0.001f;
+       now = backEnd.refdef.time * 0.001 * ds->bulgeSpeed;
 
        for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 2, normal += 4 
) {
-               int off;
+               int64_t off;
                float scale;
                vec3_t fNormal;
 
@@ -876,8 +876,8 @@ void RB_CalcScaleTexMatrix( const float scale[2], float 
*matrix )
 */
 void RB_CalcScrollTexMatrix( const float scrollSpeed[2], float *matrix )
 {
-       float timeScale = tess.shaderTime;
-       float adjustedScrollS, adjustedScrollT;
+       double timeScale = tess.shaderTime;
+       double adjustedScrollS, adjustedScrollT;
 
        adjustedScrollS = scrollSpeed[0] * timeScale;
        adjustedScrollT = scrollSpeed[1] * timeScale;
@@ -905,9 +905,9 @@ void RB_CalcTransformTexMatrix( const texModInfo_t *tmi, 
float *matrix  )
 */
 void RB_CalcRotateTexMatrix( float degsPerSecond, float *matrix )
 {
-       float timeScale = tess.shaderTime;
-       float degs;
-       int index;
+       double timeScale = tess.shaderTime;
+       double degs;
+       int64_t index;
        float sinValue, cosValue;
 
        degs = -degsPerSecond * timeScale;
diff --git a/MP/code/renderer/tr_backend.c b/MP/code/renderer/tr_backend.c
index 235de69..1d9f76e 100644
--- a/MP/code/renderer/tr_backend.c
+++ b/MP/code/renderer/tr_backend.c
@@ -568,7 +568,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
        int i;
        drawSurf_t      *drawSurf;
        int oldSort;
-       float originalTime;
+       double originalTime;
 
        // save original time for entity shader offsets
        originalTime = backEnd.refdef.floatTime;
@@ -621,7 +621,9 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
 
                        if ( entityNum != REFENTITYNUM_WORLD ) {
                                backEnd.currentEntity = 
&backEnd.refdef.entities[entityNum];
-                               backEnd.refdef.floatTime = originalTime; // - 
backEnd.currentEntity->e.shaderTime; // JPW NERVE pulled this to match q3ta
+
+                               // FIXME: e.shaderTime must be passed as int to 
avoid fp-precision loss issues
+                               backEnd.refdef.floatTime = originalTime; // - 
(double)backEnd.currentEntity->e.shaderTime; // JPW NERVE pulled this to match 
q3ta
 
                                // we have to reset the shaderTime as well 
otherwise image animations start
                                // from the wrong frame
@@ -777,7 +779,7 @@ void    RB_SetGL2D( void ) {
 
        // set time for 2D shaders
        backEnd.refdef.time = ri.Milliseconds();
-       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001f;
+       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001;
 }
 
 
diff --git a/MP/code/renderer/tr_local.h b/MP/code/renderer/tr_local.h
index b03b80a..9f39dad 100644
--- a/MP/code/renderer/tr_local.h
+++ b/MP/code/renderer/tr_local.h
@@ -425,8 +425,8 @@ typedef struct shader_s {
 
        void ( *optimalStageIteratorFunc )( void );
 
-       float clampTime;                                    // time this shader 
is clamped to
-       float timeOffset;                                   // current time 
offset for this shader
+       double clampTime;                                    // time this 
shader is clamped to
+       double timeOffset;                                   // current time 
offset for this shader
 
        struct shader_s *remappedShader;                    // current shader 
this one is remapped too
 
@@ -477,7 +477,7 @@ typedef struct {
        byte areamask[MAX_MAP_AREA_BYTES];
        qboolean areamaskModified;      // qtrue if areamask changed since last 
scene
 
-       float floatTime;                // tr.refdef.time / 1000.0
+       double floatTime;                // tr.refdef.time / 1000.0
 
        // text messages for deform text shaders
        char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH];
@@ -1269,7 +1269,7 @@ extern cvar_t   *r_wolffog;
 extern cvar_t  *r_highQualityVideo;
 //====================================================================
 
-float R_NoiseGet4f( float x, float y, float z, float t );
+float R_NoiseGet4f( float x, float y, float z, double t );
 void  R_NoiseInit( void );
 
 void R_SwapBuffers( int );
@@ -1463,7 +1463,7 @@ typedef struct shaderCommands_s
        color4ub_t      constantColor255[SHADER_MAX_VERTEXES] QALIGN(16);
 
        shader_t    *shader;
-       float shaderTime;
+       double shaderTime;
        int fogNum;
 
        int dlightBits;         // or together of all vertexDlightBits
diff --git a/MP/code/renderer/tr_noise.c b/MP/code/renderer/tr_noise.c
index cd49009..bb91a1f 100644
--- a/MP/code/renderer/tr_noise.c
+++ b/MP/code/renderer/tr_noise.c
@@ -54,7 +54,7 @@ void R_NoiseInit( void ) {
        }
 }
 
-float R_NoiseGet4f( float x, float y, float z, float t ) {
+float R_NoiseGet4f( float x, float y, float z, double t ) {
        int i;
        int ix, iy, iz, it;
        float fx, fy, fz, ft;
diff --git a/MP/code/renderer/tr_scene.c b/MP/code/renderer/tr_scene.c
index ce5dba2..6de3124 100644
--- a/MP/code/renderer/tr_scene.c
+++ b/MP/code/renderer/tr_scene.c
@@ -461,7 +461,7 @@ void RE_RenderScene( const refdef_t *fd ) {
 
        // derived info
 
-       tr.refdef.floatTime = tr.refdef.time * 0.001f;
+       tr.refdef.floatTime = tr.refdef.time * 0.001;
 
        tr.refdef.numDrawSurfs = r_firstSceneDrawSurf;
        tr.refdef.drawSurfs = backEndData->drawSurfs;
diff --git a/MP/code/renderer/tr_shade.c b/MP/code/renderer/tr_shade.c
index 0aa2890..f91a711 100644
--- a/MP/code/renderer/tr_shade.c
+++ b/MP/code/renderer/tr_shade.c
@@ -243,7 +243,7 @@ R_BindAnimatedImage
 =================
 */
 static void R_BindAnimatedImage( textureBundle_t *bundle ) {
-       int index;
+       int64_t index;
 
        if ( bundle->isVideoMap ) {
                ri.CIN_RunCinematic( bundle->videoMapHandle );
@@ -262,7 +262,7 @@ static void R_BindAnimatedImage( textureBundle_t *bundle ) {
 
        // it is necessary to do this messy calc to make sure animations line up
        // exactly with waveforms of the same frequency
-       index = ri.ftol( tess.shaderTime * bundle->imageAnimationSpeed * 
FUNCTABLE_SIZE );
+       index = tess.shaderTime * bundle->imageAnimationSpeed * FUNCTABLE_SIZE;
        index >>= FUNCTABLE_SIZE2;
 
        if ( index < 0 ) {
diff --git a/MP/code/renderer/tr_shade_calc.c b/MP/code/renderer/tr_shade_calc.c
index ef4a710..38eb38e 100644
--- a/MP/code/renderer/tr_shade_calc.c
+++ b/MP/code/renderer/tr_shade_calc.c
@@ -34,7 +34,7 @@ If you have questions concerning this license or the 
applicable additional terms
 #endif
 
 
-#define        WAVEVALUE( table, base, amplitude, phase, freq )  ((base) + 
table[ ri.ftol( ( ( (phase) + tess.shaderTime * (freq) ) * FUNCTABLE_SIZE ) ) & 
FUNCTABLE_MASK ] * (amplitude))
+#define        WAVEVALUE( table, base, amplitude, phase, freq )  ( ( base ) + 
table[ ( ( int64_t ) ( ( ( phase ) + tess.shaderTime * ( freq ) ) * 
FUNCTABLE_SIZE ) ) & FUNCTABLE_MASK ] * ( amplitude ) )
 
 static float *TableForFunc( genFunc_t func ) {
        switch ( func )
@@ -257,12 +257,12 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) {
        const float *st = ( const float * ) tess.texCoords[0];
        float       *xyz = ( float * ) tess.xyz;
        float       *normal = ( float * ) tess.normal;
-       float now;
+       double now;
 
-       now = backEnd.refdef.time * ds->bulgeSpeed * 0.001f;
+       now = backEnd.refdef.time * 0.001 * ds->bulgeSpeed;
 
        for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 4, normal += 4 
) {
-               int off;
+               int64_t off;
                float scale;
 
                off = (float)( FUNCTABLE_SIZE / ( M_PI * 2 ) ) * ( st[0] * 
ds->bulgeWidth + now );
@@ -1011,7 +1011,7 @@ void RB_CalcSwapTexCoords( float *st ) {
 */
 void RB_CalcTurbulentTexCoords( const waveForm_t *wf, float *st ) {
        int i;
-       float now;
+       double now;
 
        now = ( wf->phase + tess.shaderTime * wf->frequency );
 
@@ -1020,8 +1020,8 @@ void RB_CalcTurbulentTexCoords( const waveForm_t *wf, 
float *st ) {
                float s = st[0];
                float t = st[1];
 
-               st[0] = s + tr.sinTable[ ( ( int ) ( ( ( tess.xyz[i][0] + 
tess.xyz[i][2] ) * 1.0 / 128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( 
FUNCTABLE_MASK ) ] * wf->amplitude;
-               st[1] = t + tr.sinTable[ ( ( int ) ( ( tess.xyz[i][1] * 1.0 / 
128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( FUNCTABLE_MASK ) ] * wf->amplitude;
+               st[0] = s + tr.sinTable[ ( ( int64_t ) ( ( ( tess.xyz[i][0] + 
tess.xyz[i][2] )* 1.0/128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( 
FUNCTABLE_MASK ) ] * wf->amplitude;
+               st[1] = t + tr.sinTable[ ( ( int64_t ) ( ( tess.xyz[i][1] * 
1.0/128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( FUNCTABLE_MASK ) ] * 
wf->amplitude;
        }
 }
 
@@ -1043,8 +1043,8 @@ void RB_CalcScaleTexCoords( const float scale[2], float 
*st ) {
 */
 void RB_CalcScrollTexCoords( const float scrollSpeed[2], float *st ) {
        int i;
-       float timeScale = tess.shaderTime;
-       float adjustedScrollS, adjustedScrollT;
+       double timeScale = tess.shaderTime;
+       double adjustedScrollS, adjustedScrollT;
 
        adjustedScrollS = scrollSpeed[0] * timeScale;
        adjustedScrollT = scrollSpeed[1] * timeScale;
@@ -1081,9 +1081,9 @@ void RB_CalcTransformTexCoords( const texModInfo_t *tmi, 
float *st  ) {
 ** RB_CalcRotateTexCoords
 */
 void RB_CalcRotateTexCoords( float degsPerSecond, float *st ) {
-       float timeScale = tess.shaderTime;
-       float degs;
-       int index;
+       double timeScale = tess.shaderTime;
+       double degs;
+       int64_t index;
        float sinValue, cosValue;
        texModInfo_t tmi;
 
diff --git a/SP/code/rend2/tr_backend.c b/SP/code/rend2/tr_backend.c
index 103052e..2ad2b56 100644
--- a/SP/code/rend2/tr_backend.c
+++ b/SP/code/rend2/tr_backend.c
@@ -810,7 +810,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
        int i;
        drawSurf_t      *drawSurf;
        int oldSort;
-       float originalTime;
+       double originalTime;
        FBO_t*                  fbo = NULL;
        qboolean                inQuery = qfalse;
 
@@ -902,7 +902,9 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
 
                        if ( entityNum != REFENTITYNUM_WORLD ) {
                                backEnd.currentEntity = 
&backEnd.refdef.entities[entityNum];
-                               backEnd.refdef.floatTime = originalTime - 
backEnd.currentEntity->e.shaderTime;
+
+                               // FIXME: e.shaderTime must be passed as int to 
avoid fp-precision loss issues
+                               backEnd.refdef.floatTime = originalTime - 
(double)backEnd.currentEntity->e.shaderTime;
 
                                // we have to reset the shaderTime as well 
otherwise image animations start
                                // from the wrong frame
@@ -1085,7 +1087,7 @@ void    RB_SetGL2D( void ) {
 
        // set time for 2D shaders
        backEnd.refdef.time = ri.Milliseconds();
-       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001f;
+       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001;
 }
 
 
diff --git a/SP/code/rend2/tr_local.h b/SP/code/rend2/tr_local.h
index 48f9ae1..885e3ca 100644
--- a/SP/code/rend2/tr_local.h
+++ b/SP/code/rend2/tr_local.h
@@ -521,37 +521,14 @@ typedef struct shader_s {
 
        void ( *optimalStageIteratorFunc )( void );
 
-       float clampTime;                                    // time this shader 
is clamped to
-       float timeOffset;                                   // current time 
offset for this shader
+       double clampTime;                                    // time this 
shader is clamped to
+       double timeOffset;                                   // current time 
offset for this shader
 
        struct shader_s *remappedShader;                    // current shader 
this one is remapped too
 
        struct shader_s *next;
 } shader_t;
 
-static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
-{
-       if(shader->numDeforms)
-       {
-               const deformStage_t *ds = &shader->deforms[0];
-
-               if (shader->numDeforms > 1)
-                       return qtrue;
-
-               switch (ds->deformation)
-               {
-                       case DEFORM_WAVE:
-                       case DEFORM_BULGE:
-                               return qfalse;
-
-                       default:
-                               return qtrue;
-               }
-       }
-
-       return qfalse;
-}
-
 typedef struct cubemap_s {
        char name[MAX_QPATH];
        vec3_t origin;
@@ -827,7 +804,7 @@ typedef struct {
        byte areamask[MAX_MAP_AREA_BYTES];
        qboolean areamaskModified;      // qtrue if areamask changed since last 
scene
 
-       float floatTime;                // tr.refdef.time / 1000.0
+       double floatTime;                // tr.refdef.time / 1000.0
 
        float           blurFactor;
 
@@ -2017,9 +1994,35 @@ extern cvar_t   *r_wolffog;
 extern cvar_t  *r_highQualityVideo;
 //====================================================================
 
-float R_NoiseGet4f( float x, float y, float z, float t );
+float R_NoiseGet4f( float x, float y, float z, double t );
 void  R_NoiseInit( void );
 
+static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
+{
+       if(shader->numDeforms)
+       {
+               const deformStage_t *ds = &shader->deforms[0];
+
+               if (shader->numDeforms > 1)
+                       return qtrue;
+
+               switch (ds->deformation)
+               {
+                       case DEFORM_WAVE:
+                       case DEFORM_BULGE:
+                               // need CPU deforms at high level-times to 
avoid floating point percision loss
+                               return ( backEnd.refdef.floatTime != 
(float)backEnd.refdef.floatTime );
+
+                       default:
+                               return qtrue;
+               }
+       }
+
+       return qfalse;
+}
+
+//====================================================================
+
 void R_SwapBuffers( int );
 
 void R_RenderView( viewParms_t *parms );
@@ -2242,7 +2245,7 @@ typedef struct shaderCommands_s
        //color4ub_t    constantColor255[SHADER_MAX_VERTEXES] QALIGN(16);
 
        shader_t    *shader;
-       float shaderTime;
+       double shaderTime;
        int fogNum;
        int         cubemapIndex;
 
diff --git a/SP/code/rend2/tr_noise.c b/SP/code/rend2/tr_noise.c
index c218b97..da590fb 100644
--- a/SP/code/rend2/tr_noise.c
+++ b/SP/code/rend2/tr_noise.c
@@ -56,7 +56,7 @@ void R_NoiseInit( void ) {
        }
 }
 
-float R_NoiseGet4f( float x, float y, float z, float t ) {
+float R_NoiseGet4f( float x, float y, float z, double t ) {
        int i;
        int ix, iy, iz, it;
        float fx, fy, fz, ft;
diff --git a/SP/code/rend2/tr_scene.c b/SP/code/rend2/tr_scene.c
index 7c50dcb..c73de51 100644
--- a/SP/code/rend2/tr_scene.c
+++ b/SP/code/rend2/tr_scene.c
@@ -529,7 +529,7 @@ void RE_BeginScene(const refdef_t *fd)
 
        // derived info
 
-       tr.refdef.floatTime = tr.refdef.time * 0.001f;
+       tr.refdef.floatTime = tr.refdef.time * 0.001;
 
        tr.refdef.numDrawSurfs = r_firstSceneDrawSurf;
        tr.refdef.drawSurfs = backEndData->drawSurfs;
diff --git a/SP/code/rend2/tr_shade.c b/SP/code/rend2/tr_shade.c
index de5ff28..70dd53c 100644
--- a/SP/code/rend2/tr_shade.c
+++ b/SP/code/rend2/tr_shade.c
@@ -64,7 +64,7 @@ R_BindAnimatedImageToTMU
 =================
 */
 static void R_BindAnimatedImageToTMU( textureBundle_t *bundle, int tmu ) {
-       int             index;
+       int64_t index;
 
        if ( bundle->isVideoMap ) {
                ri.CIN_RunCinematic(bundle->videoMapHandle);
@@ -84,7 +84,7 @@ static void R_BindAnimatedImageToTMU( textureBundle_t 
*bundle, int tmu ) {
 
        // it is necessary to do this messy calc to make sure animations line up
        // exactly with waveforms of the same frequency
-       index = ri.ftol(tess.shaderTime * bundle->imageAnimationSpeed * 
FUNCTABLE_SIZE);
+       index = tess.shaderTime * bundle->imageAnimationSpeed * FUNCTABLE_SIZE;
        index >>= FUNCTABLE_SIZE2;
 
        if ( index < 0 ) {
diff --git a/SP/code/rend2/tr_shade_calc.c b/SP/code/rend2/tr_shade_calc.c
index a946dbd..d77219a 100644
--- a/SP/code/rend2/tr_shade_calc.c
+++ b/SP/code/rend2/tr_shade_calc.c
@@ -30,7 +30,7 @@ If you have questions concerning this license or the 
applicable additional terms
 
 #include "tr_local.h"
 
-#define        WAVEVALUE( table, base, amplitude, phase, freq )  ((base) + 
table[ ri.ftol( ( ( (phase) + tess.shaderTime * (freq) ) * FUNCTABLE_SIZE ) ) & 
FUNCTABLE_MASK ] * (amplitude))
+#define        WAVEVALUE( table, base, amplitude, phase, freq )  ( ( base ) + 
table[ ( ( int64_t ) ( ( ( phase ) + tess.shaderTime * ( freq ) ) * 
FUNCTABLE_SIZE ) ) & FUNCTABLE_MASK ] * ( amplitude ) )
 
 static float *TableForFunc( genFunc_t func ) {
        switch ( func )
@@ -259,12 +259,12 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) {
        const float     *st = ( const float * ) tess.texCoords[0];
        float           *xyz = ( float * ) tess.xyz;
        int16_t *normal = tess.normal[0];
-       float now;
+       double now;
 
-       now = backEnd.refdef.time * ds->bulgeSpeed * 0.001f;
+       now = backEnd.refdef.time * 0.001 * ds->bulgeSpeed;
 
        for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 2, normal += 4 
) {
-               int off;
+               int64_t off;
                float scale;
                vec3_t fNormal;
 
@@ -877,8 +877,8 @@ void RB_CalcScaleTexMatrix( const float scale[2], float 
*matrix )
 */
 void RB_CalcScrollTexMatrix( const float scrollSpeed[2], float *matrix )
 {
-       float timeScale = tess.shaderTime;
-       float adjustedScrollS, adjustedScrollT;
+       double timeScale = tess.shaderTime;
+       double adjustedScrollS, adjustedScrollT;
 
        adjustedScrollS = scrollSpeed[0] * timeScale;
        adjustedScrollT = scrollSpeed[1] * timeScale;
@@ -906,9 +906,9 @@ void RB_CalcTransformTexMatrix( const texModInfo_t *tmi, 
float *matrix  )
 */
 void RB_CalcRotateTexMatrix( float degsPerSecond, float *matrix )
 {
-       float timeScale = tess.shaderTime;
-       float degs;
-       int index;
+       double timeScale = tess.shaderTime;
+       double degs;
+       int64_t index;
        float sinValue, cosValue;
 
        degs = -degsPerSecond * timeScale;
diff --git a/SP/code/renderer/tr_backend.c b/SP/code/renderer/tr_backend.c
index 50d6281..cf92360 100644
--- a/SP/code/renderer/tr_backend.c
+++ b/SP/code/renderer/tr_backend.c
@@ -870,7 +870,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
        int i;
        drawSurf_t      *drawSurf;
        int oldSort;
-       float originalTime;
+       double originalTime;
        int oldNumVerts, oldNumIndex;
 //GR - tessellation flag
        int atiTess = 0, oldAtiTess;
@@ -948,7 +948,9 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int 
numDrawSurfs ) {
 
                        if ( entityNum != REFENTITYNUM_WORLD ) {
                                backEnd.currentEntity = 
&backEnd.refdef.entities[entityNum];
-                               backEnd.refdef.floatTime = originalTime - 
backEnd.currentEntity->e.shaderTime;
+
+                               // FIXME: e.shaderTime must be passed as int to 
avoid fp-precision loss issues
+                               backEnd.refdef.floatTime = originalTime - 
(double)backEnd.currentEntity->e.shaderTime;
 
                                // we have to reset the shaderTime as well 
otherwise image animations start
                                // from the wrong frame
@@ -1121,7 +1123,7 @@ void    RB_SetGL2D( void ) {
 
        // set time for 2D shaders
        backEnd.refdef.time = ri.Milliseconds();
-       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001f;
+       backEnd.refdef.floatTime = backEnd.refdef.time * 0.001;
 }
 
 
diff --git a/SP/code/renderer/tr_local.h b/SP/code/renderer/tr_local.h
index 7f83c54..df9266e 100644
--- a/SP/code/renderer/tr_local.h
+++ b/SP/code/renderer/tr_local.h
@@ -428,8 +428,8 @@ typedef struct shader_s {
 
        void ( *optimalStageIteratorFunc )( void );
 
-       float clampTime;                                    // time this shader 
is clamped to
-       float timeOffset;                                   // current time 
offset for this shader
+       double clampTime;                                    // time this 
shader is clamped to
+       double timeOffset;                                   // current time 
offset for this shader
 
        struct shader_s *remappedShader;                    // current shader 
this one is remapped too
 
@@ -481,7 +481,7 @@ typedef struct {
        byte areamask[MAX_MAP_AREA_BYTES];
        qboolean areamaskModified;      // qtrue if areamask changed since last 
scene
 
-       float floatTime;                // tr.refdef.time / 1000.0
+       double floatTime;                // tr.refdef.time / 1000.0
 
        // text messages for deform text shaders
        char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH];
@@ -1289,7 +1289,7 @@ extern cvar_t   *r_wolffog;
 extern cvar_t  *r_highQualityVideo;
 //====================================================================
 
-float R_NoiseGet4f( float x, float y, float z, float t );
+float R_NoiseGet4f( float x, float y, float z, double t );
 void  R_NoiseInit( void );
 
 void R_SwapBuffers( int );
@@ -1489,7 +1489,7 @@ typedef struct shaderCommands_s
        color4ub_t      constantColor255[SHADER_MAX_VERTEXES] QALIGN(16);
 
        shader_t    *shader;
-       float shaderTime;
+       double shaderTime;
        int fogNum;
 
        int dlightBits;         // or together of all vertexDlightBits
diff --git a/SP/code/renderer/tr_noise.c b/SP/code/renderer/tr_noise.c
index b33672a..227f1f4 100644
--- a/SP/code/renderer/tr_noise.c
+++ b/SP/code/renderer/tr_noise.c
@@ -54,7 +54,7 @@ void R_NoiseInit( void ) {
        }
 }
 
-float R_NoiseGet4f( float x, float y, float z, float t ) {
+float R_NoiseGet4f( float x, float y, float z, double t ) {
        int i;
        int ix, iy, iz, it;
        float fx, fy, fz, ft;
diff --git a/SP/code/renderer/tr_scene.c b/SP/code/renderer/tr_scene.c
index 78b511a..43af1d3 100644
--- a/SP/code/renderer/tr_scene.c
+++ b/SP/code/renderer/tr_scene.c
@@ -474,7 +474,7 @@ void RE_RenderScene( const refdef_t *fd ) {
 
        // derived info
 
-       tr.refdef.floatTime = tr.refdef.time * 0.001f;
+       tr.refdef.floatTime = tr.refdef.time * 0.001;
 
        tr.refdef.numDrawSurfs = r_firstSceneDrawSurf;
        tr.refdef.drawSurfs = backEndData->drawSurfs;
diff --git a/SP/code/renderer/tr_shade.c b/SP/code/renderer/tr_shade.c
index ba76811..e31834e 100644
--- a/SP/code/renderer/tr_shade.c
+++ b/SP/code/renderer/tr_shade.c
@@ -241,7 +241,7 @@ R_BindAnimatedImage
 =================
 */
 static void R_BindAnimatedImage( textureBundle_t *bundle ) {
-       int index;
+       int64_t index;
 
        if ( bundle->isVideoMap ) {
                ri.CIN_RunCinematic( bundle->videoMapHandle );
@@ -260,7 +260,7 @@ static void R_BindAnimatedImage( textureBundle_t *bundle ) {
 
        // it is necessary to do this messy calc to make sure animations line up
        // exactly with waveforms of the same frequency
-       index = ri.ftol( tess.shaderTime * bundle->imageAnimationSpeed * 
FUNCTABLE_SIZE );
+       index = tess.shaderTime * bundle->imageAnimationSpeed * FUNCTABLE_SIZE;
        index >>= FUNCTABLE_SIZE2;
 
        if ( index < 0 ) {
diff --git a/SP/code/renderer/tr_shade_calc.c b/SP/code/renderer/tr_shade_calc.c
index e3c36c2..66388bd 100644
--- a/SP/code/renderer/tr_shade_calc.c
+++ b/SP/code/renderer/tr_shade_calc.c
@@ -34,7 +34,7 @@ If you have questions concerning this license or the 
applicable additional terms
 #endif
 
 
-#define        WAVEVALUE( table, base, amplitude, phase, freq )  ((base) + 
table[ ri.ftol( ( ( (phase) + tess.shaderTime * (freq) ) * FUNCTABLE_SIZE ) ) & 
FUNCTABLE_MASK ] * (amplitude))
+#define        WAVEVALUE( table, base, amplitude, phase, freq )  ( ( base ) + 
table[ ( ( int64_t ) ( ( ( phase ) + tess.shaderTime * ( freq ) ) * 
FUNCTABLE_SIZE ) ) & FUNCTABLE_MASK ] * ( amplitude ) )
 
 static float *TableForFunc( genFunc_t func ) {
        switch ( func )
@@ -257,12 +257,12 @@ void RB_CalcBulgeVertexes( deformStage_t *ds ) {
        const float *st = ( const float * ) tess.texCoords[0];
        float       *xyz = ( float * ) tess.xyz;
        float       *normal = ( float * ) tess.normal;
-       float now;
+       double now;
 
-       now = backEnd.refdef.time * ds->bulgeSpeed * 0.001f;
+       now = backEnd.refdef.time * 0.001 * ds->bulgeSpeed;
 
        for ( i = 0; i < tess.numVertexes; i++, xyz += 4, st += 4, normal += 4 
) {
-               int off;
+               int64_t off;
                float scale;
 
                off = (float)( FUNCTABLE_SIZE / ( M_PI * 2 ) ) * ( st[0] * 
ds->bulgeWidth + now );
@@ -1011,7 +1011,7 @@ void RB_CalcSwapTexCoords( float *st ) {
 */
 void RB_CalcTurbulentTexCoords( const waveForm_t *wf, float *st ) {
        int i;
-       float now;
+       double now;
 
        now = ( wf->phase + tess.shaderTime * wf->frequency );
 
@@ -1020,8 +1020,8 @@ void RB_CalcTurbulentTexCoords( const waveForm_t *wf, 
float *st ) {
                float s = st[0];
                float t = st[1];
 
-               st[0] = s + tr.sinTable[ ( ( int ) ( ( ( tess.xyz[i][0] + 
tess.xyz[i][2] ) * 1.0 / 128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( 
FUNCTABLE_MASK ) ] * wf->amplitude;
-               st[1] = t + tr.sinTable[ ( ( int ) ( ( tess.xyz[i][1] * 1.0 / 
128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( FUNCTABLE_MASK ) ] * wf->amplitude;
+               st[0] = s + tr.sinTable[ ( ( int64_t ) ( ( ( tess.xyz[i][0] + 
tess.xyz[i][2] )* 1.0/128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( 
FUNCTABLE_MASK ) ] * wf->amplitude;
+               st[1] = t + tr.sinTable[ ( ( int64_t ) ( ( tess.xyz[i][1] * 
1.0/128 * 0.125 + now ) * FUNCTABLE_SIZE ) ) & ( FUNCTABLE_MASK ) ] * 
wf->amplitude;
        }
 }
 
@@ -1043,8 +1043,8 @@ void RB_CalcScaleTexCoords( const float scale[2], float 
*st ) {
 */
 void RB_CalcScrollTexCoords( const float scrollSpeed[2], float *st ) {
        int i;
-       float timeScale = tess.shaderTime;
-       float adjustedScrollS, adjustedScrollT;
+       double timeScale = tess.shaderTime;
+       double adjustedScrollS, adjustedScrollT;
 
        adjustedScrollS = scrollSpeed[0] * timeScale;
        adjustedScrollT = scrollSpeed[1] * timeScale;
@@ -1081,9 +1081,9 @@ void RB_CalcTransformTexCoords( const texModInfo_t *tmi, 
float *st  ) {
 ** RB_CalcRotateTexCoords
 */
 void RB_CalcRotateTexCoords( float degsPerSecond, float *st ) {
-       float timeScale = tess.shaderTime;
-       float degs;
-       int index;
+       double timeScale = tess.shaderTime;
+       double degs;
+       int64_t index;
        float sinValue, cosValue;
        texModInfo_t tmi;
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-games/iortcw.git

_______________________________________________
Pkg-games-commits mailing list
Pkg-games-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

Reply via email to