bool FillGeometryMesh(FULogFile& fileOut, FCDGeometryMesh* mesh) { FCDGeometrySource* posSource = mesh->AddVertexSource(); FailIf(posSource == NULL); posSource->SetName(FC("TestPositionSource")); posSource->SetSourceType(FUDaeGeometryInput::POSITION); posSource->SetData(FloatList(positionData, 12), 3); FCDGeometrySource* colorSource = mesh->AddSource(); FailIf(colorSource == NULL); colorSource->SetName(FC("TestColorSource")); colorSource->SetSourceType(FUDaeGeometryInput::COLOR); colorSource->SetData(FloatList(colorData, 12), 4); FCDGeometrySource* dummySource = mesh->AddSource(); FailIf(dummySource == NULL); dummySource->SetName(FC("TestDummySource")); dummySource->SetSourceType(FUDaeGeometryInput::EXTRA); dummySource->SetData(FloatList(dummyData, 10), 3); PassIf(FillExtraTree(fileOut, dummySource->GetExtra(), false)); FCDGeometryPolygons* polys1 = mesh->AddPolygons(); FailIf(polys1 == NULL || polys1->GetInputCount() != 1); FCDGeometryPolygons* polys2 = mesh->AddPolygons(); FailIf(polys2 == NULL || polys2->GetInputCount() != 1); FCDGeometryPolygonsInput* pInput1 = polys1->AddInput(colorSource, 1); PassIf(polys1->GetInputCount() == 2); PassIf(pInput1 != NULL && pInput1->GetSource() == colorSource && pInput1->GetOffset() == 1); FCDGeometryPolygonsInput* pInput2 = polys2->AddInput(colorSource, 1); PassIf(polys2->GetInputCount() == 2); PassIf(pInput2 != NULL && pInput2->GetSource() == colorSource && pInput2->GetOffset() == 1); FCDGeometryPolygonsInput* pInput3 = polys1->AddInput(dummySource, 2); PassIf(pInput3 != NULL && pInput3->GetSource() == dummySource && pInput3->GetOffset() == 2); // Write some extra tree in there too. FillExtraTree(fileOut, polys1->GetExtra(), true); FillExtraTree(fileOut, polys2->GetExtra(), true); // Fill in some indices in order to form a tetrahedron polys1->AddFace(3); polys1->AddFace(3); polys1->AddFace(3); polys1->AddFace(3); FailIf(polys1->FindInput(posSource) == NULL); polys1->FindInput(posSource)->SetIndices(positionIndices, 12); FailIf(polys1->FindInput(posSource) == NULL); polys1->FindInput(colorSource)->SetIndices(colorIndices, 12); return true; }
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; }