Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'add_mesh_extra_objects/add_mesh_rocks/utils.py')
-rw-r--r--add_mesh_extra_objects/add_mesh_rocks/utils.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/add_mesh_extra_objects/add_mesh_rocks/utils.py b/add_mesh_extra_objects/add_mesh_rocks/utils.py
new file mode 100644
index 00000000..64e2daf4
--- /dev/null
+++ b/add_mesh_extra_objects/add_mesh_rocks/utils.py
@@ -0,0 +1,160 @@
+# ##### 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>
+
+
+# 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