1 #include <OGRE/OgreSubEntity.h>
2 #include <OGRE/OgreRenderOperation.h>
3 #include <OGRE/OgreTextureManager.h>
4 #include <OGRE/OgreHardwarePixelBuffer.h>
22 : m_displayContext(context),
26 m_vertex_normals_enabled(false),
27 m_vertex_colors_enabled(false),
28 m_triangle_colors_enabled(false),
29 m_texture_coords_enabled(false),
31 m_normalsScalingFactor(1)
38 Ogre::SceneNode* rootNode = sceneManager->getRootSceneNode();
40 std::stringstream strstream;
41 strstream <<
"TriangleMeshScene" <<
m_random;
42 std::string sceneId = strstream.str();
43 if (sceneManager->hasSceneNode(sceneId)){
45 m_sceneNode = (Ogre::SceneNode*)(rootNode->getChild(sceneId));
48 m_sceneNode = rootNode->createChildSceneNode(sceneId);
52 std::stringstream sstm;
54 m_mesh = sceneManager->createManualObject(sstm.str());
63 std::stringstream sstm;
78 std::stringstream sstm;
83 Ogre::TextureManager::getSingleton().unload(sstm.str());
84 Ogre::TextureManager::getSingleton().remove(sstm.str());
90 Ogre::MaterialManager::getSingleton().unload(sstm.str());
91 Ogre::MaterialManager::getSingleton().remove(sstm.str());
96 Ogre::MaterialManager::getSingleton().unload(sstm.str());
97 Ogre::MaterialManager::getSingleton().remove(sstm.str());
102 Ogre::MaterialManager::getSingleton().unload(sstm.str());
103 Ogre::MaterialManager::getSingleton().remove(sstm.str());
120 Ogre::ColourValue wireframeColor,
140 if (wireframeAlpha < 1.0){
141 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
142 pass->setDepthWriteEnabled(
false);
144 pass->setPolygonMode(Ogre::PM_WIREFRAME);
145 pass->setCullingMode(Ogre::CULL_NONE);
150 Ogre::ColourValue facesColor,
163 pass->setSelfIllumination(facesColor.r, facesColor.g, facesColor.b);
167 pass->setLightingEnabled(
false);
170 if (facesAlpha < 1.0)
172 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
173 pass->setDepthWriteEnabled(
false);
175 pass->setPolygonMode(Ogre::PM_SOLID);
176 pass->setCullingMode(Ogre::CULL_NONE);
181 Ogre::ColourValue normalsColor,
185 pass->setSelfIllumination(normalsColor.r, normalsColor.g, normalsColor.b);
194 if (normalsAlpha < 1.0)
196 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
197 pass->setDepthWriteEnabled(
false);
199 pass->setPolygonMode(Ogre::PM_SOLID);
200 pass->setCullingMode(Ogre::CULL_NONE);
210 Ogre::ColourValue wireframeColor,
211 float wireframeAlpha,
213 Ogre::ColourValue facesColor,
215 bool useVertexColors,
216 bool useTriangleColors,
219 Ogre::ColourValue normalsColor,
221 float normalsScalingFactor)
247 this->
showFaces(tech->createPass(), facesColor, facesAlpha, useVertexColors);
251 this->
showWireframe(tech->createPass(), wireframeColor, wireframeAlpha);
263 this->
showFaces(tech->createPass(), facesColor, facesAlpha,
true);
267 this->
showWireframe(tech->createPass(), wireframeColor, wireframeAlpha);
278 this->
showNormals(tech->createPass(), normalsColor, normalsAlpha);
286 Ogre::VertexData* vertexData;
287 const Ogre::VertexElement* vertexElement;
288 Ogre::HardwareVertexBufferSharedPtr vertexBuffer;
289 unsigned char* vertexChar;
292 vertexData =
m_mesh->getSection(
m_mesh->getNumSections() - 1)->getRenderOperation()->vertexData;
293 vertexElement = vertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
294 vertexBuffer = vertexData->vertexBufferBinding->getBuffer(vertexElement->getSource());
295 vertexChar =
static_cast<unsigned char*
>(vertexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
297 size_t halfVertexCount = vertexData->vertexCount/2;
298 Ogre::Vector3* vertices =
new Ogre::Vector3[halfVertexCount];
299 Ogre::Vector3* normals =
new Ogre::Vector3[halfVertexCount];
301 for(
size_t i = 0, vIndex = 0, nIndex = 0; i < vertexData->vertexCount; i++, vertexChar += vertexBuffer->getVertexSize())
303 vertexElement->baseVertexPointerToElement(vertexChar, &vertexFloat);
304 Ogre::Vector3 tempVector(vertexFloat[0], vertexFloat[1], vertexFloat[2]);
308 vertices[vIndex] = tempVector;
318 vertexBuffer->unlock();
321 for (
size_t i = 0; i < halfVertexCount; i++)
323 m_mesh->position(vertices[i].x, vertices[i].y, vertices[i].z);
324 m_mesh->position(vertices[i].x + ScalingFactor * normals[i].x,
325 vertices[i].y + ScalingFactor * normals[i].y,
326 vertices[i].z + ScalingFactor * normals[i].z);
342 std::stringstream sstm;
346 Ogre::MaterialManager::getSingleton().create(
347 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true
351 m_mesh->begin(sstm.str(), Ogre::RenderOperation::OT_TRIANGLE_LIST);
359 size_t triangle_vertex_cnt = 0;
360 for(
size_t i = 0; i < mesh.triangles.size(); i++){
362 for(
size_t j = 0; j < 3; j++){
363 int vertex_index = mesh.triangles[i].vertex_indices[j];
366 mesh.vertices[vertex_index].x,
367 mesh.vertices[vertex_index].y,
368 mesh.vertices[vertex_index].z
372 mesh.triangle_colors[i].r,
373 mesh.triangle_colors[i].g,
374 mesh.triangle_colors[i].b,
375 mesh.triangle_colors[i].a
380 mesh.vertex_normals[vertex_index].x,
381 mesh.vertex_normals[vertex_index].y,
382 mesh.vertex_normals[vertex_index].z
389 triangle_vertex_cnt+1,
390 triangle_vertex_cnt+2
392 triangle_vertex_cnt += 3;
401 std::stringstream sstm;
406 Ogre::MaterialManager::getSingleton().create(
407 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true
411 m_mesh->begin(sstm.str(), Ogre::RenderOperation::OT_TRIANGLE_LIST);
417 for (
size_t i = 0; i < mesh.vertices.size(); i++)
420 m_mesh->position(mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z);
425 mesh.vertex_colors[i].r,
426 mesh.vertex_colors[i].g,
427 mesh.vertex_colors[i].b,
428 mesh.vertex_colors[i].a
435 mesh.vertex_texture_coords[i].x,
436 mesh.vertex_texture_coords[i].y,
437 mesh.vertex_texture_coords[i].z
444 mesh.vertex_normals[i].x,
445 mesh.vertex_normals[i].y,
446 mesh.vertex_normals[i].z
452 for (
size_t i = 0; i < mesh.triangles.size(); i++)
455 mesh.triangles[i].vertex_indices[0],
456 mesh.triangles[i].vertex_indices[1],
457 mesh.triangles[i].vertex_indices[2]
472 std::stringstream sstm;
475 Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
478 m_mesh->begin(sstm.str(), Ogre::RenderOperation::OT_LINE_LIST);
481 for (
size_t i = 0; i < mesh.vertex_normals.size(); i++)
483 m_mesh->position(mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z);
501 const mesh_msgs::TriangleMesh& mesh = mesh_msg->mesh;
516 if (mesh.vertices.size() < 3){
517 ROS_WARN(
"Received not enough vertices, can't create mesh!");
522 int vertex_count = mesh.vertices.size();
523 int index_count = mesh.triangles.size() * 3;
528 if(mesh.vertex_colors.size() == mesh.vertices.size()){
529 ROS_INFO(
"Received %lu vertex colors.", mesh.vertex_colors.size());
532 else if(mesh.vertex_colors.size() > 0){
533 ROS_WARN(
"Received not as much vertex colors as vertices, ignoring the vertex colors!");
538 if(mesh.triangle_colors.size() == mesh.triangles.size()){
539 ROS_INFO(
"Received %lu triangle colors.", mesh.triangle_colors.size());
543 vertex_count += 3 * mesh.triangles.size();
544 index_count += 3 * mesh.triangles.size();
546 else if(mesh.triangle_colors.size() > 0){
547 ROS_WARN(
"Received not as much triangle colors as triangles, ignoring the triangle colors!");
552 if(mesh.vertex_texture_coords.size() == mesh.vertices.size()){
553 ROS_INFO(
"Received %lu texture coords.", mesh.vertex_texture_coords.size());
556 else if(mesh.vertex_texture_coords.size() > 0){
557 ROS_WARN(
"Received not as much texture coords as vertices, ignoring texture coords!");
562 if(mesh.vertex_normals.size() == mesh.vertices.size()){
563 ROS_INFO(
"Received %lu vertex normals.", mesh.vertex_normals.size());
566 vertex_count += mesh.vertices.size();
567 index_count += mesh.vertices.size() * 2;
569 else if(mesh.vertex_normals.size() > 0){
570 ROS_WARN(
"Received not as much vertex normals as vertices, ignoring vertex normals!");
574 m_mesh->estimateVertexCount(vertex_count);
575 m_mesh->estimateIndexCount(index_count);