예제 #1
0
        public static void Init()
        {
            sceneShaped = false;
            GL1.GenVertexArray(1, out VAOId);
            GL1.BindVertexArray(VAOId);

            GL1.GenBuffer(1, ref VBOId);

            GL1.GenBuffer(1, ref VBOId2);

            GL1.BindBuffer(0x8892, VBOId);

            ShaderProgram = new ShaderProgram("shaders\\vertex.glsl", "shaders\\fragment.glsl");
            ShaderProgram.Use();
            matrixLocation = GL1.GetUniformLocation(ShaderProgram.ProgramID, "MVP");

            GL1.ClearColor(0.5f, 0, 1, 0);

            GL1.Clear(0x00000100 | 0x00004000);
        }
예제 #2
0
        public static void DrawWorld(World w, Rectangle view, params Unit[] u)
        {
            GL1.DrawBuffer(0x0405);
            GL1.Clear(0x00000100 | 0x00004000);

            var mat = Matrix4.CreateOrthographicOffCenter((float)view.Left, (float)view.Right, (float)view.Bottom,
                                                          (float)view.Top, -1, 1);

            GL1.UniformMatrix4(matrixLocation, 1, false, ref mat);
            if (!sceneShaped)
            {
                _poses  = new Vector3[w.Field.Height * w.Field.Height * 2 * 3];
                _colors = new Vector3[w.Field.Height * w.Field.Height * 2 * 3];
            }
            var visionmap = new bool[w.Field.Width, w.Field.Height];

            foreach (var unit in u)
            {
                var tmp = w.Vision.VisionField(unit);
                for (var i = 0; i < w.Field.Width; i++)
                {
                    for (var j = 0; j < w.Field.Height; j++)
                    {
                        visionmap[i, j] = visionmap[i, j] || tmp[i, j];
                    }
                }
            }
            if (!sceneShaped)
            {
                for (var i = 0; i < w.Field.Width; i++)
                {
                    for (var j = 0; j < w.Field.Height; j++)
                    {
                        ShapeTile(i, j, w.Field[i, j].Passable);
                    }
                }
                DrawArray(_poses, _colors, PrimitiveType.Triangles);
                sceneShaped = true;
            }

            var cVisible = new Vector3(0, 0, 1);
            var cDefault = new Vector3(1, 1, 1);
            var cPlayer  = new Vector3(0, 1, 0);
            var cEnemy   = new Vector3(1, 0, 0);

            Parallel.For(0, w.Field.Width, i =>
            {
                for (var j = 0; j < w.Field.Height; j++)
                {
                    if (visionmap[i, j])
                    {
                        if (w.Field[i, j].Unit != null)
                        {
                            UpdateTile(6 * (i * w.Field.Height + j), w.Field[i, j].Passable, ref cEnemy, ref cVisible);
                        }
                        else
                        {
                            UpdateTile(6 * (i * w.Field.Height + j), w.Field[i, j].Passable, ref cDefault, ref cVisible);
                        }
                    }
                    else
                    {
                        UpdateTile(6 * (i * w.Field.Height + j), w.Field[i, j].Passable, ref cDefault, ref cDefault);
                    }
                }
            });
            foreach (var unit in u)
            {
                UpdateTile(6 * (unit.Position.X * w.Field.Height + unit.Position.Y), true, ref cPlayer, ref cVisible);
            }
            DrawArray(null, _colors, PrimitiveType.Triangles);
        }