55local Signal = require (script .Parent .Signal )
66local BoundingBox = require (script .Parent .BoundingBox )
77local Draw = require (script .Parent .Draw )
8+ local BasicPane = require (script .Parent .BasicPane )
9+ local terrainMaterialList = require (script .Parent .terrainMaterialList )
810
9- local MATERIAL_AIR = Enum .Material .Air
10-
11- local TerrainConverter = {}
11+ local TerrainConverter = setmetatable ({}, BasicPane )
1212TerrainConverter .ClassName = " TerrainConverter"
1313TerrainConverter .__index = TerrainConverter
1414TerrainConverter .RESOLUTION = 4
1515
1616function TerrainConverter .new ()
17- local self = setmetatable ({} , TerrainConverter )
17+ local self = setmetatable (BasicPane . new () , TerrainConverter )
1818
1919 self .KeepConvertedPart = Instance .new (" BoolValue" )
2020 self .KeepConvertedPart .Value = true
21+ self ._maid :GiveTask (self .KeepConvertedPart )
22+
23+ self .OverwriteTerrain = Instance .new (" BoolValue" )
24+ self .OverwriteTerrain .Value = true
25+ self ._maid :GiveTask (self .OverwriteTerrain )
2126
22- self .ReplaceExistingTerrain = Instance .new (" BoolValue" )
23- self .ReplaceExistingTerrain .Value = true
27+ self .OverwriteWater = Instance .new (" BoolValue" )
28+ self .OverwriteWater .Value = true
29+ self ._maid :GiveTask (self .OverwriteWater )
2430
2531 self .ConversionStarting = Signal .new ()
32+ self ._maid :GiveTask (self .ConversionStarting )
33+
34+ -- Make sure the user can always overwrite _something)
35+ self ._maid :GiveTask (self .OverwriteTerrain .Changed :Connect (function ()
36+ if not self .OverwriteTerrain .Value and not self .OverwriteWater .Value then
37+ self .OverwriteWater .Value = true
38+ end
39+ end ))
40+ self ._maid :GiveTask (self .OverwriteWater .Changed :Connect (function ()
41+ if not self .OverwriteTerrain .Value and not self .OverwriteWater .Value then
42+ self .OverwriteTerrain .Value = true
43+ end
44+ end ))
45+
2646
2747 return self
2848end
@@ -59,12 +79,43 @@ function TerrainConverter:CanConvert(items)
5979 return false
6080end
6181
82+ function TerrainConverter :_getOverwriteMaterials ()
83+ local materials = {}
84+
85+ if self .OverwriteTerrain .Value then
86+ for _ , item in pairs (terrainMaterialList ) do
87+ materials [item .enum ] = true
88+ end
89+
90+ -- don't remove air, it shouldn't matter
91+ -- materials[Enum.Material.Air] = nil
92+ else
93+ materials [Enum .Material .Air ] = true
94+ end
95+
96+ if self .OverwriteWater .Value then
97+ materials [Enum .Material .Water ] = true
98+ else
99+ materials [Enum .Material .Water ] = nil
100+ end
101+
102+ return materials
103+ end
104+
105+
62106function TerrainConverter :_fillBlock (blockCFrame , blockSize , desiredMaterial )
63- if self .ReplaceExistingTerrain .Value then
107+ if not self .OverwriteTerrain .Value and not self .OverwriteWater .Value then
108+ warn (" [TerrainConverter] - Doing nothing -- OverwriteWater and OverwriteTerrain are both disabled" )
109+ return
110+ end
111+ if (self .OverwriteTerrain .Value and self .OverwriteWater .Value )
112+ or (desiredMaterial == Enum .Material .Air and self .OverwriteWater .Value ) then
64113 workspace .Terrain :FillBlock (blockCFrame , blockSize , desiredMaterial )
65114 return
66115 end
67116
117+ local overwriteMaterials = self :_getOverwriteMaterials ()
118+
68119 -- https://pastebin.com/S03Q8ftH
69120
70121 local aa_size , aa_position = BoundingBox .GetBoundingBox ({{
@@ -123,7 +174,7 @@ function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
123174 -- Use terrain tools filling behavior here
124175 if smallestSize <= 2 then
125176 if brushOccupancy >= 0.1 then
126- if cellMaterial == MATERIAL_AIR or cellOccupancy <= 0 then
177+ if overwriteMaterials [ cellMaterial ] or cellOccupancy <= 0 then
127178 materialVoxels [x ][y ][z ] = desiredMaterial
128179 end
129180 occupancyVoxels [x ][y ][z ] = 1
@@ -132,7 +183,7 @@ function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
132183 if brushOccupancy > cellOccupancy then
133184 occupancyVoxels [x ][y ][z ] = brushOccupancy
134185 end
135- if brushOccupancy >= 0.1 and cellMaterial == MATERIAL_AIR then
186+ if brushOccupancy >= 0.1 and overwriteMaterials [ cellMaterial ] then
136187 materialVoxels [x ][y ][z ] = desiredMaterial
137188 end
138189 end
@@ -143,13 +194,20 @@ function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
143194 workspace .Terrain :WriteVoxels (region , self .RESOLUTION , materialVoxels , occupancyVoxels )
144195end
145196
146-
147197function TerrainConverter :_fillBall (center , radius , desiredMaterial )
148- if self .ReplaceExistingTerrain .Value then
198+ if not self .OverwriteTerrain .Value and not self .OverwriteWater .Value then
199+ warn (" [TerrainConverter] - Doing nothing -- OverwriteWater and OverwriteTerrain are both disabled" )
200+ return
201+ end
202+
203+ if (self .OverwriteTerrain .Value and self .OverwriteWater .Value )
204+ or (desiredMaterial == Enum .Material .Air and self .OverwriteWater .Value ) then
149205 workspace .Terrain :FillBall (center , radius , desiredMaterial )
150206 return
151207 end
152208
209+ local overwriteMaterials = self :_getOverwriteMaterials ()
210+
153211 local resolution = self .RESOLUTION
154212
155213 local radius3 = Vector3 .new (radius , radius , radius )
@@ -177,7 +235,7 @@ function TerrainConverter:_fillBall(center, radius, desiredMaterial)
177235 -- Use terrain tools filling behavior here
178236 if radius <= 2 then
179237 if brushOccupancy >= 0.5 then
180- if cellMaterial == MATERIAL_AIR or cellOccupancy <= 0 then
238+ if overwriteMaterials [ cellMaterial ] or cellOccupancy <= 0 then
181239 materialVoxels [x ][y ][z ] = desiredMaterial
182240 end
183241 occupancyVoxels [x ][y ][z ] = 1
@@ -186,7 +244,7 @@ function TerrainConverter:_fillBall(center, radius, desiredMaterial)
186244 if brushOccupancy > cellOccupancy then
187245 occupancyVoxels [x ][y ][z ] = brushOccupancy
188246 end
189- if brushOccupancy >= 0.5 and cellMaterial == MATERIAL_AIR then
247+ if brushOccupancy >= 0.5 and overwriteMaterials [ cellMaterial ] then
190248 materialVoxels [x ][y ][z ] = desiredMaterial
191249 end
192250 end
0 commit comments