Fix bug with multiple polygroups

This commit is contained in:
rdb 2009-04-29 15:36:36 +00:00
parent 4527b6421b
commit 9a7a1b3d87

View File

@ -315,6 +315,7 @@ void DAEToEggConverter::process_instance(PT(EggGroup) parent, const FCDEntityIns
// Processes the given mesh. // Processes the given mesh.
void DAEToEggConverter::process_mesh(PT(EggGroup) parent, const FCDGeometryMesh* mesh, PT(DaeMaterials) materials) { void DAEToEggConverter::process_mesh(PT(EggGroup) parent, const FCDGeometryMesh* mesh, PT(DaeMaterials) materials) {
nassertv(mesh != NULL); nassertv(mesh != NULL);
daeegg_cat.debug() << "Processing mesh with id " << FROM_FSTRING(mesh->GetDaeId()) << endl;
// Create the egg stuff to hold this mesh // Create the egg stuff to hold this mesh
PT(EggGroup) mesh_group = new EggGroup(FROM_FSTRING(mesh->GetDaeId())); PT(EggGroup) mesh_group = new EggGroup(FROM_FSTRING(mesh->GetDaeId()));
parent->add_child(mesh_group); parent->add_child(mesh_group);
@ -325,17 +326,21 @@ void DAEToEggConverter::process_mesh(PT(EggGroup) parent, const FCDGeometryMesh*
if (mesh->GetSourceCount() == 0) return; if (mesh->GetSourceCount() == 0) return;
const FCDGeometrySource* vsource = mesh->FindSourceByType(FUDaeGeometryInput::POSITION); const FCDGeometrySource* vsource = mesh->FindSourceByType(FUDaeGeometryInput::POSITION);
if (vsource == NULL) return; if (vsource == NULL) return;
// Stores which group holds the primitives.
PT(EggGroup) primitiveholder;
// Loop through the polygon groups and add them // Loop through the polygon groups and add them
daeegg_cat.spam() << "Mesh with id " << FROM_FSTRING(mesh->GetDaeId()) << " has " << mesh->GetPolygonsCount() << " polygon groups" << endl;
PT(EggGroup) primitive_holders[mesh->GetPolygonsCount()];
for (size_t gr = 0; gr < mesh->GetPolygonsCount(); ++gr) { for (size_t gr = 0; gr < mesh->GetPolygonsCount(); ++gr) {
const FCDGeometryPolygons* polygons = mesh->GetPolygons(gr); const FCDGeometryPolygons* polygons = mesh->GetPolygons(gr);
primitiveholder = mesh_group; // Stores which group holds the primitives.
PT(EggGroup) primitiveholder;
// If we have materials, make a group for each material. Then, apply the material's per-group stuff. // If we have materials, make a group for each material. Then, apply the material's per-group stuff.
if (materials != NULL && (!polygons->GetMaterialSemantic().empty()) && mesh->GetPolygonsCount() > 1) { if (materials != NULL && (!polygons->GetMaterialSemantic().empty()) && mesh->GetPolygonsCount() > 1) {
primitiveholder = new EggGroup(FROM_FSTRING(mesh->GetDaeId()) + FROM_FSTRING(polygons->GetMaterialSemantic())); primitiveholder = new EggGroup(FROM_FSTRING(mesh->GetDaeId()) + "." + FROM_FSTRING(polygons->GetMaterialSemantic()));
mesh_group->add_child(primitiveholder); mesh_group->add_child(primitiveholder);
} else {
primitiveholder = mesh_group;
} }
primitive_holders[gr] = primitiveholder;
// Apply the per-group data of the materials, if we have it. // Apply the per-group data of the materials, if we have it.
if (materials != NULL) { if (materials != NULL) {
materials->apply_to(FROM_FSTRING(polygons->GetMaterialSemantic()), primitiveholder); materials->apply_to(FROM_FSTRING(polygons->GetMaterialSemantic()), primitiveholder);
@ -372,17 +377,17 @@ void DAEToEggConverter::process_mesh(PT(EggGroup) parent, const FCDGeometryMesh*
// Get a name for potential coordinate sets // Get a name for potential coordinate sets
string tcsetname (""); string tcsetname ("");
if (materials != NULL && tcinput != NULL) { if (materials != NULL && tcinput != NULL) {
daeegg_cat.debug() << "Assigning texcoord set " << tcinput->GetSet() << " to semantic " << FROM_FSTRING(polygons->GetMaterialSemantic()) << "\n"; daeegg_cat.debug() << "Assigning texcoord set " << tcinput->GetSet() << " to semantic '" << FROM_FSTRING(polygons->GetMaterialSemantic()) << "'\n";
tcsetname = materials->get_uvset_name(FROM_FSTRING(polygons->GetMaterialSemantic()), FUDaeGeometryInput::TEXCOORD, tcinput->GetSet()); tcsetname = materials->get_uvset_name(FROM_FSTRING(polygons->GetMaterialSemantic()), FUDaeGeometryInput::TEXCOORD, tcinput->GetSet());
} }
string tbsetname (""); string tbsetname ("");
if (materials != NULL && binput != NULL) { if (materials != NULL && binput != NULL) {
daeegg_cat.debug() << "Assigning texbinormal set " << binput->GetSet() << " to semantic " << FROM_FSTRING(polygons->GetMaterialSemantic()) << "\n"; daeegg_cat.debug() << "Assigning texbinormal set " << binput->GetSet() << " to semantic '" << FROM_FSTRING(polygons->GetMaterialSemantic()) << "'\n";
tbsetname = materials->get_uvset_name(FROM_FSTRING(polygons->GetMaterialSemantic()), FUDaeGeometryInput::TEXBINORMAL, binput->GetSet()); tbsetname = materials->get_uvset_name(FROM_FSTRING(polygons->GetMaterialSemantic()), FUDaeGeometryInput::TEXBINORMAL, binput->GetSet());
} }
string ttsetname (""); string ttsetname ("");
if (materials != NULL && tinput != NULL) { if (materials != NULL && tinput != NULL) {
daeegg_cat.debug() << "Assigning textangent set " << tinput->GetSet() << " to semantic " << FROM_FSTRING(polygons->GetMaterialSemantic()) << "\n"; daeegg_cat.debug() << "Assigning textangent set " << tinput->GetSet() << " to semantic '" << FROM_FSTRING(polygons->GetMaterialSemantic()) << "'\n";
ttsetname = materials->get_uvset_name(FROM_FSTRING(polygons->GetMaterialSemantic()), FUDaeGeometryInput::TEXTANGENT, tinput->GetSet()); ttsetname = materials->get_uvset_name(FROM_FSTRING(polygons->GetMaterialSemantic()), FUDaeGeometryInput::TEXTANGENT, tinput->GetSet());
} }
// Loop through the indices and add the vertices. // Loop through the indices and add the vertices.
@ -435,8 +440,13 @@ void DAEToEggConverter::process_mesh(PT(EggGroup) parent, const FCDGeometryMesh*
} }
vertex->transform(parent->get_node_to_vertex()); vertex->transform(parent->get_node_to_vertex());
} }
}
// Loop again for the polygons
for (size_t gr = 0; gr < mesh->GetPolygonsCount(); ++gr) {
const FCDGeometryPolygons* polygons = mesh->GetPolygons(gr);
// Now loop through the faces // Now loop through the faces
for (size_t fa = polygons->GetFaceOffset(); fa < polygons->GetFaceOffset() + polygons->GetFaceCount(); ++fa) { uint32 offset = 0;
for (size_t fa = 0; fa < polygons->GetFaceVertexCountCount(); ++fa) {
PT(EggPrimitive) primitive = NULL; PT(EggPrimitive) primitive = NULL;
// Create a primitive that matches the fcollada type // Create a primitive that matches the fcollada type
switch (polygons->GetPrimitiveType()) { switch (polygons->GetPrimitiveType()) {
@ -459,18 +469,19 @@ void DAEToEggConverter::process_mesh(PT(EggGroup) parent, const FCDGeometryMesh*
daeegg_cat.warning() << "Linestrips not yet supported!" << endl; daeegg_cat.warning() << "Linestrips not yet supported!" << endl;
break; break;
default: default:
daeegg_cat.warning() << "Unsupported primitive type found!\n"; daeegg_cat.warning() << "Unsupported primitive type found!" << endl;
} }
if (primitive != NULL) { if (primitive != NULL) {
primitiveholder->add_child(primitive); primitive_holders[gr]->add_child(primitive);
if (materials != NULL) { if (materials != NULL) {
materials->apply_to(FROM_FSTRING(polygons->GetMaterialSemantic()), primitive); materials->apply_to(FROM_FSTRING(polygons->GetMaterialSemantic()), primitive);
} }
for (size_t ve = polygons->GetFaceVertexOffset(fa); ve < polygons->GetFaceVertexOffset(fa) + polygons->GetFaceVertexCount(fa); ++ve) { for (size_t ve = 0; ve < polygons->GetFaceVertexCount(fa); ++ve) {
assert(mesh_pool->has_vertex(ve)); assert(mesh_pool->has_vertex(ve + polygons->GetFaceVertexOffset() + offset));
primitive->add_vertex(mesh_pool->get_vertex(ve)); primitive->add_vertex(mesh_pool->get_vertex(ve + polygons->GetFaceVertexOffset() + offset));
} }
} }
offset += polygons->GetFaceVertexCount(fa);
} }
} }
} }
@ -521,7 +532,9 @@ void DAEToEggConverter::process_controller(PT(EggGroup) parent, const FCDControl
if (geometry != NULL) { if (geometry != NULL) {
if (geometry->IsMesh()) { if (geometry->IsMesh()) {
process_mesh(parent, geometry->GetMesh(), new DaeMaterials((const FCDGeometryInstance*) instance)); process_mesh(parent, geometry->GetMesh(), new DaeMaterials((const FCDGeometryInstance*) instance));
daeegg_cat.spam() << "Processing mesh for controller\n";
if (_vertex_pools.count(FROM_FSTRING(geometry->GetMesh()->GetDaeId()))) { if (_vertex_pools.count(FROM_FSTRING(geometry->GetMesh()->GetDaeId()))) {
daeegg_cat.debug() << "Using vertex pool " << FROM_FSTRING(geometry->GetMesh()->GetDaeId()) << "\n";
vertex_pool = _vertex_pools[FROM_FSTRING(geometry->GetMesh()->GetDaeId())]; vertex_pool = _vertex_pools[FROM_FSTRING(geometry->GetMesh()->GetDaeId())];
} }
} }