/// <summary> /// Initialises the torus. /// </summary> /// <returns></returns> private bool InitialiseTorus() { // Calculate the number of vertices and indices. numVertices=(torusPrecision+1)*(torusPrecision+1); numIndices=2*torusPrecision*torusPrecision*3; // Create the vertices and indices. vertices = new TorusVertex[numVertices]; indices = new uint[numIndices]; // Calculate the first ring - inner radius 4, outer radius 1.5 for (int i = 0; i < torusPrecision + 1; i++) { vertices[i].position = (new Vertex(1.5f, 0.0f, 0.0f)).GetRotatedZ(i * 360.0f / torusPrecision) + new Vertex(4.0f, 0.0f, 0.0f); vertices[i].s = 0.0f; vertices[i].t = (float)i / torusPrecision; vertices[i].sTangent.Set(0.0f, 0.0f, -1.0f); vertices[i].tTangent = (new Vertex(0.0f, -1.0f, 0.0f)).GetRotatedZ(i * 360.0f / torusPrecision); vertices[i].normal = vertices[i].tTangent.VectorProduct(vertices[i].sTangent); } // Rotate the first ring to get the other rings for(uint ring=1; ring<torusPrecision+1; ring++) { for (uint i = 0; i < torusPrecision + 1; i++) { vertices[ring * (torusPrecision + 1) + i].position = vertices[i].position.GetRotatedY(ring * 360.0f / torusPrecision); vertices[ring * (torusPrecision + 1) + i].s = 2.0f * ring / torusPrecision; vertices[ring * (torusPrecision + 1) + i].t = vertices[i].t; vertices[ring * (torusPrecision + 1) + i].sTangent = vertices[i].sTangent.GetRotatedY(ring * 360.0f / torusPrecision); vertices[ring * (torusPrecision + 1) + i].tTangent = vertices[i].tTangent.GetRotatedY(ring * 360.0f / torusPrecision); vertices[ring * (torusPrecision + 1) + i].normal = vertices[i].normal.GetRotatedY(ring * 360.0f / torusPrecision); } } // Calculate the indices for (uint ring = 0; ring < torusPrecision; ring++) { for (uint i = 0; i < torusPrecision; i++) { indices[((ring * torusPrecision + i) * 2) * 3 + 0] = ring * (torusPrecision + 1) + i; indices[((ring * torusPrecision + i) * 2) * 3 + 1] = (ring + 1) * (torusPrecision + 1) + i; indices[((ring * torusPrecision + i) * 2) * 3 + 2] = ring * (torusPrecision + 1) + i + 1; indices[((ring * torusPrecision + i) * 2 + 1) * 3 + 0] = ring * (torusPrecision + 1) + i + 1; indices[((ring * torusPrecision + i) * 2 + 1) * 3 + 1] = (ring + 1) * (torusPrecision + 1) + i; indices[((ring * torusPrecision + i) * 2 + 1) * 3 + 2] = (ring + 1) * (torusPrecision + 1) + i + 1; } } // OK, that's the torus done! return true; }
/// <summary> /// Initialises the torus. /// </summary> /// <returns></returns> private bool InitialiseTorus() { // Calculate the number of vertices and indices. numVertices = (torusPrecision + 1) * (torusPrecision + 1); numIndices = 2 * torusPrecision * torusPrecision * 3; // Create the vertices and indices. vertices = new TorusVertex[numVertices]; indices = new uint[numIndices]; // Calculate the first ring - inner radius 4, outer radius 1.5 for (int i = 0; i < torusPrecision + 1; i++) { vertices[i].position = (new Vertex(1.5f, 0.0f, 0.0f)).GetRotatedZ(i * 360.0f / torusPrecision) + new Vertex(4.0f, 0.0f, 0.0f); vertices[i].s = 0.0f; vertices[i].t = (float)i / torusPrecision; vertices[i].sTangent.Set(0.0f, 0.0f, -1.0f); vertices[i].tTangent = (new Vertex(0.0f, -1.0f, 0.0f)).GetRotatedZ(i * 360.0f / torusPrecision); vertices[i].normal = vertices[i].tTangent.VectorProduct(vertices[i].sTangent); } // Rotate the first ring to get the other rings for (uint ring = 1; ring < torusPrecision + 1; ring++) { for (uint i = 0; i < torusPrecision + 1; i++) { vertices[ring * (torusPrecision + 1) + i].position = vertices[i].position.GetRotatedY(ring * 360.0f / torusPrecision); vertices[ring * (torusPrecision + 1) + i].s = 2.0f * ring / torusPrecision; vertices[ring * (torusPrecision + 1) + i].t = vertices[i].t; vertices[ring * (torusPrecision + 1) + i].sTangent = vertices[i].sTangent.GetRotatedY(ring * 360.0f / torusPrecision); vertices[ring * (torusPrecision + 1) + i].tTangent = vertices[i].tTangent.GetRotatedY(ring * 360.0f / torusPrecision); vertices[ring * (torusPrecision + 1) + i].normal = vertices[i].normal.GetRotatedY(ring * 360.0f / torusPrecision); } } // Calculate the indices for (uint ring = 0; ring < torusPrecision; ring++) { for (uint i = 0; i < torusPrecision; i++) { indices[((ring * torusPrecision + i) * 2) * 3 + 0] = ring * (torusPrecision + 1) + i; indices[((ring * torusPrecision + i) * 2) * 3 + 1] = (ring + 1) * (torusPrecision + 1) + i; indices[((ring * torusPrecision + i) * 2) * 3 + 2] = ring * (torusPrecision + 1) + i + 1; indices[((ring * torusPrecision + i) * 2 + 1) * 3 + 0] = ring * (torusPrecision + 1) + i + 1; indices[((ring * torusPrecision + i) * 2 + 1) * 3 + 1] = (ring + 1) * (torusPrecision + 1) + i; indices[((ring * torusPrecision + i) * 2 + 1) * 3 + 2] = (ring + 1) * (torusPrecision + 1) + i + 1; } } // OK, that's the torus done! return(true); }