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:
authorCampbell Barton <ideasman42@gmail.com>2012-02-27 15:34:02 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-02-27 15:34:02 +0400
commit82484e862bb36441a4af46ddf689615d59693aab (patch)
treeec7f734b67d422130de77e963f92ac658c86706a /object_cloud_gen.py
parentc6d684b34b00a49c7edaa0d425213e8f6f82ac37 (diff)
removed warning (works in trunk now), also made pep8 edits
Diffstat (limited to 'object_cloud_gen.py')
-rw-r--r--object_cloud_gen.py173
1 files changed, 92 insertions, 81 deletions
diff --git a/object_cloud_gen.py b/object_cloud_gen.py
index 3250d295..607eaf00 100644
--- a/object_cloud_gen.py
+++ b/object_cloud_gen.py
@@ -16,23 +16,24 @@
#
# ##### END GPL LICENSE BLOCK #####
+# <pep8 compliant>
+
bl_info = {
"name": "Cloud Generator",
"author": "Nick Keeline(nrk)",
- "version": (1,0),
+ "version": (1, 0),
"blender": (2, 5, 9),
"location": "View3D > Tool Shelf > Cloud Generator Panel",
"description": "Creates Volumetric Clouds",
- "warning": "broken with bmesh",
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\
- "Scripts/Object/Cloud_Gen",
- "tracker_url": "https://projects.blender.org/tracker/index.php?"\
- "func=detail&aid=22015",
+ "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"
+ "Scripts/Object/Cloud_Gen",
+ "tracker_url": "https://projects.blender.org/tracker/index.php?"
+ "func=detail&aid=22015",
"category": "Object"}
import bpy
-from math import *
-from bpy.props import *
+from bpy.props import BoolProperty, EnumProperty
+from bpy.types import Operator, Panel
# This routine takes an object and deletes all of the geometry in it
@@ -40,24 +41,25 @@ from bpy.props import *
# It will add or subtract the bound box size by the variable sizeDifference.
def getMeshandPutinEditMode(scene, object):
-
- # Go into Object Mode
- bpy.ops.object.mode_set(mode='OBJECT')
-
+
+ # Go into Object Mode
+ bpy.ops.object.mode_set(mode='OBJECT')
+
# Deselect All
bpy.ops.object.select_all(action='DESELECT')
# Select the object
object.select = True
scene.objects.active = object
-
+
# Go into Edit Mode
bpy.ops.object.mode_set(mode='EDIT')
return object.data
-
+
+
def maxAndMinVerts(scene, object):
-
+
mesh = getMeshandPutinEditMode(scene, object)
verts = mesh.vertices
@@ -82,12 +84,14 @@ def maxAndMinVerts(scene, object):
minVert[1] = vert.co[1]
if vert.co[2] < minVert[2]:
minVert[2] = vert.co[2]
-
+
return [maxVert, minVert]
-
+
+
def makeObjectIntoBoundBox(scene, object, sizeDifference, takeFromObject):
-
- #Let's find the max and min of the reference object, it can be the same as the destination object
+
+ # Let's find the max and min of the reference object,
+ # it can be the same as the destination object
[maxVert, minVert] = maxAndMinVerts(scene, takeFromObject)
#get objects mesh
@@ -144,6 +148,7 @@ def makeObjectIntoBoundBox(scene, object, sizeDifference, takeFromObject):
# Update the mesh
mesh.update()
+
def applyScaleRotLoc(scene, obj):
# Deselect All
bpy.ops.object.select_all(action='DESELECT')
@@ -153,7 +158,8 @@ def applyScaleRotLoc(scene, obj):
scene.objects.active = obj
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
-
+
+
def totallyDeleteObject(scene, obj):
scene.objects.unlink(obj)
bpy.data.objects.remove(obj)
@@ -184,17 +190,19 @@ def addNewObject(scene, name, copyobj):
return ob_new
+
def getpdensitytexture(object):
-
+
for mslot in object.material_slots:
mat = mslot.material
for tslot in mat.texture_slots:
- if tslot!= 'NoneType':
+ if tslot != 'NoneType':
tex = tslot.texture
if tex.type == 'POINT_DENSITY':
if tex.point_density.point_source == 'PARTICLE_SYSTEM':
return tex
-
+
+
def removeParticleSystemFromObj(scene, object):
# Deselect All
@@ -208,16 +216,17 @@ def removeParticleSystemFromObj(scene, object):
# Deselect All
bpy.ops.object.select_all(action='DESELECT')
-
+
+
def convertParticlesToMesh(scene, particlesobj, destobj, replacemesh):
-
+
# Select the Destination object.
destobj.select = True
scene.objects.active = destobj
-
+
#Go to Edit Mode
- bpy.ops.object.mode_set(mode='EDIT',toggle=False)
-
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
#Delete everything in mesh if replace true
if replacemesh:
bpy.ops.mesh.select_all(action='SELECT')
@@ -240,6 +249,7 @@ def convertParticlesToMesh(scene, particlesobj, destobj, replacemesh):
# Update the mesh.
meshPnts.update()
+
def combineObjects(scene, combined, listobjs):
# scene is the current scene
# combined is the object we want to combine everything into
@@ -266,9 +276,10 @@ def combineObjects(scene, combined, listobjs):
# Apply modifier
bpy.ops.object.modifier_apply(apply_as='DATA', modifier=union[0].name)
+
# Returns the action we want to take
def getActionToDo(obj):
-
+
if not obj or obj.type != 'MESH':
return 'NOT_OBJ_DO_NOTHING'
elif obj is None:
@@ -276,7 +287,7 @@ def getActionToDo(obj):
elif "CloudMember" in obj:
if obj["CloudMember"] != None:
if obj["CloudMember"] == "MainObj":
- return 'DEGENERATE'
+ return 'DEGENERATE'
elif obj["CloudMember"] == "CreatedObj" and len(obj.particle_systems) > 0:
return 'CLOUD_CONVERT_TO_MESH'
else:
@@ -286,7 +297,8 @@ def getActionToDo(obj):
else:
return 'DO_NOTHING'
-class VIEW3D_PT_tools_cloud(bpy.types.Panel):
+
+class VIEW3D_PT_tools_cloud(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
@@ -314,7 +326,7 @@ class VIEW3D_PT_tools_cloud(bpy.types.Panel):
elif WhatToDo == 'CLOUD_DO_NOTHING':
col.label(text="Must select")
col.label(text="bound box")
-
+
elif WhatToDo == 'GENERATE':
col.operator("cloud.generate_cloud", text="Generate Cloud")
@@ -327,10 +339,10 @@ class VIEW3D_PT_tools_cloud(bpy.types.Panel):
col.label(text="a cloud")
-class GenerateCloud(bpy.types.Operator):
+class GenerateCloud(Operator):
+ """Create a Cloud,Undo Cloud, or convert to Mesh Cloud depending on selection"""
bl_idname = "cloud.generate_cloud"
bl_label = "Generate Cloud"
- bl_description = "Create a Cloud,Undo Cloud, or convert to Mesh Cloud depending on selection"
bl_register = True
bl_undo = True
@@ -339,7 +351,7 @@ class GenerateCloud(bpy.types.Operator):
if not context.active_object:
return False
else:
- return (context.active_object.type=='MESH')
+ return (context.active_object.type == 'MESH')
def execute(self, context):
# Make variable that is the current .blend file main data blocks
@@ -367,29 +379,29 @@ class GenerateCloud(bpy.types.Operator):
if WhatToDo == 'DEGENERATE':
# Degenerate Cloud
mainObj = active_object
-
+
cloudMembers = active_object.children
-
+
createdObjects = []
- definitionObjects = []
+ definitionObjects = []
for member in cloudMembers:
applyScaleRotLoc(scene, member)
if member["CloudMember"] == "CreatedObj":
createdObjects.append(member)
else:
definitionObjects.append(member)
-
+
for defObj in definitionObjects:
# Delete cloudmember data from objects
if "CloudMember" in defObj:
del(defObj["CloudMember"])
-
+
for createdObj in createdObjects:
totallyDeleteObject(scene, createdObj)
-
+
# Delete the blend_data object
totallyDeleteObject(scene, mainObj)
-
+
# Select all of the left over boxes so people can immediately
# press generate again if they want.
for eachMember in definitionObjects:
@@ -400,17 +412,17 @@ class GenerateCloud(bpy.types.Operator):
elif WhatToDo == 'CLOUD_CONVERT_TO_MESH':
cloudParticles = active_object.particle_systems.active
-
+
bounds = active_object.parent
-
+
###############Create CloudPnts for putting points in#########
# Create a new object cloudPnts
cloudPnts = addNewObject(scene, "CloudPoints", bounds)
cloudPnts["CloudMember"] = "CreatedObj"
cloudPnts.draw_type = 'WIRE'
cloudPnts.hide_render = True
-
- makeParent(bounds, cloudPnts, scene)
+
+ makeParent(bounds, cloudPnts, scene)
convertParticlesToMesh(scene, cloudParticles, cloudPnts, True)
@@ -421,7 +433,7 @@ class GenerateCloud(bpy.types.Operator):
pDensity.point_density.object = cloudPnts
#Let's resize the bound box to be more accurate.
- how_much_bigger = pDensity.point_density.radius
+ how_much_bigger = pDensity.point_density.radius
makeObjectIntoBoundBox(scene, bounds, how_much_bigger, cloudPnts)
else:
@@ -484,9 +496,9 @@ class GenerateCloud(bpy.types.Operator):
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT')
-
+
#Don't subdivide object or smooth if smoothing box not checked.
- if scene.cloudsmoothing:
+ if scene.cloudsmoothing:
bpy.ops.mesh.subdivide(number_cuts=2, fractal=0, smoothness=1)
# bpy.ops.object.transform_apply(location=True)
bpy.ops.mesh.vertices_smooth(repeat=20)
@@ -518,7 +530,7 @@ class GenerateCloud(bpy.types.Operator):
#Gravity does not effect the particle system
eWeights = cloudParticles.settings.effector_weights
eWeights.gravity = 0
-
+
####################Create Volume Material####################
# Deselect All
bpy.ops.object.select_all(action='DESELECT')
@@ -528,7 +540,7 @@ class GenerateCloud(bpy.types.Operator):
scene.objects.active = bounds
# Turn bounds object into a box. Use itself as a reference.
- makeObjectIntoBoundBox(scene, bounds, 1.0, bounds)
+ makeObjectIntoBoundBox(scene, bounds, 1.0, bounds)
# Delete all material slots in bounds object.
for i in range(len(bounds.material_slots)):
@@ -547,7 +559,7 @@ class GenerateCloud(bpy.types.Operator):
mVolume.scattering = scattering
mVolume.density = 0
mVolume.density_scale = densityScale
- mVolume.transmission_color = [3, 3, 3]
+ mVolume.transmission_color = 3.0, 3.0, 3.0
mVolume.step_size = 0.1
mVolume.use_light_cache = True
mVolume.cache_resolution = 45
@@ -567,7 +579,7 @@ class GenerateCloud(bpy.types.Operator):
# Add a Point Density texture
pDensity = blend_data.textures.new("CloudPointDensity", 'POINT_DENSITY')
-
+
mtex = cloudMaterial.texture_slots.add()
mtex.texture = pDensity
mtex.texture_coords = 'GLOBAL'
@@ -585,19 +597,18 @@ class GenerateCloud(bpy.types.Operator):
#pRamp.use_interpolation = 'LINEAR'
pRampElements = pRamp.elements
#pRampElements[1].position = .9
- #pRampElements[1].color = [.18,.18,.18,.8]
+ #pRampElements[1].color = 0.18, 0.18, 0.18, 0.8
bpy.ops.texture.slot_move(type='UP')
-
# Estimate the number of particles for the size of bounds.
- volumeBoundBox = (bounds.dimensions[0] * bounds.dimensions[1]* bounds.dimensions[2])
+ volumeBoundBox = (bounds.dimensions[0] * bounds.dimensions[1] * bounds.dimensions[2])
numParticles = int((2.4462 * volumeBoundBox + 430.4) * numOfPoints)
if numParticles > maxNumOfPoints:
numParticles = maxNumOfPoints
if numParticles < 10000:
numParticles = int(numParticles + 15 * volumeBoundBox)
print(numParticles)
-
+
# Set the number of particles according to the volume
# of bounds.
cloudParticles.settings.count = numParticles
@@ -606,7 +617,7 @@ class GenerateCloud(bpy.types.Operator):
if pDensity.point_density.radius > maxPointDensityRadius:
pDensity.point_density.radius = maxPointDensityRadius
-
+
# Set time to 1.
scene.frame_current = 1
@@ -641,49 +652,49 @@ class GenerateCloud(bpy.types.Operator):
removeParticleSystemFromObj(scene, cloud)
else:
-
+
pDensity.point_density.point_source = 'PARTICLE_SYSTEM'
pDensity.point_density.object = cloud
pDensity.point_density.particle_system = cloudParticles
- if scene.cloud_type == '1': # Cumulous
+ if scene.cloud_type == '1': # Cumulous
print("Cumulous")
mVolume.density_scale = 2.22
pDensity.point_density.turbulence_depth = 10
pDensity.point_density.turbulence_strength = 6.3
pDensity.point_density.turbulence_scale = 2.9
pRampElements[1].position = .606
- pDensity.point_density.radius = pDensity.point_density.radius + .1
+ pDensity.point_density.radius = pDensity.point_density.radius + 0.1
- elif scene.cloud_type == '2': # Cirrus
+ elif scene.cloud_type == '2': # Cirrus
print("Cirrus")
pDensity.point_density.turbulence_strength = 22
- mVolume.transmission_color = [3.5, 3.5, 3.5]
- mVolume.scattering = .13
+ mVolume.transmission_color = 3.5, 3.5, 3.5
+ mVolume.scattering = 0.13
- elif scene.cloud_type == '3': # Explosion
+ elif scene.cloud_type == '3': # Explosion
mVolume.emission = 1.42
mtex.use_rgb_to_intensity = False
- pRampElements[0].position = .825
- pRampElements[0].color = [.119,.119,.119,1]
+ pRampElements[0].position = 0.825
+ pRampElements[0].color = 0.119, 0.119, 0.119, 1
pRampElements[1].position = .049
- pRampElements[1].color = [1.0,1.0,1.0,0]
+ pRampElements[1].color = 1.0, 1.0, 1.0, 0
pDensity.point_density.turbulence_strength = 1.5
pRampElement1 = pRampElements.new(.452)
- pRampElement1.color = [.814,.112,0,1]
+ pRampElement1.color = 0.814, 0.112, 0, 1
pRampElement2 = pRampElements.new(.234)
- pRampElement2.color = [.814,.310,.002,1]
- pRampElement3 = pRampElements.new(.669)
- pRampElement3.color = [0,.0,.040,1]
-
+ pRampElement2.color = 0.814, 0.310, 0.002, 1
+ pRampElement3 = pRampElements.new(0.669)
+ pRampElement3.color = 0.0, 0.0, 0.040, 1
+
# Select the object.
bounds.select = True
scene.objects.active = bounds
-
+
#Let's resize the bound box to be more accurate.
- how_much_bigger = pDensity.point_density.radius + .1
-
- #If it's a particle cloud use cloud mesh if otherwise use point mesh
+ how_much_bigger = pDensity.point_density.radius + 0.1
+
+ #If it's a particle cloud use cloud mesh if otherwise use point mesh
if not scene.cloudparticles:
makeObjectIntoBoundBox(scene, bounds, how_much_bigger, cloudPnts)
else:
@@ -708,10 +719,10 @@ def register():
bpy.types.Scene.cloud_type = EnumProperty(
name="Type",
description="Select the type of cloud to create with material settings",
- items=[("0","Stratus","Generate Stratus_foggy Cloud"),
- ("1","Cumulous","Generate Cumulous_puffy Cloud"),
- ("2","Cirrus","Generate Cirrus_wispy Cloud"),
- ("3","Explosion","Generate Explosion"),
+ items=[("0", "Stratus", "Generate Stratus_foggy Cloud"),
+ ("1", "Cumulous", "Generate Cumulous_puffy Cloud"),
+ ("2", "Cirrus", "Generate Cirrus_wispy Cloud"),
+ ("3", "Explosion", "Generate Explosion"),
],
default='0')