Beispiel #1
0
 public void setWorldAccess(IWorldAccess worldAceess)
 {
     this.worldAceess = worldAceess;
 }
    public WorldLoader(Vector3 worldPosition, Vector3Int worldSize, Vector3Int cacheSize, Vector3Int viewDistance)
    {
        Instance = this;

        this.worldObject = new GameObject(worldPosition.ToString());
        this.worldObject.transform.position = worldPosition;

        this.chunkLoader = this.worldObject.AddComponent <ChunkLoader> ();
        Debug.Log(VoxelEngine.Instance.worldOffset);
        this.worldPosition = worldPosition;

        this.worldOffsetX = worldPosition.x - worldSize.x * ChunkMetaData.Instance.blockSize * ChunkMetaData.Instance.chunkSize * 0.5f;
        this.worldOffsetY = worldPosition.y - worldSize.y * ChunkMetaData.Instance.blockSize * ChunkMetaData.Instance.chunkSize * 0.5f;
        this.worldOffsetZ = worldPosition.z - worldSize.z * ChunkMetaData.Instance.blockSize * ChunkMetaData.Instance.chunkSize * 0.5f;

        this.cacheShiftX = cacheSize.x;
        this.cacheShiftY = cacheSize.y;
        this.cacheShiftZ = cacheSize.z;

        this.cacheSizeX = 1 << this.cacheShiftX;
        this.cacheSizeY = 1 << this.cacheShiftY;
        this.cacheSizeZ = 1 << this.cacheShiftZ;

        this.cacheMaskX = this.cacheSizeX - 1;
        this.cacheMaskY = this.cacheSizeY - 1;
        this.cacheMaskZ = this.cacheSizeZ - 1;

        int temp = this.cacheSizeX * this.cacheSizeY * this.cacheSizeZ;

        this.chunkStore = new Chunk[temp];
        this.tiles      = new long[temp];
        this.nonce      = new ulong[temp];

        this.xz      = this.cacheSizeX * this.cacheSizeZ;
        this.worldXZ = ((worldSize.x >> cacheSize.x) * (worldSize.z >> cacheSize.z));
        this.worldZ  = worldSize.z >> cacheSize.z;

        this.workingNonce = 0;

        this.worldSizeLimitX = worldSize.x;
        this.worldSizeLimitY = worldSize.y;
        this.worldSizeLimitZ = worldSize.z;

        this.viewX = viewDistance.x;
        this.viewY = viewDistance.y;
        this.viewZ = viewDistance.z;

        this.chunkShiftX = 4;
        this.chunkShiftY = 4;
        this.chunkShiftZ = 4;

        this.chunkMaskX = 15;
        this.chunkMaskY = 15;
        this.chunkMaskZ = 15;

        this.newPositionX = 0;
        this.newPositionY = 0;
        this.newPositionZ = 0;

        this.oldPositionX = 0;
        this.oldPositionY = 0;
        this.oldPositionZ = 0;


        for (int i = 0; i < temp; i++)
        {
            this.chunkStore[i] = new Chunk(0, 0, 0);
            this.tiles[i]      = 0;
        }

        int ni, nj, flatIndex;

        for (int i = this.cacheMaskY; i >= 0; i--)
        {
            ni = i * this.xz;
            for (int j = this.cacheMaskX; j >= 0; j--)
            {
                nj = ni + j * this.cacheSizeZ;
                for (int k = this.cacheMaskZ; k >= 0; k--)
                {
                    flatIndex = nj + k;

                    //Forward
                    if (k != this.cacheMaskZ)
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex + 1], 0);
                    }
                    else
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex - this.cacheMaskZ], 0);
                    }

                    //Back
                    if (k != 0)
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex - 1], 1);
                    }
                    else
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex + this.cacheMaskZ], 1);
                    }

                    //Top
                    if (i != this.cacheMaskY)
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex + this.xz], 2);
                    }
                    else
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex - i * this.xz], 2);
                    }

                    //Down
                    if (i != 0)
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex - this.xz], 3);
                    }
                    else
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex + this.cacheMaskY * this.xz], 3);
                    }

                    //Right
                    if (j != this.cacheMaskX)
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex + this.cacheSizeZ], 5);
                    }
                    else
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex - j * this.cacheSizeZ], 5);
                    }

                    //Left
                    if (j != 0)
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex - this.cacheSizeZ], 4);
                    }
                    else
                    {
                        this.chunkStore[flatIndex].SetNeighbor(this.chunkStore[flatIndex + this.cacheMaskX * this.cacheSizeZ], 4);
                    }
                }
            }
        }
    }
Beispiel #3
0
 public virtual void addWorldAccess(IWorldAccess iworldaccess)
 {
     worldAccesses.add(iworldaccess);
 }