Example #1
0
    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;
    }
Example #2
0
    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();
        });
    }