Пример #1
0
        public RocketModel(IVertexCoder <Vertex> coder)
        {
            SimpleMesh mesh = new SimpleMesh();

            mesh.AddRange(Compose(new Triangle(
                                      new Vector3(0, 0, 1),
                                      new Vector3(1f / 3, -1f / 3, 1f / 3),
                                      new Vector3(1f / 3, 1f / 3, 1f / 3)
                                      )));
            mesh.AddRange(Compose(Mesh.Quad(
                                      new Vector3(1f / 3, -1f / 3, 1f / 3),
                                      new Vector3(1f / 3, -1f / 3, -1),
                                      new Vector3(1f / 3, 1f / 3, -1),
                                      new Vector3(1f / 3, 1f / 3, 1f / 3)
                                      )));
            mesh.AddRange(Compose(new Triangle(
                                      new Vector3(1f / 3, 0, -1f / 3),
                                      new Vector3(1f / 3, 0, -1f),
                                      new Vector3(2f / 3, 0, -1f)
                                      )));
            mesh.AddRange(Mesh.Quad(
                              new Vector3(1f / 3, -1f / 3, -1f),
                              new Vector3(-1f / 3, -1f / 3, -1f),
                              new Vector3(-1f / 3, 1f / 3, -1f),
                              new Vector3(1f / 3, 1f / 3, -1f)
                              ));
            _bfr = mesh.ToBuffer(coder);
        }
Пример #2
0
        public GuiLayer(Window w, GlProgram pgm, IVertexCoder <GuiVertex> coder, Font fnt)
        {
            _win   = w ?? throw new ArgumentNullException(nameof(w));
            _pgm   = pgm ?? throw new ArgumentNullException(nameof(pgm));
            _array = new VertexArray <GuiVertex>(coder, 4)
            {
                [0] = new GuiVertex(new Vector2(0, 0), new Vector2(0, 1)),
                [1] = new GuiVertex(new Vector2(1, 0), new Vector2(1, 1)),
                [2] = new GuiVertex(new Vector2(1, 1), new Vector2(1, 0)),
                [3] = new GuiVertex(new Vector2(0, 1), new Vector2(0, 0))
            };
            _indices = new IndexBuffer(6, _array)
            {
                [0] = 0,
                [1] = 1,
                [2] = 2,
                [3] = 0,
                [4] = 2,
                [5] = 3,
            };
            _font = fnt ?? throw new ArgumentNullException(nameof(fnt));

            _uColor = pgm.GetUniform("uColor");
            _uColor.EnsureType(new ShaderElementType(PrimitiveTypes.Float, 4));
            _uTexture = pgm.GetUniform("uTexture");
            _uTexture.EnsureType(new ShaderElementType(PrimitiveTypes.Sampler, 2));
            _uTextureEnabled = pgm.GetUniform("uTextureEnabled");
            _uTextureEnabled.EnsureType(new ShaderElementType(PrimitiveTypes.Bool, 1));
            _uTransform = pgm.GetUniform("uTransform");
            _uTransform.EnsureType(new ShaderElementType(PrimitiveTypes.Matrix, 4));
            _uScale = pgm.GetUniform("uScale");
            _uScale.EnsureType(new ShaderElementType(PrimitiveTypes.Float, 2));
        }
Пример #3
0
 public RectangleModel(IVertexCoder <Vertex> coder)
 {
     _vtx = new VertexArray <Vertex>(coder, 4)
     {
         [0] = new Vertex(new Vector3(-1, -1, 0), new Vector3(-1, -1, 0).Normalized()),
         [1] = new Vertex(new Vector3(-1, 1, 0), new Vector3(-1, 1, 0).Normalized()),
         [2] = new Vertex(new Vector3(1, 1, 0), new Vector3(1, 1, 0).Normalized()),
         [3] = new Vertex(new Vector3(1, -1, 0), new Vector3(1, -1, 0).Normalized())
     };
     _idx = new IndexBuffer(6, _vtx)
     {
         [0] = 0,
         [1] = 1,
         [2] = 2,
         [3] = 2,
         [4] = 3,
         [5] = 0
     };
 }
Пример #4
0
        public SphereModel(IVertexCoder <Vertex> coder, int bups)
        {
            List <Triangle> triangles = new List <Triangle> {
                new Triangle(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1))
            };

            for (int i = 0; i < bups; i++)
            {
                for (int j = triangles.Count - 1; j >= 0; j--)
                {
                    triangles.AddRange(triangles[j].BreakUp());
                    triangles.RemoveAt(j);
                }
            }

            int octant = triangles.Count;

            for (int i = 1; i <= 3; i++)
            {
                float sin = (float)Math.Sin(i * (float)Math.PI / 2);
                float cos = (float)Math.Cos(i * (float)Math.PI / 2);
                for (int j = octant - 1; j >= 0; j--)
                {
                    Triangle self = triangles[j];
                    Triangle rot  = self.RotateZ(sin, cos);
                    triangles.Add(rot);
                    if (i == 1)
                    {
                        triangles.Add(self.FlipZ());
                    }
                    triangles.Add(rot.FlipZ());
                }
            }

            SimpleMesh mesh = new SimpleMesh();

            mesh.AddRange(triangles.Select(i => new Engine.Geometry.Triangle(i.A, i.B, i.C)));
            _indices = mesh.ToBuffer(coder);
        }
Пример #5
0
		public IndexBuffer ToBuffer(IVertexCoder<T> coder) {
			List<T> vertices = new List<T>();
			List<Vector3> vecs = new List<Vector3>();
			List<uint> indices = new List<uint>();

			foreach (Triangle t in Triangles) {
				foreach (Vector3 v in t) {
					uint idx;
					if (vecs.Contains(v))
						idx = (uint) vecs.IndexOf(v);
					else {
						idx = (uint) vecs.Count;
						vecs.Add(v);
						vertices.Add(ToVertex(v, Triangles.Where(i => i.Contains(v)).Aggregate(Vector3.Zero, (current, i) => current + i.Normal).Normalized()));
					}

					indices.Add(idx);
				}
			}

			return new IndexBuffer(indices, new VertexArray<T>(coder, vertices));
		}
Пример #6
0
 public GuiFuelLayer(RocketObject rkt, Window w, GlProgram pgm, IVertexCoder <GuiVertex> coder, Font fnt) : base(w, pgm, coder, fnt)
 {
     _rkt     = rkt ?? throw new ArgumentNullException(nameof(rkt));
     _fuelPbr = new ProgressBar();
     Add(_fuelPbr);
 }