Beispiel #1
0
 public override void CommitVisual(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.SceneGraph.CheckVisibleParam param)
 {
     if (EngineNS.CIPlatform.Instance.PlayMode == CIPlatform.enPlayMode.Editor)
     {
         mLineMeshComponent?.CommitVisual(cmd, camera, param);
     }
 }
Beispiel #2
0
 partial void CheckVisible_Editor(CCommandList cmd, Graphics.CGfxCamera camera, SceneGraph.CheckVisibleParam param)
 {
     foreach (var i in EditorActors.Values)
     {
         i.OnCheckVisible(cmd, null, camera, param);
     }
 }
Beispiel #3
0
 public override void CommitVisual(CRenderContext rc, Graphics.CGfxCamera camera)
 {
     if (EngineNS.CIPlatform.Instance.PlayMode == CIPlatform.enPlayMode.Editor)
     {
         mLineMeshComponent?.CommitVisual(rc, camera);
     }
 }
        public override void _OnEditorCommitVisual(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.SceneGraph.CheckVisibleParam param)
        {
            if (CEngine.PhysicsDebug == false)
            {
                return;
            }
            if (mDebugActor == null && mReady == false)
            {
                mReady = true;
                var test = CreateDefaultCapsule();

                test = SetMaterial();
            }

            if (mDebugActor != null)
            {
                float r          = 0.5f;
                float halfHeight = 0.5f;
                HostShape.IfGetCapsule(ref r, ref halfHeight);
                var trans = Placement.Transform * SocketMatrix * HostPlaceable.Placement.WorldMatrix;
                //mDebugActor.Placement.Location = RigidBody.Position;
                Vector3    scale, loc;//mDebugActor.Placement.Scale;
                Quaternion rotate;
                trans.Decompose(out scale, out rotate, out loc);
                var y = (r + halfHeight) * 2;
                scale.SetValue(scale.X * r * 2, scale.Y * y, scale.Z * r * 2);
                mDebugActor.Placement.Scale = scale;
            }
        }
Beispiel #5
0
 public override void CommitVisual(CCommandList cmd, Graphics.CGfxCamera Camera, SceneGraph.CheckVisibleParam param)
 {
     for (int i = 0; i < Components.Count; ++i)
     {
         var comp = Components[i];
         comp.CommitVisual(cmd, Camera, param);
     }
     base.CommitVisual(cmd, Camera, param);
 }
Beispiel #6
0
 public override void OnEditorCommitVisual(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.SceneGraph.CheckVisibleParam param)
 {
     for (int i = 0; i < Components.Count; ++i)
     {
         var comp = Components[i];
         comp.OnEditorCommitVisual(cmd, camera, param);
     }
     base.OnEditorCommitVisual(cmd, camera, param);
 }
Beispiel #7
0
        public void SlowDrawAll(CCommandList cmd, Graphics.CGfxCamera camera, SceneGraph.CheckVisibleParam param)
        {
            var it = Scenes.Values.GetEnumerator();

            while (it.MoveNext())
            {
                it.Current.SlowDrawAll(cmd, camera, param);
            }
            it.Dispose();
        }
Beispiel #8
0
 partial void OnEditorCheckVisible(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.SceneGraph.CheckVisibleParam param)
 {
     if (CIPlatform.Instance.PlayMode == CIPlatform.enPlayMode.Game)
     {
         return;
     }
     for (int i = 0; i < Components.Count; ++i)
     {
         Components[i].OnEditorCommitVisual(cmd, camera, param);
     }
 }
Beispiel #9
0
        public void SetCamera(Graphics.CGfxCamera camera, float dist, Vector3 offset)
        {
            Camera   = camera;
            LookDist = dist;
            Offset   = offset;

            if (camera != null || Host == null)
            {
                EyeTarget = GetLookAt() - camera.CameraData.Direction * dist;
                Camera.LookAtLH(EyeTarget, GetLookAt(), Vector3.UnitY);
            }
        }
Beispiel #10
0
        private void CheckVisibleForShadow(CCommandList cmd, Graphics.CGfxCamera camera)
        {
            var it = Scenes.Values.GetEnumerator();

            while (it.MoveNext())
            {
                mCheckVisibleParam.Reset();
                mCheckVisibleParam.FrustumCulling      = false;
                mCheckVisibleParam.ForShadow           = true;
                mCheckVisibleParam.mShadowCullDistance = camera.mShadowDistance;
                it.Current.CheckVisible(cmd, camera, mCheckVisibleParam, true);
            }
            it.Dispose();
            mCheckVisibleParam.SerialID++;
        }
        public void Commit(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.SceneGraph.CheckVisibleParam param, EPoolType poolType)
        {
            switch (poolType)
            {
            case EPoolType.Normal:
            {
                using (var i = Meshes.Values.GetEnumerator())
                {
                    while (i.MoveNext())
                    {
                        if (i.Current.CurSize == 0)
                        {
                            continue;
                        }

                        i.Current.MeshComp.CommitVisual(cmd, camera, param);
                        i.Current.Flush2VB(cmd);
                    }
                }
            }
            break;

            case EPoolType.Shadow:
            {
                using (var i = ShadowMeshes.Values.GetEnumerator())
                {
                    while (i.MoveNext())
                    {
                        if (i.Current.CurSize == 0)
                        {
                            continue;
                        }

                        i.Current.MeshComp.CommitVisual(cmd, camera, param);
                        i.Current.Flush2VB(cmd);
                    }
                }
            }
            break;
            }
        }
