lugre_vertexbuffer_L.cpp
Go to the documentation of this file.00001
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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
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
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(); }
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
00196
00197
00198
00199
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
00221
00222
00223
00224
00225
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 };