00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef TRANSFORMBLEND_H
00016 #define TRANSFORMBLEND_H
00017
00018 #include "pandabase.h"
00019 #include "vertexTransform.h"
00020 #include "pointerTo.h"
00021 #include "pvector.h"
00022 #include "ordered_vector.h"
00023 #include "cycleData.h"
00024 #include "cycleDataLockedReader.h"
00025 #include "cycleDataReader.h"
00026 #include "cycleDataWriter.h"
00027 #include "pipelineCycler.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036 class EXPCL_PANDA_GOBJ TransformBlend {
00037 PUBLISHED:
00038 INLINE TransformBlend();
00039 INLINE TransformBlend(const VertexTransform *transform0, PN_stdfloat weight0);
00040 INLINE TransformBlend(const VertexTransform *transform0, PN_stdfloat weight0,
00041 const VertexTransform *transform1, PN_stdfloat weight1);
00042 INLINE TransformBlend(const VertexTransform *transform0, PN_stdfloat weight0,
00043 const VertexTransform *transform1, PN_stdfloat weight1,
00044 const VertexTransform *transform2, PN_stdfloat weight2);
00045 INLINE TransformBlend(const VertexTransform *transform0, PN_stdfloat weight0,
00046 const VertexTransform *transform1, PN_stdfloat weight1,
00047 const VertexTransform *transform2, PN_stdfloat weight2,
00048 const VertexTransform *transform3, PN_stdfloat weight3);
00049 INLINE TransformBlend(const TransformBlend ©);
00050 INLINE void operator = (const TransformBlend ©);
00051 INLINE ~TransformBlend();
00052
00053 int compare_to(const TransformBlend &other) const;
00054 INLINE bool operator < (const TransformBlend &other) const;
00055 INLINE bool operator == (const TransformBlend &other) const;
00056 INLINE bool operator != (const TransformBlend &other) const;
00057
00058 void add_transform(const VertexTransform *transform, PN_stdfloat weight);
00059 void remove_transform(const VertexTransform *transform);
00060 void limit_transforms(int max_transforms);
00061 void normalize_weights();
00062 bool has_transform(const VertexTransform *transform) const;
00063 PN_stdfloat get_weight(const VertexTransform *transform) const;
00064
00065 INLINE int get_num_transforms() const;
00066 INLINE const VertexTransform *get_transform(int n) const;
00067 MAKE_SEQ(get_transforms, get_num_transforms, get_transform);
00068 INLINE PN_stdfloat get_weight(int n) const;
00069 INLINE void set_transform(int n, const VertexTransform *transform);
00070 INLINE void set_weight(int n, PN_stdfloat weight);
00071
00072 INLINE void update_blend(Thread *current_thread) const;
00073
00074 INLINE void get_blend(LMatrix4 &result, Thread *current_thread) const;
00075
00076 INLINE void transform_point(LPoint4f &point, Thread *current_thread) const;
00077 INLINE void transform_point(LPoint3f &point, Thread *current_thread) const;
00078 INLINE void transform_vector(LVector3f &point, Thread *current_thread) const;
00079
00080 INLINE void transform_point(LPoint4d &point, Thread *current_thread) const;
00081 INLINE void transform_point(LPoint3d &point, Thread *current_thread) const;
00082 INLINE void transform_vector(LVector3d &point, Thread *current_thread) const;
00083
00084 INLINE UpdateSeq get_modified(Thread *current_thread) const;
00085
00086 void output(ostream &out) const;
00087 void write(ostream &out, int indent_level) const;
00088
00089 private:
00090 class CData;
00091
00092 void recompute_result(CData *cdata, Thread *current_thread);
00093 void clear_result(Thread *current_thread);
00094
00095 class TransformEntry {
00096 public:
00097 INLINE bool operator < (const TransformEntry &other) const;
00098
00099 CPT(VertexTransform) _transform;
00100 PN_stdfloat _weight;
00101 };
00102 typedef ov_set<TransformEntry> Entries;
00103 Entries _entries;
00104
00105
00106
00107 class EXPCL_PANDA_GOBJ CData : public CycleData {
00108 public:
00109 INLINE CData();
00110 INLINE CData(const CData ©);
00111 virtual CycleData *make_copy() const;
00112 virtual TypeHandle get_parent_type() const {
00113 return TransformBlend::get_class_type();
00114 }
00115
00116 LMatrix4 _result;
00117 UpdateSeq _modified;
00118 UpdateSeq _global_modified;
00119 };
00120
00121 PipelineCycler<CData> _cycler;
00122 typedef CycleDataLockedReader<CData> CDLockedReader;
00123 typedef CycleDataReader<CData> CDReader;
00124 typedef CycleDataWriter<CData> CDWriter;
00125
00126 public:
00127 void write_datagram(BamWriter *manager, Datagram &dg) const;
00128 int complete_pointers(TypedWritable **plist, BamReader *manager);
00129 void fillin(DatagramIterator &scan, BamReader *manager);
00130
00131 friend class VertexTransform;
00132
00133 public:
00134 static TypeHandle get_class_type() {
00135 return _type_handle;
00136 }
00137 static void init_type() {
00138 register_type(_type_handle, "TransformBlend");
00139 }
00140
00141 private:
00142 static TypeHandle _type_handle;
00143 };
00144
00145 INLINE ostream &operator << (ostream &out, const TransformBlend &obj);
00146
00147 #include "transformBlend.I"
00148
00149 #endif