[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2143] branches/ivygen/truman_ivy/ ivy_gen_truman.py: - Removed old file as renamed
Andrew Hale
TrumanBlending at gmail.com
Wed Jul 20 08:42:19 CEST 2011
Revision: 2143
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2143
Author: trumanblending
Date: 2011-07-20 06:42:19 +0000 (Wed, 20 Jul 2011)
Log Message:
-----------
- Removed old file as renamed
Removed Paths:
-------------
branches/ivygen/truman_ivy/ivy_gen_truman.py
Deleted: branches/ivygen/truman_ivy/ivy_gen_truman.py
===================================================================
--- branches/ivygen/truman_ivy/ivy_gen_truman.py 2011-07-20 06:36:22 UTC (rev 2142)
+++ branches/ivygen/truman_ivy/ivy_gen_truman.py 2011-07-20 06:42:19 UTC (rev 2143)
@@ -1,470 +0,0 @@
-# ##### 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 #####
-
-# <pep8 compliant>
-
-bl_info = {
- "name": "Ivy Gen",
- "author": "testscreenings, PKHG, TrumanBlending",
- "version": (0, 2),
- "blender": (2, 5, 8),
- "api": 38470,
- "location": "View3D > Add > Curve",
- "description": "Adds generated ivy to an object.",
- "warning": "Experimental",
- "wiki_url": "",
- "tracker_url": "",
- "category": "Add Curve"}
-
-import bpy
-from bpy.props import *
-from mathutils import Vector, Matrix, geometry
-from collections import deque
-from math import pow, cos, pi, atan2
-from random import random as rand_val
-import random
-
-
-def createIvyLeaves(IVY, radius):
- # Create the ivy leaves
- # Order location of the vertices
- signList = [(-1, 1), (1, 1), (1, -1), (-1, -1)]
-
- # Get the local size
- local_ivyLeafSize = radius * IVY.ivySize * IVY.ivyLeafSize
-
- # Initialise the vertex and face lists
- vertList = deque()
- faceList = deque()
-
- # Store the methods for faster calling
- addV = vertList.append
- addF = faceList.append
- rotMat = Matrix.Rotation
-
- # Loop over all roots
- for root in IVY.ivyRoots:
- # Get the last node in the root
- prevIvyLength = 1 / root.ivyNodes[-1].length
- # Loop over all node ten times
- for i in range(10):
- for node in root.ivyNodes:
- # Find the weight and normalise the smooth adhesion vector
- weight = pow(node.length * prevIvyLength, 0.7)
- normalAd = node.smoothAdhesionVector.normalized()
-
- # Calculate the ground ivy and the new weight
- groundIvy = max(0.0, -normalAd.dot(Vector((0, 0, 1))))
- weight += groundIvy * pow(1 - node.length * prevIvyLength, 2)
-
- # Generate the probability
- probability = rand_val()
-
- # If we need to grow a leaf, do so
- if ((probability * weight) > IVY.leafProbability and
- node.smoothAdhesionVector.length != 0.0):
- # Find the alignment weight
- alignmentWeight = node.smoothAdhesionVector.length
-
- # Calculate the needed angles
- phi = atan2(node.smoothAdhesionVector.y,
- node.smoothAdhesionVector.x) - pi / 2
- theta = (0.5 *
- node.smoothAdhesionVector.angle(Vector((0, 0, -1))))
-
- # Generate the random vector
- randomVector = Vector((rand_val() - 0.5, rand_val() - 0.5,
- rand_val() - 0.5))
-
- # Find the leaf center
- center = node.pos + local_ivyLeafSize * randomVector
-
- # Find the size weight
- sizeWeight = 1.5 - (cos(2 * pi * weight) * 0.5 + 0.5)
-
- # Randomise the angles
- phi += (rand_val() - 0.5) * (1.3 - alignmentWeight)
- theta += (rand_val() - 0.5) * (1.1 - alignmentWeight)
-
- # Calculate the leaf size an append the face to the list
- leafSize = local_ivyLeafSize * sizeWeight
- currentVert = len(vertList)
-
- faceList.append((currentVert, currentVert + 1,
- currentVert + 2, currentVert + 3))
-
- # For each of the verts in the list rotate/scale and append
- for k1, k2 in signList:
- randomVector = Vector((rand_val() - 0.5,
- rand_val() - 0.5, rand_val() - 0.5))
- tmpPos = Vector((k1 * leafSize, k2 * leafSize, 0.0))
- horiRot = rotMat(theta, 3, 'X')
- tmpPos.rotate(horiRot)
- vertRot = rotMat(phi, 3, 'Z')
- tmpPos.rotate(vertRot)
- tmpPos += (randomVector * local_ivyLeafSize *
- sizeWeight * 0.5 + center)
- addV(tmpPos)
-
- # Generate the new leaf mesh and link
- me = bpy.data.meshes.new('IvyLeaf')
- me.from_pydata(vertList, [], faceList)
- me.validate()
- ob = bpy.data.objects.new('IvyLeaf', me)
- bpy.context.scene.objects.link(ob)
-
- tex = me.uv_textures.new("Leaves")
-
- # Set the uv texture coords
- for d in tex.data:
- uv1, uv2, uv3, uv4 = signList
-
- return ob
-
-def createIvyCurves(IVY, radius):
- '''Create the curve geometry for IVY'''
- # Compute the local size and the gauss weight filter
- local_ivyBranchSize = radius * IVY.ivySize * IVY.ivyBranchSize
- gaussWeight = [1.0, 2.0, 4.0, 7.0, 9.0, 10.0, 9.0, 7.0, 4.0, 2.0, 1.0]
-
- # Create a new curve and intialise it
- bpy.ops.object.select_all(action='DESELECT')
- curve = bpy.data.curves.new("IVY", type='CURVE')
- curve.dimensions = '3D'
- curve.bevel_depth = 1
- curve.use_fill_front = curve.use_fill_back = False
-
- # Loop over all roots to generate its nodes
- for root in IVY.ivyRoots:
- # Only grow if more than one node
- if len(root.ivyNodes) > 1:
- # Calculate the local radius
- local_ivyBranchRadius = 1/(root.parents + 1) + 1
- splineVerts = deque()
- splineRadii = deque()
- extendV = splineVerts.extend
- appendR = splineRadii.append
- # Loop over all nodes in the root
- for i, n in enumerate(root.ivyNodes):
- # Calculate the weighting for the node
- weight = n.length / root.ivyNodes[-1].length
- ivyRad = (local_ivyBranchRadius *
- local_ivyBranchSize * (1.3 - weight))
- tmpPos = n.pos.copy()
- tmpPos.resize_4d()
- extendV(tmpPos.to_tuple())
- appendR(ivyRad)
- # Generate the smoothed adhesion vector
- for k in range(len(gaussWeight)):
- idx = max(0, min(i + k - 5, len(root.ivyNodes) - 1))
- n.smoothAdhesionVector += (gaussWeight[k] *
- root.ivyNodes[idx].adhesionVector)
- n.smoothAdhesionVector /= 56.0
- # Add the poly curve and set coords and radii
- newSpline = curve.splines.new(type='POLY')
- newSpline.points.add(len(splineVerts) // 4 - 1)
- newSpline.points.foreach_set('co', splineVerts)
- newSpline.points.foreach_set('radius', splineRadii)
-
- # Add the object and link to scene
- newCurve = bpy.data.objects.new("IVY_Curve", curve)
- bpy.context.scene.objects.link(newCurve)
- newCurve.select = True
- bpy.context.scene.objects.active = newCurve
-
- return newCurve
-
-
-def computeBoundingSphere(ob):
- # Get the mesh data
- me = ob.data
- # Intialise the center
- center = Vector((0, 0, 0))
- # Add all vertex coords
- for v in me.vertices:
- center += v.co
- # Average over all verts
- center /= len(me.vertices)
- # Create the iterator and find its max
- length_iter = ((center - v.co).length for v in me.vertices)
- radius = max(length_iter)
- return radius
-
-
-class IvyNode:
- """ The basic class used for each point on the ivy which is grown."""
- __slots__ = ('pos', 'primaryDir', 'adhesionVector',
- 'smoothAdhesionVector', 'length', 'floatingLength', 'climb')
-
- def __init__(self):
- self.pos = Vector((0, 0, 0))
- self.primaryDir = Vector((0, 0, 1))
- self.adhesionVector = Vector((0, 0, 0))
- self.smoothAdhesionVector = Vector((0, 0, 0))
- self.length = 0.0001
- self.floatingLength = 0.0
- self.climb = True
-
-
-class IvyRoot:
- """ The class used to hold all ivy nodes growing from this root point."""
- __slots__ = ('ivyNodes', 'alive', 'parents')
-
- def __init__(self):
- self.ivyNodes = deque()
- self.alive = True
- self.parents = 0
-
-
-class Ivy:
- """ The class holding all parameters and ivy roots."""
- __slots__ = ('ivyRoots', 'primaryWeight', 'randomWeight',
- 'gravityWeight', 'adhesionWeight', 'branchingProbability',
- 'leafProbability', 'ivySize', 'ivyLeafSize', 'ivyBranchSize',
- 'maxFloatLength', 'maxAdhesionDistance', 'maxLength')
-
- def __init__(self):
- self.ivyRoots = deque()
- self.primaryWeight = 0.5
- self.randomWeight = 0.2
- self.gravityWeight = 1.0
- self.adhesionWeight = 0.1
- self.branchingProbability = 0.95
- self.leafProbability = 0.7
- self.ivySize = 0.005
- self.ivyLeafSize = 1.5
- self.ivyBranchSize = 0.15
- self.maxFloatLength = 0.1
- self.maxAdhesionDistance = 0.1
- self.maxLength = 0.0
-
- # Normalise all the weights only on intialisation
- sum = self.primaryWeight + self.randomWeight + self.adhesionWeight
- self.primaryWeight /= sum
- self.randomWeight /= sum
- self.adhesionWeight /= sum
-
- def seed(self, seedPos):
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list