blender/release/scripts/bpymodules/defaultdoodads.py
Willian Padovani Germano 7753547b70 No cvs freeze msg yet, so thought I could go with a last minute new script:
Scripts:
- license info for camera changer (thanks Tom for pointing), made it GPL since it's stricter and so can be "downgraded" w/o problems, but emailed the author to confirm and if necessary will fix before release.

- adding Discombobulator by Evan J. Rosky (in Mesh menu):
http://evan.nerdsofparadise.com/programs/discombobulator/index.html

This is a fun script to play with, giving quite interesting results.  It's good for that "high-tech" look in buildings, spaceships and walls.  Thanks Evan for contributing it.  GUI should have further updates in the future, like an added "horizontal" layout.  (Note: ignore mention in its online docs of a problem with edit mode, the script was fixed.)
2005-05-17 19:56:29 +00:00

695 lines
18 KiB
Python

# Default Doodad Set for Discombobulator
# by Evan J. Rosky, 2005
# GPL- http://www.gnu.org/copyleft/gpl.html
#
# $Id$
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
# Copyright (C) 2005: Evan J. Rosky
#
# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
#Run discombobulator.py, not this.
import Blender
from Blender import NMesh,Object,Material
from Blender.NMesh import Vert,Face
from Blender.Mathutils import *
import BPyMathutils
from BPyMathutils import genrand
a = BPyMathutils.sgenrand(4859)
#Create random numbers
def randnum(low,high):
num = genrand()
num = num*(high-low)
num = num+low
return num
face = Face()
xmin = Vector([0,0,0])
xmax = Vector([0,0,0])
ymin = Vector([0,0,0])
ymax = Vector([0,0,0])
mxmin = Vector([0,0,0])
mxmax = Vector([0,0,0])
mymin = Vector([0,0,0])
mymax = Vector([0,0,0])
doodadCenter = Vector([0,0,0])
orientation = 0
center = Vector([0,0,0])
tosel = 0
seltopsonly = 0
tempx = []
doodadMesh = NMesh.GetRaw()
#face is the face to add the doodad to.
#sizeX and sizeY are values from 0.0 to 1.0 that represents a percentage the face that is covered by the doodad.
#height is how tall the doodad is.
def topsonly(seltops):
global seltopsonly
seltopsonly = seltops
#Find center and orientation of doodad
def findDoodadCenter(sizeX, sizeY):
#globalizing junk
global face
global xmin
global xmax
global ymin
global ymax
global orientation
global doodadCenter
global center
global tosel
global mxmin
global mxmax
global mymin
global mymax
global tempx
global seltopsonly
#Find the center of the face
center = Vector([0,0,0])
for pt in face.v:
center = center + pt.co
center = center/len(face.v)
#Find Temp Location Range by looking at the sizes
txmin = (((face.v[0].co + face.v[3].co)/2) - center)*(1-sizeX) + center
txmax = (((face.v[1].co + face.v[2].co)/2) - center)*(1-sizeX) + center
tymin = (((face.v[0].co + face.v[1].co)/2) - center)*(1-sizeY) + center
tymax = (((face.v[2].co + face.v[3].co)/2) - center)*(1-sizeY) + center
#Find Center of doodad
amtx = randnum(0.0,1.0)
amty = randnum(0.0,1.0)
thepoint = (((((txmin - txmax)*amtx + txmax) - ((tymin - tymax)*amty + tymax))*.5 + ((tymin - tymax)*amty + tymax)) - center)*2 + center
doodadCenter = Vector([thepoint[0],thepoint[1],thepoint[2]])
#Find Main Range by looking at the sizes
mxmin = (face.v[0].co + face.v[3].co)/2
mxmax = (face.v[1].co + face.v[2].co)/2
mymin = (face.v[0].co + face.v[1].co)/2
mymax = (face.v[2].co + face.v[3].co)/2
#Find x/y equivs for whole face
ve1 = (txmin - txmax)*amtx + txmax
ve1 = ve1 - mxmax
nax = ve1.length
ve1 = (mxmin - mxmax)
nax = nax/ve1.length
ve1 = (tymin - tymax)*amty + tymax
ve1 = ve1 - mymax
nay = ve1.length
ve1 = (mymin - mymax)
nay = nay/ve1.length
#Find new box thing
tempx = []
amtx = nax-sizeX/2
amty = nay-sizeY/2
tempx.append((((((mxmin - mxmax)*amtx + mxmax) - ((mymin - mymax)*amty + mymax))*.5 + ((mymin - mymax)*amty + mymax)) - center)*2 + center)
amtx = nax-sizeX/2
amty = nay+sizeY/2
tempx.append((((((mxmin - mxmax)*amtx + mxmax) - ((mymin - mymax)*amty + mymax))*.5 + ((mymin - mymax)*amty + mymax)) - center)*2 + center)
amtx = nax+sizeX/2
amty = nay+sizeY/2
tempx.append((((((mxmin - mxmax)*amtx + mxmax) - ((mymin - mymax)*amty + mymax))*.5 + ((mymin - mymax)*amty + mymax)) - center)*2 + center)
amtx = nax+sizeX/2
amty = nay-sizeY/2
tempx.append((((((mxmin - mxmax)*amtx + mxmax) - ((mymin - mymax)*amty + mymax))*.5 + ((mymin - mymax)*amty + mymax)) - center)*2 + center)
#Find New Location Range by looking at the sizes
xmin = (tempx[0] + tempx[3])/2
xmax = (tempx[1] + tempx[2])/2
ymin = (tempx[0] + tempx[1])/2
ymax = (tempx[2] + tempx[3])/2
#Make a point
def makePoint(x,y,z=0):
global xmin
global xmax
global ymin
global ymax
global doodadCenter
global tosel
global seltopsonly
global face
amtx = x
amty = y
thepoint = (((((xmin - xmax)*amtx + xmax) - ((ymin - ymax)*amty + ymax))*.5 + ((ymin - ymax)*amty + ymax)) - doodadCenter)*2 + doodadCenter
thepoint = thepoint + z*Vector(face.no)
tver = Vert(thepoint[0],thepoint[1],thepoint[2])
if tosel == 1 and seltopsonly == 0 and z == 0:
tver.sel = 1
return tver
#extrude ground-plane(s)
def extrudedoodad(vArray,heig):
global face
global doodadMesh
global tosel
topVArray = []
doodadMesh.verts.extend(vArray)
#Create array for extruded verts
for ind in range(0,(len(vArray))):
point = vArray[ind].co + heig*Vector(face.no)
ver = Vert(point[0],point[1],point[2])
if tosel == 1:
ver.sel = 1
topVArray.append(ver)
doodadMesh.verts.append(topVArray[ind])
#make faces around sides
for ind in range(0,(len(vArray) - 1)):
face = Face()
face.v.extend([vArray[ind],vArray[ind+1],topVArray[ind+1],topVArray[ind]])
if tosel == 1 and seltopsonly == 0: face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vArray[len(vArray) - 1],vArray[0],topVArray[0],topVArray[len(topVArray) - 1]])
if tosel == 1 and seltopsonly == 0:
face.sel = 1
doodadMesh.faces.append(face)
return topVArray
#For switching face vertices
def fixvertindex(ind):
if ind > 3:
indx = ind - 4
else:
indx = ind
return indx
#runs doodads
def createDoodad(indexArray,facec,minsi,maxsi,minhei,maxhei,selec,amtmin,amtmax,facpercent):
global doodadMesh
global seltopsonly
global tosel
doodadMesh = NMesh.GetRaw()
theamt = round(randnum(amtmin,amtmax),0)
theamt = int(theamt)
tosel = selec
for i in range(0,(theamt)):
if randnum(0,1) <= facpercent:
index = round(randnum(1,len(indexArray)),0)
index = indexArray[(int(index) - 1)]
Xsi = randnum(minsi,maxsi)
Ysi = randnum(minsi,maxsi)
hei = randnum(minhei,maxhei)
#Determine orientation
orient = int(round(randnum(0.0,3.0)))
facer = Face()
facer.v.extend([facec.v[orient],facec.v[fixvertindex(1+orient)],facec.v[fixvertindex(2+orient)],facec.v[fixvertindex(3+orient)]])
if index == 1:
singleBox(facer,Xsi,Ysi,hei)
if index == 2:
doubleBox(facer,Xsi,Ysi,hei)
if index == 3:
tripleBox(facer,Xsi,Ysi,hei)
if index == 4:
LShape(facer,Xsi,Ysi,hei)
if index == 5:
TShape(facer,Xsi,Ysi,hei)
if index == 6:
if randnum(0.0,1.0) > .5:
SShape(facer,Xsi,Ysi,hei)
else:
ZShape(facer,Xsi,Ysi,hei)
return doodadMesh
#Single Box Doodad
def singleBox(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
vertArray = []
#place four points
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,1))
vertArray.append(makePoint(1,1))
vertArray.append(makePoint(1,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend(vertArray)
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend(topVertArray)
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
#Double Box Doodad
def doubleBox(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
vertArray = []
#place first box
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,1))
vertArray.append(makePoint(0.45,1))
vertArray.append(makePoint(0.45,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend(vertArray)
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend(topVertArray)
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
vertArray = []
#place second box
vertArray.append(makePoint(0.55,0))
vertArray.append(makePoint(0.55,1))
vertArray.append(makePoint(1,1))
vertArray.append(makePoint(1,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend(vertArray)
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend(topVertArray)
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
#Triple Box Doodad
def tripleBox(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
vertArray = []
#place first box
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,1))
vertArray.append(makePoint(0.3,1))
vertArray.append(makePoint(0.3,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend(vertArray)
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend(topVertArray)
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
vertArray = []
#place second box
vertArray.append(makePoint(0.35,0))
vertArray.append(makePoint(0.35,1))
vertArray.append(makePoint(0.65,1))
vertArray.append(makePoint(0.65,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend(vertArray)
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend(topVertArray)
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
vertArray = []
#place third box
vertArray.append(makePoint(0.7,0))
vertArray.append(makePoint(0.7,1))
vertArray.append(makePoint(1,1))
vertArray.append(makePoint(1,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend(vertArray)
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend(topVertArray)
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
#The "L" Shape
def LShape(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
rcon1 = randnum(0.2,0.8)
rcon2 = randnum(0.2,0.8)
vertArray = []
#place L shape
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,rcon1))
vertArray.append(makePoint(0,1))
vertArray.append(makePoint(rcon2,1))
vertArray.append(makePoint(rcon2,rcon1))
vertArray.append(makePoint(1,rcon1))
vertArray.append(makePoint(1,0))
vertArray.append(makePoint(rcon2,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend([vertArray[0],vertArray[1],vertArray[4],vertArray[7]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[1],vertArray[2],vertArray[3],vertArray[4]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[4],vertArray[5],vertArray[6],vertArray[7]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[0],topVertArray[1],topVertArray[4],topVertArray[7]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[1],topVertArray[2],topVertArray[3],topVertArray[4]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[4],topVertArray[5],topVertArray[6],topVertArray[7]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
#The "T" Shape
def TShape(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
rcony = randnum(0.25,0.75)
rconx1 = randnum(0.1,0.49)
rconx2 = randnum(0.51,0.9)
vertArray = []
#place T shape
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,rcony))
vertArray.append(makePoint(rconx1,rcony))
vertArray.append(makePoint(rconx1,1))
vertArray.append(makePoint(rconx2,1))
vertArray.append(makePoint(rconx2,rcony))
vertArray.append(makePoint(1,rcony))
vertArray.append(makePoint(1,0))
vertArray.append(makePoint(rconx2,0))
vertArray.append(makePoint(rconx1,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend([vertArray[0],vertArray[1],vertArray[2],vertArray[9]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[2],vertArray[3],vertArray[4],vertArray[5]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[5],vertArray[6],vertArray[7],vertArray[8]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[8],vertArray[9],vertArray[2],vertArray[5]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[0],topVertArray[1],topVertArray[2],topVertArray[9]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[2],topVertArray[3],topVertArray[4],topVertArray[5]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[5],topVertArray[6],topVertArray[7],topVertArray[8]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[8],topVertArray[9],topVertArray[2],topVertArray[5]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
#The "S" or "Z" Shapes
def SShape(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
rcony1 = randnum(0.1,0.49)
rcony2 = randnum(0.51,0.9)
rconx1 = randnum(0.1,0.49)
rconx2 = randnum(0.51,0.9)
vertArray = []
#place S shape
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,rcony1))
vertArray.append(makePoint(rconx1,rcony1))
vertArray.append(makePoint(rconx1,rcony2))
vertArray.append(makePoint(rconx1,1))
vertArray.append(makePoint(rconx2,1))
vertArray.append(makePoint(1,1))
vertArray.append(makePoint(1,rcony2))
vertArray.append(makePoint(rconx2,rcony2))
vertArray.append(makePoint(rconx2,rcony1))
vertArray.append(makePoint(rconx2,0))
vertArray.append(makePoint(rconx1,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend([vertArray[0],vertArray[1],vertArray[2],vertArray[11]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[2],vertArray[9],vertArray[10],vertArray[11]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[2],vertArray[3],vertArray[8],vertArray[9]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[3],vertArray[4],vertArray[5],vertArray[8]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[5],vertArray[6],vertArray[7],vertArray[8]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[0],topVertArray[1],topVertArray[2],topVertArray[11]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[2],topVertArray[9],topVertArray[10],topVertArray[11]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[2],topVertArray[3],topVertArray[8],topVertArray[9]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[3],topVertArray[4],topVertArray[5],topVertArray[8]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[5],topVertArray[6],topVertArray[7],topVertArray[8]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
def ZShape(facel, Xsize, Ysize, height):
#globaling junk
global face
global tosel
global doodadMesh
face = Face()
face = facel
findDoodadCenter(Xsize, Ysize)
rcony1 = randnum(0.1,0.49)
rcony2 = randnum(0.51,0.9)
rconx1 = randnum(0.1,0.49)
rconx2 = randnum(0.51,0.9)
vertArray = []
#place Z shape
vertArray.append(makePoint(0,0))
vertArray.append(makePoint(0,rcony1))
vertArray.append(makePoint(0,rcony2))
vertArray.append(makePoint(rconx1,rcony2))
vertArray.append(makePoint(rconx2,rcony2))
vertArray.append(makePoint(rconx2,1))
vertArray.append(makePoint(1,1))
vertArray.append(makePoint(1,rcony2))
vertArray.append(makePoint(1,rcony1))
vertArray.append(makePoint(rconx2,rcony1))
vertArray.append(makePoint(rconx1,rcony1))
vertArray.append(makePoint(rconx1,0))
topVertArray = extrudedoodad(vertArray,height)
face = Face()
face.v.extend([vertArray[0],vertArray[1],vertArray[10],vertArray[11]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[1],vertArray[2],vertArray[3],vertArray[10]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[3],vertArray[4],vertArray[9],vertArray[10]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[4],vertArray[7],vertArray[8],vertArray[9]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([vertArray[4],vertArray[5],vertArray[6],vertArray[7]])
face.v.reverse()
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[0],topVertArray[1],topVertArray[10],topVertArray[11]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[1],topVertArray[2],topVertArray[3],topVertArray[10]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[3],topVertArray[4],topVertArray[9],topVertArray[10]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[4],topVertArray[7],topVertArray[8],topVertArray[9]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)
face = Face()
face.v.extend([topVertArray[4],topVertArray[5],topVertArray[6],topVertArray[7]])
if tosel == 1:
face.sel = 1
doodadMesh.faces.append(face)