Ejemplo n.º 1
0
	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;
	}
Ejemplo n.º 2
0
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;
}