Ejemplo n.º 1
0
        void RenderWorldSingle()
        {
            lock (ChunkEventManager.viewHashSet)
            {
                foreach (var manager in ChunkEventManager.viewHashSet)
                {
                    while (manager.GetBucket(out var bucket))
                    {
                        viewThread.Enqueue(bucket);
                    }
                }
            }
            foreach (var manager in ChunkEventManager.coroutineHashSet)
            {
                while (manager.GetBucket(out var bucket))
                {
                    coroutineQueue.Enqueue(bucket);
                }
            }

            int minX = 0;
            int maxX = 0;
            int minY = 0;
            int maxY = 0;

            // Ordering: [0] = Left, [1] = Right, [2] = Down, [3] = Up, [4] = Near, [5] = Far
            GeometryUtility.CalculateFrustumPlanes(View.setup._camera, planes);
            float enter;

            UnityEngine.Profiling.Profiler.BeginSample("Calc planes");
            var depth = View.setup.viewSize.z * 16;

            RectInt[] zz = new RectInt[depth];
            for (int z = 0; z < depth; z++)
            {
                var calcPos = new Vector3(View.setup._camera.transform.position.x, View.setup._camera.transform.position.y, z);
                // left
                var ray = new Ray(calcPos, Vector3.left);
                if (planes[0].Raycast(ray, out enter))
                {
                    var point = ray.GetPoint(enter).Floor();
                    if (planes[0].GetSide(point + new Vector3(0.5f, 0, -0.5f)))
                    {
                        minX = point.x - 1;
                    }
                    else
                    {
                        minX = point.x - 1;
                    }
                }
                // right
                ray = new Ray(calcPos, Vector3.right);
                if (planes[1].Raycast(ray, out enter))
                {
                    var point = ray.GetPoint(enter).Floor();
                    if (planes[1].GetSide(point + new Vector3(-0.5f, 0, -0.5f)))
                    {
                        maxX = point.x + 1;
                    }
                    else
                    {
                        maxX = point.x + 1;
                    }
                }
                // bottom
                ray = new Ray(calcPos, Vector3.down);
                if (planes[2].Raycast(ray, out enter))
                {
                    var point = ray.GetPoint(enter).Floor();
                    if (planes[2].GetSide(point + new Vector3(0, 0.5f, -0.5f)))
                    {
                        minY = point.y - 1;
                    }
                    else
                    {
                        minY = point.y - 1;
                    }
                }
                // top
                ray = new Ray(calcPos, Vector3.up);
                if (planes[3].Raycast(ray, out enter))
                {
                    var point = ray.GetPoint(enter).Floor();
                    if (planes[3].GetSide(point + new Vector3(0, -0.5f, -0.5f)))
                    {
                        maxY = point.y + 1;
                    }
                    else
                    {
                        maxY = point.y + 1;
                    }
                }
                zz[z] = new RectInt(minX, minY, maxX - minX, maxY - minY);
            }
            UnityEngine.Profiling.Profiler.EndSample();

            var hp = new Plane(Vector3.up, View.setup._camera.transform.position);
            var vp = new Plane(Vector3.right, View.setup._camera.transform.position);

            var playerPos     = new Vector3(View.setup._camera.transform.position.x, View.setup._camera.transform.position.y, 0);
            var queue         = new Queue <RenderChunk>();
            var startChunkPos = BlockPos.From(Vector3Int.FloorToInt(playerPos));

            minX = (startChunkPos.x >> 4) - View.setup.viewSize.x;
            maxX = (startChunkPos.x >> 4) + View.setup.viewSize.x;
            minY = (startChunkPos.y >> 4) - View.setup.viewSize.y;
            maxY = (startChunkPos.y >> 4) + View.setup.viewSize.y;
            var chunkPos = new BlockPos();

            for (int x = minX; x <= maxX; x++)
            {
                for (int y = minY; y <= maxY; y++)
                {
                    chunkPos.SetChunk(x, y, 0);
                    var renderChunk = renderProvider.GetChunk(chunkPos);
                    if (GeometryUtility.TestPlanesAABB(planes, renderChunk.bounds))
                    {
                        renderChunk.SetFrameIndex(Time.frameCount);
                        queue.Enqueue(renderChunk);
                    }
                    else
                    {
                        renderChunk.Update();
                    }
                }
            }

            while (queue.Count > 0 && queue.Count < 100)
            {
                var renderChunk = queue.Dequeue();
                renderChunk.Update();
                if (renderChunk.empty == 4096)
                {
                    DrawBounds(renderChunk.bounds, Color.white);
                }
                else
                {
                    DrawBounds(renderChunk.bounds, Color.red);
                }
                Graphics.DrawMesh(renderChunk.mesh, Matrix4x4.identity, material2, 0);

                for (Facing facing = Facing.First; facing <= Facing.Last; facing++)
                {
                    chunkPos.Set(renderChunk.chunk.position);
                    chunkPos.AddChunk(facing.GetVector());
                    var renderChunkOffset = renderProvider.GetChunk(startChunkPos, chunkPos);
                    if (renderChunkOffset != null)
                    {
                        renderChunkOffset.Update();
                        if (renderChunkOffset != null && GeometryUtility.TestPlanesAABB(planes, renderChunkOffset.bounds) && renderChunk.IsVisible(facing) && renderChunkOffset.SetFrameIndex(Time.frameCount))
                        {
                            queue.Enqueue(renderChunkOffset);
                        }
                    }
                }
            }
        }