Esempio n. 1
0
        /// <summary>
        /// Creates a quad from screen coordinates.
        /// </summary>
        /// <param name="position">Position.</param>
        /// <param name="size">Size.</param>
        /// <param name="deviceNormalized">If set to <c>true</c> the position and size are already device normalized.</param>
        public void CreateQuad(Vector2 position, Vector2 size, bool deviceNormalized)
        {
            RVertexData2D[] vertices = new RVertexData2D[4];
            short[]         indices  = new short[6] {
                0, 1, 2, 0, 2, 3
            };
            if (!deviceNormalized)
            {
                // Kinda like a 2d unproject,  screen coords to device normal coords...
                RViewport viewport = REngine.Instance._viewport;
                Vector2   w        = new Vector2(viewport.Width, viewport.Height);
                Vector2   l        = size;
                Vector2   d        = (l / w);
                size.X = d.X;
                size.Y = d.Y;
                Vector2 p = (position / w);
                position.X = p.X;
                position.Y = p.Y;
            }

            vertices[0] = new RVertexData2D(new Vector2(position.X, position.Y), new Vector2(0, 0));
            vertices[1] = new RVertexData2D(new Vector2(position.X, position.Y + size.Y), new Vector2(0, 1));
            vertices[2] = new RVertexData2D(new Vector2(position.X + size.X, position.Y + size.Y), new Vector2(1, 1));
            vertices[3] = new RVertexData2D(new Vector2(position.X + size.X, position.Y), new Vector2(1, 0));

            VertexBuffer = new RVertexBuffer(vertices[0].Declaration, 4, RBufferUsage.WriteOnly);
            VertexBuffer.SetData <RVertexData2D>(vertices);

            _index = new RIndexBuffer(typeof(short), 6, RBufferUsage.WriteOnly);
            _index.SetData <short>(indices);
        }
Esempio n. 2
0
        public void CreateFullscreenQuad()
        {
            RViewport viewport = REngine.Instance._viewport;

            //CreateQuad(new Vector2(0, 0), new Vector2(1,1), true);
            CreateQuad(new Vector2(0, 0), new Vector2(viewport.Width, viewport.Height), true);
        }
Esempio n. 3
0
 public override void Init()
 {
     mainViewport = new RViewport(1920, 1080);
     // Initialization Code Here
     Engine.InitGameWindow((int)mainViewport.Width, (int)mainViewport.Height, RWindowStyle.Normal, "Red");
     Engine.SetClearColor(RColor.DarkGray);
     Engine.SetShowFPS(true);
 }
Esempio n. 4
0
        public virtual Ray MousePick(RViewport viewport, int x, int y)
        {
            Vector3 nearPoint = Unproject(viewport, x, y, 0.0f);

            Vector3 farPoint = Unproject(viewport, x, y, 1.0f);

            Vector3 direction = farPoint - nearPoint;

            direction.Normalize();

            return(new Ray(nearPoint, direction));
        }
Esempio n. 5
0
        public virtual Vector3 Project(RViewport viewport, Vector3 worldPoint)
        {
            Matrix  matrix = Matrix.Multiply(View, Projection);
            Vector3 vector = Vector3.Transform(worldPoint, matrix);
            float   a      = (((worldPoint.X * matrix.M14) + (worldPoint.Y * matrix.M24)) + (worldPoint.Z * matrix.M34)) + matrix.M44;

            if (!WithinEpsilon(a, 1f))
            {
                vector /= a;
            }
            vector.X = (((vector.X + 1f) * 0.5f) * viewport.Width) + viewport.X;
            vector.Y = (((-vector.Y + 1f) * 0.5f) * viewport.Height) + viewport.Y;
            vector.Z = (vector.Z * (Near - Far)) + Near;
            return(vector);
        }
Esempio n. 6
0
        public virtual Vector3 Unproject(RViewport viewport, int x, int y, float depth)
        {
            Vector4 screen = new Vector4((x - viewport.X) / viewport.Width, (y - viewport.Y) / viewport.Height, depth, 1.0f);

            screen.X = screen.X * 2.0f - 1.0f;
            screen.Y = screen.Y * 2.0f - 1.0f;
            screen.Z = screen.Z * 2.0f - 1.0f;

            var inverseViewProjection = Matrix.Invert(Matrix.Multiply(View, Projection));

            screen = inverseViewProjection * screen;

            if (screen.W != 0.0f)
            {
                screen.X /= screen.W;
                screen.Y /= screen.W;
                screen.Z /= screen.W;
            }
            return(new Vector3(screen.X, screen.Y, screen.Z));
        }