// Filename: geomVertexArrayFormat.h // Created by: drose (06Mar05) // //////////////////////////////////////////////////////////////////// // // PANDA 3D SOFTWARE // Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved // // All use of this software is subject to the terms of the Panda 3d // Software license. You should have received a copy of this license // along with this source code; you will also find a current copy of // the license at http://etc.cmu.edu/panda3d/docs/license/ . // // To contact the maintainers of this program write to // panda3d-general@lists.sourceforge.net . // //////////////////////////////////////////////////////////////////// #ifndef GEOMVERTEXARRAYFORMAT_H #define GEOMVERTEXARRAYFORMAT_H #include "pandabase.h" #include "typedWritableReferenceCount.h" #include "geomVertexColumn.h" #include "geomEnums.h" #include "indirectCompareTo.h" #include "pvector.h" #include "pmap.h" class GeomVertexFormat; class GeomVertexData; class GeomVertexArrayData; class InternalName; class FactoryParams; class BamWriter; class BamReader; //////////////////////////////////////////////////////////////////// // Class : GeomVertexArrayFormat // Description : This describes the structure of a single array within // a Geom data. See GeomVertexFormat for the parent // class which collects together all of the individual // GeomVertexArrayFormat objects. // // A particular array may include any number of standard // or user-defined columns. All columns consist of a // sequence of one or more numeric values, packed in any // of a variety of formats; the semantic meaning of each // column is defined in general with its contents // member, and in particular by its name. The standard // array types used most often are named "vertex", // "normal", "texcoord", and "color"; other kinds of // data may be piggybacked into the data record simply // by choosing a unique name. //////////////////////////////////////////////////////////////////// class EXPCL_PANDA GeomVertexArrayFormat : public TypedWritableReferenceCount, public GeomEnums { PUBLISHED: GeomVertexArrayFormat(); GeomVertexArrayFormat(const GeomVertexArrayFormat ©); GeomVertexArrayFormat(InternalName *name0, int num_components0, NumericType numeric_type0, Contents contents0); GeomVertexArrayFormat(InternalName *name0, int num_components0, NumericType numeric_type0, Contents contents0, InternalName *name1, int num_components1, NumericType numeric_type1, Contents contents1); GeomVertexArrayFormat(InternalName *name0, int num_components0, NumericType numeric_type0, Contents contents0, InternalName *name1, int num_components1, NumericType numeric_type1, Contents contents1, InternalName *name2, int num_components2, NumericType numeric_type2, Contents contents2); GeomVertexArrayFormat(InternalName *name0, int num_components0, NumericType numeric_type0, Contents contents0, InternalName *name1, int num_components1, NumericType numeric_type1, Contents contents1, InternalName *name2, int num_components2, NumericType numeric_type2, Contents contents2, InternalName *name3, int num_components3, NumericType numeric_type3, Contents contents3); void operator = (const GeomVertexArrayFormat ©); ~GeomVertexArrayFormat(); INLINE bool is_registered() const; INLINE static CPT(GeomVertexArrayFormat) register_format(const GeomVertexArrayFormat *format); INLINE int get_stride() const; INLINE void set_stride(int stride); INLINE int get_total_bytes() const; INLINE int get_pad_to() const; int add_column(InternalName *name, int num_components, NumericType numeric_type, Contents contents, int start = -1); int add_column(const GeomVertexColumn &column); void remove_column(const InternalName *name); void clear_columns(); INLINE int get_num_columns() const; INLINE const GeomVertexColumn *get_column(int i) const; const GeomVertexColumn *get_column(const InternalName *name) const; const GeomVertexColumn *get_column(int start_byte, int num_bytes) const; INLINE bool has_column(const InternalName *name) const; bool is_data_subset_of(const GeomVertexArrayFormat &other) const; void output(ostream &out) const; void write(ostream &out, int indent_level = 0) const; void write_with_data(ostream &out, int indent_level, const GeomVertexArrayData *array_data) const; public: int compare_to(const GeomVertexArrayFormat &other) const; private: class Registry; INLINE static Registry *get_registry(); static void make_registry(); void do_register(); void do_unregister(); INLINE void consider_sort_columns() const; void sort_columns(); bool _is_registered; int _stride; int _total_bytes; int _pad_to; typedef pvector Columns; Columns _columns; bool _columns_unsorted; typedef pmap ColumnsByName; ColumnsByName _columns_by_name; // This is the global registry of all currently-in-use array formats. typedef pset > ArrayFormats; class EXPCL_PANDA Registry { public: Registry(); CPT(GeomVertexArrayFormat) register_format(GeomVertexArrayFormat *format); void unregister_format(GeomVertexArrayFormat *format); ArrayFormats _formats; }; static Registry *_registry; public: static void register_with_read_factory(); virtual void write_datagram(BamWriter *manager, Datagram &dg); virtual int complete_pointers(TypedWritable **plist, BamReader *manager); virtual void finalize(BamReader *manager); protected: static TypedWritable *make_from_bam(const FactoryParams ¶ms); void fillin(DatagramIterator &scan, BamReader *manager); public: static TypeHandle get_class_type() { return _type_handle; } static void init_type() { TypedWritableReferenceCount::init_type(); register_type(_type_handle, "GeomVertexArrayFormat", TypedWritableReferenceCount::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); } virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; friend class GeomVertexFormat; }; INLINE ostream &operator << (ostream &out, const GeomVertexArrayFormat &obj); #include "geomVertexArrayFormat.I" #endif