Fix for Issue #94 for Cubemap render bug

This commit is contained in:
DavidWyand-GG 2012-10-17 11:46:17 -04:00
parent 9ed0f467d8
commit eb2fd2bf5f

View file

@ -1660,58 +1660,66 @@ void ReflectCubeFeatHLSL::processVert( Vector<ShaderComponent*> &componentList,
} }
} }
// create cubeTrans // create cubeTrans
Var *cubeTrans = new Var; bool useInstancing = fd.features[MFT_UseInstancing];
cubeTrans->setType( "float3x3" ); Var *cubeTrans = getObjTrans( componentList, useInstancing, meta );
cubeTrans->setName( "cubeTrans" );
cubeTrans->uniform = true;
cubeTrans->constSortPos = cspPrimitive;
// create cubeEye position // cube vert position
Var *cubeEyePos = new Var; Var * cubeVertPos = new Var;
cubeEyePos->setType( "float3" ); cubeVertPos->setName( "cubeVertPos" );
cubeEyePos->setName( "cubeEyePos" ); cubeVertPos->setType( "float3" );
cubeEyePos->uniform = true; LangElement *cubeVertPosDecl = new DecOp( cubeVertPos );
cubeEyePos->constSortPos = cspPrimitive;
// cube vert position meta->addStatement( new GenOp( " @ = mul((float3x3)@, @).xyz;\r\n",
Var * cubeVertPos = new Var; cubeVertPosDecl, cubeTrans, LangElement::find( "position" ) ) );
cubeVertPos->setName( "cubeVertPos" );
cubeVertPos->setType( "float3" );
LangElement *cubeVertPosDecl = new DecOp( cubeVertPos );
meta->addStatement( new GenOp( " @ = mul(@, @).xyz;\r\n", // cube normal
cubeVertPosDecl, cubeTrans, LangElement::find( "position" ) ) ); Var * cubeNormal = new Var;
cubeNormal->setName( "cubeNormal" );
cubeNormal->setType( "float3" );
LangElement *cubeNormDecl = new DecOp( cubeNormal );
// cube normal meta->addStatement( new GenOp( " @ = normalize( mul(@, normalize(@)).xyz );\r\n",
Var * cubeNormal = new Var; cubeNormDecl, cubeTrans, inNormal ) );
cubeNormal->setName( "cubeNormal" );
cubeNormal->setType( "float3" );
LangElement *cubeNormDecl = new DecOp( cubeNormal );
meta->addStatement( new GenOp( " @ = normalize( mul(@, normalize(@)).xyz );\r\n", // grab the eye position
cubeNormDecl, cubeTrans, inNormal ) ); Var *eyePos = (Var*)LangElement::find( "eyePosWorld" );
if ( !eyePos )
{
eyePos = new Var( "eyePosWorld", "float3" );
eyePos->uniform = true;
eyePos->constSortPos = cspPass;
}
// eye to vert // cube position
Var * eyeToVert = new Var; Var * cubePos = new Var;
eyeToVert->setName( "eyeToVert" ); cubePos->setName( "cubePos" );
eyeToVert->setType( "float3" ); cubePos->setType( "float3" );
LangElement *e2vDecl = new DecOp( eyeToVert ); LangElement *cubePosDecl = new DecOp( cubePos );
meta->addStatement( new GenOp( " @ = @ - @;\r\n", meta->addStatement( new GenOp( " @ = float3( @[0][3], @[1][3], @[2][3] );\r\n",
e2vDecl, cubeVertPos, cubeEyePos ) ); cubePosDecl, cubeTrans, cubeTrans, cubeTrans ) );
// grab connector texcoord register // eye to vert
ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); Var * eyeToVert = new Var;
Var *reflectVec = connectComp->getElement( RT_TEXCOORD ); eyeToVert->setName( "eyeToVert" );
reflectVec->setName( "reflectVec" ); eyeToVert->setType( "float3" );
reflectVec->setStructName( "OUT" ); LangElement *e2vDecl = new DecOp( eyeToVert );
reflectVec->setType( "float3" );
reflectVec->mapsToSampler = true;
meta->addStatement( new GenOp( " @ = reflect(@, @);\r\n", reflectVec, eyeToVert, cubeNormal ) ); meta->addStatement( new GenOp( " @ = @ - ( @ - @ );\r\n",
e2vDecl, cubeVertPos, eyePos, cubePos ) );
output = meta; // grab connector texcoord register
ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] );
Var *reflectVec = connectComp->getElement( RT_TEXCOORD );
reflectVec->setName( "reflectVec" );
reflectVec->setStructName( "OUT" );
reflectVec->setType( "float3" );
reflectVec->mapsToSampler = true;
meta->addStatement( new GenOp( " @ = reflect(@, @);\r\n", reflectVec, eyeToVert, cubeNormal ) );
output = meta;
} }
void ReflectCubeFeatHLSL::processPix( Vector<ShaderComponent*> &componentList, void ReflectCubeFeatHLSL::processPix( Vector<ShaderComponent*> &componentList,