Commit d21b1446 authored by monstrobishi's avatar monstrobishi

- Fixed active camera scene node registering itself twice (This causes...

 - Fixed active camera scene node registering itself twice (This causes anything parented to the camera to get drawn twice, potentially a major performance issue). Scene manager now calls "render()" to update the active camera's matrices prior to doing culling, rather than OnRegisterSceneNode.
 - Fixed the object-space lighting normal mapping/parallax mapping bug in OpenGL. Parallax offset still looks a bit weird in OpenGL compared to D3D IMO.
 - Fixed a compile warning in D3D9 driver.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2775 dfc29bdd-3216-0410-991c-e03cc46cb475
parent ae0240d6
...@@ -233,6 +233,16 @@ void CCameraSceneNode::recalculateProjectionMatrix() ...@@ -233,6 +233,16 @@ void CCameraSceneNode::recalculateProjectionMatrix()
//! prerender //! prerender
void CCameraSceneNode::OnRegisterSceneNode() void CCameraSceneNode::OnRegisterSceneNode()
{
if ( SceneManager->getActiveCamera () == this )
SceneManager->registerNodeForRendering(this, ESNRP_CAMERA);
ISceneNode::OnRegisterSceneNode();
}
//! render
void CCameraSceneNode::render()
{ {
core::vector3df pos = getAbsolutePosition(); core::vector3df pos = getAbsolutePosition();
core::vector3df tgtv = Target - pos; core::vector3df tgtv = Target - pos;
...@@ -245,7 +255,7 @@ void CCameraSceneNode::OnRegisterSceneNode() ...@@ -245,7 +255,7 @@ void CCameraSceneNode::OnRegisterSceneNode()
f32 dp = tgtv.dotProduct(up); f32 dp = tgtv.dotProduct(up);
if ( core::equals(fabsf(dp), 1.f) ) if ( core::equals(core::abs_<f32>(dp), 1.f) )
{ {
up.X += 0.5f; up.X += 0.5f;
} }
...@@ -254,16 +264,6 @@ void CCameraSceneNode::OnRegisterSceneNode() ...@@ -254,16 +264,6 @@ void CCameraSceneNode::OnRegisterSceneNode()
ViewArea.getTransform(video::ETS_VIEW) *= Affector; ViewArea.getTransform(video::ETS_VIEW) *= Affector;
recalculateViewArea(); recalculateViewArea();
if ( SceneManager->getActiveCamera () == this )
SceneManager->registerNodeForRendering(this, ESNRP_CAMERA);
ISceneNode::OnRegisterSceneNode();
}
//! render
void CCameraSceneNode::render()
{
video::IVideoDriver* driver = SceneManager->getVideoDriver(); video::IVideoDriver* driver = SceneManager->getVideoDriver();
if ( driver) if ( driver)
{ {
......
...@@ -1181,7 +1181,7 @@ void CD3D9Driver::draw2D3DVertexPrimitiveList(const void* vertices, ...@@ -1181,7 +1181,7 @@ void CD3D9Driver::draw2D3DVertexPrimitiveList(const void* vertices,
E_MODULATE_FUNC modulo; E_MODULATE_FUNC modulo;
u32 alphaSource; u32 alphaSource;
unpack_texureBlendFunc ( srcFact, dstFact, modulo, alphaSource, Material.MaterialTypeParam); unpack_texureBlendFunc ( srcFact, dstFact, modulo, alphaSource, Material.MaterialTypeParam);
setRenderStates2DMode(alphaSource&video::EAS_VERTEX_COLOR, (Material.getTexture(0) != 0), alphaSource&video::EAS_TEXTURE); setRenderStates2DMode(alphaSource&video::EAS_VERTEX_COLOR, (Material.getTexture(0) != 0), (alphaSource&video::EAS_TEXTURE) != 0);
} }
else else
setRenderStates2DMode(Material.MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA, (Material.getTexture(0) != 0), Material.MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL); setRenderStates2DMode(Material.MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA, (Material.getTexture(0) != 0), Material.MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL);
......
...@@ -47,9 +47,6 @@ const char OPENGL_NORMAL_MAP_VSH[] = ...@@ -47,9 +47,6 @@ const char OPENGL_NORMAL_MAP_VSH[] =
"PARAM MVP[4] = { state.matrix.mvp }; # modelViewProjection matrix.\n"\ "PARAM MVP[4] = { state.matrix.mvp }; # modelViewProjection matrix.\n"\
"TEMP Temp;\n"\ "TEMP Temp;\n"\
"TEMP TempColor;\n"\ "TEMP TempColor;\n"\
"TEMP TempNormal;\n"\
"TEMP TempTangent;\n"\
"TEMP TempBinormal;\n"\
"TEMP TempLightVector1;\n"\ "TEMP TempLightVector1;\n"\
"TEMP TempLightVector2;\n"\ "TEMP TempLightVector2;\n"\
"TEMP TempTransLightV1;\n"\ "TEMP TempTransLightV1;\n"\
...@@ -63,21 +60,6 @@ const char OPENGL_NORMAL_MAP_VSH[] = ...@@ -63,21 +60,6 @@ const char OPENGL_NORMAL_MAP_VSH[] =
"MOV OutPos.z, Temp.z;\n"\ "MOV OutPos.z, Temp.z;\n"\
"MOV result.fogcoord.x, Temp.z;\n"\ "MOV result.fogcoord.x, Temp.z;\n"\
"\n"\ "\n"\
"# transform normal \n"\
"DP3 TempNormal.x, InNormal.x, program.local[0];\n"\
"DP3 TempNormal.y, InNormal.y, program.local[1]; \n"\
"DP3 TempNormal.z, InNormal.z, program.local[2];\n"\
"\n"\
"# transform tangent \n"\
"DP3 TempTangent.x, InTangent.x, program.local[0];\n"\
"DP3 TempTangent.y, InTangent.y, program.local[1]; \n"\
"DP3 TempTangent.z, InTangent.z, program.local[2];\n"\
"\n"\
"# transform binormal \n"\
"DP3 TempBinormal.x, InBinormal.x, program.local[0];\n"\
"DP3 TempBinormal.y, InBinormal.y, program.local[1]; \n"\
"DP3 TempBinormal.z, InBinormal.z, program.local[2];\n"\
"\n"\
"# vertex into world position \n"\ "# vertex into world position \n"\
"DP4 Temp.x, InPos, program.local[0];\n"\ "DP4 Temp.x, InPos, program.local[0];\n"\
"DP4 Temp.y, InPos, program.local[1];\n"\ "DP4 Temp.y, InPos, program.local[1];\n"\
...@@ -89,14 +71,14 @@ const char OPENGL_NORMAL_MAP_VSH[] = ...@@ -89,14 +71,14 @@ const char OPENGL_NORMAL_MAP_VSH[] =
"SUB TempLightVector2, program.local[14], Temp; \n"\ "SUB TempLightVector2, program.local[14], Temp; \n"\
"\n"\ "\n"\
"# transform the light vector 1 with U, V, W \n"\ "# transform the light vector 1 with U, V, W \n"\
"DP3 TempTransLightV1.x, TempTangent, TempLightVector1; \n"\ "DP3 TempTransLightV1.x, InTangent, TempLightVector1; \n"\
"DP3 TempTransLightV1.y, TempBinormal, TempLightVector1; \n"\ "DP3 TempTransLightV1.y, InBinormal, TempLightVector1; \n"\
"DP3 TempTransLightV1.z, TempNormal, TempLightVector1; \n"\ "DP3 TempTransLightV1.z, InNormal, TempLightVector1; \n"\
"\n"\ "\n"\
"# transform the light vector 2 with U, V, W \n"\ "# transform the light vector 2 with U, V, W \n"\
"DP3 TempTransLightV2.x, TempTangent, TempLightVector2; \n"\ "DP3 TempTransLightV2.x, InTangent, TempLightVector2; \n"\
"DP3 TempTransLightV2.y, TempBinormal, TempLightVector2; \n"\ "DP3 TempTransLightV2.y, InBinormal, TempLightVector2; \n"\
"DP3 TempTransLightV2.z, TempNormal, TempLightVector2; \n"\ "DP3 TempTransLightV2.z, InNormal, TempLightVector2; \n"\
"\n"\ "\n"\
"# normalize light vector 1 \n"\ "# normalize light vector 1 \n"\
"DP3 TempTransLightV1.w, TempTransLightV1, TempTransLightV1; \n"\ "DP3 TempTransLightV1.w, TempTransLightV1, TempTransLightV1; \n"\
...@@ -277,6 +259,10 @@ void COpenGLNormalMapRenderer::OnSetConstants(IMaterialRendererServices* service ...@@ -277,6 +259,10 @@ void COpenGLNormalMapRenderer::OnSetConstants(IMaterialRendererServices* service
u32 cnt = driver->getDynamicLightCount(); u32 cnt = driver->getDynamicLightCount();
// Load the inverse world matrix.
core::matrix4 invWorldMat;
driver->getTransform(video::ETS_WORLD).getInverse(invWorldMat);
for (u32 i=0; i<2; ++i) for (u32 i=0; i<2; ++i)
{ {
video::SLight light; video::SLight light;
...@@ -291,6 +277,9 @@ void COpenGLNormalMapRenderer::OnSetConstants(IMaterialRendererServices* service ...@@ -291,6 +277,9 @@ void COpenGLNormalMapRenderer::OnSetConstants(IMaterialRendererServices* service
light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation
// Transform the light by the inverse world matrix to get it into object space.
invWorldMat.transformVect(light.Position);
services->setVertexShaderConstant( services->setVertexShaderConstant(
reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1); reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1);
......
...@@ -49,9 +49,6 @@ const char OPENGL_PARALLAX_MAP_VSH[] = ...@@ -49,9 +49,6 @@ const char OPENGL_PARALLAX_MAP_VSH[] =
"PARAM MVP[4] = { state.matrix.mvp }; # modelViewProjection matrix.\n"\ "PARAM MVP[4] = { state.matrix.mvp }; # modelViewProjection matrix.\n"\
"TEMP Temp;\n"\ "TEMP Temp;\n"\
"TEMP TempColor;\n"\ "TEMP TempColor;\n"\
"TEMP TempNormal;\n"\
"TEMP TempTangent;\n"\
"TEMP TempBinormal;\n"\
"TEMP TempLightVector1;\n"\ "TEMP TempLightVector1;\n"\
"TEMP TempLightVector2;\n"\ "TEMP TempLightVector2;\n"\
"TEMP TempEyeVector;\n"\ "TEMP TempEyeVector;\n"\
...@@ -66,21 +63,6 @@ const char OPENGL_PARALLAX_MAP_VSH[] = ...@@ -66,21 +63,6 @@ const char OPENGL_PARALLAX_MAP_VSH[] =
"MOV OutPos.z, Temp.z;\n"\ "MOV OutPos.z, Temp.z;\n"\
"MOV result.fogcoord.x, Temp.z;\n"\ "MOV result.fogcoord.x, Temp.z;\n"\
"\n"\ "\n"\
"# transform normal \n"\
"DP3 TempNormal.x, InNormal.x, program.local[0];\n"\
"DP3 TempNormal.y, InNormal.y, program.local[1]; \n"\
"DP3 TempNormal.z, InNormal.z, program.local[2];\n"\
"\n"\
"# transform tangent \n"\
"DP3 TempTangent.x, InTangent.x, program.local[0];\n"\
"DP3 TempTangent.y, InTangent.y, program.local[1]; \n"\
"DP3 TempTangent.z, InTangent.z, program.local[2];\n"\
"\n"\
"# transform binormal \n"\
"DP3 TempBinormal.x, InBinormal.x, program.local[0];\n"\
"DP3 TempBinormal.y, InBinormal.y, program.local[1]; \n"\
"DP3 TempBinormal.z, InBinormal.z, program.local[2];\n"\
"\n"\
"# vertex into world position \n"\ "# vertex into world position \n"\
"DP4 Temp.x, InPos, program.local[0];\n"\ "DP4 Temp.x, InPos, program.local[0];\n"\
"DP4 Temp.y, InPos, program.local[1];\n"\ "DP4 Temp.y, InPos, program.local[1];\n"\
...@@ -95,19 +77,19 @@ const char OPENGL_PARALLAX_MAP_VSH[] = ...@@ -95,19 +77,19 @@ const char OPENGL_PARALLAX_MAP_VSH[] =
"SUB Temp, program.local[16], Temp; \n"\ "SUB Temp, program.local[16], Temp; \n"\
"\n"\ "\n"\
"# transform the light vector 1 with U, V, W \n"\ "# transform the light vector 1 with U, V, W \n"\
"DP3 TempTransLightV1.x, TempTangent, TempLightVector1; \n"\ "DP3 TempTransLightV1.x, InTangent, TempLightVector1; \n"\
"DP3 TempTransLightV1.y, TempBinormal, TempLightVector1; \n"\ "DP3 TempTransLightV1.y, InBinormal, TempLightVector1; \n"\
"DP3 TempTransLightV1.z, TempNormal, TempLightVector1; \n"\ "DP3 TempTransLightV1.z, InNormal, TempLightVector1; \n"\
"\n"\ "\n"\
"# transform the light vector 2 with U, V, W \n"\ "# transform the light vector 2 with U, V, W \n"\
"DP3 TempTransLightV2.x, TempTangent, TempLightVector2; \n"\ "DP3 TempTransLightV2.x, InTangent, TempLightVector2; \n"\
"DP3 TempTransLightV2.y, TempBinormal, TempLightVector2; \n"\ "DP3 TempTransLightV2.y, InBinormal, TempLightVector2; \n"\
"DP3 TempTransLightV2.z, TempNormal, TempLightVector2; \n"\ "DP3 TempTransLightV2.z, InNormal, TempLightVector2; \n"\
"\n"\ "\n"\
"# transform the eye vector with U, V, W \n"\ "# transform the eye vector with U, V, W \n"\
"DP3 TempEyeVector.x, TempTangent, Temp; \n"\ "DP3 TempEyeVector.x, InTangent, Temp; \n"\
"DP3 TempEyeVector.y, TempBinormal, Temp; \n"\ "DP3 TempEyeVector.y, InBinormal, Temp; \n"\
"DP3 TempEyeVector.z, TempNormal, Temp; \n"\ "DP3 TempEyeVector.z, InNormal, Temp; \n"\
"\n"\ "\n"\
"# normalize light vector 1 \n"\ "# normalize light vector 1 \n"\
"DP3 TempTransLightV1.w, TempTransLightV1, TempTransLightV1; \n"\ "DP3 TempTransLightV1.w, TempTransLightV1, TempTransLightV1; \n"\
...@@ -334,6 +316,10 @@ void COpenGLParallaxMapRenderer::OnSetConstants(IMaterialRendererServices* servi ...@@ -334,6 +316,10 @@ void COpenGLParallaxMapRenderer::OnSetConstants(IMaterialRendererServices* servi
u32 cnt = driver->getDynamicLightCount(); u32 cnt = driver->getDynamicLightCount();
// Load the inverse world matrix.
core::matrix4 invWorldMat;
driver->getTransform(video::ETS_WORLD).getInverse(invWorldMat);
for (u32 i=0; i<2; ++i) for (u32 i=0; i<2; ++i)
{ {
video::SLight light; video::SLight light;
...@@ -348,6 +334,9 @@ void COpenGLParallaxMapRenderer::OnSetConstants(IMaterialRendererServices* servi ...@@ -348,6 +334,9 @@ void COpenGLParallaxMapRenderer::OnSetConstants(IMaterialRendererServices* servi
light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation
// Transform the light by the inverse world matrix to get it into object space.
invWorldMat.transformVect(light.Position);
services->setVertexShaderConstant( services->setVertexShaderConstant(
reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1); reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1);
......
...@@ -1345,7 +1345,7 @@ void CSceneManager::drawAll() ...@@ -1345,7 +1345,7 @@ void CSceneManager::drawAll()
camWorldPos.set(0,0,0); camWorldPos.set(0,0,0);
if ( ActiveCamera ) if ( ActiveCamera )
{ {
ActiveCamera->OnRegisterSceneNode(); ActiveCamera->render();
camWorldPos = ActiveCamera->getAbsolutePosition(); camWorldPos = ActiveCamera->getAbsolutePosition();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment