Пример #1
0
        public void Find(string fileName)
        {
            using (var stream = File.OpenRead(fileName))
                using (var fbx = FbxParser.Parse(stream)) {
                    FbxNode objects;
                    {
                        const string Objects      = "Objects";
                        var          ObjectsASCII = Objects.ToASCII();

                        objects = fbx.Find(ObjectsASCII);
                        Assert.True(objects == fbx.Find(Objects));
                        {
                            Assert.True(fbx.TryFind(ObjectsASCII, out var node) && objects == node);
                        }
                        {
                            Assert.True(fbx.TryFind(Objects, out var node) && objects == node);
                        }
                        Assert.True(objects == fbx.Nodes[fbx.FindIndex(ObjectsASCII)]);
                        Assert.True(objects == fbx.Nodes[fbx.FindIndex(Objects)]);
                        Span <int> buf       = new int[fbx.Nodes.Count];
                        var        indexList = buf.Slice(0, fbx.FindIndexAll(ObjectsASCII, buf)).ToArray();
                        Assert.True(buf.Slice(0, fbx.FindIndexAll(Objects, buf)).SequenceEqual(indexList));
                        Assert.True(fbx.FindIndexAll(Objects).SequenceEqual(indexList));
                        Assert.True(fbx.FindIndexAll(ObjectsASCII).SequenceEqual(indexList));
                        var contains = indexList.Contains(fbx.FindIndex(Objects));
                        Assert.True(contains);
                    }

                    {
                        const string Geometry      = "Geometry";
                        var          GeometryASCII = Geometry.ToASCII();

                        var geometryNode = objects.Find(GeometryASCII);
                        Assert.True(geometryNode == objects.Find(Geometry));
                        {
                            Assert.True(objects.TryFind(GeometryASCII, out var node) && geometryNode == node);
                        }
                        {
                            Assert.True(objects.TryFind(Geometry, out var node) && geometryNode == node);
                        }
                        Assert.True(geometryNode == objects.Children[objects.FindIndex(GeometryASCII)]);
                        Assert.True(geometryNode == objects.Children[objects.FindIndex(Geometry)]);
                        Span <int> buf = new int[objects.Children.Count];

                        var indexList = buf.Slice(0, objects.FindIndexAll(GeometryASCII, buf)).ToArray();
                        Assert.True(buf.Slice(0, objects.FindIndexAll(Geometry, buf)).SequenceEqual(indexList));
                        Assert.True(objects.FindIndexAll(Geometry).SequenceEqual(indexList));
                        Assert.True(objects.FindIndexAll(GeometryASCII).SequenceEqual(indexList));
                        var contains = indexList.Contains(objects.FindIndex(Geometry));
                        Assert.True(contains);
                    }
                }
        }
Пример #2
0
        public void Parse(string fileName)
        {
            // FbxObject (root)
            //               |`-- "Objects"
            //               |`-- ...    |`-- "Geometry"
            //               |`-- ...    |`-- ...     |`-- "Vertices" { [0]: double[], ... }
            //                `-- ...    |`-- ...     |`-- "PolygonVertexIndex" { [0]: int[], ... }
            //                            `-- ...     |`-- "LayerElementNormal"
            //                                        |`-- ...               |`-- "Normals" { [0]: double[], ... }
            //                                         `-- ...               |`-- ...
            //                                                                `-- ...

            var Objects            = "Objects".ToASCII();
            var Geometry           = "Geometry".ToASCII();
            var Vertices           = "Vertices".ToASCII();
            var PolygonVertexIndex = "PolygonVertexIndex".ToASCII();
            var LayerElementNormal = "LayerElementNormal".ToASCII();
            var Normals            = "Normals".ToASCII();

            UnmanagedMemoryHelper.Initialize();
            using (var stream = File.OpenRead(fileName))
                using (var fbx = FbxParser.Parse(stream)) {
                    Assert.True(fbx.Nodes.Count > 0);

                    var positions = fbx.Find(Objects)
                                    .Find(Geometry)
                                    .Find(Vertices)
                                    .Properties[0].AsDoubleArray();

                    var indices = fbx.Find(Objects)
                                  .Find(Geometry)
                                  .Find(PolygonVertexIndex)
                                  .Properties[0].AsInt32Array();

                    var normals = fbx.Find(Objects)
                                  .Find(Geometry)
                                  .Find(LayerElementNormal)
                                  .Find(Normals)
                                  .Properties[0].AsDoubleArray();

                    Assert.True(positions.Length > 0);
                    Assert.True(indices.Length > 0);
                    Assert.True(normals.Length > 0);
                }
            UnmanagedMemoryHelper.AssertResourceReleased();
        }
Пример #3
0
        internal static FbxSemanticsUnsafe <TVertex> ParseUnsafe(Stream stream, bool leaveStreamOpen = true, CancellationToken cancellationToken = default)
        {
            ValueTypeRentMemory <RawString> textures = default;
            FbxObject?fbx = null;

            try {
                var vertexCreator = SkinnedVertexCreator <TVertex> .Build();

                fbx = FbxParser.Parse(stream);
                using var resolver = new SemanticResolver(fbx);
                var objectsNode = resolver.ObjectsNode;
                var(meshes, skeletons) = ParseMeshAndSkeleton(resolver, vertexCreator, cancellationToken);
                try {
                    using (meshes) {
                        textures = ParseTexture(objectsNode, cancellationToken);
                        //ParseMaterial(objectsNode);
                        var(vertices, indices) = meshes.CreateCombined();
                        return(new FbxSemanticsUnsafe <TVertex>(ref fbx, ref indices, ref vertices, ref textures, ref skeletons));
                    }
                }
                catch {
                    skeletons.Dispose();
                    throw;
                }
            }
            catch {
                fbx?.Dispose();
                textures.Dispose();
                throw;
            }
            finally {
                if (leaveStreamOpen == false)
                {
                    stream?.Dispose();
                }
            }
        }