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