Beispiel #12
0
 public void GetContainVertices(Rectangle rect, Graphics.CGfxCamera camera, List <int> verts, bool cullback = true)
 {
     //verts.Clear();
     for (int i = 0; i < Vertices.Count; i++)
     {
         var cur = Vertices[i];
         if (GetValidLinkFace(i) == 0)
         {
             continue;
         }
         var screenPos = camera.CameraData.Trans2ViewPort(ref cur.Position);
         if (rect.Contains((int)screenPos.X, (int)screenPos.Y))
         {
             var viewNorm = Vector3.TransformNormal(cur.Normal, camera.CameraData.ViewMatrix);
             if (viewNorm.Z <= 0 || cullback == false)
             {
                 verts.Add(i);
             }
         }
     }
 }
Beispiel #13
0
        public void SetCameraByActor(GActor actor)
        {
            if (actor == null)
            {
                return;
            }
            var cameraComp = actor.GetComponentRecursion <GamePlay.Camera.CameraComponent>();

            if (cameraComp != null)
            {
                GameCamera = cameraComp.Camera;
                return;
            }
            var camera = actor.GetComponentRecursion <GamePlay.Camera.GCameraComponent>();

            if (camera != null)
            {
                GameCamera = camera.Camera.Camera;
                return;
            }
        }
Beispiel #14
0
        private void UpdateCBMeshbatch(EngineNS.CCommandList cmd, Graphics.CGfxCamera Camera)
        {
            var varIdx = mCBMeshBatch.FindVar("ClusterNumber");

            mCBMeshBatch.SetValue(varIdx, GpuClusters.Count, 0);
            varIdx = mCBMeshBatch.FindVar("MeshBatchVertexStride");
            mCBMeshBatch.SetValue(varIdx, AllVertices.Count, 0);

            if (Camera != null)
            {
                unsafe
                {
                    varIdx = mCBMeshBatch.FindVar("GpuDrivenCameraPlanes");
                    var pPlanes = stackalloc Plane[6];
                    Camera.CullingFrustum.GetPlanes(pPlanes);
                    for (uint i = 0; i < 6; i++)
                    {
                        mCBMeshBatch.SetValue(varIdx, pPlanes[i], i);
                    }

                    varIdx = mCBMeshBatch.FindVar("GpuDrivenCameraPosition");
                    mCBMeshBatch.SetValue(varIdx, Camera.CullingFrustum.TipPos, 0);

                    BoundingBox box = new BoundingBox();
                    Camera.CullingFrustum.GetBoundBox(ref box);
                    varIdx = mCBMeshBatch.FindVar("GpuDrivenFrustumMinPoint");
                    mCBMeshBatch.SetValue(varIdx, box.Minimum, 0);
                    varIdx = mCBMeshBatch.FindVar("GpuDrivenFrustumMaxPoint");
                    mCBMeshBatch.SetValue(varIdx, box.Maximum, 0);

                    varIdx = mCBMeshBatch.FindVar("EnableGpuCulling");
                    mCBMeshBatch.SetValue(varIdx, (uint)(1), 0);
                }
            }
            else
            {
                varIdx = mCBMeshBatch.FindVar("EnableGpuCulling");
                mCBMeshBatch.SetValue(varIdx, (uint)(0), 0);
            }
        }
Beispiel #15
0
        public void CheckVisible(CCommandList cmd, Graphics.CGfxCamera camera)
        {
            ScopeCheckVisible.Begin();
            var it = Scenes.Values.GetEnumerator();

            while (it.MoveNext())
            {
                mCheckVisibleParam.Reset();
                mCheckVisibleParam.FrustumCulling = true;
                it.Current.CheckVisible(cmd, camera, mCheckVisibleParam, true);
            }
            it.Dispose();
            CheckVisible_Editor(cmd, camera, mCheckVisibleParam);
            mCheckVisibleParam.SerialID++;

            if (CEngine.EnableShadow)
            {
                CheckVisibleForShadow(cmd, camera);
            }

            camera.SceneView?.UpdatePointLights(this.mDefaultScene);
            ScopeCheckVisible.End();
        }
