Exemple #1
0
        public virtual async System.Threading.Tasks.Task <bool> InitEnviroment()
        {
            var rc = EngineNS.CEngine.Instance.RenderContext;

            mCamera = new EngineNS.Graphics.CGfxCamera();
            mCamera.Init(rc, false);

            Vector3 Eye = new Vector3();

            Eye.SetValue(0.0f, 0.0f, -3.0f);
            Vector3 At = new Vector3();

            At.SetValue(0.0f, 0.0f, 0.0f);
            Vector3 Up = new Vector3();

            Up.SetValue(0.0f, 1.0f, 0.0f);
            mCamera.LookAtLH(Eye, At, Up);

            mCamera.PerspectiveFovLH(mCamera.mDefaultFoV, (float)mWidth, (float)mHeight, 0.1f, 1000.0f);
            mCamera.BeforeFrame();
            mCamera.SwapBuffer(false);

            mRP_Snapshot = new EngineNS.Graphics.RenderPolicy.CGfxRP_Snapshot();
            await mRP_Snapshot.Init(rc, mWidth, mHeight, mCamera, IntPtr.Zero);

            return(await InitWorld());
        }
Exemple #2
0
 public void FinalCleanup()
 {
     mRP_Snapshot.Cleanup();
     mRP_Snapshot = null;
     mCamera.Cleanup();
     mCamera = null;
 }
        public virtual async System.Threading.Tasks.Task <bool> InitGame(IntPtr WinHandle, UInt32 width, UInt32 height, EngineNS.GamePlay.GGameInstanceDesc desc, EngineNS.Graphics.CGfxCamera camera)
        {
            var rc = EngineNS.CEngine.Instance.RenderContext;

            if (camera == null)
            {
                camera = new EngineNS.Graphics.CGfxCamera();
                camera.Init(rc, false);
            }

            CEngine.Instance.TickManager.AddTickInfo(this);

            await BuildAutoMembers();

            WindowHandle = WinHandle;
            WindowWidth  = width;
            WindowHeight = height;
            mDesc        = desc;
            mWorld       = new GWorld();
            GameCamera   = camera;

            if (false == mWorld.Init())
            {
                return(false);
            }

            var scene = await LoadScene(rc, desc.SceneName, true);

            if (scene == null)
            {
                return(false);
            }

            mWorld.AddScene(desc.SceneName, scene);
            mWorld.SetDefaultScene(scene.SceneId);

            foreach (var i in AutoMembers)
            {
                await i.Key.OnGameInit(i.Value, width, height);
            }

            Vector3 Eye = new Vector3();

            Eye.SetValue(0.0f, 1.0f, -3.0f);
            Vector3 At = new Vector3();

            At.SetValue(0.0f, 1.0f, 0.0f);
            Vector3 Up = new Vector3();

            Up.SetValue(0.0f, 1.0f, 0.0f);
            camera.LookAtLH(Eye, At, Up);
            camera.PerspectiveFovLH(camera.mDefaultFoV, (float)width, (float)height, 0.1f, 1000.0f);

            var mRP_GameMobile = new EngineNS.Graphics.RenderPolicy.CGfxRP_GameMobile();
            await mRP_GameMobile.Init(rc, width, height, camera, WinHandle);

            this.SetGameRenderPolicy(mRP_GameMobile);

            return(true);
        }
Exemple #4
0
 public override void CommitVisual(CRenderContext rc, EngineNS.Graphics.CGfxCamera camera)
 {
     base.CommitVisual(rc, camera);
     if (mMeshComponent != null)
     {
         mMeshComponent?.CommitVisual(rc, camera);
     }
 }
Exemple #5
0
 public override void CommitVisual(CCommandList cmd, EngineNS.Graphics.CGfxCamera camera, GamePlay.SceneGraph.CheckVisibleParam param)
 {
     base.CommitVisual(cmd, camera, param);
     if (mMeshComponent != null)
     {
         mMeshComponent?.CommitVisual(cmd, camera, param);
     }
 }
 public void FinalCleanup()
 {
     CEngine.Instance.TickManager.RemoveTickInfo(this);
     if (mWorld != null)
     {
         mWorld.Cleanup();
         mWorld = null;
     }
     if (mRP_OffScreen != null)
     {
         mRP_OffScreen.Cleanup();
         mRP_OffScreen = null;
     }
     if (mCamera != null)
     {
         mCamera.Cleanup();
         mCamera = null;
     }
 }
