Esempio n. 1
0
        internal void Modify(BrushType brush, ActionType action, float intensity, Vector3 operationTerrainPosition,
                             float radius, float coneHeight, bool upsideDown, int textureIndex, bool cutDetails, bool isTargetIntensity)
        {
            LazyLoad();
            Utils.Profiler.BeginSample("[Dig] Chunk.Modify");
            var center = operationTerrainPosition - worldPosition;

            voxelChunk.DoOperation(brush, action, intensity, center, radius, coneHeight, upsideDown, textureIndex,
                                   cutDetails, isTargetIntensity);

            for (var lodIndex = 0; lodIndex < chunkLodGroup.LODCount; ++lodIndex)
            {
                var lod            = ChunkLODGroup.IndexToLod(lodIndex);
                var nextVisualMesh = voxelChunk.BuildVisualMesh(lod);
                nextVisualMeshes.Add(nextVisualMesh);
#if UNITY_2019_3_OR_NEWER
                nextCollisionMeshes.Add(lodIndex == digger.ColliderLodIndex || chunkLodGroup.LODCount == 1 ? nextVisualMesh : null);
#else
                nextCollisionMeshes.Add(lodIndex == digger.ColliderLodIndex || chunkLodGroup.LODCount == 1
                                            ? voxelChunk.BuildCollisionMesh(lod)
                                            : null);
#endif
            }
#if !UNITY_2019_3_OR_NEWER
            EnsureNeededNeighboursExist();
#endif
            Utils.Profiler.EndSample();
        }
Esempio n. 2
0
        public void CreateWithoutOperation()
        {
            for (var lodIndex = 0; lodIndex < chunkLodGroup.LODCount; ++lodIndex)
            {
                var lod = ChunkLODGroup.IndexToLod(lodIndex);
#if UNITY_2019_3_OR_NEWER
                var collisionMesh =
                    lodIndex == digger.ColliderLodIndex || chunkLodGroup.LODCount == 1 ? voxelChunk.BuildVisualMesh(lod) : null;
#else
                var collisionMesh = lodIndex == digger.ColliderLodIndex || chunkLodGroup.LODCount == 1
                    ? voxelChunk.BuildCollisionMesh(lod)
                    : null;
#endif
                var res = chunkLodGroup.PostBuild(lodIndex, null, collisionMesh,
                                                  new ChunkTriggerBounds(digger.HeightmapScale, digger.SizeOfMesh));
                if (lodIndex == 0)
                {
                    hasVisualMesh = res;
                }
            }
        }
Esempio n. 3
0
        internal static Chunk CreateChunk(Vector3i chunkPosition,
                                          DiggerSystem digger,
                                          Terrain terrain,
                                          Material[] materials,
                                          int layer,
                                          string tag)
        {
            Utils.Profiler.BeginSample("CreateChunk");
            var voxelPosition = GetVoxelPosition(digger, chunkPosition);
            var worldPosition = (Vector3)voxelPosition;

            worldPosition.x *= digger.HeightmapScale.x;
            worldPosition.z *= digger.HeightmapScale.z;

            var go = new GameObject(GetName(chunkPosition));

            go.layer     = layer;
            go.hideFlags = digger.ShowDebug ? HideFlags.None : HideFlags.HideInHierarchy | HideFlags.HideInInspector;

            go.transform.parent        = digger.transform;
            go.transform.localPosition = worldPosition + Vector3.up * 0.001f;
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;

            var chunk = go.AddComponent <Chunk>();

            chunk.digger        = digger;
            chunk.chunkPosition = chunkPosition;
            chunk.voxelPosition = voxelPosition;
            chunk.worldPosition = worldPosition;
            chunk.sizeInWorld   = digger.SizeOfMesh * digger.HeightmapScale;
            chunk.chunkPosition = chunkPosition;

            chunk.voxelChunk    = VoxelChunk.Create(digger, chunk);
            chunk.chunkLodGroup = ChunkLODGroup.Create(chunkPosition, chunk, digger, terrain, materials, layer, tag);
            chunk.UpdateStaticEditorFlags();

            Utils.Profiler.EndSample();
            return(chunk);
        }
