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(); }
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(); }
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(); }