예제 #1
0
    public void Update()
    {
        var sqrDistanceToViewer = bounds.SqrDistance(viewer.position);
        var sqrMaxViewDist      = lodSettings[lodSettings.Length - 1].maxViewDist * lodSettings[lodSettings.Length - 1].maxViewDist;

        bool isVisible = sqrDistanceToViewer <= sqrMaxViewDist;

        if (isVisible && hasRequestedNoiseMap)
        {
            lodMeshIndex = 0;

            for (int i = 0; i < lodSettings.Length - 1; i++)
            {
                var sqrLODMaxViewDist = lodSettings[i].maxViewDist * lodSettings[i].maxViewDist;

                if (sqrDistanceToViewer <= sqrLODMaxViewDist)
                {
                    break;
                }
                else
                {
                    lodMeshIndex++;
                }
            }

            var lodMesh = lodMeshes[lodMeshIndex];

            if (lodMesh.hasMesh)
            {
                meshFilter.sharedMesh = lodMesh.mesh;
            }
            else if (!lodMesh.hasRequestedMesh && hasNoiseMap)
            {
                //lodMesh.RequestMesh(noiseMapData);// to remove
                RequestMesh(lodMesh);
            }
        }
        else if (!hasRequestedNoiseMap)
        {
            hasRequestedNoiseMap = true;
            UnityTaskManager.ScheduleTask(RequestNoiseMap, OnNoiseMapReceived);
        }

        SetActive(isVisible);
    }
예제 #2
0
    public TerrainChunk(Vector3 offset, Transform parent, NoiseSettings noiseSettings, SphereMeshSettings meshSettings, Material material, Transform viewer)
    {
        Vector3 size = Vector3.one * meshSettings.chunkSize;

        bounds = new Bounds(offset + size / 2, size);

        gameObject = new GameObject("Chunk: " + bounds.min);
        gameObject.transform.SetParent(parent);

        this.viewer        = viewer;
        this.noiseSettings = noiseSettings;
        this.meshSettings  = meshSettings;
        this.lodSettings   = meshSettings.lodSettings;

        gameObject.AddComponent <MeshRenderer>().sharedMaterial = material;
        meshFilter   = gameObject.AddComponent <MeshFilter>();
        meshCollider = gameObject.AddComponent <MeshCollider>();

        InitializeLOD();

        hasRequestedNoiseMap = true;
        UnityTaskManager.ScheduleTask(RequestNoiseMap, OnNoiseMapReceived);
    }
예제 #3
0
 public void RequestMesh(LODMesh lodMesh)
 {
     lodMesh.hasRequestedMesh = true;
     UnityTaskManager.ScheduleTask(RequestMeshData, OnMeshDataReceived);
 }
예제 #4
0
 void Awake()
 {
     instance = FindObjectOfType <UnityTaskManager>();
     Debug.Log("UnityTaskManager Initialized");
 }