Esempio n. 4
0
        public void RebuildMeshes()
        {
            for (var lodIndex = 0; lodIndex < chunkLodGroup.LODCount; ++lodIndex)
            {
                var lod        = ChunkLODGroup.IndexToLod(lodIndex);
                var visualMesh = voxelChunk.BuildVisualMesh(lod);
#if UNITY_2019_3_OR_NEWER
                var collisionMesh =
                    lodIndex == digger.ColliderLodIndex || chunkLodGroup.LODCount == 1 ? visualMesh : null;
#else
                var collisionMesh = lodIndex == digger.ColliderLodIndex || chunkLodGroup.LODCount == 1
                    ? voxelChunk.BuildCollisionMesh(lod)
                    : null;
#endif

                var res = chunkLodGroup.PostBuild(lodIndex, visualMesh, collisionMesh, voxelChunk.TriggerBounds);
                if (lodIndex == 0)
                {
                    hasVisualMesh = res;
                }
            }
        }
Esempio n. 5
0
        internal static ChunkObject Create(int lod,
                                           Vector3i chunkPosition,
                                           ChunkLODGroup chunkLodGroup,
                                           bool hasCollider,
                                           DiggerSystem digger,
                                           Terrain terrain,
                                           Material[] materials,
                                           int layer,
                                           string tag)
        {
            Utils.Profiler.BeginSample("ChunkObject.Create");
            var go = new GameObject(GetName(chunkPosition));

            go.layer     = layer;
            go.tag       = tag;
            go.hideFlags = digger.ShowDebug ? HideFlags.None : HideFlags.HideInHierarchy | HideFlags.HideInInspector;

            go.transform.parent        = chunkLodGroup.transform;
            go.transform.localPosition = Vector3.zero;
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;

            var chunkObject = go.AddComponent <ChunkObject>();

            chunkObject.enabled      = false;
            chunkObject.hasCollider  = hasCollider;
            chunkObject.meshRenderer = go.AddComponent <MeshRenderer>();
            chunkObject.meshRenderer.lightmapScaleOffset         = digger.Terrain.lightmapScaleOffset;
            chunkObject.meshRenderer.realtimeLightmapScaleOffset = digger.Terrain.realtimeLightmapScaleOffset;
            chunkObject.meshRenderer.sharedMaterials             = materials ?? new Material[0];
            SetupMeshRenderer(digger.Terrain, chunkObject.meshRenderer);

            go.GetComponent <Renderer>().shadowCastingMode = ShadowCastingMode.On;
            go.GetComponent <Renderer>().receiveShadows    = true;
            chunkObject.filter = go.AddComponent <MeshFilter>();
            chunkObject.meshRenderer.enabled = false;

            if (hasCollider)
            {
                chunkObject.meshCollider = go.AddComponent <MeshCollider>();

#if !UNITY_2019_3_OR_NEWER
                var goCollider = new GameObject("ChunkTrigger");
                goCollider.transform.parent        = go.transform;
                goCollider.layer                   = layer;
                goCollider.transform.localPosition = Vector3.zero;
                var colliderHole = goCollider.AddComponent <TerrainColliderHoleComponent>();
                colliderHole.Digger          = digger;
                colliderHole.TerrainCollider = terrain.GetComponent <TerrainCollider>();

                chunkObject.holeCollider           = goCollider.AddComponent <BoxCollider>();
                chunkObject.holeCollider.isTrigger = true;
                chunkObject.holeCollider.enabled   = false;
#endif
            }

            chunkObject.UpdateStaticEditorFlags(lod, digger.EnableOcclusionCulling);

            Utils.Profiler.EndSample();
            return(chunkObject);
        }