/// <summary> /// Nastavi uroven detailu /// </summary> public void InitDetails() { if (currentDetail == SceneManager.DetailLevel.UltraHigh) { currentFarDistance = Settings.Default.FarDistance * 1.2f; objectQuality = 1f; enableLights = true; } else if (currentDetail == SceneManager.DetailLevel.High) { currentFarDistance = Settings.Default.FarDistance * 1f; objectQuality = 0.6f; enableLights = true; } else if (currentDetail == SceneManager.DetailLevel.Medium) { currentFarDistance = Settings.Default.FarDistance * 0.8f; objectQuality = 0.3f; enableLights = true; } else if (currentDetail == SceneManager.DetailLevel.Low) { currentFarDistance = Settings.Default.FarDistance * 0.8f; objectQuality = 0.15f; enableLights = false; } Camera.GetCameraInstance().SetFarDistance(currentFarDistance); sceneManager.SetDetailLevel(currentDetail); sceneManager.SetAllObjectsQuality(objectQuality); sceneManager.EnableLights(enableLights); }
/// <summary> /// Metoda se postara o reinicializaci veci po resetu zarizeni /// </summary> public void DeviceReset() { Console.SetWindowXMargin(device.PresentationParameters.BackBufferWidth - 250); Console.SetDefaultWindowColor(Color.Red); Camera.SetCameraDevice(device); Camera.GetCameraInstance().SetFarDistance(currentFarDistance); Console.ConsoleSetDevice(device); if (occlusion != null) { occlusion.ReInit(); } #region Inicializace textur, atp. shadowMap.ReInit(); collisionMap.ReInit(); #endregion sceneManager.SetCamera(Camera.GetCameraInstance()); sceneManager.ReInitObjects(); cursorPosition = initializator.GetResolution() * 0.5f; if (hud != null) { hud.onResolutionChange(); } }
/// <summary> /// Nastavi, zda bude ci nebude videt hrac a vse s nim spojene /// </summary> /// <param name="enable">True - hrac bude videt, jinak false</param> public static void SetShowPlayer(bool enable) { showPlayer = enable; SceneManager sceneManager = GraphicCore.GetCurrentSceneManager(); if (enable) { Camera cam = Camera.GetCameraInstance(); Vector3 position = cam.GetVector3Position(); Vector3 dir = cam.GetVector3LookAt() - position; dir.Normalize(); Scene.SceneManager.SceneObject pl = sceneManager.GetObject("Hrac"); if (pl != null) { player = (Objects.Player)pl.generalObject; if ((Scene.SceneManager.DetailLevel)Properties.Settings.Default.DetailLevel == Scene.SceneManager.DetailLevel.Low) { player.SetModel(null); } } else { sceneManager.AddObject("Hrac", player, (Effect)null); } Vector3 playerPosition = position; playerPosition.Y -= HeightOfEye.Y; playerPosition -= HeightOfEye.Z * dir; player.SetPosition(playerPosition); SceneManager.SceneObject pochoden = sceneManager.GetObject("Hrac_Pochoden"); if (pochoden != null) { player.EquipItem(pochoden.generalObject); } } else { if (player != null) { player.SetMatrixWorld(originalPlayerWorld); sceneManager.DeleteObject("Hrac"); } } }
/// <summary> /// Konstruktor, spusti inicializaci D3D /// </summary> /// <param name="form">Objekt tridy Form, kam se ma vykreslovat</param> /// <param name="windowed">Je true, pokud aplikace bude spusteni v okenim rezimu, jinak bude spustena ve fullscreenu</param> public GraphicCore(Program form, bool windowed) { Logger.AddInfo("Graphic core init"); this.windowed = windowed; this.form = form; form.Size = this.WindowResolution; initializator = new Initializator(form); initializator.SetResolution(false, form.Size.Width, form.Size.Height); if (currentDetail == SceneManager.DetailLevel.High || currentDetail == SceneManager.DetailLevel.UltraHigh || Settings.Default.ForceVSync) { initializator.SetVSync(true); } initializator.ReInit(); device = initializator.GetDevice(); Microsoft.DirectX.Direct3D.AdapterDetails adapter = new Microsoft.DirectX.Direct3D.AdapterDetails(); Logger.AddInfo("Info: " + System.Environment.OSVersion.ToString() + "<br/> " + this.device.DisplayMode + "<br/>" + adapter.ToString()); sceneManager = new SceneManager(device, Camera.GetCameraInstance()); #region Nastaveni kvality shadow map int shadowMapDimension = Settings.Default.MediumShadowMapDimension; if (currentDetail == SceneManager.DetailLevel.Low) { shadowMapDimension = (int)(shadowMapDimension * 0.5f); } else if (currentDetail == SceneManager.DetailLevel.High) { shadowMapDimension *= 2; } #endregion shadowMap = new RenderToTexture(device, shadowMapDimension, shadowMapDimension, Format.R32F, true, DepthFormat.D24X8); collisionMap = new RenderToTexture(device, 128, 128, Format.A8R8G8B8, true, DepthFormat.D16); DeviceReset(); }
/// <summary> /// Presune hrace na startovani pozici (0,0,0) /// </summary> public static void MoveToStartPosition() { Vector3 pos = new Vector3(-3000, 0, -3000); pos += HeightOfEye; Camera cam = Camera.GetCameraInstance(); Vector3 dir = cam.GetVector3LookAt() - cam.GetVector3Position(); dir.Y = 0; RepairPositionInNonFreeLook(pos, ref pos); //if (freeLook) // pos += new Vector3(0, 1800, 0); cam.SetCameraPositionVector(pos); cam.SetCameraLookAtVector(pos + dir); }
/// <summary> /// Metoda se stara o rendering HUD, tzn. konzole, fonty, atp. /// </summary> /// <remarks>Metoda predpoklada, ze bude volana po testech, ktere provadi metoda Render, proto je doporucovano volat ji z metody Render</remarks> private void RenderHUD() { if (Console.ConsoleCanBeUsed() && Console.ConsoleIsShowed()) { Console.RenderConsole(); } if (Console.ConsoleCanBeUsed()) { Console.WindowWriteLine(String.Format("{0} fps", cfps.ToString()), 15); Vector3 pos = Camera.GetCameraInstance().GetVector3Position(); Console.WindowWriteLine(String.Format("Position: {0},{1},{2}", ((int)pos.X), ((int)pos.Y), ((int)pos.Z)), 35); //Vector2 pos2D = terrain.ConvertToTerrainPosition(pos); //Console.WindowWriteLine("Position 2D: " + pos2D.X + "," + pos2D.Y, 55); //Console.WindowWriteLine("Objects in World: " + sceneManager.GetAllObjectsCount(), 75); //Console.WindowWriteLine("Objects in Scene: " + sceneManager.GetVisibleObjectsCount(), 95); //Console.WindowWriteLine("Faces: " + sceneManager.GetRenderedFaceCount(), 115); if (this.form.Game != null) { List <WiccanRede.AI.NpcInfo> npcs = this.form.Game.GetAllNpcInfo(); WiccanRede.AI.NpcInfo playerInfo = npcs[npcs.Count - 1]; Console.WindowWriteLine(String.Format("Level: {0}", playerInfo.Character.level - 4), 50, 25); Console.WindowWriteLine(String.Format("Strength: {0}", playerInfo.Character.power), 50, 45); Console.WindowWriteLine(String.Format("Defence: {0}", playerInfo.Character.defense), 50, 65); } } hud.Render(); PointF cuPos = new PointF(cursorPosition.X - 16, cursorPosition.Y - 16); this.cursorSprite.Begin(SpriteFlags.AlphaBlend); this.cursorSprite.Draw2D(this.cursorTexture, Rectangle.Empty, Size.Empty, cuPos /*Input.GetInputInstance().MouseLocation*/, Color.White); this.cursorSprite.End(); }
public void Render() { device.VertexShader = null; device.PixelShader = null; Camera cam = Camera.GetCameraInstance(); device.Transform.View = cam.GetMatrixView(); device.Transform.Projection = cam.GetMatrixProjection(); sprite.Begin(SpriteFlags.AlphaBlend); sprite.Draw2D(empty, srcRectangle, size, liveEmpty, Color.FromArgb(255, 255, 255, 255)); sprite.Draw2D(live, liveRectangle, liveSize, livePoint, Color.FromArgb(255, 255, 255, 255)); sprite.Draw2D(empty, srcRectangle, size, manaEmpty, Color.FromArgb(255, 255, 255, 255)); sprite.Draw2D(mana, manaRectangle, manaSize, manaPoint, Color.FromArgb(255, 255, 255, 255)); sprite.Draw2D(empty, srcRectangle, size, energyEmpty, Color.FromArgb(255, 255, 255, 255)); sprite.Draw2D(energy, energyRectangle, energySize, energyPoint, Color.FromArgb(255, 255, 255, 255)); sprite.End(); RenderText(); //for (int t = 0; t < sentences.Count; t++) //{ // Matrix m = Matrix.Identity; // m *= Matrix.RotationX((float)Math.PI); // m *= Matrix.Translation(sentences[t].position) * Matrix.Translation(0, 40, 0); // sprite3d.SetWorldViewLH(m, device.Transform.View); // sprite3d.Begin(SpriteFlags.ObjectSpace | SpriteFlags.Billboard | SpriteFlags.AlphaBlend); // sprite3d.Draw2D(sentences[t].texture, new PointF(0,2), // (float)Math.PI, new PointF(-sentences[t].rect.Width / 2, -16), Color.FromArgb(255, 255, 255, 255)); // sprite3d.End(); //} device.Transform.Projection = cam.GetMatrixProjection(); sprite3d.Transform = Matrix.Identity; if (canRenderNpcInfo) { NpcInfo = form.Game.GetAllNpcInfo(); for (int i = 0; i < NpcInfo.Count; i++) { if (NpcInfo[i].Character.name == "Player") { setEnergy((int)NpcInfo[i].Status.energy); setLive((int)(100 * NpcInfo[i].Status.hp / (float)(NpcInfo[i].Character.hp))); setMana((int)(100 * NpcInfo[i].Status.mana / (float)(NpcInfo[i].Character.mana))); continue; } StringFormat stringFormat = new StringFormat(); stringFormat.FormatFlags = StringFormatFlags.NoClip; double percents = (1 - ((double)NpcInfo[i].Status.hp / (double)NpcInfo[i].Character.hp)) * 64; npcRectange.X = (int)percents; GeneralObject npcGeneral = getNpcGeneralObjectByName(NpcInfo[i].Character.name); Matrix world = npcGeneral.GetMatrixWorld(); Vector3 min = npcGeneral.GetBoundingBoxRelativeMinimum(); Vector3 max = npcGeneral.GetBoundingBoxRelativeMaximum(); min = Vector3.TransformCoordinate(min, npcGeneral.GetMatrixWorldBoundingBoxMesh()); max = Vector3.TransformCoordinate(max, npcGeneral.GetMatrixWorldBoundingBoxMesh()); Vector3 delta = max - min; world *= Matrix.Translation(0, delta.Y, 0); device.Transform.World = world; sprite3d.SetWorldViewLH(device.Transform.World, device.Transform.View); sprite3d.Begin(SpriteFlags.ObjectSpace | SpriteFlags.Billboard | SpriteFlags.AlphaBlend); sprite3d.Draw(empty2, npcScrRectange, center, new Vector3(0, 0, 0), Color.White); sprite3d.Draw(live2, npcRectange, center, new Vector3(0, 0, 0), Color.White); sprite3d.End(); Matrix current = Matrix.Identity; Matrix hh = cam.GetMatrixView(); Vector3 vect1 = new Vector3(world.M41 / world.M44, 0, world.M43 / world.M44); Vector3 vect2 = new Vector3(hh.M41 / hh.M44, 0, hh.M43 / hh.M44); Vector3 direction = vect2 - vect1; vect1.Normalize(); vect2.Normalize(); float vect3 = Vector3.Dot(vect1, vect2); double number = vect3; double angle = Math.Acos(number); if (direction.X > 0 && direction.Z > 0) { angle *= -1; } if (direction.X < 0 && direction.Z > 0) { angle *= -1; } current *= Matrix.Scaling(0.5f, 0.5f, 0.5f); current *= Matrix.RotationZ((float)Math.PI); current *= Matrix.RotationY((float)angle); current.M41 = world.M41; current.M42 = world.M42; current.M43 = world.M43; current.M44 = world.M44; current *= Matrix.Translation(0, 15f, 0); sprite3d.SetWorldViewLH(current, device.Transform.View); device.Transform.World = current; sprite3d.Begin(SpriteFlags.ObjectSpace | SpriteFlags.AlphaBlend); Rectangle textRect = f.MeasureString(s, NpcInfo[i].Character.name, DrawTextFormat.Left, Color.DarkRed); textRect.X -= (int)((float)textRect.Width * 0.5f); Color textColor = Color.DarkRed; if (NpcInfo[i].Character.type == WiccanRede.AI.NPCType.villager) { textColor = Color.DarkGreen; } f.DrawText(sprite3d, NpcInfo[i].Character.name, textRect, DrawTextFormat.Left, textColor); sprite3d.End(); } } }
/// <summary> /// Necha hrace rozhlizet se /// </summary> /// <param name="x">Vychyleni v horizontalnim smeru</param> /// <param name="y">Vychyleni ve vertikalnim smeru</param> public static void LookAround(float x, float y) { Camera cam = Camera.GetCameraInstance(); Vector3 lookat = cam.GetVector3LookAt(); Vector3 position = cam.GetVector3Position(); Vector3 dir = lookat - position; dir.Normalize(); Vector3 ndir = Vector3.Cross(dir, cam.GetVector3Up()); ndir.Normalize(); Vector3 undir = Vector3.Cross(dir, ndir); undir.Normalize(); float invert = 1; if (invertedmouse) { invert *= -1; } Vector3 dx = -(Sensitivity / 2000f) * x * ndir; Vector3 dy = invert * (Sensitivity / 2000f) * y * undir; Vector3 newLookAt = lookat; newLookAt = newLookAt + dx; newLookAt = newLookAt + dy; Vector3 newdir = newLookAt - position; newdir.Normalize(); lookat = position + newdir; if (newdir.Y > -0.9999f && newdir.Y < 0.9999f) { cam.SetCameraLookAtVector(lookat); } if (player == null) { return; } newdir = cam.GetVector3LookAt() - cam.GetVector3Position(); newdir.Y = 0; newdir.Normalize(); Vector3 positionPlayer = cam.GetVector3Position(); positionPlayer.Y -= HeightOfEye.Y; positionPlayer -= HeightOfEye.Z * newdir; player.SetPosition(positionPlayer); player.SetDirection(newdir); }
/// <summary> /// Pohne s hracem o jeden krok ve smeru zadaneho uhlu /// </summary> /// <param name="angle">Uhel v radianech urcujici smer pohybu</param> public static void MoveByAngle(float angle) { Camera cam = Camera.GetCameraInstance(); Vector3 lookat = cam.GetVector3LookAt(); Vector3 position = cam.GetVector3Position(); Matrix rotation = Matrix.RotationY(angle); Vector3 dir = lookat - position; if (freeLook) { dir.Normalize(); dir.TransformCoordinate(rotation); dir.Normalize(); if (Math.Abs(angle - Math.PI) < 0.5) { dir.Y = -dir.Y; } else if (Math.Abs(angle - Math.PI / 2f) < 0.5 || Math.Abs(angle - Math.PI / 2f + Math.PI) < 0.5) { dir.Y = 0; } Vector3 newposition = position + (Speed * time) * dir; Vector3 newlookAt = lookat + (Speed * time) * dir; cam.SetCameraLookAtVector(newlookAt); cam.SetCameraPositionVector(newposition); return; } dir.Y = 0; dir.Normalize(); dir.TransformCoordinate(rotation); dir.Normalize(); Vector3 newPosition = position + (Speed * time) * dir; RepairPositionInNonFreeLook(position, ref newPosition); if (position == newPosition) { return; } Vector3 newLookAt = lookat + newPosition - position; cam.SetCameraLookAtVector(newLookAt); cam.SetCameraPositionVector(newPosition); if (player == null) { return; } dir = newLookAt - newPosition; dir.Y = 0; dir.Normalize(); Vector3 playerPosition = newPosition; playerPosition.Y -= HeightOfEye.Y; playerPosition -= HeightOfEye.Z * dir; player.SetPosition(playerPosition); }