Beispiel #16
0
        public Actor.GActor PickActor(out VHitResult hitResult, Graphics.CGfxCamera camera, int x, int y, float length = 1000.0f)
        {
            if (camera == null)
            {
                camera = CEngine.Instance.GameInstance?.GameCamera;
            }
            if (camera == null)
            {
                hitResult = VHitResult.Default;
                return(null);
            }
            var pickDir = new Vector3();

            if (camera.GetPickRay(ref pickDir, x, y, 0, 0) == false)
            {
                hitResult = VHitResult.Default;
                return(null);
            }
            var start = camera.CameraData.Position;
            var end   = camera.CameraData.Position + pickDir * length;
            var tmp   = VHitResult.Default;

            Bricks.PhysicsCore.PhyFilterData filterData = new Bricks.PhysicsCore.PhyFilterData();
            filterData.word1 = (uint)Bricks.PhysicsCore.CollisionComponent.CollisionLayers.Camera;
            Bricks.PhysicsCore.PhyQueryFilterData queryFilterData = new Bricks.PhysicsCore.PhyQueryFilterData(filterData);
            if (this.LineCheckWithFilter(ref start, ref end, ref queryFilterData, ref tmp) == false)
            {
                hitResult = VHitResult.Default;
                return(null);
            }
            hitResult = tmp;
            Actor.GActor outActor = null;
            GetHitActorByPhysics(ref hitResult, ref outActor);

            return(outActor);
        }
Beispiel #17
0
        private unsafe void UpdateIndexBufferCPU(CCommandList cmd, Graphics.CGfxCamera Camera)
        {
            if (mCpuDrawIndexBuffer == null)
            {
                return;
            }
            CBMeshBatch cbMesh = new CBMeshBatch();
            {
                var pPlanes = stackalloc Plane[6];
                Camera.CullingFrustum.GetPlanes(pPlanes);
                CBMeshBatch *pCBuffer  = &cbMesh;
                Plane *      planesTar = (Plane *)pCBuffer;
                for (uint i = 0; i < 6; i++)
                {
                    planesTar[i] = pPlanes[i];
                }
                cbMesh.GpuDrivenCameraPosition = Camera.CullingFrustum.TipPos;
                BoundingBox box = new BoundingBox();
                Camera.CullingFrustum.GetBoundBox(ref box);
                cbMesh.GpuDrivenFrustumMinPoint = box.Minimum;
                cbMesh.GpuDrivenFrustumMaxPoint = box.Maximum;
                cbMesh.MeshBatchVertexStride    = (uint)AllVertices.Count;
                cbMesh.ClusterNumber            = (uint)GpuClusters.Count;

                UpdateCBMeshbatch(cmd, Camera);
            }

            UInt32_3 tri = new UInt32_3();

            mDrawIndices.Clear();
            for (int i = 0; i < GpuClusters.Count; i++)
            {
                var cluster = GpuClusters[i];
                var GpuDrivenCameraDirection = GpuClusters[i].BoundCenter - cbMesh.GpuDrivenCameraPosition;
                var cameraDirInBoundSpace    = Vector3.TransposeTransformNormal(GpuDrivenCameraDirection, GpuInstanceDatas[(int)cluster.InstanceId].InvMatrix);
                if (FrustumCull(ref cluster, ref cbMesh) == false)
                {
                    UInt64 visBits = 0;
                    if (cameraDirInBoundSpace.X >= 0)
                    {
                        visBits |= cluster.CubeFaces[(int)Cluster.GpuCluster.ECubeFace.CubeFace_NX];
                    }
                    else
                    {
                        visBits |= cluster.CubeFaces[(int)Cluster.GpuCluster.ECubeFace.CubeFace_X];
                    }
                    if (cameraDirInBoundSpace.Y >= 0)
                    {
                        visBits |= cluster.CubeFaces[(int)Cluster.GpuCluster.ECubeFace.CubeFace_NY];
                    }
                    else
                    {
                        visBits |= cluster.CubeFaces[(int)Cluster.GpuCluster.ECubeFace.CubeFace_Y];
                    }
                    if (cameraDirInBoundSpace.Z >= 0)
                    {
                        visBits |= cluster.CubeFaces[(int)Cluster.GpuCluster.ECubeFace.CubeFace_NZ];
                    }
                    else
                    {
                        visBits |= cluster.CubeFaces[(int)Cluster.GpuCluster.ECubeFace.CubeFace_Z];
                    }

                    uint InstanceStartIndex = cbMesh.MeshBatchVertexStride * cluster.InstanceId;
                    for (int j = 0; j < cluster.FaceCount; j++)
                    {
                        if (TestBit(visBits, j) == false)
                        {
                            continue;
                        }
                        int srcIndex = (int)(cluster.StartFaceIndex + j) * 3;
                        tri.x = InstanceStartIndex + AllIndices[srcIndex];
                        tri.y = InstanceStartIndex + AllIndices[srcIndex + 1];
                        tri.z = InstanceStartIndex + AllIndices[srcIndex + 2];
                        mDrawIndices.Add(tri);
                    }
                }
            }

            mDrawArgs.InstanceCount         = 1;
            mDrawArgs.IndexCountPerInstance = (uint)mDrawIndices.Count * 3;
            uint size = (uint)(mDrawIndices.Count * sizeof(UInt32_3));

            if (mCpuDrawIndexBuffer.Desc.ByteWidth > size)
            {
                mCpuDrawIndexBuffer.UpdateBuffData(cmd, mDrawIndices.GetBufferPtr(), size);
            }
        }
 public static void Face2Cameral(ref CGfxParticlePose pose, Graphics.CGfxCamera camera)
 {
 }
