Panda3D
eggVertex.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file eggVertex.h
10  * @author drose
11  * @date 1999-01-16
12  */
13 
14 #ifndef EGGVERTEX_H
15 #define EGGVERTEX_H
16 
17 #include "pandabase.h"
18 
19 #include "eggObject.h"
20 #include "eggAttributes.h"
21 #include "eggMorphList.h"
22 #include "eggVertexUV.h"
23 #include "eggVertexAux.h"
24 
25 #include "referenceCount.h"
26 #include "luse.h"
27 #include "pset.h"
28 #include "iterator_types.h"
29 
30 class EggVertexPool;
31 class EggGroup;
32 class EggPrimitive;
33 
34 
35 /**
36  * Any one-, two-, three-, or four-component vertex, possibly with attributes
37  * such as a normal.
38  */
39 class EXPCL_PANDA_EGG EggVertex : public EggObject, public EggAttributes {
40 public:
41  typedef pset<EggGroup *> GroupRef;
43  typedef pmap< std::string, PT(EggVertexUV) > UVMap;
44  typedef pmap< std::string, PT(EggVertexAux) > AuxMap;
45 
48  typedef UVMap::size_type uv_size_type;
49 
52  typedef AuxMap::size_type aux_size_type;
53 
54 
55 PUBLISHED:
56  EggVertex();
57  EggVertex(const EggVertex &copy);
58  EggVertex &operator = (const EggVertex &copy);
59  virtual ~EggVertex();
60 
61  INLINE EggVertexPool *get_pool() const;
62 
63  INLINE bool is_forward_reference() const;
64 
65  // The pos might have 1, 2, 3, or 4 dimensions. That complicates things a
66  // bit.
67  INLINE void set_pos(double pos);
68  INLINE void set_pos(const LPoint2d &pos);
69  INLINE void set_pos(const LPoint3d &pos);
70  INLINE void set_pos(const LPoint4d &pos);
71  INLINE void set_pos4(const LPoint4d &pos);
72 
73  // get_pos[123] return the pos as the corresponding type. It is an error to
74  // call any of these without first verifying that get_num_dimensions()
75  // matches the desired type. However, get_pos4() may always be called; it
76  // returns the pos as a four-component point in homogeneous space (with a
77  // 1.0 in the last position if the pos has fewer than four components).
78  INLINE int get_num_dimensions() const;
79  INLINE double get_pos1() const;
80  INLINE LPoint2d get_pos2() const;
81  INLINE LVertexd get_pos3() const;
82  INLINE LPoint4d get_pos4() const;
83 
84  INLINE bool has_uv() const;
85  INLINE LTexCoordd get_uv() const;
86  INLINE void set_uv(const LTexCoordd &texCoord);
87  INLINE void clear_uv();
88  bool has_uv(const std::string &name) const;
89  bool has_uvw(const std::string &name) const;
90  LTexCoordd get_uv(const std::string &name) const;
91  const LTexCoord3d &get_uvw(const std::string &name) const;
92  void set_uv(const std::string &name, const LTexCoordd &texCoord);
93  void set_uvw(const std::string &name, const LTexCoord3d &texCoord);
94  const EggVertexUV *get_uv_obj(const std::string &name) const;
95  EggVertexUV *modify_uv_obj(const std::string &name);
96  void set_uv_obj(EggVertexUV *vertex_uv);
97  void clear_uv(const std::string &name);
98 
99  INLINE bool has_aux() const;
100  INLINE void clear_aux();
101  bool has_aux(const std::string &name) const;
102  const LVecBase4d &get_aux(const std::string &name) const;
103  void set_aux(const std::string &name, const LVecBase4d &aux);
104  const EggVertexAux *get_aux_obj(const std::string &name) const;
105  EggVertexAux *modify_aux_obj(const std::string &name);
106  void set_aux_obj(EggVertexAux *vertex_aux);
107  void clear_aux(const std::string &name);
108 
109  static PT(EggVertex) make_average(const EggVertex *first,
110  const EggVertex *second);
111 
112 public:
113  INLINE const_uv_iterator uv_begin() const;
114  INLINE const_uv_iterator uv_end() const;
115  INLINE uv_size_type uv_size() const;
116 
117  INLINE const_aux_iterator aux_begin() const;
118  INLINE const_aux_iterator aux_end() const;
119  INLINE aux_size_type aux_size() const;
120 
121 PUBLISHED:
122  INLINE int get_index() const;
123 
124  INLINE void set_external_index(int external_index);
125  INLINE int get_external_index() const;
126  INLINE void set_external_index2(int external_index2);
127  INLINE int get_external_index2() const;
128 
129  void write(std::ostream &out, int indent_level) const;
130  INLINE bool sorts_less_than(const EggVertex &other) const;
131  int compare_to(const EggVertex &other) const;
132 
133  int get_num_local_coord() const;
134  int get_num_global_coord() const;
135 
136  void transform(const LMatrix4d &mat);
137 
138 public:
139  GroupRef::const_iterator gref_begin() const;
140  GroupRef::const_iterator gref_end() const;
141  GroupRef::size_type gref_size() const;
142 PUBLISHED:
143  bool has_gref(const EggGroup *group) const;
144 
145  void copy_grefs_from(const EggVertex &other);
146  void clear_grefs();
147 
148 public:
149  PrimitiveRef::const_iterator pref_begin() const;
150  PrimitiveRef::const_iterator pref_end() const;
151  PrimitiveRef::size_type pref_size() const;
152 PUBLISHED:
153  int has_pref(const EggPrimitive *prim) const;
154 
155 #ifdef _DEBUG
156  void test_gref_integrity() const;
157  void test_pref_integrity() const;
158 #else
159  void test_gref_integrity() const { }
160  void test_pref_integrity() const { }
161 #endif // _DEBUG
162 
163  void output(std::ostream &out) const;
164 
165  EggMorphVertexList _dxyzs;
166 
167 private:
168  EggVertexPool *_pool;
169  bool _forward_reference;
170  int _index;
171  int _external_index, _external_index2;
172  LPoint4d _pos;
173  short _num_dimensions;
174  GroupRef _gref;
175  PrimitiveRef _pref;
176 
177  UVMap _uv_map;
178  AuxMap _aux_map;
179 
180 public:
181  static TypeHandle get_class_type() {
182  return _type_handle;
183  }
184  static void init_type() {
185  EggObject::init_type();
186  EggAttributes::init_type();
187  register_type(_type_handle, "EggVertex",
188  EggObject::get_class_type(),
189  EggAttributes::get_class_type());
190  }
191  virtual TypeHandle get_type() const {
192  return get_class_type();
193  }
194  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
195 
196 private:
197  static TypeHandle _type_handle;
198 
199  friend class EggVertexPool;
200  friend class EggGroup;
201  friend class EggPrimitive;
202 };
203 
204 INLINE std::ostream &operator << (std::ostream &out, const EggVertex &vert) {
205  vert.output(out);
206  return out;
207 }
208 
209 /**
210  * An STL function object for sorting vertices into order by properties.
211  * Returns true if the two referenced EggVertex pointers are in sorted order,
212  * false otherwise.
213  */
214 class EXPCL_PANDA_EGG UniqueEggVertices {
215 public:
216  INLINE bool operator ()(const EggVertex *v1, const EggVertex *v2) const;
217 };
218 
219 #include "eggVertex.I"
220 
221 #endif
A base class for any of a number of kinds of geometry primitives: polygons, point lights,...
Definition: eggPrimitive.h:47
The set of UV's that may or may not be assigned to a vertex.
Definition: eggVertexUV.h:29
An STL function object for sorting vertices into order by properties.
Definition: eggVertex.h:214
This is an iterator adaptor that converts any iterator that returns a pair (e.g.
This is our own Panda specialization on the default STL map.
Definition: pmap.h:49
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void transform(const LMatrix4d &mat)
Applies the indicated transformation matrix to the attributes.
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition: register_type.I:22
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void write(std::ostream &out, int indent_level) const
Writes the attributes to the indicated output stream in Egg format.
The main glue of the egg hierarchy, this corresponds to the <Group>, <Instance>, and <Joint> type nod...
Definition: eggGroup.h:34
The set of attributes that may be applied to vertices as well as polygons, such as surface normal and...
Definition: eggAttributes.h:33
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Any one-, two-, three-, or four-component vertex, possibly with attributes such as a normal.
Definition: eggVertex.h:39
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
The set of named auxiliary data that may or may not be assigned to a vertex.
Definition: eggVertexAux.h:30
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
bool sorts_less_than(const EggAttributes &other) const
An ordering operator to compare two vertices for sorting order.
A collection of vertices.
Definition: eggVertexPool.h:41
The highest-level base class in the egg directory.
Definition: eggObject.h:29
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
int compare_to(const EggAttributes &other) const
An ordering operator to compare two vertices for sorting order.