示例#1
0
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            nodeInfoCount = 0;

            //foreach (var objectNodeReference in RootRenderFeature.ObjectNodeReferences)
            Dispatcher.ForEach(RootRenderFeature.ObjectNodeReferences, objectNodeReference =>
            {
                var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh = (RenderMesh)objectNode.RenderObject;

                var skeleton = renderMesh.RenderModel.ModelComponent.Skeleton;
                var skinning = renderMesh.Mesh.Skinning;

                // Skip unskinned meshes
                if (skinning == null)
                {
                    renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo();
                    return;
                }

                var bones     = skinning.Bones;
                var boneCount = bones.Length;

                // Reserve space in the node buffer
                var newNodeInfoCount = Interlocked.Add(ref nodeInfoCount, boneCount);
                var nodeInfoOffset   = newNodeInfoCount - boneCount;

                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo
                {
                    NodeInfoOffset = nodeInfoOffset,
                    NodeInfoCount  = boneCount
                };

                // Ensure buffer capacity
                if (nodeInfos.Length < newNodeInfoCount)
                {
                    lock (nodeInfoLock)
                    {
                        if (nodeInfos.Length < newNodeInfoCount)
                        {
                            Array.Resize(ref nodeInfos, Math.Max(newNodeInfoCount, nodeInfos.Length * 2));
                        }
                    }
                }

                var nodeTransformations = skeleton.NodeTransformations;
                for (int index = 0; index < boneCount; index++)
                {
                    var nodeIndex = bones[index].NodeIndex;

                    nodeInfos[nodeInfoOffset + index] = new NodeFrameInfo
                    {
                        LinkToMeshMatrix   = bones[index].LinkToMeshMatrix,
                        NodeTransformation = nodeTransformations[nodeIndex].WorldMatrix
                    };
                }
            });
        }
示例#2
0
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            foreach (var objectNodeReference in RootRenderFeature.ObjectNodeReferences)
            {
                var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh = objectNode.RenderObject as RenderMesh;
                // TODO: Extract world
                var world = (renderMesh != null) ? renderMesh.World : Matrix.Identity;

                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo { World = world };
            }
        }
示例#3
0
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            foreach (var objectNodeReference in RootRenderFeature.ObjectNodeReferences)
            {
                var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh = objectNode.RenderObject as RenderMesh;
                // TODO: Extract world
                var world = (renderMesh != null) ? renderMesh.World : Matrix.Identity;

                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo {
                    World = world
                };
            }
        }
示例#4
0
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            nodeInfos.Clear();

            foreach (var objectNodeReference in RootRenderFeature.ObjectNodeReferences)
            {
                var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh = (RenderMesh)objectNode.RenderObject;

                var skeleton = renderMesh.RenderModel.ModelComponent.Skeleton;
                var skinning = renderMesh.Mesh.Skinning;

                // Skip unskinned meshes
                if (skinning == null)
                {
                    renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo();
                    continue;
                }

                var bones     = skinning.Bones;
                var boneCount = bones.Length;

                // Reserve space in the node buffer
                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo
                {
                    NodeInfoOffset = nodeInfos.Count,
                    NodeInfoCount  = boneCount
                };

                // Ensure buffer capacity
                nodeInfos.EnsureCapacity(nodeInfos.Count + boneCount);

                // Copy matrices
                for (int index = 0; index < boneCount; index++)
                {
                    var nodeIndex = bones[index].NodeIndex;

                    nodeInfos.Add(new NodeFrameInfo
                    {
                        LinkToMeshMatrix   = bones[index].LinkToMeshMatrix,
                        NodeTransformation = skeleton.NodeTransformations[nodeIndex].WorldMatrix
                    });
                }
            }
        }
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            //for (int index = 0; index < RootRenderFeature.ObjectNodeReferences.Count; index++)
            Dispatcher.For(0, RootRenderFeature.ObjectNodeReferences.Count, index =>
            {
                var objectNodeReference = RootRenderFeature.ObjectNodeReferences[index];
                var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh = objectNode.RenderObject as RenderMesh;

                // TODO: Extract world
                var world = renderMesh?.World ?? Matrix.Identity;

                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo { World = world };
            });
        }
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            //for (int index = 0; index < RootRenderFeature.ObjectNodeReferences.Count; index++)
            Dispatcher.For(0, RootRenderFeature.ObjectNodeReferences.Count, index =>
            {
                var objectNodeReference = RootRenderFeature.ObjectNodeReferences[index];
                var objectNode          = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh          = objectNode.RenderObject as RenderMesh;

                // TODO: Extract world
                var world = renderMesh?.World ?? Matrix.Identity;

                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo {
                    World = world
                };
            });
        }
示例#7
0
        /// <inheritdoc/>
        public override void Extract()
        {
            var renderModelObjectInfo = RootRenderFeature.RenderData.GetData(renderModelObjectInfoKey);

            nodeInfos.Clear();

            foreach (var objectNodeReference in RootRenderFeature.ObjectNodeReferences)
            {
                var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference);
                var renderMesh = (RenderMesh)objectNode.RenderObject;

                var skeleton = renderMesh.RenderModel.ModelComponent.Skeleton;
                var skinning = renderMesh.Mesh.Skinning;

                // Skip unskinned meshes
                if (skinning == null)
                {
                    renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo();
                    continue;
                }

                var bones = skinning.Bones;
                var boneCount = bones.Length;

                // Reserve space in the node buffer
                renderModelObjectInfo[objectNodeReference] = new RenderModelFrameInfo
                {
                    NodeInfoOffset = nodeInfos.Count,
                    NodeInfoCount = boneCount
                };

                // Ensure buffer capacity
                nodeInfos.EnsureCapacity(nodeInfos.Count + boneCount);

                // Copy matrices
                for (int index = 0; index < boneCount; index++)
                {
                    var nodeIndex = bones[index].NodeIndex;

                    nodeInfos.Add(new NodeFrameInfo
                    {
                        LinkToMeshMatrix = bones[index].LinkToMeshMatrix,
                        NodeTransformation = skeleton.NodeTransformations[nodeIndex].WorldMatrix
                    });
                }
            }
        }