@@ -23,27 +23,19 @@ KX_MeshBuilderSlot::KX_MeshBuilderSlot(KX_BlenderMaterial *material, RAS_Display
23
23
{
24
24
}
25
25
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)
30
29
{
31
30
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 ());
36
32
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);
44
36
45
37
// 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 ());
47
39
}
48
40
49
41
KX_MeshBuilderSlot::~KX_MeshBuilderSlot ()
@@ -226,19 +218,19 @@ PyObject *KX_MeshBuilderSlot::PyAddVertex(PyObject *args, PyObject *kwds)
226
218
return nullptr ;
227
219
}
228
220
229
- mt::vec3_packed normal = mt::axisZ3;
221
+ mt::vec3_packed normal = mt::vec3_packed (mt:: axisZ3) ;
230
222
if (pynormal && !PyVecTo (pynormal, normal)) {
231
223
return nullptr ;
232
224
}
233
225
234
- mt::vec4_packed tangent = mt::one4;
226
+ mt::vec4_packed tangent = mt::vec4_packed (mt:: one4) ;
235
227
if (pytangent && !PyVecTo (pytangent, tangent)) {
236
228
return nullptr ;
237
229
}
238
230
239
231
const RAS_DisplayArray::Format& format = m_array->GetFormat ();
240
232
241
- mt::vec2_packed uvs[RAS_Texture::MaxUnits] = {mt::zero2};
233
+ mt::vec2_packed uvs[RAS_Texture::MaxUnits] = {mt::vec2_packed (mt:: zero2) };
242
234
if (pyuvs) {
243
235
if (!PySequence_Check (pyuvs)) {
244
236
return nullptr ;
@@ -268,8 +260,7 @@ PyObject *KX_MeshBuilderSlot::PyAddVertex(PyObject *args, PyObject *kwds)
268
260
}
269
261
}
270
262
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 );
273
264
274
265
return PyLong_FromLong (index);
275
266
}
@@ -281,7 +272,7 @@ PyObject *KX_MeshBuilderSlot::PyAddIndex(PyObject *value)
281
272
return nullptr ;
282
273
}
283
274
284
- const bool isTriangle = (m_primitive == RAS_DisplayArray::TRIANGLES);
275
+ const bool isTriangle = (m_array-> GetPrimitiveType () == RAS_DisplayArray::TRIANGLES);
285
276
286
277
for (unsigned int i = 0 , size = PySequence_Size (value); i < size; ++i) {
287
278
const int val = PyLong_AsLong (PySequence_GetItem (value, i));
@@ -291,9 +282,9 @@ PyObject *KX_MeshBuilderSlot::PyAddIndex(PyObject *value)
291
282
return nullptr ;
292
283
}
293
284
294
- m_primitiveIndices. push_back (val);
285
+ m_array-> AddPrimitiveIndex (val);
295
286
if (isTriangle) {
296
- m_triangleIndices. push_back (val);
287
+ m_array-> AddTriangleIndex (val);
297
288
}
298
289
}
299
290
@@ -315,7 +306,7 @@ PyObject *KX_MeshBuilderSlot::PyAddPrimitiveIndex(PyObject *value)
315
306
return nullptr ;
316
307
}
317
308
318
- m_primitiveIndices. push_back (val);
309
+ m_array-> AddPrimitiveIndex (val);
319
310
}
320
311
321
312
Py_RETURN_NONE;
@@ -336,29 +327,20 @@ PyObject *KX_MeshBuilderSlot::PyAddTriangleIndex(PyObject *value)
336
327
return nullptr ;
337
328
}
338
329
339
- m_triangleIndices. push_back (val);
330
+ m_array-> AddTriangleIndex (val);
340
331
}
341
332
342
333
Py_RETURN_NONE;
343
334
}
344
335
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)
347
337
{
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 ;
359
341
}
360
342
361
- Py_RETURN_NONE ;
343
+ return true ;
362
344
}
363
345
364
346
PyObject *KX_MeshBuilderSlot::PyRemoveVertex (PyObject *args)
@@ -370,7 +352,13 @@ PyObject *KX_MeshBuilderSlot::PyRemoveVertex(PyObject *args)
370
352
return nullptr ;
371
353
}
372
354
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;
374
362
}
375
363
376
364
PyObject *KX_MeshBuilderSlot::PyRemovePrimitiveIndex (PyObject *args)
@@ -382,7 +370,13 @@ PyObject *KX_MeshBuilderSlot::PyRemovePrimitiveIndex(PyObject *args)
382
370
return nullptr ;
383
371
}
384
372
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;
386
380
}
387
381
388
382
PyObject *KX_MeshBuilderSlot::PyRemoveTriangleIndex (PyObject *args)
@@ -394,7 +388,13 @@ PyObject *KX_MeshBuilderSlot::PyRemoveTriangleIndex(PyObject *args)
394
388
return nullptr ;
395
389
}
396
390
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;
398
398
}
399
399
400
400
PyObject *KX_MeshBuilderSlot::PyRecalculateNormals ()
@@ -404,31 +404,30 @@ PyObject *KX_MeshBuilderSlot::PyRecalculateNormals()
404
404
return nullptr ;
405
405
}
406
406
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);
410
408
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 ) {
412
410
float normal[3 ];
413
411
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 );
417
415
416
+ const mt::vec3 vnormal (normal);
418
417
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 ;
420
419
}
421
420
}
422
421
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) );
425
424
}
426
425
427
426
Py_RETURN_NONE;
428
427
}
429
428
430
429
KX_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)
432
431
:m_name(name),
433
432
m_layersInfo(layersInfo),
434
433
m_format(format),
@@ -520,7 +519,7 @@ static PyObject *py_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
520
519
return nullptr ;
521
520
}
522
521
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 )};
524
523
525
524
KX_MeshBuilder *builder = new KX_MeshBuilder (name, scene, layersInfo, format);
526
525
0 commit comments