127 lines
4.3 KiB
C++
127 lines
4.3 KiB
C++
// Filename: boundedObject.cxx
|
|
// Created by: drose (02Oct99)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "boundedObject.h"
|
|
#include "config_gobj.h"
|
|
|
|
#include "boundingSphere.h"
|
|
|
|
TypeHandle BoundedObject::_type_handle;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: BoundedObject::Destructor
|
|
// Access: Public, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
BoundedObject::
|
|
~BoundedObject() {
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: BoundedObject::get_bound
|
|
// Access: Published
|
|
// Description: Returns the current bounding volume on this node,
|
|
// possibly forcing a recompute. A node's bounding
|
|
// volume encloses only the node itself, irrespective of
|
|
// the nodes above or below it in the graph. This is
|
|
// different from the bounding volumes on the arcs,
|
|
// which enclose all geometry below them.
|
|
////////////////////////////////////////////////////////////////////
|
|
const BoundingVolume &BoundedObject::
|
|
get_bound() const {
|
|
{
|
|
CDReader cdata(_cycler);
|
|
if (cdata->_bound_type == BVT_static) {
|
|
CDWriter cdata_w(((BoundedObject *)this)->_cycler, cdata);
|
|
cdata_w->_flags &= ~F_bound_stale;
|
|
return *cdata_w->_bound;
|
|
}
|
|
|
|
if (!is_bound_stale() && cdata->_bound != (BoundingVolume *)NULL) {
|
|
return *cdata->_bound;
|
|
}
|
|
|
|
// We need to recompute the bounding volume. First, we need to
|
|
// release the old CDReader, so we can make a CDWriter in
|
|
// recompute_bound.
|
|
}
|
|
|
|
// Now it's safe to recompute the bounds.
|
|
((BoundedObject *)this)->recompute_bound();
|
|
CDReader cdata(_cycler);
|
|
return *cdata->_bound;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: BoundedObject::CData::make_copy
|
|
// Access: Public, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
CycleData *BoundedObject::CData::
|
|
make_copy() const {
|
|
return new CData(*this);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: BoundedObject::propagate_stale_bound
|
|
// Access: Protected, Virtual
|
|
// Description: Called by BoundedObject::mark_bound_stale(), this
|
|
// should make sure that all bounding volumes that
|
|
// depend on this one are marked stale also.
|
|
////////////////////////////////////////////////////////////////////
|
|
void BoundedObject::
|
|
propagate_stale_bound() {
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: BoundedObject::recompute_bound
|
|
// Access: Protected, Virtual
|
|
// Description: Recomputes the dynamic bounding volume for this
|
|
// object. The default behavior is the compute an empty
|
|
// bounding volume; this may be overridden to extend it
|
|
// to create a nonempty bounding volume. However, after
|
|
// calling this function, it is guaranteed that the
|
|
// _bound pointer will not be shared with any other
|
|
// stage of the pipeline, and this new pointer is
|
|
// returned.
|
|
////////////////////////////////////////////////////////////////////
|
|
BoundingVolume *BoundedObject::
|
|
recompute_bound() {
|
|
CDWriter cdata(_cycler);
|
|
switch (cdata->_bound_type) {
|
|
case BVT_static:
|
|
// Don't change it if it's a static volume.
|
|
break;
|
|
|
|
case BVT_dynamic_sphere:
|
|
cdata->_bound = new BoundingSphere;
|
|
break;
|
|
|
|
default:
|
|
gobj_cat.error()
|
|
<< "Unexpected _bound_type: " << (int)cdata->_bound_type
|
|
<< " in BoundedObject::recompute_bound()\n";
|
|
cdata->_bound = new BoundingSphere;
|
|
}
|
|
|
|
cdata->_flags &= ~F_bound_stale;
|
|
|
|
// Now the _bound is new and empty.
|
|
return cdata->_bound;
|
|
}
|