diff options
author | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2005-01-16 09:02:06 +0300 |
---|---|---|
committer | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2005-01-16 09:02:06 +0300 |
commit | 3b91ea4309f47d937799382d988a6348e3bb2d7f (patch) | |
tree | d45b8087e755ae6b9781845d21898603c038f2a7 /source/gameengine/Rasterizer | |
parent | 5fcf39d2a5db1d536e9fbfa52edb2bcdc40d8e29 (diff) |
Unified KX_BlenderPolyMaterial & GPC_PolygonMaterial into KX_PolygonMaterial.
Make game engine materials use Zoffs in Materials.
Added Python material hooks.
Diffstat (limited to 'source/gameengine/Rasterizer')
8 files changed, 50 insertions, 23 deletions
diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp index fd2f3a55f1d..4ce072dd7cc 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp +++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp @@ -112,11 +112,12 @@ void RAS_BucketManager::RenderAlphaBuckets( // it is needed for compatibility. rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_DISABLED); + int drawingmode; std::multiset< alphamesh, backtofront>::iterator msit = alphameshset.begin(); for (; msit != alphameshset.end(); ++msit) { - (*msit).m_bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *(*msit).m_ms, - (*msit).m_bucket->ActivateMaterial(cameratrans, rasty, rendertools)); + while ((*msit).m_bucket->ActivateMaterial(cameratrans, rasty, rendertools, drawingmode)) + (*msit).m_bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *(*msit).m_ms, drawingmode); } rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED); diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp index babecdd585a..330f964de7b 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp @@ -36,7 +36,6 @@ #endif RAS_IPolyMaterial::RAS_IPolyMaterial(const STR_String& texname, - bool ba, const STR_String& matname, int tile, int tilexrep, @@ -77,7 +76,7 @@ bool RAS_IPolyMaterial::Equals(const RAS_IPolyMaterial& lhs) const this->m_zsort == lhs.m_zsort && this->m_drawingmode == lhs.m_drawingmode && this->m_bIsTriangle == lhs.m_bIsTriangle && - this->m_lightlayer == lhs.m_lightlayer && + this->m_lightlayer == lhs.m_lightlayer && this->m_texturename.hash() == lhs.m_texturename.hash() && this->m_materialname.hash() == lhs.m_materialname.hash() ); diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h index 648a8b63464..b039b51dd8b 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h @@ -83,7 +83,6 @@ public: }; RAS_IPolyMaterial(const STR_String& texname, - bool ba, const STR_String& matname, int tile, int tilexrep, @@ -110,9 +109,12 @@ public: * @param rasty The rasterizer in which the material should be active. * @param cachingInfo The information about the material used to speed up rasterizing. */ - virtual void Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const {} + virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const + { + return false; + } - bool Equals(const RAS_IPolyMaterial& lhs) const; + virtual bool Equals(const RAS_IPolyMaterial& lhs) const; bool Less(const RAS_IPolyMaterial& rhs) const; int GetLightLayer() const; bool IsTransparant() const; diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h index bd7f10e32a7..48991566fa5 100644 --- a/source/gameengine/Rasterizer/RAS_IRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h @@ -116,7 +116,7 @@ public: * to be rendered with. * The material will be cached. */ - virtual void SetMaterial(const RAS_IPolyMaterial& mat)=0; + virtual bool SetMaterial(const RAS_IPolyMaterial& mat)=0; /** * Init initialises the renderer. */ @@ -328,6 +328,10 @@ public: float difY, float difZ, float diffuse)=0; + /** + * Sets a polygon offset. z depth will be: z1 = mult*z0 + add + */ + virtual void SetPolygonOffset(float mult, float add) = 0; }; diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp index f2dc7535010..a9934df1d02 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp @@ -169,12 +169,13 @@ RAS_MaterialBucket::T_MeshSlotList::iterator RAS_MaterialBucket::msEnd() return m_meshSlots.end(); } -int RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, - RAS_IRenderTools *rendertools) +bool RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, + RAS_IRenderTools *rendertools, int &drawmode) { rendertools->SetViewMat(cameratrans); - rasty->SetMaterial(*m_material); + if (!rasty->SetMaterial(*m_material)) + return false; bool dolights = m_material->GetDrawingMode()&16; @@ -187,8 +188,10 @@ int RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_IR bool bUseLights = rendertools->ProcessLighting(m_material->GetLightLayer()); } - return (rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID ? + drawmode = (rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID ? 1: (m_material->UsesTriangles() ? 0 : 2)); + + return true; } void RAS_MaterialBucket::RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, @@ -272,12 +275,13 @@ void RAS_MaterialBucket::Render(const MT_Transform& cameratrans, rendertools->SetClientObject((*m_meshSlots.begin()).m_clientObj); } - int drawmode = ActivateMaterial(cameratrans, rasty, rendertools); + int drawmode; for (T_MeshSlotList::const_iterator it = m_meshSlots.begin(); ! (it == m_meshSlots.end()); ++it) { - RenderMeshSlot(cameratrans, rasty, rendertools, *it, drawmode); + while (ActivateMaterial(cameratrans, rasty, rendertools, drawmode)) + RenderMeshSlot(cameratrans, rasty, rendertools, *it, drawmode); } } diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.h b/source/gameengine/Rasterizer/RAS_MaterialBucket.h index 83cb06b3c2b..52f835a4575 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.h +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.h @@ -56,7 +56,10 @@ struct KX_VertexIndex { public: KX_VertexIndex(int size); void SetIndex(short loc,unsigned int index); + + // The vertex array short m_vtxarray; + // An index into the vertex array for up to 4 verticies unsigned short m_indexarray[4]; short m_size; }; @@ -124,8 +127,8 @@ public: void RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools, const KX_MeshSlot &ms, int drawmode); - int ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, - RAS_IRenderTools *rendertools); + bool ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, + RAS_IRenderTools *rendertools, int &drawmode); unsigned int NumMeshSlots(); T_MeshSlotList::iterator msBegin(); diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index 78666b6936d..95688580fa3 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -42,8 +42,10 @@ #endif // WIN32 #ifdef __APPLE__ #include <OpenGL/gl.h> +#include <OpenGL/glu.h> #else #include <GL/gl.h> +#include <GL/glu.h> #endif #include "RAS_Rect.h" @@ -157,6 +159,10 @@ static void Myinit_gl_stuff(void) } glPolygonStipple(patc); + + glFrontFace(GL_CCW); + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); } @@ -270,12 +276,9 @@ void RAS_OpenGLRasterizer::DisplayFog() -void RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat) +bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat) { - if (mat.GetCachingInfo() != m_materialCachingInfo) - { - mat.Activate(this, m_materialCachingInfo); - } + return mat.Activate(this, m_materialCachingInfo); } @@ -1329,4 +1332,14 @@ double RAS_OpenGLRasterizer::GetTime() return m_time; } - +void RAS_OpenGLRasterizer::SetPolygonOffset(float mult, float add) +{ + glPolygonOffset(mult, add); + GLint mode = GL_POLYGON_OFFSET_FILL; + if (m_drawingmode < KX_SHADED) + mode = GL_POLYGON_OFFSET_LINE; + if (mult != 0.0f || add != 0.0f) + glEnable(mode); + else + glDisable(mode); +} diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h index d5a0e7ff551..2571cee1333 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h @@ -105,7 +105,7 @@ public: };*/ virtual void SetDepthMask(DepthMask depthmask); - virtual void SetMaterial(const RAS_IPolyMaterial& mat); + virtual bool SetMaterial(const RAS_IPolyMaterial& mat); virtual bool Init(); virtual void Exit(); virtual bool BeginFrame(int drawingmode, double time); @@ -224,6 +224,7 @@ public: float difZ, float diffuse ); + virtual void SetPolygonOffset(float mult, float add); }; |