예제 #1
0
        public _MeshDecoder(Schema2.Mesh srcMesh, RuntimeOptions options)
        {
            Guard.NotNull(srcMesh, nameof(srcMesh));

            _Name   = srcMesh.Name;
            _Extras = RuntimeOptions.ConvertExtras(srcMesh, options);

            _LogicalIndex = srcMesh.LogicalIndex;

            _Primitives = srcMesh
                          .Primitives
                          .Select(item => new _MeshPrimitiveDecoder <TMaterial>(item))
                          .ToArray();
        }
예제 #2
0
        /// <summary>
        /// Creates a new <see cref="ArmatureTemplate"/> based on the nodes of <see cref="Schema2.Scene"/>.
        /// </summary>
        /// <param name="srcScene">The source <see cref="Schema2.Scene"/> from where to take the nodes.</param>
        /// <param name="options">Custom processing options, or null.</param>
        /// <returns>A new <see cref="ArmatureTemplate"/> instance.</returns>
        internal static ArmatureTemplate Create(Schema2.Scene srcScene, RuntimeOptions options)
        {
            Guard.NotNull(srcScene, nameof(srcScene));

            // gather scene nodes.

            var srcNodes = Schema2.Node.Flatten(srcScene)
                           .Select((key, idx) => (key, idx))
                           .ToDictionary(pair => pair.key, pair => pair.idx);

            int indexSolver(Schema2.Node srcNode)
            {
                if (srcNode == null)
                {
                    return(-1);
                }
                return(srcNodes[srcNode]);
            }

            // create bones.

            var dstNodes = new NodeTemplate[srcNodes.Count];

            foreach (var srcNode in srcNodes)
            {
                var nidx = srcNode.Value;

                // parent index
                var pidx = indexSolver(srcNode.Key.VisualParent);

                // child indices
                var cidx = srcNode.Key.VisualChildren
                           .Select(n => indexSolver(n))
                           .ToArray();

                dstNodes[nidx] = new NodeTemplate(srcNode.Key, pidx, cidx, options);
            }

            // gather animation durations.

            var dstTracks = srcScene.LogicalParent
                            .LogicalAnimations
                            .Select(item => new AnimationTrackInfo(item.Name, RuntimeOptions.ConvertExtras(item, options), item.Duration))
                            .ToArray();

            return(new ArmatureTemplate(dstNodes, dstTracks));
        }
예제 #3
0
        internal NodeTemplate(Schema2.Node srcNode, int parentIdx, int[] childIndices, RuntimeOptions options)
        {
            _LogicalSourceIndex = srcNode.LogicalIndex;

            _ParentIndex  = parentIdx;
            _ChildIndices = childIndices;

            Name   = srcNode.Name;
            Extras = RuntimeOptions.ConvertExtras(srcNode, options);

            _LocalTransform = srcNode.LocalTransform;

            if (_LocalTransform.TryDecompose(out TRANSFORM lxform))
            {
                _Scale       = new AnimatableProperty <Vector3>(lxform.Scale);
                _Rotation    = new AnimatableProperty <Quaternion>(lxform.Rotation);
                _Translation = new AnimatableProperty <Vector3>(lxform.Translation);
            }

            var mw = Transforms.SparseWeight8.Create(srcNode.MorphWeights);

            _Morphing = new AnimatableProperty <Transforms.SparseWeight8>(mw);

            var isolateMemory = options?.IsolateMemory ?? false;

            foreach (var anim in srcNode.LogicalParent.LogicalAnimations)
            {
                var index = anim.LogicalIndex;

                var curves = srcNode.GetCurveSamplers(anim);

                _Scale.SetCurve(index, curves.Scale?.CreateCurveSampler(isolateMemory));
                _Rotation.SetCurve(index, curves.Rotation?.CreateCurveSampler(isolateMemory));
                _Translation.SetCurve(index, curves.Translation?.CreateCurveSampler(isolateMemory));
                _Morphing.SetCurve(index, curves.GetMorphingSampler <Transforms.SparseWeight8>()?.CreateCurveSampler(isolateMemory));
            }

            _UseAnimatedTransforms = _Scale.IsAnimated | _Rotation.IsAnimated | _Translation.IsAnimated;

            if (!_UseAnimatedTransforms)
            {
                _Scale       = null;
                _Rotation    = null;
                _Translation = null;
            }
        }
