Panda3D
|
00001 // Filename: geomVertexFormat.h 00002 // Created by: drose (07Mar05) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #ifndef GEOMVERTEXFORMAT_H 00016 #define GEOMVERTEXFORMAT_H 00017 00018 #include "pandabase.h" 00019 #include "typedWritableReferenceCount.h" 00020 #include "geomVertexAnimationSpec.h" 00021 #include "geomVertexArrayFormat.h" 00022 #include "geomEnums.h" 00023 #include "internalName.h" 00024 #include "luse.h" 00025 #include "pointerTo.h" 00026 #include "pmap.h" 00027 #include "pset.h" 00028 #include "pvector.h" 00029 #include "indirectCompareTo.h" 00030 #include "lightReMutex.h" 00031 00032 class FactoryParams; 00033 class GeomVertexData; 00034 class GeomMunger; 00035 00036 //////////////////////////////////////////////////////////////////// 00037 // Class : GeomVertexFormat 00038 // Description : This class defines the physical layout of the vertex 00039 // data stored within a Geom. The layout consists of a 00040 // list of named columns, each of which has a numeric 00041 // type and a size. 00042 // 00043 // The columns are typically interleaved within a single 00044 // array, but they may also be distributed among 00045 // multiple different arrays; at the extreme, each 00046 // column may be alone within its own array (which 00047 // amounts to a parallel-array definition). 00048 // 00049 // Thus, a GeomVertexFormat is really a list of 00050 // GeomVertexArrayFormats, each of which contains a list 00051 // of columns. However, a particular column name should 00052 // not appear more than once in the format, even between 00053 // different arrays. 00054 // 00055 // There are a handful of standard pre-defined 00056 // GeomVertexFormat objects, or you may define your own 00057 // as needed. You may record any combination of 00058 // standard and/or user-defined columns in your custom 00059 // GeomVertexFormat constructions. 00060 //////////////////////////////////////////////////////////////////// 00061 class EXPCL_PANDA_GOBJ GeomVertexFormat : public TypedWritableReferenceCount, public GeomEnums { 00062 PUBLISHED: 00063 GeomVertexFormat(); 00064 GeomVertexFormat(const GeomVertexArrayFormat *array_format); 00065 GeomVertexFormat(const GeomVertexFormat ©); 00066 void operator = (const GeomVertexFormat ©); 00067 virtual ~GeomVertexFormat(); 00068 00069 virtual bool unref() const; 00070 00071 INLINE bool is_registered() const; 00072 INLINE static CPT(GeomVertexFormat) register_format(const GeomVertexFormat *format); 00073 INLINE static CPT(GeomVertexFormat) register_format(const GeomVertexArrayFormat *format); 00074 00075 INLINE const GeomVertexAnimationSpec &get_animation() const; 00076 INLINE void set_animation(const GeomVertexAnimationSpec &animation); 00077 00078 CPT(GeomVertexFormat) get_post_animated_format() const; 00079 CPT(GeomVertexFormat) get_union_format(const GeomVertexFormat *other) const; 00080 00081 INLINE int get_num_arrays() const; 00082 INLINE const GeomVertexArrayFormat *get_array(int array) const; 00083 MAKE_SEQ(get_arrays, get_num_arrays, get_array); 00084 GeomVertexArrayFormat *modify_array(int array); 00085 void set_array(int array, const GeomVertexArrayFormat *format); 00086 void remove_array(int array); 00087 int add_array(const GeomVertexArrayFormat *array_format); 00088 void insert_array(int array, const GeomVertexArrayFormat *array_format); 00089 void clear_arrays(); 00090 00091 int get_num_columns() const; 00092 int get_array_with(int i) const; 00093 const GeomVertexColumn *get_column(int i) const; 00094 00095 int get_array_with(const InternalName *name) const; 00096 const GeomVertexColumn *get_column(const InternalName *name) const; 00097 INLINE bool has_column(const InternalName *name) const; 00098 00099 MAKE_SEQ(get_columns, get_num_columns, get_column); 00100 00101 void remove_column(const InternalName *name); 00102 void pack_columns(); 00103 void align_columns_for_animation(); 00104 void maybe_align_columns_for_animation(); 00105 00106 INLINE int get_num_points() const; 00107 INLINE const InternalName *get_point(int n) const; 00108 MAKE_SEQ(get_points, get_num_points, get_point); 00109 00110 INLINE int get_num_vectors() const; 00111 INLINE const InternalName *get_vector(int n) const; 00112 MAKE_SEQ(get_vectors, get_num_vectors, get_vector); 00113 00114 INLINE int get_num_texcoords() const; 00115 INLINE const InternalName *get_texcoord(int n) const; 00116 MAKE_SEQ(get_texcoords, get_num_texcoords, get_texcoord); 00117 00118 INLINE int get_num_morphs() const; 00119 INLINE const InternalName *get_morph_slider(int n) const; 00120 INLINE const InternalName *get_morph_base(int n) const; 00121 INLINE const InternalName *get_morph_delta(int n) const; 00122 MAKE_SEQ(get_morph_sliders, get_num_morphs, get_morph_slider); 00123 MAKE_SEQ(get_morph_bases, get_num_morphs, get_morph_base); 00124 MAKE_SEQ(get_morph_deltas, get_num_morphs, get_morph_delta); 00125 00126 void output(ostream &out) const; 00127 void write(ostream &out, int indent_level = 0) const; 00128 void write_with_data(ostream &out, int indent_level, 00129 const GeomVertexData *data) const; 00130 00131 // Some standard vertex formats. No particular requirement to use 00132 // one of these, but the DirectX renderers can use these formats 00133 // directly, whereas any other format will have to be converted 00134 // first. 00135 INLINE static const GeomVertexFormat *get_v3(); 00136 INLINE static const GeomVertexFormat *get_v3n3(); 00137 INLINE static const GeomVertexFormat *get_v3t2(); 00138 INLINE static const GeomVertexFormat *get_v3n3t2(); 00139 00140 // These formats, with the DirectX-style packed color, are not 00141 // supported directly by OpenGL. If you use them, the 00142 // GLGraphicsStateGuardian will automatically convert to OpenGL 00143 // form (with a small runtime overhead). 00144 INLINE static const GeomVertexFormat *get_v3cp(); 00145 INLINE static const GeomVertexFormat *get_v3cpt2(); 00146 INLINE static const GeomVertexFormat *get_v3n3cp(); 00147 INLINE static const GeomVertexFormat *get_v3n3cpt2(); 00148 00149 // These formats, with an OpenGL-style four-byte color, are not 00150 // supported directly by DirectX. If you use them, the 00151 // DXGraphicsStateGuardian will automatically convert to DirectX 00152 // form (with a larger runtime overhead, since DirectX8, and old 00153 // DirectX9 drivers, require everything to be interleaved together). 00154 INLINE static const GeomVertexFormat *get_v3c4(); 00155 INLINE static const GeomVertexFormat *get_v3c4t2(); 00156 INLINE static const GeomVertexFormat *get_v3n3c4(); 00157 INLINE static const GeomVertexFormat *get_v3n3c4t2(); 00158 00159 public: 00160 bool get_array_info(const InternalName *name, 00161 int &array_index, 00162 const GeomVertexColumn *&column) const; 00163 00164 INLINE int get_vertex_array_index() const; 00165 INLINE const GeomVertexColumn *get_vertex_column() const; 00166 INLINE int get_normal_array_index() const; 00167 INLINE const GeomVertexColumn *get_normal_column() const; 00168 INLINE int get_color_array_index() const; 00169 INLINE const GeomVertexColumn *get_color_column() const; 00170 00171 int compare_to(const GeomVertexFormat &other) const; 00172 00173 private: 00174 class Registry; 00175 INLINE static Registry *get_registry(); 00176 static void make_registry(); 00177 00178 void do_register(); 00179 void do_unregister(); 00180 00181 bool _is_registered; 00182 00183 GeomVertexAnimationSpec _animation; 00184 00185 typedef pvector< PT(GeomVertexArrayFormat) > Arrays; 00186 Arrays _arrays; 00187 00188 class DataTypeRecord { 00189 public: 00190 int _array_index; 00191 int _column_index; 00192 }; 00193 00194 typedef pmap<const InternalName *, DataTypeRecord> DataTypesByName; 00195 DataTypesByName _columns_by_name; 00196 00197 int _vertex_array_index; 00198 const GeomVertexColumn *_vertex_column; 00199 int _normal_array_index; 00200 const GeomVertexColumn *_normal_column; 00201 int _color_array_index; 00202 const GeomVertexColumn *_color_column; 00203 00204 typedef pvector< CPT(InternalName) > Columns; 00205 Columns _points; 00206 Columns _vectors; 00207 Columns _texcoords; 00208 00209 class MorphRecord { 00210 public: 00211 CPT(InternalName) _slider; 00212 CPT(InternalName) _base; 00213 CPT(InternalName) _delta; 00214 }; 00215 typedef pvector<MorphRecord> Morphs; 00216 Morphs _morphs; 00217 00218 const GeomVertexFormat *_post_animated_format; 00219 00220 // This is the global registry of all currently-in-use formats. 00221 typedef pset<GeomVertexFormat *, IndirectCompareTo<GeomVertexFormat> > Formats; 00222 class EXPCL_PANDA_GOBJ Registry { 00223 public: 00224 Registry(); 00225 void make_standard_formats(); 00226 00227 CPT(GeomVertexFormat) register_format(GeomVertexFormat *format); 00228 INLINE CPT(GeomVertexFormat) register_format(GeomVertexArrayFormat *format); 00229 void unregister_format(GeomVertexFormat *format); 00230 00231 Formats _formats; 00232 LightReMutex _lock; 00233 00234 CPT(GeomVertexFormat) _v3; 00235 CPT(GeomVertexFormat) _v3n3; 00236 CPT(GeomVertexFormat) _v3t2; 00237 CPT(GeomVertexFormat) _v3n3t2; 00238 00239 CPT(GeomVertexFormat) _v3cp; 00240 CPT(GeomVertexFormat) _v3n3cp; 00241 CPT(GeomVertexFormat) _v3cpt2; 00242 CPT(GeomVertexFormat) _v3n3cpt2; 00243 00244 CPT(GeomVertexFormat) _v3c4; 00245 CPT(GeomVertexFormat) _v3n3c4; 00246 CPT(GeomVertexFormat) _v3c4t2; 00247 CPT(GeomVertexFormat) _v3n3c4t2; 00248 }; 00249 00250 static Registry *_registry; 00251 00252 00253 public: 00254 static void register_with_read_factory(); 00255 virtual void write_datagram(BamWriter *manager, Datagram &dg); 00256 virtual int complete_pointers(TypedWritable **plist, BamReader *manager); 00257 00258 protected: 00259 static TypedWritable *make_from_bam(const FactoryParams ¶ms); 00260 void fillin(DatagramIterator &scan, BamReader *manager); 00261 00262 public: 00263 static TypeHandle get_class_type() { 00264 return _type_handle; 00265 } 00266 static void init_type() { 00267 TypedWritableReferenceCount::init_type(); 00268 register_type(_type_handle, "GeomVertexFormat", 00269 TypedWritableReferenceCount::get_class_type()); 00270 } 00271 virtual TypeHandle get_type() const { 00272 return get_class_type(); 00273 } 00274 virtual TypeHandle force_init_type() {init_type(); return get_class_type();} 00275 00276 private: 00277 static TypeHandle _type_handle; 00278 00279 friend class GeomVertexFormat::Registry; 00280 friend class GeomMunger; 00281 }; 00282 00283 INLINE ostream &operator << (ostream &out, const GeomVertexFormat &obj); 00284 00285 #include "geomVertexFormat.I" 00286 00287 #endif