832 for (
size_t i = 0; i < Submeshes.size(); i++)
838 for (
int j = 0; j <
Parent->GetClientCount(); j++)
840 for (
size_t k = 0; k <
Parent->GetClient(j)->Walls.size(); k++)
842 if (!
Parent->GetClient(j)->Walls[k])
845 for (
int l = 0; l <
Parent->GetClient(j)->Walls[k]->GetPolygonCount(); l++)
847 Polygon *poly =
Parent->GetClient(j)->Walls[k]->GetPolygon(l);
851 if (poly->
material == Submeshes[i].material)
862 if (!
Parent->GetClient(client))
865 for (
size_t k = 0; k <
Parent->GetClient(client)->Walls.size(); k++)
867 if (!
Parent->GetClient(client)->Walls[k])
870 for (
int l = 0; l <
Parent->GetClient(client)->Walls[k]->GetPolygonCount(); l++)
872 Polygon *poly =
Parent->GetClient(client)->Walls[k]->GetPolygon(l);
876 if (poly->
material == Submeshes[i].material)
887 MeshWrapper->destroySubMesh((
unsigned short)i);
888 Submeshes.erase(Submeshes.begin() + i);
893 else if (index >= 0 && index < (
int)Submeshes.size())
895 MeshWrapper->destroySubMesh(index);
896 Submeshes.erase(Submeshes.begin() + index);
916 unsigned int vertex_count =
Parent->GetVertexCount(
"", client);
918 std::vector<std::string> materials;
919 int submesh_count =
Parent->GetMaterials(materials, client);
922 if (submesh_count == 0 || vertex_count == 0)
924 if (MeshWrapper->sharedVertexData)
925 delete MeshWrapper->sharedVertexData;
926 MeshWrapper->sharedVertexData =
new Ogre::VertexData();
929 for (
size_t i = 0; i < Submeshes.size(); i++)
931 DeleteSubMesh(-1, (
int)i);
938 if (submesh_count < (
int)Submeshes.size())
939 submesh_count = (int)Submeshes.size();
942 int end =
Parent->GetClientCount() - 1;
950 size_t previous_count = 0;
952 if (process_vertices ==
true)
955 if (MeshWrapper->sharedVertexData)
957 previous_count = MeshWrapper->sharedVertexData->vertexCount;
958 delete MeshWrapper->sharedVertexData;
960 Ogre::VertexData* data =
new Ogre::VertexData();
961 MeshWrapper->sharedVertexData = data;
962 data->vertexCount = vertex_count;
963 Ogre::VertexDeclaration* decl = data->vertexDeclaration;
967 decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
968 offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
969 decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
970 offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
971 decl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);
974 float *mVertexElements =
new float[vertex_count * 8];
977 unsigned int loc = 0;
978 unsigned int vindex = 0;
981 for (
size_t i = 0; i < client_entries.size(); i++)
983 delete client_entries[i].bounds;
985 client_entries.clear();
987 for (
int num = start; num <= end; num++)
990 Ogre::AxisAlignedBox client_box;
1002 for (
size_t index = 0; index < mesh->
Walls.size(); index++)
1004 if (!mesh->
Walls[index])
1007 for (
size_t i = 0; i < mesh->
Walls[index]->GetPolygonCount(); i++)
1014 for (
size_t j = 0; j < poly->
geometry.size(); j++)
1016 for (
size_t k = 0; k < poly->
geometry[j].size(); k++)
1031 mVertexElements[loc] = (float)vertex.x;
1032 mVertexElements[loc + 1] = (float)vertex.y;
1033 mVertexElements[loc + 2] = (float)vertex.z;
1034 mVertexElements[loc + 3] = (float)element.
normal.x;
1035 mVertexElements[loc + 4] = (float)element.
normal.y;
1036 mVertexElements[loc + 5] = (float)element.
normal.z;
1037 mVertexElements[loc + 6] = (float)element.
texel.x;
1038 mVertexElements[loc + 7] = (float)element.
texel.y;
1039 client_box.merge(vertex);
1040 radius = std::max(radius, vertex.length());
1048 entry.
bounds =
new Ogre::AxisAlignedBox(client_box);
1056 client_entries.emplace_back(entry);
1060 Ogre::HardwareVertexBufferSharedPtr vbuffer;
1061 if (
Parent->UseDynamicBuffers() ==
false)
1062 vbuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(0), vertex_count, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
1064 vbuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(0), vertex_count, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);
1066 vbuffer->writeData(0, vbuffer->getSizeInBytes(), mVertexElements,
true);
1067 delete [] mVertexElements;
1070 data->vertexBufferBinding->setBinding(0, vbuffer);
1074 for (
int index = 0; index < submesh_count; index++)
1076 std::string material;
1077 if (index < (
int)materials.size())
1078 material = materials[index];
1084 unsigned int triangle_count = 0;
1087 triangle_count =
Parent->GetTriangleCount(material, client_count, client);
1090 int match = FindMatchingSubMesh(material);
1093 if (triangle_count == 0)
1096 DeleteSubMesh(client, -1);
1102 submesh = CreateSubMesh(material);
1104 submesh = &Submeshes[match];
1110 if (client_count == submesh->
clients && process_vertices ==
false)
1117 unsigned int isize = triangle_count * 3;
1118 Ogre::HardwareIndexBufferSharedPtr ibuffer;
1121 if (vertex_count > 65536)
1124 unsigned int *mIndices =
new unsigned int[isize];
1127 unsigned int loc = 0;
1130 for (
int num = start; num <= end; num++)
1136 for (
size_t i = 0; i < mesh->
Walls.size(); i++)
1138 if (!mesh->
Walls[i])
1141 for (
size_t j = 0; j < mesh->
Walls[i]->GetPolygonCount(); j++)
1151 unsigned int offset =
Parent->GetIndexOffset(mesh);
1154 for (
size_t k = 0; k < poly->
triangles.size(); k++)
1157 mIndices[loc] = poly_index + tri.
a + offset;
1158 mIndices[loc + 1] = poly_index + tri.
b + offset;
1159 mIndices[loc + 2] = poly_index + tri.
c + offset;
1173 ibuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_32BIT, isize, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
1176 ibuffer->writeData(0, ibuffer->getSizeInBytes(), mIndices,
true);
1182 unsigned short *mIndices =
new unsigned short[isize];
1185 unsigned int loc = 0;
1188 for (
int num = start; num <= end; num++)
1194 for (
size_t i = 0; i < mesh->
Walls.size(); i++)
1196 if (!mesh->
Walls[i])
1199 for (
size_t j = 0; j < mesh->
Walls[i]->GetPolygonCount(); j++)
1209 unsigned int offset =
Parent->GetIndexOffset(mesh);
1212 for (
size_t k = 0; k < poly->
triangles.size(); k++)
1215 mIndices[loc] = poly_index + tri.
a + offset;
1216 mIndices[loc + 1] = poly_index + tri.
b + offset;
1217 mIndices[loc + 2] = poly_index + tri.
c + offset;
1231 ibuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT, isize, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
1234 ibuffer->writeData(0, ibuffer->getSizeInBytes(), mIndices,
true);
1239 if (submesh->
object->indexData)
1241 delete submesh->
object->indexData;
1242 submesh->
object->indexData =
new Ogre::IndexData();
1246 submesh->
object->indexData->indexCount = isize;
1247 submesh->
object->indexData->indexBuffer = ibuffer;
1248 submesh->
object->indexData->indexStart = 0;
1252 MeshWrapper->_dirtyState();
1254 if (process_vertices ==
true)
1256 UpdateBoundingBox();
1258 MeshWrapper->load();
1261 if (previous_count == 0 && enabled ==
true)
1315 if (
Parent->UseDynamicBuffers() ==
false || !
node)
1321 if (!
Parent->GetClient(client))
1324 bool combined =
true;
1325 if (
Parent->GetMeshCount() > 1)
1329 unsigned int loc = 0;
1330 if (combined ==
true)
1331 loc = client_entries[client].vertex_offset;
1341 if (vertex_count == 0 || mesh->
Walls.size() == 0)
1345 float *mVertexElements;
1347 mVertexElements =
new float[8];
1349 mVertexElements =
new float[vertex_count * 8];
1351 if (single ==
false)
1355 if (combined ==
true)
1356 count = client_entries[client].vertex_count;
1358 count = client_entries[0].vertex_count;
1360 if (count != vertex_count)
1362 delete [] mVertexElements;
1367 Ogre::AxisAlignedBox box;
1370 unsigned int pos = 0;
1371 unsigned int add = 0;
1373 for (
size_t i = 0; i < mesh->
Walls.size(); i++)
1375 if (!mesh->
Walls[i])
1379 if (mesh->
Walls[i]->GetPolygonCount() == 0)
1382 for (
size_t j = 0; j < mesh->
Walls[i]->GetPolygonCount(); j++)
1392 if (poly != polygon)
1396 for (
size_t k = 0; k < poly->
geometry.size(); k++)
1398 for (
size_t l = 0; l < poly->
geometry[k].size(); l++)
1407 mVertexElements[pos] = (float)vertex2.x;
1408 mVertexElements[pos + 1] = (float)vertex2.y;
1409 mVertexElements[pos + 2] = (float)vertex2.z;
1410 mVertexElements[pos + 3] = (float)element.
normal.x;
1411 mVertexElements[pos + 4] = (float)element.
normal.y;
1412 mVertexElements[pos + 5] = (float)element.
normal.z;
1413 mVertexElements[pos + 6] = (float)element.
texel.x;
1414 mVertexElements[pos + 7] = (float)element.
texel.y;
1424 if (combined ==
true)
1425 *client_entries[client].bounds = box;
1427 *client_entries[0].bounds = box;
1430 Ogre::VertexData* data = MeshWrapper->sharedVertexData;
1433 Ogre::HardwareVertexBufferSharedPtr vbuffer = data->vertexBufferBinding->getBuffer(0);
1434 size_t vsize = data->vertexDeclaration->getVertexSize(0);
1451 vbuffer->writeData(vsize * loc, vsize * add, mVertexElements,
false);
1453 delete [] mVertexElements;
1456 UpdateBoundingBox();
Ogre::MaterialPtr GetMaterialByName(const std::string &name, const std::string &group="General")