示例#1
0
        public idTraceModel()
        {
            _type   = TraceModelType.Invalid;
            _bounds = idBounds.Zero;

            _edges    = new TraceModelEdge[0];
            _polygons = new TraceModelPolygon[0];
            _vertices = new Vector3[0];
        }
示例#2
0
        private void InitBox()
        {
            _type     = TraceModelType.Box;
            _vertices = new Vector3[8];
            _edges    = new TraceModelEdge[13];
            _polygons = new TraceModelPolygon[6];

            // set box edges
            for (int i = 0; i < 4; i++)
            {
                _edges[i + 1].V = new int[] { i, (i + 1) & 3 };
                _edges[i + 5].V = new int[] { 4 + i, 4 + ((i + 1) & 3) };
                _edges[i + 9].V = new int[] { i, 4 + i };
            }

            // all edges of a polygon go counter clockwise
            _polygons[0].Normal = new Vector3(0, 0, -1);
            _polygons[0].Edges  = new int[] {
                -4, -3, -2, -1
            };

            _polygons[1].Normal = new Vector3(0, 0, 1);
            _polygons[1].Edges  = new int[] {
                5, 6, 7, 8
            };

            _polygons[2].Normal = new Vector3(0, -1, 0);
            _polygons[2].Edges  = new int[] {
                1, 10, -5, -9
            };

            _polygons[3].Normal = new Vector3(1, 0, 0);
            _polygons[3].Edges  = new int[] {
                2, 11, -6, -10
            };

            _polygons[4].Normal = new Vector3(0, 1, 0);
            _polygons[4].Edges  = new int[] {
                3, 12, -7, -11
            };

            _polygons[5].Normal = new Vector3(-1, 0, 0);
            _polygons[5].Edges  = new int[] {
                4, 9, -8, -12
            };

            // convex model
            _isConvex = true;

            GenerateEdgeNormals();
        }
示例#3
0
		public idTraceModel()
		{
			_type = TraceModelType.Invalid;
			_bounds = idBounds.Zero;

			_edges = new TraceModelEdge[0];
			_polygons = new TraceModelPolygon[0];
			_vertices = new Vector3[0];
		}
示例#4
0
		private void InitBox()
		{
			_type = TraceModelType.Box;
			_vertices = new Vector3[8];
			_edges = new TraceModelEdge[13];
			_polygons = new TraceModelPolygon[6];

			// set box edges
			for(int i = 0; i < 4; i++)
			{
				_edges[i + 1].V = new int[] { i, (i + 1) & 3 };
				_edges[i + 5].V = new int[] { 4 + i, 4 + ((i + 1) & 3) };
				_edges[i + 9].V = new int[] { i, 4 + i };
			}

			// all edges of a polygon go counter clockwise
			_polygons[0].Normal = new Vector3(0, 0, -1);
			_polygons[0].Edges = new int[] {
					-4, -3, -2, -1
				};

			_polygons[1].Normal = new Vector3(0, 0, 1);
			_polygons[1].Edges = new int[] {
					5, 6, 7, 8
				};

			_polygons[2].Normal = new Vector3(0, -1, 0);
			_polygons[2].Edges = new int[] {
					1, 10, -5, -9
				};

			_polygons[3].Normal = new Vector3(1, 0, 0);
			_polygons[3].Edges = new int[] {
					2, 11, -6, -10
				};

			_polygons[4].Normal = new Vector3(0, 1, 0);
			_polygons[4].Edges = new int[] {
					3, 12, -7, -11
				};

			_polygons[5].Normal = new Vector3(-1, 0, 0);
			_polygons[5].Edges = new int[] {
					4, 9, -8, -12
				};

			// convex model
			_isConvex = true;

			GenerateEdgeNormals();
		}