Exemple #7
0
        public async System.Threading.Tasks.Task SaveToFile(string strFileName)
        {
            var rc = CEngine.Instance.RenderContext;

            EngineNS.Graphics.CGfxCamera Camera = new EngineNS.Graphics.CGfxCamera();
            Vector3 Eye = new Vector3();

            Eye.SetValue(0.0f, 3.0f, -6.0f);
            Vector3 At = new Vector3();

            At.SetValue(0.0f, 1.0f, 0.0f);
            Vector3 Up = new Vector3();

            Up.SetValue(0.0f, 1.0f, 0.0f);
            Camera.LookAtLH(Eye, At, Up);
            Camera.SetViewPort(rc, EditorViewPort);
            Camera.PerspectiveFovLH(MathHelper.V_PI / 4,
                                    (float)EditorViewPort.ViewPort.Width,
                                    (float)EditorViewPort.ViewPort.Height, 0.01f, 100.0f);

            CalculateCamera(Camera, 2.0);

            CMRTClearColor[] clrColors = new CMRTClearColor[]
            {
                new CMRTClearColor(0, 0xFF000000),
            };
            Camera.DisplayView.ClearMRT(clrColors, true, 1.0F, true, 0);

            Camera.DisplayView.ClearPasses(EngineNS.Graphics.EDrawChannel.DCN_Base);

            this.World?.Tick();
            this.World?.CheckVisible(rc, Camera);

            RPolicy.TickLogic(Camera.DisplayView);
            RPolicy.TickSync();
            RPolicy.TickRender(null);

            Camera.DisplayView.RenderTargets[0].Texture2D.Save2File(rc, strFileName, EIMAGE_FILE_FORMAT.PNG);
        }
Exemple #8
0
        public void CalculateCamera(EngineNS.Graphics.CGfxCamera Camera, double delta)
        {
            Vector3 vMax = Vector3.UnitXYZ * float.MinValue;
            Vector3 vMin = Vector3.UnitXYZ * float.MaxValue;

            foreach (var actor in mWorld.Actors)
            {
                Vector3     tempMax = Vector3.Zero, tempMin = Vector3.Zero;
                BoundingBox aabb = new BoundingBox();
                actor.Value.GetAABB(ref aabb);
                tempMin = aabb.Minimum;
                tempMax = aabb.Maximum;
                vMax.X  = System.Math.Max(vMax.X, tempMax.X);
                vMax.Y  = System.Math.Max(vMax.Y, tempMax.Y);
                vMax.Z  = System.Math.Max(vMax.Z, tempMax.Z);
                vMin.X  = System.Math.Min(vMin.X, tempMin.X);
                vMin.Y  = System.Math.Min(vMin.Y, tempMin.Y);
                vMin.Z  = System.Math.Min(vMin.Z, tempMin.Z);
            }

            MaxZoomMeshShow(0, 0, mWidth, mHeight, vMax, vMin, Camera, mWorld, delta);
        }
Exemple #9
0
        public void CalculateCamera(EngineNS.Graphics.CGfxCamera Camera, double delta)
        {
            if (FocusActor == null)
            {
                return;
            }
            Vector3     vMax = Vector3.UnitXYZ * float.MinValue;
            Vector3     vMin = Vector3.UnitXYZ * float.MaxValue;
            Vector3     tempMax = Vector3.Zero, tempMin = Vector3.Zero;
            BoundingBox aabb = new BoundingBox();

            FocusActor.GetAABB(ref aabb);
            tempMin = aabb.Minimum;
            tempMax = aabb.Maximum;
            vMax.X  = System.Math.Max(vMax.X, tempMax.X);
            vMax.Y  = System.Math.Max(vMax.Y, tempMax.Y);
            vMax.Z  = System.Math.Max(vMax.Z, tempMax.Z);
            vMin.X  = System.Math.Min(vMin.X, tempMin.X);
            vMin.Y  = System.Math.Min(vMin.Y, tempMin.Y);
            vMin.Z  = System.Math.Min(vMin.Z, tempMin.Z);

            FocusShow(0, 0, mWidth, mHeight, vMax, vMin, Camera, mWorld, delta);
        }
        public virtual async System.Threading.Tasks.Task <bool> InitEnviroment(UInt32 w, UInt32 h, string name)
        {
            mWidth  = w;
            mHeight = h;
            var rc = EngineNS.CEngine.Instance.RenderContext;

            mCamera = new EngineNS.Graphics.CGfxCamera();
            mCamera.Init(rc, false);

            Vector3 Eye = new Vector3();

            Eye.SetValue(0.0f, 0.0f, -3.0f);
            Vector3 At = new Vector3();

            At.SetValue(0.0f, 0.0f, 0.0f);
            Vector3 Up = new Vector3();

            Up.SetValue(0.0f, 1.0f, 0.0f);
            mCamera.LookAtLH(Eye, At, Up);

            mCamera.PerspectiveFovLH(mCamera.mDefaultFoV, (float)mWidth, (float)mHeight, 0.1f, 1000.0f);
            mCamera.BeforeFrame();
            mCamera.SwapBuffer(false);

            mRP_OffScreen           = new EngineNS.Graphics.RenderPolicy.CGfxRP_OffScreen();
            mRP_OffScreen.OnDrawUI += (CCommandList cmd, Graphics.View.CGfxScreenView view) =>
            {
                if (UIHost != null)
                {
                    UIHost.Draw(CEngine.Instance.RenderContext, cmd, view);
                }
            };
            await mRP_OffScreen.Init(rc, mWidth, mHeight, mCamera, IntPtr.Zero);

            return(await InitWorld(name));
        }
