/// <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); Dispatcher.ForEach(RootRenderFeature.ObjectNodeReferences, objectNodeReference => { var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference); var renderMesh = (RenderMesh)objectNode.RenderObject; // TODO GRAPHICS REFACTOR: Extract copy of matrices renderModelObjectInfo[objectNodeReference] = renderMesh.BlendMatrices; }); }
/// <param name="context"></param> /// <inheritdoc/> public override void PrepareEffectPermutations(RenderDrawContext context) { var skinningInfos = RootRenderFeature.RenderData.GetData(skinningInfoKey); var renderEffects = RootRenderFeature.RenderData.GetData(renderEffectKey); int effectSlotCount = ((RootEffectRenderFeature)RootRenderFeature).EffectPermutationSlotCount; //foreach (var objectNodeReference in RootRenderFeature.ObjectNodeReferences) Dispatcher.ForEach(((RootEffectRenderFeature)RootRenderFeature).ObjectNodeReferences, objectNodeReference => { var objectNode = RootRenderFeature.GetObjectNode(objectNodeReference); var renderMesh = (RenderMesh)objectNode.RenderObject; var staticObjectNode = renderMesh.StaticObjectNode; var skinningInfo = skinningInfos[staticObjectNode]; var parameters = renderMesh.Mesh.Parameters; if (parameters != skinningInfo.Parameters || parameters.PermutationCounter != skinningInfo.PermutationCounter) { skinningInfo.Parameters = parameters; skinningInfo.PermutationCounter = parameters.PermutationCounter; skinningInfo.HasSkinningPosition = parameters.Get(MaterialKeys.HasSkinningPosition); skinningInfo.HasSkinningNormal = parameters.Get(MaterialKeys.HasSkinningNormal); skinningInfo.HasSkinningTangent = parameters.Get(MaterialKeys.HasSkinningTangent); skinningInfos[staticObjectNode] = skinningInfo; } for (int i = 0; i < effectSlotCount; ++i) { var staticEffectObjectNode = staticObjectNode * effectSlotCount + i; var renderEffect = renderEffects[staticEffectObjectNode]; // Skip effects not used during this frame if (renderEffect == null || !renderEffect.IsUsedDuringThisFrame(RenderSystem)) { continue; } if (renderMesh.Mesh.Skinning != null) { renderEffect.EffectValidator.ValidateParameter(MaterialKeys.HasSkinningPosition, skinningInfo.HasSkinningPosition); renderEffect.EffectValidator.ValidateParameter(MaterialKeys.HasSkinningNormal, skinningInfo.HasSkinningNormal); renderEffect.EffectValidator.ValidateParameter(MaterialKeys.HasSkinningTangent, skinningInfo.HasSkinningTangent); var skinningBones = Math.Max(MaxBones, renderMesh.Mesh.Skinning.Bones.Length); renderEffect.EffectValidator.ValidateParameter(MaterialKeys.SkinningMaxBones, skinningBones); } } }); }
/// <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 renderModelObjectInfo[objectNodeReference].World = renderMesh != null ? renderMesh.World : Matrix.Identity; }); }
/// <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 }); } } }