Beispiel #19
0
        public void OnEditorCommitVisual(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.Actor.GActor hostactor, GamePlay.SceneGraph.CheckVisibleParam param)
        {
            if (hostactor == null || !hostactor.Visible)
            {
                return;
            }

            var rc = CEngine.Instance.RenderContext;

            switch (ShapeType)
            {
            case EPhysShapeType.PST_Convex:
            {
                if (mDebugActor == null)
                {
                    Graphics.Mesh.CGfxMeshPrimitives mp = IfGetConvexMesh(rc);
                    mDebugActor = EngineNS.GamePlay.Actor.GActor.NewMeshActorDirect(CEngine.Instance.MeshManager.CreateMesh(rc, mp));
                    EngineNS.Thread.Async.TaskLoader.Release(ref WaitContext, null);
                    var test = SetMaterial();
                }
                mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform);
            }
            break;

            case EPhysShapeType.PST_TriangleMesh:
            {
                if (mDebugActor == null)
                {
                    Graphics.Mesh.CGfxMeshPrimitives mp = IfGetTriMesh(rc);
                    CEngine.Instance.MeshManager.CreateMesh(rc, mp);
                    EngineNS.Thread.Async.TaskLoader.Release(ref WaitContext, null);
                    mDebugActor = EngineNS.GamePlay.Actor.GActor.NewMeshActorDirect(CEngine.Instance.MeshManager.CreateMesh(rc, mp));

                    var test = SetMaterial();
                }
                mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform);
            }
            break;

            case EPhysShapeType.PST_Box:
            {
                if (mDebugActor == null && mReady == false)
                {
                    mReady = true;
                    var test = CreateDefaultBox();

                    test = SetMaterial();
                }

                if (mDebugActor != null)
                {
                    float w = 1.0f;
                    float h = 1.0f;
                    float l = 1.0f;
                    SDK_PhyShape_IfGetBox(ref w, ref h, ref l);
                    mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform);
                    Vector3 scale = Vector3.UnitXYZ;        //mDebugActor.Placement.Scale;
                    scale.SetValue(scale.X * w, scale.Y * h, scale.Z * l);
                    mDebugActor.Placement.Scale = scale;
                }
            }
            break;

            case EPhysShapeType.PST_Sphere:
            {
                if (mDebugActor == null && mReady == false)
                {
                    mReady = true;
                    var test = CreateDefaultSphere();
                    test = SetMaterial();
                }

                if (mDebugActor != null)
                {
                    float r = 1.0f;
                    IfGetSphere(ref r);
                    mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform);
                    Vector3 scale = Vector3.UnitXYZ;        //mDebugActor.Placement.Scale;
                    scale.SetValue(scale.X * r, scale.Y * r, scale.Z * r);
                    mDebugActor.Placement.Scale = scale;
                }
            }
            break;

            default:
                break;
            }

            if (mDebugActor != null)
            {
                foreach (var comp in mDebugActor.Components)
                {
                    var meshComp = comp as EngineNS.GamePlay.Component.GVisualComponent;
                    if (meshComp != null)
                    {
                        meshComp.CommitVisual(cmd, camera, param);
                    }
                }
            }
        }
