Panda3D
parametricCurveCollection.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file parametricCurveCollection.h
10  * @author drose
11  * @date 2001-03-04
12  */
13 
14 #ifndef PARAMETRICCURVECOLLECTION_H
15 #define PARAMETRICCURVECOLLECTION_H
16 
17 #include "pandabase.h"
18 
19 #include "parametricCurve.h"
20 
21 #include "referenceCount.h"
22 #include "pointerTo.h"
23 #include "luse.h"
24 
25 #include "pvector.h"
26 #include "plist.h"
27 
28 class ParametricCurveDrawer;
29 
30 /**
31  * This is a set of zero or more ParametricCurves, which may or may not be
32  * related. If they are related, the set should contain no more than one XYZ
33  * curve, no more than one HPR curve, and zero or more Timewarp curves, which
34  * can then be evaluated as a unit to return a single transformation matrix
35  * for a given unit of time.
36  */
37 class EXPCL_PANDA_PARAMETRICS ParametricCurveCollection : public ReferenceCount {
38 PUBLISHED:
40  INLINE ~ParametricCurveCollection();
41 
42  void add_curve(ParametricCurve *curve);
43  void add_curve(ParametricCurve *curve, int index);
44  void insert_curve(size_t index, ParametricCurve *curve);
45  int add_curves(PandaNode *node);
46  bool remove_curve(ParametricCurve *curve);
47  void remove_curve(size_t index);
48  void set_curve(size_t index, ParametricCurve *curve);
49  bool has_curve(ParametricCurve *curve) const;
50  void clear();
51  void clear_timewarps();
52 
53  INLINE int get_num_curves() const;
54  INLINE ParametricCurve *get_curve(int index) const;
55  MAKE_SEQ(get_curves, get_num_curves, get_curve);
56 
57  ParametricCurve *get_xyz_curve() const;
58  ParametricCurve *get_hpr_curve() const;
59  ParametricCurve *get_default_curve() const;
60  int get_num_timewarps() const;
61  ParametricCurve *get_timewarp_curve(int n) const;
62  MAKE_SEQ(get_timewarp_curves, get_num_timewarps, get_timewarp_curve);
63 
64  INLINE PN_stdfloat get_max_t() const;
65 
66  MAKE_SEQ_PROPERTY(curves, get_num_curves, get_curve, set_curve, remove_curve);
67  MAKE_PROPERTY(xyz_curve, get_xyz_curve);
68  MAKE_PROPERTY(hpr_curve, get_hpr_curve);
69  MAKE_PROPERTY(default_curve, get_default_curve);
70  MAKE_SEQ_PROPERTY(timewarp_curves, get_num_timewarps, get_timewarp_curve);
71  MAKE_PROPERTY(max_t, get_max_t);
72 
73  void make_even(PN_stdfloat max_t, PN_stdfloat segments_per_unit);
74  void face_forward(PN_stdfloat segments_per_unit);
75  void reset_max_t(PN_stdfloat max_t);
76 
77  bool evaluate(PN_stdfloat t, LVecBase3 &xyz, LVecBase3 &hpr) const;
78  bool evaluate(PN_stdfloat t, LMatrix4 &result, CoordinateSystem cs = CS_default) const;
79 
80  PN_stdfloat evaluate_t(PN_stdfloat t) const;
81  INLINE bool evaluate_xyz(PN_stdfloat t, LVecBase3 &xyz) const;
82  INLINE bool evaluate_hpr(PN_stdfloat t, LVecBase3 &hpr) const;
83 
84  INLINE bool adjust_xyz(PN_stdfloat t, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z);
85  bool adjust_xyz(PN_stdfloat t, const LVecBase3 &xyz);
86  INLINE bool adjust_hpr(PN_stdfloat t, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
87  bool adjust_hpr(PN_stdfloat t, const LVecBase3 &xyz);
88 
89  bool recompute();
90 
91  bool stitch(const ParametricCurveCollection *a,
92  const ParametricCurveCollection *b);
93 
94  void output(std::ostream &out) const;
95  void write(std::ostream &out, int indent_level = 0) const;
96 
97  bool write_egg(Filename filename, CoordinateSystem cs = CS_default);
98  bool write_egg(std::ostream &out, const Filename &filename, CoordinateSystem cs);
99 
100 public:
101  int r_add_curves(PandaNode *node);
102  void register_drawer(ParametricCurveDrawer *drawer);
103  void unregister_drawer(ParametricCurveDrawer *drawer);
104 
105 private:
106  bool determine_hpr(PN_stdfloat t, ParametricCurve *xyz_curve, LVecBase3 &hpr) const;
107  void prepare_add_curve(ParametricCurve *curve);
108  void prepare_remove_curve(ParametricCurve *curve);
109  void redraw();
110 
111 private:
113  ParametricCurves _curves;
115  DrawerList _drawers;
116 };
117 
118 INLINE std::ostream &
119 operator << (std::ostream &out, const ParametricCurveCollection &col) {
120  col.output(out);
121  return out;
122 }
123 
125 
126 #endif
ParametricCurveCollection::output
void output(std::ostream &out) const
Writes a brief one-line description of the ParametricCurveCollection to the indicated output stream.
Definition: parametricCurveCollection.cxx:660
pvector
This is our own Panda specialization on the default STL vector.
Definition: pvector.h:42
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pvector.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ReferenceCount
A base class for all things that want to be reference-counted.
Definition: referenceCount.h:38
parametricCurve.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ParametricCurve
A virtual base class for parametric curves.
Definition: parametricCurve.h:56
plist.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ParametricCurveCollection
This is a set of zero or more ParametricCurves, which may or may not be related.
Definition: parametricCurveCollection.h:37
luse.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
plist< ParametricCurveDrawer * >
referenceCount.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
parametricCurveCollection.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PandaNode
A basic node of the scene graph or data graph.
Definition: pandaNode.h:64
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Filename
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39