xmlNode* FArchiveXML::WriteGeometryMesh(FCDObject* object, xmlNode* parentNode) { FCDGeometryMesh* geometryMesh = (FCDGeometryMesh*)object; xmlNode* meshNode = NULL; if (geometryMesh->IsConvex() && !geometryMesh->GetConvexHullOf().empty()) { meshNode = AddChild(parentNode, DAE_CONVEX_MESH_ELEMENT); FUSStringBuilder convexHullOfName(geometryMesh->GetConvexHullOf()); AddAttribute(meshNode, DAE_CONVEX_HULL_OF_ATTRIBUTE, convexHullOfName); } else { meshNode = AddChild(parentNode, DAE_MESH_ELEMENT); // Write out the sources for (size_t i = 0; i < geometryMesh->GetSourceCount(); ++i) { FArchiveXML::LetWriteObject(geometryMesh->GetSource(i), meshNode); } // Write out the <vertices> element xmlNode* verticesNode = AddChild(meshNode, DAE_VERTICES_ELEMENT); xmlNode* verticesInputExtraNode = NULL,* verticesInputExtraTechniqueNode = NULL; for (size_t i = 0; i < geometryMesh->GetVertexSourceCount(); ++i) { FCDGeometrySource* source = geometryMesh->GetVertexSource(i); const char* semantic = FUDaeGeometryInput::ToString(source->GetType()); AddInput(verticesNode, source->GetDaeId(), semantic); if (geometryMesh->GetPolygonsCount() > 0) { FCDGeometryPolygons* firstPolys = geometryMesh->GetPolygons(0); FCDGeometryPolygonsInput* input = firstPolys->FindInput(source); FUAssert(input != NULL, continue); if (input->GetSet() != -1) { // We are interested in the set information, so if it is available, export it as an extra. if (verticesInputExtraNode == NULL) { verticesInputExtraNode = FUXmlWriter::CreateNode(DAE_EXTRA_ELEMENT); verticesInputExtraTechniqueNode = FUXmlWriter::AddChild(verticesInputExtraNode, DAE_TECHNIQUE_ELEMENT); FUXmlWriter::AddAttribute(verticesInputExtraTechniqueNode, DAE_PROFILE_ATTRIBUTE, DAE_FCOLLADA_PROFILE); } AddInput(verticesInputExtraTechniqueNode, source->GetDaeId(), semantic, -1, input->GetSet()); } } } if (verticesInputExtraNode != NULL) AddChild(verticesNode, verticesInputExtraNode); FUSStringBuilder verticesNodeId(geometryMesh->GetDaeId()); verticesNodeId.append("-vertices"); AddAttribute(verticesNode, DAE_ID_ATTRIBUTE, verticesNodeId); // Write out the polygons for (size_t i = 0; i < geometryMesh->GetPolygonsCount(); ++i) { FArchiveXML::LetWriteObject(geometryMesh->GetPolygons(i), meshNode); } }
xmlNode* FArchiveXML::WriteGeometrySource(FCDObject* object, xmlNode* parentNode) { FCDGeometrySource* geometrySource = (FCDGeometrySource*)object; xmlNode* sourceNode = NULL; // Export the source directly, using the correct parameters and the length factor FloatList& sourceData = geometrySource->GetSourceData().GetDataList(); uint32 stride = geometrySource->GetStride(); switch (geometrySource->GetType()) { case FUDaeGeometryInput::POSITION: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::NORMAL: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::GEOTANGENT: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::GEOBINORMAL: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::TEXCOORD: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::STPQ); break; case FUDaeGeometryInput::TEXTANGENT: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::TEXBINORMAL: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::UV: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::XYZW); break; case FUDaeGeometryInput::COLOR: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, FUDaeAccessor::RGBA); break; case FUDaeGeometryInput::EXTRA: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, NULL); break; case FUDaeGeometryInput::UNKNOWN: sourceNode = AddSourceFloat(parentNode, geometrySource->GetDaeId(), sourceData, stride, NULL); break; case FUDaeGeometryInput::VERTEX: // Refuse to export these sources default: break; } if (!geometrySource->GetName().empty()) { AddAttribute(sourceNode, DAE_NAME_ATTRIBUTE, geometrySource->GetName()); } if (geometrySource->GetExtra() != NULL) { FArchiveXML::WriteTechniquesFCDExtra(geometrySource->GetExtra(), sourceNode); } for (size_t i = 0; i < geometrySource->GetAnimatedValues().size(); ++i) { FArchiveXML::WriteAnimatedValue(geometrySource->GetAnimatedValues()[i], sourceNode, ""); } return sourceNode; }