diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 0ec54412485..9eba103e7c0 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -611,6 +611,10 @@ static bool ConvertMaterial( // cast shadows? material->ras_mode |= ( mat->mode & MA_SHADBUF )?CAST_SHADOW:0; + + // only shadows? + material->ras_mode |= ( mat->mode & MA_ONLYCAST )?ONLY_SHADOW:0; + MTex *mttmp = 0; int valid_index = 0; diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h index be66e2ec84d..83f9b601e0d 100644 --- a/source/gameengine/Ketsji/BL_Material.h +++ b/source/gameengine/Ketsji/BL_Material.h @@ -144,7 +144,8 @@ enum BL_ras_mode WIRE=64, CAST_SHADOW=128, TEX=256, - TWOSIDED=512 + TWOSIDED=512, + ONLY_SHADOW=1024, }; // ------------------------------------- diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index efaaed7b567..68a71218b8c 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -110,6 +110,7 @@ void KX_BlenderMaterial::Initialize( m_flag |= ((mMaterial->ras_mode & USE_LIGHT)!=0)? RAS_MULTILIGHT: 0; m_flag |= (mMaterial->glslmat)? RAS_BLENDERGLSL: 0; m_flag |= ((mMaterial->ras_mode & CAST_SHADOW)!=0)? RAS_CASTSHADOW: 0; + m_flag |= ((mMaterial->ras_mode & ONLY_SHADOW)!=0)? RAS_ONLYSHADOW: 0; // test the sum of the various modes for equality // so we can ether accept or reject this material diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp index 47e52318b33..03f6e567771 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp @@ -282,6 +282,11 @@ bool RAS_IPolyMaterial::CastsShadows() const return (m_flag & RAS_CASTSHADOW) != 0; } +bool RAS_IPolyMaterial::OnlyShadow() const +{ + return (m_flag & RAS_ONLYSHADOW) != 0; +} + bool RAS_IPolyMaterial::UsesObjectColor() const { return !(m_flag & RAS_BLENDERGLSL); diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h index 2db71c3a2fe..14223fc59bd 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h @@ -61,7 +61,8 @@ enum MaterialProps RAS_NORMAL =256, RAS_DEFMULTI =512, RAS_BLENDERGLSL =1024, - RAS_CASTSHADOW =2048 + RAS_CASTSHADOW =2048, + RAS_ONLYSHADOW =4096, }; /** @@ -174,6 +175,7 @@ public: virtual bool UsesLighting(RAS_IRasterizer *rasty) const; virtual bool UsesObjectColor() const; virtual bool CastsShadows() const; + virtual bool OnlyShadow() const; virtual void Replace_IScene(SCA_IScene *val) {} /* overridden by KX_BlenderMaterial */ diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp index 0c715524218..4b5fc6510e0 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp @@ -587,6 +587,9 @@ bool RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_I if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW && !m_material->CastsShadows()) return false; + if (rasty->GetDrawingMode() != RAS_IRasterizer::KX_SHADOW && m_material->OnlyShadow()) + return false; + if (!rasty->SetMaterial(*m_material)) return false;