55 #include <OGRE/OgreSubEntity.h>
56 #include <OGRE/OgreRenderOperation.h>
57 #include <OGRE/OgreTextureManager.h>
58 #include <OGRE/OgreHardwarePixelBuffer.h>
59 #include <OGRE/OgrePixelFormat.h>
72 value = std::min(value, 1.0
f);
73 value = std::max(value, 0.0
f);
75 float h = value * 5.0f + 1.0f;
93 return Ogre::ColourValue(r, g, b, 1.0
f);
97 : m_displayContext(context)
101 , m_vertex_normals_enabled(false)
102 , m_vertex_colors_enabled(false)
103 , m_materials_enabled(false)
104 , m_texture_coords_enabled(false)
105 , m_normalsScalingFactor(1)
111 Ogre::SceneNode* rootNode = sceneManager->getRootSceneNode();
113 std::stringstream strstream;
114 strstream <<
"TexturedMeshScene" <<
m_random;
115 std::string sceneId = strstream.str();
116 if (sceneManager->hasSceneNode(sceneId))
119 m_sceneNode = (Ogre::SceneNode*)(rootNode->getChild(sceneId));
124 m_sceneNode = rootNode->createChildSceneNode(sceneId);
128 std::stringstream sstm;
130 m_mesh = sceneManager->createManualObject(sstm.str());
131 m_mesh->setDynamic(
false);
134 std::stringstream sstmNormals;
136 m_normals = sceneManager->createManualObject(sstmNormals.str());
140 std::stringstream sstmTexturedMesh;
142 m_texturedMesh = sceneManager->createManualObject(sstmTexturedMesh.str());
146 std::stringstream sstmNoTexCluMesh;
148 m_noTexCluMesh = sceneManager->createManualObject(sstmNoTexCluMesh.str());
152 std::stringstream sstmVertexCostsMesh;
165 std::stringstream sstm;
169 std::stringstream sstmNormals;
173 std::stringstream sstmTexturedMesh;
177 std::stringstream sstmNoTexCluMesh;
181 std::stringstream sstmVertexCostsMesh;
194 std::stringstream sstm;
197 Ogre::MaterialManager::getSingleton().unload(sstm.str());
198 Ogre::MaterialManager::getSingleton().remove(sstm.str());
205 Ogre::MaterialManager::getSingleton().unload(sstm.str());
206 Ogre::MaterialManager::getSingleton().remove(sstm.str());
212 Ogre::MaterialManager::getSingleton().unload(sstm.str());
213 Ogre::MaterialManager::getSingleton().remove(sstm.str());
219 Ogre::MaterialManager::getSingleton().unload(textureMaterial->getName());
220 Ogre::MaterialManager::getSingleton().remove(textureMaterial->getName());
260 pass->setAmbient(Ogre::ColourValue(wireframeColor.r, wireframeColor.g, wireframeColor.b, wireframeAlpha));
261 pass->setDiffuse(Ogre::ColourValue(wireframeColor.r, wireframeColor.g, wireframeColor.b, wireframeAlpha));
263 if (wireframeAlpha < 1.0)
265 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
266 pass->setDepthWriteEnabled(
true);
268 pass->setPolygonMode(Ogre::PM_WIREFRAME);
269 pass->setCullingMode(Ogre::CULL_NONE);
273 bool useVertexColors)
275 pass->setDiffuse(Ogre::ColourValue(facesColor.r, facesColor.g, facesColor.b, facesAlpha));
276 pass->setSelfIllumination(facesColor.r, facesColor.g, facesColor.b);
280 pass->setLightingEnabled(
false);
281 pass->setDepthWriteEnabled(
true);
283 else if (facesAlpha < 1.0)
285 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
286 pass->setDepthWriteEnabled(
false);
288 pass->setPolygonMode(Ogre::PM_SOLID);
289 pass->setCullingMode(Ogre::CULL_NONE);
294 pass->setSelfIllumination(normalsColor.r, normalsColor.g, normalsColor.b);
295 pass->setDiffuse(Ogre::ColourValue(normalsColor.r, normalsColor.g, normalsColor.b, normalsAlpha));
296 if (normalsAlpha < 1.0)
298 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
299 pass->setDepthWriteEnabled(
true);
301 pass->setPolygonMode(Ogre::PM_WIREFRAME);
302 pass->setCullingMode(Ogre::CULL_NONE);
306 bool useVertexColors,
bool showVertexCosts,
bool showTextures,
307 bool showTexturedFacesOnly)
313 if (tech->getPass(
"faces") != 0)
315 tech->removePass(tech->getPass(
"faces")->getIndex());
330 Ogre::Pass* pass = tech->createPass();
331 pass->setName(
"faces");
332 this->
showFaces(pass, facesColor, facesAlpha, useVertexColors);
353 bool showFaces, Ogre::ColourValue facesColor,
float facesAlpha,
354 bool useVertexColors,
bool showVertexCosts,
bool showTextures,
355 bool showTexturedFacesOnly,
bool showNormals, Ogre::ColourValue normalsColor,
356 float normalsAlpha,
float normalsScalingFactor)
381 this->
showFaces(tech->createPass(), facesColor, facesAlpha, useVertexColors);
403 this->
showWireframe(tech->createPass(), wireframeColor, wireframeAlpha);
411 this->
showNormals(tech->createPass(), normalsColor, normalsAlpha);
432 this->
showNormals(tech->createPass(), normalsColor, normalsAlpha);
450 if (tech->getPass(
"wireframe") != 0)
452 tech->removePass(tech->getPass(
"wireframe")->getIndex());
457 Ogre::Pass* pass = tech->createPass();
458 pass->setName(
"wireframe");
466 std::stringstream sstm;
471 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
477 m_mesh->begin(sstm.str(), Ogre::RenderOperation::OT_TRIANGLE_LIST);
480 for (
size_t i = 0; i <
mesh.vertices.size(); i++)
487 for (
size_t i = 0; i <
mesh.faces.size(); i++)
489 m_mesh->triangle(
mesh.faces[i].vertexIndices[0],
mesh.faces[i].vertexIndices[1],
mesh.faces[i].vertexIndices[2]);
500 std::stringstream sstm;
504 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
515 for (
size_t i = 0; i <
mesh.vertices.size(); i++)
521 m_mesh->colour(vertexColors[i].r, vertexColors[i].g, vertexColors[i].b, vertexColors[i].a);
525 for (
size_t i = 0; i <
mesh.faces.size(); i++)
527 m_mesh->triangle(
mesh.faces[i].vertexIndices[0],
mesh.faces[i].vertexIndices[1],
mesh.faces[i].vertexIndices[2]);
538 float maxCost = std::numeric_limits<float>::min();
539 float minCost = std::numeric_limits<float>::max();
540 for (
float cost : vertexCosts)
542 if (std::isfinite(cost) && cost > maxCost)
544 if (std::isfinite(cost) && cost < minCost)
552 int costColorType,
float minCost,
float maxCost)
554 float range = maxCost - minCost;
557 ROS_ERROR(
"Illegal vertex cost limits!");
563 std::stringstream sstm;
567 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
570 pass->setCullingMode(Ogre::CULL_NONE);
571 pass->setLightingEnabled(
false);
586 for (
size_t i = 0; i <
mesh.vertices.size(); i++)
592 float normalizedCost = (vertexCosts[i] - minCost) / range;
593 normalizedCost = std::max(0.0
f, normalizedCost);
594 normalizedCost = std::min(1.0
f, normalizedCost);
599 for (
size_t i = 0; i <
mesh.faces.size(); i++)
602 mesh.faces[i].vertexIndices[2]);
610 const vector<TexCoords>& texCoords)
612 std::stringstream sstm;
615 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
621 pass->setCullingMode(Ogre::CULL_NONE);
622 pass->setLightingEnabled(
false);
626 size_t noTexCluVertexCount = 0;
628 size_t materialIndex = 0;
630 for (
auto& material : materials)
632 bool hasTexture = material.textureIndex ? true :
false;
637 uint32_t textureIndex = *(material.textureIndex);
638 std::stringstream sstm;
641 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true));
646 pass->setCullingMode(Ogre::CULL_NONE);
647 pass->setLightingEnabled(
false);
652 if (
m_images.size() < textureIndex + 1 ||
m_images[textureIndex].getWidth() == 0)
654 ROS_DEBUG(
"Texture with index %u not loaded yet", textureIndex);
664 uint32_t textureIndex = *(material.textureIndex);
671 size_t triangleVertexCount = 0;
672 for (
size_t i = 0; i < material.faceIndices.size(); i++)
674 uint32_t faceIndex = material.faceIndices[i];
676 for (
size_t j = 0; j < 3; j++)
678 uint32_t vertexIndex =
mesh.faces[faceIndex].vertexIndices[j];
681 mesh.vertices[vertexIndex].z);
683 m_texturedMesh->textureCoord(texCoords[vertexIndex].u, 1 - texCoords[vertexIndex].v);
686 m_texturedMesh->triangle(triangleVertexCount, triangleVertexCount + 1, triangleVertexCount + 2);
687 triangleVertexCount += 3;
698 size_t triangleVertexCount = 0;
699 for (
size_t i = 0; i < material.faceIndices.size(); i++)
701 uint32_t faceIndex = material.faceIndices[i];
703 for (
size_t j = 0; j < 3; j++)
705 int vertexIndex =
mesh.faces[faceIndex].vertexIndices[j];
708 mesh.vertices[vertexIndex].z);
711 m_noTexCluMesh->colour(material.color.r, material.color.g, material.color.b, material.color.a);
714 m_noTexCluMesh->triangle(noTexCluVertexCount, noTexCluVertexCount + 1, noTexCluVertexCount + 2);
715 noTexCluVertexCount += 3;
730 std::stringstream sstm;
735 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
740 m_normals->begin(sstm.str(), Ogre::RenderOperation::OT_LINE_LIST);
748 for (
size_t i = 0; i <
mesh.vertices.size(); i++)
781 if (
mesh.vertices.size() < 3)
783 ROS_WARN(
"Received not enough vertices, can't create mesh!");
788 int vertex_count =
mesh.vertices.size();
789 int index_count =
mesh.faces.size() * 3;
792 m_mesh->estimateVertexCount(vertex_count);
793 m_mesh->estimateIndexCount(index_count);
807 ROS_INFO(
"Received %lu vertex normals.", normals.size());
810 else if (normals.size() > 0)
812 ROS_WARN(
"Received not as much vertex normals as vertices, ignoring vertex normals!");
836 ROS_INFO(
"Received %lu vertex colors.", vertexColors.size());
841 ROS_WARN(
"Received not as much vertex colors as vertices, ignoring the vertex colors!");
867 ROS_DEBUG(
"Received %lu vertex costs.", vertexCosts.size());
872 ROS_WARN(
"Received not as much vertex costs as vertices, ignoring the vertex costs!");
896 ROS_DEBUG(
"Received %lu vertex costs.", vertexCosts.size());
901 ROS_WARN(
"Received not as much vertex costs as vertices, ignoring the vertex costs!");
915 if (materials.size() >= 0)
917 ROS_INFO(
"Received %lu materials.", materials.size());
922 ROS_WARN(
"Received zero materials, ignoring materials!");
930 ROS_INFO(
"Received %lu texture coords.", texCoords.size());
934 else if (texCoords.size() > 0)
936 ROS_WARN(
"Received not as much texture coords as vertices, ignoring texture coords!");
946 uint32_t width = texture.
width;
947 uint32_t height = texture.
height;
950 uint32_t dataSize = width * height *
step;
954 Ogre::Image image = Ogre::Image();
955 image.loadDynamicImage(texture.
data.data(), width, height, 1, pixelFormat,
false);
965 ROS_WARN(
"Can't load image into texture material, material does not exist!");
972 if (encoding ==
"rgba8")
974 return Ogre::PF_BYTE_RGBA;
976 else if (encoding ==
"rgb8")
978 return Ogre::PF_BYTE_RGB;
981 ROS_WARN(
"Unknown texture encoding! Using Ogre::PF_UNKNOWN");
982 return Ogre::PF_UNKNOWN;
987 std::stringstream textureNameStream;
990 Ogre::TexturePtr texturePtr = Ogre::TextureManager::getSingleton().createManual(
991 textureNameStream.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D,
994 texturePtr->loadImage(
m_images[textureIndex]);
997 pass->removeAllTextureUnitStates();
998 pass->createTextureUnitState()->addFrameTextureName(textureNameStream.str());
1003 Ogre::ColourValue color;
1005 switch (costColorType)
1012 color.r = color.r > 1.0f ? 1.0f : color.r;
1013 color.g = (1.0f - cost) * 2;
1014 color.g = color.g > 1.0f ? 1.0f : color.g;