41 _forward_reference =
false;
44 _external_index2 = -1;
45 set_pos(LPoint3d(0.0, 0.0, 0.0));
46 test_pref_integrity();
47 test_gref_integrity();
58 _external_index(copy._external_index),
59 _external_index2(copy._external_index2),
61 _num_dimensions(copy._num_dimensions),
62 _uv_map(copy._uv_map),
63 _aux_map(copy._aux_map)
66 _forward_reference =
false;
68 test_pref_integrity();
69 test_gref_integrity();
79 EggObject::operator = (copy);
80 EggAttributes::operator = (copy);
82 _external_index = copy._external_index;
83 _external_index2 = copy._external_index2;
85 _num_dimensions = copy._num_dimensions;
86 _uv_map = copy._uv_map;
87 _aux_map = copy._aux_map;
89 test_pref_integrity();
90 test_gref_integrity();
102 nassertv(_pool ==
nullptr);
106 nassertv(_gref.empty());
107 nassertv(_pref.empty());
115has_uv(
const string &name)
const {
117 if (ui != _uv_map.end()) {
119 return !uv_obj->
has_w();
129has_uvw(
const string &name)
const {
131 if (ui != _uv_map.end()) {
133 return uv_obj->
has_w();
142has_aux(
const string &name)
const {
143 AuxMap::const_iterator xi = _aux_map.find(name);
144 return (xi != _aux_map.end());
152get_uv(
const string &name)
const {
154 nassertr(ui != _uv_map.end(), LTexCoordd::zero());
155 return (*ui).second->get_uv();
163get_uvw(
const string &name)
const {
165 nassertr(ui != _uv_map.end(), LTexCoord3d::zero());
166 return (*ui).second->get_uvw();
174get_aux(
const string &name)
const {
175 AuxMap::const_iterator xi = _aux_map.find(name);
176 nassertr(xi != _aux_map.end(), LVecBase4d::zero());
177 return (*xi).second->get_aux();
186set_uv(
const string &name,
const LTexCoordd &uv) {
190 if (uv_obj.is_null()) {
197 nassertv(
get_uv(fname) == uv);
206set_uvw(
const string &name,
const LTexCoord3d &uvw) {
210 if (uv_obj.is_null()) {
214 uv_obj->set_uvw(uvw);
217 nassertv(
get_uvw(fname) == uvw);
225set_aux(
const string &name,
const LVecBase4d &aux) {
228 if (aux_obj.is_null()) {
232 aux_obj->set_aux(aux);
235 nassertv(
get_aux(name) == aux);
247 if (ui != _uv_map.end()) {
261 AuxMap::const_iterator xi = _aux_map.find(name);
262 if (xi != _aux_map.end()) {
276 if (ui != _uv_map.end()) {
277 if ((*ui).second->get_ref_count() != 1) {
294 AuxMap::iterator xi = _aux_map.find(name);
295 if (xi != _aux_map.end()) {
296 if ((*xi).second->get_ref_count() != 1) {
313 _uv_map[uv->get_name()] = uv;
322 _aux_map[aux->get_name()] = aux;
339 _aux_map.erase(name);
352 nassertr(pool == second->
get_pool(),
nullptr);
357 if (pool ==
nullptr) {
360 middle = pool->make_new_vertex();
365 if (first->has_normal() && second->has_normal()) {
366 LNormald normal = (first->get_normal() + second->get_normal()) / 2;
368 middle->set_normal(normal);
370 if (first->has_color() && second->has_color()) {
376 const_uv_iterator it;
381 if (first_uv !=
nullptr && second_uv !=
nullptr) {
382 middle->set_uv_obj(EggVertexUV::make_average(first_uv, second_uv));
387 const_aux_iterator ai;
392 if (first_aux !=
nullptr && second_aux !=
nullptr) {
393 middle->set_aux_obj(EggVertexAux::make_average(first_aux, second_aux));
398 EggMorphVertexList::const_iterator vi, vi2;
399 for (vi = first->_dxyzs.begin(); vi != first->_dxyzs.end(); ++vi) {
400 for (vi2 = second->_dxyzs.begin(); vi2 != second->_dxyzs.end(); ++vi2) {
401 if (vi->get_name() == vi2->get_name()) {
403 (vi->get_offset() + vi2->get_offset()) / 2));
409 EggMorphNormalList::const_iterator ni, ni2;
410 for (ni = first->_dxyzs.begin(); ni != first->_dxyzs.end(); ++ni) {
411 for (ni2 = second->_dxyzs.begin(); ni2 != second->_dxyzs.end(); ++ni2) {
412 if (ni->get_name() == ni2->get_name()) {
414 (ni->get_offset() + ni2->get_offset()) / 2));
420 EggMorphColorList::const_iterator ci, ci2;
421 for (ci = first->_drgbas.begin(); ci != first->_drgbas.end(); ++ci) {
422 for (ci2 = second->_drgbas.begin(); ci2 != second->_drgbas.end(); ++ci2) {
423 if (ci->get_name() == ci2->get_name()) {
425 (ci->get_offset() + ci2->get_offset()) / 2));
432 GroupRef::iterator gi;
433 for (gi = first->_gref.begin(); gi != first->_gref.end(); ++gi) {
435 if (second->_gref.count(group)) {
448 for (gi = second->_gref.begin(); gi != second->_gref.end(); ++gi) {
450 if (second->_gref.count(group) == 0) {
464 GroupRefEntry(
EggGroup *group,
double membership)
465 : _group(group), _membership(membership) { }
467 bool operator < (
const GroupRefEntry &other)
const {
468 return _group->get_name() < other._group->get_name();
470 void output(ostream &out)
const {
471 out << _group->get_name() <<
":" << _membership;
478INLINE ostream &operator << (ostream &out,
const GroupRefEntry &gre) {
487write(ostream &out,
int indent_level)
const {
488 test_pref_integrity();
489 test_gref_integrity();
492 <<
"<Vertex> " << _index <<
" {\n";
496 indent(out, indent_level+1);
497 for (
int i = 0; i < _num_dimensions; i++) {
498 out <<
" " << _pos[i];
502 UVMap::const_iterator ui;
503 for (ui = _uv_map.begin(); ui != _uv_map.end(); ++ui) {
504 (*ui).second->write(out, indent_level + 2);
507 AuxMap::const_iterator xi;
508 for (xi = _aux_map.begin(); xi != _aux_map.end(); ++xi) {
509 (*xi).second->write(out, indent_level + 2);
514 _dxyzs.write(out, indent_level + 2,
"<Dxyz>", 3);
518 if (!_gref.empty()) {
522 GroupRef::const_iterator gi;
523 for (gi = _gref.begin(); gi != _gref.end(); ++gi) {
524 gre.insert(GroupRefEntry(*gi, (*gi)->get_vertex_membership(
this)));
554 if (_external_index != other._external_index) {
555 return (
int)_external_index - (int)other._external_index;
557 if (_external_index2 != other._external_index2) {
558 return (
int)_external_index2 - (int)other._external_index2;
560 if (_num_dimensions != other._num_dimensions) {
561 return (
int)_num_dimensions - (int)other._num_dimensions;
565 _pos.compare_to(other._pos, egg_parameters->_pos_threshold);
569 compare = _dxyzs.
compare_to(other._dxyzs, egg_parameters->_pos_threshold);
575 UVMap::const_iterator ai, bi;
576 ai = _uv_map.begin();
577 bi = other._uv_map.begin();
578 while (ai != _uv_map.end() && bi != other._uv_map.end()) {
579 if ((*ai).first < (*bi).first) {
582 }
else if ((*bi).first < (*ai).first) {
586 int compare = (*ai).second->compare_to(*(*bi).second);
594 if (bi != other._uv_map.end()) {
597 if (ai != _uv_map.end()) {
602 AuxMap::const_iterator ci, di;
603 ci = _aux_map.begin();
604 di = other._aux_map.begin();
605 while (ci != _aux_map.end() && di != other._aux_map.end()) {
606 if ((*ci).first < (*di).first) {
609 }
else if ((*di).first < (*ci).first) {
613 int compare = (*ci).second->compare_to(*(*di).second);
621 if (di != other._aux_map.end()) {
624 if (ci != _aux_map.end()) {
637 test_pref_integrity();
639 PrimitiveRef::const_iterator pri;
655 test_pref_integrity();
657 PrimitiveRef::const_iterator pri;
675 EggMorphVertexList::iterator mi;
676 for (mi = _dxyzs.begin(); mi != _dxyzs.end(); ++mi) {
682 morph.set_offset((*mi).get_offset() * mat);
686 for (ui = _uv_map.begin(); ui != _uv_map.end(); ++ui) {
687 (*ui).second->transform(mat);
703 return _gref.begin();
734 return _gref.count((
EggGroup *)group) != 0;
748 if (&other ==
this) {
751 test_gref_integrity();
752 other.test_gref_integrity();
755 test_gref_integrity();
757 GroupRef::const_iterator gri;
761 nassertv(group !=
nullptr);
774 GroupRef::const_iterator gri;
775 for (gri = gref_copy.begin(); gri != gref_copy.end(); ++gri) {
777 nassertv(group !=
nullptr);
782 nassertv(_gref.empty());
794 return _pref.begin();
835test_gref_integrity()
const {
838 GroupRef::const_iterator gri;
842 nassertv(group !=
nullptr);
846 nassertv(membership != 0.0);
855test_pref_integrity()
const {
858 PrimitiveRef::const_iterator pri;
862 nassertv(prim !=
nullptr);
865 EggPrimitive::iterator vi;
866 vi = find(prim->begin(), prim->end(),
this);
867 nassertv(vi != prim->end());
877output(ostream &out)
const {
The set of attributes that may be applied to vertices as well as polygons, such as surface normal and...
void transform(const LMatrix4d &mat)
Applies the indicated transformation matrix to the attributes.
int compare_to(const EggAttributes &other) const
An ordering operator to compare two vertices for sorting order.
LColor get_color() const
Returns the color set on this particular attribute.
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...
void unref_vertex(EggVertex *vert)
Removes the vertex from the set of those referenced by the group.
void set_vertex_membership(EggVertex *vert, double membership)
Explicitly sets the net membership of the indicated vertex in this group to the given value.
void ref_vertex(EggVertex *vert, double membership=1.0)
Adds the vertex to the set of those referenced by the group, at the indicated membership level.
double get_vertex_membership(const EggVertex *vert) const
Returns the amount of membership of the indicated vertex in this group.
int compare_to(const EggMorphList< MorphType > &other, double threshold) const
compare_to() compares a different space than the operator methods, which only check the morph's name.
A single <Dxyz> or <Duv> or some such entry.
bool is_local_coord() const
Returns true if this node's vertices are not in the global coordinate space.
The highest-level base class in the egg directory.
A base class for any of a number of kinds of geometry primitives: polygons, point lights,...
The set of named auxiliary data that may or may not be assigned to a vertex.
A collection of vertices.
The set of UV's that may or may not be assigned to a vertex.
static std::string filter_name(const std::string &name)
Returns the actual name that should be set for a given name string.
bool has_w() const
Returns true if the texture coordinate has a third, w component, false if it is just a normal 2-d tex...
Any one-, two-, three-, or four-component vertex, possibly with attributes such as a normal.
const EggVertexUV * get_uv_obj(const std::string &name) const
Returns the named EggVertexUV object, which defines both the UV coordinate pair for this name and the...
void set_uv_obj(EggVertexUV *vertex_uv)
Sets the indicated EggVertexUV on the vertex.
void set_pos4(const LPoint4d &pos)
This special flavor of set_pos() sets the vertex as a four-component value, but does not change the s...
const EggVertexAux * get_aux_obj(const std::string &name) const
Returns the named EggVertexAux object, which defines the auxiliary data for this name.
bool has_uvw(const std::string &name) const
Returns true if the vertex has the named UV coordinate triple, and the named UV coordinate triple is ...
bool has_gref(const EggGroup *group) const
Returns true if the indicated group references this vertex, false otherwise.
bool has_uv() const
Returns true if the vertex has an unnamed UV coordinate pair, false otherwise.
void clear_grefs()
Removes all group references from the vertex, so that it is not assigned to any group.
int get_index() const
Returns the index number of the vertex within its pool.
int has_pref(const EggPrimitive *prim) const
Returns the number of times the vertex appears in the indicated primitive, or 0 if it does not appear...
EggVertexUV * modify_uv_obj(const std::string &name)
Returns a modifiable pointer to the named EggVertexUV object, which defines both the UV coordinate pa...
int compare_to(const EggVertex &other) const
An ordering operator to compare two vertices for sorting order.
bool has_aux() const
Returns true if the vertex has any auxiliary data, false otherwise.
void set_aux(const std::string &name, const LVecBase4d &aux)
Sets the indicated auxiliary data quadruple on the vertex.
void transform(const LMatrix4d &mat)
Applies the indicated transformation matrix to the vertex.
PrimitiveRef::const_iterator pref_begin() const
Returns an iterator that can, in conjunction with pref_end(), be used to traverse the entire set of p...
EggVertex & operator=(const EggVertex ©)
Copies all properties of the vertex except its vertex pool, index number, and group membership.
EggVertexPool * get_pool() const
Returns the vertex pool this vertex belongs in.
LTexCoordd get_uv() const
Returns the unnamed UV coordinate pair on the vertex.
PrimitiveRef::const_iterator pref_end() const
Returns an iterator that can, in conjunction with pref_begin(), be used to traverse the entire set of...
const LTexCoord3d & get_uvw(const std::string &name) const
Returns the named UV coordinate triple on the vertex.
GroupRef::const_iterator gref_end() const
Returns an iterator that can, in conjunction with gref_begin(), be used to traverse the entire set of...
void set_pos(double pos)
Sets the vertex position.
GroupRef::size_type gref_size() const
Returns the number of elements between gref_begin() and gref_end().
const_aux_iterator aux_begin() const
Returns an iterator that allows walking through the complete set of auxiliary data on the vertex.
void set_uvw(const std::string &name, const LTexCoord3d &texCoord)
Sets the indicated UV coordinate triple on the vertex.
void clear_uv()
Removes all UV coordinate pairs from the vertex.
const_uv_iterator uv_end() const
Returns an iterator that allows walking through the complete set of named UV's on the vertex.
PrimitiveRef::size_type pref_size() const
Returns the number of elements between pref_begin() and pref_end().
void copy_grefs_from(const EggVertex &other)
Copies all the group references from the other vertex onto this one.
int get_num_local_coord() const
Returns the number of primitives that own this vertex whose vertices are interpreted to be in a local...
const_uv_iterator uv_begin() const
Returns an iterator that allows walking through the complete set of named UV's on the vertex.
EggVertexAux * modify_aux_obj(const std::string &name)
Returns a modifiable pointer to the named EggVertexAux object, which defines the auxiliary data for t...
void clear_aux()
Removes all auxiliary data from the vertex.
GroupRef::const_iterator gref_begin() const
Returns an iterator that can, in conjunction with gref_end(), be used to traverse the entire set of g...
void write(std::ostream &out, int indent_level) const
Writes the vertex to the indicated output stream in Egg format.
void set_uv(const LTexCoordd &texCoord)
Replaces the unnamed UV coordinate pair on the vertex with the indicated value.
LPoint4d get_pos4() const
This is always valid, regardless of the value of get_num_dimensions.
const_aux_iterator aux_end() const
Returns an iterator that allows walking through the complete set of auxiliary data on the vertex.
const LVecBase4d & get_aux(const std::string &name) const
Returns the named auxiliary data quadruple on the vertex.
int get_num_global_coord() const
Returns the number of primitives that own this vertex whose vertices are interpreted in the global co...
void set_aux_obj(EggVertexAux *vertex_aux)
Sets the indicated EggVertexAux on the vertex.
bool test_ref_count_integrity() const
Does some easy checks to make sure that the reference count isn't completely bogus.
TypeHandle is the identifier used to differentiate C++ class types.
This is our own Panda specialization on the default STL set.
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.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void write_long_list(std::ostream &out, int indent_level, InputIterator ifirst, InputIterator ilast, std::string first_prefix="", std::string later_prefix="", int max_col=72)
Writes a list of things to the indicated output stream, with a space separating each item.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.