#include "meshops.h" MeshOps *MeshOps::get_singleton() { static MeshOps *mo = NULL; if (!mo) mo = memnew(MeshOps); return mo; } Array MeshOps::merge_meshes(const Array &surfaces, const Array &xforms) const { int i; Array ret; ret.resize(Mesh::ARRAY_MAX); int surface_count = surfaces.size(); PoolVector cur_index; PoolVector cur_vertex; PoolVector cur_normal; PoolVector cur_uv; for (i = 0; i < surface_count; i++) { int icount, count, j, k, st; const Array &sts = surfaces[i]; for (st = 0; st < sts.size(); st++) { const Array &s = sts[st]; const PoolVector &index = s[Mesh::ARRAY_INDEX]; const PoolVector &vertex = s[Mesh::ARRAY_VERTEX]; const PoolVector &normal = s[Mesh::ARRAY_NORMAL]; const PoolVector &uv = s[Mesh::ARRAY_TEX_UV]; icount = cur_index.size(); count = cur_vertex.size(); const Transform &xform = xforms[i]; for (j = 0; j < Mesh::ARRAY_MAX; j++) { switch (j) { case Mesh::ARRAY_INDEX: cur_index.append_array(index); for (k = 0; k < index.size(); k++) cur_index.write()[k + icount] = cur_index.read()[k + icount] + count; break; case Mesh::ARRAY_VERTEX: cur_vertex.append_array(vertex); for (k = 0; k < vertex.size(); k++) cur_vertex.write()[k + count] = xform.xform( cur_vertex.read() [k + count]); break; case Mesh::ARRAY_NORMAL: cur_normal.append_array(normal); /* all sizes except index are the same */ for (k = 0; k < vertex.size(); k++) cur_normal.write()[k + count] = xform.basis.xform( cur_normal.read() [k + count]); break; case Mesh::ARRAY_TEX_UV: cur_uv.append_array(uv); } } } } ret[Mesh::ARRAY_INDEX] = cur_index; ret[Mesh::ARRAY_VERTEX] = cur_vertex; ret[Mesh::ARRAY_NORMAL] = cur_normal; ret[Mesh::ARRAY_TEX_UV] = cur_uv; return ret; } void MeshOps::_bind_methods() { ClassDB::bind_method(D_METHOD("merge_meshes", "surfaces", "xforms"), &MeshOps::merge_meshes); }