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);
        }
Beispiel #2
0
        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;
                }
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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>();
        }
Beispiel #6
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);
        }
        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);
        }