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); }
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); }