Browse Source

Merge pull request #95 from DavidWyand-GG/issue94-CubemapRenderBug

Fix for Issue #94 for Cubemap render bug
David Wyand 13 years ago
parent
commit
d677782466
1 changed files with 61 additions and 53 deletions
  1. 61 53
      Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp

+ 61 - 53
Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp

@@ -1659,59 +1659,67 @@ void ReflectCubeFeatHLSL::processVert( Vector<ShaderComponent*> &componentList,
          meta->addStatement( new GenOp( "   @ = @;\r\n", outTex, inTex ) );
       }
    }
-
-   // create cubeTrans
-   Var *cubeTrans = new Var;
-   cubeTrans->setType( "float3x3" );
-   cubeTrans->setName( "cubeTrans" );
-   cubeTrans->uniform = true;
-   cubeTrans->constSortPos = cspPrimitive;   
-
-   // create cubeEye position
-   Var *cubeEyePos = new Var;
-   cubeEyePos->setType( "float3" );
-   cubeEyePos->setName( "cubeEyePos" );
-   cubeEyePos->uniform = true;
-   cubeEyePos->constSortPos = cspPrimitive;   
-
-   // cube vert position
-   Var * cubeVertPos = new Var;
-   cubeVertPos->setName( "cubeVertPos" );
-   cubeVertPos->setType( "float3" );
-   LangElement *cubeVertPosDecl = new DecOp( cubeVertPos );
-
-   meta->addStatement( new GenOp( "   @ = mul(@, @).xyz;\r\n", 
-                       cubeVertPosDecl, cubeTrans, LangElement::find( "position" ) ) );
-
-   // cube normal
-   Var * cubeNormal = new Var;
-   cubeNormal->setName( "cubeNormal" );
-   cubeNormal->setType( "float3" );
-   LangElement *cubeNormDecl = new DecOp( cubeNormal );
-
-   meta->addStatement( new GenOp( "   @ = normalize( mul(@, normalize(@)).xyz );\r\n", 
-                       cubeNormDecl, cubeTrans, inNormal ) );
-
-   // eye to vert
-   Var * eyeToVert = new Var;
-   eyeToVert->setName( "eyeToVert" );
-   eyeToVert->setType( "float3" );
-   LangElement *e2vDecl = new DecOp( eyeToVert );
-
-   meta->addStatement( new GenOp( "   @ = @ - @;\r\n", 
-                       e2vDecl, cubeVertPos, cubeEyePos ) );
-
-   // 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;
+       
+    // create cubeTrans
+    bool useInstancing = fd.features[MFT_UseInstancing];
+    Var *cubeTrans = getObjTrans( componentList, useInstancing, meta );
+
+    // cube vert position
+    Var * cubeVertPos = new Var;
+    cubeVertPos->setName( "cubeVertPos" );
+    cubeVertPos->setType( "float3" );
+    LangElement *cubeVertPosDecl = new DecOp( cubeVertPos );
+
+    meta->addStatement( new GenOp( "   @ = mul((float3x3)@, @).xyz;\r\n", 
+                        cubeVertPosDecl, cubeTrans, LangElement::find( "position" ) ) );
+
+    // cube normal
+    Var * cubeNormal = new Var;
+    cubeNormal->setName( "cubeNormal" );
+    cubeNormal->setType( "float3" );
+    LangElement *cubeNormDecl = new DecOp( cubeNormal );
+
+    meta->addStatement( new GenOp( "   @ = normalize( mul(@, normalize(@)).xyz );\r\n", 
+                        cubeNormDecl, cubeTrans, inNormal ) );
+
+    // grab the eye position
+    Var *eyePos = (Var*)LangElement::find( "eyePosWorld" );
+    if ( !eyePos )
+    {
+        eyePos = new Var( "eyePosWorld", "float3" );
+        eyePos->uniform = true;
+        eyePos->constSortPos = cspPass;
+    }
+
+    // cube position
+    Var * cubePos = new Var;
+    cubePos->setName( "cubePos" );
+    cubePos->setType( "float3" );
+    LangElement *cubePosDecl = new DecOp( cubePos );
+
+    meta->addStatement( new GenOp( "   @ = float3( @[0][3], @[1][3], @[2][3] );\r\n", 
+                        cubePosDecl, cubeTrans, cubeTrans, cubeTrans ) );
+
+    // eye to vert
+    Var * eyeToVert = new Var;
+    eyeToVert->setName( "eyeToVert" );
+    eyeToVert->setType( "float3" );
+    LangElement *e2vDecl = new DecOp( eyeToVert );
+
+    meta->addStatement( new GenOp( "   @ = @ - ( @ - @ );\r\n", 
+                        e2vDecl, cubeVertPos, eyePos, cubePos ) );
+
+    // 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,