static void ComputeTexMatrix( shaderStage_t *pStage, int bundleNum, float *outmatrix) { int tm; float matrix[16], currentmatrix[16]; textureBundle_t *bundle = &pStage->bundle[bundleNum]; Matrix16Identity(outmatrix); Matrix16Identity(currentmatrix); for ( tm = 0; tm < bundle->numTexMods ; tm++ ) { switch ( bundle->texMods[tm].type ) { case TMOD_NONE: tm = TR_MAX_TEXMODS; // break out of for loop break; case TMOD_TURBULENT: RB_CalcTurbulentTexMatrix( &bundle->texMods[tm].wave, matrix ); outmatrix[12] = matrix[12]; outmatrix[13] = matrix[13]; Matrix16Copy(outmatrix, currentmatrix); break; case TMOD_ENTITY_TRANSLATE: RB_CalcScrollTexMatrix( backEnd.currentEntity->e.shaderTexCoord, matrix ); Matrix16Multiply(matrix, currentmatrix, outmatrix); Matrix16Copy(outmatrix, currentmatrix); break; case TMOD_SCROLL: RB_CalcScrollTexMatrix( bundle->texMods[tm].scroll, matrix ); Matrix16Multiply(matrix, currentmatrix, outmatrix); Matrix16Copy(outmatrix, currentmatrix); break; case TMOD_SCALE: RB_CalcScaleTexMatrix( bundle->texMods[tm].scale, matrix ); Matrix16Multiply(matrix, currentmatrix, outmatrix); Matrix16Copy(outmatrix, currentmatrix); break; case TMOD_STRETCH: RB_CalcStretchTexMatrix( &bundle->texMods[tm].wave, matrix ); Matrix16Multiply(matrix, currentmatrix, outmatrix); Matrix16Copy(outmatrix, currentmatrix); break; case TMOD_TRANSFORM: RB_CalcTransformTexMatrix( &bundle->texMods[tm], matrix ); Matrix16Multiply(matrix, currentmatrix, outmatrix); Matrix16Copy(outmatrix, currentmatrix); break; case TMOD_ROTATE: RB_CalcRotateTexMatrix( bundle->texMods[tm].rotateSpeed, matrix ); Matrix16Multiply(matrix, currentmatrix, outmatrix); Matrix16Copy(outmatrix, currentmatrix); break; default: ri.Error( ERR_DROP, "ERROR: unknown texmod '%d' in shader '%s'", bundle->texMods[tm].type, tess.shader->name ); break; } } }
static void ComputeTexMods( shaderStage_t *pStage, int bundleNum, float *outMatrix, float *outOffTurb) { int tm; float matrix[6], currentmatrix[6]; textureBundle_t *bundle = &pStage->bundle[bundleNum]; matrix[0] = 1.0f; matrix[2] = 0.0f; matrix[4] = 0.0f; matrix[1] = 0.0f; matrix[3] = 1.0f; matrix[5] = 0.0f; currentmatrix[0] = 1.0f; currentmatrix[2] = 0.0f; currentmatrix[4] = 0.0f; currentmatrix[1] = 0.0f; currentmatrix[3] = 1.0f; currentmatrix[5] = 0.0f; outMatrix[0] = 1.0f; outMatrix[2] = 0.0f; outMatrix[1] = 0.0f; outMatrix[3] = 1.0f; outOffTurb[0] = 0.0f; outOffTurb[1] = 0.0f; outOffTurb[2] = 0.0f; outOffTurb[3] = 0.0f; for ( tm = 0; tm < bundle->numTexMods ; tm++ ) { switch ( bundle->texMods[tm].type ) { case TMOD_NONE: tm = TR_MAX_TEXMODS; // break out of for loop break; case TMOD_TURBULENT: RB_CalcTurbulentFactors(&bundle->texMods[tm].wave, &outOffTurb[2], &outOffTurb[3]); break; case TMOD_ENTITY_TRANSLATE: RB_CalcScrollTexMatrix( backEnd.currentEntity->e.shaderTexCoord, matrix ); break; case TMOD_SCROLL: RB_CalcScrollTexMatrix( bundle->texMods[tm].scroll, matrix ); break; case TMOD_SCALE: RB_CalcScaleTexMatrix( bundle->texMods[tm].scale, matrix ); break; case TMOD_STRETCH: RB_CalcStretchTexMatrix( &bundle->texMods[tm].wave, matrix ); break; case TMOD_TRANSFORM: RB_CalcTransformTexMatrix( &bundle->texMods[tm], matrix ); break; case TMOD_ROTATE: RB_CalcRotateTexMatrix( bundle->texMods[tm].rotateSpeed, matrix ); break; default: ri.Error( ERR_DROP, "ERROR: unknown texmod '%d' in shader '%s'", bundle->texMods[tm].type, tess.shader->name ); break; } switch ( bundle->texMods[tm].type ) { case TMOD_NONE: case TMOD_TURBULENT: default: break; case TMOD_ENTITY_TRANSLATE: case TMOD_SCROLL: case TMOD_SCALE: case TMOD_STRETCH: case TMOD_TRANSFORM: case TMOD_ROTATE: outMatrix[0] = matrix[0] * currentmatrix[0] + matrix[2] * currentmatrix[1]; outMatrix[1] = matrix[1] * currentmatrix[0] + matrix[3] * currentmatrix[1]; outMatrix[2] = matrix[0] * currentmatrix[2] + matrix[2] * currentmatrix[3]; outMatrix[3] = matrix[1] * currentmatrix[2] + matrix[3] * currentmatrix[3]; outOffTurb[0] = matrix[0] * currentmatrix[4] + matrix[2] * currentmatrix[5] + matrix[4]; outOffTurb[1] = matrix[1] * currentmatrix[4] + matrix[3] * currentmatrix[5] + matrix[5]; currentmatrix[0] = outMatrix[0]; currentmatrix[1] = outMatrix[1]; currentmatrix[2] = outMatrix[2]; currentmatrix[3] = outMatrix[3]; currentmatrix[4] = outOffTurb[0]; currentmatrix[5] = outOffTurb[1]; break; } } }