Exemple #11
0
        public static void CaptureWithPoint(EngineNS.Vector3 point,
                                            EngineNS.Matrix worldMatrix,
                                            EngineNS.Graphics.CGfxCamera camera,
                                            EngineNS.CRenderContext rc,
                                            EngineNS.Vector3 camDir,
                                            EngineNS.Vector3 camUp,
                                            UInt32 actorsCount,
                                            EngineNS.Graphics.RenderPolicy.CGfxRP_SceneCapture rp,
                                            UInt32 textureIdx,
                                            ref EngineNS.Support.CBlobObject dataBlob,
                                            ref EngineNS.Support.CBlobObject picBlob)
        {
            var lookat = point + camDir;

            lookat = EngineNS.Vector3.TransformCoordinate(lookat, worldMatrix);
            point  = EngineNS.Vector3.TransformCoordinate(point, worldMatrix);
            camUp  = EngineNS.Vector3.TransformNormal(camUp, worldMatrix);
            camera.LookAtLH(point, lookat, camUp);
            camera.BeforeFrame();

            //world.Tick();
            //world.SlowDrawAll(rc, camera);

            var maxId = actorsCount;

            rp.TickLogic(null, rc);
            camera.SwapBuffer(true);
            rp.TickRender(null);
            //camera.ClearAllRenderLayerData();

            // debug
#pragma warning disable 0162
            if (false)
            {
                var texRGB = rp.CaptureSV.FrameBuffer.GetSRV_RenderTarget(1);
                texRGB.Save2File(rc, "e:/testCapture.bmp", EngineNS.EIMAGE_FILE_FORMAT.BMP);
            }
#pragma warning restore 0162

            if (rp.UseCapture)
            {
                var blob = new EngineNS.Support.CBlobObject();
                blob.PushData(rp.TexData0.Data, rp.TexData0.Size);
                dataBlob = blob;
                if (rp.CaptureRGBData)
                {
                    blob = new EngineNS.Support.CBlobObject();
                    blob.PushData(rp.TexData1.Data, rp.TexData1.Size);
                    picBlob = blob;
                }
                //await EngineNS.CEngine.Instance.EventPoster.Post(() =>
                //{
                //    rp.CaptureSV.mFrameBuffer.GetSRV_RenderTarget(0).Save2File($"D:\\{camIdx}.png", (int)mWidth, (int)mHeight, (int)(mWidth * 4), rp.TexData0.ToBytes(), EngineNS.EIMAGE_FILE_FORMAT.PNG);
                //    rp.CaptureSV.mFrameBuffer.GetSRV_RenderTarget(1).Save2File($"D:\\{camIdx}_ref.png", (int)mWidth, (int)mHeight, (int)(mWidth * 4), rp.TexData1.ToBytes(), EngineNS.EIMAGE_FILE_FORMAT.PNG);

                //    return true;
                //}, EngineNS.Thread.Async.EAsyncTarget.AsyncEditor);
            }

            var cmd            = EngineNS.CEngine.Instance.RenderContext.ImmCommandList;
            var actirIdTexture = rp.GetActoridTexture();
            cmd.CSSetShaderResource(textureIdx, actirIdTexture);


            uint texSize = 512;
            cmd.CSDispatch(texSize / 8, texSize / 8, 1);
        }
Exemple #12
0
        public async System.Threading.Tasks.Task <bool> StartGame(Type gameInstanceType, IntPtr WinHandle, UInt32 width, UInt32 height, EngineNS.GamePlay.GGameInstanceDesc desc, EngineNS.Graphics.CGfxCamera camera, RName startScript)
        {
#if PWindow
            //Bricks.RemoteServices.RPCExecManager.Insance.SaveCode();
#endif
            McGame = CEngine.Instance.MacrossDataManager.NewObjectGetter <GamePlay.McGameInstance>(startScript);

            TickableNum = CEngine.Instance.TickManager.GetTickableNum();
            if (mGameInstance != null && mGameInstance.GameState != GamePlay.GGameInstance.enGameState.Stopped)
            {
                return(false);
            }

            var savedLogic  = CEngine.Instance.ThreadLogic.LimitTime;
            var savedRender = CEngine.Instance.ThreadRHI.LimitTime;
            CEngine.Instance.ThreadLogic.LimitTime = long.MaxValue;
            CEngine.Instance.ThreadRHI.LimitTime   = long.MaxValue;

            mGameInstance           = System.Activator.CreateInstance(gameInstanceType) as GamePlay.GGameInstance;
            mGameInstance.GameState = GamePlay.GGameInstance.enGameState.initializing;
            try
            {
                if (false == await mGameInstance.InitGame(WinHandle, width, height, desc, camera))
                {
                    CEngine.Instance.ThreadLogic.LimitTime = savedLogic;
                    CEngine.Instance.ThreadRHI.LimitTime   = savedRender;
                    return(false);
                }
            }
            catch (Exception ex)
            {
                Profiler.Log.WriteException(ex);
            }

            foreach (var i in AutoMembers)
            {
                await i.Key.OnGameStart(i.Value);
            }

            OnGameStarted();

            CEngine.Instance.ThreadLogic.LimitTime = savedLogic;
            CEngine.Instance.ThreadRHI.LimitTime   = savedRender;

            var smp = Thread.ASyncSemaphore.CreateSemaphore(1);
            EngineNS.CEngine.Instance.EventPoster.RunOn(async() =>
            {
                var mcGame = McGame.Get();
                if (mcGame != null)
                {
                    Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Macross", "Macross begin mcGame.OnGameStart");
                    try
                    {
                        await mcGame.OnGameStart(mGameInstance);
                    }
                    catch (Exception ex)
                    {
                        Profiler.Log.WriteException(ex);
                    }
                    Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Macross", "Macross end mcGame.OnGameStart");
                }

                smp.Release();
                return(true);
            }, Thread.Async.EAsyncTarget.Logic);

            await smp.Await();

            mGameInstance.GameState = GamePlay.GGameInstance.enGameState.Initialized;
            await mGameInstance.OnGameInited();

            return(true);
        }
