Skip to content
Snippets Groups Projects
add_mesh_ant_landscape.py 27.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Brendon Murphy's avatar
    Brendon Murphy committed
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    
    bl_info = {
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        "name": "ANT Landscape",
        "author": "Jimmy Hazevoet",
    
        "blender": (2, 77, 0),
    
        "description": "Add a landscape primitive",
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        "warning": "", # used for warning icon and text in addons panel
    
        "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
    
                    "Scripts/Add_Mesh/ANT_Landscape",
    
        "tracker_url": "https://developer.blender.org/maniphest/task/create/?project=3&type=Bug",
    
        "category": "Add Mesh",
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    Another Noise Tool: Landscape mesh generator
    
    MESH OPTIONS:
    Mesh update:     Turn this on for interactive mesh update.
    
    Sphere:          Generate sphere or a grid mesh.
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    Smooth:          Generate smooth shaded mesh.
    Subdivision:     Number of mesh subdivisions, higher numbers gives more detail but also slows down the script.
    
    Mesh size:       X,Y size of the grid mesh in blender units.
    X_Offset:        Noise x offset in blender units (make tiled terrain)
    Y_Offset:        Noise y offset in blender units
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
    NOISE OPTIONS: ( Most of these options are the same as in blender textures. )
    Random seed:     Use this to randomise the origin of the noise function.
    Noise size:      Size of the noise.
    
    Noise type:      Available noise types: multiFractal, ridgedMFractal, fBm, hybridMFractal, heteroTerrain, Turbulence, Distorted Noise, Marble, Shattered_hTerrain, Strata_hTerrain, Planet_noise
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    Noise basis:     Blender, Perlin, NewPerlin, Voronoi_F1, Voronoi_F2, Voronoi_F3, Voronoi_F4, Voronoi_F2-F1, Voronoi Crackle, Cellnoise
    VLNoise basis:   Blender, Perlin, NewPerlin, Voronoi_F1, Voronoi_F2, Voronoi_F3, Voronoi_F4, Voronoi_F2-F1, Voronoi Crackle, Cellnoise
    Distortion:      Distortion amount.
    Hard:            Hard/Soft turbulence noise.
    Depth:           Noise depth, number of frequencies in the fBm.
    Dimension:       Musgrave: Fractal dimension of the roughest areas.
    Lacunarity:      Musgrave: Gap between successive frequencies.
    Offset:          Musgrave: Raises the terrain from sea level.
    Gain:            Musgrave: Scale factor.
    Marble Bias:     Sin, Tri, Saw
    Marble Sharpnes: Soft, Sharp, Sharper
    Marble Shape:    Shape of the marble function: Default, Ring, Swirl, X, Y
    
    HEIGHT OPTIONS:
    Invert:          Invert terrain height.
    Height:          Scale terrain height.
    Offset:          Terrain height offset.
    Falloff:         Terrain height falloff: Type 1, Type 2, X, Y
    Sealevel:        Flattens terrain below sealevel.
    Platlevel:       Flattens terrain above plateau level.
    Strata:          Strata amount, number of strata/terrace layers.
    Strata type:     Strata types, Smooth, Sharp-sub, Sharp-add
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # import modules
    import bpy
    from bpy.props import *
    from mathutils import *
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    from math import *
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # Create a new mesh (object) from verts/edges/faces.
    # verts/edges/faces ... List of vertices/edges/faces for the
    #                    new mesh (as used in from_pydata).
    # name ... Name of the new mesh (& object).
    
    def create_mesh_object(context, verts, edges, faces, name):
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        # Create new mesh
        mesh = bpy.data.meshes.new(name)
    
        # Make a mesh from a list of verts/edges/faces.
        mesh.from_pydata(verts, edges, faces)
    
        # Update mesh geometry after adding stuff.
    
        from bpy_extras import object_utils
        return object_utils.object_data_add(context, mesh, operator=None)
    
    
    # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # some functions for marble_noise
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def sin_bias(a):
        return 0.5 + 0.5 * sin(a)
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def tri_bias(a):
        b = 2 * pi
    
        a = 1 - 2 * abs(floor((a * (1 / b)) + 0.5) - (a * (1 / b)))
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        return a
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def saw_bias(a):
        b = 2 * pi
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        a -= n * b
        if a < 0: a += b
        return a / b
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def soft(a):
        return a
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def sharp(a):
        return a**0.5
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def sharper(a):
        return sharp(sharp(a))
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        if shape == 1:
            # ring
            x = x*2
            y = y*2
    
            s = (-cos(x**2 + y**2) / (x**2 + y**2 + 0.5))
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif shape == 2:
            # swirl
    
            x = x * 2
            y = y * 2
            s = ((x * sin(x * x + y * y) + y * cos(x * x + y * y)) / (x**2 + y**2 + 0.5))
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif shape == 3:
            # bumps
    
            x = x * 2
            y = y * 2
            s = ((cos(x * pi) + cos(y * pi)) - 0.5)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif shape == 4:
            # y grad.
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif shape == 5:
            # x grad.
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        return s
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # marble_noise
    
    def marble_noise(x, y, z, origin, size, shape, bias, sharpnes, turb, depth, hard, basis):
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        x = x / size
        y = y / size
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        z = z / size
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        x += origin[0]
        y += origin[1]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        z += origin[2]
    
        value = s + turb * turbulence_vector((x, y, z), depth, hard, basis)[0]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        if bias == 1:
    
            value = tri_bias(value)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif bias == 2:
    
            value = saw_bias(value)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
    
            value = sin_bias(value)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        if sharpnes == 1:
    
            value = sharp(value)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif sharpnes == 2:
    
            value = sharper(value)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
    
            value = soft(value)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        return value
    
    
    
    # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # custom noise types
    
    # shattered_hterrain:
    
    def shattered_hterrain(x, y, z, H, lacunarity, octaves, offset, distort, basis):
        d = (turbulence_vector((x, y, z), 6, 0, 0)[0] * 0.5 + 0.5) * distort * 0.5
        t1 = (turbulence_vector((x + d, y + d, z), 0, 0, 7)[0] + 0.5)
        t2 = (hetero_terrain((x * 2, y * 2, z * 2), H, lacunarity, octaves, offset, basis) * 0.5)
        return ((t1 * t2) + t2 * 0.5) * 0.5
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # strata_hterrain
    
    def strata_hterrain(x, y, z, H, lacunarity, octaves, offset, distort, basis):
        value = hetero_terrain((x, y, z), H, lacunarity, octaves, offset, basis) * 0.5
        steps = (sin(value * (distort * 5) * pi) * (0.1 / (distort * 5) * pi))
        return (value * (1.0 - 0.5) + steps * 0.5)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
    
    
    # planet_noise by Farsthary: https://farsthary.com/2010/11/24/new-planet-procedural-texture/
    
    def planet_noise(coords, oct=6, hard=0, noisebasis=1, nabla=0.001):
        x,y,z = coords
        d = 0.001
        offset = nabla * 1000
        x = turbulence((x, y, z), oct, hard, noisebasis)
        y = turbulence((x + offset, y , z), oct, hard, noisebasis)
        z = turbulence((x, y + offset, z), oct, hard, noisebasis)
    
        xdy = x-turbulence((x, y + d, z), oct, hard, noisebasis)
        xdz = x-turbulence((x, y, z + d), oct, hard, noisebasis)
        ydx = y-turbulence((x + d, y, z), oct, hard, noisebasis)
        ydz = y-turbulence((x, y, z + d), oct, hard, noisebasis)
        zdx = z-turbulence((x + d, y, z), oct, hard, noisebasis)
        zdy = z-turbulence((x, y + d, z), oct, hard, noisebasis)
    
        return (zdy - ydz), (zdx - xdz), (ydx - xdy)
    
    
    
    # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # landscape_gen
    
    def landscape_gen(x, y, z, falloffsize, options):
    
        # options = [0, 1.0, 'multi_fractal', 0, 0, 1.0, 0, 6, 1.0, 2.0, 1.0, 2.0, 0, 0, 0, 1.0, 0.0, 1, 0.0, 1.0, 0, 0, 0, 0.0, 0.0]
        rseed = options[0]
        nsize = options[1]
        ntype = options[2]
        nbasis = int(options[3][0])
        vlbasis = int(options[4][0])
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        distortion = options[5]
    
        hardnoise = options[6]
        depth = options[7]
        dimension = options[8]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        lacunarity = options[9]
    
        offset = options[10]
        gain = options[11]
        marblebias = int(options[12][0])
    
        marblesharpnes = int(options[13][0])
    
        marbleshape = int(options[14][0])
        invert = options[15]
        height = options[16]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        heightoffset = options[17]
    
        falloff = int(options[18][0])
        sealevel = options[19]
        platlevel = options[20]
        strata = options[21]
        stratatype = options[22]
        sphere = options[23]
        x_offset = options[24]
        y_offset = options[25]
    
        # origin
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        if rseed == 0:
    
            origin = 0.0 + x_offset, 0.0 + y_offset, 0.0
    
            origin_x = x_offset
            origin_y = y_offset
    
    Brendon Murphy's avatar
    Brendon Murphy committed
            origin_z = 0.0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
            # randomise origin
    
            seed_set(rseed)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
            origin = random_unit_vector()
    
            origin[0] += x_offset
            origin[1] += y_offset
    
            origin_x = ((0.5 - origin[0]) * 1000.0) + x_offset
            origin_y = ((0.5 - origin[1]) * 1000.0) + y_offset
            origin_z = (0.5 - origin[2]) * 1000.0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        # adjust noise size and origin
    
        ncoords = (x / nsize + origin_x, y / nsize + origin_y, z / nsize + origin_z)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        # noise basis type's
    
        if nbasis == 9:
            nbasis = 14  # to get cellnoise basis you must set 14 instead of 9
        if vlbasis ==9:
            vlbasis = 14
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        # noise type's
    
        if ntype ==   'multi_fractal':
            value = multi_fractal(ncoords, dimension, lacunarity, depth, nbasis) * 0.5
    
        elif ntype == 'ridged_multi_fractal':
            value = ridged_multi_fractal(ncoords, dimension, lacunarity, depth, offset, gain, nbasis) * 0.5
    
        elif ntype == 'hybrid_multi_fractal':
            value = hybrid_multi_fractal(ncoords, dimension, lacunarity, depth, offset, gain, nbasis) * 0.5
    
        elif ntype == 'hetero_terrain':
            value = hetero_terrain(ncoords, dimension, lacunarity, depth, offset, nbasis) * 0.25
    
        elif ntype == 'fractal':
            value = fractal(ncoords, dimension, lacunarity, depth, nbasis)
    
        elif ntype == 'turbulence_vector':
            value = turbulence_vector(ncoords, depth, hardnoise, nbasis)[0]
    
        elif ntype == 'variable_lacunarity':
            value = variable_lacunarity(ncoords, distortion, nbasis, vlbasis) + 0.5
    
        elif ntype == 'marble_noise':
    
            value = marble_noise(x * 2.0 / falloffsize, y * 2.0 / falloffsize, z * 2 / falloffsize, origin, nsize, marbleshape, marblebias, marblesharpnes, distortion, depth, hardnoise, nbasis)
    
    
        elif ntype == 'shattered_hterrain':
            value = shattered_hterrain(ncoords[0], ncoords[1], ncoords[2], dimension, lacunarity, depth, offset, distortion, nbasis)
    
        elif ntype == 'strata_hterrain':
            value = strata_hterrain(ncoords[0], ncoords[1], ncoords[2], dimension, lacunarity, depth, offset, distortion, nbasis)
    
        elif ntype == 'planet_noise':
    
            value = planet_noise(ncoords, depth, hardnoise, nbasis)[2] * 0.5 + 0.5
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
            value = 0.0
    
        # adjust height
        if invert !=0:
    
            value = (1 - value) * height + heightoffset
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
            value = value * height + heightoffset
    
        # edge falloff
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        if sphere == 0: # no edge falloff if spherical
            if falloff != 0:
    
                fallofftypes = [0, hypot(x * x, y * y), hypot(x, y), abs(y), abs(x)]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                if falloff ==1:
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                else:
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                value = value - sealevel
    
                if(dist < radius):
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                    dist = dist / radius
    
                    dist = (dist * dist * (3 - 2 * dist))
    
                    value = (value - value * dist) + sealevel
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                else:
                    value = sealevel
    
        # strata / terrace / layered
        if stratatype !='0':
            strata = strata / height
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        if stratatype == '1':
            strata *= 2
    
            steps = (sin(value * strata * pi) * (0.1 / strata * pi))
            value = (value * (1.0 - 0.5) + steps * 0.5) * 2.0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif stratatype == '2':
    
            steps = -abs(sin(value * strata * pi) * (0.1 / strata * pi))
            value =(value * (1.0 - 0.5) + steps * 0.5) * 2.0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        elif stratatype == '3':
    
            steps = abs(sin(value * strata * pi) * (0.1 / strata * pi))
            value =(value * (1.0 - 0.5) + steps * 0.5) * 2.0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        else:
            value = value
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        # clamp height
    
        if (value < sealevel):
            value = sealevel
        if (value > platlevel):
            value = platlevel
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        return value
    
    
    
    # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # generate grid
    
    def grid_gen(sub_d, size_me, options):
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        verts = []
        faces = []
    
    
        # fill verts array
        for i in range (0, sub_d):
    
            for j in range(0, sub_d):
                u = (i / (sub_d - 1) - 1 / 2)
                v = (j / (sub_d - 1) - 1 / 2)
                x = size_me * u
                y = size_me * v
                z = landscape_gen(x, y, 0.0, size_me, options)
                vert = (x, y, z)
    
                verts.append(vert)
    
        # fill faces array
        count = 0
    
        for i in range (0, sub_d*(sub_d - 1)):
            if count < sub_d - 1:
                A = i + 1
    
                C = (i + sub_d)
                D = (i + sub_d) + 1
                face = (A, B, C, D)
    
                faces.append(face)
                count = count + 1
            else:
                count = 0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        return verts, faces
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # generate sphere
    
    def sphere_gen(sub_d, size_me, options):
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        verts = []
        faces = []
    
    
        # fill verts array
        for i in range (0, sub_d):
    
            for j in range(0, sub_d):
                u = sin(j * pi * 2 / (sub_d - 1)) * cos(-pi / 2 + i * pi / (sub_d - 1)) * size_me / 2
                v = cos(j * pi * 2 / (sub_d - 1)) * cos(-pi / 2 + i * pi / (sub_d - 1)) * size_me / 2
                w = sin(-pi / 2 + i * pi / (sub_d - 1)) * size_me / 2
                h = landscape_gen(u, v, w, size_me, options) / size_me
                u,v,w = u + u * h, v + v * h, w + w * h
                vert = (u, v, w)
    
                verts.append(vert)
    
        # fill faces array
        count = 0
    
        for i in range (0, sub_d * (sub_d - 1)):
            if count < sub_d - 1:
                A = i + 1
    
                C = (i + sub_d)
                D = (i + sub_d) + 1
                face = (A, B, C, D)
    
                faces.append(face)
                count = count + 1
            else:
                count = 0
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        return verts, faces
    
    
    
    # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # Add landscape
    class landscape_add(bpy.types.Operator):
    
        """Add a landscape mesh"""
    
        bl_idname = "mesh.landscape_add"
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        bl_label = "Landscape"
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        bl_options = {'REGISTER', 'UNDO', 'PRESET'}
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        bl_description = "Add landscape mesh"
    
        # properties
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        AutoUpdate = BoolProperty(name="Mesh update",
    
                    default = True,
                    description = "Update mesh")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        SphereMesh = BoolProperty(name="Sphere",
    
                    default = False,
                    description = "Generate Sphere mesh")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        SmoothMesh = BoolProperty(name="Smooth",
    
                    default = True,
                    description = "Shade smooth")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        Subdivision = IntProperty(name="Subdivisions",
    
                    min = 4,
                    max = 6400,
                    default = 128,
                    description = "Mesh x y subdivisions")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        MeshSize = FloatProperty(name="Mesh Size",
    
                    min = 0.01,
                    max = 100000.0,
                    default = 2.0,
                    description = "Mesh size")
    
        XOffset = FloatProperty(name="X Offset",
    
                    default = 0.0,
                    description = "X Offset")
    
        YOffset = FloatProperty(name="Y Offset",
    
                    default = 0.0,
                    description = "Y Offset")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        RandomSeed = IntProperty(name="Random Seed",
    
                    min = 0,
                    max = 9999,
                    default = 0,
                    description = "Randomize noise origin")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        NoiseSize = FloatProperty(name="Noise Size",
    
                    min = 0.01,
                    max = 10000.0,
                    default = 1.0,
                    description = "Noise size")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        NoiseTypes = [
    
                    ('multi_fractal', "multiFractal", "multiFractal"),
                    ('ridged_multi_fractal', "ridgedMFractal", "ridgedMFractal"),
                    ('hybrid_multi_fractal', "hybridMFractal", "hybridMFractal"),
                    ('hetero_terrain', "heteroTerrain", "heteroTerrain"),
                    ('fractal', "fBm", "fBm"),
                    ('turbulence_vector', "Turbulence", "Turbulence"),
                    ('variable_lacunarity', "Distorted Noise", "Distorted Noise"),
                    ('marble_noise', "Marble", "Marble"),
                    ('shattered_hterrain', "Shattered_hTerrain", "Shattered_hTerrain"),
                    ('strata_hterrain', "Strata_hTerrain", "Strata_hTerrain"),
                    ('planet_noise', "Planet_Noise", "Planet_Noise")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        NoiseType = EnumProperty(name="Type",
    
                    description = "Noise type",
                    items = NoiseTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        BasisTypes = [
    
                    ("0", "Blender", "Blender"),
                    ("1", "Perlin", "Perlin"),
                    ("2", "NewPerlin", "NewPerlin"),
                    ("3", "Voronoi_F1", "Voronoi_F1"),
                    ("4", "Voronoi_F2", "Voronoi_F2"),
                    ("5", "Voronoi_F3", "Voronoi_F3"),
                    ("6", "Voronoi_F4", "Voronoi_F4"),
                    ("7", "Voronoi_F2-F1", "Voronoi_F2-F1"),
                    ("8", "Voronoi Crackle", "Voronoi Crackle"),
                    ("9", "Cellnoise", "Cellnoise")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        BasisType = EnumProperty(name="Basis",
    
                    description = "Noise basis",
                    items = BasisTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        VLBasisTypes = [
    
                    ("0", "Blender", "Blender"),
                    ("1", "Perlin", "Perlin"),
                    ("2", "NewPerlin", "NewPerlin"),
                    ("3", "Voronoi_F1", "Voronoi_F1"),
                    ("4", "Voronoi_F2", "Voronoi_F2"),
                    ("5", "Voronoi_F3", "Voronoi_F3"),
                    ("6", "Voronoi_F4", "Voronoi_F4"),
                    ("7", "Voronoi_F2-F1", "Voronoi_F2-F1"),
                    ("8", "Voronoi Crackle", "Voronoi Crackle"),
                    ("9", "Cellnoise", "Cellnoise")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        VLBasisType = EnumProperty(name="VLBasis",
    
                    description = "VLNoise basis",
                    items = VLBasisTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        Distortion = FloatProperty(name="Distortion",
    
                    min = 0.01,
                    max = 1000.0,
                    default = 1.0,
                    description = "Distortion amount")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        HardNoise = BoolProperty(name="Hard",
    
                    default = False,
                    description = "Hard noise")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        NoiseDepth = IntProperty(name="Depth",
    
                    description="Noise Depth - number of frequencies in the fBm")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        mDimension = FloatProperty(name="Dimension",
    
                    min = 0.01,
                    max = 2.0,
                    default = 1.0,
                    description = "H - fractal dimension of the roughest areas")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        mLacunarity = FloatProperty(name="Lacunarity",
    
                    min = 0.01,
                    max = 6.0,
                    default = 2.0,
                    description = "Lacunarity - gap between successive frequencies")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        mOffset = FloatProperty(name="Offset",
    
                    min = 0.01,
                    max = 6.0,
                    default = 1.0,
                    description = "Offset - raises the terrain from sea level")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        mGain = FloatProperty(name="Gain",
    
                    min = 0.01,
                    max = 6.0,
                    default = 1.0,
                    description = "Gain - scale factor")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        BiasTypes = [
    
                    ("0", "Sin", "Sin"),
                    ("1", "Tri", "Tri"),
                    ("2", "Saw", "Saw")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        MarbleBias = EnumProperty(name="Bias",
    
                    description = "Marble bias",
                    items = BiasTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        SharpTypes = [
    
                    ("0", "Soft", "Soft"),
                    ("1", "Sharp", "Sharp"),
                    ("2", "Sharper", "Sharper")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        MarbleSharp = EnumProperty(name="Sharp",
    
                    description = "Marble sharp",
                    items = SharpTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        ShapeTypes = [
    
                    ("0", "Default", "Default"),
                    ("1", "Ring", "Ring"),
                    ("2", "Swirl", "Swirl"),
                    ("3", "Bump", "Bump"),
                    ("4", "Y", "Y"),
                    ("5", "X", "X")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        MarbleShape = EnumProperty(name="Shape",
    
                    description = "Marble shape",
                    items = ShapeTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        Invert = BoolProperty(name="Invert",
    
                    default = False,
                    description = "Invert noise input")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        Height = FloatProperty(name="Height",
    
                    min = 0.01,
                    max = 10000.0,
                    default = 0.5,
                    description = "Height scale")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        Offset = FloatProperty(name="Offset",
    
                    min = -10000.0,
                    max = 10000.0,
                    default = 0.0,
                    description = "Height offset")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        fallTypes = [
    
                    ("0", "None", "None"),
                    ("1", "Type 1", "Type 1"),
                    ("2", "Type 2", "Type 2"),
                    ("3", "Y", "Y"),
                    ("4", "X", "X")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        Falloff = EnumProperty(name="Falloff",
    
                    description = "Edge falloff",
                    default = "1",
                    items = fallTypes)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        Sealevel = FloatProperty(name="Sealevel",
    
                    min = -10000.0,
                    max = 10000.0,
                    default = 0.0,
                    description = "Sealevel")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        Plateaulevel = FloatProperty(name="Plateau",
    
                    min = -10000.0,
                    max = 10000.0,
                    default = 1.0,
                    description = "Plateau level")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        Strata = FloatProperty(name="Strata",
    
                    min = 0.01,
                    max = 1000.0,
                    default = 5.0,
                    description = "Strata amount")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
        StrataTypes = [
    
                    ("0", "None", "None"),
                    ("1", "Type 1", "Type 1"),
                    ("2", "Type 2", "Type 2"),
                    ("3", "Type 3", "Type 3")]
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        StrataType = EnumProperty(name="Strata",
    
                    description = "Strata type",
                    default = "0",
                    items = StrataTypes)
    
    
        # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        # Draw
        def draw(self, context):
            layout = self.layout
    
            box = layout.box()
    
            box.prop(self, 'AutoUpdate')
            box.prop(self, 'SphereMesh')
            box.prop(self, 'SmoothMesh')
            box.prop(self, 'Subdivision')
            box.prop(self, 'MeshSize')
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
            box = layout.box()
    
            box.prop(self, 'BasisType')
    
            box.prop(self, 'XOffset')
            box.prop(self, 'YOffset')
    
    
            box = layout.box()
    
            if self.NoiseType == 'multi_fractal':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
    
            elif self.NoiseType == 'ridged_multi_fractal':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
                box.prop(self, 'mOffset')
                box.prop(self, 'mGain')
    
            elif self.NoiseType == 'hybrid_multi_fractal':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
                box.prop(self, 'mOffset')
                box.prop(self, 'mGain')
    
            elif self.NoiseType == 'hetero_terrain':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
                box.prop(self, 'mOffset')
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
    
            elif self.NoiseType == 'turbulence_vector':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'HardNoise')
    
            elif self.NoiseType == 'variable_lacunarity':
    
                box.prop(self, 'VLBasisType')
                box.prop(self, 'Distortion')
    
            elif self.NoiseType == 'marble_noise':
    
                box.prop(self, 'MarbleShape')
                box.prop(self, 'MarbleBias')
                box.prop(self, 'MarbleSharp')
                box.prop(self, 'Distortion')
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'HardNoise')
    
            elif self.NoiseType == 'shattered_hterrain':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
                box.prop(self, 'mOffset')
                box.prop(self, 'Distortion')
    
            elif self.NoiseType == 'strata_hterrain':
    
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'mDimension')
                box.prop(self, 'mLacunarity')
                box.prop(self, 'mOffset')
                box.prop(self, 'Distortion')
    
            elif self.NoiseType == 'planet_noise':
                box.prop(self, 'NoiseDepth')
                box.prop(self, 'HardNoise')
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
            box = layout.box()
    
            box.prop(self, 'Invert')
            box.prop(self, 'Height')
            box.prop(self, 'Offset')
            box.prop(self, 'Plateaulevel')
            box.prop(self, 'Sealevel')
    
                box.prop(self, 'Falloff')
            box.prop(self, 'StrataType')
    
    
        # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        # Execute
        def execute(self, context):
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
            #mesh update
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
                # turn off undo
                undo = bpy.context.user_preferences.edit.use_global_undo
                bpy.context.user_preferences.edit.use_global_undo = False
    
    
                # deselect all objects when in object mode
                if bpy.ops.object.select_all.poll():
                    bpy.ops.object.select_all(action='DESELECT')
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
                # options
                options = [
    
                    self.RandomSeed,
                    self.NoiseSize,
                    self.NoiseType,
                    self.BasisType,
                    self.VLBasisType,
                    self.Distortion,
                    self.HardNoise,
                    self.NoiseDepth,
                    self.mDimension,
                    self.mLacunarity,
                    self.mOffset,
                    self.mGain,
                    self.MarbleBias,
                    self.MarbleSharp,
                    self.MarbleShape,
                    self.Invert,
                    self.Height,
                    self.Offset,
                    self.Falloff,
                    self.Sealevel,
                    self.Plateaulevel,
                    self.Strata,
                    self.StrataType,
                    self.SphereMesh,
                    self.XOffset,
                    self.YOffset
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                    ]
    
                # Main function
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                    # sphere
    
                    verts, faces = sphere_gen(self.Subdivision, self.MeshSize, options)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                else:
                    # grid
    
                    verts, faces = grid_gen(self.Subdivision, self.MeshSize, options)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
                # create mesh object
    
                obj = create_mesh_object(context, verts, [], faces, "Landscape")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                # sphere, remove doubles
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                    bpy.ops.object.mode_set(mode='EDIT')
    
                    bpy.ops.mesh.remove_doubles(threshold=0.0001)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                    bpy.ops.object.mode_set(mode='OBJECT')
    
                # Shade smooth
    
    Brendon Murphy's avatar
    Brendon Murphy committed
                if self.SmoothMesh !=0:
                    if bpy.ops.object.shade_smooth.poll():
                        bpy.ops.object.shade_smooth()
                    else: # edit mode
                        bpy.ops.mesh.faces_shade_smooth()
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    
                # restore pre operator undo state
                bpy.context.user_preferences.edit.use_global_undo = undo
    
                return {'FINISHED'}
            else:
                return {'PASS_THROUGH'}
    
    # ------------------------------------------------------------
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    # Register
    
    
    Brendon Murphy's avatar
    Brendon Murphy committed
        # Define "Landscape" menu
    
    def menu_func_landscape(self, context):
    
        self.layout.operator(landscape_add.bl_idname, text="Landscape", icon="RNDCURVE")
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def register():
    
        bpy.types.INFO_MT_mesh_add.append(menu_func_landscape)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    def unregister():
    
        bpy.types.INFO_MT_mesh_add.remove(menu_func_landscape)
    
    Brendon Murphy's avatar
    Brendon Murphy committed
    if __name__ == "__main__":
    
    Guillermo S. Romero's avatar
    Guillermo S. Romero committed
        register()