示例#5
0
		public void SetupCylinder(idBounds bounds, int sideCount)
		{
			int n = sideCount;

			if(n < 3)
			{
				n = 3;
			}

			if((n * 2) > MaxVertices)
			{
				idConsole.WriteLine("WARNING: idTraceModel::SetupCylinder: too many vertices");
				n = MaxVertices / 2;
			}

			if((n * 3) > MaxEdges)
			{
				idConsole.WriteLine("WARNING: idTraceModel::SetupCylinder: too many sides");
				n = MaxEdges / 3;
			}

			if((n + 2) > MaxPolygons)
			{
				idConsole.WriteLine("WARNING: idTraceModel::SetupCylinder: too many polygons");
				n = MaxPolygons - 2;
			}

			_type = TraceModelType.Cylinder;

			_vertices = new Vector3[n * 2];
			_edges = new TraceModelEdge[n * 3];
			_polygons = new TraceModelPolygon[n + 2];

			_offset = (bounds.Min + bounds.Max) * 0.5f;

			Vector3 halfSize = bounds.Max - _offset;

			for(int i = 0; i < n; i++)
			{
				// verts
				float angle = idMath.TwoPi * i / n;

				_vertices[i].X = idMath.Cos(angle) * halfSize.X + _offset.X;
				_vertices[i].Y = idMath.Sin(angle) * halfSize.Y + _offset.Y;
				_vertices[i].Z = -halfSize.Z + _offset.Z;

				_vertices[n + i].X = _vertices[i].X;
				_vertices[n + i].Y = _vertices[i].Y;
				_vertices[n + i].Z = halfSize.Z + _offset.Z;

				// edges
				int ii = i + 1;
				int n2 = n << 1;

				_edges[ii].V[0] = i;
				_edges[ii].V[1] = ii % n;
				_edges[n + ii].V[0] = _edges[ii].V[0] + n;
				_edges[n + ii].V[1] = _edges[ii].V[1] + n;
				_edges[n2 + ii].V[0] = i;
				_edges[n2 + ii].V[1] = n + i;

				// vertical polygon edges
				_polygons[i].Edges = new int[4];
				_polygons[i].Edges[0] = ii;
				_polygons[i].Edges[1] = n2 + (ii % n) + 1;
				_polygons[i].Edges[2] = -(n + ii);
				_polygons[i].Edges[3] = -(n2 + ii);

				// bottom and top polygon edges
				_polygons[n].Edges[i] = -(n - i);
				_polygons[n + 1].Edges[i] = n + ii;
			}

			// bottom and top polygon numEdges
			_polygons[n].Edges = new int[n];
			_polygons[n + 1].Edges = new int[n];

			// polygons
			for(int i = 0; i < n; i++)
			{
				// vertical polygon plane
				_polygons[i].Normal = Vector3.Cross(_vertices[(i + 1) % n] - _vertices[i], _vertices[n + i] - _vertices[i]);
				_polygons[i].Normal.Normalize();

				// vertical polygon bounds
				_polygons[i].Bounds.Clear();
				_polygons[i].Bounds.AddPoint(_vertices[i]);
				_polygons[i].Bounds.AddPoint(_vertices[(i + 1) % n]);
				_polygons[i].Bounds.Min.Z = -halfSize.Z + _offset.Z;
				_polygons[i].Bounds.Max.Z = halfSize.Z + _offset.Z;
			}

			// bottom and top polygon plane
			_polygons[n].Normal = new Vector3(0, 0, -1.0f);
			_polygons[n].Distance = -bounds.Min.Z;
			_polygons[n + 1].Normal = new Vector3(0, 0, 1.0f);
			_polygons[n + 1].Distance = bounds.Max.Z;

			// trm bounds
			_bounds = bounds;

			// bottom and top polygon bounds
			_polygons[n].Bounds = bounds;
			_polygons[n].Bounds.Max.Z = bounds.Min.Z;
			_polygons[n + 1].Bounds = bounds;
			_polygons[n + 1].Bounds.Min.Z = bounds.Max.Z;

			// convex model
			_isConvex = true;
			
			GenerateEdgeNormals();
		}
示例#6
0
 public idTraceModel()
 {
     _type = TraceModelType.Invalid;
 }
