00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GEOMTRANSFORMER_H
00016 #define GEOMTRANSFORMER_H
00017
00018 #include "pandabase.h"
00019
00020 #include "luse.h"
00021 #include "geom.h"
00022 #include "geomVertexData.h"
00023
00024 class GeomNode;
00025 class RenderState;
00026 class InternalName;
00027 class GeomMunger;
00028 class Texture;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 class EXPCL_PANDA_PGRAPH GeomTransformer {
00047 public:
00048 GeomTransformer();
00049 GeomTransformer(const GeomTransformer ©);
00050 ~GeomTransformer();
00051
00052 INLINE int get_max_collect_vertices() const;
00053 INLINE void set_max_collect_vertices(int max_collect_vertices);
00054
00055 void register_vertices(Geom *geom, bool might_have_unused);
00056 void register_vertices(GeomNode *node, bool might_have_unused);
00057
00058 bool transform_vertices(Geom *geom, const LMatrix4 &mat);
00059 bool transform_vertices(GeomNode *node, const LMatrix4 &mat);
00060
00061 bool transform_texcoords(Geom *geom, const InternalName *from_name,
00062 InternalName *to_name, const LMatrix4 &mat);
00063 bool transform_texcoords(GeomNode *node, const InternalName *from_name,
00064 InternalName *to_name, const LMatrix4 &mat);
00065
00066 bool set_color(Geom *geom, const LColor &color);
00067 bool set_color(GeomNode *node, const LColor &color);
00068
00069 bool transform_colors(Geom *geom, const LVecBase4 &scale);
00070 bool transform_colors(GeomNode *node, const LVecBase4 &scale);
00071
00072 bool apply_texture_colors(Geom *geom, TextureStage *ts, Texture *tex,
00073 const TexMatrixAttrib *tma,
00074 const LColor &base_color, bool keep_vertex_color);
00075 bool apply_texture_colors(GeomNode *node, const RenderState *state);
00076
00077 bool apply_state(GeomNode *node, const RenderState *state);
00078
00079 bool set_format(Geom *geom, const GeomVertexFormat *new_format);
00080 bool remove_column(Geom *geom, const InternalName *column);
00081 bool remove_column(GeomNode *node, const InternalName *column);
00082
00083 bool make_compatible_state(GeomNode *node);
00084
00085 bool reverse_normals(Geom *geom);
00086 bool doubleside(GeomNode *node);
00087 bool reverse(GeomNode *node);
00088
00089 void finish_apply();
00090
00091 int collect_vertex_data(Geom *geom, int collect_bits, bool format_only);
00092 int collect_vertex_data(GeomNode *node, int collect_bits, bool format_only);
00093 int finish_collect(bool format_only);
00094
00095 PT(Geom) premunge_geom(const Geom *geom, GeomMunger *munger);
00096
00097 private:
00098 int _max_collect_vertices;
00099
00100 typedef pvector<PT(Geom) > GeomList;
00101
00102
00103
00104
00105 class VertexDataAssoc {
00106 public:
00107 INLINE VertexDataAssoc();
00108 bool _might_have_unused;
00109 GeomList _geoms;
00110 void remove_unused_vertices(const GeomVertexData *vdata);
00111 };
00112 typedef pmap<CPT(GeomVertexData), VertexDataAssoc> VertexDataAssocMap;
00113 VertexDataAssocMap _vdata_assoc;
00114
00115
00116
00117 class NewVertexData {
00118 public:
00119 CPT(GeomVertexData) _vdata;
00120 };
00121
00122
00123
00124 class SourceVertices {
00125 public:
00126 INLINE bool operator < (const SourceVertices &other) const;
00127
00128 LMatrix4 _mat;
00129 CPT(GeomVertexData) _vertex_data;
00130 };
00131 typedef pmap<SourceVertices, NewVertexData> NewVertices;
00132 NewVertices _vertices;
00133
00134
00135
00136 class SourceTexCoords {
00137 public:
00138 INLINE bool operator < (const SourceTexCoords &other) const;
00139
00140 LMatrix4 _mat;
00141 CPT(InternalName) _from;
00142 CPT(InternalName) _to;
00143 CPT(GeomVertexData) _vertex_data;
00144 };
00145 typedef pmap<SourceTexCoords, NewVertexData> NewTexCoords;
00146 NewTexCoords _texcoords;
00147
00148
00149
00150 class SourceColors {
00151 public:
00152 INLINE bool operator < (const SourceColors &other) const;
00153
00154 LVecBase4 _color;
00155 CPT(GeomVertexData) _vertex_data;
00156 };
00157 typedef pmap<SourceColors, NewVertexData> NewColors;
00158
00159
00160
00161
00162
00163 NewColors _fcolors, _tcolors;
00164
00165
00166
00167 class SourceTextureColors {
00168 public:
00169 INLINE bool operator < (const SourceTextureColors &other) const;
00170
00171 TextureStage *_ts;
00172 Texture *_tex;
00173 const TexMatrixAttrib *_tma;
00174 LColor _base_color;
00175 bool _keep_vertex_color;
00176 CPT(GeomVertexData) _vertex_data;
00177 };
00178 typedef pmap<SourceTextureColors, NewVertexData> NewTextureColors;
00179 NewTextureColors _tex_colors;
00180
00181
00182
00183
00184 class SourceFormat {
00185 public:
00186 INLINE bool operator < (const SourceFormat &other) const;
00187
00188 CPT(GeomVertexFormat) _format;
00189 CPT(GeomVertexData) _vertex_data;
00190 };
00191 typedef pmap<SourceFormat, NewVertexData> NewFormat;
00192 NewFormat _format;
00193
00194
00195
00196 typedef pmap<CPT(GeomVertexData), NewVertexData> ReversedNormals;
00197 ReversedNormals _reversed_normals;
00198
00199 class NewCollectedKey {
00200 public:
00201 INLINE bool operator < (const NewCollectedKey &other) const;
00202
00203 string _name;
00204 CPT(GeomVertexFormat) _format;
00205 Geom::UsageHint _usage_hint;
00206 Geom::AnimationType _animation_type;
00207 };
00208
00209 class SourceData {
00210 public:
00211 const GeomVertexData *_vdata;
00212 int _num_vertices;
00213 };
00214 typedef pvector<SourceData> SourceDatas;
00215 class SourceGeom {
00216 public:
00217 Geom *_geom;
00218 int _vertex_offset;
00219 };
00220 typedef pvector<SourceGeom> SourceGeoms;
00221 class NewCollectedData {
00222 public:
00223 ALLOC_DELETED_CHAIN(NewCollectedData);
00224
00225 NewCollectedData(const GeomVertexData *source_data);
00226 void add_source_data(const GeomVertexData *source_data);
00227 int apply_format_only_changes();
00228 int apply_collect_changes();
00229
00230 CPT(GeomVertexFormat) _new_format;
00231 string _vdata_name;
00232 GeomEnums::UsageHint _usage_hint;
00233 SourceDatas _source_datas;
00234 SourceGeoms _source_geoms;
00235 int _num_vertices;
00236
00237 private:
00238
00239 void append_vdata(const GeomVertexData *vdata, int vertex_offset);
00240 void update_geoms();
00241
00242 typedef vector_int IndexMap;
00243
00244 PT(GeomVertexData) _new_data;
00245 PT(TransformBlendTable) _new_btable;
00246 SparseArray _new_btable_rows;
00247
00248
00249 public:
00250 static TypeHandle get_class_type() {
00251 return _type_handle;
00252 }
00253 static void init_type() {
00254 register_type(_type_handle, "GeomTransformer::NewCollectedData");
00255 }
00256
00257 private:
00258 static TypeHandle _type_handle;
00259 };
00260 typedef pvector<NewCollectedData *> NewCollectedList;
00261 typedef pmap<NewCollectedKey, NewCollectedData *> NewCollectedMap;
00262 NewCollectedList _new_collected_list;
00263 NewCollectedMap _new_collected_map;
00264
00265 class AlreadyCollectedData {
00266 public:
00267 NewCollectedData *_ncd;
00268 int _vertex_offset;
00269 };
00270 typedef pmap<CPT(GeomVertexData), AlreadyCollectedData> AlreadyCollectedMap;
00271 AlreadyCollectedMap _already_collected_map;
00272
00273 static PStatCollector _apply_vertex_collector;
00274 static PStatCollector _apply_texcoord_collector;
00275 static PStatCollector _apply_set_color_collector;
00276 static PStatCollector _apply_scale_color_collector;
00277 static PStatCollector _apply_texture_color_collector;
00278 static PStatCollector _apply_set_format_collector;
00279
00280 public:
00281 static void init_type() {
00282 NewCollectedData::init_type();
00283 }
00284 };
00285
00286 #include "geomTransformer.I"
00287
00288 #endif
00289