public void Build(AquariaSubTree tree) { int totalNodes = 0; List<Vector3> visibleNodes = new List<Vector3>(); Vector3 offset = new Vector3(); Vector3 point = new Vector3(); for (int i = 0; i < tree.GetIndiceCount(); i++) { if (tree.GetValueAt(i) == TypeID) { point = tree.getWorldPointAtIndex(i); for (int k = 0; k < 6; k++) { offset = point; offset[(int)(k / 2)] += -1 + ((k % 2) * 2); //sixaxis if (tree.GetValueAt(offset) <= 1) { totalNodes++; visibleNodes.Add(point); break; } } } } if (totalNodes > 0) { newVertices = new Vector3[totalNodes * 24]; newUV = new Vector2[totalNodes * 24]; newTriangles = new int[totalNodes * 36]; newNormals = new Vector3[totalNodes * 24]; int nodeCnt = 0; for (int i = 0; i < visibleNodes.Count; i++) { for (int k = 0; k < 24; k++) { newVertices[nodeCnt * 24 + k] = visibleNodes[i] + vertexTemplate[polygonLookup[k]]; newNormals[nodeCnt * 24 + k] = normalsTable[k]; newUV[nodeCnt * 24 + k] = UVTemplate[UVcoordTable[k]]; } for (int k = 0; k < 36; k++) { newTriangles[(nodeCnt * 36) + k] = (nodeCnt * 24) + triangleLookup[k]; } nodeCnt++; } } else { EmptyObject = true; } builtMeshData = true; }
public void GenerateSubField(AquariaSubTree subtree) { int setvaluecnt = 0; TaskPool.QueueTask(() => { AquariaTerrainGenerator tgen = new AquariaTerrainGenerator(128, 64f); float subTreeSize = subtree.GetWorldSize(); Vector3 pos = subtree.GetPosition() - Vector3.one * subTreeSize*0.5f; AquariaTerrainGenerator.SetValueDelegate pillarSetup = (Vector3 inputPoint, sbyte value) => { subtree.SetValueAtPoint(inputPoint, value); }; Vector3 generationPoint = pos; for (generationPoint.x = pos.x ; generationPoint.x < pos.x + subTreeSize; generationPoint.x += 1.0f) { for (generationPoint.z = pos.z ; generationPoint.z < pos.z + subTreeSize; generationPoint.z += 1.0f) { tgen.GenerateHeighPillar(generationPoint, pillarSetup); } } }, () => { subtree.GenerateNearestNeighborTable(); }); }