mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 01:44:06 -04:00
Fix bug with multiple polygroups
This commit is contained in:
parent
4527b6421b
commit
9a7a1b3d87
@ -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())];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user