00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef NURBSSURFACEEVALUATOR_H
00016 #define NURBSSURFACEEVALUATOR_H
00017
00018 #include "pandabase.h"
00019 #include "nurbsBasisVector.h"
00020 #include "nurbsSurfaceResult.h"
00021 #include "nurbsVertex.h"
00022 #include "pointerTo.h"
00023 #include "vector_stdfloat.h"
00024 #include "pvector.h"
00025 #include "nodePath.h"
00026 #include "referenceCount.h"
00027 #include "luse.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 class EXPCL_PANDA_PARAMETRICS NurbsSurfaceEvaluator : public ReferenceCount {
00038 PUBLISHED:
00039 NurbsSurfaceEvaluator();
00040 ~NurbsSurfaceEvaluator();
00041
00042 INLINE void set_u_order(int u_order);
00043 INLINE int get_u_order() const;
00044
00045 INLINE void set_v_order(int v_order);
00046 INLINE int get_v_order() const;
00047
00048 void reset(int num_u_vertices, int num_v_vertices);
00049
00050 INLINE int get_num_u_vertices() const;
00051 INLINE int get_num_v_vertices() const;
00052 INLINE void set_vertex(int ui, int vi, const LVecBase4 &vertex);
00053 INLINE void set_vertex(int ui, int vi, const LVecBase3 &vertex, PN_stdfloat weight = 1.0);
00054 INLINE const LVecBase4 &get_vertex(int ui, int vi) const;
00055 INLINE LVecBase4 get_vertex(int ui, int vi, const NodePath &rel_to) const;
00056
00057 INLINE void set_vertex_space(int ui, int vi, const NodePath &space);
00058 INLINE void set_vertex_space(int ui, int vi, const string &space);
00059 NodePath get_vertex_space(int ui, int vi, const NodePath &rel_to) const;
00060
00061 INLINE void set_extended_vertex(int ui, int vi, int d, PN_stdfloat value);
00062 INLINE PN_stdfloat get_extended_vertex(int ui, int vi, int d) const;
00063 void set_extended_vertices(int ui, int vi, int d,
00064 const PN_stdfloat values[], int num_values);
00065
00066 INLINE int get_num_u_knots() const;
00067 void set_u_knot(int i, PN_stdfloat knot);
00068 PN_stdfloat get_u_knot(int i) const;
00069 MAKE_SEQ(get_u_knots, get_num_u_knots, get_u_knot);
00070 void normalize_u_knots();
00071
00072 INLINE int get_num_v_knots() const;
00073 void set_v_knot(int i, PN_stdfloat knot);
00074 PN_stdfloat get_v_knot(int i) const;
00075 MAKE_SEQ(get_v_knots, get_num_v_knots, get_v_knot);
00076 void normalize_v_knots();
00077
00078 INLINE int get_num_u_segments() const;
00079 INLINE int get_num_v_segments() const;
00080
00081 PT(NurbsSurfaceResult) evaluate(const NodePath &rel_to = NodePath()) const;
00082
00083 void output(ostream &out) const;
00084
00085 public:
00086 typedef epvector<LVecBase4> Vert4Array;
00087 typedef pvector<LPoint3> Vert3Array;
00088 void get_vertices(Vert4Array &verts, const NodePath &rel_to) const;
00089 void get_vertices(Vert3Array &verts, const NodePath &rel_to) const;
00090
00091 private:
00092 INLINE NurbsVertex &vert(int ui, int vi);
00093 INLINE const NurbsVertex &vert(int ui, int vi) const;
00094
00095 void recompute_u_knots();
00096 void recompute_v_knots();
00097 void recompute_u_basis();
00098 void recompute_v_basis();
00099
00100 int _u_order;
00101 int _v_order;
00102
00103 typedef epvector<NurbsVertex> Vertices;
00104 Vertices _vertices;
00105 int _num_u_vertices;
00106 int _num_v_vertices;
00107
00108 bool _u_knots_dirty;
00109 bool _v_knots_dirty;
00110 typedef vector_stdfloat Knots;
00111 Knots _u_knots;
00112 Knots _v_knots;
00113
00114 bool _u_basis_dirty;
00115 bool _v_basis_dirty;
00116 NurbsBasisVector _u_basis;
00117 NurbsBasisVector _v_basis;
00118 };
00119
00120 INLINE ostream &operator << (ostream &out, const NurbsSurfaceEvaluator &n);
00121
00122 #include "nurbsSurfaceEvaluator.I"
00123
00124 #endif
00125