bugfix [#19254] KX_PolyProxy returns improper VertexIndex with triangles, using ...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 31 Aug 2009 03:36:02 +0000 (03:36 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 31 Aug 2009 03:36:02 +0000 (03:36 +0000)
Surprising this wasn't noticed before. Any mix of quads/tris caused the face verts of either quads/tries (whichever comes last).

Tested by exporting the KX_MeshProxy and re-importing as an OBJ.

This fix assumes there are only 2 m_darray's per face array which is currently true, but wont be if edge support is added back.

source/gameengine/Ketsji/KX_PolyProxy.cpp
source/gameengine/Rasterizer/RAS_MaterialBucket.h
source/gameengine/Rasterizer/RAS_Polygon.cpp
source/gameengine/Rasterizer/RAS_Polygon.h

index b56b5500c39fe419ceb86e365633ad06c05e5a96..66457f46deb5e81fb2f23dcc0a0f6ad232dbd8fc 100644 (file)
@@ -140,19 +140,19 @@ PyObject* KX_PolyProxy::py_getattro(PyObject *attr)
        }
        if (!strcmp(attr_str, "v1"))
        {
-               return PyInt_FromLong(m_polygon->GetVertexOffset(0));
+               return PyInt_FromLong(m_polygon->GetVertexOffsetAbs(m_mesh, 0));
        }
        if (!strcmp(attr_str, "v2"))
        {
-               return PyInt_FromLong(m_polygon->GetVertexOffset(1));
+               return PyInt_FromLong(m_polygon->GetVertexOffsetAbs(m_mesh, 1));
        }
        if (!strcmp(attr_str, "v3"))
        {
-               return PyInt_FromLong(m_polygon->GetVertexOffset(2));
+               return PyInt_FromLong(m_polygon->GetVertexOffsetAbs(m_mesh, 2));
        }
        if (!strcmp(attr_str, "v4"))
        {
-               return PyInt_FromLong(((m_polygon->VertexCount()>3)?m_polygon->GetVertexOffset(3):0));
+               return PyInt_FromLong(((m_polygon->VertexCount()>3)?m_polygon->GetVertexOffsetAbs(m_mesh, 3):0));
        }
        if (!strcmp(attr_str, "visible"))
        {
@@ -255,7 +255,7 @@ KX_PYMETHODDEF_DOC(KX_PolyProxy, getVertexIndex,
        }
        if (index < m_polygon->VertexCount())
        {
-               return PyInt_FromLong(m_polygon->GetVertexOffset(index));
+               return PyInt_FromLong(m_polygon->GetVertexOffsetAbs(m_mesh, index));
        }
        return PyInt_FromLong(0);
 }
index 8db75b8b735d8d552fd357c5e30f018eef0d8664..49837652483d5fea0a06bbbf6ecb0524e0dacc45 100644 (file)
@@ -79,8 +79,11 @@ class RAS_DisplayArray
 public:
        vector<RAS_TexVert> m_vertex;
        vector<unsigned short> m_index;
+       /* LINE currently isnt used */
        enum { LINE = 2, TRIANGLE = 3, QUAD = 4 } m_type;
        //RAS_MeshSlot *m_origSlot;
+       
+       /* Number of RAS_MeshSlot using this array */
        int m_users;
 
        enum { BUCKET_MAX_INDEX = 65535 };
index eacc128516646788d2489d3c9e2f421e0d763c57..87c5118c5fbe829d17b98e14dd26f02ecbc67bd8 100644 (file)
@@ -31,6 +31,7 @@
 #endif
 
 #include "RAS_Polygon.h"
+#include "RAS_MeshObject.h" /* only for GetVertexOffsetAbs */
 
 RAS_Polygon::RAS_Polygon(RAS_MaterialBucket* bucket, RAS_DisplayArray *darray, int numvert)
 {
@@ -63,6 +64,20 @@ int RAS_Polygon::GetVertexOffset(int i)
        return m_offset[i];
 }
 
+int RAS_Polygon::GetVertexOffsetAbs(RAS_MeshObject *mesh, int i)
+{
+       /* hack that only works because there can only ever be 2 different
+        * GetDisplayArray's per mesh. if this uses a different display array to the first
+        * then its incices are offset.
+        * if support for edges is added back this would need to be changed. */
+       RAS_DisplayArray* darray= mesh->GetPolygon(0)->GetDisplayArray();
+       
+       if(m_darray != darray)
+               return m_offset[i] + darray->m_vertex.size();
+       
+       return m_offset[i];
+}
+
 /*
 int RAS_Polygon::GetEdgeCode()
 {
index 41eaa6bdd4a1a1da0487cbef0024eff9eb124b3b..188390f1c6bcd3b4e4a7f1e6b7183f7fb49c1e9e 100644 (file)
@@ -68,6 +68,7 @@ public:
 
        void                            SetVertexOffset(int i, unsigned short offset);
        int                                     GetVertexOffset(int i);
+       int                                     GetVertexOffsetAbs(RAS_MeshObject *mesh, int i); /* accounts for quad and tri arrays, slower, for python */
        
        // each bit is for a visible edge, starting with bit 1 for the first edge, bit 2 for second etc.
        // - Not used yet!