Exemplo n.º 1
0
    // Start is called before the first frame update
    void Start()
    {
        var entityManager = World.Active.EntityManager;


        EntityArchetype chunkManager = entityManager.CreateArchetype(typeof(VoxelData), typeof(ChunkManagerInfo));
        EntityArchetype chunk        = entityManager.CreateArchetype(typeof(ChunkInfo));


        NativeArray <Entity> chunkManagerEntity = new NativeArray <Entity>(1, Allocator.Persistent);

        entityManager.CreateEntity(chunkManager, chunkManagerEntity);

        ChunkManagerInfo managerInfo = new ChunkManagerInfo
        {
            status = 0
        };

        entityManager.SetComponentData(chunkManagerEntity[0], managerInfo);



        NativeArray <Entity> chunks = new NativeArray <Entity>(8 * 8 * 8, Allocator.Persistent);

        entityManager.CreateEntity(chunk, chunks);



        for (int i = 0; i < chunks.Length; i++)
        {
            int z = i / ((8) * (8));
            int b = i - (((8) * (8)) * z);
            int y = b / (8);
            int x = b % (8);

            ChunkInfo chunkInfo = new ChunkInfo
            {
                chunkProgress = 0,
                size          = int3(16),
                pos           = int3(x * 16, y * 16, z * 16)
            };

            entityManager.SetComponentData(chunks[i], chunkInfo);
        }
    }
    protected override void OnUpdate()
    {
        NativeArray <Entity> chunkManager = chunkManagerQuery.ToEntityArray(Allocator.TempJob);
        NativeArray <Entity> chunks       = chunksQuery.ToEntityArray(Allocator.TempJob);

        Entity chunkManagerEntity = chunkManager[0];

        chunkManager.Dispose();


        if (World.Active.EntityManager.GetComponentData <ChunkManagerInfo>(chunkManagerEntity).status == 0)
        {
            if (hasDispatched == false)
            {
                for (int i = 0; i < chunks.Length; i++)
                {
                    if (World.Active.EntityManager.GetComponentData <ChunkInfo>(chunks[i]).chunkProgress == 0)
                    {
                        chunkID = i;
                        break;
                    }
                    else
                    {
                        chunkID = -1;
                    }
                }

                if (chunkID == -1)
                {
                    chunks.Dispose();
                    return;
                }

                Entity chunk = chunks[chunkID];
                chunks.Dispose();



                ChunkInfo chunkInfo = World.Active.EntityManager.GetComponentData <ChunkInfo>(chunk);

                voxelDataGenerator.SetInt("SizeX", chunkInfo.size.x + 1);
                voxelDataGenerator.SetInt("SizeY", chunkInfo.size.y + 1);
                voxelDataGenerator.SetInt("SizeZ", chunkInfo.size.z + 1);

                voxelDataGenerator.SetInt("x", chunkInfo.pos.x);
                voxelDataGenerator.SetInt("y", chunkInfo.pos.y);
                voxelDataGenerator.SetInt("z", chunkInfo.pos.z);



                voxelDataGenerator.Dispatch(GenerateVoxelDataKernel, (int)math.ceil((chunkInfo.size.x + 1) / 1), (int)math.ceil((chunkInfo.size.y + 1) / 1), (int)math.ceil((chunkInfo.size.z + 1) / 1));
                hasDispatched = true;
                request       = AsyncGPUReadback.Request(voxelBuffer);
            }



            if (request.done)
            {
                if (request.hasError == true)
                {
                    throw new System.NotImplementedException();
                }

                hasDispatched = false;

                voxelData = request.GetData <float>();

                DynamicBuffer <float> voxelDynamicBuffer = World.Active.EntityManager.GetBuffer <VoxelData>(chunkManagerEntity).Reinterpret <float>();
                voxelDynamicBuffer.CopyFrom(voxelData);

                for (int i = 0; i < 17 * 17 * 17; i++)
                {
                    Debug.Log(voxelData[i]);
                }
                //World.Active.EntityManager.SetComponentData<VoxelData>(chunkManagerEntity, voxelDynamicBuffer.Reinterpret<VoxelData>());

                ChunkInfo chunkInfo = World.Active.EntityManager.GetComponentData <ChunkInfo>(chunks[chunkID]);
                chunkInfo.chunkProgress = 1;

                World.Active.EntityManager.SetComponentData(chunks[chunkID], chunkInfo);

                ChunkManagerInfo managerInfo = World.Active.EntityManager.GetComponentData <ChunkManagerInfo>(chunkManagerEntity);

                managerInfo.status = 1;
                World.Active.EntityManager.SetComponentData(chunkManagerEntity, managerInfo);
            }
        }



        //throw new System.NotImplementedException();
    }