Beispiel #20
0
        public unsafe void UpdateGpuBuffer(CRenderContext rc, EngineNS.CCommandList cmd, Graphics.CGfxCamera Camera)
        {
            if (UseVTF)
            {
                UpdateGpuBufferVTF(rc, cmd, Camera);
            }
            else
            {
                var bfDesc = new CGpuBufferDesc();
                //mAllVertexSRV
                {
                    bfDesc.SetMode(false, false);
                    bfDesc.ByteWidth           = (uint)(mAllVertices.Count * sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuSceneVertex));
                    bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuSceneVertex);
                    var copyArray = mAllVertices.ToArray();
                    fixed(EngineNS.Bricks.GpuDriven.Cluster.GpuSceneVertex *p = &copyArray[0])
                    {
                        bufferAllVertex = rc.CreateGpuBuffer(bfDesc, (IntPtr)p);
                    }

                    var srvDesc = new ISRVDesc();
                    srvDesc.ToDefault();
                    srvDesc.ViewDimension        = EResourceDimension.RESOURCE_DIMENSION_BUFFER;
                    srvDesc.Buffer.ElementOffset = 0;
                    srvDesc.Buffer.NumElements   = (uint)mAllVertices.Count;
                    mAllVertexSRV = rc.CreateShaderResourceViewFromBuffer(bufferAllVertex, srvDesc);
                }
                //uavMeshInstanceArray
                {
                    bfDesc.SetMode(false, true);
                    bfDesc.ByteWidth           = (uint)(GpuInstanceDatas.Count * sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData));
                    bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData);
                    var copyArray = GpuInstanceDatas.ToArray();
                    fixed(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData *p = &copyArray[0])
                    {
                        bufferMeshInstanceArray = rc.CreateGpuBuffer(bfDesc, (IntPtr)p);
                        //bufferMeshInstanceArray.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth);
                    }

                    var uavDesc = new CUnorderedAccessViewDesc();
                    uavDesc.ToDefault();
                    uavDesc.Buffer.NumElements = (uint)GpuInstanceDatas.Count;
                    uavMeshInstanceArray       = rc.CreateUnorderedAccessView(bufferMeshInstanceArray, uavDesc);

                    var srvDesc = new ISRVDesc();
                    srvDesc.ToDefault();
                    srvDesc.ViewDimension        = EResourceDimension.RESOURCE_DIMENSION_BUFFER;
                    srvDesc.Buffer.ElementOffset = 0;
                    srvDesc.Buffer.NumElements   = (uint)GpuInstanceDatas.Count;
                    mMeshInstanceSRV             = rc.CreateShaderResourceViewFromBuffer(bufferMeshInstanceArray, srvDesc);
                }
            }
            if (UseComputeShader)
            {
                var bfDesc = new CGpuBufferDesc();
                if (uavMeshInstanceArray == null)
                {
                    bfDesc.SetMode(false, true);
                    bfDesc.ByteWidth           = (uint)(GpuInstanceDatas.Count * sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData));
                    bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData);
                    var copyArray = GpuInstanceDatas.ToArray();
                    fixed(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData *p = &copyArray[0])
                    {
                        bufferMeshInstanceArray = rc.CreateGpuBuffer(bfDesc, (IntPtr)p);
                        //bufferMeshInstanceArray.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth);
                    }

                    var uavDesc = new CUnorderedAccessViewDesc();
                    uavDesc.ToDefault();
                    uavDesc.Buffer.NumElements = (uint)GpuInstanceDatas.Count;
                    uavMeshInstanceArray       = rc.CreateUnorderedAccessView(bufferMeshInstanceArray, uavDesc);

                    var srvDesc = new ISRVDesc();
                    srvDesc.ToDefault();
                    srvDesc.ViewDimension        = EResourceDimension.RESOURCE_DIMENSION_BUFFER;
                    srvDesc.Buffer.ElementOffset = 0;
                    srvDesc.Buffer.NumElements   = (uint)GpuInstanceDatas.Count;
                    mMeshInstanceSRV             = rc.CreateShaderResourceViewFromBuffer(bufferMeshInstanceArray, srvDesc);
                }

                //uavClusterArray
                {
                    bfDesc.SetMode(false, true);
                    bfDesc.ByteWidth           = (uint)(GpuClusters.Count * sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuCluster));
                    bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuCluster);
                    var copyArray = GpuClusters.ToArray();
                    fixed(EngineNS.Bricks.GpuDriven.Cluster.GpuCluster *p = &copyArray[0])
                    {
                        bufferClusterArray = rc.CreateGpuBuffer(bfDesc, (IntPtr)p);
                        //bufferClusterArray.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth);
                    }

                    var uavDesc = new CUnorderedAccessViewDesc();
                    uavDesc.ToDefault();
                    uavDesc.Buffer.NumElements = (uint)GpuClusters.Count;
                    uavClusterArray            = rc.CreateUnorderedAccessView(bufferClusterArray, uavDesc);
                }

                //uavStaticSceneAllFaces
                {
                    bfDesc.SetMode(false, true);
                    bfDesc.ByteWidth           = (uint)(AllIndices.Count * sizeof(uint));
                    bfDesc.StructureByteStride = (uint)sizeof(uint);
                    var copyArray = AllIndices.ToArray();
                    fixed(uint *p = &copyArray[0])
                    {
                        bufferStaticSceneAllFaces = rc.CreateGpuBuffer(bfDesc, (IntPtr)p);
                        //bufferStaticSceneAllFaces.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth);
                    }

                    var uavDesc = new CUnorderedAccessViewDesc();
                    uavDesc.ToDefault();
                    uavDesc.Buffer.NumElements = (uint)(AllIndices.Count);
                    uavStaticSceneAllFaces     = rc.CreateUnorderedAccessView(bufferStaticSceneAllFaces, uavDesc);
                }

                //uavStaticSceneDrawFaces
                {
                    bfDesc.SetMode(false, true);

                    int MaxInstanceNumber = 20;
                    bfDesc.ByteWidth           = (uint)(AllIndices.Count * MaxInstanceNumber * sizeof(uint));
                    bfDesc.StructureByteStride = (uint)sizeof(uint);
                    bfDesc.MiscFlags           = (UInt32)EResourceMiscFlag.BUFFER_ALLOW_RAW_VIEWS;
                    bfDesc.BindFlags          |= (UInt32)EBindFlag.INDEX_BUFFER;
                    bfDesc.CPUAccessFlags      = 0;
                    bufferStaticSceneDrawFaces = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero);

                    var uavDesc = new CUnorderedAccessViewDesc();
                    uavDesc.ToDefault();
                    uavDesc.Format             = EPixelFormat.PXF_R32_TYPELESS;
                    uavDesc.Buffer.NumElements = (uint)(AllIndices.Count * MaxInstanceNumber);
                    uavDesc.Buffer.Flags       = (UInt32)EUAVBufferFlag.UAV_FLAG_RAW;
                    uavStaticSceneDrawFaces    = rc.CreateUnorderedAccessView(bufferStaticSceneDrawFaces, uavDesc);

                    var ibDesc = new CIndexBufferDesc();
                    ibDesc.CPUAccess = 0;
                    ibDesc.InitData  = IntPtr.Zero;
                    ibDesc.ByteWidth = bfDesc.ByteWidth;
                    ibDesc.Type      = EIndexBufferType.IBT_Int32;

                    mDrawIndexBuffer = rc.CreateIndexBufferFromBuffer(ibDesc, bufferStaticSceneDrawFaces);
                }

                //uavIndirectDrawArgs
                {
                    bfDesc.SetMode(false, true);

                    bfDesc.ByteWidth           = 20; //(uint)(1 * sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs));
                    bfDesc.StructureByteStride = 4;  //(uint)sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs);
                    bfDesc.MiscFlags           = (UInt32)(EResourceMiscFlag.DRAWINDIRECT_ARGS | EResourceMiscFlag.BUFFER_ALLOW_RAW_VIEWS);
                    bfDesc.CPUAccessFlags      = 0;
                    bufferIndirectDrawArgs     = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero);
                    var uavDesc = new CUnorderedAccessViewDesc();
                    uavDesc.ToDefault();
                    uavDesc.Format = EPixelFormat.PXF_R32_TYPELESS;

                    uavDesc.Buffer.NumElements = (uint)(5);
                    uavDesc.Buffer.Flags       = (UInt32)EUAVBufferFlag.UAV_FLAG_RAW;
                    uavIndirectDrawArgs        = rc.CreateUnorderedAccessView(bufferIndirectDrawArgs, uavDesc);

                    var drawAgrs = new EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs();
                    drawAgrs.InstanceCount         = 1;
                    drawAgrs.StartInstanceLocation = 0;
                    drawAgrs.IndexCountPerInstance = 0;
                    bufferIndirectDrawArgs.UpdateBufferData(cmd, (IntPtr)(&drawAgrs), bfDesc.ByteWidth);
                }

                ComputeDispatch(rc, cmd, Camera);
            }
            else
            {
                CIndexBufferDesc ibDesc = new CIndexBufferDesc(EIndexBufferType.IBT_Int32);
                ibDesc.CPUAccess    = (UInt32)ECpuAccess.CAS_WRITE;
                ibDesc.ByteWidth    = (uint)(mAllIndices.Count * sizeof(UInt32) * 20);
                mCpuDrawIndexBuffer = rc.CreateIndexBuffer(ibDesc);
            }


            //CEngine.Instance.EventPoster.RunOn(() =>
            //{
            //    var blobDrawArgs = new EngineNS.Support.CBlobObject();
            //    bufferIndirectDrawArgs.GetBufferData(rc, blobDrawArgs);
            //    EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs* pArg = (EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs*)blobDrawArgs.Data.ToPointer();
            //    if (pArg != null)
            //    {
            //        mDrawArgs = *pArg;
            //    }
            //    return null;
            //}, Thread.Async.EAsyncTarget.Main);
        }
