fix crash, mesher

This commit is contained in:
David Rose 2005-03-17 05:36:22 +00:00
parent 66483c0c99
commit 6ef748f7ab
2 changed files with 42 additions and 39 deletions

View File

@ -160,7 +160,9 @@ unify_attributes(EggPrimitive::Shading shading) {
vertex->copy_color(*this); vertex->copy_color(*this);
} }
vertex = vertex->get_pool()->create_unique_vertex(*vertex); EggVertexPool *vertex_pool = orig_vertex->get_pool();
nassertv(vertex_pool != (EggVertexPool *)NULL);
vertex = vertex_pool->create_unique_vertex(*vertex);
replace(pi, vertex); replace(pi, vertex);
} }
Components::iterator ci; Components::iterator ci;
@ -194,7 +196,9 @@ unify_attributes(EggPrimitive::Shading shading) {
vertex->clear_normal(); vertex->clear_normal();
vertex->clear_color(); vertex->clear_color();
vertex = vertex->get_pool()->create_unique_vertex(*vertex); EggVertexPool *vertex_pool = orig_vertex->get_pool();
nassertv(vertex_pool != (EggVertexPool *)NULL);
vertex = vertex_pool->create_unique_vertex(*vertex);
replace(pi, vertex); replace(pi, vertex);
} }
} }

View File

@ -184,6 +184,18 @@ clear() {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool EggMesher:: bool EggMesher::
add_polygon(const EggPolygon *egg_poly, EggMesherStrip::MesherOrigin origin) { add_polygon(const EggPolygon *egg_poly, EggMesherStrip::MesherOrigin origin) {
if (egg_poly->size() != 3 && egg_poly->size() != 4) {
// If we have a higher-order polygon, triangulate it
// automatically.
PT(EggGroupNode) temp_group = new EggGroupNode;
bool result = egg_poly->triangulate_into(temp_group, true);
EggGroupNode::iterator ci;
for (ci = temp_group->begin(); ci != temp_group->end(); ++ci) {
add_polygon(DCAST(EggPolygon, *ci), EggMesherStrip::MO_user);
}
return true;
}
if (_vertex_pool == NULL) { if (_vertex_pool == NULL) {
_vertex_pool = egg_poly->get_pool(); _vertex_pool = egg_poly->get_pool();
} else { } else {
@ -215,18 +227,6 @@ add_polygon(const EggPolygon *egg_poly, EggMesherStrip::MesherOrigin origin) {
} }
// Now identify the common edges. // Now identify the common edges.
if (egg_poly->size() != 3 && egg_poly->size() != 4) {
// If we have a higher-order polygon, triangulate it
// automatically.
PT(EggGroupNode) temp_group = new EggGroupNode;
egg_poly->triangulate_into(temp_group, true);
EggGroupNode::iterator ci;
for (ci = temp_group->begin(); ci != temp_group->end(); ++ci) {
add_polygon(DCAST(EggPolygon, *ci), EggMesherStrip::MO_user);
}
} else {
for (i = 0; i < num_verts; i++) { for (i = 0; i < num_verts; i++) {
// Define an inner and outer edge. A polygon shares an edge with a // Define an inner and outer edge. A polygon shares an edge with a
// neighbor only when one of its inner edges matches a neighbor's // neighbor only when one of its inner edges matches a neighbor's
@ -253,7 +253,6 @@ add_polygon(const EggPolygon *egg_poly, EggMesherStrip::MesherOrigin origin) {
eptrs[i]->insert(&outer_ref); eptrs[i]->insert(&outer_ref);
eptrs[(i+1) % num_verts]->insert(&outer_ref); eptrs[(i+1) % num_verts]->insert(&outer_ref);
} }
}
return true; return true;
} }