lugre_robrenderable.cpp

Go to the documentation of this file.
00001 #include "lugre_prefix.h"
00002 #include "lugre_robrenderable.h"
00003 #include <OgreCamera.h>
00004 #include <Ogre.h>
00005 
00006 
00007 using namespace Ogre;
00008 
00009 namespace Lugre {
00010     
00011     
00012 cRobSimpleRenderable::cRobSimpleRenderable() : cRobRenderOp(&mRenderOp,&mBox) { PROFILE
00013     setMaterial("BaseWhiteNoLighting");
00014 }
00015 
00016 cRobSimpleRenderable::~cRobSimpleRenderable() { PROFILE
00017     delete mRenderOp.vertexData; mRenderOp.vertexData = 0;
00018     delete mRenderOp.indexData; mRenderOp.indexData = 0;
00019 }
00020 
00021 Ogre::Real  cRobSimpleRenderable::getBoundingRadius(void) const { PROFILE
00022     return mfBoundingRadius;
00023     //return Math::Sqrt(std::max(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength()));
00024 }
00025 
00026 Ogre::Real  cRobSimpleRenderable::getSquaredViewDepth(const Camera* cam) const { PROFILE
00027     return (cam->getDerivedPosition() - (mBox.getMinimum() + mBox.getMaximum()) * 0.5).squaredLength();
00028 }
00029 
00030 void    cRobSimpleRenderable::ConvertToMesh (const std::string& sMeshName) {
00031     cRobRenderOp::ConvertToMesh(sMeshName,getMaterial()->getName());
00032 }
00033 
00034 void    cRobSimpleRenderable::AddToMesh (const std::string& sMeshName) {
00035     Ogre::MeshPtr pMesh = Ogre::MeshManager::getSingleton().load(sMeshName,
00036                     Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
00037     AddToMesh(pMesh);
00038 }
00039 
00040 void    cRobSimpleRenderable::AddToMesh (Ogre::MeshPtr pMesh) {
00041     cRobRenderOp::AddToMesh(pMesh,getMaterial()->getName());
00042 }
00043 
00044 #if 0
00045 Real cRobSimpleRenderable::getSquaredViewDepth(const Camera* cam) const { PROFILE
00046     return 0;
00047     /*
00048     Node* n = getParentNode();
00049     assert(n);
00050     //printf("\n\n\ncRobSimpleRenderable::getSquaredViewDepth : %f\n\n\n",n->getSquaredViewDepth(cam));
00051     return n->getSquaredViewDepth(cam);
00052     */
00053 
00054     /*
00055     Vector3 vMin, vMax, vMid, vDist;
00056     vMin = mBox.getMinimum();
00057     vMax = mBox.getMaximum();
00058     vMid = ((vMin - vMax) * 0.5) + vMin;
00059     vDist = cam->getDerivedPosition() - vMid;
00060     return vDist.squaredLength();
00061     */
00062 }
00063 
00064 Real cRobSimpleRenderable::getBoundingRadius(void) const { PROFILE
00065     //printf("\n\n\ncRobSimpleRenderable::getBoundingRadius : %f\n\n\n",mfBoundingRadius);
00066     return 0;
00067     //return mfBoundingRadius;
00068 }
00069 #endif
00070 
00071 // **************** cRobRenderOp
00072 
00073 cRobRenderOp::cRobRenderOp(Ogre::RenderOperation* pRenderOp,Ogre::AxisAlignedBox* pBox)
00074     :   mpRenderOp(pRenderOp), mpBox(pBox), mpRenderSys(0),
00075         miVertexCapacity(0), miIndexCapacity(0), miVertexFormat(kVertexFormat_none), mVertexWritePtr(0), mIndexWritePtr(0) {
00076     mfBoundingRadius = 1;
00077     if (mpBox) mpBox->setExtents(Ogre::Vector3::ZERO,Ogre::Vector3::ZERO);
00078 }
00079 cRobRenderOp::~cRobRenderOp() { PROFILE
00080     // WARNING ! DO NOT RELEASE VERTEX/INDEXDATA HERE
00081     // this class does not own the Ogre::RenderOperation passed as param to the constructor
00082     // it would be bad to deallocate if cRobRenderOp is only used for construction (e.g. constructing a mesh)
00083     //delete mpRenderOp->vertexData; mpRenderOp->vertexData = 0;
00084     //delete mpRenderOp->indexData; mpRenderOp->indexData = 0;
00085 }
00086 
00087 void    cRobRenderOp::Begin (const size_t iVertexCount,const size_t iIndexCount,const bool bDynamic,const bool bKeepOldIndices,
00088                         const Ogre::RenderOperation::OperationType opType,const bool bReadable) { PROFILE
00089     assert(mpRenderOp && "mpRenderOp not set");
00090     if (!mpRenderOp) return;
00091     mvAABMin = Vector3::ZERO;
00092     mvAABMax = Vector3::ZERO;
00093     mbBoundingBoxEmpty = true;
00094     miVertexCount = iVertexCount;
00095     miIndexCount = iIndexCount;
00096     miReceivedVertices = 0;
00097     miReceivedIndices = 0;
00098     mVertexWritePtr = 0;
00099     mIndexWritePtr = 0;
00100     mbDynamic = bDynamic;
00101     mbReadable = bReadable;
00102     mbKeepOldIndices = bKeepOldIndices;
00103     if (!mpRenderSys) mpRenderSys = Root::getSingleton().getRenderSystem();
00104 
00105     mpRenderOp->operationType = opType;
00106     mpRenderOp->useIndexes = iIndexCount > 0;
00107     if (!mpRenderOp->vertexData) mpRenderOp->vertexData = new VertexData();
00108     if (!mpRenderOp->indexData && mpRenderOp->useIndexes) mpRenderOp->indexData = new IndexData();
00109     mpRenderOp->vertexData->vertexCount = miVertexCount;
00110     if (mpRenderOp->indexData && mpRenderOp->useIndexes) {
00111         mpRenderOp->indexData->indexCount = miIndexCount;
00112         mpRenderOp->indexData->indexStart = 0;
00113     }
00114 }
00115 
00116 void            cRobRenderOp::_StartWrite       (const bool bVertexFormatChanged) { PROFILE
00117     VertexDeclaration *decl = GetVertexDecl();
00118     miVertexSize = decl->getVertexSize(0);
00119 
00120     // create/resize vertex buffer
00121     bool bNeedNewVertexBuffer = bVertexFormatChanged || mbDynamic != mbBufferIsDynamic || mbReadable != mbBufferIsReadable || miVertexCount > miVertexCapacity;
00122     if (bNeedNewVertexBuffer) {
00123         if (miVertexCount > miVertexCapacity) miVertexCapacity = miVertexCount; // grow only ?
00124 
00125         // TODO : release old ?? i believe the release of the old buffer is done automatically via sharedptr refcount
00126 
00127         // hardware buffer usage : static or dynamic
00128         HardwareBuffer::Usage hbu_V = mbReadable ? 
00129             (mbDynamic ? HardwareBuffer::HBU_DYNAMIC : HardwareBuffer::HBU_STATIC) :
00130             (mbDynamic ? HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE : HardwareBuffer::HBU_STATIC_WRITE_ONLY);
00131 
00132         // allocate
00133         mHWVBuf = HardwareBufferManager::getSingleton().createVertexBuffer(miVertexSize,miVertexCapacity,hbu_V);
00134         mpRenderOp->vertexData->vertexBufferBinding->setBinding(0, mHWVBuf);
00135     }
00136 
00137     mbBufferIsDynamic = mbDynamic;
00138     mbBufferIsReadable = mbReadable;
00139 
00140     mVertexWritePtr = static_cast<char*>(mHWVBuf->lock(HardwareBuffer::HBL_DISCARD));
00141 }
00142 
00143 void    cRobRenderOp::SetVertexFormatFromEnum   (const eVertexFormat iVertexFormat,const int iNumTexCoordsSets) {
00144     VertexDeclaration *decl = GetVertexDecl();
00145 
00146     // clear old vertexdecl
00147     while (decl->getVertexSize(0) > 0) decl->removeElement(0);
00148 
00149     // position
00150     miVertexSize = 0;
00151     miVertexSize += decl->addElement(0, miVertexSize, VET_FLOAT3, VES_POSITION).getSize();
00152 
00153     // normal
00154     switch (iVertexFormat) {
00155         case kVertexFormat_pn:
00156         case kVertexFormat_pnuv:
00157         case kVertexFormat_pnc:
00158         case kVertexFormat_pnuvc:
00159             miVertexSize += decl->addElement(0, miVertexSize, VET_FLOAT3, VES_NORMAL).getSize();
00160         break;
00161     }
00162 
00163     // texcoord
00164     for (int i=0;i<iNumTexCoordsSets;++i) {
00165         switch (iVertexFormat) {
00166             case kVertexFormat_puv:
00167             case kVertexFormat_pnuv:
00168             case kVertexFormat_puvc:
00169             case kVertexFormat_pnuvc:
00170                 miVertexSize += decl->addElement(0, miVertexSize, VET_FLOAT2, VES_TEXTURE_COORDINATES, i ).getSize();
00171             break;
00172         }
00173     }
00174 
00175     // col
00176     switch (iVertexFormat) {
00177         case kVertexFormat_pc:
00178         case kVertexFormat_puvc:
00179         case kVertexFormat_pnc:
00180         case kVertexFormat_pnuvc:
00181             miVertexSize += decl->addElement(0, miVertexSize, VET_COLOUR, VES_DIFFUSE).getSize();
00182         break;
00183     }
00184 }
00185 
00186     
00187 Ogre::VertexDeclaration*    cRobRenderOp::GetVertexDecl () { return mpRenderOp->vertexData->vertexDeclaration; }
00188 
00189 Ogre::Real* cRobRenderOp::StartCustomWriter (const Ogre::Vector3& vBoundsMin,const Ogre::Vector3& vBoundsMax) {
00190     assert(mpRenderOp && "mpRenderOp not set");
00191     if (!mpRenderOp) return 0;
00192     _StartWrite(true); // always change
00193     assert(miReceivedVertices == 0);
00194     miReceivedVertices = miVertexCount;
00195     assert(mVertexWritePtr);
00196     mbBoundingBoxEmpty = false;
00197     mvAABMin = vBoundsMin;
00198     mvAABMax = vBoundsMax;
00199     return reinterpret_cast<Real*>(mVertexWritePtr);
00200 }
00201 
00202 Ogre::Real* cRobRenderOp::PrepareAddVertex  (const eVertexFormat iVertexFormat,const Ogre::Vector3& p) { PROFILE
00203     assert(mpRenderOp && "mpRenderOp not set");
00204     if (!mpRenderOp) return 0;
00205     if (miReceivedVertices >= miVertexCount) { PROFILE_PRINT_STACKTRACE }
00206     assert(miReceivedVertices < miVertexCount && "Buffer Overflow");
00207     ++miReceivedVertices;
00208     if (miReceivedVertices <= 1) {
00209         // define vertex format 
00210         bool bVertexFormatChanged = miVertexFormat != iVertexFormat;
00211         if (bVertexFormatChanged) { 
00212             miVertexFormat = iVertexFormat;
00213             SetVertexFormatFromEnum(iVertexFormat);
00214         }
00215         _StartWrite(bVertexFormatChanged);
00216     } else {
00217         assert(miVertexFormat == iVertexFormat && "cannot change VertexFormat");
00218     }
00219     assert(mVertexWritePtr);
00220 
00221     static Real* w;
00222     w = reinterpret_cast<Real*>(mVertexWritePtr);
00223     mVertexWritePtr += miVertexSize;
00224 
00225     if (mbBoundingBoxEmpty) {
00226         mvAABMin = p;
00227         mvAABMax = p;
00228         mbBoundingBoxEmpty = false;
00229     }
00230     if (mvAABMin.x > p.x) mvAABMin.x = p.x;
00231     if (mvAABMin.y > p.y) mvAABMin.y = p.y;
00232     if (mvAABMin.z > p.z) mvAABMin.z = p.z;
00233     if (mvAABMax.x < p.x) mvAABMax.x = p.x;
00234     if (mvAABMax.y < p.y) mvAABMax.y = p.y;
00235     if (mvAABMax.z < p.z) mvAABMax.z = p.z;
00236     *w++ = p.x;
00237     *w++ = p.y;
00238     *w++ = p.z;
00239     //printf("cRobRenderOp::AddVertex(%f,%f,%f)\n",p.x,p.y,p.z);
00240     return w;
00241 }
00242 
00243 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p) {
00244     PrepareAddVertex(kVertexFormat_p,p);
00245 }
00246 
00247 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::Real u,const Ogre::Real v) {
00248     Real* w = PrepareAddVertex(kVertexFormat_puv,p);
00249     *w++ = u;
00250     *w++ = v;
00251 }
00252 
00253 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::Vector3& n) {
00254     Real* w = PrepareAddVertex(kVertexFormat_pn,p);
00255     *w++ = n.x;
00256     *w++ = n.y;
00257     *w++ = n.z;
00258 }
00259 
00260 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::Vector3& n,const Ogre::Real u,const Ogre::Real v) {
00261     Real* w = PrepareAddVertex(kVertexFormat_pnuv,p);
00262     *w++ = n.x;
00263     *w++ = n.y;
00264     *w++ = n.z;
00265     *w++ = u;
00266     *w++ = v;
00267 }
00268 
00270 inline void RobWriteCol (Real* w,const Ogre::ColourValue& c,RenderSystem* pRenderSys) { PROFILE
00271     if (pRenderSys)
00272             pRenderSys->convertColourValue(c, reinterpret_cast<RGBA*>(w));
00273     else    *reinterpret_cast<RGBA*>(w) = c.getAsRGBA(); // pick one!
00274 }
00275 
00276 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::ColourValue& c) {
00277     Real* w = PrepareAddVertex(kVertexFormat_pc,p);
00278     RobWriteCol(w,c,mpRenderSys);
00279 }
00280 
00281 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::Real u,const Ogre::Real v,const Ogre::ColourValue& c) {
00282     Real* w = PrepareAddVertex(kVertexFormat_puvc,p);
00283     *w++ = u;
00284     *w++ = v;
00285     RobWriteCol(w,c,mpRenderSys);
00286 }
00287 
00288 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::Vector3& n,const Ogre::ColourValue& c) {
00289     Real* w = PrepareAddVertex(kVertexFormat_pnc,p);
00290     *w++ = n.x;
00291     *w++ = n.y;
00292     *w++ = n.z;
00293     RobWriteCol(w,c,mpRenderSys);
00294 }
00295 
00296 void    cRobRenderOp::Vertex    (const Ogre::Vector3& p,const Ogre::Vector3& n,const Ogre::Real u,const Ogre::Real v,const Ogre::ColourValue& c) {
00297     Real* w = PrepareAddVertex(kVertexFormat_pnuvc,p);
00298     *w++ = n.x;
00299     *w++ = n.y;
00300     *w++ = n.z;
00301     *w++ = u;
00302     *w++ = v;
00303     RobWriteCol(w,c,mpRenderSys);
00304 }
00305 
00306 void    cRobRenderOp::Index (const int i,const int j,const int k) { Index(i); Index(j); Index(k); }
00307 
00308 void    cRobRenderOp::Index (const int i) { PROFILE
00309     //printf("cRobRenderOp::Index %d/%d\n",i,miVertexCount);
00310     assert(i >= 0               && "cRobRenderOp::End : warning ! negative index");
00311     assert(i < miVertexCount    && "cRobRenderOp::End : index out of bounds");
00312     
00313     assert(mpRenderOp && "mpRenderOp not set");
00314     if (!mpRenderOp) return;
00315     assert(miReceivedIndices < miIndexCount && "Buffer Overflow");
00316     ++miReceivedIndices;
00317     if (miReceivedIndices <= 1) {
00318         _AllocateIndexBufferIfNeeded();
00319         mIndexWritePtr = static_cast<unsigned short*>(mHWIBuf->lock(HardwareBuffer::HBL_DISCARD));
00320     }
00321     assert(mIndexWritePtr);
00322     *mIndexWritePtr = (unsigned short)i;
00323     ++mIndexWritePtr;
00324 }
00325 
00326 void    cRobRenderOp::_AllocateIndexBufferIfNeeded  () {
00327     if (!mpRenderOp->useIndexes) return;
00328     if (miIndexCapacity > 0 && miIndexCapacity > miIndexCount) return; // buffer is allocated and already big enough
00329     // only reallocate when growing
00330         
00331     // TODO : release old ?? i believe the release of the old buffer is done automatically via sharedptr refcount
00332 
00333     // hardware buffer usage : indexes are mostly static
00334     HardwareBuffer::Usage hbu_i = HardwareBuffer::HBU_STATIC_WRITE_ONLY;
00335 
00336     // allocate
00337     miIndexCapacity = (miIndexCount > 0) ? miIndexCount : 3; // directx crashes for zero sized index buffer
00338     mHWIBuf = HardwareBufferManager::getSingleton().createIndexBuffer(HardwareIndexBuffer::IT_16BIT,miIndexCapacity,hbu_i);
00339     mpRenderOp->indexData->indexBuffer = mHWIBuf;
00340 }   
00341 
00342 void    cRobRenderOp::End       () { PROFILE
00343     //mfBoundingRadius = Math::Sqrt(std::max(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength()));
00344     mfBoundingRadius = Math::Sqrt(std::max(mvAABMax.squaredLength(), mvAABMin.squaredLength()));
00345     if (mpBox) mpBox->setExtents(mvAABMin,mvAABMax);
00346     //printf("cRobRenderOp::End mpBox=%#08x min(%f,%f,%f),max(%f,%f,%f),rad=%f\n",(int)mpBox,mvAABMin.x,mvAABMin.y,mvAABMin.z,mvAABMax.x,mvAABMax.y,mvAABMax.z,mfBoundingRadius);
00347     assert(miReceivedVertices == miVertexCount && "cRobRenderOp::End : not enough vertices");
00348     assert((mbKeepOldIndices || miReceivedIndices == miIndexCount) && "cRobRenderOp::End : not enough indices");
00349     if (!mbKeepOldIndices && mpRenderOp->useIndexes && miReceivedIndices == 0) { 
00350         // this happens if all indices are skipped, making the renderable empty, 
00351         // but indexbuffer has to exist, otherwise we get a segfault
00352         _AllocateIndexBufferIfNeeded();
00353     }
00354     if (mVertexWritePtr) { mHWVBuf->unlock(); mVertexWritePtr = 0; }
00355     if (mIndexWritePtr)  { mHWIBuf->unlock(); mIndexWritePtr = 0; }
00356 }
00357 
00359 void    cRobRenderOp::SkipVertices  (const size_t iNum) {
00360     miVertexCount -= iNum;
00361     mpRenderOp->vertexData->vertexCount = miVertexCount;
00362 }
00363 
00364 void    cRobRenderOp::SkipIndices   (const size_t iNum) {
00365     miIndexCount -= iNum;
00366     mpRenderOp->indexData->indexCount = miIndexCount;
00367 }
00368 
00369 
00370 void    cRobRenderOp::ConvertToMesh (const std::string& sMeshName,const std::string& sMatName){
00371     Ogre::MeshPtr pMesh = Ogre::MeshManager::getSingleton().createManual(sMeshName,Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
00372     AddToMesh(pMesh,sMatName);
00373 }
00374 
00375 // warning, reading back from the hardwarebuffers is slow, don't use this for high-performance operations
00376 // warning, you will want to disable WRITEONLY flag if you want to use the mesh for mousepicking.
00377 void    cRobRenderOp::AddToMesh (Ogre::MeshPtr pMesh, const std::string& sMatName) {
00378     /*
00379     .. it might be possible to give the buffers used to create the renderop to the mesh.
00380     or to clone them
00381     the problem is the WRITE_ONLY flag in buffer createion (vertex&index), which might prevent mousepicking to read out the data,
00382     does seem to work somehow on normal ogre meshes though =\
00383     */
00384     
00385     // create submesh
00386     Ogre::SubMesh* sub = pMesh->createSubMesh();
00387     sub->setMaterialName(sMatName);
00388     sub->useSharedVertices = false;
00389     
00390     /*
00391             mHWVBuf = HardwareBufferManager::getSingleton().createVertexBuffer(miVertexSize,miVertexCapacity,hbu_V);
00392             mpRenderOp->vertexData->vertexBufferBinding->setBinding(0, mHWVBuf);
00393     
00394             mHWIBuf = HardwareBufferManager::getSingleton().createIndexBuffer(HardwareIndexBuffer::IT_16BIT,miIndexCapacity,hbu_i);
00395             mpRenderOp->indexData->indexBuffer = mHWIBuf;
00396     */
00397     
00398     // TODO : does this work with write_only flag ???
00399     sub->vertexData = mpRenderOp->vertexData->clone();
00400     sub->indexData = mpRenderOp->indexData->clone();
00401     
00402     /*
00403         manual creating a mesh works like this (see iris2 : grannyogreloader.cpp)
00404         // prepare vertex buffer
00405         sub->vertexData = new Ogre::VertexData();
00406         sub->vertexData->vertexCount = iComboVertexCount;
00407         VertexDeclaration* decl = sub->vertexData->vertexDeclaration;
00408         VertexBufferBinding* bind = sub->vertexData->vertexBufferBinding;
00409         int offset = 0;
00410         offset += decl->addElement(0, offset, VET_FLOAT3, VES_POSITION).getSize();
00411         offset += decl->addElement(0, offset, VET_FLOAT3, VES_NORMAL).getSize();
00412         if (bUseColors)     offset += decl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE).getSize();
00413         if (bUseTexCoords)  offset += decl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0).getSize();
00414         HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(
00415             offset,iComboVertexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
00416         bind->setBinding(0, vbuf);
00417                     
00418         // write vertices
00419         assert(myVertices.size() == vbuf->getSizeInBytes());
00420         vbuf->writeData(0,myVertices.size(),myVertices.HackGetRawReader(), true);
00421         
00422         // prepare index buffer
00423         int iIndexCount = pLoaderSubMesh.mPolygons.second * 3;
00424         HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager::getSingleton().
00425             createIndexBuffer(HardwareIndexBuffer::IT_16BIT,iIndexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
00426         sub->indexData->indexBuffer = ibuf;
00427         sub->indexData->indexCount = iIndexCount;
00428         sub->indexData->indexStart = 0;
00429         
00430         // write indices
00431         assert(myIndices.size() == ibuf->getSizeInBytes());
00432         ibuf->writeData(0, myIndices.size(),myIndices.HackGetRawReader(), true);
00433     */
00434     
00435     if(pMesh->getNumSubMeshes() == 0){
00436         // calculate bounds if this is the first submesh
00437         pMesh->_setBounds(AxisAlignedBox(mvAABMin.x,mvAABMin.y,mvAABMin.z,mvAABMax.x,mvAABMax.y,mvAABMax.z), true);
00438         pMesh->_setBoundingSphereRadius(mfBoundingRadius);
00439     } else {
00440         // merge bounding boxes
00441         AxisAlignedBox aabb = AxisAlignedBox(mvAABMin.x,mvAABMin.y,mvAABMin.z,mvAABMax.x,mvAABMax.y,mvAABMax.z);
00442         aabb.merge(pMesh->getBounds());
00443         pMesh->_setBounds(aabb, true);
00444         // and radius
00445         pMesh->_setBoundingSphereRadius(mymax(pMesh->getBoundingSphereRadius(),mfBoundingRadius));
00446     }
00447     pMesh->load();
00448 }
00449 
00450 Ogre::Real cRobRenderOp::GetMaxZ () { PROFILE
00451     return Root::getSingleton().getRenderSystem()->getMaximumDepthInputValue();
00452 }
00453 /*
00454 
00455 [ghoul@ryoko] /usr/src/ogrenew/OgreMain> f VES_DIFFUSE .cpp
00456 ./src/OgreBillboardChain.cpp:128:       decl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE);
00457 ./src/OgreBillboardSet.cpp:734: decl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE);
00458 ./src/OgreManualObject.cpp:348: ->addElement(0, mDeclSize, VET_COLOUR, VES_DIFFUSE);
00459 ./src/OgreManualObject.cpp:467: case VES_DIFFUSE:
00460 ./src/OgreMeshSerializerImpl.cpp:2466: dest->vertexDeclaration->addElement(bindIdx, 0, VET_COLOUR, VES_DIFFUSE);
00461 ./src/OgrePatchSurface.cpp:403: const VertexElement* elemDiffuse = mDeclaration->findElementBySemantic(VES_DIFFUSE);
00462 ./src/OgrePatchSurface.cpp:640: const VertexElement* elemDiffuse = mDeclaration->findElementBySemantic(VES_DIFFUSE);
00463 ./src/OgreTextAreaOverlayElement.cpp:95:        decl->addElement(COLOUR_BINDING, 0, VET_COLOUR, VES_DIFFUSE);
00464 
00465     HardwareVertexBufferSharedPtr vbuf =
00466     mRenderOp.vertexData->vertexBufferBinding->getBuffer(POSITION_BINDING);
00467     float* pPos = static_cast<float*>(
00468     vbuf->lock(HardwareBuffer::HBL_DISCARD) );
00469 
00470     // Use the furthest away depth value, since materials should have depth-check off
00471     // This initialised the depth buffer for any 3D objects in front
00472     Real zValue = Root::getSingleton().getRenderSystem()->getMaximumDepthInputValue();
00473     *pPos++ = left;
00474     *pPos++ = top;
00475     *pPos++ = zValue;
00476 
00477     // see /usr/src/ogrenew/OgreMain/OgreOverlayElement.cpp for pixel/relative coord stuff mPixelWidth
00478 */
00479 
00480 /*class cBla : public Ogre::Renderable {
00481     virtual const MaterialPtr& getMaterial(void) const;         // simp:ok
00482     virtual void getRenderOperation(RenderOperation& op);       // simp:ok
00483     virtual void getWorldTransforms(Matrix4* xform) const;      // simp:ok
00484     virtual const Quaternion& getWorldOrientation(void) const;  // simp:ok
00485     virtual const Vector3& getWorldPosition(void) const;        // simp:ok
00486     virtual Real getSquaredViewDepth(const Camera* cam) const;
00487     virtual const LightList& getLights(void) const;             // simp:ok
00488 };
00489 
00490 class cBla3 : public Ogre::SimpleRenderable {
00491     virtual Real getSquaredViewDepth(const Camera* cam) const;      // from renderable
00492     virtual Real getBoundingRadius(void) const = 0;                 // from movable
00493 };
00494 
00495 class cBlah : public Ogre::MovableObject {
00496     virtual const String& getMovableType(void) const = 0; // simp:ok
00497     virtual const AxisAlignedBox& getBoundingBox(void) const = 0; // simp:ok (mBox)
00498     virtual Real getBoundingRadius(void) const = 0;
00499     virtual void _updateRenderQueue(RenderQueue* queue) = 0;  // simp:ok
00500 };
00501 
00502 */
00503 
00504 };

Generated on Wed Feb 8 06:00:13 2012 for cpp by  doxygen 1.5.6