Exemplo n.º 1
0
        public void CreateOneKey()
        {
            var node = new Scenes.NodeBuilder("someNode");

            var tb = node.UseTranslation().UseTrackBuilder("track1");

            tb.SetPoint(0, new Vector3(1, 2, 3));

            var scene = new Scenes.SceneBuilder();

            scene.AddNode(node);

            var glTF = scene.ToGltf2();

            var options = new Runtime.RuntimeOptions {
                IsolateMemory = true
            };
            var runtime  = Runtime.SceneTemplate.Create(glTF.DefaultScene, options);
            var instance = runtime.CreateInstance();

            var instanceNode = instance.Armature.LogicalNodes.First(n => n.Name == "someNode");

            instanceNode.SetAnimationFrame(0, 7);
            var nodeMatrix = instanceNode.LocalMatrix;

            Assert.AreEqual(new Vector3(1, 2, 3), nodeMatrix.Translation);
        }
        public static MonoGameDeviceContent <MonoGameModelTemplate> CreateDeviceModel(GraphicsDevice device, Schema2.ModelRoot srcModel, LoaderContext context = null)
        {
            if (context == null)
            {
                context = new BasicEffectsLoaderContext(device);
            }

            context.Reset();

            var options = new Runtime.RuntimeOptions {
                IsolateMemory = true
            };

            var templates = srcModel.LogicalScenes
                            .Select(item => SceneTemplate.Create(item, options))
                            .ToArray();

            var srcMeshes = templates
                            .SelectMany(item => item.LogicalMeshIds)
                            .Distinct()
                            .Select(idx => srcModel.LogicalMeshes[idx]);

            foreach (var srcMesh in srcMeshes)
            {
                context._WriteMesh(srcMesh);
            }

            var dstMeshes = context.CreateRuntimeModels();

            var mdl = new MonoGameModelTemplate(templates, srcModel.DefaultScene.LogicalIndex, dstMeshes);

            return(new MonoGameDeviceContent <MonoGameModelTemplate>(mdl, context.Disposables.ToArray()));
        }
Exemplo n.º 3
0
        private static (SceneTemplate, WeakReference <Schema2.ModelRoot>) LoadModelTemplate(string path)
        {
            var model = Schema2.ModelRoot.Load(path);

            var options = new Runtime.RuntimeOptions {
                IsolateMemory = true
            };

            var template = SceneTemplate.Create(model.DefaultScene, options);

            return(template, new WeakReference <Schema2.ModelRoot>(model));
        }
Exemplo n.º 4
0
        public static MeshBuilder <Materials.MaterialBuilder, TvG, TvM, VertexEmpty> ToStaticMeshBuilder <TvG, TvM>(this Scene srcScene, Runtime.RuntimeOptions options, Animation animation, float time)
            where TvG : struct, IVertexGeometry
            where TvM : struct, IVertexMaterial
        {
            var materials = new Dictionary <Material, Materials.MaterialBuilder>();

            Materials.MaterialBuilder convertMaterial(Material srcMaterial)
            {
                if (materials.TryGetValue(srcMaterial, out Materials.MaterialBuilder dstMaterial))
                {
                    return(dstMaterial);
                }

                dstMaterial = new Materials.MaterialBuilder();
                srcMaterial.CopyTo(dstMaterial);

                // if we find an exiting match, we will use it instead.
                var oldMaterial = materials.Values.FirstOrDefault(item => Materials.MaterialBuilder.AreEqualByContent(dstMaterial, item));

                if (oldMaterial != null)
                {
                    dstMaterial = oldMaterial;
                }

                return(materials[srcMaterial] = dstMaterial);
            }

            return(srcScene.ToStaticMeshBuilder <Materials.MaterialBuilder, TvG, TvM>(convertMaterial, options, animation, time));
        }
Exemplo n.º 5
0
        /// <summary>
        /// Evaluates the current <paramref name="srcScene"/> at a given <paramref name="animation"/> and <paramref name="time"/>
        /// and creates a static <see cref="MeshBuilder{TMaterial, TvG, TvM, TvS}"/>
        /// </summary>
        /// <typeparam name="TMaterial">Any material type</typeparam>
        /// <typeparam name="TvG">A subtype of <see cref="IVertexGeometry"/></typeparam>
        /// <typeparam name="TvM">A subtype of <see cref="IVertexMaterial"/></typeparam>
        /// <param name="srcScene">The source <see cref="Scene"/> to evaluate.</param>
        /// <param name="materialFunc">A function to convert <see cref="Material"/> into <typeparamref name="TMaterial"/>.</param>
        /// <param name="options">Evaluation options.</param>
        /// <param name="animation">The source <see cref="Animation"/> to evaluate.</param>
        /// <param name="time">A time point, in seconds, within <paramref name="animation"/>.</param>
        /// <returns>A new <see cref="MeshBuilder{TMaterial, TvG, TvM, TvS}"/> containing the evaluated geometry.</returns>
        public static MeshBuilder <TMaterial, TvG, TvM, VertexEmpty> ToStaticMeshBuilder <TMaterial, TvG, TvM>(this Scene srcScene, Converter <Material, TMaterial> materialFunc, Runtime.RuntimeOptions options, Animation animation, float time)
            where TvG : struct, IVertexGeometry
            where TvM : struct, IVertexMaterial
        {
            var mesh = new MeshBuilder <TMaterial, TvG, TvM, VertexEmpty>();

            if (srcScene == null)
            {
                return(mesh);
            }

            if (animation != null)
            {
                Guard.MustShareLogicalParent(srcScene, animation, nameof(animation));
            }

            Guard.NotNull(materialFunc, nameof(materialFunc));

            foreach (var tri in srcScene.EvaluateTriangles <VertexPositionNormal, VertexColor1Texture1>(options, animation, time))
            {
                var material = materialFunc(tri.Material);

                mesh.UsePrimitive(material).AddTriangle(tri.A, tri.B, tri.C);
            }

            return(mesh);
        }