diff options
author | Porteries Tristan <republicthunderbolt9@gmail.com> | 2015-06-20 15:21:31 +0300 |
---|---|---|
committer | Porteries Tristan <republicthunderbolt9@gmail.com> | 2015-06-20 15:21:31 +0300 |
commit | 2a305580b2c76af62c129fbca043466ab010c2df (patch) | |
tree | ca2713a78353dc5e0f41915621ef000c2c470b88 | |
parent | 6b3a43ccb4c3d9cc385d1f2acaac2d4d39ce25df (diff) |
BGE: Fix T38030: wrong vertex index returned by KX_PolyProxy
Fix T38030.
In c++ source we use one list for triangles and an other for quads, but KX_PolyProxy doesn't care about that and return the vertex offset in its list. So we just have to compute the offset of each RAS_DisplayArray to its previous to have an absolute vertex index.
Reviewers: moguri, campbellbarton, kupoman, agoose77, brita_, hg1
Reviewed By: agoose77, hg1
Projects: #game_engine
Maniphest Tasks: T38030
Differential Revision: https://developer.blender.org/D1324
-rw-r--r-- | source/gameengine/Ketsji/KX_PolyProxy.cpp | 10 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MaterialBucket.cpp | 10 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MaterialBucket.h | 10 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MeshObject.cpp | 17 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MeshObject.h | 8 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_Polygon.cpp | 4 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_Polygon.h | 4 |
7 files changed, 47 insertions, 16 deletions
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.cpp b/source/gameengine/Ketsji/KX_PolyProxy.cpp index ccc10eb06e3..4454543161b 100644 --- a/source/gameengine/Ketsji/KX_PolyProxy.cpp +++ b/source/gameengine/Ketsji/KX_PolyProxy.cpp @@ -140,21 +140,21 @@ PyObject *KX_PolyProxy::pyattr_get_v1(void *self_v, const KX_PYATTRIBUTE_DEF *at { KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v); - return PyLong_FromLong(self->m_polygon->GetVertexOffset(0)); + return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbsolute(0)); } PyObject *KX_PolyProxy::pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) { KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v); - return PyLong_FromLong(self->m_polygon->GetVertexOffset(1)); + return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbsolute(1)); } PyObject *KX_PolyProxy::pyattr_get_v3(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) { KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v); - return PyLong_FromLong(self->m_polygon->GetVertexOffset(2)); + return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbsolute(2)); } PyObject *KX_PolyProxy::pyattr_get_v4(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) @@ -163,7 +163,7 @@ PyObject *KX_PolyProxy::pyattr_get_v4(void *self_v, const KX_PYATTRIBUTE_DEF *at if (3 < self->m_polygon->VertexCount()) { - return PyLong_FromLong(self->m_polygon->GetVertexOffset(3)); + return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbsolute(3)); } return PyLong_FromLong(0); } @@ -243,7 +243,7 @@ KX_PYMETHODDEF_DOC(KX_PolyProxy, getVertexIndex, } if (index < m_polygon->VertexCount()) { - return PyLong_FromLong(m_polygon->GetVertexOffset(index)); + return PyLong_FromLong(m_polygon->GetVertexOffsetAbsolute(index)); } return PyLong_FromLong(0); } diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp index 4b5fc6510e0..2078fc99f2e 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp @@ -287,6 +287,16 @@ void RAS_MeshSlot::AddPolygonVertex(int offset) m_endindex++; } +void RAS_MeshSlot::UpdateDisplayArraysOffset() +{ + unsigned int offset = 0; + for (unsigned short i = 0; i < m_displayArrays.size(); ++i) { + RAS_DisplayArray *darray = m_displayArrays[i]; + darray->m_offset = offset; + offset += darray->m_vertex.size(); + } +} + void RAS_MeshSlot::SetDeformer(RAS_Deformer* deformer) { if (deformer && m_pDeformer != deformer) { diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.h b/source/gameengine/Rasterizer/RAS_MaterialBucket.h index 007fdf240c4..1eee99f896b 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.h +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.h @@ -80,6 +80,13 @@ public: class RAS_DisplayArray { public: + /** The offset relation to the previous RAS_DisplayArray. + * For the user vertex are one big list but in C++ source + * it's two different lists if we use quads and triangles. + * So to fix that we add an offset. + * This value is set in UpdateDisplayArraysOffset(). + */ + unsigned int m_offset; vector<RAS_TexVert> m_vertex; vector<unsigned short> m_index; /* LINE currently isn't used */ @@ -165,6 +172,9 @@ public: int AddVertex(const RAS_TexVert& tv); void AddPolygonVertex(int offset); + /// Update offset of each display array + void UpdateDisplayArraysOffset(); + /* optimization */ bool Split(bool force=false); bool Join(RAS_MeshSlot *target, MT_Scalar distance); diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp index 54b15f07896..4360464ed32 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp +++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp @@ -465,6 +465,23 @@ void RAS_MeshObject::RemoveFromBuckets(void *clientobj) } } +void RAS_MeshObject::EndConversion() +{ +#if 0 + m_sharedvertex_map.clear(); // SharedVertex + vector<vector<SharedVertex> > shared_null(0); + shared_null.swap( m_sharedvertex_map ); /* really free the memory */ +#endif + + for (std::list<RAS_MeshMaterial>::iterator it = m_materials.begin(); + it != m_materials.end(); + ++it) + { + RAS_MeshSlot *ms = it->m_baseslot; + ms->UpdateDisplayArraysOffset(); + } +} + //void RAS_MeshObject::Transform(const MT_Transform& trans) //{ //m_trans.translate(MT_Vector3(0,0,1));//.operator *=(trans); diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h index 4f352379d39..a6f1a1cafc6 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.h +++ b/source/gameengine/Rasterizer/RAS_MeshObject.h @@ -132,13 +132,7 @@ public: virtual void AddMeshUser(void *clientobj, SG_QList *head, RAS_Deformer* deformer); void RemoveFromBuckets(void *clientobj); - void EndConversion() { -#if 0 - m_sharedvertex_map.clear(); // SharedVertex - vector<vector<SharedVertex> > shared_null(0); - shared_null.swap( m_sharedvertex_map ); /* really free the memory */ -#endif - } + void EndConversion(); /* colors */ void DebugColor(unsigned int abgr); diff --git a/source/gameengine/Rasterizer/RAS_Polygon.cpp b/source/gameengine/Rasterizer/RAS_Polygon.cpp index 1f23df90753..3274ded4406 100644 --- a/source/gameengine/Rasterizer/RAS_Polygon.cpp +++ b/source/gameengine/Rasterizer/RAS_Polygon.cpp @@ -62,9 +62,9 @@ RAS_TexVert *RAS_Polygon::GetVertex(int i) return &m_darray->m_vertex[m_offset[i]]; } -int RAS_Polygon::GetVertexOffset(int i) +unsigned int RAS_Polygon::GetVertexOffsetAbsolute(unsigned short i) { - return m_offset[i]; + return m_offset[i] + m_darray->m_offset; } /* diff --git a/source/gameengine/Rasterizer/RAS_Polygon.h b/source/gameengine/Rasterizer/RAS_Polygon.h index b18477a72d2..597e80ffdfb 100644 --- a/source/gameengine/Rasterizer/RAS_Polygon.h +++ b/source/gameengine/Rasterizer/RAS_Polygon.h @@ -72,8 +72,8 @@ public: RAS_TexVert* GetVertex(int i); void SetVertexOffset(int i, unsigned short offset); - int GetVertexOffset(int i); - + unsigned int GetVertexOffsetAbsolute(unsigned short i); + // each bit is for a visible edge, starting with bit 1 for the first edge, bit 2 for second etc. // - Not used yet! /* int GetEdgeCode(); |