예제 #4
0
        /// <summary>
        /// Creates a new <see cref="SceneTemplate"/> from a given <see cref="Schema2.Scene"/>.
        /// </summary>
        /// <param name="srcScene">The source <see cref="Schema2.Scene"/> to templatize.</param>
        /// <param name="options">Custom processing options, or null.</param>
        /// <returns>A new <see cref="SceneTemplate"/> instance.</returns>
        public static SceneTemplate Create(Schema2.Scene srcScene, RuntimeOptions options = null)
        {
            Guard.NotNull(srcScene, nameof(srcScene));

            var armature = ArmatureTemplate.Create(srcScene, options);

            // gather scene nodes.

            var srcNodes = Schema2.Node.Flatten(srcScene)
                           .Select((key, idx) => (key, idx))
                           .ToDictionary(pair => pair.key, pair => pair.idx);

            int indexSolver(Schema2.Node srcNode)
            {
                if (srcNode == null)
                {
                    return(-1);
                }
                return(srcNodes[srcNode]);
            }

            // create drawables.

            var instances = srcNodes.Keys
                            .Where(item => item.Mesh != null)
                            .ToList();

            var drawables = new DrawableTemplate[instances.Count];

            for (int i = 0; i < drawables.Length; ++i)
            {
                var srcInstance = instances[i];

                drawables[i] = srcInstance.Skin != null
                    ?
                               new SkinnedDrawableTemplate(srcInstance, indexSolver)
                    :
                               (DrawableTemplate) new RigidDrawableTemplate(srcInstance, indexSolver);
            }

            var extras = RuntimeOptions.ConvertExtras(srcScene, options);

            return(new SceneTemplate(srcScene.Name, extras, armature, drawables));
        }
예제 #5
0
        /// <summary>
        /// Creates a new <see cref="SceneTemplate"/> from a given <see cref="Schema2.Scene"/>.
        /// </summary>
        /// <param name="srcScene">The source <see cref="Schema2.Scene"/> to templatize.</param>
        /// <param name="options">Custom processing options, or null.</param>
        /// <returns>A new <see cref="SceneTemplate"/> instance.</returns>
        public static SceneTemplate Create(Schema2.Scene srcScene, RuntimeOptions options = null)
        {
            Guard.NotNull(srcScene, nameof(srcScene));

            if (options == null)
            {
                options = new RuntimeOptions();
            }

            var armature = ArmatureTemplate.Create(srcScene, options);

            // gather scene nodes.

            var srcNodes = Schema2.Node.Flatten(srcScene)
                           .Select((key, idx) => (key, idx))
                           .ToDictionary(pair => pair.key, pair => pair.idx);

            int indexSolver(Schema2.Node srcNode)
            {
                if (srcNode == null)
                {
                    return(-1);
                }
                return(srcNodes[srcNode]);
            }

            // create drawables.

            var instances = srcNodes.Keys
                            .Where(item => item.Mesh != null)
                            .ToList();

            var drawables = new List <DrawableTemplate>();

            for (int i = 0; i < instances.Count; ++i)
            {
                var srcInstance = instances[i];

                if (srcInstance.Skin != null)
                {
                    drawables.Add(new SkinnedDrawableTemplate(srcInstance, indexSolver));
                    continue;
                }

                if (srcInstance.GetGpuInstancing() == null)
                {
                    drawables.Add(new RigidDrawableTemplate(srcInstance, indexSolver));
                    continue;
                }

                switch (options.GpuMeshInstancing)
                {
                case MeshInstancing.Discard: break;

                case MeshInstancing.Enabled:
                    drawables.Add(new InstancedDrawableTemplate(srcInstance, indexSolver));
                    break;

                case MeshInstancing.SingleMesh:
                    drawables.Add(new RigidDrawableTemplate(srcInstance, indexSolver));
                    break;

                default: throw new NotImplementedException();
                }
            }

            var extras = RuntimeOptions.ConvertExtras(srcScene, options);

            return(new SceneTemplate(srcScene.Name, extras, armature, drawables.ToArray()));
        }