Exemple #1
0
        protected override void OnProcessChunk(Chunk chunk)
        {
            Profiler.BeginSample("ProcessChunk");

            int tx = clipmap.TransformX(chunk.Pos.x / Env.CHUNK_SIZE);
            int ty = clipmap.TransformY(chunk.Pos.y / Env.CHUNK_SIZE);
            int tz = clipmap.TransformZ(chunk.Pos.z / Env.CHUNK_SIZE);

            // Chunk is too far away. Remove it
            if (!clipmap.IsInsideBounds_Transformed(tx, ty, tz))
            {
                chunk.RequestRemoval();
            }
            else
            {
                // Dummy collider example - create a collider for chunks directly surrounding the viewer
                int xd = Helpers.Abs((viewerPos.x - chunk.Pos.x) / Env.CHUNK_SIZE);
                int zd = Helpers.Abs((viewerPos.z - chunk.Pos.z) / Env.CHUNK_SIZE);
                chunk.NeedsColliderGeometry = xd <= 1 && zd <= 1;

                if (!useFrustumCulling)
                {
                    ClipmapItem item = clipmap.Get_Transformed(tx, ty, tz);

                    // Chunk is in visibilty range. Full update with geometry generation is possible
                    if (item.isInVisibleRange)
                    {
                        //chunk.LOD = item.LOD;
                        chunk.PossiblyVisible     = true;
                        chunk.NeedsRenderGeometry = true;
                    }
                    // Chunk is in cached range. Full update except for geometry generation
                    else
                    {
                        //chunk.LOD = item.LOD;
                        chunk.PossiblyVisible     = true;
                        chunk.NeedsRenderGeometry = false;
                    }
                }
            }
        }
        public static Vector3Int[] ChunkPositions(int chunkLoadRadius)
        {
            chunkLoads.Clear();

            for (int z = -chunkLoadRadius; z <= chunkLoadRadius; z++)
            {
                for (int x = -chunkLoadRadius; x <= chunkLoadRadius; x++)
                {
                    chunkLoads.Add(new Vector3Int(x, 0, z));
                }
            }

            // Sort 2D vectors by closeness to the center
            return(chunkLoads
                   .Where(pos => CheckXZ(pos.x, pos.z, chunkLoadRadius))
                   // Smallest magnitude vectors first
                   .OrderBy(pos => Helpers.Abs(pos.x) + Helpers.Abs(pos.z))
                   // Make sure not to process e.g (-10,0) before (5,5)
                   .ThenBy(pos => Helpers.Abs(pos.x))
                   .ThenBy(pos => Helpers.Abs(pos.z))
                   .ToArray());
        }
 public static bool CheckY(int y, int dist)
 {
     return(Helpers.Abs(y) <= dist); // square
 }