52 #include <OGRE/OgreEntity.h>
53 #include <OGRE/OgreMaterialManager.h>
54 #include <OGRE/OgreMesh.h>
55 #include <OGRE/OgreMeshManager.h>
56 #include <OGRE/OgreSceneManager.h>
57 #include <OGRE/OgreSceneNode.h>
58 #include <OGRE/OgreSubMesh.h>
63 : m_displayContext(context), m_labelId(labelId)
68 std::shared_ptr<Geometry> geometry)
69 : m_displayContext(context), m_labelId(labelId), m_geometry(geometry)
73 Ogre::SceneNode* rootNode = sceneManager->getRootSceneNode();
75 std::stringstream strstream;
76 strstream <<
"ClusterLabelScene";
77 std::string sceneId = strstream.str();
79 if (sceneManager->hasSceneNode(sceneId))
81 m_sceneNode = (Ogre::SceneNode*)(rootNode->getChild(sceneId));
85 m_sceneNode = rootNode->createChildSceneNode(sceneId);
89 m_mesh = Ogre::MeshManager::getSingleton().getByName(
"ClusterLabelMesh",
"General");
90 if (
m_mesh.isNull() && geometry)
92 m_mesh = Ogre::MeshManager::getSingleton().createManual(
"ClusterLabelMesh",
"General");
95 m_mesh->sharedVertexData =
new Ogre::VertexData;
96 m_mesh->sharedVertexData->vertexCount = geometry->vertices.size();
99 Ogre::VertexDeclaration* decl =
m_mesh->sharedVertexData->vertexDeclaration;
103 decl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
104 offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
107 Ogre::HardwareVertexBufferSharedPtr vertexBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
108 offset,
m_mesh->sharedVertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC);
111 float* vertices =
static_cast<float*
>(vertexBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL));
114 for (
int i = 0; i <
m_mesh->sharedVertexData->vertexCount; i++)
116 vertices[(i * 3) + 0] = geometry->vertices[i].x;
117 vertices[(i * 3) + 1] = geometry->vertices[i].y;
118 vertices[(i * 3) + 2] = geometry->vertices[i].z;
122 vertexBuffer->unlock();
125 m_mesh->sharedVertexData->vertexBufferBinding->setBinding(0, vertexBuffer);
129 m_mesh->_setBounds(Ogre::AxisAlignedBox::EXTENT_INFINITE);
135 Ogre::Entity* entity = sceneManager->createEntity(
"ClusterLabelEntity",
"ClusterLabelMesh",
"General");
136 entity->setMaterialName(
"CustomMaterial",
"General");
145 std::stringstream sstm;
146 sstm <<
"ClusterLabel_Material_" <<
m_labelId;
147 m_material = Ogre::MaterialManager::getSingleton().create(
148 sstm.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
true);
150 m_subMesh->setMaterialName(
m_material->getName(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
151 m_material->getTechnique(0)->removeAllPasses();
152 m_material->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
166 ROS_DEBUG(
"ClusterLabelVisual::~ClusterLabelVisual: Destroying SubMesh: %s",
m_labelId.c_str());
174 ROS_ERROR(
"Exception in Visual destructor");
180 ROS_INFO(
"ClusterLabelVisual::~ClusterLabelVisual: Delete scene node");
189 Ogre::MaterialManager::getSingleton().unload(
m_material->getName());
190 Ogre::MaterialManager::getSingleton().remove(
m_material->getName());
204 ROS_WARN(
"ClusterLabelVisual::setFacesInCluster: MeshGeometry not set!");
211 m_subMesh->indexData->indexBuffer.setNull();
214 m_material->getTechnique(0)->removeAllPasses();
215 ROS_DEBUG(
"ClusterLabelVisual::setFacesInCluster: faces empty!");
220 if (
m_material->getTechnique(0)->getNumPasses() == 0)
229 size_t indexCount = faces.size() * 3;
232 Ogre::HardwareIndexBufferSharedPtr indexBuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(
233 Ogre::HardwareIndexBuffer::IT_32BIT, indexCount, Ogre::HardwareBuffer::HBU_WRITE_ONLY);
236 uint32_t* indices =
static_cast<uint32_t*
>(indexBuffer->lock(Ogre::HardwareBuffer::HBL_WRITE_ONLY));
239 for (
int i = 0; i < faces.size(); i++)
241 uint32_t faceId = faces[i];
242 indices[i * 3 + 0] =
m_geometry->faces[faceId].vertexIndices[0];
243 indices[i * 3 + 1] =
m_geometry->faces[faceId].vertexIndices[1];
244 indices[i * 3 + 2] =
m_geometry->faces[faceId].vertexIndices[2];
248 indexBuffer->unlock();
251 m_subMesh->indexData->indexBuffer = indexBuffer;
252 m_subMesh->indexData->indexCount = indexCount;
260 facesColor.a = alpha;
270 m_material->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);