From: <sf...@us...> - 2011-08-22 01:45:20
|
Revision: 2985 http://ogreaddons.svn.sourceforge.net/ogreaddons/?rev=2985&view=rev Author: sfcbias Date: 2011-08-22 01:45:12 +0000 (Mon, 22 Aug 2011) Log Message: ----------- Modified Paths: -------------- branches/ogrenewt/newton20/inc/OgreNewt_Body.h branches/ogrenewt/newton20/inc/OgreNewt_BodyInAABBIterator.h branches/ogrenewt/newton20/inc/OgreNewt_Collision.h branches/ogrenewt/newton20/inc/OgreNewt_CollisionPrimitives.h branches/ogrenewt/newton20/inc/OgreNewt_CollisionSerializer.h branches/ogrenewt/newton20/inc/OgreNewt_Prerequisites.h branches/ogrenewt/newton20/inc/OgreNewt_World.h branches/ogrenewt/newton20/inc/OgreNewt_stdafx.h branches/ogrenewt/newton20/src/OgreNewt_CollisionPrimitives.cpp branches/ogrenewt/newton20/src/OgreNewt_CollisionSerializer.cpp branches/ogrenewt/newton20/src/OgreNewt_Joint.cpp Modified: branches/ogrenewt/newton20/inc/OgreNewt_Body.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_Body.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_Body.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -44,9 +44,9 @@ gravity, etc. You can set this as the custom force callback for a body by using the setCustomForceCallback() function. - Using boost::function means OgreNewt can now accept pointers to member functions of specific classes. + Using OgreNewt::function means OgreNewt can now accept pointers to member functions of specific classes. */ - typedef boost::function<void(OgreNewt::Body*, float timeStep, int threadIndex)> ForceCallback; + typedef OgreNewt::function<void(OgreNewt::Body*, float timeStep, int threadIndex)> ForceCallback; //! node update notify. @@ -56,9 +56,9 @@ The application can use this function to re calculate relative position of child nodes, or any other depended transform. You can set this as the by using the setnNodeUpdateNotify() function. - Using boost::function means OgreNewt can now accept pointers to member functions of specific classes. + Using OgreNewt::function means OgreNewt can now accept pointers to member functions of specific classes. */ - typedef boost::function<void(OgreNewt::Body*)> NodeUpdateNotifyCallback; + typedef OgreNewt::function<void(OgreNewt::Body*)> NodeUpdateNotifyCallback; #if 0 @@ -70,8 +70,8 @@ create your own for special cases. you are passed a quaternion (orientation) and vector (position) of the rigid body in world space. */ - //typedef boost::function<void(OgreNewt::Body*, const Ogre::Quaternion&, const Ogre::Vector3&, int threadIndex)> TransformCallback; - //typedef boost::function<void(OgreNewt::Body*, int threadIndex)> TransformCallback; + //typedef OgreNewt::function<void(OgreNewt::Body*, const Ogre::Quaternion&, const Ogre::Vector3&, int threadIndex)> TransformCallback; + //typedef OgreNewt::function<void(OgreNewt::Body*, int threadIndex)> TransformCallback; #endif @@ -84,7 +84,7 @@ ignore buoyancy for this collision primitive, just return false from the function. otherwise, fill the "retPlane" with your liquid surface plane, and return true to apply buoyancy to the primitive. */ - typedef boost::function<bool(int, OgreNewt::Body*, const Ogre::Quaternion&, const Ogre::Vector3&, Ogre::Plane&)> buoyancyPlaneCallback; + typedef OgreNewt::function<bool(int, OgreNewt::Body*, const Ogre::Quaternion&, const Ogre::Vector3&, Ogre::Plane&)> buoyancyPlaneCallback; //! constructor. /*! @@ -159,9 +159,9 @@ This specifies a custom callback to use for applying forces to a body. if you are using a standard non-member function, or a static member function, you can simply pass a pointer to the function here.. like this: setCustomForceAndTorqueCallback( &myCallbackFunction ); - If you want to bind to a class member, you also need to pass a pointer to the class itself, using the boost::bind system, like so: - setCustomForceAndTorqueCallback( boost::bind( &MyClass::myCallback, (MyClass*)classInstance, _1 ) ); (from outside the class) or: - setCustomForceAndTorqueCallback( boost::bind( &MyClass::myCallback, this, _1 ) ); (from inside the class). + If you want to bind to a class member, you also need to pass a pointer to the class itself, using the OgreNewt::bind system, like so: + setCustomForceAndTorqueCallback( OgreNewt::bind( &MyClass::myCallback, (MyClass*)classInstance, _1 ) ); (from outside the class) or: + setCustomForceAndTorqueCallback( OgreNewt::bind( &MyClass::myCallback, this, _1 ) ); (from inside the class). You can also use: setCustomForceAndTorqueCallback<>( &MyClass::myCallback, (MyClass*)classInstance ); (from outside the class) or: @@ -169,9 +169,9 @@ Note: Notice the "<>" after the function name. */ void setCustomForceAndTorqueCallback( ForceCallback callback ); - template<class c> void setCustomForceAndTorqueCallback( boost::function<void(c*, Body*, float, int)> callback, c *instancedClassPointer ) + template<class c> void setCustomForceAndTorqueCallback( OgreNewt::function<void(c*, Body*, float, int)> callback, c *instancedClassPointer ) { - setCustomForceAndTorqueCallback( boost::bind(callback, instancedClassPointer, _1, _2, _3) ); + setCustomForceAndTorqueCallback( OgreNewt::bind(callback, instancedClassPointer, _1, _2, _3) ); } //! remove any force callbacks. @@ -190,9 +190,9 @@ Control joints like the vehicle an drag dolls use the function to calculate the correct matrix of wheels and body parts. */ void setNodeUpdateNotify (NodeUpdateNotifyCallback callback ); - template<class c> void setNodeUpdateNotify (boost::function<void(c*, OgreNewt::Body*)> callback, c *instancedClassPointer ) + template<class c> void setNodeUpdateNotify (OgreNewt::function<void(c*, OgreNewt::Body*)> callback, c *instancedClassPointer ) { - setNodeUpdateNotify( boost::bind(callback, instancedClassPointer, _1) ); + setNodeUpdateNotify( OgreNewt::bind(callback, instancedClassPointer, _1) ); } //! remove any transform callbacks. @@ -422,9 +422,9 @@ \param buoyancyPlaneCallback user function that returns the plane equation for the fluid at the current location. pass NULL to assume the body is fully immersed in fluid. see the setCustomForceAndTorqueCallback() docs to info on how to bind class member functions. */ void addBouyancyForce( Ogre::Real fluidDensity, Ogre::Real fluidLinearViscosity , Ogre::Real fluidAngularViscosity , const Ogre::Vector3& gravity, buoyancyPlaneCallback callback ); - template<class c> void addBouyancyForce( Ogre::Real fluidDensity, Ogre::Real fluidLinearViscosity , Ogre::Real fluidAngularViscosity , const Ogre::Vector3& gravity, boost::function<bool(c*, int, Body*, const Ogre::Quaternion&, const Ogre::Vector3&, Ogre::Plane&)> callback, c *instancedClassPointer ) + template<class c> void addBouyancyForce( Ogre::Real fluidDensity, Ogre::Real fluidLinearViscosity , Ogre::Real fluidAngularViscosity , const Ogre::Vector3& gravity, OgreNewt::function<bool(c*, int, Body*, const Ogre::Quaternion&, const Ogre::Vector3&, Ogre::Plane&)> callback, c *instancedClassPointer ) { - addBouyancyForce( fluidDensity, fluidLinearViscosity, fluidAngularViscosity, gravity, boost::bind(callback, instancedClassPointer, _1, _2, _3, _4, _5) ); + addBouyancyForce( fluidDensity, fluidLinearViscosity, fluidAngularViscosity, gravity, OgreNewt::bind(callback, instancedClassPointer, _1, _2, _3, _4, _5) ); } Modified: branches/ogrenewt/newton20/inc/OgreNewt_BodyInAABBIterator.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_BodyInAABBIterator.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_BodyInAABBIterator.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -34,7 +34,7 @@ /*! This function will be called for every body iterated. you can put any functionality you might want inside this function. */ - typedef boost::function<void(const Body*, void* userdata)> IteratorCallback; + typedef OgreNewt::function<void(const Body*, void* userdata)> IteratorCallback; //! perform an iteration /*! @@ -43,9 +43,9 @@ \warning you cannot call this functions from different threads at the same time */ void go( const Ogre::AxisAlignedBox &aabb, IteratorCallback callback, void* userdata) const; - template <class c> void go( const Ogre::AxisAlignedBox &aabb, boost::function<void(c*, Body*)> callback, c* instancedClassPointer ) const + template <class c> void go( const Ogre::AxisAlignedBox &aabb, OgreNewt::function<void(c*, Body*)> callback, c* instancedClassPointer ) const { - go ( aabb, boost::bind(callback, instancedClassPointer, _1) ); + go ( aabb, OgreNewt::bind(callback, instancedClassPointer, _1) ); } protected: Modified: branches/ogrenewt/newton20/inc/OgreNewt_Collision.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_Collision.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_Collision.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -160,8 +160,8 @@ typedef Collision* CollisionPtr; typedef ConvexCollision* ConvexCollisionPtr; #else -typedef boost::shared_ptr<Collision> CollisionPtr; -typedef boost::shared_ptr<ConvexCollision> ConvexCollisionPtr; +typedef OgreNewt::shared_ptr<Collision> CollisionPtr; +typedef OgreNewt::shared_ptr<ConvexCollision> ConvexCollisionPtr; #endif Modified: branches/ogrenewt/newton20/inc/OgreNewt_CollisionPrimitives.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_CollisionPrimitives.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_CollisionPrimitives.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -63,9 +63,9 @@ \param pos position offset of the primitive */ Box(const World* world, const Ogre::Vector3& size, int id, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO); + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO); //! destructor ~Box() @@ -94,9 +94,9 @@ \param pos position offset of the primitive */ Ellipsoid(const World* world, const Ogre::Vector3& size, - int id, const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO); + int id, const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO); //! destructor ~Ellipsoid() @@ -126,10 +126,10 @@ \param pos position offset of the primitive */ Cylinder(const World* world, Ogre::Real radius, - Ogre::Real height, int id, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO); + Ogre::Real height, int id, + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO); //! destructor ~Cylinder() @@ -159,10 +159,10 @@ \param pos position offset of the primitive */ Capsule(const World* world, Ogre::Real radius, - Ogre::Real height, int id, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO); + Ogre::Real height, int id, + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO); //! destructor ~Capsule() @@ -192,9 +192,9 @@ \param pos position offset of the primitive */ Cone(const World* world, Ogre::Real radius, Ogre::Real height, - int id, const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO); + int id, const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO); //! destructor ~Cone() @@ -224,10 +224,10 @@ \param pos position offset of the primitive */ ChamferCylinder(const World* world, Ogre::Real radius, - Ogre::Real height, int id, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO); + Ogre::Real height, int id, + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO); //! destructor ~ChamferCylinder() @@ -262,11 +262,11 @@ \param forceScale if set to something else then (0,0,0), the value of this argument will be used as scale instead of the parent-node's scale */ ConvexHull(const World* world, Ogre::Entity* ent, int id = 1, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO, - Ogre::Real tolerance = 0.001f, - const Ogre::Vector3& forceScale = Ogre::Vector3::ZERO); + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO, + Ogre::Real tolerance = 0.001f, + const Ogre::Vector3& forceScale = Ogre::Vector3::ZERO); /*! Overloaded constructor. pass a pointer to an array of vertices and the hull will be made from that. @@ -279,11 +279,11 @@ \param tolerance a tolerance passed to newton */ ConvexHull(const World* world, const Ogre::Vector3* verts, - int vertcount, int id = 1, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO, - Ogre::Real tolerance = 0.001f); + int vertcount, int id = 1, + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO, + Ogre::Real tolerance = 0.001f); //! destructor ~ConvexHull() @@ -314,7 +314,7 @@ \param id an id for this shape, can be received with collision->getUserId() */ TreeCollision(const World* world, Ogre::Entity* ent, - bool optimize, int id, FaceWinding fw = FW_DEFAULT); + bool optimize, int id, FaceWinding fw = FW_DEFAULT); //! constructor /*! @@ -329,9 +329,9 @@ \param id an id for this shape, can be received with collision->getUserId() */ TreeCollision(const World* world, int numVertices, - int numIndices, const float *vertices, - const int *indices, bool optimize, int id, - FaceWinding fw = FW_DEFAULT); + int numIndices, const float *vertices, + const int *indices, bool optimize, int id, + FaceWinding fw = FW_DEFAULT); //! constructor /*! @@ -345,8 +345,8 @@ \param id an id for this shape, can be received with collision->getUserId() */ TreeCollision(const World* world, int numVertices, - Ogre::Vector3* vertices, Ogre::IndexData* indexData, - bool optimize, int id, FaceWinding fw = FW_DEFAULT); + Ogre::Vector3* vertices, Ogre::IndexData* indexData, + bool optimize, int id, FaceWinding fw = FW_DEFAULT); //! destructor virtual ~TreeCollision() @@ -377,13 +377,14 @@ } //! used internally - static float _CDECL newtonRayCastCallback(const NewtonBody* body, - const NewtonCollision* col, float distance, float* normal, - int faceId, void* userData); + static float _CDECL newtonRayCastCallback( + const NewtonBody* body, const NewtonCollision* col, + float distance, float* normal, int faceId, + void* userData); private: static void setRayCastCallbackActive(bool active, - const NewtonCollision *col); + const NewtonCollision *col); }; @@ -407,7 +408,7 @@ //! parse the scene. void parseScene(Ogre::SceneNode* startNode, int id, - bool optimize = true, FaceWinding fw = FW_DEFAULT); + bool optimize = true, FaceWinding fw = FW_DEFAULT); protected: @@ -417,15 +418,15 @@ You can also change the face winding on an entity-by-entity basis by changing the fw variable from within the filter. */ virtual bool entityFilter(const Ogre::SceneNode* currentNode, - const Ogre::Entity* currentEntity, FaceWinding& fw) + const Ogre::Entity* currentEntity, FaceWinding& fw) { return true; } //! user inherit-able function, allows customization of the ID to be assigned to this group of polygons. virtual unsigned int getID(const Ogre::SceneNode* currentNode, - const Ogre::Entity* currentEntity, - unsigned int currentSubMesh) + const Ogre::Entity* currentEntity, + unsigned int currentSubMesh) { return count++; } @@ -433,9 +434,9 @@ private: //! recursive function to parse a single scene node. void _parseNode(Ogre::SceneNode* node, - const Ogre::Quaternion& curOrient, - const Ogre::Vector3& curPos, - const Ogre::Vector3& curScale, FaceWinding fw); + const Ogre::Quaternion& curOrient, + const Ogre::Vector3& curPos, + const Ogre::Vector3& curScale, FaceWinding fw); static int count; }; @@ -463,7 +464,7 @@ \param id an id for this shape, can be received with collision->getUserId() */ CompoundCollision(const World* world, std::vector< - OgreNewt::CollisionPtr> col_array, int id); + OgreNewt::CollisionPtr> col_array, int id); //! destructor ~CompoundCollision() @@ -500,10 +501,10 @@ \param tolerance a tolerance passed to newton */ Pyramid(const World* world, const Ogre::Vector3& size, int id, - const Ogre::Quaternion& orient = - Ogre::Quaternion::IDENTITY, - const Ogre::Vector3& pos = Ogre::Vector3::ZERO, - Ogre::Real tolerance = 0.001f); + const Ogre::Quaternion& orient = + Ogre::Quaternion::IDENTITY, + const Ogre::Vector3& pos = Ogre::Vector3::ZERO, + Ogre::Real tolerance = 0.001f); //! destructor ~Pyramid() @@ -511,27 +512,35 @@ } }; - //! HeightField Collision - /*! - Builds a HeightField collision from raw data or directly from a OgreTerrain page + //! HeightField Collision + /*! + Builds a HeightField collision from raw data or directly from a OgreTerrain page + */ + class _OgreNewtExport HeightField: public OgreNewt::Collision + { + public: + HeightField(const World* world) : + OgreNewt::Collision(world) + { + } - more info: http://newtondynamics.com/wiki/index.php5?title=NewtonCreateHeightFieldCollision - */ - /* Waiting for Ogre 1.7 - class _OgreNewtExport HeightField : public OgreNewt::Collision - { - public: - HeightField(const World* world): OgreNewt::Collision(world){} - HeightField(const World* world, int width, int height, int gridsDiagonals, unsigned short *elevationMap, char *attributeMap, Ogre::Real horizontalScale, Ogre::Real verticleScale, int shapeID); - HeightField(const World* world, Ogre::Terrain *terrain, int shapeID); + HeightField(const World* world, Ogre::Terrain *terrain, + int shapeID); - ~HeightField(){} + ~HeightField() + { + } - private: - //!Used internally to create the newton Heightfield collision - void createHeightFieldCollision(const World *world,int width,int height,int gridsDiagonals,unsigned short *elevationMap,char *attributeMap,Ogre::Real horizontalScale,Ogre::Real verticleScale,int shapeID); - }; - */ + /* + * The heightfield uses a modified body matrix thats calculated at the time of creation + * so its create for you. This is pointer to the body created. + */ + OgreNewt::Body* getBody(){ return mBody; } + + protected: + OgreNewt::Body* mBody; + private: + }; } // end namespace CollisionPrimitives }// end namespace OgreNewt Modified: branches/ogrenewt/newton20/inc/OgreNewt_CollisionSerializer.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_CollisionSerializer.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_CollisionSerializer.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -57,6 +57,8 @@ (Newton calls this function several times for each deserialization, once for each chunk of its file format apparently) */ static void _CDECL _newtonDeserializeCallback(void* deserializeHandle, void* buffer, int size); + + // FILE* mpFile; }; Modified: branches/ogrenewt/newton20/inc/OgreNewt_Prerequisites.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_Prerequisites.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_Prerequisites.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -25,6 +25,7 @@ # include <Ogre/OgreSceneNode.h> # include <Ogre/OgreSceneManager.h> # include <Ogre/OgreManualObject.h> +# include <Ogre/Terrain/OgreTerrain.h> //# include <OgreTerrain.h> # ifndef OGRENEWT_NO_OGRE_ANY # include <Ogre/OgreAny.h> @@ -39,6 +40,7 @@ #include <OgreSceneNode.h> #include <OgreSceneManager.h> #include <OgreManualObject.h> +#include <Terrain/OgreTerrain.h> //#include <OgreTerrain.h> # ifndef OGRENEWT_NO_OGRE_ANY # include <OgreAny.h> @@ -46,12 +48,30 @@ #endif #include <Newton.h> -#include <boost/function.hpp> -#include <boost/bind.hpp> -#ifndef OGRENEWT_NO_COLLISION_SHAREDPTR -# include <boost/shared_ptr.hpp> + +#if defined(OGRENEWT_USE_BOOST) || !defined(WIN32) || !defined(_MSC_VER) || _MSC_VER < 1600 +# define OGRENEWT_IMPORTED_NAMESPACE boost +# include <boost/function.hpp> +# include <boost/bind.hpp> +# ifndef OGRENEWT_NO_COLLISION_SHAREDPTR +# include <boost/shared_ptr.hpp> +# endif +#else +# define OGRENEWT_IMPORTED_NAMESPACE std +# include <functional> #endif +namespace OgreNewt +{ + using OGRENEWT_IMPORTED_NAMESPACE::function; + using OGRENEWT_IMPORTED_NAMESPACE::bind; +# ifndef OGRENEWT_NO_COLLISION_SHAREDPTR + using OGRENEWT_IMPORTED_NAMESPACE::shared_ptr; +# endif +} + +#undef OGRENEWT_IMPORTED_NAMESPACE + #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 # define _CDECL _cdecl # if defined( _OGRENEWT_EXPORTS ) && defined( _OGRENEWT_DYNAMIC ) @@ -108,7 +128,7 @@ * This function is called, when the object is destroyed. It's only argument is a pointer to the instance currently destroyed * @warning the pointer to the destroyed class instance is already invalid (the class is already destroyed!) */ - typedef boost::function<void(DerivedClass*)> DestructorCallbackFunction; + typedef OgreNewt::function<void(DerivedClass*)> DestructorCallbackFunction; //! constructor _DestructorCallback() : m_callback(NULL) {} @@ -130,9 +150,9 @@ * or a static member function, you can simply pass a pointer to the function here.. like this: * setDestructorCallback( &myCallbackFunction ); * - * If you want to bind to a class member, you also need to pass a pointer to the class itself, using the boost::bind system, like so: - * setDestructorCallback( boost::bind( &MyClass::myCallback, (MyClass*)classInstance, _1 ) ); (from outside the class) or: - * setDestructorCallback( boost::bind( &MyClass::myCallback, this, _1 ) ); (from inside the class). + * If you want to bind to a class member, you also need to pass a pointer to the class itself, using the OgreNewt::bind system, like so: + * setDestructorCallback( OgreNewt::bind( &MyClass::myCallback, (MyClass*)classInstance, _1 ) ); (from outside the class) or: + * setDestructorCallback( OgreNewt::bind( &MyClass::myCallback, this, _1 ) ); (from inside the class). * * You can also use: * setDestructorCallback<>( &MyClass::myCallback, (MyClass*)classInstance ); (from outside the class) or: @@ -141,9 +161,9 @@ * */ void setDestructorCallback( DestructorCallbackFunction fun ) { m_callback = fun; } - template<class c> void setDestructorCallback( boost::function<void(c*, DerivedClass*)> callback, c *instancedClassPointer ) + template<class c> void setDestructorCallback( OgreNewt::function<void(c*, DerivedClass*)> callback, c *instancedClassPointer ) { - setDestructorCallback( boost::bind(callback, instancedClassPointer, _1) ); + setDestructorCallback( OgreNewt::bind(callback, instancedClassPointer, _1) ); } private: DestructorCallbackFunction m_callback; Modified: branches/ogrenewt/newton20/inc/OgreNewt_World.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_World.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_World.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -85,7 +85,7 @@ callback binding to member classes is exactly the same as the various callbacks for the Body class. */ - typedef boost::function<void(OgreNewt::Body*, int threadIndex)> + typedef OgreNewt::function<void(OgreNewt::Body*, int threadIndex)> LeaveWorldCallback; public: @@ -354,10 +354,10 @@ sets the callback to be used when a Body leaves the World limits. */ void setLeaveWorldCallback(LeaveWorldCallback callback); - template<class c> void setLeaveWorldCallback(boost::function<void( + template<class c> void setLeaveWorldCallback(OgreNewt::function<void( c*, Body*, int)> callback, c *instancedClassPointer) { - setLeaveWorldCallback(boost::bind(callback, + setLeaveWorldCallback(OgreNewt::bind(callback, instancedClassPointer, _1, _2)); } Modified: branches/ogrenewt/newton20/inc/OgreNewt_stdafx.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_stdafx.h 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/inc/OgreNewt_stdafx.h 2011-08-22 01:45:12 UTC (rev 2985) @@ -38,12 +38,8 @@ #include <dQuaternion.h> #include <NewtonCustomJoint.h> - #include <boost/function.hpp> - #include <boost/bind.hpp> - - #ifndef OGRENEWT_NO_COLLISION_SHAREDPTR - # include <boost/shared_ptr.hpp> - #endif - + + #include "OgreNewt_Prerequisites.h" + #endif Modified: branches/ogrenewt/newton20/src/OgreNewt_CollisionPrimitives.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_CollisionPrimitives.cpp 2011-07-22 03:27:15 UTC (rev 2984) +++ branches/ogrenewt/newton20/src/OgreNewt_CollisionPrimitives.cpp 2011-08-22 01:45:12 UTC (rev 2985) @@ -3,6 +3,7 @@ #include "OgreNewt_Tools.h" #include "OgreNewt_RayCast.h" #include "OgreNewt_World.h" +#include "OgreNewt_Body.h" #ifdef __APPLE__ # include <Ogre/OgreEntity.h> @@ -20,808 +21,1006 @@ namespace CollisionPrimitives { - // OgreNewt::CollisionPrimitives::Null - Null::Null(const OgreNewt::World *world) : Collision( world ) - { - m_col = NewtonCreateNull( m_world->getNewtonWorld() ); - } + // OgreNewt::CollisionPrimitives::Null + Null::Null(const OgreNewt::World *world) : + Collision(world) + { + m_col = NewtonCreateNull(m_world->getNewtonWorld()); + } + // OgreNewt::CollisionPrimitives::Box + Box::Box(const World* world) : + ConvexCollision(world) + { + } - // OgreNewt::CollisionPrimitives::Box - Box::Box(const World* world) : ConvexCollision( world ) - {} + Box::Box(const World* world, const Ogre::Vector3& size, int id, + const Ogre::Quaternion& orient, const Ogre::Vector3& pos) : + ConvexCollision(world) + { + float matrix[16]; - Box::Box( const World* world, const Ogre::Vector3& size, int id, const Ogre::Quaternion& orient, const Ogre::Vector3& pos ) : ConvexCollision( world ) - { - float matrix[16]; + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + m_col = NewtonCreateBox(m_world->getNewtonWorld(), (float) size.x, + (float) size.y, (float) size.z, id, &matrix[0]); + } - m_col = NewtonCreateBox( m_world->getNewtonWorld(), (float)size.x, (float)size.y, (float)size.z, id, &matrix[0] ); - } + // OgreNewt::CollisionPrimitives::Ellipsoid + Ellipsoid::Ellipsoid(const World* world) : + ConvexCollision(world) + { + } + Ellipsoid::Ellipsoid(const World* world, const Ogre::Vector3& size, + int id, const Ogre::Quaternion& orient, + const Ogre::Vector3& pos) : + ConvexCollision(world) + { + float matrix[16]; + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - // OgreNewt::CollisionPrimitives::Ellipsoid - Ellipsoid::Ellipsoid(const World* world) : ConvexCollision( world ) - {} + m_col = NewtonCreateSphere(m_world->getNewtonWorld(), + (float) size.x, (float) size.y, (float) size.z, id, + &matrix[0]); + } - Ellipsoid::Ellipsoid( const World* world, const Ogre::Vector3& size, int id, const Ogre::Quaternion& orient, const Ogre::Vector3& pos ) : ConvexCollision( world ) - { - float matrix[16]; + // OgreNewt::CollisionPrimitives::Cylinder + Cylinder::Cylinder(const World* world) : + ConvexCollision(world) + { + } - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + Cylinder::Cylinder(const World* world, Ogre::Real radius, + Ogre::Real height, int id, const Ogre::Quaternion& orient, + const Ogre::Vector3& pos) : + ConvexCollision(world) + { + float matrix[16]; - m_col = NewtonCreateSphere( m_world->getNewtonWorld(), (float)size.x, (float)size.y, (float)size.z, id, &matrix[0] ); - } + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); + m_col = NewtonCreateCylinder(m_world->getNewtonWorld(), + (float) radius, (float) height, id, &matrix[0]); + } - // OgreNewt::CollisionPrimitives::Cylinder - Cylinder::Cylinder(const World* world) : ConvexCollision( world ) - {} + // OgreNewt::CollisionPrimitives::Capsule + Capsule::Capsule(const World* world) : + ConvexCollision(world) + { + } - Cylinder::Cylinder( const World* world, Ogre::Real radius, Ogre::Real height, int id, - const Ogre::Quaternion& orient, const Ogre::Vector3& pos ) : ConvexCollision( world ) - { - float matrix[16]; + Capsule::Capsule(const World* world, Ogre::Real radius, + Ogre::Real height, int id, const Ogre::Quaternion& orient, + const Ogre::Vector3& pos) : + ConvexCollision(world) + { + float matrix[16]; - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - m_col = NewtonCreateCylinder( m_world->getNewtonWorld(), (float)radius, (float)height, id, &matrix[0] ); - } + m_col = NewtonCreateCapsule(m_world->getNewtonWorld(), + (float) radius, (float) height, id, &matrix[0]); + } + // OgreNewt::CollisionPrimitives::Cone + Cone::Cone(const World* world) : + ConvexCollision(world) + { + } - // OgreNewt::CollisionPrimitives::Capsule - Capsule::Capsule(const World* world) : ConvexCollision( world ) - {} + Cone::Cone(const World* world, Ogre::Real radius, Ogre::Real height, + int id, const Ogre::Quaternion& orient, + const Ogre::Vector3& pos) : + ConvexCollision(world) + { + float matrix[16]; - Capsule::Capsule( const World* world, Ogre::Real radius, Ogre::Real height, int id, - const Ogre::Quaternion& orient, const Ogre::Vector3& pos ) : ConvexCollision( world ) - { - float matrix[16]; + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + m_col = NewtonCreateCone(m_world->getNewtonWorld(), (float) radius, + (float) height, id, &matrix[0]); + } - m_col = NewtonCreateCapsule( m_world->getNewtonWorld(), (float)radius, (float)height, id, &matrix[0] ); - } + // OgreNewt::CollisionPrimitives::ChamferCylinder + ChamferCylinder::ChamferCylinder(const World* world) : + ConvexCollision(world) + { + } + ChamferCylinder::ChamferCylinder(const World* world, Ogre::Real radius, + Ogre::Real height, int id, const Ogre::Quaternion& orient, + const Ogre::Vector3& pos) : + ConvexCollision(world) + { + float matrix[16]; - // OgreNewt::CollisionPrimitives::Cone - Cone::Cone(const World* world) : ConvexCollision( world ) - {} + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - Cone::Cone( const World* world, Ogre::Real radius, Ogre::Real height, int id, - const Ogre::Quaternion& orient, const Ogre::Vector3& pos ) : ConvexCollision( world ) - { - float matrix[16]; + m_col = NewtonCreateChamferCylinder(m_world->getNewtonWorld(), + (float) radius, (float) height, id, &matrix[0]); + } - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + // OgreNewt::CollisionPrimitives::ConvexHull + ConvexHull::ConvexHull(const World* world) : + ConvexCollision(world) + { + } - m_col = NewtonCreateCone( m_world->getNewtonWorld(), (float)radius, (float)height, id, &matrix[0] ); - } + ConvexHull::ConvexHull(const World* world, Ogre::Entity* obj, int id, + const Ogre::Quaternion& orient, const Ogre::Vector3& pos, + Ogre::Real tolerance, const Ogre::Vector3& forceScale) : + ConvexCollision(world) + { + Ogre::Vector3 scale(1.0, 1.0, 1.0); - // OgreNewt::CollisionPrimitives::ChamferCylinder - ChamferCylinder::ChamferCylinder(const World* world) : ConvexCollision( world ) - {} + //get the mesh! + //Ogre::Entity* obj = (Ogre::Entity*)node->getAttachedObject(0); + Ogre::MeshPtr mesh = obj->getMesh(); - ChamferCylinder::ChamferCylinder( const World* world, Ogre::Real radius, Ogre::Real height, int id, - const Ogre::Quaternion& orient, const Ogre::Vector3& pos ) : ConvexCollision( world ) - { - float matrix[16]; + // get scale, if attached to node + Ogre::Node * node = obj->getParentNode(); + if (node) + scale = node->_getDerivedScale(); - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + if (forceScale != Ogre::Vector3::ZERO) + scale = forceScale; - m_col = NewtonCreateChamferCylinder( m_world->getNewtonWorld(), (float)radius, (float)height, id, &matrix[0] ); - } + //find number of submeshes + unsigned short sub = mesh->getNumSubMeshes(); + size_t total_verts = 0; - - // OgreNewt::CollisionPrimitives::ConvexHull - ConvexHull::ConvexHull(const World* world) : ConvexCollision( world ) - {} + Ogre::VertexData* v_data; + bool addedShared = false; - ConvexHull::ConvexHull( const World* world, Ogre::Entity* obj, int id, const Ogre::Quaternion& orient, const Ogre::Vector3& pos, Ogre::Real tolerance, const Ogre::Vector3& forceScale ) : ConvexCollision( world ) - { - Ogre::Vector3 scale(1.0,1.0,1.0); - - //get the mesh! - //Ogre::Entity* obj = (Ogre::Entity*)node->getAttachedObject(0); - Ogre::MeshPtr mesh = obj->getMesh(); + for (unsigned short i = 0; i < sub; i++) + { + Ogre::SubMesh* sub_mesh = mesh->getSubMesh(i); + if (sub_mesh->useSharedVertices) + { + if (!addedShared) + { + v_data = mesh->sharedVertexData; + total_verts += v_data->vertexCount; - // get scale, if attached to node - Ogre::Node * node = obj->getParentNode(); - if (node) scale = node->_getDerivedScale(); + addedShared = true; + } + } + else + { + v_data = sub_mesh->vertexData; + total_verts += v_data->vertexCount; + } + } - if (forceScale != Ogre::Vector3::ZERO) scale = forceScale; + addedShared = false; - //find number of submeshes - unsigned short sub = mesh->getNumSubMeshes(); + //make array to hold vertex positions! + Ogre::Vector3* vertices = new Ogre::Vector3[total_verts]; + unsigned int offset = 0; - size_t total_verts = 0; + //loop back through, adding vertices as we go! + for (unsigned short i = 0; i < sub; i++) + { + Ogre::SubMesh* sub_mesh = mesh->getSubMesh(i); + Ogre::VertexDeclaration* v_decl; + const Ogre::VertexElement* p_elem; + float* v_Posptr; + size_t v_count; - Ogre::VertexData* v_data; - bool addedShared = false; + v_data = NULL; - for (unsigned short i=0;i<sub;i++) - { - Ogre::SubMesh* sub_mesh = mesh->getSubMesh(i); - if (sub_mesh->useSharedVertices) - { - if (!addedShared) - { - v_data = mesh->sharedVertexData; - total_verts += v_data->vertexCount; + if (sub_mesh->useSharedVertices) + { + if (!addedShared) + { + v_data = mesh->sharedVertexData; + v_count = v_data->vertexCount; + v_decl = v_data->vertexDeclaration; + p_elem = v_decl->findElementBySemantic( + Ogre::VES_POSITION); + addedShared = true; + } + } + else + { + v_data = sub_mesh->vertexData; + v_count = v_data->vertexCount; + v_decl = v_data->vertexDeclaration; + p_elem = v_decl->findElementBySemantic(Ogre::VES_POSITION); + } - addedShared = true; - } - } - else - { - v_data = sub_mesh->vertexData; - total_verts += v_data->vertexCount; - } - } - - addedShared = false; + if (v_data) + { + size_t start = v_data->vertexStart; + //pointer + Ogre::HardwareVertexBufferSharedPtr v_sptr = + v_data->vertexBufferBinding->getBuffer( + p_elem->getSource()); + unsigned char* v_ptr = + static_cast<unsigned char*> (v_sptr->lock( + Ogre::HardwareBuffer::HBL_READ_ONLY)); + unsigned char* v_offset; - //make array to hold vertex positions! - Ogre::Vector3* vertices = new Ogre::Vector3[total_verts]; - unsigned int offset = 0; + //loop through vertex data... + for (size_t j = start; j < (start + v_count); j++) + { + //get offset to Position data! + v_offset = v_ptr + (j * v_sptr->getVertexSize()); + p_elem->baseVertexPointerToElement(v_offset, &v_Posptr); - //loop back through, adding vertices as we go! - for (unsigned short i=0;i<sub;i++) - { - Ogre::SubMesh* sub_mesh = mesh->getSubMesh(i); - Ogre::VertexDeclaration* v_decl; - const Ogre::VertexElement* p_elem; - float* v_Posptr; - size_t v_count; - - v_data = NULL; + //now get vertex positions... + vertices[offset].x = *v_Posptr; + v_Posptr++; + vertices[offset].y = *v_Posptr; + v_Posptr++; + vertices[offset].z = *v_Posptr; + v_Posptr++; - if (sub_mesh->useSharedVertices) - { - if (!addedShared) - { - v_data = mesh->sharedVertexData; - v_count = v_data->vertexCount; - v_decl = v_data->vertexDeclaration; - p_elem = v_decl->findElementBySemantic( Ogre::VES_POSITION ); - addedShared = true; - } - } - else - { - v_data = sub_mesh->vertexData; - v_count = v_data->vertexCount; - v_decl = v_data->vertexDeclaration; - p_elem = v_decl->findElementBySemantic( Ogre::VES_POSITION ); - } + vertices[offset] *= scale; - if (v_data) - { - size_t start = v_data->vertexStart; - //pointer - Ogre::HardwareVertexBufferSharedPtr v_sptr = v_data->vertexBufferBinding->getBuffer( p_elem->getSource() ); - unsigned char* v_ptr = static_cast<unsigned char*>(v_sptr->lock( Ogre::HardwareBuffer::HBL_READ_ONLY )); - unsigned char* v_offset; + offset++; + } - //loop through vertex data... - for (size_t j=start; j<(start+v_count); j++) - { - //get offset to Position data! - v_offset = v_ptr + (j * v_sptr->getVertexSize()); - p_elem->baseVertexPointerToElement( v_offset, &v_Posptr ); + //unlock buffer + v_sptr->unlock(); + } - //now get vertex positions... - vertices[offset].x = *v_Posptr; v_Posptr++; - vertices[offset].y = *v_Posptr; v_Posptr++; - vertices[offset].z = *v_Posptr; v_Posptr++; + } - vertices[offset] *= scale; + float matrix[16]; - offset++; - } + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - //unlock buffer - v_sptr->unlock(); - } + //okay, let's try making the ConvexHull! + m_col = NewtonCreateConvexHull(m_world->getNewtonWorld(), + (int) total_verts, (float*) &vertices[0].x, + sizeof(Ogre::Vector3), tolerance, id, &matrix[0]); - - } + delete[] vertices; - float matrix[16]; + } - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); - - //okay, let's try making the ConvexHull! - m_col = NewtonCreateConvexHull( m_world->getNewtonWorld(), (int)total_verts, (float*)&vertices[0].x, sizeof(Ogre::Vector3), tolerance, id, &matrix[0] ); + // OgreNewt::CollisionPrimitives::ConvexHull + ConvexHull::ConvexHull(const World* world, const Ogre::Vector3* verts, + int vertcount, int id, const Ogre::Quaternion& orient, + const Ogre::Vector3& pos, Ogre::Real tolerance) : + ConvexCollision(world) + { + float matrix[16]; + OgreNewt::Converters::QuatPosToMatrix(orient, pos, &matrix[0]); - delete []vertices; + //make the collision primitive. + m_col = NewtonCreateConvexHull(m_world->getNewtonWorld(), + vertcount, (float*) &verts[0].x, sizeof(Ogre::Vector3), + tolerance, id, &matrix[0]); + } - } + TreeCollision::TreeCollision(const World* world) : + Collision(world) + { + } + TreeCollision::TreeCollision(const World* world, Ogre::Entity* obj, + bool optimize, int id, FaceWinding fw) : + Collision(world) + { + Ogre::Vector3 scale; - // OgreNewt::CollisionPrimitives::ConvexHull - ConvexHull::ConvexHull( const World* world, const Ogre::Vector3* verts, int vertcount, int id, const Ogre::Quaternion& orient, const Ogre::Vector3& pos, Ogre::Real tolerance ) : ConvexCollision( world ) - { - float matrix[16]; - OgreNewt::Converters::QuatPosToMatrix( orient, pos, &matrix[0] ); + start(id); - //make the collision primitive. - m_col = NewtonCreateConvexHull( m_world->getNewtonWorld(), vertcount, (float*)&verts[0].x, sizeof(Ogre::Vector3), tolerance, id, &matrix[0]); - } + Ogre::MeshPtr mesh = obj->getMesh(); + // get scale, if attached to node + Ogre::Node * node = obj->getParentNode(); + if (node) + scale = node->_getDerivedScale(); - TreeCollision::TreeCollision( const World* world) : Collision(world) - { - } + //find number of sub-meshes + unsigned short sub = mesh->getNumSubMeshes(); + for (unsigned short cs = 0; cs < sub; cs++) + { + Ogre::SubMesh* sub_mesh = mesh->getSubMesh(cs); - TreeCollision::TreeCollision( const World* world, Ogre::Entity* obj, bool optimize, int id, FaceWinding fw ) : Collision( world ) - { - Ogre::Vector3 scale; + //vertex data! + Ogre::VertexData* v_data; - start(id); + if (sub_mesh->useSharedVertices) + { + v_data = mesh->sharedVertexData; + } + else + { + v_data = sub_mesh->vertexData; + } - Ogre::MeshPtr mesh = obj->getMesh(); + //let's find more information about the Vertices... + Ogre::VertexDeclaration* v_decl = v_data->vertexDeclaration; + const Ogre::VertexElement* p_elem = + v_decl->findElementBySemantic(Ogre::VES_POSITION); - // get scale, if attached to node - Ogre::Node * node = obj->getParentNode(); - if (node) scale = node->_getDerivedScale(); + // get pointer! + Ogre::HardwareVertexBufferSharedPtr v_sptr = + v_data->vertexBufferBinding->getBuffer( + p_elem->getSource()); + unsigned char* v_ptr = + static_cast<unsigned char*> (v_sptr->lock( + Ogre::HardwareBuffer::HBL_READ_ONLY)); - //find number of sub-meshes - unsigned short sub = mesh->getNumSubMeshes(); + //now find more about the index!! + Ogre::IndexData* i_data = sub_mesh->indexData; + size_t index_count = i_data->indexCount; + size_t poly_count = index_count / 3; - for (unsigned short cs=0;cs<sub;cs++) - { - Ogre::SubMesh* sub_mesh = mesh->getSubMesh(cs); + // get pointer! + Ogre::HardwareIndexBufferSharedPtr i_sptr = i_data->indexBuffer; - //vertex data! - Ogre::VertexData* v_data; + // 16 or 32 bit indices? + bool uses32bit = (i_sptr->getType() + == Ogre::HardwareIndexBuffer::IT_32BIT); + unsigned long* i_Longptr; + unsigned short* i_Shortptr; - if (sub_mesh->useSharedVertices) - { - v_data = mesh->sharedVertexData; - } - else - { - v_data = sub_mesh->vertexData; - } - - //let's find more information about the Vertices... - Ogre::VertexDeclaration* v_decl = v_data->vertexDeclaration; - const Ogre::VertexElement* p_elem = v_decl->findElementBySemantic( Ogre::VES_POSITION ); - - // get pointer! - Ogre::HardwareVertexBufferSharedPtr v_sptr = v_data->vertexBufferBinding->getBuffer( p_elem->getSource() ); - unsigned char* v_ptr = static_cast<unsigned char*>(v_sptr->lock( Ogre::HardwareBuffer::HBL_READ_ONLY )); - - //now find more about the index!! - Ogre::IndexData* i_data = sub_mesh->indexData; - size_t index_count = i_data->indexCount; - size_t poly_count = index_count / 3; - - // get pointer! - Ogre::HardwareIndexBufferSharedPtr i_sptr = i_data->indexBuffer; - - // 16 or 32 bit indices? - bool uses32bit = ( i_sptr->getType() == Ogre::HardwareIndexBuffer::IT_32BIT ); - unsigned long* i_Longptr; - unsigned short* i_Shortptr; - - - if ( uses32bit) - { - i_Longptr = static_cast<unsigned long*>(i_sptr->lock( Ogre::HardwareBuffer::HBL_READ_ONLY )); - - } - else - { - i_Shortptr = static_cast<unsigned short*>(i_sptr->lock( Ogre::HardwareBuffer::HBL_READ_ONLY )); - } + if (uses32bit) + { + i_Longptr = static_cast<unsigned long*> (i_sptr->lock( + Ogre::HardwareBuffer::HBL_READ_ONLY)); + } + else + { + i_Shortptr = static_cast<unsigned short*> (i_sptr->lock( + Ogre::HardwareBuffer::HBL_READ_ONLY)); + } - //now loop through the indices, getting polygon info! - int i_offset = 0; + //now loop through the indices, getting polygon info! + int i_offset = 0; - for (size_t i=0; i<poly_count; i++) - { - Ogre::Vector3 poly_verts[3]; - unsigned char* v_offset; - float* v_Posptr; - int idx; + for (size_t i = 0; i < poly_count; i++) + { + Ogre::Vector3 poly_verts[3]; + unsigned char* v_offset; + float* v_Posptr; + int idx; - if (uses32bit) - { - for (int j=0;j<3;j++) - { - idx = i_Longptr[i_offset+j]; // index to first vertex! - v_offset = v_ptr + (idx * v_sptr->getVertexSize()); - p_elem->baseVertexPointerToElement( v_offset, &v_Posptr ); - //now get vertex position from v_Posptr! - poly_verts[j].x = *v_Posptr; v_Posptr++; - poly_verts[j].y = *v_Posptr; v_Posptr++; - poly_verts[j].z = *v_Posptr; v_Posptr++; + if (uses32bit) + { + for (int j = 0; j < 3; j++) + { + idx = i_Longptr[i_offset + j]; // index to first vertex! + v_offset = v_ptr + (idx * v_sptr->getVertexSize()); + p_elem->baseVertexPointerToElement(v_offset, + &v_Posptr); + //now get vertex position from v_Posptr! + poly_verts[j].x = *v_Posptr; + v_Posptr++; + poly_verts[j].y = *v_Posptr; + v_Posptr++; + poly_verts[j].z = *v_Posptr; + v_Posptr++; - poly_verts[j] *= scale; - } - } - else - { - for (int j=0;j<3;j++) - { - idx = i_Shortptr[i_offset+j]; // index to first vertex! - v_offset = v_ptr + (idx * v_sptr->getVertexSize()); - p_elem->baseVertexPointerToElement( v_offset, &v_Posptr ); - //now get vertex position from v_Posptr! + poly_verts[j] *= scale; + } + } + else + { + for (int j = 0; j < 3; j++) + { + idx = i_Shortptr[i_offset + j]; // index to first vertex! + v_offset = v_ptr + (idx * v_sptr->getVertexSize()); + p_elem->baseVertexPointerToElement(v_offset, + &v_Posptr); + //now get vertex position from v_Posptr! - // switch poly winding. - poly_verts[j].x = *v_Posptr; v_Posptr++; - poly_verts[j].y = *v_Posptr; v_Posptr++; - poly_verts[j].z = *v_Posptr; v_Posptr++; - - poly_verts[j] *= scale; - } - } - - if (fw == FW_DEFAULT) - { - addPoly( poly_verts, cs ); - } - else - { - Ogre::Vector3 rev_poly_verts[3]; - rev_poly_verts[0] = poly_verts[0]; - rev_poly_verts[0] = poly_verts[2]; - rev_poly_verts[0] = poly_verts[1]; + // switch poly winding. + poly_verts[j].x = *v_Posptr; + v_Posptr++; + poly_verts[j].y = *v_Posptr; + v_Posptr++; + poly_verts[j].z = *v_Posptr; + v_Posptr++; - addPoly( rev_poly_verts, cs ); - } + poly_verts[j] *= scale; + } + } - i_offset += 3; - } + if (fw == FW_DEFAULT) + { + addPoly(poly_verts, cs); + } + else + { + Ogre::Vector3 rev_poly_verts[3]; + rev_poly_verts[0] = poly_verts[0]; + rev_poly_verts[0] = poly_verts[2]; + rev_poly_verts[0] = poly_verts[1]; - //unlock the buffers! - v_sptr->unlock(); - i_sptr->unlock(); - - } - //done! - finish( optimize ); - } + addPoly(rev_poly_verts, cs); + } + i_offset += 3; + } - TreeCollision::TreeCollision(const OgreNewt::World *world, int numVertices, int numIndices, const float *vertices, const int *indices, bool optimize, int id, FaceWinding fw) : OgreNewt::Collision( world ) - { - start(id); - - int numPolys = numIndices / 3; - - Ogre::Vector3 *vecVertices = new Ogre::Vector3[numVertices]; - - for (int curVertex = 0; curVertex < numVertices; curVertex++) - { - vecVertices[curVertex].x = vertices[0 + curVertex * 3]; - vecVertices[curVertex].y = vertices[1 + curVertex * 3]; - vecVertices[curVertex].z = vertices[2 + curVertex * 3]; - } - - for ( int poly = 0; poly < numPolys; poly++ ) - { - Ogre::Vector3 poly_verts[3]; - - if (fw == FW_DEFAULT) - { - poly_verts[0] = vecVertices[indices[0 + poly * 3]]; - poly_verts[1] = vecVertices[indices[1 + poly * 3]]; - poly_verts[2] = vecVertices[indices[2 + poly * 3]]; - } - else - { - poly_verts[0] = vecVertices[indices[0 + poly * 3]]; - poly_verts[2] = vecVertices[indices[1 + poly * 3]]; - poly_verts[1] = vecVertices[indices[2 + poly * 3]]; - } - - addPoly( poly_verts, 0 ); - } - - delete [] vecVertices; - - finish( optimize ); - } + //unlock the buffers! + v_sptr->unlock(); + i_sptr->unlock(); + } + //done! + finish(optimize); + } - TreeCollision::TreeCollision( const World* world, int numVertices, Ogre::Vector3* vertices, Ogre::IndexData* indexData, bool optimize, int id, FaceWinding fw) : Collision( world ) - { - start(id); + TreeCollision::TreeCollision(const OgreNewt::World *world, + int numVertices, int numIndices, const float *vertices, + const int *indices, bool optimize, int id, FaceWinding fw) : + OgreNewt::Collision(world) + { + start(id); - unsigned int numPolys = indexData->indexCount / 3; - Ogre::HardwareIndexBufferSharedPtr hwIndexBuffer=indexData->indexBuffer; - size_t indexSize=hwIndexBuffer->getIndexSize(); - void* indices=hwIndexBuffer->lock(Ogre::HardwareBuffer::HBL_READ_ONLY); + int numPolys = numIndices / 3; - assert((indexSize==2) || (indexSize==4)); + Ogre::Vector3 *vecVertices = new Ogre::Vector3[numVertices]; - if (indexSize==2) - { - unsigned short* curIndex=(unsigned short*)indices; - for ( unsigned int poly = 0; poly < numPolys; poly++ ) - { - Ogre::Vector3 poly_verts[3]; + for (int curVertex = 0; curVertex < numVertices; curVertex++) + { + vecVertices[curVertex].x = vertices[0 + curVertex * 3]; + vecVertices[curVertex].y = vertices[1 + curVertex * 3]; + vecVertices[curVertex].z = vertices[2 + curVertex * 3]; + } - //invert vertex winding (otherwise, raycasting won't work???) - if (fw == FW_DEFAULT) - { - poly_verts[0] = vertices[*curIndex]; curIndex++; - poly_verts[1] = vertices[*curIndex]; curIndex++; - poly_verts[2] = vertices[*curIndex]; curIndex++; - } - else - { - poly_verts[0] = vertices[*curIndex]; curIndex++; - poly_verts[2] = vertices[*curIndex]; curIndex++; - poly_verts[1] = vertices[*curIndex]; curIndex++; - } + for (int poly = 0; poly < numPolys; poly++) + { + Ogre::Vector3 poly_verts[3]; - addPoly( poly_verts, 0 ); - } - } - else - { - unsigned int* curIndex=(unsigned int*)indices; - for ( unsigned int poly = 0; poly < numPolys; poly++ ) - { - Ogre::Vector3 poly_verts[3]; + if (fw == FW_DEFAULT) + { + poly_verts[0] = vecVertices[indices[0 + poly * 3]]; + poly_verts[1] = vecVertices[indices[1 + poly * 3]]; + poly_verts[2] = vecVertices[indices[2 + poly * 3]]; + } + else + { + poly_verts[0] = vecVertices[indices[0 + poly * 3]]; + poly_verts[2] = vecVertices[indices[1 + poly * 3]]; + poly_verts[1] = vecVertices[indices[2 + poly * 3]]; + } - if (fw == FW_DEFAULT) - { - poly_verts[0] = vertices[*curIndex]; curIndex++; - poly_verts[1] = vertices[*curIndex]; curIndex++; - poly_verts[2] = vertices[*curIndex]; curIndex++; - } - else - { - poly_verts[0] = vertices[*curIndex]; curIndex++; - poly_verts[2] = vertices[*curIndex]; curIndex++; - poly_verts[1] = vertices[*curIndex]; curIndex++; - } + addPoly(poly_verts, 0); + } - addPoly( poly_verts, 0 ); - } - } - - hwIndexBuffer->unlock(); - finish( optimize ); - } + delete[] vecVertices; + finish(optimize); + } - void TreeCollision::start(int id) - { - m_col = NewtonCreateTreeCollision( m_world->getNewtonWorld(), id ); - NewtonTreeCollisionBeginBuild( m_col ); - } + TreeCollision::TreeCollision(const World* world, int numVertices, + Ogre::Vector3* vertices, Ogre::IndexData* indexData, + bool optimize, int id, FaceWinding fw) : + Collision(world) + { + start(id); - void TreeCollision::addPoly( Ogre::Vector3* polys, unsigned int ID ) - { - NewtonTreeCollisionAddFace( m_col, 3, (float*)&polys[0].x, sizeof(Ogre::Vector3), ID ); - } + unsigned int numPolys = indexData->indexCount / 3; + Ogre::HardwareIndexBufferSharedPtr hwIndexBuffer = + indexData->indexBuffer; + size_t indexSize = hwIndexBuffer->getIndexSize(); + void* indices = hwIndexBuffer->lock( + Ogre::HardwareBuffer::HBL_READ_ONLY); - void TreeCollision::finish( bool optimize ) - { - NewtonTreeCollisionEndBuild( m_col, optimize ); - } + assert((indexSize==2) || (indexSize==4)); + if (indexSize == 2) + { + unsigned short* curIndex = (unsigned short*) indices; + for (unsigned int poly = 0; poly < numPolys; poly++) + { + Ogre::Vector3 poly_verts[3]; - float _CDECL TreeCollision::newtonRayCastCallback(const NewtonBody* body,const NewtonCollision* col,float interception, float *normal, int faceId, void *userData) - { - Body* bod = static_cast<Raycast*>(userData)->mLastBody; - OgreNewt::CollisionPtr collision = static_cast<Raycast*>(userData)->mLastCollision; - - //! TODO: what do we need ... [truncated message content] |