public void BuildWalkables(EngineNS.Vector3 startpos, EngineNS.Vector3 pos, EngineNS.Vector3 scale, EngineNS.Quaternion rotation) { //HollowMakerAgent.BuildGeoBoxs(box.Minimum.X, box.Minimum.Y, box.Minimum.Z, // box.Maximum.X - box.Minimum.X, // box.Maximum.Y - box.Minimum.Y, // box.Maximum.Z - box.Minimum.Z); HollowMakerAgent.BuildGeoBoxs(pos, scale, rotation); //var iX = Math.Min((int)(((startpos.X - pos.X) + scale.X * 0.5f) / HollowMakerAgent.AgentGridSize), HollowMakerAgent.GeoBoxs.GetLength(0) - 1); //var iY = Math.Min((int)(((startpos.Y - pos.Y) + scale.Y * 0.5f) / HollowMakerAgent.AgentGridSize), HollowMakerAgent.GeoBoxs.GetLength(1) - 1); //var iZ = Math.Min((int)(((startpos.Z - pos.Z) + scale.Z * 0.5f) / HollowMakerAgent.AgentGridSize), HollowMakerAgent.GeoBoxs.GetLength(2) - 1); // startpos的位置是相对与volumn的,这里不能再减volumne的绝对位置,而且要保证startpos在volume里面 var iX = Math.Min((int)((startpos.X + scale.X * 0.5f) / HollowMakerAgent.AgentGridSize), HollowMakerAgent.GeoBoxs.GetLength(0) - 1); var iY = Math.Min((int)((startpos.Y + scale.Y * 0.5f) / HollowMakerAgent.AgentGridSize), HollowMakerAgent.GeoBoxs.GetLength(1) - 1); var iZ = Math.Min((int)((startpos.Z + scale.Z * 0.5f) / HollowMakerAgent.AgentGridSize), HollowMakerAgent.GeoBoxs.GetLength(2) - 1); //int maxDepth = 0; //HollowMakerAgent.BuildWalkables(VP1.World, HollowMakerAgent.GeoBoxs[iX, iY, iZ], 0, ref maxDepth); var stack = new Stack <EngineNS.Bricks.HollowMaker.Agent.GeoBox>(); stack.Push(HollowMakerAgent.GeoBoxs[iX, iY, iZ]); HollowMakerAgent.BuildWalkables2(VP1.World, stack); }
public static void OnZValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { VectorEditor control = d as VectorEditor; float newValue = (float)e.NewValue; float oldValue = (float)e.OldValue; if (control.VectorType == typeof(EngineNS.Vector3)) { if (System.Math.Abs(newValue - oldValue) > 0.0001f) { var vec = (EngineNS.Vector3)(control.VectorObject); var obj = new EngineNS.Vector3(); obj.X = vec.X; //control.XValue; obj.Y = vec.Y; //control.YValue; obj.Z = newValue; control.VectorObject = obj; } } else if (control.VectorType == typeof(EngineNS.Vector4)) { if (System.Math.Abs(newValue - oldValue) > 0.0001f) { var vec = (EngineNS.Vector4)(control.VectorObject); var obj = new EngineNS.Vector4(); obj.X = vec.X; //control.XValue; obj.Y = vec.Y; //control.YValue; obj.Z = newValue; obj.W = vec.W; //control.WValue; control.VectorObject = obj; } } }
public float GetScreenSizeInWorld(EngineNS.Vector3 worldPos, float screenSize) { if (mSceneView == null) { return(0); } var fov = FoV; if (fov == 0) { return(screenSize * (mCameraWidth / mSceneView.Viewport.Width) * 1000); } else { var dis = (CameraData.Position - worldPos).Length(); var worldFullScreenSize = (float)System.Math.Tan(fov * 0.5f) * dis * 2; return(worldFullScreenSize * screenSize); } }
public bool Init(CRenderContext rc, bool autoFlush) { mCamera = new CGfxCamera(); Camera.DebugName = "GCameraComponent"; if (!Camera.Init(rc, autoFlush)) { return(false); } PerspectiveFovLH(); var eye = new EngineNS.Vector3(); eye.SetValue(0.0f, 0.0f, -3.6f); var at = new EngineNS.Vector3(); at.SetValue(0.0f, 0.0f, 0.0f); var up = new EngineNS.Vector3(); up.SetValue(0.0f, 1.0f, 0.0f); Camera.LookAtLH(eye, at, up); return(true); }
public async System.Threading.Tasks.Task InitGraphLines() { LinesGen.Interval = 0.1f; LinesGen.Segement = 0.2f; GraphLines.LinesGen = LinesGen; EngineNS.Graphics.CGfxMaterialInstance mtl = await EngineNS.CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync( EngineNS.CEngine.Instance.RenderContext, EngineNS.RName.GetRName("editor/volume/mi_volume_octree.instmtl"));//rotator EngineNS.Vector3 p1 = Vector3.Lerp(CStartPos, CEndPos, 0.3f); p1.Y = p1.Y + 5.0f; EngineNS.Vector3 p2 = Vector3.Lerp(CStartPos, CEndPos, 0.7f); p2.Y = p1.Y; LinesGen.SetBezier3D(CStartPos, p1, p2, CEndPos, 100); var init = await GraphLines.Init(mtl, 0.0f); //GraphLines.GraphActor.Placement.Location = EngineNS.Vector3.Zero; mLineMeshComponent = GraphLines.GraphActor.GetComponent <GamePlay.Component.GMeshComponent>(); }
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); }
private async System.Threading.Tasks.Task <bool> TestSnapRender(CRenderContext rc) { var mCurMesh = await CEngine.Instance.MeshManager.CreateMeshAsync(rc, RName.GetRName("editor/basemesh/box.gms")); if (mCurMesh == null) { return(false); } mTestSnapshort = new Editor.GSnapshotCreator(); mTestSnapshort.SkyName = EngineNS.RName.GetRName("Mesh/sky.gms"); mTestSnapshort.FloorName = EngineNS.RName.GetRName(@"editor/floor.gms"); var eye = new EngineNS.Vector3(); eye.SetValue(1.6f, 1.5f, -3.6f); var at = new EngineNS.Vector3(); at.SetValue(0.0f, 0.0f, 0.0f); var up = new EngineNS.Vector3(); up.SetValue(0.0f, 1.0f, 0.0f); await mTestSnapshort.InitEnviroment(); mTestSnapshort.Camera.LookAtLH(eye, at, up); var actor = EngineNS.GamePlay.Actor.GActor.NewMeshActorDirect(mCurMesh); mCurMesh.PreUse(true);//就这个地方用,别的地方别乱用,效率不好 mTestSnapshort.World.AddActor(actor); mTestSnapshort.World.GetScene(RName.GetRName("SnapshorCreator")).AddActor(actor); mTestSnapshort.FocusActor = actor; actor.Placement.Location = new Vector3(0, 0, 0); OnFetchFinished = (InSrv) => { var blob = new EngineNS.Support.CBlobObject(); unsafe { void *pData; uint rowPitch; uint depthPitch; if (InSrv.Map(CEngine.Instance.RenderContext.ImmCommandList, 0, &pData, &rowPitch, &depthPitch)) { InSrv.BuildImageBlob(blob, pData, rowPitch); InSrv.Unmap(CEngine.Instance.RenderContext.ImmCommandList, 0); } } bool bSave = false; if (bSave) { var blbArray = new EngineNS.Support.CBlobObject[] { blob }; CShaderResourceView.SaveSnap(@"D:\OpenSource\titan3d\Content\editor\basemesh\box.gms.snap", blbArray); } }; mTestSnapshort.mRP_Snapshot.OnAfterTickLogic = (InView, InRc, InCmd, InArg) => { CTexture2D ReadableTex = null; InCmd.CreateReadableTexture2D(ref ReadableTex, mTestSnapshort.mRP_Snapshot.BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0), mTestSnapshort.mRP_Snapshot.BaseSceneView.FrameBuffer); EngineNS.CEngine.Instance.GpuFetchManager.RegFetchTexture2D(ReadableTex, OnFetchFinished); }; return(true); }
private void AddActorToNavModifierVolume(EngineNS.GamePlay.Actor.GActor actor) { if (RCTileMeshBuilder.InputGeom == null) { return; } var component = actor.GetComponent <EngineNS.Bricks.RecastRuntime.NavMeshBoundVolumeComponent>(); if (component == null) { return; } EngineNS.Support.CBlobObject blob = new EngineNS.Support.CBlobObject(); EngineNS.BoundingBox box = component.GetBox(); EngineNS.Vector3[] corners = box.GetCorners(); EngineNS.Vector3[] Points = new EngineNS.Vector3[8 * 3]; Points[0] = corners[0]; Points[1] = corners[1]; Points[2] = corners[0]; Points[3] = corners[4]; Points[4] = corners[0]; Points[5] = corners[3]; Points[6] = corners[1]; Points[7] = corners[5]; Points[8] = corners[1]; Points[9] = corners[2]; Points[10] = corners[2]; Points[11] = corners[3]; Points[12] = corners[2]; Points[13] = corners[6]; Points[14] = corners[3]; Points[15] = corners[7]; Points[16] = corners[4]; Points[17] = corners[5]; Points[18] = corners[4]; Points[19] = corners[7]; Points[20] = corners[5]; Points[21] = corners[6]; Points[22] = corners[6]; Points[23] = corners[7]; List <float> data = new List <float>(); for (int i = 0; i < 24; i++) { data.Add(Points[i].X); data.Add(Points[i].Y); data.Add(Points[i].Z); } float[] blobdata = data.ToArray(); unsafe { fixed(float *p = &blobdata[0]) { blob.PushData((IntPtr)p, (uint)(sizeof(float) * blobdata.Length)); } } RCTileMeshBuilder.InputGeom.CreateConvexVolumes(component.RCAreaType, blob, ref box.Minimum, ref box.Maximum); }