Beispiel #21
0
        public unsafe void UpdateGpuBufferVTF(CRenderContext rc, EngineNS.CCommandList cmd, Graphics.CGfxCamera Camera)
        {
            CTexture2DDesc desc = new CTexture2DDesc();

            desc.Init();

            var spDesc = new CSamplerStateDesc();

            spDesc.SetDefault();
            spDesc.Filter = ESamplerFilter.SPF_MIN_MAG_MIP_POINT;
            mSamplerState = CEngine.Instance.SamplerStateManager.GetSamplerState(rc, spDesc);

            int vertStride = sizeof(Cluster.GpuSceneVertex);
            int size       = mAllVertices.Count * vertStride;
            int side       = (int)Math.Sqrt((float)size) + 1;

            desc.Width     = 512;
            desc.Height    = 512;
            desc.MipLevels = 1;
            desc.Format    = EPixelFormat.PXF_R32G32B32A32_FLOAT;
            mVertexTexture = rc.CreateTexture2D(desc);
            CShaderResourceViewDesc srvDesc = new CShaderResourceViewDesc();

            srvDesc.mFormat    = desc.Format;
            srvDesc.mTexture2D = mVertexTexture.CoreObject;
            mVertexTextureView = rc.CreateShaderResourceView(srvDesc);
            mVertexTextureView.ResourceState.StreamState = EStreamingState.SS_Valid;

            {
                var copyArray = mAllVertices.ToArray();
                fixed(Vector4 *p = &mVertexTexData[0])
                fixed(Cluster.GpuSceneVertex * v = &copyArray[0])
                {
                    CoreSDK.SDK_Memory_Copy(p, v, (uint)size);

                    mVertexTexture.UpdateMipData(cmd, 0, p, 512, 512, 512 * 4 * 4);
                }
            }

            int InstStride = sizeof(GpuMeshInstanceData);

            size                     = mGpuInstanceDatas.Count * InstStride;
            side                     = (int)Math.Sqrt((float)size) + 1;
            desc.Width               = 256;
            desc.Height              = 256;
            desc.MipLevels           = 1;
            desc.Format              = EPixelFormat.PXF_R32G32B32A32_FLOAT;
            mInstanceDataTexture     = rc.CreateTexture2D(desc);
            srvDesc.mFormat          = desc.Format;
            srvDesc.mTexture2D       = mInstanceDataTexture.CoreObject;
            mInstanceDataTextureView = rc.CreateShaderResourceView(srvDesc);
            mInstanceDataTextureView.ResourceState.StreamState = EStreamingState.SS_Valid;

            {
                var copyArray = mGpuInstanceDatas.ToArray();
                fixed(Vector4 *p = &mInstTexData[0])
                fixed(GpuMeshInstanceData * v = &copyArray[0])
                {
                    CoreSDK.SDK_Memory_Copy(p, v, (uint)size);
                    mInstanceDataTexture.UpdateMipData(cmd, 0, p, 256, 256, 256 * 4 * 4);
                }
            }
        }
