public idTraceModel() { _type = TraceModelType.Invalid; _bounds = idBounds.Zero; _edges = new TraceModelEdge[0]; _polygons = new TraceModelPolygon[0]; _vertices = new Vector3[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(); }
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(); }
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(); }
public idTraceModel() { _type = TraceModelType.Invalid; }
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(); }
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(); }
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(); }