コード例 #1
0
        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();
        }
コード例 #2
0
        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);
        }