further fixes for collision under local root
This commit is contained in:
parent
616de46c25
commit
a01ef2534c
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
#include "collisionHandlerQueue.h"
|
||||
#include "config_collide.h"
|
||||
#include "indent.h"
|
||||
|
||||
TypeHandle CollisionHandlerQueue::_type_handle;
|
||||
|
||||
|
|
@ -41,7 +42,7 @@ public:
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::Constructor
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CollisionHandlerQueue::
|
||||
|
|
@ -50,7 +51,7 @@ CollisionHandlerQueue() {
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::begin_group
|
||||
// Access: Public, Virtual
|
||||
// Access: Published, Virtual
|
||||
// Description: Will be called by the CollisionTraverser before a new
|
||||
// traversal is begun. It instructs the handler to
|
||||
// reset itself in preparation for a number of
|
||||
|
|
@ -63,7 +64,7 @@ begin_group() {
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::add_entry
|
||||
// Access: Public, Virtual
|
||||
// Access: Published, Virtual
|
||||
// Description: Called between a begin_group() .. end_group()
|
||||
// sequence for each collision that is detected.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -75,7 +76,7 @@ add_entry(CollisionEntry *entry) {
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::sort_entries
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description: Sorts all the detected collisions front-to-back by
|
||||
// from_intersection_point() so that those intersection
|
||||
// points closest to the collider's origin (e.g., the
|
||||
|
|
@ -113,7 +114,7 @@ sort_entries() {
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::clear_entries
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description: Removes all the entries from the queue.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CollisionHandlerQueue::
|
||||
|
|
@ -123,7 +124,7 @@ clear_entries() {
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::get_num_entries
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description: Returns the number of CollisionEntries detected last
|
||||
// pass.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -134,7 +135,7 @@ get_num_entries() const {
|
|||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::get_entry
|
||||
// Access: Public
|
||||
// Access: Published
|
||||
// Description: Returns the nth CollisionEntry detected last pass.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
CollisionEntry *CollisionHandlerQueue::
|
||||
|
|
@ -142,3 +143,29 @@ get_entry(int n) const {
|
|||
nassertr(n >= 0 && n < (int)_entries.size(), NULL);
|
||||
return _entries[n];
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::output
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CollisionHandlerQueue::
|
||||
output(ostream &out) const {
|
||||
out << "CollisionHandlerQueue, " << _entries.size() << " entries";
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionHandlerQueue::write
|
||||
// Access: Published
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void CollisionHandlerQueue::
|
||||
write(ostream &out, int indent_level) const {
|
||||
indent(out, indent_level)
|
||||
<< "CollisionHandlerQueue, " << _entries.size() << " entries:\n";
|
||||
|
||||
Entries::const_iterator ei;
|
||||
for (ei = _entries.begin(); ei != _entries.end(); ++ei) {
|
||||
(*ei)->write(out, indent_level + 2);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,6 +48,9 @@ PUBLISHED:
|
|||
int get_num_entries() const;
|
||||
CollisionEntry *get_entry(int n) const;
|
||||
|
||||
void output(ostream &out) const;
|
||||
void write(ostream &out, int indent_level = 0) const;
|
||||
|
||||
private:
|
||||
typedef pvector< PT(CollisionEntry) > Entries;
|
||||
Entries _entries;
|
||||
|
|
@ -70,6 +73,11 @@ private:
|
|||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
INLINE ostream &operator << (ostream &out, const CollisionHandlerQueue &chq) {
|
||||
chq.output(out);
|
||||
return out;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,15 +16,3 @@
|
|||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionRecorder::get_type_index
|
||||
// Access: Published
|
||||
// Description: Duplicates the functionality of
|
||||
// TypedObject::get_type_index().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE int CollisionRecorder::
|
||||
get_type_index() const {
|
||||
return get_type().get_index();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class CollisionEntry;
|
|||
// class that just provides an interface for recording
|
||||
// collisions tested and detected each frame.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDA CollisionRecorder {
|
||||
class EXPCL_PANDA CollisionRecorder : public TypedObject {
|
||||
protected:
|
||||
CollisionRecorder();
|
||||
public:
|
||||
|
|
@ -58,18 +58,15 @@ public:
|
|||
static TypeHandle get_class_type() {
|
||||
return _type_handle;
|
||||
}
|
||||
|
||||
static void init_type() {
|
||||
register_type(_type_handle, "CollisionRecorder");
|
||||
TypedObject::init_type();
|
||||
register_type(_type_handle, "CollisionRecorder",
|
||||
TypedObject::get_class_type());
|
||||
}
|
||||
|
||||
PUBLISHED:
|
||||
// We have to publish this explicitly because the CollisionRecorder
|
||||
// object does not inherit from TypedObject.
|
||||
virtual TypeHandle get_type() const {
|
||||
return get_class_type();
|
||||
}
|
||||
INLINE int get_type_index() const;
|
||||
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||||
|
||||
private:
|
||||
static TypeHandle _type_handle;
|
||||
|
|
|
|||
|
|
@ -30,27 +30,83 @@ SolidInfo() {
|
|||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionVisualizer::set_viz_scale
|
||||
// Function: CollisionVisualizer::set_point_scale
|
||||
// Access: Published
|
||||
// Description: Scales the objects that are drawn to represent the
|
||||
// normals and points of the collisions. By default,
|
||||
// these objects are drawn at an arbitrary scale which
|
||||
// is appropriate if the scene units are measured in
|
||||
// feet. Change this scale accordinatly if the scene
|
||||
// units are measured on some other scale or if you need
|
||||
// to observe these objects from farther away.
|
||||
// Description: Scales the points that are drawn to represent the
|
||||
// surface and interior intersection points of the
|
||||
// collisions. By default, these objects are drawn at
|
||||
// an arbitrary scale which is appropriate if the window
|
||||
// units are the default range -1 .. 1. Change this
|
||||
// scale accordinatly if the window units are measured
|
||||
// on some other scale or if you need to observe these
|
||||
// objects in a smaller window.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void CollisionVisualizer::
|
||||
set_viz_scale(float viz_scale) {
|
||||
_viz_scale = viz_scale;
|
||||
set_point_scale(float point_scale) {
|
||||
_point_scale = point_scale;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionVisualizer::get_viz_scale
|
||||
// Function: CollisionVisualizer::get_point_scale
|
||||
// Access: Published
|
||||
// Description: Returns the value last set by set_viz_scale().
|
||||
// Description: Returns the value last set by set_point_scale().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float CollisionVisualizer::
|
||||
get_viz_scale() const {
|
||||
return _viz_scale;
|
||||
get_point_scale() const {
|
||||
return _point_scale;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionVisualizer::set_normal_scale
|
||||
// Access: Published
|
||||
// Description: Scales the line segments that are drawn to represent
|
||||
// the normals of the collisions. By default, these
|
||||
// objects are drawn at an arbitrary scale which is
|
||||
// appropriate if the scene units are measured in feet.
|
||||
// Change this scale accordinatly if the scene units are
|
||||
// measured on some other scale or if you need to
|
||||
// observe these normals from farther away.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void CollisionVisualizer::
|
||||
set_normal_scale(float normal_scale) {
|
||||
_normal_scale = normal_scale;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionVisualizer::get_normal_scale
|
||||
// Access: Published
|
||||
// Description: Returns the value last set by set_normal_scale().
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE float CollisionVisualizer::
|
||||
get_normal_scale() const {
|
||||
return _normal_scale;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionVisualizer::as_typed_object
|
||||
// Access: Public
|
||||
// Description: This is provided to disambiguate the typecast to
|
||||
// TypedObject, since we have two TypedObjects in our
|
||||
// inheritance chain.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE TypedObject *CollisionVisualizer::
|
||||
as_typed_object() {
|
||||
// In fact, it really doesn't matter which one we pick. Arbitrarily
|
||||
// pick the one that goes through PandaNode.
|
||||
return PandaNode::as_typed_object();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: CollisionVisualizer::as_typed_object
|
||||
// Access: Public
|
||||
// Description: This is provided to disambiguate the typecast to
|
||||
// TypedObject, since we have two TypedObjects in our
|
||||
// inheritance chain.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE const TypedObject * CollisionVisualizer::
|
||||
as_typed_object() const {
|
||||
// In fact, it really doesn't matter which one we pick. Arbitrarily
|
||||
// pick the one that goes through PandaNode.
|
||||
return PandaNode::as_typed_object();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ CollisionVisualizer(const string &name) : PandaNode(name) {
|
|||
// We always want to render the CollisionVisualizer node itself
|
||||
// (even if it doesn't appear to have any geometry within it).
|
||||
set_internal_bounds(new OmniBoundingVolume());
|
||||
_viz_scale = 1.0f;
|
||||
_point_scale = 1.0f;
|
||||
_normal_scale = 1.0f;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -137,6 +138,8 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||
// always renders its objects according to their appropriate net
|
||||
// transform.
|
||||
xform_data._net_transform = TransformState::make_identity();
|
||||
xform_data._view_frustum = trav->get_view_frustum();
|
||||
xform_data._guard_band = trav->get_guard_band();
|
||||
xform_data.apply_transform_and_state(trav, net_transform,
|
||||
RenderState::make_empty(),
|
||||
RenderEffects::make_empty(),
|
||||
|
|
@ -167,7 +170,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||
// Now draw all of the detected points.
|
||||
if (!viz_info._points.empty()) {
|
||||
CPT(RenderState) empty_state = RenderState::make_empty();
|
||||
CPT(RenderState) point_state = RenderState::make(RenderModeAttrib::make(RenderModeAttrib::M_unchanged, 1.0f, true));
|
||||
CPT(RenderState) point_state = RenderState::make(RenderModeAttrib::make(RenderModeAttrib::M_unchanged, 1.0f, false));
|
||||
|
||||
PT(GeomVertexArrayFormat) point_array_format =
|
||||
new GeomVertexArrayFormat(InternalName::get_vertex(), 3,
|
||||
|
|
@ -197,14 +200,14 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||
|
||||
vertex.add_data3f(point._surface_point);
|
||||
color.add_data4f(1.0f, 0.0f, 0.0f, 1.0f);
|
||||
size.add_data1f(0.1f * _viz_scale);
|
||||
size.add_data1f(16.0f * _point_scale);
|
||||
points->add_next_vertices(1);
|
||||
points->close_primitive();
|
||||
|
||||
if (point._interior_point != point._surface_point) {
|
||||
vertex.add_data3f(point._interior_point);
|
||||
color.add_data4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
size.add_data1f(0.05f * _viz_scale);
|
||||
size.add_data1f(8.0f * _point_scale);
|
||||
points->add_next_vertices(1);
|
||||
points->close_primitive();
|
||||
}
|
||||
|
|
@ -234,7 +237,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||
|
||||
vertex.add_data3f(point._surface_point);
|
||||
vertex.add_data3f(point._surface_point +
|
||||
point._surface_normal * _viz_scale);
|
||||
point._surface_normal * _normal_scale);
|
||||
color.add_data4f(1.0f, 0.0f, 0.0f, 1.0f);
|
||||
color.add_data4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
lines->add_next_vertices(2);
|
||||
|
|
|
|||
|
|
@ -43,8 +43,11 @@ PUBLISHED:
|
|||
CollisionVisualizer(const string &name);
|
||||
virtual ~CollisionVisualizer();
|
||||
|
||||
INLINE void set_viz_scale(float viz_scale);
|
||||
INLINE float get_viz_scale() const;
|
||||
INLINE void set_point_scale(float point_scale);
|
||||
INLINE float get_point_scale() const;
|
||||
|
||||
INLINE void set_normal_scale(float normal_scale);
|
||||
INLINE float get_normal_scale() const;
|
||||
|
||||
void clear();
|
||||
|
||||
|
|
@ -59,6 +62,10 @@ public:
|
|||
virtual void begin_traversal();
|
||||
virtual void collision_tested(const CollisionEntry &entry, bool detected);
|
||||
|
||||
// To disambiguate the multiple inheritance from TypedObject.
|
||||
INLINE TypedObject *as_typed_object();
|
||||
INLINE const TypedObject *as_typed_object() const;
|
||||
|
||||
private:
|
||||
CPT(RenderState) get_viz_state();
|
||||
|
||||
|
|
@ -88,7 +95,8 @@ private:
|
|||
typedef pmap<CPT(TransformState), VizInfo> Data;
|
||||
Data _data;
|
||||
|
||||
float _viz_scale;
|
||||
float _point_scale;
|
||||
float _normal_scale;
|
||||
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue