@@ -23,27 +23,19 @@ KX_MeshBuilderSlot::KX_MeshBuilderSlot(KX_BlenderMaterial *material, RAS_Display
2323{
2424}
2525
26- KX_MeshBuilderSlot::KX_MeshBuilderSlot (RAS_MeshMaterial *meshmat, const RAS_VertexFormat& format, unsigned int & origIndexCounter)
27- :m_format(format),
28- m_factory(RAS_IVertexFactory::Construct(m_format)),
29- m_origIndexCounter(origIndexCounter)
26+ KX_MeshBuilderSlot::KX_MeshBuilderSlot (RAS_MeshMaterial *meshmat, const RAS_DisplayArray::Format& format,
27+ unsigned int & origIndexCounter)
28+ :m_origIndexCounter(origIndexCounter)
3029{
3130 RAS_MaterialBucket *bucket = meshmat->GetBucket ();
32- m_material = static_cast <KX_BlenderMaterial *>(bucket->GetPolyMaterial ());
33-
34- RAS_IDisplayArray *array = meshmat->GetDisplayArray ();
35- m_primitive = array->GetPrimitiveType ();
31+ m_material = static_cast <KX_BlenderMaterial *>(bucket->GetMaterial ());
3632
37- m_vertexInfos = array->GetVertexInfoList ();
38- m_primitiveIndices = array->GetPrimitiveIndexList ();
39- m_triangleIndices = array->GetTriangleIndexList ();
40-
41- for (unsigned int i = 0 , size = array->GetVertexCount (); i < size; ++i) {
42- m_vertices.push_back (m_factory->CopyVertex (array->GetVertexData (i)));
43- }
33+ RAS_DisplayArray *array = meshmat->GetDisplayArray ();
34+ BLI_assert (array->GetType () == RAS_DisplayArray::NORMAL);
35+ m_array = new RAS_DisplayArray (*array);
4436
4537 // Compute the maximum original index from the arrays.
46- m_origIndexCounter = std::max (m_origIndexCounter, array ->GetMaxOrigIndex ());
38+ m_origIndexCounter = std::max (m_origIndexCounter, m_array ->GetMaxOrigIndex ());
4739}
4840
4941KX_MeshBuilderSlot::~KX_MeshBuilderSlot ()
@@ -226,19 +218,19 @@ PyObject *KX_MeshBuilderSlot::PyAddVertex(PyObject *args, PyObject *kwds)
226218 return nullptr ;
227219 }
228220
229- mt::vec3_packed normal = mt::axisZ3;
221+ mt::vec3_packed normal = mt::vec3_packed (mt:: axisZ3) ;
230222 if (pynormal && !PyVecTo (pynormal, normal)) {
231223 return nullptr ;
232224 }
233225
234- mt::vec4_packed tangent = mt::one4;
226+ mt::vec4_packed tangent = mt::vec4_packed (mt:: one4) ;
235227 if (pytangent && !PyVecTo (pytangent, tangent)) {
236228 return nullptr ;
237229 }
238230
239231 const RAS_DisplayArray::Format& format = m_array->GetFormat ();
240232
241- mt::vec2_packed uvs[RAS_Texture::MaxUnits] = {mt::zero2};
233+ mt::vec2_packed uvs[RAS_Texture::MaxUnits] = {mt::vec2_packed (mt:: zero2) };
242234 if (pyuvs) {
243235 if (!PySequence_Check (pyuvs)) {
244236 return nullptr ;
@@ -268,8 +260,7 @@ PyObject *KX_MeshBuilderSlot::PyAddVertex(PyObject *args, PyObject *kwds)
268260 }
269261 }
270262
271- const unsigned index = m_array->AddVertex (pos, normal, tangent, uvs, colors);
272- m_vertexInfos.emplace_back (m_origIndexCounter++, false );
263+ const unsigned index = m_array->AddVertex (pos, normal, tangent, uvs, colors, m_origIndexCounter++, 0 );
273264
274265 return PyLong_FromLong (index);
275266}
@@ -281,7 +272,7 @@ PyObject *KX_MeshBuilderSlot::PyAddIndex(PyObject *value)
281272 return nullptr ;
282273 }
283274
284- const bool isTriangle = (m_primitive == RAS_DisplayArray::TRIANGLES);
275+ const bool isTriangle = (m_array-> GetPrimitiveType () == RAS_DisplayArray::TRIANGLES);
285276
286277 for (unsigned int i = 0 , size = PySequence_Size (value); i < size; ++i) {
287278 const int val = PyLong_AsLong (PySequence_GetItem (value, i));
@@ -291,9 +282,9 @@ PyObject *KX_MeshBuilderSlot::PyAddIndex(PyObject *value)
291282 return nullptr ;
292283 }
293284
294- m_primitiveIndices. push_back (val);
285+ m_array-> AddPrimitiveIndex (val);
295286 if (isTriangle) {
296- m_triangleIndices. push_back (val);
287+ m_array-> AddTriangleIndex (val);
297288 }
298289 }
299290
@@ -315,7 +306,7 @@ PyObject *KX_MeshBuilderSlot::PyAddPrimitiveIndex(PyObject *value)
315306 return nullptr ;
316307 }
317308
318- m_primitiveIndices. push_back (val);
309+ m_array-> AddPrimitiveIndex (val);
319310 }
320311
321312 Py_RETURN_NONE;
@@ -336,29 +327,20 @@ PyObject *KX_MeshBuilderSlot::PyAddTriangleIndex(PyObject *value)
336327 return nullptr ;
337328 }
338329
339- m_triangleIndices. push_back (val);
330+ m_array-> AddTriangleIndex (val);
340331 }
341332
342333 Py_RETURN_NONE;
343334}
344335
345- template <class ListType >
346- static PyObject *removeDataCheck (ListType& list, int start, int end, const std::string& errmsg)
336+ static bool removeDataCheck (int start, int end, unsigned int size, const std::string& errmsg)
347337{
348- const int size = list.size ();
349- if (start >= size || (end != -1 && (end > size || end < start))) {
350- PyErr_Format (PyExc_TypeError, " %s: range invalid, must be included in [0, %i[" , errmsg.c_str (), size);
351- return nullptr ;
352- }
353-
354- if (end == -1 ) {
355- list.erase (list.begin () + start);
356- }
357- else {
358- list.erase (list.begin () + start, list.begin () + end);
338+ if (start < 0 || start >= size || (end != -1 && (end > size || end <= start))) {
339+ PyErr_Format (PyExc_TypeError, " %s: range invalid or empty, must be included in [0, %i[" , errmsg.c_str (), size);
340+ return false ;
359341 }
360342
361- Py_RETURN_NONE ;
343+ return true ;
362344}
363345
364346PyObject *KX_MeshBuilderSlot::PyRemoveVertex (PyObject *args)
@@ -370,7 +352,13 @@ PyObject *KX_MeshBuilderSlot::PyRemoveVertex(PyObject *args)
370352 return nullptr ;
371353 }
372354
373- return removeDataCheck (m_vertices, start, end, " slot.removeVertex(start, end)" );
355+ if (!removeDataCheck (start, end, m_array->GetVertexCount (), " slot.removeVertex(start, end)" )) {
356+ return nullptr ;
357+ }
358+
359+ m_array->RemoveVertex (start, end);
360+
361+ Py_RETURN_NONE;
374362}
375363
376364PyObject *KX_MeshBuilderSlot::PyRemovePrimitiveIndex (PyObject *args)
@@ -382,7 +370,13 @@ PyObject *KX_MeshBuilderSlot::PyRemovePrimitiveIndex(PyObject *args)
382370 return nullptr ;
383371 }
384372
385- return removeDataCheck (m_vertices, start, end, " slot.removePrimitiveIndex(start, end)" );
373+ if (!removeDataCheck (start, end, m_array->GetPrimitiveIndexCount (), " slot.removePrimitiveIndex(start, end)" )) {
374+ return nullptr ;
375+ }
376+
377+ m_array->RemovePrimitiveIndex (start, end);
378+
379+ Py_RETURN_NONE;
386380}
387381
388382PyObject *KX_MeshBuilderSlot::PyRemoveTriangleIndex (PyObject *args)
@@ -394,7 +388,13 @@ PyObject *KX_MeshBuilderSlot::PyRemoveTriangleIndex(PyObject *args)
394388 return nullptr ;
395389 }
396390
397- return removeDataCheck (m_vertices, start, end, " slot.removeTriangleIndex(start, end)" );
391+ if (!removeDataCheck (start, end, m_array->GetTriangleIndexCount (), " slot.removeTriangleIndex(start, end)" )) {
392+ return nullptr ;
393+ }
394+
395+ m_array->RemoveTriangleIndex (start, end);
396+
397+ Py_RETURN_NONE;
398398}
399399
400400PyObject *KX_MeshBuilderSlot::PyRecalculateNormals ()
@@ -404,31 +404,30 @@ PyObject *KX_MeshBuilderSlot::PyRecalculateNormals()
404404 return nullptr ;
405405 }
406406
407- for (RAS_IVertexData *data : m_vertices) {
408- zero_v3 (data->normal );
409- }
407+ std::vector<mt::vec3, mt::simd_allocator<mt::vec3> > normals (m_array->GetVertexCount (), mt::zero3);
410408
411- for (unsigned int i = 0 , size = m_primitiveIndices. size (); i < size; i += 3 ) {
409+ for (unsigned int i = 0 , size = m_array-> GetPrimitiveIndexCount (); i < size; i += 3 ) {
412410 float normal[3 ];
413411 normal_tri_v3 (normal,
414- m_vertices[m_primitiveIndices[i]]-> position ,
415- m_vertices[m_primitiveIndices[ i + 1 ]]-> position ,
416- m_vertices[m_primitiveIndices[ i + 2 ]]-> position );
412+ m_array-> GetPosition (m_array-> GetPrimitiveIndex (i)). data ,
413+ m_array-> GetPosition (m_array-> GetPrimitiveIndex ( i + 1 )). data ,
414+ m_array-> GetPosition (m_array-> GetPrimitiveIndex ( i + 2 )). data );
417415
416+ const mt::vec3 vnormal (normal);
418417 for (unsigned short j = 0 ; j < 3 ; ++j) {
419- add_v3_v3 (m_vertices[m_primitiveIndices[ i + j]]-> normal , normal) ;
418+ normals[m_array-> GetPrimitiveIndex ( i + j)] += vnormal ;
420419 }
421420 }
422421
423- for (RAS_IVertexData *data : m_vertices ) {
424- normalize_v3 (data-> normal );
422+ for (unsigned int i = 0 , size = normals. size (); i < size; ++i ) {
423+ m_array-> SetNormal (i, normals[i]. SafeNormalized (mt::zero3) );
425424 }
426425
427426 Py_RETURN_NONE;
428427}
429428
430429KX_MeshBuilder::KX_MeshBuilder (const std::string& name, KX_Scene *scene, const RAS_Mesh::LayersInfo& layersInfo,
431- const RAS_VertexFormat & format)
430+ const RAS_DisplayArray::Format & format)
432431 :m_name(name),
433432 m_layersInfo(layersInfo),
434433 m_format(format),
@@ -520,7 +519,7 @@ static PyObject *py_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
520519 return nullptr ;
521520 }
522521
523- RAS_VertexFormat format{(uint8_t )max_ii (layersInfo.uvLayers .size (), 1 ), (uint8_t )max_ii (layersInfo.colorLayers .size (), 1 )};
522+ RAS_DisplayArray::Format format{(uint8_t )max_ii (layersInfo.uvLayers .size (), 1 ), (uint8_t )max_ii (layersInfo.colorLayers .size (), 1 )};
524523
525524 KX_MeshBuilder *builder = new KX_MeshBuilder (name, scene, layersInfo, format);
526525
0 commit comments