00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef SOFTNODEDESC_H
00016 #define SOFTNODEDESC_H
00017
00018 #ifdef _MIN
00019 #undef _MIN
00020 #endif
00021 #ifdef _MAX
00022 #undef _MAX
00023 #endif
00024
00025 #include "pandatoolbase.h"
00026
00027 #include "eggVertex.h"
00028 #include "eggVertexPool.h"
00029 #include "referenceCount.h"
00030 #include "pointerTo.h"
00031 #include "namable.h"
00032
00033 #include <SAA.h>
00034
00035 class EggGroup;
00036 class EggTable;
00037 class EggXfmSAnim;
00038
00039
00040
00041
00042
00043
00044
00045
00046 class SoftNodeDesc : public ReferenceCount, public Namable {
00047 public:
00048 SoftNodeDesc(SoftNodeDesc *parent=NULL, const string &name = string());
00049 ~SoftNodeDesc();
00050
00051 void set_parent(SoftNodeDesc *parent);
00052 void force_set_parent(SoftNodeDesc *parent);
00053 void set_model(SAA_Elem *model);
00054 bool has_model() const;
00055 SAA_Elem *get_model() const;
00056
00057 bool is_joint() const;
00058 bool is_junk() const;
00059 void set_joint();
00060 bool is_joint_parent() const;
00061 bool is_partial(char *search_prefix);
00062
00063 SoftNodeDesc *_parent;
00064 SoftNodeDesc *_parentJoint;
00065 typedef pvector< PT(SoftNodeDesc) > Children;
00066 Children _children;
00067
00068 private:
00069 void clear_egg();
00070 void mark_joint_parent();
00071 void check_joint_parent();
00072 void check_junk(bool parent_junk);
00073 void check_pseudo_joints(bool joint_above);
00074
00075 void set_parentJoint(SAA_Scene *scene, SoftNodeDesc *lastJoint);
00076
00077 SAA_ModelType type;
00078
00079 SAA_Elem *_model;
00080
00081 EggGroup *_egg_group;
00082 EggTable *_egg_table;
00083 EggXfmSAnim *_anim;
00084
00085 enum JointType {
00086 JT_none,
00087 JT_joint,
00088 JT_pseudo_joint,
00089
00090 JT_joint_parent,
00091 JT_junk,
00092 };
00093 JointType _joint_type;
00094
00095 public:
00096
00097 char **texNameArray;
00098 int *uRepeat, *vRepeat;
00099 PN_stdfloat matrix[4][4];
00100
00101 const char *fullname;
00102
00103 int numTri;
00104
00105 int numTexLoc;
00106 int numTexGlb;
00107 int *numTexTri;
00108
00109
00110 int numNurbTexLoc;
00111 int numNurbTexGlb;
00112 int numNurbMats;
00113
00114 PN_stdfloat *uScale;
00115 PN_stdfloat *vScale;
00116 PN_stdfloat *uOffset;
00117 PN_stdfloat *vOffset;
00118
00119 SAA_Boolean valid;
00120 SAA_Boolean uv_swap;
00121
00122 SAA_Elem *textures;
00123 SAA_Elem *materials;
00124 SAA_SubElem *triangles;
00125 SAA_GeomType gtype;
00126
00127 EggGroup *get_egg_group()const {return _egg_group;}
00128
00129 void get_transform(SAA_Scene *scene, EggGroup *egg_group, bool global);
00130 void get_joint_transform(SAA_Scene *scene, EggGroup *egg_group, EggXfmSAnim *anim, bool global);
00131 void load_poly_model(SAA_Scene *scene, SAA_ModelType type);
00132 void load_nurbs_model(SAA_Scene *scene, SAA_ModelType type);
00133
00134 void make_morph_table(PN_stdfloat time);
00135 void make_linear_morph_table(int numShapes, PN_stdfloat time);
00136 void make_weighted_morph_table(int numShapes, PN_stdfloat time);
00137 void make_expression_morph_table(int numShapes, PN_stdfloat time);
00138
00139 void make_vertex_offsets(int numShapes);
00140 int find_shape_vert(LPoint3d p3d, SAA_DVector *vertices, int numVert);
00141
00142 static TypeHandle get_class_type() {
00143 return _type_handle;
00144 }
00145 static void init_type() {
00146 ReferenceCount::init_type();
00147 Namable::init_type();
00148 register_type(_type_handle, "SoftNodeDesc",
00149 ReferenceCount::get_class_type(),
00150 Namable::get_class_type());
00151 }
00152
00153 private:
00154 static TypeHandle _type_handle;
00155
00156 friend class SoftNodeTree;
00157 };
00158
00159 class SoftToEggConverter;
00160 extern SoftToEggConverter stec;
00161
00162 #endif