838 for (
size_t i = 0; i < Submeshes.size(); i++)
844 for (
int j = 0; j <
Parent->GetClientCount(); j++)
846 for (
size_t k = 0; k <
Parent->GetClient(j)->Walls.size(); k++)
848 if (!
Parent->GetClient(j)->Walls[k])
851 for (
int l = 0; l <
Parent->GetClient(j)->Walls[k]->GetPolygonCount(); l++)
853 Polygon *poly =
Parent->GetClient(j)->Walls[k]->GetPolygon(l);
857 if (poly->
material == Submeshes[i].material)
868 if (!
Parent->GetClient(client))
871 for (
size_t k = 0; k <
Parent->GetClient(client)->Walls.size(); k++)
873 if (!
Parent->GetClient(client)->Walls[k])
876 for (
int l = 0; l <
Parent->GetClient(client)->Walls[k]->GetPolygonCount(); l++)
878 Polygon *poly =
Parent->GetClient(client)->Walls[k]->GetPolygon(l);
882 if (poly->
material == Submeshes[i].material)
893 MeshWrapper->destroySubMesh((
unsigned short)i);
894 Submeshes.erase(Submeshes.begin() + i);
899 else if (index >= 0 && index < (
int)Submeshes.size())
901 MeshWrapper->destroySubMesh(index);
902 Submeshes.erase(Submeshes.begin() + index);
922 unsigned int vertex_count =
Parent->GetVertexCount(
"", client);
924 std::vector<std::string> materials;
925 int submesh_count =
Parent->GetMaterials(materials, client);
928 if (submesh_count == 0 || vertex_count == 0)
930 if (MeshWrapper->sharedVertexData)
931 delete MeshWrapper->sharedVertexData;
932 MeshWrapper->sharedVertexData =
new Ogre::VertexData();
935 for (
size_t i = 0; i < Submeshes.size(); i++)
937 DeleteSubMesh(-1, (
int)i);
944 if (submesh_count < (
int)Submeshes.size())
945 submesh_count = (int)Submeshes.size();
948 int end =
Parent->GetClientCount() - 1;
956 size_t previous_count = 0;
958 if (process_vertices ==
true)
961 if (MeshWrapper->sharedVertexData)
963 previous_count = MeshWrapper->sharedVertexData->vertexCount;
964 delete MeshWrapper->sharedVertexData;
966 Ogre::VertexData* data =
new Ogre::VertexData();
967 MeshWrapper->sharedVertexData = data;
968 data->vertexCount = vertex_count;
969 Ogre::VertexDeclaration* decl = data->vertexDeclaration;
973 decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
974 offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
975 decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
976 offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
977 decl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);
980 float *mVertexElements =
new float[vertex_count * 8];
983 unsigned int loc = 0;
984 unsigned int vindex = 0;
987 for (
size_t i = 0; i < client_entries.size(); i++)
989 delete client_entries[i].bounds;
991 client_entries.clear();
993 for (
int num = start; num <= end; num++)
996 Ogre::AxisAlignedBox client_box;
1008 for (
size_t index = 0; index < mesh->
Walls.size(); index++)
1010 if (!mesh->
Walls[index])
1013 for (
size_t i = 0; i < mesh->
Walls[index]->GetPolygonCount(); i++)
1020 for (
size_t j = 0; j < poly->
geometry.size(); j++)
1022 for (
size_t k = 0; k < poly->
geometry[j].size(); k++)
1037 mVertexElements[loc] = (float)vertex.x;
1038 mVertexElements[loc + 1] = (float)vertex.y;
1039 mVertexElements[loc + 2] = (float)vertex.z;
1040 mVertexElements[loc + 3] = (float)element.
normal.x;
1041 mVertexElements[loc + 4] = (float)element.
normal.y;
1042 mVertexElements[loc + 5] = (float)element.
normal.z;
1043 mVertexElements[loc + 6] = (float)element.
texel.x;
1044 mVertexElements[loc + 7] = (float)element.
texel.y;
1045 client_box.merge(vertex);
1046 radius = std::max(radius, vertex.length());
1054 entry.
bounds =
new Ogre::AxisAlignedBox(client_box);
1062 client_entries.emplace_back(entry);
1066 Ogre::HardwareVertexBufferSharedPtr vbuffer;
1067 if (
Parent->UseDynamicBuffers() ==
false)
1068 vbuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(0), vertex_count, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
1070 vbuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(0), vertex_count, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);
1072 vbuffer->writeData(0, vbuffer->getSizeInBytes(), mVertexElements,
true);
1073 delete [] mVertexElements;
1076 data->vertexBufferBinding->setBinding(0, vbuffer);
1080 for (
int index = 0; index < submesh_count; index++)
1082 std::string material;
1083 if (index < (
int)materials.size())
1084 material = materials[index];
1090 unsigned int triangle_count = 0;
1093 triangle_count =
Parent->GetTriangleCount(material, client_count, client);
1096 int match = FindMatchingSubMesh(material);
1099 if (triangle_count == 0)
1102 DeleteSubMesh(client, -1);
1108 submesh = CreateSubMesh(material);
1110 submesh = &Submeshes[match];
1116 if (client_count == submesh->
clients && process_vertices ==
false)
1123 unsigned int isize = triangle_count * 3;
1124 Ogre::HardwareIndexBufferSharedPtr ibuffer;
1127 if (vertex_count > 65536)
1130 unsigned int *mIndices =
new unsigned int[isize];
1133 unsigned int loc = 0;
1136 for (
int num = start; num <= end; num++)
1142 for (
size_t i = 0; i < mesh->
Walls.size(); i++)
1144 if (!mesh->
Walls[i])
1147 for (
size_t j = 0; j < mesh->
Walls[i]->GetPolygonCount(); j++)
1157 unsigned int offset =
Parent->GetIndexOffset(mesh);
1160 for (
size_t k = 0; k < poly->
triangles.size(); k++)
1163 mIndices[loc] = poly_index + tri.
a + offset;
1164 mIndices[loc + 1] = poly_index + tri.
b + offset;
1165 mIndices[loc + 2] = poly_index + tri.
c + offset;
1179 ibuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_32BIT, isize, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
1182 ibuffer->writeData(0, ibuffer->getSizeInBytes(), mIndices,
true);
1188 unsigned short *mIndices =
new unsigned short[isize];
1191 unsigned int loc = 0;
1194 for (
int num = start; num <= end; num++)
1200 for (
size_t i = 0; i < mesh->
Walls.size(); i++)
1202 if (!mesh->
Walls[i])
1205 for (
size_t j = 0; j < mesh->
Walls[i]->GetPolygonCount(); j++)
1215 unsigned int offset =
Parent->GetIndexOffset(mesh);
1218 for (
size_t k = 0; k < poly->
triangles.size(); k++)
1221 mIndices[loc] = poly_index + tri.
a + offset;
1222 mIndices[loc + 1] = poly_index + tri.
b + offset;
1223 mIndices[loc + 2] = poly_index + tri.
c + offset;
1237 ibuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT, isize, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
1240 ibuffer->writeData(0, ibuffer->getSizeInBytes(), mIndices,
true);
1245 if (submesh->
object->indexData)
1247 delete submesh->
object->indexData;
1248 submesh->
object->indexData =
new Ogre::IndexData();
1252 submesh->
object->indexData->indexCount = isize;
1253 submesh->
object->indexData->indexBuffer = ibuffer;
1254 submesh->
object->indexData->indexStart = 0;
1258 MeshWrapper->_dirtyState();
1260 if (process_vertices ==
true)
1262 UpdateBoundingBox();
1264 MeshWrapper->load();
1267 if (previous_count == 0 && enabled ==
true)
1321 if (
Parent->UseDynamicBuffers() ==
false || !
node)
1327 if (!
Parent->GetClient(client))
1330 bool combined =
true;
1331 if (
Parent->GetMeshCount() > 1)
1335 unsigned int loc = 0;
1336 if (combined ==
true)
1337 loc = client_entries[client].vertex_offset;
1347 if (vertex_count == 0 || mesh->
Walls.size() == 0)
1351 float *mVertexElements;
1353 mVertexElements =
new float[8];
1355 mVertexElements =
new float[vertex_count * 8];
1357 if (single ==
false)
1361 if (combined ==
true)
1362 count = client_entries[client].vertex_count;
1364 count = client_entries[0].vertex_count;
1366 if (count != vertex_count)
1368 delete [] mVertexElements;
1373 Ogre::AxisAlignedBox box;
1376 unsigned int pos = 0;
1377 unsigned int add = 0;
1379 for (
size_t i = 0; i < mesh->
Walls.size(); i++)
1381 if (!mesh->
Walls[i])
1385 if (mesh->
Walls[i]->GetPolygonCount() == 0)
1388 for (
size_t j = 0; j < mesh->
Walls[i]->GetPolygonCount(); j++)
1398 if (poly != polygon)
1402 for (
size_t k = 0; k < poly->
geometry.size(); k++)
1404 for (
size_t l = 0; l < poly->
geometry[k].size(); l++)
1413 mVertexElements[pos] = (float)vertex2.x;
1414 mVertexElements[pos + 1] = (float)vertex2.y;
1415 mVertexElements[pos + 2] = (float)vertex2.z;
1416 mVertexElements[pos + 3] = (float)element.
normal.x;
1417 mVertexElements[pos + 4] = (float)element.
normal.y;
1418 mVertexElements[pos + 5] = (float)element.
normal.z;
1419 mVertexElements[pos + 6] = (float)element.
texel.x;
1420 mVertexElements[pos + 7] = (float)element.
texel.y;
1430 if (combined ==
true)
1431 *client_entries[client].bounds = box;
1433 *client_entries[0].bounds = box;
1436 Ogre::VertexData* data = MeshWrapper->sharedVertexData;
1439 Ogre::HardwareVertexBufferSharedPtr vbuffer = data->vertexBufferBinding->getBuffer(0);
1440 size_t vsize = data->vertexDeclaration->getVertexSize(0);
1457 vbuffer->writeData(vsize * loc, vsize * add, mVertexElements,
false);
1459 delete [] mVertexElements;
1462 UpdateBoundingBox();
Ogre::MaterialPtr GetMaterialByName(const std::string &name, const std::string &group="General")