3 #include <OGRE/OgreSubEntity.h>
4 #include <OGRE/OgreRenderOperation.h>
5 #include <OGRE/OgreTextureManager.h>
6 #include <OGRE/OgreHardwarePixelBuffer.h>
7 #include <OGRE/OgrePixelFormat.h>
26 value = std::min(value, 1.0
f);
27 value = std::max(value, 0.0
f);
29 float h = value * 5.0f + 1.0f;
32 if ( !(i&1) )
f = 1 -
f;
35 if (i <= 1) r = n, g = 0, b = 1;
36 else if (i == 2) r = 0, g = n, b = 1;
37 else if (i == 3) r = 0, g = 1, b = n;
38 else if (i == 4) r = n, g = 1, b = 0;
39 else if (i >= 5) r = 1, g = n, b = 0;
41 return Ogre::ColourValue(r, g, b, 1.0
f);
49 : m_displayContext(context),
53 m_vertex_normals_enabled(false),
54 m_vertex_colors_enabled(false),
55 m_materials_enabled(false),
56 m_texture_coords_enabled(false),
57 m_normalsScalingFactor(1)
64 Ogre::SceneNode* rootNode = sceneManager->getRootSceneNode();
66 std::stringstream strstream;
67 strstream <<
"TexturedMeshScene" <<
m_random;
68 std::string sceneId = strstream.str();
69 if (sceneManager->hasSceneNode(sceneId))
72 m_sceneNode = (Ogre::SceneNode*)(rootNode->getChild(sceneId));
77 m_sceneNode = rootNode->createChildSceneNode(sceneId);
81 std::stringstream sstm;
83 m_mesh = sceneManager->createManualObject(sstm.str());
87 std::stringstream sstmNormals;
89 m_normals = sceneManager->createManualObject(sstmNormals.str());
93 std::stringstream sstmTexturedMesh;
95 m_texturedMesh = sceneManager->createManualObject(sstmTexturedMesh.str());
99 std::stringstream sstmNoTexCluMesh;
101 m_noTexCluMesh = sceneManager->createManualObject(sstmNoTexCluMesh.str());
105 std::stringstream sstmVertexCostsMesh;
118 std::stringstream sstm;
122 std::stringstream sstmNormals;
126 std::stringstream sstmTexturedMesh;
130 std::stringstream sstmNoTexCluMesh;
134 std::stringstream sstmVertexCostsMesh;
149 std::stringstream sstm;
152 Ogre::MaterialManager::getSingleton().unload(sstm.str());
153 Ogre::MaterialManager::getSingleton().remove(sstm.str());
160 Ogre::MaterialManager::getSingleton().unload(sstm.str());
161 Ogre::MaterialManager::getSingleton().remove(sstm.str());
167 Ogre::MaterialManager::getSingleton().unload(sstm.str());
168 Ogre::MaterialManager::getSingleton().remove(sstm.str());
174 Ogre::MaterialManager::getSingleton().unload(textureMaterial->getName());
175 Ogre::MaterialManager::getSingleton().remove(textureMaterial->getName());
220 Ogre::ColourValue wireframeColor,
241 if (wireframeAlpha < 1.0)
243 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
244 pass->setDepthWriteEnabled(
true);
246 pass->setPolygonMode(Ogre::PM_WIREFRAME);
247 pass->setCullingMode(Ogre::CULL_NONE);
252 Ogre::ColourValue facesColor,
266 pass->setSelfIllumination(facesColor.r, facesColor.g, facesColor.b);
271 pass->setLightingEnabled(
false);
272 pass->setDepthWriteEnabled(
true);
274 else if (facesAlpha < 1.0)
276 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
277 pass->setDepthWriteEnabled(
false);
279 pass->setPolygonMode(Ogre::PM_SOLID);
280 pass->setCullingMode(Ogre::CULL_NONE);
285 Ogre::ColourValue normalsColor,
290 pass->setSelfIllumination(normalsColor.r, normalsColor.g, normalsColor.b);
299 if (normalsAlpha < 1.0)
301 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
302 pass->setDepthWriteEnabled(
true);
304 pass->setPolygonMode(Ogre::PM_SOLID);
305 pass->setCullingMode(Ogre::CULL_NONE);
310 Ogre::ColourValue wireframeColor,
311 float wireframeAlpha,
313 Ogre::ColourValue facesColor,
315 bool useVertexColors,
316 bool showVertexCosts,
318 bool showTexturedFacesOnly,
320 Ogre::ColourValue normalsColor,
322 float normalsScalingFactor
348 this->
showFaces(tech->createPass(), facesColor, facesAlpha, useVertexColors);
370 this->
showWireframe(tech->createPass(), wireframeColor, wireframeAlpha);
378 this->
showNormals(tech->createPass(), normalsColor, normalsAlpha);
386 Ogre::VertexData* vertexData;
387 const Ogre::VertexElement* vertexElement;
388 Ogre::HardwareVertexBufferSharedPtr vertexBuffer;
389 unsigned char* vertexChar;
392 vertexData =
m_normals->getSection(0)->getRenderOperation()->vertexData;
393 vertexElement = vertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
394 vertexBuffer = vertexData->vertexBufferBinding->getBuffer(vertexElement->getSource());
395 vertexChar =
static_cast<unsigned char*
>(vertexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
397 size_t halfVertexCount = vertexData->vertexCount / 2;
398 Ogre::Vector3* vertices =
new Ogre::Vector3[halfVertexCount];
399 Ogre::Vector3* normals =
new Ogre::Vector3[halfVertexCount];
402 size_t i = 0, vIndex = 0, nIndex = 0;
403 i < vertexData->vertexCount;
404 i++, vertexChar += vertexBuffer->getVertexSize()
407 vertexElement->baseVertexPointerToElement(vertexChar, &vertexFloat);
408 Ogre::Vector3 tempVector(vertexFloat[0], vertexFloat[1], vertexFloat[2]);
412 vertices[vIndex] = tempVector;
421 vertexBuffer->unlock();
424 for (
size_t i = 0; i < halfVertexCount; i++)
426 m_normals->position(vertices[i].x, vertices[i].y, vertices[i].z);
428 vertices[i].x + ScalingFactor * normals[i].x,
429 vertices[i].y + ScalingFactor * normals[i].y,
430 vertices[i].z + ScalingFactor * normals[i].z
441 std::stringstream sstm;
446 Ogre::MaterialManager::getSingleton().create(
448 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
454 m_mesh->begin(sstm.str(), Ogre::RenderOperation::OT_TRIANGLE_LIST);
458 for (
size_t i = 0; i < mesh.vertices.size(); i++)
471 mesh.vertex_normals[i].x,
472 mesh.vertex_normals[i].y,
473 mesh.vertex_normals[i].z
479 for (
size_t i = 0; i < mesh.faces.size(); i++)
482 mesh.faces[i].vertex_indices[0],
483 mesh.faces[i].vertex_indices[1],
484 mesh.faces[i].vertex_indices[2]
494 const mesh_msgs::MeshGeometry& mesh,
495 const mesh_msgs::MeshVertexColors& vertexColors)
499 std::stringstream sstm;
503 Ogre::MaterialManager::getSingleton().create(
505 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
517 for (
size_t i = 0; i < mesh.vertices.size(); i++)
520 m_mesh->position(mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z);
524 vertexColors.vertex_colors[i].r,
525 vertexColors.vertex_colors[i].g,
526 vertexColors.vertex_colors[i].b,
527 vertexColors.vertex_colors[i].a
534 mesh.vertex_normals[i].x,
535 mesh.vertex_normals[i].y,
536 mesh.vertex_normals[i].z
542 for (
size_t i = 0; i < mesh.faces.size(); i++)
545 mesh.faces[i].vertex_indices[0],
546 mesh.faces[i].vertex_indices[1],
547 mesh.faces[i].vertex_indices[2]
557 const mesh_msgs::MeshGeometry& mesh,
558 const mesh_msgs::MeshVertexCosts& vertexCosts,
564 float maxCost = std::numeric_limits<float>::min();
565 float minCost = std::numeric_limits<float>::max();
566 for (
float cost : vertexCosts.costs)
568 if(std::isfinite(cost) && cost > maxCost) maxCost = cost;
569 if(std::isfinite(cost) && cost < minCost) minCost = cost;
576 const mesh_msgs::MeshGeometry& mesh,
577 const mesh_msgs::MeshVertexCosts& vertexCosts,
583 float range = maxCost - minCost;
586 ROS_ERROR(
"Illegal vertex cost limits!");
592 std::stringstream sstm;
596 Ogre::MaterialManager::getSingleton().create(
598 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
603 pass->setCullingMode(Ogre::CULL_NONE);
604 pass->setLightingEnabled(
false);
619 for (
size_t i = 0; i < mesh.vertices.size(); i++)
622 m_vertexCostsMesh->position(mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z);
625 float normalizedCost = (vertexCosts.costs[i] - minCost) / range;
632 mesh.vertex_normals[i].x,
633 mesh.vertex_normals[i].y,
634 mesh.vertex_normals[i].z
640 for (
size_t i = 0; i < mesh.faces.size(); i++)
643 mesh.faces[i].vertex_indices[0],
644 mesh.faces[i].vertex_indices[1],
645 mesh.faces[i].vertex_indices[2]
655 const mesh_msgs::MeshGeometry& mesh,
656 const mesh_msgs::MeshMaterials& meshMaterials
659 size_t clusterCounter = meshMaterials.clusters.size();
660 size_t materialCounter = meshMaterials.materials.size();
661 size_t textureIndex = 0;
663 std::stringstream sstm;
667 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
672 pass->setCullingMode(Ogre::CULL_NONE);
673 pass->setLightingEnabled(
false);
679 size_t noTexCluVertexCount = 0;
681 for (
size_t clusterIndex = 0; clusterIndex < clusterCounter; clusterIndex++)
684 mesh_msgs::MeshFaceCluster cluster = meshMaterials.clusters[clusterIndex];
686 uint32_t materialIndex = meshMaterials.cluster_materials[clusterIndex];
687 mesh_msgs::MeshMaterial material = meshMaterials.materials[materialIndex];
688 bool hasTexture = material.has_texture;
694 std::stringstream sstm;
697 Ogre::MaterialManager::getSingleton().create(
699 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
707 pass->setCullingMode(Ogre::CULL_NONE);
708 pass->setLightingEnabled(
false);
713 if (
m_images.size() < textureIndex + 1 ||
m_images[textureIndex].getWidth() == 0)
715 ROS_INFO(
"Texture with index %lu not loaded yet", textureIndex);
735 size_t triangleVertexCount = 0;
736 for (
size_t i = 0; i < cluster.face_indices.size(); i++)
738 uint32_t faceIndex = cluster.face_indices[i];
740 for (
size_t j = 0; j < 3; j++)
742 int vertexIndex = mesh.faces[faceIndex].vertex_indices[j];
745 mesh.vertices[vertexIndex].x,
746 mesh.vertices[vertexIndex].y,
747 mesh.vertices[vertexIndex].z
751 meshMaterials.vertex_tex_coords[vertexIndex].u,
752 1 - meshMaterials.vertex_tex_coords[vertexIndex].v
759 mesh.vertex_normals[vertexIndex].x,
760 mesh.vertex_normals[vertexIndex].y,
761 mesh.vertex_normals[vertexIndex].z
768 triangleVertexCount + 1,
769 triangleVertexCount + 2
771 triangleVertexCount += 3;
784 size_t triangleVertexCount = 0;
785 for (
size_t i = 0; i < cluster.face_indices.size(); i++)
787 uint32_t faceIndex = cluster.face_indices[i];
789 for (
size_t j = 0; j < 3; j++)
791 int vertexIndex = mesh.faces[faceIndex].vertex_indices[j];
794 mesh.vertices[vertexIndex].x,
795 mesh.vertices[vertexIndex].y,
796 mesh.vertices[vertexIndex].z
811 mesh.vertex_normals[vertexIndex].x,
812 mesh.vertex_normals[vertexIndex].y,
813 mesh.vertex_normals[vertexIndex].z
820 noTexCluVertexCount + 1,
821 noTexCluVertexCount + 2
823 noTexCluVertexCount += 3;
840 std::stringstream sstm;
844 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
850 m_normals->begin(sstm.str(), Ogre::RenderOperation::OT_LINE_LIST);
853 for (
size_t i = 0; i < mesh.vertex_normals.size(); i++)
855 m_normals->position(mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z);
874 const mesh_msgs::MeshGeometry& mesh = meshMsg->mesh_geometry;
892 if (mesh.vertices.size() < 3)
894 ROS_WARN(
"Received not enough vertices, can't create mesh!");
899 int vertex_count = mesh.vertices.size();
900 int index_count = mesh.faces.size() * 3;
905 if (mesh.vertex_normals.size() == mesh.vertices.size())
907 ROS_INFO(
"Received %lu vertex normals.", mesh.vertex_normals.size());
910 else if (mesh.vertex_normals.size() > 0)
912 ROS_WARN(
"Received not as much vertex normals as vertices, ignoring vertex normals!");
916 m_mesh->estimateVertexCount(vertex_count);
917 m_mesh->estimateIndexCount(index_count);
918 m_normals->estimateVertexCount(mesh.vertices.size() * 2);
919 m_normals->estimateIndexCount(mesh.vertices.size() * 2);
940 ROS_WARN(
"Can't add vertex colors, uuids do not match.");
946 ROS_WARN(
"Can't add vertex colors, already received vertex colors for this mesh.");
950 const mesh_msgs::MeshVertexColors vertexColors = vertexColorsMsg->mesh_vertex_colors;
953 if (vertexColors.vertex_colors.size() ==
m_meshMsg.vertices.size())
955 ROS_INFO(
"Received %lu vertex colors.", vertexColors.vertex_colors.size());
960 ROS_WARN(
"Received not as much vertex colors as vertices, ignoring the vertex colors!");
972 const mesh_msgs::MeshVertexCostsStamped::ConstPtr& vertexCostsMsg,
979 ROS_WARN(
"Can't add vertex costs, uuids do not match.");
983 const mesh_msgs::MeshVertexCosts vertexCosts = vertexCostsMsg->mesh_vertex_costs;
986 if (vertexCosts.costs.size() ==
m_meshMsg.vertices.size())
988 ROS_INFO(
"Received %lu vertex costs.", vertexCosts.costs.size());
993 ROS_WARN(
"Received not as much vertex costs as vertices, ignoring the vertex costs!");
1005 const mesh_msgs::MeshVertexCostsStamped::ConstPtr& vertexCostsMsg,
1014 ROS_WARN(
"Can't add vertex costs, uuids do not match.");
1018 const mesh_msgs::MeshVertexCosts vertexCosts = vertexCostsMsg->mesh_vertex_costs;
1021 if (vertexCosts.costs.size() ==
m_meshMsg.vertices.size())
1023 ROS_INFO(
"Received %lu vertex costs.", vertexCosts.costs.size());
1028 ROS_WARN(
"Received not as much vertex costs as vertices, ignoring the vertex costs!");
1044 ROS_WARN(
"Can't add materials, uuids do not match.");
1050 ROS_WARN(
"Can't add materials, already received materials for this mesh.");
1054 mesh_msgs::MeshMaterials meshMaterials = materialMsg->mesh_materials;
1057 if (meshMaterials.clusters.size() == meshMaterials.cluster_materials.size())
1059 ROS_INFO(
"Received %lu clusters.", meshMaterials.clusters.size());
1064 ROS_WARN(
"Received unmatching numbers of clusters and material indices, ignoring materials!");
1070 if (meshMaterials.vertex_tex_coords.size() ==
m_meshMsg.vertices.size())
1072 ROS_INFO(
"Received %lu texture coords.", meshMaterials.vertex_tex_coords.size());
1076 else if (meshMaterials.vertex_tex_coords.size() > 0)
1078 ROS_WARN(
"Received not as much texture coords as vertices, ignoring texture coords!");
1092 ROS_WARN(
"Can't add texture, uuids do not match.");
1096 size_t textureIndex = textureMsg->texture_index;
1098 uint32_t width = textureMsg->image.width;
1099 uint32_t height = textureMsg->image.height;
1100 uint32_t
step = textureMsg->image.step;
1101 std::vector<uint8_t> data = textureMsg->image.data;
1103 uint32_t dataSize = height *
step;
1105 uchar* imageData =
new uchar[dataSize];
1106 std::memcpy(imageData, &data[0], dataSize);
1110 Ogre::Image image = Ogre::Image();
1112 image.loadDynamicImage(imageData, width, height, 1, pixelFormat,
false);
1124 ROS_WARN(
"Can't load image into texture material, material does not exist!");
1132 if (encoding ==
"rgba8")
1134 return Ogre::PF_BYTE_RGBA;
1136 else if (encoding ==
"rgb8")
1138 return Ogre::PF_BYTE_RGB;
1141 ROS_WARN(
"Unknown texture encoding! Using Ogre::PF_UNKNOWN");
1142 return Ogre::PF_UNKNOWN;
1147 std::stringstream textureNameStream;
1150 Ogre::TexturePtr texturePtr = Ogre::TextureManager::getSingleton().createManual(
1151 textureNameStream.str(),
1152 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
1155 m_images[textureIndex].getHeight(),
1160 texturePtr->loadImage(
m_images[textureIndex]);
1163 pass->removeAllTextureUnitStates();
1164 pass->createTextureUnitState()->addFrameTextureName(textureNameStream.str());
1169 Ogre::ColourValue color;
1171 switch (costColorType)
1178 color.r = color.r > 1.0f ? 1.0f : color.r;
1179 color.g = (1.0f - cost) * 2;
1180 color.g = color.g > 1.0f ? 1.0f : color.g;