// 初始化 public async Task Init(EngineNS.CRenderContext rc) { await InitCanvasAnchorsHandles(rc); await InitTransformOperationAssist(rc); mInitialized = true; }
async Task InitTransformOperationAssist(EngineNS.CRenderContext rc) { for (int i = 0; i < (int)enTransformOPHandleType.Count; i++) { var imgInit = new EngineNS.UISystem.Controls.ImageInitializer(); imgInit.ImageBrush.ImageName = EngineNS.RName.GetRName("uieditor/uva_op_pin.uvanim", EngineNS.RName.enRNameType.Editor); imgInit.ImageBrush.TileMode = EngineNS.UISystem.Brush.enTileMode.None; var img = new EngineNS.UISystem.Controls.Image(); await img.Initialize(rc, imgInit); img.Visibility = EngineNS.UISystem.Visibility.Collapsed; var rect = new EngineNS.RectangleF(0, 0, 16, 16); var uvAnim = await EngineNS.CEngine.Instance.UVAnimManager.GetUVAnimAsync(rc, imgInit.ImageBrush.ImageName); if (uvAnim != null && uvAnim.Frames.Count > 0) { await uvAnim.WaitTextureValid(rc); var width = uvAnim.PixelWidth * uvAnim.Frames[0].SizeU; var height = uvAnim.PixelHeight * uvAnim.Frames[0].SizeV; rect = new EngineNS.RectangleF(0, 0, width, height); } mTransformHandles[i] = new TransformHandleData() { Show = img, SrcRect = rect, }; } }
public async Task SetObjectToEdit(EngineNS.CRenderContext rc, EditorCommon.Resources.ResourceEditorContext context) { await EngineNS.Thread.AsyncDummyClass.DummyFunc(); Macross_Client.CurrentResourceInfo = HostControl.CurrentResInfo; await Macross_Client.Load(); }
public void Draw(EngineNS.CRenderContext rc, EngineNS.CCommandList cmd, EngineNS.Graphics.View.CGfxScreenView view) { if (!mInitialized) { return; } foreach (var data in mTransformHandles) { data?.Show?.Draw(rc, cmd, view); } foreach (var data in mCanvasAnchorsHandles) { data?.Show?.Draw(rc, cmd, view); } }
async Task InitCanvasAnchorsHandles(EngineNS.CRenderContext rc) { string[] pinNames = new string[] { "uieditor/uva_op_center.uvanim", "uieditor/uva_op_topleft.uvanim", "uieditor/uva_op_topright.uvanim", "uieditor/uva_op_bottomright.uvanim", "uieditor/uva_op_bottomleft.uvanim", "uieditor/uva_op_left.uvanim", "uieditor/uva_op_top.uvanim", "uieditor/uva_op_right.uvanim", "uieditor/uva_op_bottom.uvanim" }; for (int i = 0; i < (int)enCanvasAnchors.Count; i++) { var imgInit = new EngineNS.UISystem.Controls.ImageInitializer(); imgInit.ImageBrush.ImageName = EngineNS.RName.GetRName(pinNames[i], EngineNS.RName.enRNameType.Editor); imgInit.ImageBrush.TileMode = EngineNS.UISystem.Brush.enTileMode.None; var img = new EngineNS.UISystem.Controls.Image(); await img.Initialize(rc, imgInit); img.Visibility = EngineNS.UISystem.Visibility.Collapsed; var rect = new EngineNS.RectangleF(0, 0, 16, 16); var uvAnim = await EngineNS.CEngine.Instance.UVAnimManager.GetUVAnimAsync(rc, imgInit.ImageBrush.ImageName); if (uvAnim != null && uvAnim.Frames.Count > 0) { await uvAnim.WaitTextureValid(rc); var width = uvAnim.PixelWidth * uvAnim.Frames[0].SizeU; var height = uvAnim.PixelHeight * uvAnim.Frames[0].SizeV; rect = new EngineNS.RectangleF(0, 0, width, height); } mCanvasAnchorsHandles[i] = new AnchorsHandleData() { Show = img, SrcRect = rect, }; } }
internal async Task AddPanelRectShow(EngineNS.CRenderContext rc, EngineNS.UISystem.UIElement uiCtrl) { var panel = uiCtrl as EngineNS.UISystem.Controls.Containers.Panel; if (panel != null) { var imgInit = new EngineNS.UISystem.Controls.ImageInitializer(); imgInit.ImageBrush.ImageName = EngineNS.RName.GetRName("uieditor/uvanim_dottedline.uvanim", EngineNS.RName.enRNameType.Editor); imgInit.ImageBrush.TileMode = EngineNS.UISystem.Brush.enTileMode.Both; imgInit.ImageBrush.Color = new EngineNS.Color4(0.8f, 1.0f, 1.0f, 1.0f); var show = new EngineNS.UISystem.Controls.Image(); await show.Initialize(rc, imgInit); mPanelRectsShow[panel] = show; if (uiCtrl == HostDesignPanel.CurrentUI || !(uiCtrl is EngineNS.UISystem.Controls.UserControl)) { foreach (var child in panel.ChildrenUIElements) { await AddPanelRectShow(rc, child); } } } }
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); }
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 async Task SetObjectToEditor(EngineNS.CRenderContext rc, EditorCommon.Resources.ResourceEditorContext context) { await Viewport.WaitInitComplated(); if (mWindowRectUIShow == null) { var imgInit = new EngineNS.UISystem.Controls.ImageInitializer(); imgInit.ImageBrush.ImageName = EngineNS.RName.GetRName("uieditor/uvanim_dottedline.uvanim", EngineNS.RName.enRNameType.Editor); imgInit.ImageBrush.TileMode = EngineNS.UISystem.Brush.enTileMode.Both; mWindowRectUIShow = new EngineNS.UISystem.Controls.Image(); await mWindowRectUIShow.Initialize(rc, imgInit); } if (mMousePointAtUIRectShow == null) { var imgInit = new EngineNS.UISystem.Controls.ImageInitializer(); imgInit.ImageBrush.ImageName = EngineNS.RName.GetRName("uieditor/uva_pointatrect.uvanim", EngineNS.RName.enRNameType.Editor); imgInit.ImageBrush.TileMode = EngineNS.UISystem.Brush.enTileMode.None; mMousePointAtUIRectShow = new EngineNS.UISystem.Controls.Image(); await mMousePointAtUIRectShow.Initialize(rc, imgInit); mMousePointAtUIRectShow.Visibility = EngineNS.UISystem.Visibility.Collapsed; } if (mGridlineImage2D == null) { mGridlineImage2D = await EngineNS.Graphics.Mesh.CGfxImage2D.CreateImage2D(rc, EngineNS.RName.GetRName("uieditor/mi_background_grid.instmtl", EngineNS.RName.enRNameType.Editor), 0, 0, 0, 1, 1); mGridlineImage2D.RenderMatrix = EngineNS.Matrix.Scaling(Viewport.GetViewPortWidth(), Viewport.GetViewPortHeight(), 1); } await InitPanelRectsShow(); var font = EngineNS.CEngine.Instance.FontManager.GetFont(EngineNS.CEngine.Instance.Desc.DefaultFont, 12, 1024, 128); if (mScaleFontMesh == null) { var mtl = await EngineNS.CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(rc, EngineNS.RName.GetRName("Material/font.instmtl")); mScaleFontMesh = new EngineNS.Bricks.FreeTypeFont.CFontMesh(); await mScaleFontMesh.SetMaterial(rc, mtl, "txDiffuse"); mScaleFontMesh.RenderMatrix = EngineNS.Matrix.Translate(20, 20, 0); //mScaleFontMesh.Offset = new EngineNS.Vector2(20, 20); //mScaleFontMesh.Scale = new EngineNS.Vector2(1, 1); } //var color = new EngineNS.FrameBufferClearColor(); //color.r = 0.1f; //color.g = 0.1f; //color.b = 0.1f; //color.a = 1.0f; //Viewport.RPolicy.SetClearColorRT(0, ref color); var smp = EngineNS.Thread.ASyncSemaphore.CreateSemaphore(1); Viewport.RPolicy.OnDrawUI += (cmd, view) => { var mtlmesh = mGridlineImage2D.Mesh.MtlMeshArray[0]; var pass = mGridlineImage2D.GetPass(); pass.ViewPort = view.Viewport; if (pass.RenderPipeline == null) { var rplDesc = new EngineNS.CRenderPipelineDesc(); pass.RenderPipeline = rc.CreateRenderPipeline(rplDesc); } pass.RenderPipeline.RasterizerState = mtlmesh.MtlInst.CustomRasterizerState; pass.RenderPipeline.DepthStencilState = mtlmesh.MtlInst.CustomDepthStencilState; pass.RenderPipeline.BlendState = mtlmesh.MtlInst.CustomBlendState; //pass.ShaderSamplerBinder = mtlmesh.GetSamplerBinder(rc, pass.Effect.ShaderProgram); pass.BindCBuffer(pass.Effect.ShaderProgram, pass.Effect.CacheData.CBID_View, view.ScreenViewCB); pass.ShadingEnv.BindResources(mGridlineImage2D.Mesh, pass); cmd.PushPass(pass); mWindowRectUIShow.Draw(rc, cmd, view); foreach (var rect in mPanelRectsShow.Values) { rect.Draw(rc, cmd, view); } HostDesignPanel.CurrentUI.Draw(rc, cmd, view); mMousePointAtUIRectShow.Draw(rc, cmd, view); foreach (var data in mSelectedUIDatas.Values) { data.ShowRect?.Draw(rc, cmd, view); } mSlotOperator?.Draw(rc, cmd, view); mScaleFontMesh.DrawText(rc, font, "缩放:" + mUIScale.ToString("F"), true); for (int i = 0; i < mScaleFontMesh.PassNum; i++) { var fontPass = mScaleFontMesh.GetPass(i); if (fontPass == null) { continue; } fontPass.ViewPort = view.Viewport; fontPass.BindCBuffer(fontPass.Effect.ShaderProgram, fontPass.Effect.CacheData.CBID_View, view.ScreenViewCB); fontPass.ShadingEnv.BindResources(mScaleFontMesh.Mesh, fontPass); cmd.PushPass(fontPass); } if (smp.IsValid) { smp.Release(); } }; await smp.Await(); HostDesignPanel.CurrentUI.SetDesignRect(ref mWindowDesignSize); ShowAll(); }