Beispiel #22
0
        public void DrawScene(CRenderContext rc, CCommandList cmd, Graphics.CGfxCamera Camera, Graphics.View.CGfxSceneView view)
        {
            if (EnableDraw == false)
            {
                return;
            }
            if (mNeedUpdateGpuBuffer)
            {
                mNeedUpdateGpuBuffer = false;
                UpdateGpuBuffer(rc, cmd, Camera);
            }

            var program = mPass.Effect.ShaderProgram;

            if (UseComputeShader == false)
            {
                UpdateIndexBufferCPU(cmd, Camera);
            }
            else
            {
                ComputeDispatch(rc, cmd, Camera);
            }

            if (UseVTF)
            {
                CTextureBindInfo tbInfo = new CTextureBindInfo();
                if (program.FindTextureBindInfo(null, "gVertexTexture", ref tbInfo))
                {
                    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mVertexTextureView);
                }
                if (program.FindTextureBindInfo(null, "gInstanceDataTexture", ref tbInfo))
                {
                    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mInstanceDataTextureView);
                }
                var spInfo = new CSamplerBindInfo();
                if (program.FindSamplerBindInfo(null, "Samp_gVertexTexture", ref spInfo))
                {
                    mPass.ShaderSamplerBinder.VSBindSampler(spInfo.VSBindPoint, mSamplerState);
                }
                if (program.FindSamplerBindInfo(null, "Samp_gInstanceDataTexture", ref spInfo))
                {
                    mPass.ShaderSamplerBinder.VSBindSampler(spInfo.VSBindPoint, mSamplerState);
                }
            }
            else
            {
                //CTextureBindInfo tbInfo = new CTextureBindInfo();
                //if(program.FindTextureBindInfo(null, "AllVertexArray", ref tbInfo))
                //{
                //    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mAllVertexSRV);
                //}
                //if (program.FindTextureBindInfo(null, "MeshInstanceArray", ref tbInfo))
                //{
                //    mPass.ShaderResources.VSBindTexture(tbInfo.VSBindPoint, mMeshInstanceSRV);
                //}
                mPass.ShaderResources.VSBindTexture(14, mAllVertexSRV);
                mPass.ShaderResources.VSBindTexture(13, mMeshInstanceSRV);
            }

            CConstantBufferDesc cbInfo = new CConstantBufferDesc();

            if (mCBMeshBatch != null && program.GetCBufferDesc(program.FindCBuffer("cbMeshBatch"), ref cbInfo))
            {
                mPass.BindCBufferVS(cbInfo.VSBindPoint, mCBMeshBatch);
            }
            mPass.ViewPort = Camera.SceneView.Viewport;

            mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_Camera, Camera.CBuffer);
            if (view != null)
            {
                mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_View, view.SceneViewCB);
            }

            //mPass.ViewPort = view.Viewport;

            if (UseComputeShader == false)
            {
                mPass.AttachIndexBuffer = mCpuDrawIndexBuffer;

                var dpDesc = new CDrawPrimitiveDesc();
                dpDesc.SetDefault();
                dpDesc.NumPrimitives = mDrawArgs.IndexCountPerInstance / 3;
                mPass.GeometryMesh.SetAtom(0, 0, ref dpDesc);
            }
            else
            {
                mPass.AttachIndexBuffer = mDrawIndexBuffer;
                mPass.SetIndirectDraw(bufferIndirectDrawArgs, 0);
            }

            cmd.PushPass(mPass);
        }
