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(); }
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; } } }
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); }
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; } } }
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); }