コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }