
private void Build_HexQuad_List()
{
H_Element HE;
int nEl = 0;
for (var ring = 0; ring < latitudeSegments; ring++)
{
//H1 Even Row - 0,2,4,6,
for (int i = 0; i < longitudeSegments; i++)
{
HE = new H_Element();
HE.myIndex = nEl;
Vector3 v0, v1, v2, v3, vCent;
int qIdx = ring * longitudeSegments + i;
v0 = LLQuads[qIdx].mdQuad.vertices[0];
v1 = LLQuads[qIdx].mdQuad.vertices[1];
v2 = LLQuads[qIdx].mdQuad.vertices[2];
v3 = LLQuads[qIdx].mdQuad.vertices[3];
vCent = (v0 + v1 + v2 + v3) / 4f;
Vector3 vRight = v2 - v0;
Vector3 vUp = v0 - v1;
HE.mdH.vertices.Add(v0 + (1f / 6f) * vRight + (1f / 2f) * vUp);
HE.mdH.vertices.Add(v0 + (1f / 6f) * vRight - (1f / 2f) * vUp);
HE.mdH.vertices.Add(v2 - (1f / 6f) * vRight + (1f / 2f) * vUp);
HE.mdH.vertices.Add(v2 - (1f / 6f) * vRight - (1f / 2f) * vUp);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.uv.Add(new Vector2(0f, 1f));
HE.mdH.uv.Add(new Vector2(0f, 0f));
HE.mdH.uv.Add(new Vector2(1f, 1f));
HE.mdH.uv.Add(new Vector2(1f, 0f));
//Evens
if (ring > 1 && ring < latitudeSegments - 2 )
{
HE.neighborLoc[0] = nEl - longitudeSegments * 2;
HE.neighborLoc[1] = nEl - longitudeSegments;
HE.neighborLoc[2] = nEl + longitudeSegments;
HE.neighborLoc[3] = nEl + longitudeSegments * 2;
if (i == 0)
{
HE.neighborLoc[4] = nEl + 2 * longitudeSegments - 1;
HE.neighborLoc[5] = nEl - 1;
}
else
{
HE.neighborLoc[4] = nEl + longitudeSegments - 1;
HE.neighborLoc[5] = nEl - (longitudeSegments + 1);
}
}
else
{
HE.neighborLoc[0] = 0;
HE.neighborLoc[1] = 0;
HE.neighborLoc[2] = 0;
HE.neighborLoc[3] = 0;
HE.neighborLoc[4] = 0;
HE.neighborLoc[5] = 0;
}
HE.mdH.triangles.AddRange(new[] { 0, 1, 2, 2, 1, 3 });
HexQuads.Add(HE);
nEl++;
}
//H3 Odd Row - 1,3,5,7,
for (int i = 0; i < longitudeSegments; i++)
{
HE = new H_Element();
HE.myIndex = nEl;
Vector3 v0, v1, v2, v3, vCent;
int qIdx = ring * longitudeSegments + i;
v0 = LLQuads[qIdx].mdQuad.vertices[0];
v1 = LLQuads[qIdx].mdQuad.vertices[1];
v2 = LLQuads[qIdx].mdQuad.vertices[2];
v3 = LLQuads[qIdx].mdQuad.vertices[3];
vCent = (v0 + v1 + v2 + v3) / 4f;
Vector3 vRight = v2 - v0;
Vector3 vUp = v0 - v1;
HE.mdH.vertices.Add(v2 - (1f / 3f) * vRight);
HE.mdH.vertices.Add(v3 - (1f / 3f) * vRight);
HE.mdH.vertices.Add(v2 + (1f / 3f) * vRight);
HE.mdH.vertices.Add(v3 + (1f / 3f) * vRight);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.normals.Add(vCent.normalized);
HE.mdH.uv.Add(new Vector2(0f, 1f));
HE.mdH.uv.Add(new Vector2(0f, 0f));
HE.mdH.uv.Add(new Vector2(1f, 1f));
HE.mdH.uv.Add(new Vector2(1f, 0f));
//Odds
if (ring > 1 && ring < latitudeSegments - 2)
{
HE.neighborLoc[0] = nEl - longitudeSegments * 2;
if (i == longitudeSegments - 1)
{
HE.neighborLoc[1] = nEl - 2 * longitudeSegments + 1;
HE.neighborLoc[2] = nEl + 1;
}
else
{
HE.neighborLoc[1] = nEl - longitudeSegments + 1;
HE.neighborLoc[2] = nEl + longitudeSegments + 1;
}
HE.neighborLoc[3] = nEl + longitudeSegments * 2;
HE.neighborLoc[4] = nEl + longitudeSegments;
HE.neighborLoc[5] = nEl - longitudeSegments;
}
else
{
HE.neighborLoc[0] = 0;
HE.neighborLoc[1] = 0;
HE.neighborLoc[2] = 0;
HE.neighborLoc[3] = 0;
HE.neighborLoc[4] = 0;
HE.neighborLoc[5] = 0;
}
HE.mdH.triangles.AddRange(new[] { 0, 1, 2, 2, 1, 3 });
HexQuads.Add(HE);
nEl++;
}
}
}


(Seam at i == 0 && i == longitudeSegmentCount-1)







