From: <kal...@us...> - 2010-08-25 09:40:55
|
Revision: 2963 http://ogreaddons.svn.sourceforge.net/ogreaddons/?rev=2963&view=rev Author: kallaspriit Date: 2010-08-25 09:40:46 +0000 (Wed, 25 Aug 2010) Log Message: ----------- Added Body::getMass(), Body::getInertia() Some changes to casting, debugger and helper tools Modified Paths: -------------- branches/ogrenewt/newton20/OgreNewt_VS9.suo branches/ogrenewt/newton20/inc/OgreNewt_Body.h branches/ogrenewt/newton20/inc/OgreNewt_ConvexCast.h branches/ogrenewt/newton20/src/OgreNewt_Body.cpp branches/ogrenewt/newton20/src/OgreNewt_ConvexCast.cpp branches/ogrenewt/newton20/src/OgreNewt_Debugger.cpp branches/ogrenewt/newton20/src/OgreNewt_RayCast.cpp branches/ogrenewt/newton20/src/OgreNewt_Tools.cpp branches/ogrenewt/newton20/src/OgreNewt_World.cpp Modified: branches/ogrenewt/newton20/OgreNewt_VS9.suo =================================================================== (Binary files differ) Modified: branches/ogrenewt/newton20/inc/OgreNewt_Body.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_Body.h 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/inc/OgreNewt_Body.h 2010-08-25 09:40:46 UTC (rev 2963) @@ -344,6 +344,12 @@ //! get Ogre::Real(mass) and Ogre::Vector3(inertia) of the body. void getMassMatrix( Ogre::Real& mass, Ogre::Vector3& inertia ) const; + //! return body mass + Ogre::Real getMass() const; + + //! return body inertia + Ogre::Vector3 getInertia() const; + //! get invert mass + inertia for the body. void getInvMass( Ogre::Real& mass, Ogre::Vector3& inertia ) const; Modified: branches/ogrenewt/newton20/inc/OgreNewt_ConvexCast.h =================================================================== --- branches/ogrenewt/newton20/inc/OgreNewt_ConvexCast.h 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/inc/OgreNewt_ConvexCast.h 2010-08-25 09:40:46 UTC (rev 2963) @@ -112,27 +112,42 @@ \param startpt starting point of ray in global space \param colori orientation of the collision in global space \param endpt ending point of ray in global space - \param maxcontactscount maximum number of contacts that should be saved + \param maxcontactscount maximum number of contacts that should be saved + \param threadIndex Thread index + \param ignoreBody Body to ignore in filter, use if you're casting from inside other body and need to ignore it */ - BasicConvexcast( const OgreNewt::World* world, const OgreNewt::ConvexCollisionPtr& col, const Ogre::Vector3& startpt, const Ogre::Quaternion &colori, const Ogre::Vector3& endpt, int maxcontactscount, int threadIndex); + BasicConvexcast( const OgreNewt::World* world, const OgreNewt::ConvexCollisionPtr& col, const Ogre::Vector3& startpt, const Ogre::Quaternion &colori, const Ogre::Vector3& endpt, int maxcontactscount, int threadIndex, OgreNewt::Body* ignoreBody = NULL); //! destuctor. ~BasicConvexcast(); + //! prefilter filter, ignores body set in constructor or always returns true if it's not set + bool userPreFilterCallback( OgreNewt::Body* body ); + + //! sets body to ignore in filter + void setIgnoreBody( OgreNewt::Body* body ) { mIgnoreBody = body; } + + //! return body ignored in filter + OgreNewt::Body* getIgnoreBody() { return mIgnoreBody; } + // ------------------------------------------------------ // the following functions can be used to retrieve information about the bodies collided by the convexcast. //! how many bodies did we hit? if maxcontactscount is to small, this value will be smaller too! int calculateBodyHitCount() const; - //! how many contacts do we have - int getContactsCount() const; + //! how many contacts do we have + int getContactsCount() const; //! retrieve the raycast info for a specific hit. ConvexcastContactInfo getInfoAt( int hitnum ) const; - //! retrieve the distance to the first contact (in range [0,1] from startpt to endpt) - Ogre::Real getDistanceToFirstHit() const; + //! retrieve the distance to the first contact (in range [0,1] from startpt to endpt) + Ogre::Real getDistanceToFirstHit() const; + +protected: + //! Body to ignore in filter + OgreNewt::Body* mIgnoreBody; }; Modified: branches/ogrenewt/newton20/src/OgreNewt_Body.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_Body.cpp 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/src/OgreNewt_Body.cpp 2010-08-25 09:40:46 UTC (rev 2963) @@ -95,8 +95,6 @@ me->m_prevRotation = -1.0f * me->m_prevRotation; } - me->m_accumulatedGlobalForces.clear(); - /* // if (me->m_node) { // if (m_nodeupdateneeded && !forceNodeUpdate ) @@ -138,6 +136,8 @@ me->addGlobalForce(it->first, it->second); } + + me->m_accumulatedGlobalForces.clear(); } @@ -320,6 +320,26 @@ NewtonBodyGetMassMatrix( m_body, &mass, &inertia.x, &inertia.y, &inertia.z ); } +Ogre::Real Body::getMass() const +{ + Ogre::Real mass; + Ogre::Vector3 inertia; + + NewtonBodyGetMassMatrix( m_body, &mass, &inertia.x, &inertia.y, &inertia.z ); + + return mass; +} + +Ogre::Vector3 Body::getInertia() const +{ + Ogre::Real mass; + Ogre::Vector3 inertia; + + NewtonBodyGetMassMatrix( m_body, &mass, &inertia.x, &inertia.y, &inertia.z ); + + return inertia; +} + void Body::getInvMass( Ogre::Real& mass, Ogre::Vector3& inertia ) const { NewtonBodyGetInvMass( m_body, &mass, &inertia.x, &inertia.y, &inertia.z ); Modified: branches/ogrenewt/newton20/src/OgreNewt_ConvexCast.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_ConvexCast.cpp 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/src/OgreNewt_ConvexCast.cpp 2010-08-25 09:40:46 UTC (rev 2963) @@ -103,13 +103,26 @@ { } - BasicConvexcast::BasicConvexcast(const OgreNewt::World* world, const OgreNewt::ConvexCollisionPtr& col, const Ogre::Vector3& startpt, const Ogre::Quaternion &colori, const Ogre::Vector3& endpt, int maxcontactscount, int threadIndex) + BasicConvexcast::BasicConvexcast(const OgreNewt::World* world, const OgreNewt::ConvexCollisionPtr& col, const Ogre::Vector3& startpt, const Ogre::Quaternion &colori, const Ogre::Vector3& endpt, int maxcontactscount, int threadIndex, OgreNewt::Body* ignoreBody) { + mIgnoreBody = ignoreBody; + go( world, col, startpt, colori, endpt, maxcontactscount, threadIndex); } BasicConvexcast::~BasicConvexcast() {} + bool BasicConvexcast::userPreFilterCallback( OgreNewt::Body* body ) + { + if (mIgnoreBody == NULL || mIgnoreBody != body) + { + return true; + } + else + { + return false; + } + } int BasicConvexcast::calculateBodyHitCount() const { Modified: branches/ogrenewt/newton20/src/OgreNewt_Debugger.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_Debugger.cpp 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/src/OgreNewt_Debugger.cpp 2010-08-25 09:40:46 UTC (rev 2963) @@ -247,7 +247,7 @@ data->m_updated = 1; m_debugnode->addChild(data->m_node); data->m_text->setCaption(oss_info.str()); - data->m_text->setLocalTranslation(bod->getAABB().getSize().y*1.1*Ogre::Vector3::UNIT_Y); + data->m_text->setLocalTranslation(bod->getAABB().getSize().y * 1.1f * Ogre::Vector3::UNIT_Y); } else { @@ -277,12 +277,12 @@ if( data->m_text ) { data->m_text->setCaption(oss_info.str()); - data->m_text->setLocalTranslation(bod->getAABB().getMaximum().y*1.1*Ogre::Vector3::UNIT_Y); + data->m_text->setLocalTranslation(bod->getAABB().getMaximum().y * 1.1f * Ogre::Vector3::UNIT_Y); } else { data->m_text = new OgreNewt::OgreAddons::MovableText( oss_name.str(), oss_info.str(), "BlueHighway-10",0.5); - data->m_text->setLocalTranslation(bod->getAABB().getMaximum().y/2*Ogre::Vector3::UNIT_Y+Ogre::Vector3::UNIT_Y*0.1); + data->m_text->setLocalTranslation(bod->getAABB().getMaximum().y / 2.0f * Ogre::Vector3::UNIT_Y + Ogre::Vector3::UNIT_Y * 0.1f); data->m_text->setTextAlignment( OgreNewt::OgreAddons::MovableText::H_LEFT, OgreNewt::OgreAddons::MovableText::V_ABOVE ); } @@ -427,8 +427,9 @@ line->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST ); line->colour(m_convexcol); + /* // aab1 - Ogre::AxisAlignedBox aab1 = col->getAABB(colori, startpt); + Ogre::AxisAlignedBox aab1 = col->getAABB(colori, startpt); const Ogre::Vector3* corners1 = aab1.getAllCorners(); Ogre::AxisAlignedBox aab2 = col->getAABB(colori, endpt); const Ogre::Vector3* corners2 = aab2.getAllCorners(); @@ -449,14 +450,19 @@ line->position(corners2[1]); line->position(corners2[5]); line->position(corners2[2]); line->position(corners2[4]); line->position(corners2[3]); line->position(corners2[7]); + */ // bodies float matrix[16]; + Converters::QuatPosToMatrix(colori, startpt, &matrix[0]); NewtonCollisionForEachPolygonDo( col->getNewtonCollision(), &matrix[0], newtonPerPoly, line ); - Converters::QuatPosToMatrix(colori, endpt, &matrix[0]); - NewtonCollisionForEachPolygonDo( col->getNewtonCollision(), &matrix[0], newtonPerPoly, line ); + if (endpt != startpt) + { + Converters::QuatPosToMatrix(colori, endpt, &matrix[0]); + NewtonCollisionForEachPolygonDo( col->getNewtonCollision(), &matrix[0], newtonPerPoly, line ); + } line->end(); Modified: branches/ogrenewt/newton20/src/OgreNewt_RayCast.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_RayCast.cpp 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/src/OgreNewt_RayCast.cpp 2010-08-25 09:40:46 UTC (rev 2963) @@ -52,7 +52,7 @@ if (me->userCallback( bod, intersectParam, normal, collisionID )) return intersectParam; else - return 1.1; + return 1.1f; } Modified: branches/ogrenewt/newton20/src/OgreNewt_Tools.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_Tools.cpp 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/src/OgreNewt_Tools.cpp 2010-08-25 09:40:46 UTC (rev 2963) @@ -494,7 +494,7 @@ Real spaceWidth = mSpaceWidth; // Derive space width from a capital A if (spaceWidth == 0) - spaceWidth = mpFont->getGlyphAspectRatio('A') * mCharHeight * 2.0; + spaceWidth = mpFont->getGlyphAspectRatio('A') * mCharHeight * 2.0f; // for calculation of AABB Ogre::Vector3 min, max, currPos; @@ -516,10 +516,10 @@ verticalOffset = mCharHeight; break; case MovableText::V_CENTER: - verticalOffset = 0.5*mCharHeight; + verticalOffset = 0.5f * mCharHeight; break; case MovableText::V_BELOW: - verticalOffset = 0; + verticalOffset = 0.0f; break; } // Raise the first line of the caption @@ -527,7 +527,7 @@ for (i = mCaption.begin(); i != iend; ++i) { if (*i == '\n') - top += verticalOffset * 2.0; + top += verticalOffset * 2.0f; } for (i = mCaption.begin(); i != iend; ++i) @@ -540,15 +540,15 @@ if (*j == ' ') len += spaceWidth; else - len += mpFont->getGlyphAspectRatio(*j) * mCharHeight * 2.0; + len += mpFont->getGlyphAspectRatio(*j) * mCharHeight * 2.0f; } newLine = false; } if (*i == '\n') { - left = 0 * 2.0 - 1.0; - top -= mCharHeight * 2.0; + left = 0 * 2.0f - 1.0f; + top -= mCharHeight * 2.0f; newLine = true; continue; } @@ -603,7 +603,7 @@ maxSquaredRadius = GetMax(maxSquaredRadius, currPos.squaredLength()); } - top -= mCharHeight * 2.0; + top -= mCharHeight * 2.0f; // Bottom left if(mHorizontalAlignment == MovableText::H_LEFT) @@ -617,21 +617,21 @@ // Deal with bounds if(mHorizontalAlignment == MovableText::H_LEFT) - currPos = Ogre::Vector3(left, top, -1.0); + currPos = Ogre::Vector3(left, top, -1.0f); else - currPos = Ogre::Vector3(left - (len / 2), top, -1.0); + currPos = Ogre::Vector3(left - (len / 2.0f), top, -1.0f); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = GetMax(maxSquaredRadius, currPos.squaredLength()); - top += mCharHeight * 2.0; - left += horiz_height * mCharHeight * 2.0; + top += mCharHeight * 2.0f; + left += horiz_height * mCharHeight * 2.0f; // Top right if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else - *pPCBuff++ = left - (len / 2); + *pPCBuff++ = left - (len / 2.0f); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u2; @@ -640,9 +640,9 @@ // Deal with bounds if(mHorizontalAlignment == MovableText::H_LEFT) - currPos = Ogre::Vector3(left, top, -1.0); + currPos = Ogre::Vector3(left, top, -1.0f); else - currPos = Ogre::Vector3(left - (len / 2), top, -1.0); + currPos = Ogre::Vector3(left - (len / 2.0f), top, -1.0f); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = GetMax(maxSquaredRadius, currPos.squaredLength()); @@ -654,57 +654,57 @@ if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else - *pPCBuff++ = left - (len / 2); + *pPCBuff++ = left - (len / 2.0f); *pPCBuff++ = top; - *pPCBuff++ = -1.0; + *pPCBuff++ = -1.0f; *pPCBuff++ = u2; *pPCBuff++ = v1; - currPos = Ogre::Vector3(left, top, -1.0); + currPos = Ogre::Vector3(left, top, -1.0f); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = GetMax(maxSquaredRadius, currPos.squaredLength()); - top -= mCharHeight * 2.0; - left -= horiz_height * mCharHeight * 2.0; + top -= mCharHeight * 2.0f; + left -= horiz_height * mCharHeight * 2.0f; // Bottom left (again) if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else - *pPCBuff++ = left - (len / 2); + *pPCBuff++ = left - (len / 2.0f); *pPCBuff++ = top; - *pPCBuff++ = -1.0; + *pPCBuff++ = -1.0f; *pPCBuff++ = u1; *pPCBuff++ = v2; - currPos = Ogre::Vector3(left, top, -1.0); + currPos = Ogre::Vector3(left, top, -1.0f); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = GetMax(maxSquaredRadius, currPos.squaredLength()); - left += horiz_height * mCharHeight * 2.0; + left += horiz_height * mCharHeight * 2.0f; // Bottom right if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else - *pPCBuff++ = left - (len / 2); + *pPCBuff++ = left - (len / 2.0f); *pPCBuff++ = top; - *pPCBuff++ = -1.0; + *pPCBuff++ = -1.0f; *pPCBuff++ = u2; *pPCBuff++ = v2; //------------------------------------------------------------------------------------- - currPos = Ogre::Vector3(left, top, -1.0); + currPos = Ogre::Vector3(left, top, -1.0f); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = GetMax(maxSquaredRadius, currPos.squaredLength()); // Go back up with top - top += mCharHeight * 2.0; + top += mCharHeight * 2.0f; - float currentWidth = (left + 1)/2 - 0; + float currentWidth = (left + 1.0f) / 2.0f; if (currentWidth > largestWidth) largestWidth = currentWidth; } Modified: branches/ogrenewt/newton20/src/OgreNewt_World.cpp =================================================================== --- branches/ogrenewt/newton20/src/OgreNewt_World.cpp 2010-08-07 11:26:06 UTC (rev 2962) +++ branches/ogrenewt/newton20/src/OgreNewt_World.cpp 2010-08-25 09:40:46 UTC (rev 2963) @@ -110,14 +110,14 @@ if (m_timestep > 1.0f / 10.0f) { // recalculate the iteration count to met the desire fps - m_maxTicksPerFrames += ceilf (m_timestep / (1.0f / 10.0f)); - m_timestep = 1.0 / 10.0f; - m_updateFPS = 10; + m_maxTicksPerFrames += (int)ceilf (m_timestep / (1.0f / 10.0f)); + m_timestep = 1.0f / 10.0f; + m_updateFPS = 10.0f; } if (m_timestep < 1.0f / 1000.0f) { - m_timestep = 1.0 / 1000.0f; - m_updateFPS = 1000; + m_timestep = 1.0f / 1000.0f; + m_updateFPS = 1000.0f; } m_invTimestep = 1.0f / m_timestep; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |