Skip to content
Snippets Groups Projects
utils.py 5.69 KiB
Newer Older
  • Learn to ignore specific revisions
  • # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  The Blender Rock Creation tool is for rapid generation of mesh rocks.
    #  Copyright (C) 2011  Paul Marshall
    #
    #  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 3 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, see <http://www.gnu.org/licenses/>.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    # <pep8 compliant>
    
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
    # Converts a formated string to a float tuple:
    #   IN - '(0.5, 0.2)' -> CONVERT -> OUT - (0.5, 0.2)
    
    def toTuple(stringIn):
    
        sTemp = str(stringIn)[1:len(str(stringIn)) - 1].split(', ')
        fTemp = []
        for i in sTemp:
            fTemp.append(float(i))
        return tuple(fTemp)
    
    
    # Converts a formated string to a float tuple:
    #   IN - '[0.5, 0.2]' -> CONVERT -> OUT - [0.5, 0.2]
    
    def toList(stringIn):
    
        sTemp = str(stringIn)[1:len(str(stringIn)) - 1].split(', ')
        fTemp = []
        for i in sTemp:
            fTemp.append(float(i))
        return fTemp
    
    
    # Converts each item of a list into a float:
    def toFloats(inList):
        outList = []
        for i in inList:
            outList.append(float(i))
        return outList
    
    
    # Converts each item of a list into an integer:
    def toInts(inList):
        outList = []
        for i in inList:
            outList.append(int(i))
        return outList
    
    
    # Sets all faces smooth.  Done this way since I can't
    # find a simple way without using bpy.ops:
    def smooth(mesh):
    
        import bmesh
        bm = bmesh.new()
        bm.from_mesh(mesh)
        for f in bm.faces:
            f.smooth = True
        bm.to_mesh(mesh)
    
        return mesh
    
    
    
    # This try block allows for the script to psudo-intelligently select the
    # appropriate random to use.  If Numpy's random is present it will use that.
    # If Numpy's random is not present, it will through a "module not found"
    # exception and instead use the slower built-in random that Python has.
    try:
        # from numpy.random import random_integers as randint
        from numpy.random import normal as gauss
        # from numpy.random import (beta,
        # uniform,
        # seed,
        # weibull)
        # print("Rock Generator: Numpy found.")
        numpy = True
    except:
        from random import (
            # randint,
            gauss,
            # uniform,
            # seed
            )
        # from random import betavariate as beta
        # from random import weibullvariate as weibull
        print("Rock Generator: Numpy not found.  Using Python's random.")
        numpy = False
    # Artifically skews a normal (gaussian) distribution.  This will not create
    # a continuous distribution curve but instead acts as a piecewise finction.
    # This linearly scales the output on one side to fit the bounds.
    #
    # Example output historgrams:
    #
    # Upper skewed:                 Lower skewed:
    #  |                 ▄           |      _
    #  |                 █           |      █
    #  |                 █_          |      █
    #  |                 ██          |     _█
    #  |                _██          |     ██
    #  |              _▄███_         |     ██ _
    #  |             ▄██████         |    ▄██▄█▄_
    #  |          _█▄███████         |    ███████
    #  |         _██████████_        |   ████████▄▄█_ _
    #  |      _▄▄████████████        |   ████████████▄█_
    #  | _▄_ ▄███████████████▄_      | _▄███████████████▄▄_
    #   -------------------------     -----------------------
    #                    |mu               |mu
    #   Historgrams were generated in R (http://www.r-project.org/) based on the
    #   calculations below and manually duplicated here.
    #
    # param:  mu          - mu is the mean of the distribution.
    #         sigma       - sigma is the standard deviation of the distribution.
    #         bounds      - bounds[0] is the lower bound and bounds[1]
    #                       is the upper bound.
    #         upperSkewed - if the distribution is upper skewed.
    # return: out         - Rondomly generated value from the skewed distribution.
    #
    # @todo: Because NumPy's random value generators are faster when called
    #   a bunch of times at once, maybe allow this to generate and return
    #   multiple values at once?
    
    
    def skewedGauss(mu, sigma, bounds, upperSkewed=True):
        raw = gauss(mu, sigma)
    
        # Quicker to check an extra condition than do unnecessary math. . . .
        if raw < mu and not upperSkewed:
            out = ((mu - bounds[0]) / (3 * sigma)) * raw + ((mu * (bounds[0] - (mu - 3 * sigma))) / (3 * sigma))
        elif raw > mu and upperSkewed:
            out = ((mu - bounds[1]) / (3 * -sigma)) * raw + ((mu * (bounds[1] - (mu + 3 * sigma))) / (3 * -sigma))
        else:
            out = raw
    
        return out
    
    
    # @todo create a def for generating an alpha and beta for a beta distribution
    #   given a mu, sigma, and an upper and lower bound.  This proved faster in
    #   profiling in addition to providing a much better distribution curve
    #   provided multiple iterations happen within this function; otherwise it was
    #   slower.
    #   This might be a scratch because of the bounds placed on mu and sigma:
    #
    #   For alpha > 1 and beta > 1:
    #   mu^2 - mu^3           mu^3 - mu^2 + mu
    #   ----------- < sigma < ----------------
    #      1 + mu                  2 - mu
    #
    # def generateBeta(mu, sigma, scale, repitions=1):
        # results = []
    #
        # return results