1 # SPDX-FileCopyrightText: 2017-2022 Blender Foundation
3 # SPDX-License-Identifier: GPL-2.0-or-later
5 # Another Noise Tool - Suite (W.I.P.)
6 # Jimmy Hazevoet 5/2017
9 "name": "A.N.T.Landscape",
10 "author": "Jimmy Hazevoet",
12 "blender": (2, 80, 0),
13 "location": "View3D > Sidebar > Create Tab",
14 "description": "Another Noise Tool: Landscape and Displace",
16 "doc_url": "{BLENDER_MANUAL_URL}/addons/add_mesh/ant_landscape.html",
17 "category": "Add Mesh",
22 importlib
.reload(add_mesh_ant_landscape
)
23 importlib
.reload(mesh_ant_displace
)
24 importlib
.reload(ant_functions
)
25 importlib
.reload(ant_noise
)
27 from ant_landscape
import add_mesh_ant_landscape
28 from ant_landscape
import mesh_ant_displace
29 from ant_landscape
import ant_functions
30 from ant_landscape
import ant_noise
34 from bpy
.props
import (
42 from .ant_functions
import (
49 # ------------------------------------------------------------
53 def menu_func_eroder(self
, context
):
54 ob
= bpy
.context
.active_object
55 if ob
and (ob
.ant_landscape
.keys() and not ob
.ant_landscape
['sphere_mesh']):
56 self
.layout
.operator('mesh.eroder', text
="Landscape Eroder", icon
='SMOOTHCURVE')
59 def menu_func_landscape(self
, context
):
62 self
.layout
.operator('mesh.landscape_add', text
="Landscape", icon
="RNDCURVE")
66 class AntLandscapeAddPanel(bpy
.types
.Panel
):
67 bl_category
= "Create"
68 bl_label
= "Landscape"
69 bl_idname
= "ANTLANDSCAPE_PT_add"
70 bl_space_type
= "VIEW_3D"
72 bl_context
= "objectmode"
73 bl_options
= {'DEFAULT_CLOSED'}
75 def draw(self
, context
):
76 col
= self
.layout
.column()
77 col
.operator('mesh.landscape_add', text
="Landscape", icon
="RNDCURVE")
81 class AntLandscapeToolsPanel(bpy
.types
.Panel
):
82 bl_category
= "Create"
83 bl_label
= "Landscape Tools"
84 bl_idname
= "ANTLANDSCAPE_PT_tools"
85 bl_space_type
= "VIEW_3D"
87 bl_context
= "objectmode"
88 bl_options
= {'DEFAULT_CLOSED'}
91 def poll(cls
, context
):
92 ob
= bpy
.context
.active_object
93 return (ob
and ob
.type == 'MESH')
95 def draw(self
, context
):
97 ob
= context
.active_object
99 col
.operator('mesh.ant_displace', text
="Mesh Displace", icon
="RNDCURVE")
100 col
.operator('mesh.ant_slope_map', icon
='GROUP_VERTEX')
101 if ob
.ant_landscape
.keys() and not ob
.ant_landscape
['sphere_mesh']:
102 col
.operator('mesh.eroder', text
="Landscape Eroder", icon
='SMOOTHCURVE')
105 # Landscape Main Settings
106 class AntMainSettingsPanel(bpy
.types
.Panel
):
107 bl_category
= "Create"
108 bl_label
= "Landscape Main"
109 bl_idname
= "ANTLANDSCAPE_PT_main"
110 bl_space_type
= "VIEW_3D"
111 bl_region_type
= "UI"
112 bl_options
= {'DEFAULT_CLOSED'}
115 def poll(cls
, context
):
116 ob
= bpy
.context
.active_object
117 return ob
.ant_landscape
.keys() if ob
else False
119 def draw(self
, context
):
121 scene
= context
.scene
122 ob
= bpy
.context
.active_object
123 ant
= ob
.ant_landscape
125 col
= box
.column(align
=False)
127 col
.operator('mesh.ant_landscape_regenerate', text
="Regenerate", icon
="LOOP_FORWARDS")
128 row
= box
.row(align
=True)
129 split
= row
.split(align
=True)
130 split
.prop(ant
, "smooth_mesh", toggle
=True, text
="Smooth", icon
='SHADING_SOLID')
131 split
.prop(ant
, "tri_face", toggle
=True, text
="Triangulate", icon
='MESH_DATA')
133 split
.prop(ant
, "remove_double", toggle
=True, text
="Remove Doubles", icon
='MESH_DATA')
134 box
.prop(ant
, "ant_terrain_name")
135 box
.prop_search(ant
, "land_material", bpy
.data
, "materials")
136 col
= box
.column(align
=True)
137 col
.prop(ant
, "subdivision_x")
138 col
.prop(ant
, "subdivision_y")
139 col
= box
.column(align
=True)
141 col
.prop(ant
, "mesh_size")
143 col
.prop(ant
, "mesh_size_x")
144 col
.prop(ant
, "mesh_size_y")
147 # Landscape Noise Settings
148 class AntNoiseSettingsPanel(bpy
.types
.Panel
):
149 bl_category
= "Create"
150 bl_label
= "Landscape Noise"
151 bl_idname
= "ANTLANDSCAPE_PT_noise"
152 bl_space_type
= "VIEW_3D"
153 bl_region_type
= "UI"
154 bl_options
= {'DEFAULT_CLOSED'}
157 def poll(cls
, context
):
158 ob
= bpy
.context
.active_object
159 return ob
.ant_landscape
.keys() if ob
else False
161 def draw(self
, context
):
163 scene
= context
.scene
164 ob
= bpy
.context
.active_object
165 ant
= ob
.ant_landscape
167 col
= box
.column(align
=True)
170 col
.operator('mesh.ant_landscape_regenerate', text
="Regenerate", icon
="LOOP_FORWARDS")
172 col
.operator('mesh.ant_landscape_refresh', text
="Refresh", icon
="FILE_REFRESH")
174 box
.prop(ant
, "noise_type")
175 if ant
.noise_type
== "blender_texture":
176 box
.prop_search(ant
, "texture_block", bpy
.data
, "textures")
178 box
.prop(ant
, "basis_type")
180 col
= box
.column(align
=True)
181 col
.prop(ant
, "random_seed")
182 col
= box
.column(align
=True)
183 col
.prop(ant
, "noise_offset_x")
184 col
.prop(ant
, "noise_offset_y")
186 col
.prop(ant
, "noise_offset_z")
187 col
.prop(ant
, "noise_size_x")
188 col
.prop(ant
, "noise_size_y")
190 col
.prop(ant
, "noise_size_z")
191 col
= box
.column(align
=True)
192 col
.prop(ant
, "noise_size")
194 col
= box
.column(align
=True)
195 if ant
.noise_type
== "multi_fractal":
196 col
.prop(ant
, "noise_depth")
197 col
.prop(ant
, "dimension")
198 col
.prop(ant
, "lacunarity")
199 elif ant
.noise_type
== "ridged_multi_fractal":
200 col
.prop(ant
, "noise_depth")
201 col
.prop(ant
, "dimension")
202 col
.prop(ant
, "lacunarity")
203 col
.prop(ant
, "offset")
204 col
.prop(ant
, "gain")
205 elif ant
.noise_type
== "hybrid_multi_fractal":
206 col
.prop(ant
, "noise_depth")
207 col
.prop(ant
, "dimension")
208 col
.prop(ant
, "lacunarity")
209 col
.prop(ant
, "offset")
210 col
.prop(ant
, "gain")
211 elif ant
.noise_type
== "hetero_terrain":
212 col
.prop(ant
, "noise_depth")
213 col
.prop(ant
, "dimension")
214 col
.prop(ant
, "lacunarity")
215 col
.prop(ant
, "offset")
216 elif ant
.noise_type
== "fractal":
217 col
.prop(ant
, "noise_depth")
218 col
.prop(ant
, "dimension")
219 col
.prop(ant
, "lacunarity")
220 elif ant
.noise_type
== "turbulence_vector":
221 col
.prop(ant
, "noise_depth")
222 col
.prop(ant
, "amplitude")
223 col
.prop(ant
, "frequency")
225 row
= col
.row(align
=True)
226 row
.prop(ant
, "hard_noise", expand
=True)
227 elif ant
.noise_type
== "variable_lacunarity":
228 box
.prop(ant
, "vl_basis_type")
229 box
.prop(ant
, "distortion")
230 elif ant
.noise_type
== "marble_noise":
231 box
.prop(ant
, "marble_shape")
232 box
.prop(ant
, "marble_bias")
233 box
.prop(ant
, "marble_sharp")
234 col
= box
.column(align
=True)
235 col
.prop(ant
, "distortion")
236 col
.prop(ant
, "noise_depth")
238 row
= col
.row(align
=True)
239 row
.prop(ant
, "hard_noise", expand
=True)
240 elif ant
.noise_type
== "shattered_hterrain":
241 col
.prop(ant
, "noise_depth")
242 col
.prop(ant
, "dimension")
243 col
.prop(ant
, "lacunarity")
244 col
.prop(ant
, "offset")
245 col
.prop(ant
, "distortion")
246 elif ant
.noise_type
== "strata_hterrain":
247 col
.prop(ant
, "noise_depth")
248 col
.prop(ant
, "dimension")
249 col
.prop(ant
, "lacunarity")
250 col
.prop(ant
, "offset")
251 col
.prop(ant
, "distortion", text
="Strata")
252 elif ant
.noise_type
== "ant_turbulence":
253 col
.prop(ant
, "noise_depth")
254 col
.prop(ant
, "amplitude")
255 col
.prop(ant
, "frequency")
256 col
.prop(ant
, "distortion")
258 row
= col
.row(align
=True)
259 row
.prop(ant
, "hard_noise", expand
=True)
260 elif ant
.noise_type
== "vl_noise_turbulence":
261 col
.prop(ant
, "noise_depth")
262 col
.prop(ant
, "amplitude")
263 col
.prop(ant
, "frequency")
264 col
.prop(ant
, "distortion")
266 box
.prop(ant
, "vl_basis_type")
268 row
= col
.row(align
=True)
269 row
.prop(ant
, "hard_noise", expand
=True)
270 elif ant
.noise_type
== "vl_hTerrain":
271 col
.prop(ant
, "noise_depth")
272 col
.prop(ant
, "dimension")
273 col
.prop(ant
, "lacunarity")
274 col
.prop(ant
, "offset")
275 col
.prop(ant
, "distortion")
277 box
.prop(ant
, "vl_basis_type")
278 elif ant
.noise_type
== "distorted_heteroTerrain":
279 col
.prop(ant
, "noise_depth")
280 col
.prop(ant
, "dimension")
281 col
.prop(ant
, "lacunarity")
282 col
.prop(ant
, "offset")
283 col
.prop(ant
, "distortion")
285 col
.prop(ant
, "vl_basis_type")
286 elif ant
.noise_type
== "double_multiFractal":
287 col
.prop(ant
, "noise_depth")
288 col
.prop(ant
, "dimension")
289 col
.prop(ant
, "lacunarity")
290 col
.prop(ant
, "offset")
291 col
.prop(ant
, "gain")
293 box
.prop(ant
, "vl_basis_type")
294 elif ant
.noise_type
== "rocks_noise":
295 col
.prop(ant
, "noise_depth")
296 col
.prop(ant
, "distortion")
298 row
= col
.row(align
=True)
299 row
.prop(ant
, "hard_noise", expand
=True)
300 elif ant
.noise_type
== "slick_rock":
301 col
.prop(ant
, "noise_depth")
302 col
.prop(ant
, "dimension")
303 col
.prop(ant
, "lacunarity")
304 col
.prop(ant
, "gain")
305 col
.prop(ant
, "offset")
306 col
.prop(ant
, "distortion")
308 box
.prop(ant
, "vl_basis_type")
309 elif ant
.noise_type
== "planet_noise":
310 col
.prop(ant
, "noise_depth")
312 row
= col
.row(align
=True)
313 row
.prop(ant
, "hard_noise", expand
=True)
316 col
= box
.column(align
=False)
317 box
.prop(ant
, "fx_type")
318 if ant
.fx_type
!= "0":
319 if int(ant
.fx_type
) <= 12:
320 box
.prop(ant
, "fx_bias")
322 box
.prop(ant
, "fx_mix_mode")
323 col
= box
.column(align
=True)
324 col
.prop(ant
, "fx_mixfactor")
326 col
= box
.column(align
=True)
327 col
.prop(ant
, "fx_loc_x")
328 col
.prop(ant
, "fx_loc_y")
329 col
.prop(ant
, "fx_size")
331 col
= box
.column(align
=True)
332 col
.prop(ant
, "fx_depth")
333 if ant
.fx_depth
!= 0:
334 col
.prop(ant
, "fx_frequency")
335 col
.prop(ant
, "fx_amplitude")
336 col
.prop(ant
, "fx_turb")
338 col
= box
.column(align
=True)
339 row
= col
.row(align
=True).split(factor
=0.92, align
=True)
340 row
.prop(ant
, "fx_height")
341 row
.prop(ant
, "fx_invert", toggle
=True, text
="", icon
='ARROW_LEFTRIGHT')
342 col
.prop(ant
, "fx_offset")
345 # Landscape Displace Settings
346 class AntDisplaceSettingsPanel(bpy
.types
.Panel
):
347 bl_category
= "Create"
348 bl_label
= "Landscape Displace"
349 bl_idname
= "ANTLANDSCAPE_PT_disp"
350 bl_space_type
= "VIEW_3D"
351 bl_region_type
= "UI"
352 bl_options
= {'DEFAULT_CLOSED'}
355 def poll(cls
, context
):
356 ob
= bpy
.context
.active_object
357 return ob
.ant_landscape
.keys() if ob
else False
359 def draw(self
, context
):
361 scene
= context
.scene
362 ob
= bpy
.context
.active_object
363 ant
= ob
.ant_landscape
365 col
= box
.column(align
=True)
368 col
.operator('mesh.ant_landscape_regenerate', text
="Regenerate", icon
="LOOP_FORWARDS")
370 col
.operator('mesh.ant_landscape_refresh', text
="Refresh", icon
="FILE_REFRESH")
372 col
= box
.column(align
=True)
373 row
= col
.row(align
=True).split(factor
=0.92, align
=True)
374 row
.prop(ant
, "height")
375 row
.prop(ant
, "height_invert", toggle
=True, text
="", icon
='ARROW_LEFTRIGHT')
376 col
.prop(ant
, "height_offset")
377 col
.prop(ant
, "maximum")
378 col
.prop(ant
, "minimum")
379 if not ant
.sphere_mesh
:
381 col
.prop(ant
, "edge_falloff")
382 if ant
.edge_falloff
!= "0":
383 col
= box
.column(align
=True)
384 col
.prop(ant
, "edge_level")
385 if ant
.edge_falloff
in ["2", "3"]:
386 col
.prop(ant
, "falloff_x")
387 if ant
.edge_falloff
in ["1", "3"]:
388 col
.prop(ant
, "falloff_y")
391 col
.prop(ant
, "strata_type")
392 if ant
.strata_type
!= "0":
394 col
.prop(ant
, "strata")
396 col
.prop_search(ant
, "vert_group", ob
, "vertex_groups")
399 # ------------------------------------------------------------
401 class AntLandscapePropertiesGroup(bpy
.types
.PropertyGroup
):
403 ant_terrain_name
: StringProperty(
407 land_material
: StringProperty(
410 description
="Terrain material"
412 water_material
: StringProperty(
415 description
="Water plane material"
417 texture_block
: StringProperty(
421 at_cursor
: BoolProperty(
424 description
="Place at cursor location",
426 smooth_mesh
: BoolProperty(
429 description
="Shade smooth"
431 tri_face
: BoolProperty(
434 description
="Triangulate faces"
436 sphere_mesh
: BoolProperty(
439 description
="Generate uv sphere - remove doubles when ready"
441 subdivision_x
: IntProperty(
442 name
="Subdivisions X",
446 description
="Mesh X subdivisions"
448 subdivision_y
: IntProperty(
450 name
="Subdivisions Y",
453 description
="Mesh Y subdivisions"
455 mesh_size
: FloatProperty(
460 description
="Mesh size"
462 mesh_size_x
: FloatProperty(
466 description
="Mesh x size"
468 mesh_size_y
: FloatProperty(
472 description
="Mesh y size"
475 random_seed
: IntProperty(
479 description
="Randomize noise origin"
481 noise_offset_x
: FloatProperty(
484 description
="Noise X Offset"
486 noise_offset_y
: FloatProperty(
489 description
="Noise Y Offset"
491 noise_offset_z
: FloatProperty(
494 description
="Noise Z Offset"
496 noise_size_x
: FloatProperty(
501 description
="Noise x size"
503 noise_size_y
: FloatProperty(
508 description
="Noise y size"
510 noise_size_z
: FloatProperty(
515 description
="Noise Z size"
517 noise_size
: FloatProperty(
522 description
="Noise size"
524 noise_type
: EnumProperty(
526 default
='hetero_terrain',
527 description
="Noise type",
529 ('multi_fractal', "Multi Fractal", "Blender: Multi Fractal algorithm", 0),
530 ('ridged_multi_fractal', "Ridged MFractal", "Blender: Ridged Multi Fractal", 1),
531 ('hybrid_multi_fractal', "Hybrid MFractal", "Blender: Hybrid Multi Fractal", 2),
532 ('hetero_terrain', "Hetero Terrain", "Blender: Hetero Terrain", 3),
533 ('fractal', "fBm Fractal", "Blender: fBm - Fractional Browninian motion", 4),
534 ('turbulence_vector', "Turbulence", "Blender: Turbulence Vector", 5),
535 ('variable_lacunarity', "Distorted Noise", "Blender: Distorted Noise", 6),
536 ('marble_noise', "Marble", "A.N.T.: Marble Noise", 7),
537 ('shattered_hterrain', "Shattered hTerrain", "A.N.T.: Shattered hTerrain", 8),
538 ('strata_hterrain', "Strata hTerrain", "A.N.T: Strata hTerrain", 9),
539 ('ant_turbulence', "Another Noise", "A.N.T: Turbulence variation", 10),
540 ('vl_noise_turbulence', "vlNoise turbulence", "A.N.T: Real vlNoise turbulence", 11),
541 ('vl_hTerrain', "vlNoise hTerrain", "A.N.T: vlNoise hTerrain", 12),
542 ('distorted_heteroTerrain', "Distorted hTerrain", "A.N.T distorted hTerrain", 13),
543 ('double_multiFractal', "Double MultiFractal", "A.N.T: double multiFractal", 14),
544 ('rocks_noise', "Noise Rocks", "A.N.T: turbulence variation", 15),
545 ('slick_rock', "Slick Rock", "A.N.T: slick rock", 16),
546 ('planet_noise', "Planet Noise", "Planet Noise by: Farsthary", 17),
547 ('blender_texture', "Blender Texture - Texture Nodes", "Blender texture data block", 18)]
549 basis_type
: EnumProperty(
551 default
=ant_noise
.noise_basis_default
,
552 description
="Noise basis algorithms",
553 items
=ant_noise
.noise_basis
555 vl_basis_type
: EnumProperty(
556 name
="vlNoise Basis",
557 default
=ant_noise
.noise_basis_default
,
558 description
="VLNoise basis algorithms",
559 items
=ant_noise
.noise_basis
561 distortion
: FloatProperty(
566 description
="Distortion amount"
568 hard_noise
: EnumProperty(
571 description
="Soft Noise, Hard noise",
573 ("0", "Soft", "Soft Noise", 0),
574 ("1", "Hard", "Hard noise", 1)]
576 noise_depth
: IntProperty(
581 description
="Noise Depth - number of frequencies in the fBm"
583 amplitude
: FloatProperty(
588 description
="Amplitude"
590 frequency
: FloatProperty(
595 description
="Frequency"
597 dimension
: FloatProperty(
602 description
="H - fractal dimension of the roughest areas"
604 lacunarity
: FloatProperty(
609 description
="Lacunarity - gap between successive frequencies"
611 offset
: FloatProperty(
616 description
="Offset - raises the terrain from sea level"
623 description
="Gain - scale factor"
625 marble_bias
: EnumProperty(
628 description
="Marble bias",
630 ("0", "Sin", "Sin", 0),
631 ("1", "Cos", "Cos", 1),
632 ("2", "Tri", "Tri", 2),
633 ("3", "Saw", "Saw", 3)]
635 marble_sharp
: EnumProperty(
638 description
="Marble sharpness",
640 ("0", "Soft", "Soft", 0),
641 ("1", "Sharp", "Sharp", 1),
642 ("2", "Sharper", "Sharper", 2),
643 ("3", "Soft inv.", "Soft", 3),
644 ("4", "Sharp inv.", "Sharp", 4),
645 ("5", "Sharper inv.", "Sharper", 5)]
647 marble_shape
: EnumProperty(
650 description
="Marble shape",
652 ("0", "Default", "Default", 0),
653 ("1", "Ring", "Ring", 1),
654 ("2", "Swirl", "Swirl", 2),
655 ("3", "Bump", "Bump", 3),
656 ("4", "Wave", "Wave", 4),
661 height
: FloatProperty(
666 description
="Noise intensity scale"
668 height_invert
: BoolProperty(
671 description
="Height invert",
673 height_offset
: FloatProperty(
678 description
="Height offset"
680 fx_mixfactor
: FloatProperty(
685 description
="Effect mix factor: -1.0 = Noise, +1.0 = Effect"
687 fx_mix_mode
: EnumProperty(
690 description
="Effect mix mode",
692 ("0", "Mix", "Mix", 0),
693 ("1", "Add", "Add", 1),
694 ("2", "Sub", "Subtract", 2),
695 ("3", "Mul", "Multiply", 3),
696 ("4", "Abs", "Absolute", 4),
697 ("5", "Scr", "Screen", 5),
698 ("6", "Mod", "Modulo", 6),
699 ("7", "Min", "Minimum", 7),
700 ("8", "Max", "Maximum", 8)
703 fx_type
: EnumProperty(
706 description
="Effect type",
708 ("0", "None", "No effect", 0),
709 ("1", "Gradient", "Gradient", 1),
710 ("2", "Waves", "Waves - Bumps", 2),
711 ("3", "Zigzag", "Zigzag", 3),
712 ("4", "Wavy", "Wavy", 4),
713 ("5", "Bump", "Bump", 5),
714 ("6", "Dots", "Dots", 6),
715 ("7", "Rings", "Rings", 7),
716 ("8", "Spiral", "Spiral", 8),
717 ("9", "Square", "Square", 9),
718 ("10", "Blocks", "Blocks", 10),
719 ("11", "Grid", "Grid", 11),
720 ("12", "Tech", "Tech", 12),
721 ("13", "Crackle", "Crackle", 13),
722 ("14", "Cracks", "Cracks", 14),
723 ("15", "Rock", "Rock noise", 15),
724 ("16", "Lunar", "Craters", 16),
725 ("17", "Cosine", "Cosine", 17),
726 ("18", "Spikey", "Spikey", 18),
727 ("19", "Stone", "Stone", 19),
728 ("20", "Flat Turb", "Flat turbulence", 20),
729 ("21", "Flat Voronoi", "Flat voronoi", 21)
732 fx_bias
: EnumProperty(
735 description
="Effect bias type",
737 ("0", "Sin", "Sin", 0),
738 ("1", "Cos", "Cos", 1),
739 ("2", "Tri", "Tri", 2),
740 ("3", "Saw", "Saw", 3),
741 ("4", "None", "None", 4)]
743 fx_turb
: FloatProperty(
748 description
="Effect turbulence distortion"
750 fx_depth
: IntProperty(
755 description
="Effect depth - number of frequencies"
757 fx_amplitude
: FloatProperty(
762 description
="Amplitude"
764 fx_frequency
: FloatProperty(
769 description
="Frequency"
771 fx_size
: FloatProperty(
776 description
="Effect size"
778 fx_loc_x
: FloatProperty(
781 description
="Effect x offset"
783 fx_loc_y
: FloatProperty(
786 description
="Effect y offset"
788 fx_height
: FloatProperty(
793 description
="Effect intensity scale"
795 fx_invert
: BoolProperty(
798 description
="Effect invert"
800 fx_offset
: FloatProperty(
805 description
="Effect height offset"
808 edge_falloff
: EnumProperty(
811 description
="Flatten edges",
813 ("0", "None", "None", 0),
814 ("1", "Y", "Y Falloff", 1),
815 ("2", "X", "X Falloff", 2),
816 ("3", "X Y", "X Y Falloff", 3)]
818 falloff_x
: FloatProperty(
823 description
="Falloff x scale"
825 falloff_y
: FloatProperty(
830 description
="Falloff y scale"
832 edge_level
: FloatProperty(
837 description
="Edge level, sealevel offset"
839 maximum
: FloatProperty(
844 description
="Maximum, flattens terrain at plateau level"
846 minimum
: FloatProperty(
851 description
="Minimum, flattens terrain at seabed level"
853 vert_group
: StringProperty(
857 strata
: FloatProperty(
862 description
="Strata layers / terraces"
864 strata_type
: EnumProperty(
867 description
="Strata types",
869 ("0", "None", "No strata", 0),
870 ("1", "Smooth", "Smooth transitions", 1),
871 ("2", "Sharp Sub", "Sharp subtract transitions", 2),
872 ("3", "Sharp Add", "Sharp add transitions", 3),
873 ("4", "Quantize", "Quantize", 4),
874 ("5", "Quantize Mix", "Quantize mixed", 5)]
876 water_plane
: BoolProperty(
879 description
="Add water plane"
881 water_level
: FloatProperty(
886 description
="Water level"
888 remove_double
: BoolProperty(
889 name
="Remove Doubles",
891 description
="Remove doubles"
893 refresh
: BoolProperty(
896 description
="Refresh"
898 auto_refresh
: BoolProperty(
901 description
="Automatic refresh"
904 # ------------------------------------------------------------
909 AntLandscapeAddPanel
,
910 AntLandscapeToolsPanel
,
911 AntMainSettingsPanel
,
912 AntNoiseSettingsPanel
,
913 AntDisplaceSettingsPanel
,
914 AntLandscapePropertiesGroup
,
915 add_mesh_ant_landscape
.AntAddLandscape
,
916 mesh_ant_displace
.AntMeshDisplace
,
917 ant_functions
.AntLandscapeRefresh
,
918 ant_functions
.AntLandscapeRegenerate
,
919 ant_functions
.AntVgSlopeMap
,
920 ant_functions
.Eroder
,
926 bpy
.utils
.register_class(cls
)
928 bpy
.types
.VIEW3D_MT_mesh_add
.append(menu_func_landscape
)
929 bpy
.types
.Object
.ant_landscape
= PointerProperty(
930 type=AntLandscapePropertiesGroup
,
931 name
="ANT_Landscape",
932 description
="Landscape properties")
933 bpy
.types
.VIEW3D_MT_paint_weight
.append(menu_func_eroder
)
937 for cls
in reversed(classes
):
938 bpy
.utils
.unregister_class(cls
)
939 bpy
.types
.VIEW3D_MT_mesh_add
.remove(menu_func_landscape
)
940 bpy
.types
.VIEW3D_MT_paint_weight
.remove(menu_func_eroder
)
943 if __name__
== "__main__":