Game Development Community

dev|Pro Game Development Curriculum

SceneObject::objBoxContainsPoint()

by Orion Elenzil · 08/17/2006 (12:04 pm) · 2 comments

SceneObject.h
additions in bold.
Box3F   mObjBox;       ///< Bounding box in object space[b]
   Box3F   mObjBoxScaled; ///< Bounding box in object space, convolved by mObjScale.[/b]
   Box3F   mWorldBox;     ///< Bounding box in world space
   SphereF mWorldSphere;  ///< Bounding sphere in world space
public:
      SceneRenderState mSRS;
      //basically these two virtual methods are implemented for notifying derived classes when they first
      //enter the render state, and when they leave the render state
      virtual void onSceneRenderEnter(){}
      virtual void onSceneRenderLeave(){}
   [b]
   public:
   bool objBoxContainsPoint(const Point3F& point);[/b]


SceneObject.cc
additions in bold.
void SceneObject::setScale(const VectorF & scale)
{
   mObjScale = scale;
   setTransform(MatrixF(mObjToWorld));

   // Make sure that any subclasses of me get a chance to react to the
   // scale being changed.
   onScaleChanged();
   [b]
   mObjBoxScaled = mObjBox;
   mObjBoxScaled.min.convolve(mObjScale);
   mObjBoxScaled.max.convolve(mObjScale);
   [/b]
   setMaskBits( ScaleMask );
} 

void SceneObject::resetWorldBox()
{
   AssertFatal(mObjBox.isValidBox(), "Bad object box!");
   mWorldBox = mObjBox;
   mWorldBox.min.convolve(mObjScale);
   mWorldBox.max.convolve(mObjScale);
   mObjToWorld.mul(mWorldBox);
// #if defined(__linux__) || defined(__OpenBSD__)
//    if( !mWorldBox.isValidBox() ) {
//       // reset
//       mWorldBox.min.set( 0.0f, 0.0f, 0.0f );
//       mWorldBox.max.set( 0.0f, 0.0f, 0.0f );
//    }
// #else
   AssertFatal(mWorldBox.isValidBox(), "Bad world box!");
//#endif

   // Create mWorldSphere from mWorldBox
   mWorldBox.getCenter(&mWorldSphere.center);
   mWorldSphere.radius = (mWorldBox.max - mWorldSphere.center).len();
   [b]
   mObjBoxScaled = mObjBox;
   mObjBoxScaled.min.convolve(mObjScale);
   mObjBoxScaled.max.convolve(mObjScale);[/b]
}
[b]
//------------------------------------------------------------------------

bool SceneObject::objBoxContainsPoint(const Point3F& point)
{
   Point3F pointObjSpace;
   mWorldToObj.mulP(point, &pointObjSpace);

   return mObjBoxScaled.isContained(pointObjSpace);
}

ConsoleMethod( SceneObject, objBoxContainsPoint, bool , 3, 3, "(point)")
{
   Point3F pos;
   dSscanf(argv[2],"%f %f %f", &pos.x, &pos.y, &pos.z);
   return object->objBoxContainsPoint(pos);
}
[/b]

#1
08/17/2006 (2:42 pm)
Now this is nice. I can see many uses for this. thanks.