Skip to content

Commit 36715ec

Browse files
committed
Add incremental mesh builder via KX_MeshBuilder.FromMesh(name, mesh).
1 parent 2722c30 commit 36715ec

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

source/gameengine/Ketsji/KX_Mesh.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ KX_Mesh::~KX_Mesh()
8484
{
8585
}
8686

87+
KX_Scene *KX_Mesh::GetScene() const
88+
{
89+
return m_scene;
90+
}
91+
8792
void KX_Mesh::ReplaceScene(KX_Scene *scene)
8893
{
8994
m_scene = scene;

source/gameengine/Ketsji/KX_Mesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class KX_Mesh : public EXP_Value, public BL_Resource, public RAS_Mesh
6464
// stuff for cvalue related things
6565
virtual std::string GetName();
6666

67+
KX_Scene *GetScene() const;
6768
void ReplaceScene(KX_Scene *scene);
6869

6970
#ifdef WITH_PYTHON

source/gameengine/Ketsji/KX_MeshBuilder.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2649
KX_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+
417453
KX_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+
494549
PyTypeObject KX_MeshBuilder::Type = {
495550
PyVarObject_HEAD_INIT(nullptr, 0)
496551
"KX_MeshBuilder",
@@ -514,6 +569,7 @@ PyTypeObject KX_MeshBuilder::Type = {
514569
};
515570

516571
PyMethodDef 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

source/gameengine/Ketsji/KX_MeshBuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class KX_MeshBuilderSlot : public EXP_Value
2626
public:
2727
KX_MeshBuilderSlot(KX_BlenderMaterial *material, RAS_DisplayArray::PrimitiveType primitiveType,
2828
const RAS_DisplayArray::Format& format, unsigned int& origIndexCounter);
29+
KX_MeshBuilderSlot(RAS_MeshMaterial *meshmat, const RAS_VertexFormat& format, unsigned int& origIndexCounter);
2930
~KX_MeshBuilderSlot();
3031

3132
virtual std::string GetName();
@@ -96,6 +97,7 @@ class KX_MeshBuilder : public EXP_Value
9697
public:
9798
KX_MeshBuilder(const std::string& name, KX_Scene *scene, const RAS_Mesh::LayersInfo& layersInfo,
9899
const RAS_DisplayArray::Format& format);
100+
KX_MeshBuilder(const std::string& name, KX_Mesh *mesh);
99101
~KX_MeshBuilder();
100102

101103
virtual std::string GetName();

0 commit comments

Comments
 (0)