示例#7
0
        private void InitBox()
        {
            _type = TraceModelType.Box;

            _vertices = new Vector3[8];
            _edges    = new TraceModelEdge[12];
            _polygons = new TraceModelPolygon[6];

            for (int i = 0; i < _edges.Length; i++)
            {
                _edges[i].V = new int[2];
            }

            // set box edges
            for (int i = 0; i < 4; i++)
            {
                _edges[i + 1].V[0] = i;
                _edges[i + 1].V[1] = (i + 1) & 3;
                _edges[i + 5].V[0] = 4 + i;
                _edges[i + 5].V[1] = 4 + ((i + 1) & 3);
                _edges[i + 9].V[0] = i;
                _edges[i + 9].V[1] = 4 + i;
            }

            // all edges of a polygon go counter clockwise
            _polygons[0].Edges    = new int[4];
            _polygons[0].Edges[0] = -4;
            _polygons[0].Edges[1] = -3;
            _polygons[0].Edges[2] = -2;
            _polygons[0].Edges[3] = -1;
            _polygons[0].Normal   = new Vector3(0, 0, -1);

            _polygons[1].Edges    = new int[4];
            _polygons[1].Edges[0] = 5;
            _polygons[1].Edges[1] = 6;
            _polygons[1].Edges[2] = 7;
            _polygons[1].Edges[3] = 8;
            _polygons[1].Normal   = new Vector3(0, 0, -1);

            _polygons[2].Edges    = new int[4];
            _polygons[2].Edges[0] = 1;
            _polygons[2].Edges[1] = 10;
            _polygons[2].Edges[2] = -5;
            _polygons[2].Edges[3] = -9;
            _polygons[2].Normal   = new Vector3(0, -1, 0);

            _polygons[3].Edges    = new int[4];
            _polygons[3].Edges[0] = 2;
            _polygons[3].Edges[1] = 11;
            _polygons[3].Edges[2] = -6;
            _polygons[3].Edges[3] = -10;
            _polygons[3].Normal   = new Vector3(1, 0, 0);

            _polygons[4].Edges    = new int[4];
            _polygons[4].Edges[0] = 3;
            _polygons[4].Edges[1] = 12;
            _polygons[4].Edges[2] = -7;
            _polygons[4].Edges[3] = -11;
            _polygons[4].Normal   = new Vector3(0, 1, 0);

            _polygons[5].Edges    = new int[4];
            _polygons[5].Edges[0] = 4;
            _polygons[5].Edges[1] = 9;
            _polygons[5].Edges[2] = -8;
            _polygons[5].Edges[3] = -12;
            _polygons[5].Normal   = new Vector3(-1, 0, 0);

            // convex model
            _isConvex = true;

            GenerateEdgeNormals();
        }
示例#8
0
        public void SetupCylinder(idBounds bounds, int sideCount)
        {
            int n = sideCount;

            if (n < 3)
            {
                n = 3;
            }

            if ((n * 2) > MaxVertices)
            {
                idConsole.WriteLine("WARNING: idTraceModel::SetupCylinder: too many vertices");
                n = MaxVertices / 2;
            }

            if ((n * 3) > MaxEdges)
            {
                idConsole.WriteLine("WARNING: idTraceModel::SetupCylinder: too many sides");
                n = MaxEdges / 3;
            }

            if ((n + 2) > MaxPolygons)
            {
                idConsole.WriteLine("WARNING: idTraceModel::SetupCylinder: too many polygons");
                n = MaxPolygons - 2;
            }

            _type = TraceModelType.Cylinder;

            _vertices = new Vector3[n * 2];
            _edges    = new TraceModelEdge[n * 3];
            _polygons = new TraceModelPolygon[n + 2];

            _offset = (bounds.Min + bounds.Max) * 0.5f;

            Vector3 halfSize = bounds.Max - _offset;

            for (int i = 0; i < n; i++)
            {
                // verts
                float angle = idMath.TwoPi * i / n;

                _vertices[i].X = idMath.Cos(angle) * halfSize.X + _offset.X;
                _vertices[i].Y = idMath.Sin(angle) * halfSize.Y + _offset.Y;
                _vertices[i].Z = -halfSize.Z + _offset.Z;

                _vertices[n + i].X = _vertices[i].X;
                _vertices[n + i].Y = _vertices[i].Y;
                _vertices[n + i].Z = halfSize.Z + _offset.Z;

                // edges
                int ii = i + 1;
                int n2 = n << 1;

                _edges[ii].V[0]      = i;
                _edges[ii].V[1]      = ii % n;
                _edges[n + ii].V[0]  = _edges[ii].V[0] + n;
                _edges[n + ii].V[1]  = _edges[ii].V[1] + n;
                _edges[n2 + ii].V[0] = i;
                _edges[n2 + ii].V[1] = n + i;

                // vertical polygon edges
                _polygons[i].Edges    = new int[4];
                _polygons[i].Edges[0] = ii;
                _polygons[i].Edges[1] = n2 + (ii % n) + 1;
                _polygons[i].Edges[2] = -(n + ii);
                _polygons[i].Edges[3] = -(n2 + ii);

                // bottom and top polygon edges
                _polygons[n].Edges[i]     = -(n - i);
                _polygons[n + 1].Edges[i] = n + ii;
            }

            // bottom and top polygon numEdges
            _polygons[n].Edges     = new int[n];
            _polygons[n + 1].Edges = new int[n];

            // polygons
            for (int i = 0; i < n; i++)
            {
                // vertical polygon plane
                _polygons[i].Normal = Vector3.Cross(_vertices[(i + 1) % n] - _vertices[i], _vertices[n + i] - _vertices[i]);
                _polygons[i].Normal.Normalize();

                // vertical polygon bounds
                _polygons[i].Bounds.Clear();
                _polygons[i].Bounds.AddPoint(_vertices[i]);
                _polygons[i].Bounds.AddPoint(_vertices[(i + 1) % n]);
                _polygons[i].Bounds.Min.Z = -halfSize.Z + _offset.Z;
                _polygons[i].Bounds.Max.Z = halfSize.Z + _offset.Z;
            }

            // bottom and top polygon plane
            _polygons[n].Normal       = new Vector3(0, 0, -1.0f);
            _polygons[n].Distance     = -bounds.Min.Z;
            _polygons[n + 1].Normal   = new Vector3(0, 0, 1.0f);
            _polygons[n + 1].Distance = bounds.Max.Z;

            // trm bounds
            _bounds = bounds;

            // bottom and top polygon bounds
            _polygons[n].Bounds           = bounds;
            _polygons[n].Bounds.Max.Z     = bounds.Min.Z;
            _polygons[n + 1].Bounds       = bounds;
            _polygons[n + 1].Bounds.Min.Z = bounds.Max.Z;

            // convex model
            _isConvex = true;

            GenerateEdgeNormals();
        }