Beispiel #23
0
 partial void CheckVisible_Editor(CCommandList cmd, Graphics.CGfxCamera camera, SceneGraph.CheckVisibleParam param);
Beispiel #24
0
        public void ComputeDispatch(CRenderContext rc, EngineNS.CCommandList cmd, Graphics.CGfxCamera Camera)
        {
            if (mCS_ClearBatchArgs == null)
            {
                return;
            }

            UInt32[] pUAVInitialCounts = new UInt32[1] {
                1,
            };

            {
                cmd.SetComputeShader(mCS_ClearBatchArgs);
                //if (mCS_ClearBatchArgsDesc.GetCBufferDesc("IndirectDrawArgs", ref cbDesc))
                //    cmd.CSSetUnorderedAccessView(cbDesc.CSBindPoint, uavIndirectDrawArgs, pUAVInitialCounts);
                cmd.CSSetUnorderedAccessView(5, uavIndirectDrawArgs, pUAVInitialCounts);
                cmd.CSDispatch(1, 1, 1);
                cmd.CSSetUnorderedAccessView(5, null, pUAVInitialCounts);
            }

            cmd.SetComputeShader(mCS_MeshBatch);
            //if (mCS_MeshBatchDesc.GetCBufferDesc("MeshInstanceArray", ref cbDesc))
            //    cmd.CSSetUnorderedAccessView(cbDesc.CSBindPoint, uavMeshInstanceArray, pUAVInitialCounts);
            //if (mCS_MeshBatchDesc.GetCBufferDesc("ClusterArray", ref cbDesc))
            //    cmd.CSSetUnorderedAccessView(cbDesc.CSBindPoint, uavClusterArray, pUAVInitialCounts);
            //if (mCS_MeshBatchDesc.GetCBufferDesc("StaticSceneAllFaces", ref cbDesc))
            //    cmd.CSSetUnorderedAccessView(cbDesc.CSBindPoint, uavStaticSceneAllFaces, pUAVInitialCounts);
            //if (mCS_MeshBatchDesc.GetCBufferDesc("StaticSceneDrawFaces", ref cbDesc))
            //    cmd.CSSetUnorderedAccessView(cbDesc.CSBindPoint, uavStaticSceneDrawFaces, pUAVInitialCounts);
            //if (mCS_MeshBatchDesc.GetCBufferDesc("IndirectDrawArgs", ref cbDesc))
            //    cmd.CSSetUnorderedAccessView(cbDesc.CSBindPoint, uavIndirectDrawArgs, pUAVInitialCounts);

            cmd.CSSetUnorderedAccessView(1, uavMeshInstanceArray, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(2, uavClusterArray, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(3, uavStaticSceneAllFaces, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(4, uavStaticSceneDrawFaces, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(5, uavIndirectDrawArgs, pUAVInitialCounts);

            UpdateCBMeshbatch(cmd, Camera);
            mCBMeshBatch.FlushContent(cmd);

            var cbIndex = mCS_MeshBatchDesc.FindCBufferDesc("cbMeshBatch");
            var tmpDesc = new EngineNS.CConstantBufferDesc();

            if (mCS_MeshBatchDesc.GetCBufferDesc(cbIndex, ref tmpDesc))
            {
                if (tmpDesc.Type == EngineNS.ECBufferRhiType.SIT_CBUFFER)
                {
                    cmd.CSSetConstantBuffer(tmpDesc.CSBindPoint, mCBMeshBatch);
                }
            }

            cmd.CSDispatch((uint)((GpuClusters.Count + 63) / 64), 1, 1);

            cmd.CSSetUnorderedAccessView(1, null, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(2, null, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(3, null, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(4, null, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(5, null, pUAVInitialCounts);

            cmd.SetComputeShader(null);
            //unsafe
            //{
            //    CEngine.Instance.EventPoster.RunOn(() =>
            //    {
            //        var blobDrawArgs = new EngineNS.Support.CBlobObject();
            //        bufferIndirectDrawArgs.GetBufferData(rc, blobDrawArgs);
            //        EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs* pArg = (EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs*)blobDrawArgs.Data.ToPointer();
            //        if (pArg != null)
            //        {
            //            mDrawArgs = *pArg;
            //        }
            //        return null;
            //    }, Thread.Async.EAsyncTarget.Main);
            //}
        }