@@ -35,22 +35,27 @@ function TerrainConverter.new()
3535 return self
3636end
3737
38- function TerrainConverter :_canConvertPart (item )
39- if not item :IsA (" Part" ) then
40- return false
38+ function TerrainConverter :Convert (items , material )
39+ assert (items )
40+ assert (typeof (material ) == " EnumItem" )
41+
42+ local convertables = {}
43+ for _ , item in pairs (items ) do
44+ if self :_canConvertPart (item ) then
45+ table.insert (convertables , item )
46+ end
4147 end
4248
43- if item == Workspace .Terrain then
49+ -- don't fire change history service of nothing converts
50+ if # convertables <= 0 then
4451 return false
4552 end
4653
47- if item .Shape == Enum .PartType .Block then
48- return true
49- elseif item .Shape == Enum .PartType .Ball then
50- return true
51- else
52- return false
54+ self .ConversionStarting :Fire ()
55+ for _ , item in pairs (convertables ) do
56+ self :_convertPart (item , material )
5357 end
58+ return true
5459end
5560
5661function TerrainConverter :CanConvert (items )
@@ -67,6 +72,29 @@ function TerrainConverter:CanConvert(items)
6772 return false
6873end
6974
75+
76+ function TerrainConverter :_canConvertPart (item )
77+ if not (item :IsA (" Part" ) or item :IsA (" WedgePart" )) then
78+ return false
79+ end
80+
81+ if item == Workspace .Terrain then
82+ return false
83+ end
84+
85+ if item :IsA (" WedgePart" ) then
86+ return true
87+ elseif item .Shape == Enum .PartType .Block then
88+ return true
89+ elseif item .Shape == Enum .PartType .Ball then
90+ return true
91+ elseif item .Shape == Enum .PartType .Cylinder then
92+ return true
93+ else
94+ return false
95+ end
96+ end
97+
7098function TerrainConverter :_getOverwriteMaterials ()
7199 local materials = {}
72100 materials [Enum .Material .Air ] = true
@@ -101,6 +129,51 @@ function TerrainConverter:_doFillUpwards(cellMaterial, desiredMaterial)
101129 return true
102130end
103131
132+ function TerrainConverter :_convertPart (part , material )
133+ assert (typeof (material ) == " EnumItem" )
134+ assert (part :IsA (" Part" ) or part :IsA (" WedgePart" ))
135+
136+ if part :IsA (" WedgePart" ) then
137+ self :_fillWedge (part .CFrame , part .Size , material )
138+ elseif part .Shape == Enum .PartType .Block then
139+ self :_fillBlock (part .CFrame , part .Size , material )
140+ elseif part .Shape == Enum .PartType .Ball then
141+ self :_fillBall (part .Position , part .Size .x / 2 , material )
142+ elseif part .Shape == Enum .PartType .Cylinder then
143+ local size = part .Size
144+ local height = size .x
145+ local radius = math.min (size .y , size .z )
146+ self :_fillCylinder (part .CFrame * CFrame .Angles (0 , 0 , math.pi / 2 ), height , radius , material )
147+ else
148+ warn ((" [PartToTerrain] - Bad part.Shape, '%s' is not supported" ):format (tostring (part .Shape .Name )))
149+ return false
150+ end
151+
152+ if not self .KeepConvertedPart .Value then
153+ part :Remove ()
154+ end
155+
156+ return true
157+ end
158+
159+ function TerrainConverter :_fillWedge (wedgeCFrame , wedgeSize , desiredMaterial )
160+ if (self .OverwriteTerrain .Value and self .OverwriteWater .Value ) then
161+ Workspace .Terrain :FillWedge (wedgeCFrame , wedgeSize , desiredMaterial )
162+ return
163+ end
164+
165+ warn (" [TerrainConverter._fillWedge] - Cannot convert wedge with overwrite terrain, or overwrite water enabled!" )
166+ end
167+
168+ function TerrainConverter :_fillCylinder (cylinderCFrame , height , radius , desiredMaterial )
169+ if (self .OverwriteTerrain .Value and self .OverwriteWater .Value ) then
170+ Workspace .Terrain :FillCylinder (cylinderCFrame , height , radius , desiredMaterial )
171+ return
172+ end
173+
174+ warn (" [TerrainConverter._fillCylinder] - Cannot convert wedge with overwrite terrain, or overwrite water enabled!" )
175+ end
176+
104177function TerrainConverter :_fillBlock (blockCFrame , blockSize , desiredMaterial )
105178 if (self .OverwriteTerrain .Value and self .OverwriteWater .Value ) then
106179 Workspace .Terrain :FillBlock (blockCFrame , blockSize , desiredMaterial )
@@ -251,51 +324,6 @@ function TerrainConverter:_fillBall(center, radius, desiredMaterial)
251324 end
252325
253326 Workspace .Terrain :WriteVoxels (region , resolution , materialVoxels , occupancyVoxels )
254- print (" Done writing voxels" )
255- end
256-
257- function TerrainConverter :_convertPart (part , material )
258- assert (typeof (material ) == " EnumItem" )
259- assert (part :IsA (" Part" ))
260-
261- if part .Shape == Enum .PartType .Block then
262- self :_fillBlock (part .CFrame , part .Size , material )
263- elseif part .Shape == Enum .PartType .Ball then
264- self :_fillBall (part .Position , part .Size .x / 2 , material )
265- else
266- warn ((" [PartToTerrain] - Bad part.Shape, '%s' is not supported" ):format (tostring (part .Shape .Name )))
267- return false
268- end
269-
270- if not self .KeepConvertedPart .Value then
271- part :Remove ()
272- end
273-
274- return true
275- end
276-
277-
278- function TerrainConverter :Convert (items , material )
279- assert (items )
280- assert (typeof (material ) == " EnumItem" )
281-
282- local convertables = {}
283- for _ , item in pairs (items ) do
284- if self :_canConvertPart (item ) then
285- table.insert (convertables , item )
286- end
287- end
288-
289- -- don't fire change history service of nothing converts
290- if # convertables <= 0 then
291- return false
292- end
293-
294- self .ConversionStarting :Fire ()
295- for _ , item in pairs (convertables ) do
296- self :_convertPart (item , material )
297- end
298- return true
299327end
300328
301329return TerrainConverter
0 commit comments