@@ -23,6 +23,29 @@ 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)
30+ {
31+ 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 ();
36+
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+ }
44+
45+ // Compute the maximum original index from the arrays.
46+ m_origIndexCounter = std::max (m_origIndexCounter, array->GetMaxOrigIndex ());
47+ }
48+
2649KX_MeshBuilderSlot::~KX_MeshBuilderSlot ()
2750{
2851}
@@ -414,6 +437,19 @@ KX_MeshBuilder::KX_MeshBuilder(const std::string& name, KX_Scene *scene, const R
414437{
415438}
416439
440+ KX_MeshBuilder::KX_MeshBuilder (const std::string& name, KX_Mesh *mesh)
441+ :m_name(name),
442+ m_layersInfo(mesh->GetLayersInfo ()),
443+ m_scene(mesh->GetScene ())
444+ {
445+ m_format = {(uint8_t )max_ii (m_layersInfo.uvLayers .size (), 1 ), (uint8_t )max_ii (m_layersInfo.colorLayers .size (), 1 )};
446+
447+ for (RAS_MeshMaterial *meshmat : mesh->GetMeshMaterialList ()) {
448+ KX_MeshBuilderSlot *slot = new KX_MeshBuilderSlot (meshmat, m_format, m_origIndexCounter);
449+ m_slots.Add (slot);
450+ }
451+ }
452+
417453KX_MeshBuilder::~KX_MeshBuilder ()
418454{
419455}
@@ -491,6 +527,25 @@ static PyObject *py_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
491527 return builder->NewProxy (true );
492528}
493529
530+ static PyObject *py_new_from_mesh (PyObject *UNUSED (self), PyObject *args)
531+ {
532+ PyObject *pymesh;
533+ const char *name;
534+
535+ if (!PyArg_ParseTuple (args, " sO:FromMesh" , &name, &pymesh)) {
536+ return nullptr ;
537+ }
538+
539+ KX_Mesh *mesh;
540+ if (!ConvertPythonToMesh (KX_GetActiveScene ()->GetLogicManager (), pymesh, &mesh, false , " KX_MeshBuilder.FromMesh" )) {
541+ return nullptr ;
542+ }
543+
544+ KX_MeshBuilder *builder = new KX_MeshBuilder (name, mesh);
545+
546+ return builder->NewProxy (true );
547+ }
548+
494549PyTypeObject KX_MeshBuilder::Type = {
495550 PyVarObject_HEAD_INIT (nullptr , 0 )
496551 " KX_MeshBuilder" ,
@@ -514,6 +569,7 @@ PyTypeObject KX_MeshBuilder::Type = {
514569};
515570
516571PyMethodDef KX_MeshBuilder::Methods[] = {
572+ {" FromMesh" , (PyCFunction)py_new_from_mesh, METH_STATIC | METH_VARARGS},
517573 {" addSlot" , (PyCFunction)KX_MeshBuilder::sPyAddSlot , METH_VARARGS | METH_KEYWORDS},
518574 {" finish" , (PyCFunction)KX_MeshBuilder::sPyFinish , METH_NOARGS},
519575 {nullptr , nullptr } // Sentinel
0 commit comments