int COGLColorCombiner4::SaveParsedResult(OGLExtCombinerSaveType &result) { result.dwMux0 = m_pDecodedMux->m_dwMux0; result.dwMux1 = m_pDecodedMux->m_dwMux1; for( int n=0; n<result.numOfUnits; n++ ) { for( int i=0; i<3; i++ ) { result.units[n].glRGBArgs[i] = 0; result.units[n].glRGBFlags[i] = 0; result.units[n].glAlphaArgs[i] = 0; result.units[n].glAlphaFlags[i] = 0; if( result.units[n].rgbComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glRGBArgs[i] = MapRGBArgs(result.units[n].rgbComb.args[i]); result.units[n].glRGBFlags[i] = MapRGBArgFlags(result.units[n].rgbComb.args[i]); } if( result.units[n].alphaComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glAlphaArgs[i] = MapAlphaArgs(result.units[n].alphaComb.args[i]); result.units[n].glAlphaFlags[i] = MapAlphaArgFlags(result.units[n].alphaComb.args[i]); } } } m_vCompiledSettings.push_back(result); m_lastIndex = m_vCompiledSettings.size()-1; #ifdef DEBUGGER if( logCombiners ) { DisplaySimpleMuxString(); } #endif return m_lastIndex; }
void COGLColorCombinerTNT2::GenerateCombinerSetting(int index) { TNT2CombinerSaveType &res = m_vCompiledTNTSettings[index]; // Texture unit 0 COGLTexture* pTexture = g_textures[gRSP.curTile].m_pCOGLTexture; COGLTexture* pTexture1 = g_textures[(gRSP.curTile+1)&7].m_pCOGLTexture; if( pTexture ) m_pOGLRender->BindTexture(pTexture->m_dwTextureName, 0); if( pTexture1 ) m_pOGLRender->BindTexture(pTexture1->m_dwTextureName, 1); // Texture unit 0 glActiveTexture(GL_TEXTURE0_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV); m_pOGLRender->EnableTexUnit(0,TRUE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, res.unit1.rgbOp); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, res.unit1.alphaOp); if( res.unit1.rgbOp == GL_SUBTRACT_ARB ) { glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, MapRGBArgs(res.unit1.rgbArg0^MUX_COMPLEMENT)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg0^MUX_COMPLEMENT)); } else { glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, MapRGBArgs(res.unit1.rgbArg0)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg0)); } glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, MapRGBArgs(res.unit1.rgbArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, MapRGBArgs(res.unit1.rgbArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, MapRGBArgFlags(res.unit1.rgbArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_RGB_EXT, MapRGBArgs(res.unit1.rgbArg3)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_RGB_EXT, MapRGBArgFlags(res.unit1.rgbArg3)); if( res.unit1.alphaOp == GL_SUBTRACT_ARB ) { glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg0^MUX_COMPLEMENT)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg0^MUX_COMPLEMENT)); } else { glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg0)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg0)); } glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, MapRGBArgs(res.unit1.alphaArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, MapAlphaArgFlags(res.unit1.alphaArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_ALPHA_EXT, MapRGBArgs(res.unit1.rgbArg3)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_ALPHA_EXT, MapAlphaArgFlags(res.unit1.rgbArg3)); glActiveTexture(GL_TEXTURE1_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV); if( m_maxTexUnits > 1 && res.numOfUnits > 1 ) { glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, res.unit2.rgbOp); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, res.unit2.alphaOp); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, MapRGBArgs(res.unit2.rgbArg0)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, MapRGBArgFlags(res.unit2.rgbArg0)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, MapRGBArgs(res.unit2.rgbArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, MapRGBArgFlags(res.unit2.rgbArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, MapRGBArgs(res.unit2.rgbArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, MapRGBArgFlags(res.unit2.rgbArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_RGB_EXT, MapRGBArgs(res.unit2.rgbArg3)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_RGB_EXT, MapRGBArgFlags(res.unit2.rgbArg3)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, MapRGBArgs(res.unit2.alphaArg0)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, MapAlphaArgFlags(res.unit2.alphaArg0)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, MapRGBArgs(res.unit2.alphaArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, MapAlphaArgFlags(res.unit2.alphaArg1)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, MapRGBArgs(res.unit2.alphaArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, MapAlphaArgFlags(res.unit2.alphaArg2)); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE3_ALPHA_EXT, MapRGBArgs(res.unit2.alphaArg3)); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND3_ALPHA_EXT, MapAlphaArgFlags(res.unit2.alphaArg3)); m_pOGLRender->EnableTexUnit(1,TRUE); } else { //m_pOGLRender->EnableTexUnit(1,FALSE); } }
int COGLColorCombiner4v2::SaveParsedResult(OGLExtCombinerSaveType &result) { result.dwMux0 = m_pDecodedMux->m_dwMux0; result.dwMux1 = m_pDecodedMux->m_dwMux1; int n; for( n=0; n<result.numOfUnits; n++ ) { for( int i=0; i<3; i++ ) { result.units[n].glRGBArgs[i] = 0; result.units[n].glRGBFlags[i] = 0; result.units[n].glAlphaArgs[i] = 0; result.units[n].glAlphaFlags[i] = 0; if( result.units[n].rgbComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glRGBArgs[i] = MapRGBArgs(result.units[n].rgbComb.args[i]); if( result.units[n].glRGBArgs[i] == GL_TEXTURE3 && !result.envIsUsed ) result.units[n].glRGBArgs[i] = GL_TEXTURE2; result.units[n].glRGBFlags[i] = MapRGBArgFlags(result.units[n].rgbComb.args[i]); } if( result.units[n].alphaComb.args[i] != CM_IGNORE_BYTE ) { result.units[n].glAlphaArgs[i] = MapAlphaArgs(result.units[n].alphaComb.args[i]); if( result.units[n].glAlphaArgs[i] == GL_TEXTURE3 && !result.envIsUsed ) result.units[n].glAlphaArgs[i] = GL_TEXTURE2; result.units[n].glAlphaFlags[i] = MapAlphaArgFlags(result.units[n].alphaComb.args[i]); } } if( isGLtex(result.units[n].glRGBArgs[0]) && isGLtex(result.units[n].glRGBArgs[1]) && isGLtex(result.units[n].glRGBArgs[2]) ) { // result.units[n].glRGBArgs[2] = GL_CONSTANT; } if( isGLtex(result.units[n].glAlphaArgs[0]) && isGLtex(result.units[n].glAlphaArgs[1]) && isGLtex(result.units[n].glAlphaArgs[2]) ) { // result.units[n].glRGBArgs[2] = GL_CONSTANT; } } int extraUnit = 0; if( result.envIsUsed ) extraUnit++; if( result.lodFracIsUsed ) extraUnit++; for( n=result.numOfUnits; n<result.numOfUnits+extraUnit; n++ ) { for( int i=0; i<3; i++ ) { result.units[n].rgbComb.args[i]=CM_IGNORE_BYTE; result.units[n].alphaComb.args[i]=CM_IGNORE_BYTE; result.units[n].glRGBArgs[i] = 0; result.units[n].glRGBFlags[i] = 0; result.units[n].glAlphaArgs[i] = 0; result.units[n].glAlphaFlags[i] = 0; } result.units[n].rgbComb.args[0]=MUX_COMBINED; result.units[n].alphaComb.args[0]=MUX_COMBINED; result.units[n].rgbOp = GL_REPLACE; result.units[n].alphaOp = GL_REPLACE; // result.units[n].glRGBArgs[0] = GL_PREVIOUS; // result.units[n].glRGBArgs[1] = GL_PREVIOUS; result.units[n].rgbFlag0gl = GL_SRC_COLOR; result.units[n].rgbFlag1gl = GL_SRC_COLOR; // result.units[n].glAlphaArgs[0] = GL_PREVIOUS; // result.units[n].glAlphaArgs[1] = GL_PREVIOUS; result.units[n].alphaFlag0gl = GL_SRC_ALPHA; result.units[n].alphaFlag1gl = GL_SRC_ALPHA; } result.numOfUnits += extraUnit; m_vCompiledSettings.push_back(result); m_lastIndex = m_vCompiledSettings.size()-1; #ifdef DEBUGGER if( logCombiners ) { DisplaySimpleMuxString(); } #endif return m_lastIndex; }