From e7a163652ed80ec2dae2332aff95d4c14e417596 Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 13 Oct 2003 18:44:45 +0000 Subject: [PATCH] minor refinements to nurbs interface --- panda/src/egg2pg/eggLoader.cxx | 6 ++-- panda/src/parametrics/nurbsCurveEvaluator.I | 26 ++++++++++++++++ panda/src/parametrics/nurbsCurveEvaluator.cxx | 31 +++++++++---------- panda/src/parametrics/nurbsCurveEvaluator.h | 5 +++ panda/src/parametrics/nurbsSurfaceEvaluator.I | 27 ++++++++++++++++ .../src/parametrics/nurbsSurfaceEvaluator.cxx | 15 +++++++-- panda/src/parametrics/nurbsSurfaceEvaluator.h | 5 +++ panda/src/parametrics/ropeNode.cxx | 7 ++++- panda/src/parametrics/sheetNode.cxx | 7 ++++- 9 files changed, 106 insertions(+), 23 deletions(-) diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 7c1836312f..888f11725d 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -529,7 +529,7 @@ make_nurbs_curve(EggNurbsCurve *egg_curve, PandaNode *parent, if (egg_curve->get_subdiv() != 0) { int subdiv_per_segment = (int)((egg_curve->get_subdiv() + 0.5) / nurbs->get_num_segments()); - rope->set_num_subdiv(subdiv_per_segment); + rope->set_num_subdiv(max(subdiv_per_segment, 1)); } // Now get the attributes to apply to the rope. We create a @@ -735,12 +735,12 @@ make_nurbs_surface(EggNurbsSurface *egg_surface, PandaNode *parent, if (egg_surface->get_u_subdiv() != 0) { int u_subdiv_per_segment = (int)((egg_surface->get_u_subdiv() + 0.5) / nurbs->get_num_u_segments()); - sheet->set_num_u_subdiv(u_subdiv_per_segment); + sheet->set_num_u_subdiv(max(u_subdiv_per_segment, 1)); } if (egg_surface->get_v_subdiv() != 0) { int v_subdiv_per_segment = (int)((egg_surface->get_v_subdiv() + 0.5) / nurbs->get_num_v_segments()); - sheet->set_num_v_subdiv(v_subdiv_per_segment); + sheet->set_num_v_subdiv(max(v_subdiv_per_segment, 1)); } // Now get the attributes to apply to the sheet. We create a diff --git a/panda/src/parametrics/nurbsCurveEvaluator.I b/panda/src/parametrics/nurbsCurveEvaluator.I index 96dd76cd3f..772cc4c06b 100644 --- a/panda/src/parametrics/nurbsCurveEvaluator.I +++ b/panda/src/parametrics/nurbsCurveEvaluator.I @@ -98,6 +98,26 @@ get_vertex(int i) const { return _vertices[i].get_vertex(); } +//////////////////////////////////////////////////////////////////// +// Function: NurbsCurveEvaluator::get_vertex +// Access: Published +// Description: Returns the nth control vertex of the curve, relative +// to the given coordinate space. +//////////////////////////////////////////////////////////////////// +INLINE LVecBase4f NurbsCurveEvaluator:: +get_vertex(int i, const NodePath &rel_to) const { + nassertr(i >= 0 && i < (int)_vertices.size(), LVecBase4f::zero()); + + NodePath space = _vertices[i].get_space(rel_to); + const LVecBase4f &vertex = _vertices[i].get_vertex(); + if (space.is_empty()) { + return vertex; + } else { + const LMatrix4f &mat = space.get_mat(rel_to); + return vertex * mat; + } +} + //////////////////////////////////////////////////////////////////// // Function: NurbsCurveEvaluator::set_vertex_space // Access: Published @@ -201,3 +221,9 @@ get_num_segments() const { } return _basis.get_num_segments(); } + +INLINE ostream & +operator << (ostream &out, const NurbsCurveEvaluator &n) { + n.output(out); + return out; +} diff --git a/panda/src/parametrics/nurbsCurveEvaluator.cxx b/panda/src/parametrics/nurbsCurveEvaluator.cxx index d71d84de31..60fdb12d49 100644 --- a/panda/src/parametrics/nurbsCurveEvaluator.cxx +++ b/panda/src/parametrics/nurbsCurveEvaluator.cxx @@ -130,6 +130,17 @@ evaluate(const NodePath &rel_to) const { (int)_vertices.size()); } +//////////////////////////////////////////////////////////////////// +// Function: NurbsCurveEvaluator::output +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +void NurbsCurveEvaluator:: +output(ostream &out) const { + out << "NurbsCurve, " << get_num_knots() << " knots."; +} + + //////////////////////////////////////////////////////////////////// // Function: NurbsCurveEvaluator::get_vertices // Access: Public @@ -144,14 +155,7 @@ get_vertices(pvector &verts, const NodePath &rel_to) const { verts.reserve(verts.size() + num_vertices); int vi; for (vi = 0; vi < num_vertices; vi++) { - NodePath space = _vertices[vi].get_space(rel_to); - const LVecBase4f &vertex = _vertices[vi].get_vertex(); - if (space.is_empty()) { - verts.push_back(vertex); - } else { - const LMatrix4f &mat = space.get_mat(rel_to); - verts.push_back(vertex * mat); - } + verts.push_back(get_vertex(vi, rel_to)); } } @@ -160,8 +164,8 @@ get_vertices(pvector &verts, const NodePath &rel_to) const { // Access: Public // Description: Fills the indicated vector with the set of vertices // in the curve, transformed to the given space. This -// flavor returns the vertices in 4-dimensional -// homogenous space. +// flavor returns the vertices in 3-dimensional +// space. //////////////////////////////////////////////////////////////////// void NurbsCurveEvaluator:: get_vertices(pvector &verts, const NodePath &rel_to) const { @@ -169,12 +173,7 @@ get_vertices(pvector &verts, const NodePath &rel_to) const { verts.reserve(verts.size() + num_vertices); int vi; for (vi = 0; vi < num_vertices; vi++) { - const NodePath &space = _vertices[vi].get_space(rel_to); - LVecBase4f vertex = _vertices[vi].get_vertex(); - if (!space.is_empty()) { - const LMatrix4f &mat = space.get_mat(rel_to); - vertex = vertex * mat; - } + LVecBase4f vertex = get_vertex(vi, rel_to); LPoint3f v3(vertex[0] / vertex[3], vertex[1] / vertex[3], vertex[2] / vertex[3]); verts.push_back(v3); } diff --git a/panda/src/parametrics/nurbsCurveEvaluator.h b/panda/src/parametrics/nurbsCurveEvaluator.h index 06f31f99e5..2c635716b2 100644 --- a/panda/src/parametrics/nurbsCurveEvaluator.h +++ b/panda/src/parametrics/nurbsCurveEvaluator.h @@ -59,6 +59,7 @@ PUBLISHED: INLINE void set_vertex(int i, const LVecBase4f &vertex); INLINE void set_vertex(int i, const LVecBase3f &vertex, float weight = 1.0); INLINE const LVecBase4f &get_vertex(int i) const; + INLINE LVecBase4f get_vertex(int i, const NodePath &rel_to) const; INLINE void set_vertex_space(int i, const NodePath &space); INLINE void set_vertex_space(int i, const string &space); @@ -75,6 +76,8 @@ PUBLISHED: PT(NurbsCurveResult) evaluate(const NodePath &rel_to = NodePath()) const; + void output(ostream &out) const; + public: void get_vertices(pvector &verts, const NodePath &rel_to) const; void get_vertices(pvector &verts, const NodePath &rel_to) const; @@ -96,6 +99,8 @@ private: NurbsBasisVector _basis; }; +INLINE ostream &operator << (ostream &out, const NurbsCurveEvaluator &n); + #include "nurbsCurveEvaluator.I" #endif diff --git a/panda/src/parametrics/nurbsSurfaceEvaluator.I b/panda/src/parametrics/nurbsSurfaceEvaluator.I index 0eb6ed3f94..b0bfa6ea02 100644 --- a/panda/src/parametrics/nurbsSurfaceEvaluator.I +++ b/panda/src/parametrics/nurbsSurfaceEvaluator.I @@ -141,6 +141,27 @@ get_vertex(int ui, int vi) const { return vert(ui, vi).get_vertex(); } +//////////////////////////////////////////////////////////////////// +// Function: NurbsSurfaceEvaluator::get_vertex +// Access: Published +// Description: Returns the nth control vertex of the surface, relative +// to the given coordinate space. +//////////////////////////////////////////////////////////////////// +INLINE LVecBase4f NurbsSurfaceEvaluator:: +get_vertex(int ui, int vi, const NodePath &rel_to) const { + nassertr(ui >= 0 && ui < _num_u_vertices && + vi >= 0 && vi < _num_v_vertices, LVecBase4f::zero()); + + NodePath space = vert(ui, vi).get_space(rel_to); + const LVecBase4f &vertex = vert(ui, vi).get_vertex(); + if (space.is_empty()) { + return vertex; + } else { + const LMatrix4f &mat = space.get_mat(rel_to); + return vertex * mat; + } +} + //////////////////////////////////////////////////////////////////// // Function: NurbsSurfaceEvaluator::set_vertex_space // Access: Published @@ -299,3 +320,9 @@ INLINE const NurbsVertex &NurbsSurfaceEvaluator:: vert(int ui, int vi) const { return _vertices[ui * _num_v_vertices + vi]; } + +INLINE ostream & +operator << (ostream &out, const NurbsSurfaceEvaluator &n) { + n.output(out); + return out; +} diff --git a/panda/src/parametrics/nurbsSurfaceEvaluator.cxx b/panda/src/parametrics/nurbsSurfaceEvaluator.cxx index efec3683c4..69c05e9a7f 100644 --- a/panda/src/parametrics/nurbsSurfaceEvaluator.cxx +++ b/panda/src/parametrics/nurbsSurfaceEvaluator.cxx @@ -174,6 +174,17 @@ evaluate(const NodePath &rel_to) const { _num_u_vertices, _num_v_vertices); } +//////////////////////////////////////////////////////////////////// +// Function: NurbsSurfaceEvaluator::output +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +void NurbsSurfaceEvaluator:: +output(ostream &out) const { + out << "NurbsSurface, (" << get_num_u_knots() << ", " << get_num_v_knots() + << ") knots."; +} + //////////////////////////////////////////////////////////////////// // Function: NurbsSurfaceEvaluator::get_vertices // Access: Public @@ -207,8 +218,8 @@ get_vertices(pvector &verts, const NodePath &rel_to) const { // Access: Public // Description: Fills the indicated vector with the set of vertices // in the surface, transformed to the given space. This -// flavor returns the vertices in 4-dimensional -// homogenous space. +// flavor returns the vertices in 3-dimensional +// space. // // Vertices are arranged in linear sequence, with the v // coordinate changing more rapidly. diff --git a/panda/src/parametrics/nurbsSurfaceEvaluator.h b/panda/src/parametrics/nurbsSurfaceEvaluator.h index 012015a59e..a16d74ab97 100644 --- a/panda/src/parametrics/nurbsSurfaceEvaluator.h +++ b/panda/src/parametrics/nurbsSurfaceEvaluator.h @@ -56,6 +56,7 @@ PUBLISHED: INLINE void set_vertex(int ui, int vi, const LVecBase4f &vertex); INLINE void set_vertex(int ui, int vi, const LVecBase3f &vertex, float weight = 1.0); INLINE const LVecBase4f &get_vertex(int ui, int vi) const; + INLINE LVecBase4f get_vertex(int ui, int vi, const NodePath &rel_to) const; INLINE void set_vertex_space(int ui, int vi, const NodePath &space); INLINE void set_vertex_space(int ui, int vi, const string &space); @@ -77,6 +78,8 @@ PUBLISHED: PT(NurbsSurfaceResult) evaluate(const NodePath &rel_to = NodePath()) const; + void output(ostream &out) const; + public: void get_vertices(pvector &verts, const NodePath &rel_to) const; void get_vertices(pvector &verts, const NodePath &rel_to) const; @@ -110,6 +113,8 @@ private: NurbsBasisVector _v_basis; }; +INLINE ostream &operator << (ostream &out, const NurbsSurfaceEvaluator &n); + #include "nurbsSurfaceEvaluator.I" #endif diff --git a/panda/src/parametrics/ropeNode.cxx b/panda/src/parametrics/ropeNode.cxx index 383560d682..eee90bb370 100644 --- a/panda/src/parametrics/ropeNode.cxx +++ b/panda/src/parametrics/ropeNode.cxx @@ -181,7 +181,12 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { void RopeNode:: output(ostream &out) const { PandaNode::output(out); - out << " " << get_curve(); + NurbsCurveEvaluator *curve = get_curve(); + if (curve != (NurbsCurveEvaluator *)NULL) { + out << " " << *curve; + } else { + out << " (no curve)"; + } } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/parametrics/sheetNode.cxx b/panda/src/parametrics/sheetNode.cxx index 07bbb3e240..ba616e6b4b 100644 --- a/panda/src/parametrics/sheetNode.cxx +++ b/panda/src/parametrics/sheetNode.cxx @@ -172,7 +172,12 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { void SheetNode:: output(ostream &out) const { PandaNode::output(out); - out << " " << get_surface(); + NurbsSurfaceEvaluator *surface = get_surface(); + if (surface != (NurbsSurfaceEvaluator *)NULL) { + out << " " << *surface; + } else { + out << " (no surface)"; + } } ////////////////////////////////////////////////////////////////////