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; } } }
void GL_SetModelviewMatrix(matrix_t matrix) { Matrix16Copy(matrix, glState.modelview); Matrix16Multiply(glState.projection, glState.modelview, glState.modelviewProjection); }