예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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();
            }
        }
예제 #3
0
        /// <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");
                }
            }
        }
예제 #4
0
        /// <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();
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        /// <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();
        }
예제 #7
0
        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();
                }
            }
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
        /// <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);
        }