private async System.Threading.Tasks.Task BuildNavtion() { var meshList = new List <EngineNS.Graphics.Mesh.CGfxMeshPrimitives>(); var matrixList = new List <EngineNS.Matrix>(); List <EngineNS.Bricks.PhysicsCore.CPhyShape> physhapes = new List <EngineNS.Bricks.PhysicsCore.CPhyShape>(); using (var i = VP1.World.DefaultScene.Actors.GetEnumerator()) { while (i.MoveNext()) { EngineNS.GamePlay.Actor.GActor actor = i.Current.Value; //if ((actor.mComponentFlags & EngineNS.GamePlay.Actor.GActor.EComponentFlags.HasPhysics) EngineNS.Bricks.PhysicsCore.GPhysicsComponent component = actor.GetComponentRecursion <EngineNS.Bricks.PhysicsCore.GPhysicsComponent>(); EngineNS.Bricks.PhysicsCore.CollisionComponent.GPhysicsCollisionComponent component2 = actor.GetComponentRecursion <EngineNS.Bricks.PhysicsCore.CollisionComponent.GPhysicsCollisionComponent>(); if ((component != null && component.PhyActor != null && component.IsEnableNavgation) || (component2 != null && component2.IsEnableNavgation)) { //foreach (EngineNS.Bricks.PhysicsCore.CPhyShape shape in component.PhyActor.Shapes) //{ // if (shape.DebugActor == null) // { // shape.OnEditorCommitVisual(EngineNS.CEngine.Instance.RenderContext, VP1.Camera, actor); // } // if (shape.DebugActor != null) // { // EngineNS.GamePlay.Component.GMeshComponent meshcomponent = shape.DebugActor.GetComponent<EngineNS.GamePlay.Component.GMeshComponent>(); // meshList.Add(meshcomponent.SceneMesh.MeshPrimitives); // matrixList.Add(actor.Placement.WorldMatrix); // } //} //if (component.PhyActor != null && component.PhyActor.Shapes != null) //{ //foreach (var shape in component.PhyActor.Shapes) //{ // if (shape.AreaType > 1 && shape.AreaType < 16) // { // physhapes.Add(shape); // if (shape.DebugActor == null) // { // shape.OnEditorCommitVisual(EngineNS.CEngine.Instance.RenderContext, VP1.Camera, actor); // } // } //} //} EngineNS.GamePlay.Component.GMeshComponent meshcomponent = actor.GetComponent <EngineNS.GamePlay.Component.GMeshComponent>(); if (meshcomponent != null) { meshList.Add(meshcomponent.SceneMesh.MeshPrimitives); matrixList.Add(actor.Placement.WorldMatrix); } } } } //判断为空就不做任何操作了 if (meshList.Count == 0) { return; } EngineNS.BoundingBox aabb = new EngineNS.BoundingBox(); var mesh = EngineNS.CGeometryMesh.MergeGeoms(EngineNS.CEngine.Instance.RenderContext, meshList, matrixList, ref aabb); var geom = new EngineNS.Bricks.RecastBuilder.RCInputGeom(); geom.LoadMesh(EngineNS.CEngine.Instance.RenderContext, mesh, 1); //处理动态区域 foreach (var shape in physhapes) { //EngineNS.BoundingBox aabb = new EngineNS.BoundingBox(); //await shape.AwaitLoadDebugActor(); //shape.DebugActor.GetAABB(ref aabb); //EngineNS.Vector3[] vpoints = aabb.GetCorners(); //float[] points = new float[vpoints.Length * 3]; //for (int i = 0; i < vpoints.Length; i++) //{ // points[i * 3] = vpoints[i].X; // points[i * 3 + 1] = vpoints[i].Y; // points[i * 3 + 2] = vpoints[i].Z; //} //EngineNS.Support.CBlobObject blob = new EngineNS.Support.CBlobObject(); //unsafe //{ // fixed (float* p = &points[0]) // { // IntPtr ptr = (IntPtr)p; // blob.PushData(ptr, (uint)(sizeof(float) * points.Length)); // } //} //geom.CreateConvexVolumes(shape.AreaType, blob); } RCTileMeshBuilder.InputGeom = geom; //单独放这里处理一次 不能放在BuildNavMesh foreach (var weak in NavMeshBoundVolumes) { EngineNS.GamePlay.Actor.GActor actor; if (weak.TryGetTarget(out actor)) { AddActorToNavModifierVolume(actor); } } foreach (var weak in NavModifierVolumes) { EngineNS.GamePlay.Actor.GActor actor; if (weak.TryGetTarget(out actor)) { AddActorToNavModifierVolume(actor); } } await BuildNavMesh(); }
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); }