Exemple #13
0
        public static void CaptureGeoBox(EngineNS.Bricks.HollowMaker.Agent.GeoBox geoBox,
                                         EngineNS.Bricks.HollowMaker.GeomScene.AgentBoxs agentData,
                                         EngineNS.Graphics.CGfxCamera camera,
                                         EngineNS.CRenderContext rc,
                                         UInt32 numElem,
                                         EngineNS.Graphics.RenderPolicy.CGfxRP_SceneCapture rp,
                                         EngineNS.CCommandList cmd,
                                         UInt32 cbIndex,
                                         EngineNS.CConstantBuffer cbuffer,
                                         EngineNS.CGpuBuffer buffer_visible,
                                         EngineNS.CShaderDesc csMain_visible,
                                         EngineNS.CComputeShader cs_visible,
                                         EngineNS.CUnorderedAccessView uav_visible,
                                         EngineNS.CGpuBuffer buffer_setBit,
                                         EngineNS.CShaderDesc csMain_setBit,
                                         EngineNS.CComputeShader cs_setBit,
                                         EngineNS.CUnorderedAccessView uav_setBit,
                                         EngineNS.CComputeShader cs_Clear,
                                         List <EngineNS.Support.BitSet> savedBitsets,
                                         UInt32 textureIdx,
                                         Action <int, EngineNS.Support.CBlobObject, EngineNS.Support.CBlobObject> actionAfterCapturePerDir)
        {
            var cornerPos = geoBox.Box.GetCorners();

            //for(int posIdx = 0; posIdx < cornerPos.Length; posIdx++)
            //{
            //    await CaptureSceneWithPoint(cornerPos[posIdx], world, camera, rc, camDirs, camUps, dataBlobs, picBlobs);
            //}
            cmd.SetComputeShader(cs_visible);
            UInt32[] pUAVInitialCounts = new UInt32[1] {
                1,
            };
            cmd.CSSetUnorderedAccessView(0, uav_visible, pUAVInitialCounts);

            //await CaptureSceneWithPoint(geoBox.Box.GetCenter(), agentData.Mat , camera, rc, camDirs, camUps, numElem/*, dataBlobs, picBlobs*/);
            for (int camIdx = 0; camIdx < 6; camIdx++)
            {
                EngineNS.Support.CBlobObject idBlob  = null;
                EngineNS.Support.CBlobObject picBlob = null;
                EditorCommon.PVSAssist.CaptureWithPoint(geoBox.Box.GetCenter(), agentData.Mat, camera, rc, camDirs[camIdx], camUps[camIdx], numElem, rp, textureIdx, ref idBlob, ref picBlob);

                actionAfterCapturePerDir?.Invoke(camIdx, idBlob, picBlob);
            }

            // gbuffer0
            var blob = new EngineNS.Support.CBlobObject();

            buffer_visible.GetBufferData(rc, blob);
            var idArray = blob.ToUInts();

            // fill uav1, clear uav0
            cmd.SetComputeShader(cs_setBit);
            UInt32[] pUAVInitialCounts1 = new UInt32[1] {
                1,
            };
            cmd.CSSetUnorderedAccessView(0, uav_visible, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(1, uav_setBit, pUAVInitialCounts);
            var cbDesc = new EngineNS.CConstantBufferDesc();

            if (csMain_setBit.GetCBufferDesc(cbIndex, ref cbDesc))
            {
                if (cbDesc.Type == EngineNS.ECBufferRhiType.SIT_CBUFFER)
                {
                    cmd.CSSetConstantBuffer(cbDesc.CSBindPoint, cbuffer);
                }
            }
            cmd.CSDispatch(numElem, 1, 1);

            var blob0 = new EngineNS.Support.CBlobObject();

            buffer_visible.GetBufferData(rc, blob0);
            var visArray = blob0.ToUInts();
            // gbuffer1
            var blob1 = new EngineNS.Support.CBlobObject();

            buffer_setBit.GetBufferData(rc, blob1);
            var idArray1 = blob1.ToBytes();

            var bitSet  = new EngineNS.Support.BitSet();
            var bitSet1 = new EngineNS.Support.BitSet();

            bitSet.Init(numElem * 2, idArray1);
            bitSet1.Init(numElem);
            for (UInt32 e = 0; e < numElem; e++)
            {
                var bit1 = bitSet.IsBit(e * 2 + 0);
                var bit2 = bitSet.IsBit(e * 2 + 1);

                bitSet1.SetBit(e, bit1 || bit2);
            }

            savedBitsets.Add(bitSet1);

            cmd.SetComputeShader(cs_Clear);
            cmd.CSSetUnorderedAccessView(0, uav_visible, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(1, uav_setBit, pUAVInitialCounts);
            cmd.CSDispatch(numElem / 16 + 1, 1, 1);
        }
        public virtual async System.Threading.Tasks.Task <bool> InitEnvWithScene(UInt32 w, UInt32 h,
                                                                                 [Editor.Editor_RNameType(Editor.Editor_RNameTypeAttribute.Scene)]
                                                                                 RName map, bool startDraw = true)
        {
            if (w == 0)
            {
                w = 128;
            }
            if (h == 0)
            {
                h = 128;
            }
            if (map == null)
            {
                map = RName.EmptyName;
            }
            mWidth  = w;
            mHeight = h;
            var rc = EngineNS.CEngine.Instance.RenderContext;

            mCamera = new EngineNS.Graphics.CGfxCamera();
            mCamera.Init(rc, false);

            mCamera.PerspectiveFovLH(mCamera.mDefaultFoV, (float)mWidth, (float)mHeight, 0.1f, 1000.0f);
            mCamera.BeforeFrame();
            //mCamera.SwapBuffer(false);

            Vector3 Eye = new Vector3();

            Eye.SetValue(0.0f, 50.0f, -30.0f);
            Vector3 At = new Vector3();

            At.SetValue(0.0f, 0.0f, 0.0f);
            Vector3 Up = new Vector3();

            Up.SetValue(0.0f, 1.0f, 0.0f);
            mCamera.LookAtLH(Eye, At, Up);

            mRP_OffScreen           = new EngineNS.Graphics.RenderPolicy.CGfxRP_OffScreen();
            mRP_OffScreen.OnDrawUI += (CCommandList cmd, Graphics.View.CGfxScreenView view) =>
            {
                if (UIHost != null)
                {
                    UIHost.Draw(CEngine.Instance.RenderContext, cmd, view);
                }
            };
            await mRP_OffScreen.Init(rc, mWidth, mHeight, mCamera, IntPtr.Zero);

            UIHost.Initializer.Id = 1;
            UIHost.WindowSize     = new SizeF(mWidth, mHeight);

            mWorld = new EngineNS.GamePlay.GWorld();

            if (false == mWorld.Init())
            {
                return(false);
            }

            mWorld.CheckVisibleParam.UsePVS = false;
            SceneGraph.GSceneGraph scene = null;
            IO.XndHolder           xnd   = await IO.XndHolder.LoadXND(map.Address + "/scene.map");

            if (xnd == null)
            {
                scene = await GamePlay.SceneGraph.GSceneGraph.CreateSceneGraph(this.World, typeof(GamePlay.SceneGraph.GSceneGraph), new SceneGraph.GSceneGraphDesc());

                mWorld.AddScene(map, scene);
            }
            else
            {
                var type = Rtti.RttiHelper.GetTypeFromSaveString(xnd.Node.GetName());
                if (type == null)
                {
                    return(false);
                }
                scene = await GamePlay.SceneGraph.GSceneGraph.CreateSceneGraph(this.World, type, null);

                if (false == await scene.LoadXnd(rc, xnd.Node, map))
                {
                    return(false);
                }

                if (scene != null)
                {
                    World.AddScene(map, scene);
                    mWorld.SetDefaultScene(scene.SceneId);

                    if (mWorld.DefaultScene.SunActor != null)
                    {
                        var sunComp = mWorld.DefaultScene?.SunActor.GetComponent <EngineNS.GamePlay.Component.GDirLightComponent>();
                        if (sunComp != null)
                        {
                            sunComp.View = mRP_OffScreen.BaseSceneView;
                        }
                    }
                    if (scene.McSceneGetter != null && scene.McSceneGetter.Get(false) != null)
                    {
                        await scene.McSceneGetter.Get(false).OnSceneLoaded(scene);

                        scene.McSceneGetter.Get(false).OnRegisterInput();
                    }
                }
            }

            if (startDraw)
            {
                this.Start();
            }

            return(true);
        }
Exemple #15
0
        public override async System.Threading.Tasks.Task <bool> InitGame(IntPtr WinHandle, UInt32 width, UInt32 height, EngineNS.GamePlay.GGameInstanceDesc desc, EngineNS.Graphics.CGfxCamera camera)
        {
#if PWindow
            EngineNS.Bricks.RemoteServices.RPCExecuter.Instance.SaveCode();
#elif PAndroid
            AccessGameRes.CheckAndCreateFirstAssetList();
#endif

            return(await base.InitGame(WinHandle, width, height, desc, camera));
        }
        /*EngineNS.Graphics.CGfxCamera mCamera;
         * async Task Test_Init()
         * {
         *  var rc = EngineNS.CEngine.Instance.RenderContext;
         *  mCamera = new EngineNS.Graphics.CGfxCamera();
         *  mCamera.Init(rc, false);
         *  mCamera.PerspectiveFovLH((float)(System.Math.PI * 0.6f), mWidth, mHeight);
         *  mSceneCaptureRP = new EngineNS.Graphics.RenderPolicy.CGfxRP_SceneCapture();
         *  await mSceneCaptureRP.Init(rc, mWidth, mHeight, mCamera, IntPtr.Zero);
         * }
         *
         * void Test_TickLogic(EditorCommon.ViewPort.ViewPortControl vp)
         * {
         * }
         * private void Test_TickRender(EditorCommon.ViewPort.ViewPortControl vp)
         * {
         *  if (mCamera == null)
         *      return;
         *  var rc = EngineNS.CEngine.Instance.RenderContext;
         *  EngineNS.Vector3[] camDirs = { EngineNS.Vector3.UnitX, -EngineNS.Vector3.UnitZ, -EngineNS.Vector3.UnitX, EngineNS.Vector3.UnitZ, EngineNS.Vector3.UnitY, -EngineNS.Vector3.UnitY };
         *  EngineNS.Vector3[] camUps = { EngineNS.Vector3.UnitY, EngineNS.Vector3.UnitY, EngineNS.Vector3.UnitY, EngineNS.Vector3.UnitY, EngineNS.Vector3.UnitZ, -EngineNS.Vector3.UnitZ };
         *  rc.BindCurrentSwapChain(vp.RPolicy.mSwapChain);
         *  for (int camIdx = 0; camIdx < 6; camIdx++)
         *  {
         *      var dir = camDirs[camIdx];
         *      var pos = new EngineNS.Vector3(0, 1, 0);
         *      var up = camUps[camIdx];
         *      var lookat = pos + dir;
         *      mCamera.LookAtLH(pos, lookat, up);
         *      mCamera.BeforeFrame();
         *
         *      vp.World.CheckVisible(rc, mCamera);
         *      vp.World.Tick();
         *
         *      mSceneCaptureRP.TickLogic(null, rc);
         *      mCamera.SwapBuffer(true);
         *
         *      mSceneCaptureRP.TickRender(null);
         *      mCamera.ClearAllRenderLayerData();
         *  }
         *  //rc.Present(0, 0);
         *
         * }
         * private void Test_TickSync(EditorCommon.ViewPort.ViewPortControl vp)
         * {
         *
         * }*/

        async Task BuildSceneCaptures(EngineNS.GamePlay.SceneGraph.GSceneGraph processScene, List <EngineNS.GamePlay.Actor.GActor> drawActors)
        {
            if (processScene.SceneFilename == EngineNS.RName.EmptyName)
            {
                EditorCommon.MessageBox.Show("没有找到当前场景的保存路径!");
                return;
            }
            var rc = EngineNS.CEngine.Instance.RenderContext;

            var camera = new EngineNS.Graphics.CGfxCamera();

            camera.Init(rc, false);
            camera.PerspectiveFovLH((float)(System.Math.PI * 0.6f), mWidth, mHeight);
            mSceneCaptureRP = new EngineNS.Graphics.RenderPolicy.CGfxRP_SceneCapture();
            await mSceneCaptureRP.Init(rc, mWidth, mHeight, camera, IntPtr.Zero);

            mSceneCaptureRP.CaptureRGBData = false;

            // Compute shader
            //////const string CSVersion = "cs_5_0";
            //////var macros = new EngineNS.CShaderDefinitions();
            //////var shaderFile = EngineNS.RName.GetRName("Shaders/Compute/extractID.compute").Address;
            //////var csMain0 = rc.CompileHLSLFromFile(shaderFile, "CSMain", CSVersion, macros);
            //////var csMain1 = rc.CompileHLSLFromFile(shaderFile, "CSMain1", CSVersion, macros);
            //////var cs = rc.CreateComputeShader(csMain0);
            //////var cs1 = rc.CreateComputeShader(csMain1);

            uint numElem = (UInt32)drawActors.Count;
            //// debug
            //numElem = 255 * 255 * 2;
            //////var bfDesc = new EngineNS.CGpuBufferDesc();
            //////bfDesc.ToDefault();
            //////bfDesc.ByteWidth = 4 * numElem;
            //////bfDesc.StructureByteStride = 4;
            //////var buffer = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero);
            //////var uavDesc = new EngineNS.CUnorderedAccessViewDesc();
            //////uavDesc.ToDefault();
            //////uavDesc.Buffer.NumElements = numElem;
            //////var uav = rc.CreateUnorderedAccessView(buffer, uavDesc);

            //////// 一个uint保存16个actorID的权重
            //////var numElemUAV1 = numElem / 16 + 1;
            //////bfDesc.ByteWidth = 4* numElemUAV1;
            //////bfDesc.StructureByteStride = 4;
            //////var buffer1 = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero);
            //////uavDesc.Buffer.NumElements = numElemUAV1;
            //////var uav1 = rc.CreateUnorderedAccessView(buffer1, uavDesc);

            //////var cbIndex = csMain1.FindCBufferDesc("CaptureEnv");
            //////EngineNS.CConstantBuffer cbuffer = null;
            //////if((int)cbIndex!=-1)
            //////{
            //////    cbuffer = rc.CreateConstantBuffer(csMain1, cbIndex);

            //////    var varIdx = cbuffer.FindVar("rateWeight");
            //////    cbuffer.SetValue(varIdx, new EngineNS.Quaternion(1, 1, 10000, 100000), 0);
            //////    cbuffer.FlushContent2(rc);
            //////}

            //////var texIdx = csMain0.FindSRVDesc("SrcTexture");

            var cmd = rc.ImmCommandList;

            UInt32 cbIndex;

            EngineNS.CConstantBuffer      cbuffer;
            EngineNS.CGpuBuffer           buffer_visible;
            EngineNS.CShaderDesc          csMain_visible;
            EngineNS.CComputeShader       cs_visible;
            EngineNS.CUnorderedAccessView uav_visible;
            EngineNS.CGpuBuffer           buffer_setBit;
            EngineNS.CShaderDesc          csMain_setBit;
            EngineNS.CComputeShader       cs_setBit;
            EngineNS.CUnorderedAccessView uav_setBit;
            EngineNS.CShaderDesc          csMain_Clear;
            EngineNS.CComputeShader       cs_clear;
            UInt32 textureIdx;

            EditorCommon.PVSAssist.ComputeShaderInit(numElem, out cbIndex, out cbuffer, out buffer_visible, out csMain_visible, out cs_visible, out uav_visible, out buffer_setBit,
                                                     out csMain_setBit, out cs_setBit, out uav_setBit,
                                                     out csMain_Clear, out cs_clear,
                                                     out textureIdx);

            var checkVisibleParam = new EngineNS.GamePlay.SceneGraph.CheckVisibleParam();

            foreach (var actor in drawActors)
            {
                actor.OnCheckVisible(rc.ImmCommandList, processScene, camera, checkVisibleParam);
            }
            //mSceneCaptureRP.TickLogic(null, rc);

            int VoxelMemSize = ((int)numElem / 8 + 1) + 4;

            // 读取geoScene
            var t1 = EngineNS.Support.Time.HighPrecision_GetTickCount();

            EngineNS.Profiler.Log.WriteLine(EngineNS.Profiler.ELogTag.Info, "Editor", "Begin Capture Scene VIS");
            var geoScene = await EngineNS.Bricks.HollowMaker.GeomScene.CreateGeomScene(processScene.SceneFilename.Address + "/geoscene.dat");

            EditorCommon.Controls.Debugger.PVSDebugger.GeoScene = geoScene;
            for (int j = 0; j < geoScene.AgentDatas.Count; j++)
            {
                var capDataDir = processScene.SceneFilename.Address + "/capturedata/" + j + "/";
                if (!EngineNS.CEngine.Instance.FileManager.DirectoryExists(capDataDir))
                {
                    EngineNS.CEngine.Instance.FileManager.CreateDirectory(capDataDir);
                }

                List <EngineNS.Support.BitSet> savedBitsets = new List <EngineNS.Support.BitSet>();
                var agentData = geoScene.AgentDatas[j];
                var memSize   = VoxelMemSize * agentData.AgentData.Count;
                for (int i = 0; i < agentData.AgentData.Count; i++)
                {
                    var geoBox = geoScene.AgentDatas[j].AgentData[i];
                    EditorCommon.PVSAssist.CaptureGeoBox(geoBox, agentData, camera, rc, numElem, mSceneCaptureRP, cmd, cbIndex, cbuffer, buffer_visible, csMain_visible, cs_visible, uav_visible, buffer_setBit, csMain_setBit, cs_setBit, uav_setBit, cs_clear, savedBitsets, textureIdx, null);
                }

                var saveXnd  = EngineNS.IO.XndHolder.NewXNDHolder();
                var voxelAtt = saveXnd.Node.AddAttrib("voxelData");
                voxelAtt.BeginWrite();
                voxelAtt.Write(agentData.BVSize);
                voxelAtt.Write(agentData.Mat);
                voxelAtt.Write(agentData.AgentData.Count);
                for (int i = 0; i < agentData.AgentData.Count; i++)
                {
                    var geoBox   = agentData.AgentData[i];
                    var pvsVoxel = new EngineNS.Bricks.HollowMaker.PVSVoxel();
                    pvsVoxel.Shape        = geoBox.Box;
                    pvsVoxel.X            = geoBox.X;
                    pvsVoxel.Y            = geoBox.Y;
                    pvsVoxel.Z            = geoBox.Z;
                    pvsVoxel.Bits         = savedBitsets[i];
                    pvsVoxel.LinkedVoxels = new List <int>(geoBox.Neighbors);

                    var str = pvsVoxel.Bits.ToBase64String();
                    pvsVoxel.BitsHash = (UInt32)(str.GetHashCode());

                    voxelAtt.WriteMetaObject(pvsVoxel);
                }
                voxelAtt.EndWrite();
                EngineNS.IO.XndHolder.SaveXND(capDataDir + "vis.data", saveXnd);

                System.GC.Collect();
            }


            var t2 = EngineNS.Support.Time.HighPrecision_GetTickCount();

            EngineNS.Profiler.Log.WriteLine(EngineNS.Profiler.ELogTag.Info, "Editor", $"End Capture Scene VIS,Time = {(t2-t1)/1000000}");

            mSceneCaptureRP.Cleanup();
        }
Exemple #17
0
        public static void MaxZoomMeshShow(float x, float y, float width, float height, Vector3 vMax, Vector3 vMin, EngineNS.Graphics.CGfxCamera Camera, EngineNS.GamePlay.GWorld world, double delta = 2.0)
        {
            List <Vector3> VecList = new List <Vector3>();

            if (vMax.X > 10000)
            {
                vMax.X = 10000;
            }
            if (vMax.Y > 10000)
            {
                vMax.Y = 10000;
            }
            if (vMax.Z > 10000)
            {
                vMax.Z = 10000;
            }
            if (vMin.X < -10000)
            {
                vMin.X = -10000;
            }
            if (vMin.Y < -10000)
            {
                vMin.Y = -10000;
            }
            if (vMin.Z < -10000)
            {
                vMin.Z = -10000;
            }

            VecList.Add(vMin);
            VecList.Add(new Vector3(vMax.X, vMin.Y, vMin.Z));
            VecList.Add(new Vector3(vMax.X, vMax.Y, vMin.Z));
            VecList.Add(new Vector3(vMin.X, vMax.Y, vMin.Z));
            VecList.Add(new Vector3(vMin.X, vMax.Y, vMax.Z));
            VecList.Add(new Vector3(vMin.X, vMin.Y, vMax.Z));
            VecList.Add(new Vector3(vMax.X, vMin.Y, vMax.Z));
            VecList.Add(vMax);

            var   vObjCenter  = (vMax - vMin) * 0.5f + vMin;
            float fMaxXLength = 0;
            float fMaxYLength = 0;

            foreach (var vec in VecList)
            {
                fMaxXLength = System.Math.Max(System.Math.Abs(Vector3.Dot(vec - vObjCenter, Camera.Right)), fMaxXLength);
                fMaxYLength = System.Math.Max(System.Math.Abs(Vector3.Dot(vec - vObjCenter, Camera.Right)), fMaxYLength);
            }

            Vector3 eyePos = Vector3.Zero;
            float   length = 0;

            if (Camera.IsPerspective)
            {
                float lengthX = (float)(fMaxXLength / System.Math.Tan(Camera.Fov * 0.5));
                float lengthY = (float)(fMaxYLength / System.Math.Tan(Camera.Fov * (width / height) * 0.5));

                length = (float)(System.Math.Max(lengthX, lengthY) * delta);
                eyePos = Camera.Direction * -(float)length + vObjCenter;
            }
            else
            {
                var lengthX = (float)(fMaxXLength * 2 * delta);
                var lengthY = lengthX * height / width;
                Camera.MakeOrtho(lengthX, lengthY, width, height);

                var deltaSize = vMax - vMin;
                length = System.Math.Max(System.Math.Max(deltaSize.X, deltaSize.Y), deltaSize.Z) + 50.0f;
                eyePos = Camera.Direction * -length + vObjCenter;
            }

            var dir = Camera.Direction;

            Camera.LookPosAndDir(eyePos, dir);
        }
Exemple #18
0
        public static void FocusShow(float x, float y, float width, float height, Vector3 vMax, Vector3 vMin, EngineNS.Graphics.CGfxCamera Camera, EngineNS.GamePlay.GWorld world, double delta = 1.0)
        {
            List <Vector3> VecList = new List <Vector3>();

            if (vMax.X > 10000)
            {
                vMax.X = 10000;
            }
            if (vMax.Y > 10000)
            {
                vMax.Y = 10000;
            }
            if (vMax.Z > 10000)
            {
                vMax.Z = 10000;
            }
            if (vMin.X < -10000)
            {
                vMin.X = -10000;
            }
            if (vMin.Y < -10000)
            {
                vMin.Y = -10000;
            }
            if (vMin.Z < -10000)
            {
                vMin.Z = -10000;
            }

            VecList.Add(vMin);
            VecList.Add(new Vector3(vMax.X, vMin.Y, vMin.Z));
            VecList.Add(new Vector3(vMax.X, vMax.Y, vMin.Z));
            VecList.Add(new Vector3(vMin.X, vMax.Y, vMin.Z));
            VecList.Add(new Vector3(vMin.X, vMax.Y, vMax.Z));
            VecList.Add(new Vector3(vMin.X, vMin.Y, vMax.Z));
            VecList.Add(new Vector3(vMax.X, vMin.Y, vMax.Z));
            VecList.Add(vMax);

            var vObjCenter = (vMax - vMin) * 0.5f + vMin;

            float radius = Vector3.Distance(ref vMax, ref vMin) / 2;

            Vector3 eyePos = new Vector3();

            if (Camera.IsPerspective)
            {
                float fovAngle = 0;
                if (Camera.Aspect > 1)
                {
                    fovAngle = Camera.FoV * 0.5f;
                }
                else
                {
                    fovAngle = (float)(Math.Atan(Math.Tan(Camera.FoV * 0.5) * Camera.Aspect));
                }
                float h = radius / (float)Math.Sin(fovAngle);
                eyePos = vObjCenter - Camera.CameraData.Direction * h;
            }
            else
            {
                System.Diagnostics.Debug.Assert(false);
            }

            var dir = Camera.CameraData.Direction;

            Camera.LookAtLH(eyePos, vObjCenter, Camera.CameraData.Up);
            //Camera.LookPosAndDir(eyePos, dir);
            Camera.BeforeFrame();
            Camera.SwapBuffer(true);
        }