示例#1
0
        public void InitDungeon(R_Landblock landblock, Model.BoundingBox box)
        {
            var size = box.Size;

            var center = box.Center;

            // draw a view plane from NW to SE
            var p1 = new Vector3(box.Mins.X, box.Maxs.Y, center.Z);
            var p2 = new Vector3(box.Maxs.X, box.Mins.Y, center.Z);

            var length = Vector3.Distance(p1, p2);

            var unit_length = (float)Math.Sqrt(length * length / 2);

            var dist_scalar = 0.75f;

            unit_length *= dist_scalar;

            // move camera out in -x, -y by this distance
            var position = center;

            position.X -= unit_length;
            position.Y -= unit_length;
            position.Z += unit_length;

            Position = position;

            Dir = Vector3.Normalize(box.Center - Position);

            Up    = Vector3.UnitZ;
            Speed = World_Speed;

            CreateLookAt();
        }
示例#2
0
        public void InitModel(Model.BoundingBox box)
        {
            //var box = setup.BoundingBox;
            var size = box.Size;

            if (float.IsInfinity(size.X))
            {
                InitParticle();
                return;
            }

            var facing = box.GetTargetFace();
            var face   = box.Faces[(int)facing];
            var center = face.Center;

            //Console.WriteLine("TargetFace: " + facing);

            var largest = Math.Max(face.Width, face.Height);

            largest = Math.Max(largest, 1.2f);

            var position = new Vector3(center.X, center.Y, center.Z);

            var factor = 1.414f;
            //var factor = 1.2f;

            //Console.WriteLine($"Width: {face.Width}, Height: {face.Height}");

            var gfxObjMode = ModelViewer.Instance.GfxObjMode;

            if (facing == Facing.Front || facing == Facing.Back)
            {
                if (gfxObjMode)
                {
                    position.Y -= largest * factor;
                }
                else
                {
                    position.Y += largest * factor;
                }

                //position.Z *= factor;

                Up = Vector3.UnitZ;
            }
            else if (facing == Facing.Left || facing == Facing.Right)
            {
                if (gfxObjMode)
                {
                    position.X -= largest * factor;
                }
                else
                {
                    position.X += largest * factor;
                }

                Up = Vector3.UnitZ;
            }
            else if (facing == Facing.Top)
            {
                var front = box.Faces[(int)Facing.Front];
                var left  = box.Faces[(int)Facing.Left];

                //Console.WriteLine("Front area: " + front.Area);
                //Console.WriteLine("Left area: " + left.Area);
                //Console.WriteLine("Top area: " + face.Area);

                position.Z += largest * factor;

                Up = -Vector3.UnitY;
            }

            Position = position;

            //Console.WriteLine("Camera pos: " + Position);

            var lookAt = box.Center;

            //lookAt.Z += size.Z * 0.1f;

            Dir = Vector3.Normalize(lookAt - Position);

            Speed = Model_Speed;

            CreateLookAt();
        }
示例#3
0
        public void LoadLandblock(uint landblockID, uint radius = 1)
        {
            if (PlayerMode)
            {
                ExitPlayerMode();
                InitPlayerMode = true;
            }

            Render.Buffer.ClearBuffer();
            Server.Init();
            TextureCache.Init();

            LScape.unload_landblocks_all();

            var landblock = LScape.get_landblock(landblockID);

            if (landblock.HasDungeon)
            {
                radius = 0;
            }

            DungeonMode = landblock.HasDungeon;

            var center_lbx = landblockID >> 24;
            var center_lby = landblockID >> 16 & 0xFF;

            //Landblocks = new Dictionary<uint, R_Landblock>();
            R_Landblock r_landblock = null;
            R_Landblock centerBlock = null;

            for (var lbx = (int)(center_lbx - radius); lbx <= center_lbx + radius; lbx++)
            {
                if (lbx < 0 || lbx > 254)
                {
                    continue;
                }

                for (var lby = (int)(center_lby - radius); lby <= center_lby + radius; lby++)
                {
                    if (lby < 0 || lby > 254)
                    {
                        continue;
                    }

                    var lbid = (uint)(lbx << 24 | lby << 16 | 0xFFFF);

                    var timer = Stopwatch.StartNew();
                    landblock = LScape.get_landblock(lbid);
                    timer.Stop();

                    r_landblock = new R_Landblock(landblock);
                    //LScape.unload_landblock(lbid);

                    if (landblockID == lbid)
                    {
                        centerBlock = r_landblock;
                    }

                    MainWindow.Status.WriteLine($"Loaded {lbid:X8} in {timer.Elapsed.TotalMilliseconds}ms");

                    //Landblocks.Add(lbid, new R_Landblock(landblock));
                }
            }

            Render.Buffer.BuildBuffers();
            Render.InitEmitters();

            if (FileExplorer.Instance.TeleportMode)
            {
                var zBump = DungeonMode ? 1.775f : 2.775f;

                if (InitPlayerMode)
                {
                    zBump = 0.0f;
                }

                Camera.InitTeleport(centerBlock, zBump);
                FileExplorer.Instance.TeleportMode = false;
            }
            else if (DungeonMode)
            {
                BoundingBox = new Model.BoundingBox(Render.Buffer.RB_EnvCell);
                Camera.InitDungeon(r_landblock, BoundingBox);
            }
            else
            {
                Camera.InitLandblock(r_landblock);
            }

            SingleBlock = landblock.ID;

            FreeResources();

            Server.OnLoadWorld();
        }