Oriented Bounding Box
A class which renders an Oriented Bounding Box using SimpleRenderable.
Welcome to the new Ogre Wiki!
If you haven't done so already, be sure to visit the Wiki Portal to read about how the wiki works. Especially the Ogre Wiki Overview page.
If you haven't done so already, be sure to visit the Wiki Portal to read about how the wiki works. Especially the Ogre Wiki Overview page.
This Class renders an Oriented Bounding Box using SimpleRenderable.
Example:
OBBoxRenderable* mOBBoxRenderable = new OBBoxRenderable(); ... mYourEntity = mSceneMgr->createEntity("test", "test.mesh"); mSceneMgr->getRootSceneNode()->createChildSceneNode("test")->attachObject(mYourEntity ); mSceneMgr->getSceneNode("test")->setPosition(25.0f, 0.0f, 25.0f); mOBBoxRenderable->setupVertices(mYourEntity->getBoundingBox()); mSceneMgr->getSceneNode("test")->attachObject(mOBBoxRenderable); ... delete mOBBoxRenderable; don't forget to delete it when you clean up your resources.
Oriented Bounding Box class:
OBBoxRenderable.h
#ifndef OBBOXRENDERABLE_H_ #define OBBOXRENDERABLE_H_ #include <OgreSimpleRenderable.h> #include <OgreAxisAlignedBox.h> private class OBBoxRenderable : public Ogre::SimpleRenderable { Ogre::VertexData vertexes; public: OBBoxRenderable(); void setupVertices(const Ogre::AxisAlignedBox& aab); virtual ~OBBoxRenderable(); Ogre::Real getSquaredViewDepth(const Ogre::Camera*)const; Ogre::Real getBoundingRadius()const; virtual void getWorldTransforms (Ogre::Matrix4 *xform)const; }; #endif /*OBBOXRENDERABLE_H_*/
OBBoxRenderable.cpp
#include "Ogre.h" using namespace Ogre; #include "OBBoxRenderable.h" OBBoxRenderable::OBBoxRenderable() { mRenderOp.vertexData = new Ogre::VertexData(); mRenderOp.indexData = 0; mRenderOp.vertexData->vertexCount = 24; mRenderOp.vertexData->vertexStart = 0; mRenderOp.operationType = Ogre::RenderOperation::OT_LINE_LIST; mRenderOp.useIndexes = false; Ogre::VertexDeclaration* decl = mRenderOp.vertexData->vertexDeclaration; Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding; decl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION); Ogre::HardwareVertexBufferSharedPtr vbuf = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer( decl->getVertexSize(0), mRenderOp.vertexData->vertexCount, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY); // Bind buffer bind->setBinding(0, vbuf); // setup material Ogre::MaterialPtr matptrOBBoxManualMaterial = Ogre::MaterialManager::getSingleton().create("OBBoxManualMaterial", "General"); matptrOBBoxManualMaterial->setReceiveShadows(false); matptrOBBoxManualMaterial->getTechnique(0)->setLightingEnabled(true); matptrOBBoxManualMaterial->getTechnique(0)->getPass(0)->setDiffuse(0, 1, 0, 0); matptrOBBoxManualMaterial->getTechnique(0)->getPass(0)->setAmbient(0, 1, 0); matptrOBBoxManualMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(0, 1, 0); this->setCastShadows(false); //this->setQueryFlags(QF_UNKNOWN); // set a query flag to exlude from queries (if necessary). this->setMaterial("OBBoxManualMaterial"); } OBBoxRenderable::~OBBoxRenderable() { delete mRenderOp.vertexData; } void OBBoxRenderable::setupVertices(const Ogre::AxisAlignedBox& aab) { Ogre::Vector3 vmax = aab.getMaximum(); Ogre::Vector3 vmin = aab.getMinimum(); Ogre::Real maxdistground = vmax.y; Ogre::Real mindistground = vmin.y; Ogre::Real maxx = vmax.x; Ogre::Real maxy = vmax.y; Ogre::Real maxz = vmax.z; Ogre::Real minx = vmin.x; Ogre::Real miny = vmin.y; Ogre::Real minz = vmin.z; // fill in the Vertex buffer: 12 lines with 2 endpoints each make up a box Ogre::HardwareVertexBufferSharedPtr vbuf = mRenderOp.vertexData->vertexBufferBinding->getBuffer(0); float* pPos = static_cast<float*>(vbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD)); // line 0 *pPos++ = minx; *pPos++ = miny; *pPos++ = minz; *pPos++ = maxx; *pPos++ = miny; *pPos++ = minz; // line 1 *pPos++ = minx; *pPos++ = miny; *pPos++ = minz; *pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; // line 2 *pPos++ = minx; *pPos++ = miny; *pPos++ = minz; *pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; // line 3 *pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; *pPos++ = minx; *pPos++ = maxy; *pPos++ = maxz; // line 4 *pPos++ = minx; *pPos++ = maxy; *pPos++ = minz; *pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; // line 5 *pPos++ = maxx; *pPos++ = miny; *pPos++ = minz; *pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; // line 6 *pPos++ = maxx; *pPos++ = miny; *pPos++ = minz; *pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; // line 7 *pPos++ = minx; *pPos++ = maxy; *pPos++ = maxz; *pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; // line 8 *pPos++ = minx; *pPos++ = maxy; *pPos++ = maxz; *pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; // line 9 *pPos++ = maxx; *pPos++ = maxy; *pPos++ = minz; *pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; // line 10 *pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; *pPos++ = maxx; *pPos++ = maxy; *pPos++ = maxz; // line 11 *pPos++ = minx; *pPos++ = miny; *pPos++ = maxz; *pPos++ = maxx; *pPos++ = miny; *pPos++ = maxz; vbuf->unlock(); // setup the bounding box of this SimpleRenderable setBoundingBox(aab); } Ogre::Real OBBoxRenderable::getSquaredViewDepth(const Ogre::Camera* cam)const { Ogre::Vector3 min, max, mid, dist; min = mBox.getMinimum(); max = mBox.getMaximum(); mid = ((max - min) * 0.5) + min; dist = cam->getDerivedPosition() - mid; return dist.squaredLength(); } Ogre::Real OBBoxRenderable::getBoundingRadius()const { return 0; } void OBBoxRenderable::getWorldTransforms (Ogre::Matrix4 *xform)const { SimpleRenderable::getWorldTransforms (xform); }
Contributors to this page: jacmoe
and
Duncan Mac Leod
.
Page last modified on Saturday 02 of January, 2010 04:23:11 GMT by jacmoe
.
The content on this page is licensed under the terms of the Creative Commons Attribution-ShareAlike License.
As an exception, any source code contributed within the content is released into the Public Domain.
Sidebar
Search box
Online users
69
online users