示例#9
0
		public idTraceModel()
		{
			_type = TraceModelType.Invalid;
		}
示例#10
0
		private void InitBox()
		{
			_type = TraceModelType.Box;

			_vertices = new Vector3[8];
			_edges = new TraceModelEdge[12];
			_polygons = new TraceModelPolygon[6];

			for(int i = 0; i < _edges.Length; i++)
			{
				_edges[i].V = new int[2];
			}

			// set box edges
			for(int i = 0; i < 4; i++)
			{
				_edges[i + 1].V[0] = i;
				_edges[i + 1].V[1] = (i + 1) & 3;
				_edges[i + 5].V[0] = 4 + i;
				_edges[i + 5].V[1] = 4 + ((i + 1) & 3);
				_edges[i + 9].V[0] = i;
				_edges[i + 9].V[1] = 4 + i;
			}

			// all edges of a polygon go counter clockwise
			_polygons[0].Edges = new int[4];
			_polygons[0].Edges[0] = -4;
			_polygons[0].Edges[1] = -3;
			_polygons[0].Edges[2] = -2;
			_polygons[0].Edges[3] = -1;
			_polygons[0].Normal = new Vector3(0, 0, -1);

			_polygons[1].Edges = new int[4];
			_polygons[1].Edges[0] = 5;
			_polygons[1].Edges[1] = 6;
			_polygons[1].Edges[2] = 7;
			_polygons[1].Edges[3] = 8;
			_polygons[1].Normal = new Vector3(0, 0, -1);

			_polygons[2].Edges = new int[4];
			_polygons[2].Edges[0] = 1;
			_polygons[2].Edges[1] = 10;
			_polygons[2].Edges[2] = -5;
			_polygons[2].Edges[3] = -9;
			_polygons[2].Normal = new Vector3(0, -1, 0);

			_polygons[3].Edges = new int[4];
			_polygons[3].Edges[0] = 2;
			_polygons[3].Edges[1] = 11;
			_polygons[3].Edges[2] = -6;
			_polygons[3].Edges[3] = -10;
			_polygons[3].Normal = new Vector3(1, 0, 0);

			_polygons[4].Edges = new int[4];
			_polygons[4].Edges[0] = 3;
			_polygons[4].Edges[1] = 12;
			_polygons[4].Edges[2] = -7;
			_polygons[4].Edges[3] = -11;
			_polygons[4].Normal = new Vector3(0, 1, 0);

			_polygons[5].Edges = new int[4];
			_polygons[5].Edges[0] = 4;
			_polygons[5].Edges[1] = 9;
			_polygons[5].Edges[2] = -8;
			_polygons[5].Edges[3] = -12;
			_polygons[5].Normal = new Vector3(-1, 0, 0);

			// convex model
			_isConvex = true;

			GenerateEdgeNormals();
		}