bring parametrics to pgraph

This commit is contained in:
David Rose 2002-03-28 19:34:23 +00:00
parent 83400f5f7f
commit b44aa6c4dd
9 changed files with 63 additions and 89 deletions

View File

@ -1,6 +1,8 @@
#define OTHER_LIBS interrogatedb:c dconfig:c dtoolconfig:m \ #define OTHER_LIBS interrogatedb:c dconfig:c dtoolconfig:m \
dtoolutil:c dtoolbase:c dtool:m dtoolutil:c dtoolbase:c dtool:m
#define USE_NURBSPP yes
#begin lib_target #begin lib_target
#define TARGET egg2pg #define TARGET egg2pg
#define LOCAL_LIBS \ #define LOCAL_LIBS \

View File

@ -60,6 +60,10 @@
#include "collisionSphere.h" #include "collisionSphere.h"
#include "collisionPlane.h" #include "collisionPlane.h"
#include "collisionPolygon.h" #include "collisionPolygon.h"
#include "parametricCurve.h"
#include "nurbsCurve.h"
#include "classicNurbsCurve.h"
#include "nurbsCurveInterface.h"
#include <ctype.h> #include <ctype.h>
#include <algorithm> #include <algorithm>
@ -1090,10 +1094,8 @@ make_node(EggNode *egg_node, PandaNode *parent) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
PandaNode *qpEggLoader:: PandaNode *qpEggLoader::
make_node(EggNurbsCurve *egg_curve, PandaNode *parent) { make_node(EggNurbsCurve *egg_curve, PandaNode *parent) {
return (PandaNode *)NULL;
/*
assert(parent != NULL); assert(parent != NULL);
assert(!parent->is_of_type(GeomNode::get_class_type())); assert(!parent->is_geom_node());
PT(ParametricCurve) curve; PT(ParametricCurve) curve;
@ -1160,8 +1162,8 @@ make_node(EggNurbsCurve *egg_curve, PandaNode *parent) {
return (PandaNode *)NULL; return (PandaNode *)NULL;
} }
return new PandaNode(parent, curve); parent->add_child(curve);
*/ return curve;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -1162,6 +1162,8 @@ make_node(EggNode *egg_node, NamedNode *parent) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
RenderRelation *EggLoader:: RenderRelation *EggLoader::
make_node(EggNurbsCurve *egg_curve, NamedNode *parent) { make_node(EggNurbsCurve *egg_curve, NamedNode *parent) {
return (RenderRelation *)NULL;
/*
assert(parent != NULL); assert(parent != NULL);
assert(!parent->is_of_type(GeomNode::get_class_type())); assert(!parent->is_of_type(GeomNode::get_class_type()));
@ -1231,6 +1233,7 @@ make_node(EggNurbsCurve *egg_curve, NamedNode *parent) {
} }
return new RenderRelation(parent, curve); return new RenderRelation(parent, curve);
*/
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -6,7 +6,7 @@
#begin lib_target #begin lib_target
#define TARGET parametrics #define TARGET parametrics
#define LOCAL_LIBS \ #define LOCAL_LIBS \
grutil sgattrib linmath express putil pandabase pgraph grutil sgattrib linmath express putil pandabase
#define COMBINED_SOURCES $[TARGET]_composite1.cxx $[TARGET]_composite2.cxx #define COMBINED_SOURCES $[TARGET]_composite1.cxx $[TARGET]_composite2.cxx

View File

@ -49,6 +49,7 @@ ConfigureFn(config_parametrics) {
#ifdef HAVE_NURBSPP #ifdef HAVE_NURBSPP
NurbsPPCurve::init_type(); NurbsPPCurve::init_type();
NurbsPPCurve::register_with_read_factory();
#endif #endif
ClassicNurbsCurve::register_with_read_factory(); ClassicNurbsCurve::register_with_read_factory();

View File

@ -39,20 +39,9 @@ TypeHandle ParametricCurve::_type_handle;
// one from Scheme. // one from Scheme.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
ParametricCurve:: ParametricCurve::
ParametricCurve() { ParametricCurve() : PandaNode("curve") {
_curve_type = PCT_NONE; _curve_type = PCT_NONE;
_num_dimensions = 3; _num_dimensions = 3;
// This CurveDrawer object is used to draw the curve implicitly if
// it happens to get parented to render, but only if the curve_type
// is set to PCT_XYZ or PCT_NONE.
_implicit_drawer = (ParametricCurveDrawer *)NULL;
// And until we attempt to draw it, we set our bounding volume to be
// infinitely large (since we don't know). Once we draw it the
// first time, we'll recompute the bounding volume according to the
// geometry of what we just drew.
set_bound(OmniBoundingVolume());
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -62,10 +51,6 @@ ParametricCurve() {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
ParametricCurve:: ParametricCurve::
~ParametricCurve() { ~ParametricCurve() {
if (_implicit_drawer != (ParametricCurveDrawer *)NULL) {
delete _implicit_drawer;
}
// Our drawer list must be empty by the time we destruct, since our // Our drawer list must be empty by the time we destruct, since our
// drawers all maintain reference-counting pointers to us! If this // drawers all maintain reference-counting pointers to us! If this
// is not so, we have lost a reference count somewhere, or we have // is not so, we have lost a reference count somewhere, or we have
@ -73,6 +58,33 @@ ParametricCurve::
nassertv(_drawers.empty()); nassertv(_drawers.empty());
} }
////////////////////////////////////////////////////////////////////
// Function: ParametricCurve::safe_to_flatten
// Access: Public, Virtual
// Description: Returns true if it is generally safe to flatten out
// this particular kind of PandaNode by duplicating
// instances, false otherwise (for instance, a Camera
// cannot be safely flattened, because the Camera
// pointer itself is meaningful).
////////////////////////////////////////////////////////////////////
bool ParametricCurve::
safe_to_flatten() const {
return false;
}
////////////////////////////////////////////////////////////////////
// Function: ParametricCurve::safe_to_transform
// Access: Public, Virtual
// Description: Returns true if it is generally safe to transform
// this particular kind of PandaNode by calling the
// xform() method, false otherwise. For instance, it's
// usually a bad idea to attempt to xform a Character.
////////////////////////////////////////////////////////////////////
bool ParametricCurve::
safe_to_transform() const {
return false;
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: ParametricCurve::is_valid // Function: ParametricCurve::is_valid
// Access: Published, Virtual // Access: Published, Virtual
@ -613,32 +625,6 @@ convert_to_nurbs(ParametricCurve *nc) const {
return nc->recompute(); return nc->recompute();
} }
////////////////////////////////////////////////////////////////////
// Function: ParametricCurve::draw_traverse
// Access: Public, Virtual
// Description: This is called by the Draw traversal by virtue of the
// node's being present in the scene graph. Its job is
// to make sure the visualization of the collideable
// geometry is up-to-date.
////////////////////////////////////////////////////////////////////
void ParametricCurve::
draw_traverse(const ArcChain &) {
if (_implicit_drawer == (ParametricCurveDrawer *)NULL) {
_implicit_drawer = new ParametricCurveDrawer();
_implicit_drawer->set_curve(this);
_implicit_drawer->draw();
_viz_arc = new RenderRelation(this, _implicit_drawer->detach_geom_node());
// We must then tell the drawer to forget about us, so we don't
// maintain a circular reference count.
_implicit_drawer->clear_curves();
// Set our bounding type to accurately reflect the new geometry
// beneath this node.
set_bound(BVT_dynamic_sphere);
}
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: ParametricCurve::register_drawer // Function: ParametricCurve::register_drawer
@ -699,26 +685,6 @@ invalidate_all() {
++n) { ++n) {
(*n)->redraw(); (*n)->redraw();
} }
// Also update the implicit representation.
if (_implicit_drawer != (ParametricCurveDrawer *)NULL) {
if (_viz_arc->get_parent() != this) {
// Hey, someone has moved the visualization. In that case,
// forget about it.
_viz_arc = (NodeRelation *)NULL;
delete _implicit_drawer;
_implicit_drawer = (ParametricCurveDrawer *)NULL;
set_bound(OmniBoundingVolume());
} else {
// Ok, the visualization is still there. Regenerate it.
remove_arc(_viz_arc);
_implicit_drawer->set_curve(this);
_implicit_drawer->draw();
_viz_arc = new RenderRelation(this, _implicit_drawer->detach_geom_node());
_implicit_drawer->clear_curves();
}
}
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -856,7 +822,7 @@ r_find_length(float target_length, float &found_t,
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void ParametricCurve:: void ParametricCurve::
write_datagram(BamWriter *manager, Datagram &me) { write_datagram(BamWriter *manager, Datagram &me) {
NamedNode::write_datagram(manager, me); PandaNode::write_datagram(manager, me);
me.add_int8(_curve_type); me.add_int8(_curve_type);
me.add_int8(_num_dimensions); me.add_int8(_num_dimensions);
@ -872,7 +838,7 @@ write_datagram(BamWriter *manager, Datagram &me) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void ParametricCurve:: void ParametricCurve::
fillin(DatagramIterator &scan, BamReader *manager) { fillin(DatagramIterator &scan, BamReader *manager) {
NamedNode::fillin(scan, manager); PandaNode::fillin(scan, manager);
_curve_type = scan.get_int8(); _curve_type = scan.get_int8();
_num_dimensions = scan.get_int8(); _num_dimensions = scan.get_int8();

View File

@ -19,13 +19,12 @@
#ifndef PARAMETRICCURVE_H #ifndef PARAMETRICCURVE_H
#define PARAMETRICCURVE_H #define PARAMETRICCURVE_H
#include <pandabase.h> #include "pandabase.h"
#include <namedNode.h> #include "pandaNode.h"
#include <pt_NodeRelation.h> #include "luse.h"
#include <luse.h>
#include <typedef.h> #include "typedef.h"
#include "plist.h" #include "plist.h"
#include "pvector.h" #include "pvector.h"
@ -62,11 +61,16 @@ class NurbsCurveInterface;
// This encapsulates all curves in 3-d space defined // This encapsulates all curves in 3-d space defined
// for a single parameter t in the range [0,get_max_t()]. // for a single parameter t in the range [0,get_max_t()].
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
class EXPCL_PANDA ParametricCurve : public NamedNode { class EXPCL_PANDA ParametricCurve : public PandaNode {
PUBLISHED: PUBLISHED:
ParametricCurve(); ParametricCurve();
virtual ~ParametricCurve(); virtual ~ParametricCurve();
public:
virtual bool safe_to_flatten() const;
virtual bool safe_to_transform() const;
PUBLISHED:
virtual bool is_valid() const; virtual bool is_valid() const;
virtual float get_max_t() const; virtual float get_max_t() const;
@ -114,8 +118,6 @@ public:
virtual bool convert_to_hermite(HermiteCurve *hc) const; virtual bool convert_to_hermite(HermiteCurve *hc) const;
virtual bool convert_to_nurbs(ParametricCurve *nc) const; virtual bool convert_to_nurbs(ParametricCurve *nc) const;
virtual void draw_traverse(const ArcChain &chain);
void register_drawer(ParametricCurveDrawer *drawer); void register_drawer(ParametricCurveDrawer *drawer);
void unregister_drawer(ParametricCurveDrawer *drawer); void unregister_drawer(ParametricCurveDrawer *drawer);
@ -142,8 +144,6 @@ protected:
private: private:
typedef plist<ParametricCurveDrawer *> DrawerList; typedef plist<ParametricCurveDrawer *> DrawerList;
DrawerList _drawers; DrawerList _drawers;
ParametricCurveDrawer *_implicit_drawer;
PT_NodeRelation _viz_arc;
// TypedWritable stuff // TypedWritable stuff
protected: protected:
@ -155,9 +155,9 @@ public:
return _type_handle; return _type_handle;
} }
static void init_type() { static void init_type() {
NamedNode::init_type(); PandaNode::init_type();
register_type(_type_handle, "ParametricCurve", register_type(_type_handle, "ParametricCurve",
NamedNode::get_class_type()); PandaNode::get_class_type());
} }
virtual TypeHandle get_type() const { virtual TypeHandle get_type() const {
return get_class_type(); return get_class_type();

View File

@ -71,7 +71,7 @@ add_curve(ParametricCurve *curve, int index) {
// found. // found.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
int ParametricCurveCollection:: int ParametricCurveCollection::
add_curves(Node *node) { add_curves(PandaNode *node) {
int num_curves = r_add_curves(node); int num_curves = r_add_curves(node);
if (num_curves > 0) { if (num_curves > 0) {
@ -853,7 +853,7 @@ write_egg(ostream &out, const Filename &filename, CoordinateSystem cs) {
// Description: The recursive implementation of add_curves(). // Description: The recursive implementation of add_curves().
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
int ParametricCurveCollection:: int ParametricCurveCollection::
r_add_curves(Node *node) { r_add_curves(PandaNode *node) {
int num_curves = 0; int num_curves = 0;
if (node->is_of_type(ParametricCurve::get_class_type())) { if (node->is_of_type(ParametricCurve::get_class_type())) {
@ -863,10 +863,10 @@ r_add_curves(Node *node) {
num_curves++; num_curves++;
} }
int num_children = node->get_num_children(RenderRelation::get_class_type()); int num_children = node->get_num_children();
for (int i = 0; i < num_children; i++) { for (int i = 0; i < num_children; i++) {
NodeRelation *arc = node->get_child(RenderRelation::get_class_type(), i); PandaNode *child = node->get_child(i);
num_curves += r_add_curves(arc->get_child()); num_curves += r_add_curves(child);
} }
return num_curves; return num_curves;

View File

@ -49,7 +49,7 @@ PUBLISHED:
void add_curve(ParametricCurve *curve); void add_curve(ParametricCurve *curve);
void add_curve(ParametricCurve *curve, int index); void add_curve(ParametricCurve *curve, int index);
int add_curves(Node *node); int add_curves(PandaNode *node);
bool remove_curve(ParametricCurve *curve); bool remove_curve(ParametricCurve *curve);
void remove_curve(int index); void remove_curve(int index);
bool has_curve(ParametricCurve *curve) const; bool has_curve(ParametricCurve *curve) const;
@ -95,7 +95,7 @@ PUBLISHED:
bool write_egg(ostream &out, const Filename &filename, CoordinateSystem cs); bool write_egg(ostream &out, const Filename &filename, CoordinateSystem cs);
public: public:
int r_add_curves(Node *node); int r_add_curves(PandaNode *node);
void register_drawer(ParametricCurveDrawer *drawer); void register_drawer(ParametricCurveDrawer *drawer);
void unregister_drawer(ParametricCurveDrawer *drawer); void unregister_drawer(ParametricCurveDrawer *drawer);