private Cluster.ClusteredMesh GetClusteredMesh(CRenderContext rc, RName clusterName, out uint indexOffset) { KeyValuePair <uint, Cluster.ClusteredMesh> result; if (mClusteredMeshs.TryGetValue(clusterName, out result)) { indexOffset = result.Key; return(result.Value); } else { uint vertexOffset = (uint)mAllVertices.Count; Cluster.ClusteredMesh clusterMesh = CEngine.Instance.ClusteredMeshManager.GetResource(rc, clusterName, true); mAllVertices.AddRange(clusterMesh.MeshVertices); indexOffset = (uint)mAllIndices.Count; for (int i = 0; i < clusterMesh.IndexBuffer.Count; i++) { uint index = vertexOffset + clusterMesh.IndexBuffer[i]; mAllIndices.Add(index); } result = new KeyValuePair <uint, Cluster.ClusteredMesh>(indexOffset, clusterMesh); mClusteredMeshs.Add(clusterName, result); return(result.Value); } }
public void AddMeshInstance(CRenderContext rc, Graphics.Mesh.CGfxMesh mesh, RName clusterName, GamePlay.Component.GPlacementComponent placement) { var worldMatrix = placement.WorldMatrix; uint instStart = (uint)mGpuInstanceDatas.Count; for (int i = 0; i < mesh.MtlMeshArray.Length; i++) { var data = new GpuMeshInstanceData(); data.VTMaterialId.x = 1;//(uint)GetOrAddMaterialId(mesh.MtlMeshArray[i].MtlInst); data.Matrix = worldMatrix; Matrix.Invert(ref data.Matrix, out data.InvMatrix); data.Matrix.Transpose(); data.InvMatrix.Transpose(); mGpuInstanceDatas.Add(data); //var module = CEngine.Instance.GetCurrentModule(); //module.World.AddActor(); } uint indexOffset; Cluster.ClusteredMesh cluster = GetClusteredMesh(rc, clusterName, out indexOffset); for (int i = 0; i < cluster.ClusterDatas.Count; i++) { Cluster.GpuCluster gpuCluster = cluster.ClusterDatas[i]; gpuCluster.InstanceId += instStart; gpuCluster.StartFaceIndex += indexOffset / 3; BoundingBox tmpBox = new BoundingBox(gpuCluster.BoundCenter - gpuCluster.BoundExtent, gpuCluster.BoundCenter + gpuCluster.BoundExtent); tmpBox = BoundingBox.Transform(ref tmpBox, ref worldMatrix); gpuCluster.BoundCenter = tmpBox.GetCenter(); gpuCluster.BoundExtent = tmpBox.GetSize() * 0.5f; mGpuClusters.Add(gpuCluster); } }