lugre_vertexbuffer_L.cpp

Go to the documentation of this file.
00001 // creating vertex declaration, vertex buffers etc for grannyloader and similar geometry generation
00002 
00003 #include "lugre_prefix.h"
00004 #include "lugre_luabind.h"
00005 #include "lugre_luabind_direct.h"
00006 #include "lugre_luabind_ogrehelper.h"
00007 #include "lugre_ogrewrapper.h"
00008 #include "lugre_scripting.h"
00009 #include "lugre_fifo.h"
00010 #include <Ogre.h>
00011 #include <OgreRenderOperation.h>
00012 #include <OgreHardwareVertexBuffer.h> 
00013 
00014 extern "C" {
00015     #include "lua.h"
00016     #include "lauxlib.h"
00017     #include "lualib.h"
00018 }
00019 
00020 using namespace Ogre;
00021 
00022 class lua_State;
00023     
00024 namespace Lugre {
00025 
00026 
00027 /*
00028     VertexDeclaration:
00029     You should be aware that the ordering and structure of the VertexDeclaration can be very important on DirectX with older cards,so if you want to maintain maximum compatibility with all render systems and all cards you should be careful to follow these rules:
00030 
00031        1. VertexElements should be added in the following order, and the order of the elements within a shared buffer should be as follows: position, blending weights, normals, diffuse colours, specular colours, texture coordinates (in order, with no gaps)
00032        2. You must not have unused gaps in your buffers which are not referenced by any VertexElement
00033        3. You must not cause the buffer & offset settings of 2 VertexElements to overlap
00034 
00035     Whilst GL and more modern graphics cards in D3D will allow you to defy these rules, sticking to them will ensure that your buffers have the maximum compatibility. 
00036 
00037     Like the other classes in this functional area, these declarations should be created and destroyed using the HardwareBufferManager. 
00038 */
00039 
00040 /*
00041     manual creating a mesh works like this (see iris2 : grannyogreloader.cpp)
00042     // prepare vertex buffer
00043     sub->vertexData = new Ogre::VertexData();
00044     sub->vertexData->vertexCount = iComboVertexCount;
00045     VertexDeclaration* decl = sub->vertexData->vertexDeclaration;
00046     VertexBufferBinding* bind = sub->vertexData->vertexBufferBinding;
00047     int offset = 0;
00048     offset += decl->addElement(0, offset, VET_FLOAT3, VES_POSITION).getSize();
00049     offset += decl->addElement(0, offset, VET_FLOAT3, VES_NORMAL).getSize();
00050     if (bUseColors)     offset += decl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE).getSize();
00051     if (bUseTexCoords)  offset += decl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0).getSize();
00052     HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(
00053         offset,iComboVertexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
00054     bind->setBinding(0, vbuf);
00055                 
00056     // write vertices
00057     assert(myVertices.size() == vbuf->getSizeInBytes());
00058     vbuf->writeData(0,myVertices.size(),myVertices.HackGetRawReader(), true);
00059     
00060     // prepare index buffer
00061     int iIndexCount = pLoaderSubMesh.mPolygons.second * 3;
00062     HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager::getSingleton().
00063         createIndexBuffer(HardwareIndexBuffer::IT_16BIT,iIndexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
00064     sub->indexData->indexBuffer = ibuf;
00065     sub->indexData->indexCount = iIndexCount;
00066     sub->indexData->indexStart = 0;
00067     
00068     // write indices
00069     assert(myIndices.size() == ibuf->getSizeInBytes());
00070     ibuf->writeData(0, myIndices.size(),myIndices.HackGetRawReader(), true);
00071     
00072     
00073     
00074 ogre manual object notes :
00075     RenderOperation* rop = mCurrentSection->getRenderOperation();
00076     
00077     constructor : ManualObject::ManualObjectSection::ManualObjectSection
00078         mRenderOperation.operationType = opType;
00079         // default to no indexes unless we're told
00080         mRenderOperation.useIndexes = false;
00081         mRenderOperation.vertexData = OGRE_NEW VertexData();
00082         mRenderOperation.vertexData->vertexCount = 0;
00083     destructor :
00084         OGRE_DELETE mRenderOperation.vertexData;
00085         OGRE_DELETE mRenderOperation.indexData; // ok to delete 0
00086 
00087 
00088     if (!rop->indexData)
00089         {
00090             rop->indexData = OGRE_NEW IndexData();
00091             rop->indexData->indexCount = 0;
00092         }
00093         rop->useIndexes = true;
00094     
00095     edgelist -> stencil shadow , simple : EdgeListBuilder -> eats vertexData
00096         and shadowbuffer ?   getShadowVolumeRenderableIterator uses edgelist ? auch nich allzu komplex...
00097 
00098     ParentNeedsUpdate()  mParentNode->needUpdate();
00099 */
00100 
00101 
00102 class cRobRenderable : public Ogre::Renderable { public:
00103     Ogre::MaterialPtr       m_pMaterial;
00104     Ogre::RenderOperation   mRenderOp;
00105     Ogre::Matrix4           m_matWorldTransform;
00106     bool                    mbIdentityTransform;
00107     Ogre::MovableObject*    mParent;
00108     
00109     cRobRenderable (Ogre::MovableObject* pParent) : mParent(pParent),mbIdentityTransform(false) {
00110         m_pMaterial = Ogre::MaterialManager::getSingleton().getByName("BaseWhite");
00111         m_matWorldTransform = Ogre::Matrix4::IDENTITY;
00112         mRenderOp.vertexData = new Ogre::VertexData();
00113         mRenderOp.indexData = new Ogre::IndexData();
00114     }
00115     virtual ~cRobRenderable () {
00116         delete mRenderOp.vertexData; mRenderOp.vertexData = 0;
00117         delete mRenderOp.indexData; mRenderOp.indexData = 0;
00118     }
00119     bool    GetIdentityTransform    () { return mbIdentityTransform; }
00120     void    SetIdentityTransform    (bool bVal) { mbIdentityTransform = bVal; }
00121     
00122     Ogre::RenderOperation *         GetRenderOperationPtr   () { return &mRenderOp; }
00123     
00124     void    SetParent               (Ogre::MovableObject* pParent) { mParent = pParent; } 
00125     
00126     void SetMaterial( const Ogre::String& matName ) {
00127         m_pMaterial = Ogre::MaterialManager::getSingleton().getByName(matName);
00128         if (m_pMaterial.isNull())
00129             OGRE_EXCEPT( Ogre::Exception::ERR_ITEM_NOT_FOUND, "Could not find material " + matName,"cRobRenderable::SetMaterial");
00130     
00131         // Won't load twice anyway
00132         m_pMaterial->load();
00133     }
00134     void SetWorldTransform( const Matrix4& xform ) { m_matWorldTransform = xform; }
00135 
00136     virtual const Ogre::MaterialPtr &   getMaterial             (void) const { return m_pMaterial; }
00137     virtual void                        getRenderOperation      (Ogre::RenderOperation &op) { op = mRenderOp;  }
00138     virtual void                        getWorldTransforms      (Ogre::Matrix4 *xform) const { 
00139         if (mbIdentityTransform) 
00140                 *xform = Matrix4::IDENTITY;
00141         else    *xform = mParent->_getParentNodeFullTransform();
00142     }
00143     virtual Ogre::Real                  getSquaredViewDepth (const Ogre::Camera *cam) const { PROFILE
00144         const Ogre::AxisAlignedBox* aabb = &mParent->getBoundingBox();
00145         return (cam->getDerivedPosition() - (aabb->getMinimum() + aabb->getMaximum()) * 0.5).squaredLength();
00146     }
00147     virtual const Ogre::LightList &     getLights           (void) const { return mParent->queryLights(); } // Use movable query lights
00148 };
00149 
00150 class cRobMovable : public Ogre::MovableObject { public:
00151     std::vector<Ogre::Renderable*>  mlRenderables;
00152     Ogre::AxisAlignedBox            mBox;
00153     Ogre::Real                      mfBoundingRadius;
00154     
00155     cRobMovable() { SetBounds(Ogre::Vector3::ZERO,Ogre::Vector3::ZERO); }
00156     
00157     void                ClearRenderables    ()                      { mlRenderables.clear(); }
00158     void                AddRenderable       (Ogre::Renderable* p)   { mlRenderables.push_back(p); }
00159     int                 CountRenderables    ()                      { return mlRenderables.size(); }
00160     Ogre::Renderable*   GetRenderable       (int i)                 { return (i >= 0 && i < mlRenderables.size()) ? mlRenderables[i] : 0; }
00161     
00162     void                ParentNeedsUpdate   () { if (mParentNode) mParentNode->needUpdate(); }
00163     
00164     void    SetBounds           (Ogre::Vector3 vMin,Ogre::Vector3 vMax) {
00165         mfBoundingRadius = Math::Sqrt(std::max(vMin.squaredLength(), vMax.squaredLength()));
00166         mBox.setExtents(vMin,vMax);
00167     }
00168     
00169     virtual const Ogre::String &            getMovableType      (void) const { static Ogre::String movType = "RobMovable"; return movType; }
00170     virtual const Ogre::AxisAlignedBox &    getBoundingBox      (void) const { return mBox; }
00171     virtual Ogre::Real                      getBoundingRadius   (void) const { return mfBoundingRadius; }
00172     
00173     virtual void    _updateRenderQueue (Ogre::RenderQueue *queue) {
00174         for (int i=0;i<mlRenderables.size();++i) queue->addRenderable(mlRenderables[i], mRenderQueueID, OGRE_RENDERABLE_DEFAULT_PRIORITY); 
00175     }
00176     virtual void    visitRenderables (Ogre::Renderable::Visitor *visitor, bool debugRenderables=false) {
00177         for (int i=0;i<mlRenderables.size();++i) visitor->visit(mlRenderables[i], 0, false);
00178     }
00179 };
00180 
00181 
00182 class cLugreLuaBind_cRobMovable : public cLuaBindDirect<cRobMovable>, public cLuaBindDirectOgreHelper { public:
00183     virtual void RegisterMethods    (lua_State *L) { PROFILE
00184         LUABIND_DIRECTWRAP_BASECLASS(Ogre::MovableObject);
00185         
00186         LUABIND_QUICKWRAP_STATIC(CreateRobMovable, { return CreateUData(L,new cRobMovable()); });
00187         LUABIND_QUICKWRAP(Destroy,              { delete checkudata_alive(L); });
00188         
00189         LUABIND_DIRECTWRAP_RETURN_VOID(                                 ClearRenderables            ,() );
00190         LUABIND_DIRECTWRAP_RETURN_VOID(                                 AddRenderable               ,(ParamRenderable(L,2)) );
00191         LUABIND_DIRECTWRAP_RETURN_ONE(          PushNumber,             CountRenderables            ,() );
00192         LUABIND_DIRECTWRAP_RETURN_ONE(          PushRenderable,         GetRenderable               ,(ParamInt(L,2))    );
00193         LUABIND_DIRECTWRAP_RETURN_VOID(                                 ParentNeedsUpdate           ,() );
00194         LUABIND_DIRECTWRAP_RETURN_VOID(                                 SetBounds                   ,(ParamVector3(L,2),ParamVector3(L,3))  );
00195         // in parent: String getMovableType(void);
00196         // in parent: AxisAlignedBox getBoundingBox(void);
00197         // in parent: Real getBoundingRadius(void);
00198         //~ LUABIND_DIRECTWRAP_RETURN_VOID(                                 _updateRenderQueue          ,(RenderQueue*queue)    );
00199         //~ LUABIND_DIRECTWRAP_RETURN_VOID(                                 visitRenderables            ,(Renderable::Visitor*visitor,ParamBool(L,3))   );
00200                 
00201     }
00202     virtual const char* GetLuaTypeName () { return "lugre.cRobMovable"; }
00203 };
00204 
00205 class cLugreLuaBind_cRobRenderable : public cLuaBindDirect<cRobRenderable>, public cLuaBindDirectOgreHelper { public:
00206     virtual void RegisterMethods    (lua_State *L) { PROFILE
00207         LUABIND_DIRECTWRAP_BASECLASS(Ogre::Renderable);
00208         
00209         LUABIND_QUICKWRAP_STATIC(CreateRobRenderable,   { return CreateUData(L,new cRobRenderable(ParamMovableObject(L,1))); });
00210         LUABIND_QUICKWRAP(Destroy,                      { delete checkudata_alive(L); });
00211         
00212         LUABIND_DIRECTWRAP_RETURN_ONE(      PushRenderOperation         ,GetRenderOperationPtr,         ()                              );
00213         
00214          // 
00215         
00216         LUABIND_DIRECTWRAP_RETURN_ONE(          PushBool,           GetIdentityTransform        ,() );
00217         LUABIND_DIRECTWRAP_RETURN_VOID(                             SetIdentityTransform        ,(ParamBool(L,2))   );
00218         LUABIND_DIRECTWRAP_RETURN_VOID(                             SetParent                   ,(ParamMovableObject(L,2))  );
00219         LUABIND_DIRECTWRAP_RETURN_VOID(                             SetMaterial                 ,(ParamString(L,2)) );
00220         //~ LUABIND_DIRECTWRAP_RETURN_VOID(                             SetWorldTransform           ,(Matrix4)  );
00221         // in parent: MaterialPtr getMaterial(void);
00222         // in parent: void getRenderOperation(RenderOperation op);
00223         //~ LUABIND_DIRECTWRAP_RETURN_VOID(                             getWorldTransforms          ,(Matrix4*xform)    );
00224         //~ LUABIND_DIRECTWRAP_RETURN_ONE(          PushNumber,         getSquaredViewDepth         ,(Camera*cam)   );
00225         // in parent: LightList getLights(void);
00226     }
00227     virtual const char* GetLuaTypeName () { return "lugre.cRobRenderable"; }
00228 };
00229 
00230 
00232 void    LuaRegister_VertexBuffer    (lua_State *L) { PROFILE
00233     cLuaBindDirect<cRobMovable				>::GetSingletonPtr(new cLugreLuaBind_cRobMovable(         ))->LuaRegister(L);
00234     cLuaBindDirect<cRobRenderable			>::GetSingletonPtr(new cLugreLuaBind_cRobRenderable(        ))->LuaRegister(L);
00235 }
00236 
00237 };

Generated on Thu Feb 9 06:00:14 2012 for cpp by  doxygen 1.5.6