Beispiel #1
0
        private GltfNodeInfo[] ExtractNodes(Gltf model, GltfBucketContainer cameras)
        {
            var noOfNodes = model.Nodes != null ? model.Nodes.Length : 0;
            var allNodes  = new GltfNodeInfo[noOfNodes];

            for (var i = 0; i < noOfNodes; i += 1)
            {
                var srcNode  = model.Nodes[i];
                var destNode = new GltfNodeInfo
                {
                    Name             = srcNode.Name,
                    NodeIndex        = i,
                    CameraAllocation = cameras.GetAllocation(srcNode.Camera),
                    Children         = srcNode.Children ?? (new int[] { }),
                    Transform        = GenerateTransform(srcNode),
                    Mesh             = srcNode.Mesh,
                };

                destNode.IsMirrored = destNode.Transform.Determinant < 0;

                // TODO: meshes

                allNodes[i] = destNode;
            }

            LinkToParents(allNodes);
            return(allNodes);
        }
Beispiel #2
0
        private static void AppendToGroup(Dictionary <GltfInstancedGroupKey, GltfInstanceDrawGroup> instanceDrawGroups, GltfNodeInfo node, int meshIndex, GltfMeshPrimitive primitive, EffectVariantKey key, EffectVariant found)
        {
            var groupKey = new GltfInstancedGroupKey
            {
                MeshIndex         = meshIndex,
                CameraSlotIndex   = 0,
                TextureSlotIndex  = 0,
                MaterialSlotIndex = primitive.Material.StorageIndex,

                VariantKey = key,
            };

            if (!instanceDrawGroups.TryGetValue(groupKey, out GltfInstanceDrawGroup drawGroup))
            {
                drawGroup = new GltfInstanceDrawGroup
                {
                    GroupKey = groupKey,
                    Variant  = found,
                    Members  = new List <GltfInstancedDraw>(),
                };

                instanceDrawGroups.Add(groupKey, drawGroup);
            }

            var instancedDraw = new GltfInstancedDraw
            {
                Key      = key,
                GroupKey = groupKey,
                Instance = new PerInstance
                {
                    Translation   = node.Transform.ExtractTranslation(),
                    Scale         = node.Transform.ExtractScale(),
                    Rotation      = node.Transform.ExtractRotation(true), // TODO
                    MaterialIndex = primitive.Material.Offset,
                },
            };

            drawGroup.Members.Add(instancedDraw);
        }