lib/glitch3d/bpy/helpers.py in glitch3d-0.2.3.8 vs lib/glitch3d/bpy/helpers.py in glitch3d-0.2.4.0
- old
+ new
@@ -1,14 +1,14 @@
REFLECTOR_SCALE = random.uniform(5, 8)
REFLECTOR_STRENGTH = random.uniform(10, 15)
REFLECTOR_LOCATION_PADDING = random.uniform(10, 12)
-WIREFRAME_THICKNESS = random.uniform(0.006, 0.02)
+WIREFRAME_THICKNESS = random.uniform(0.0004, 0.002)
DISPLACEMENT_AMPLITUDE = random.uniform(0.02, 0.1)
REPLACE_TARGET = str(random.uniform(0, 9))
REPLACEMENT = str(random.uniform(0, 9))
ORIGIN = (0,0,2)
-NUMBER_OF_FRAMES = 300
+NUMBER_OF_FRAMES = 100
SCATTER_INTENSITY = 0.015
ABSORPTION_INTENSITY = 0.25
DISPLAY_SCALE = (2, 2, 2)
PRIMITIVES = ['PYRAMID', 'CUBE']
props = []
@@ -17,20 +17,30 @@
BLUE = (0.1, 0.1, 0.8, 0.4)
PINK = (0.8, 0.2, 0.7, 1.0)
WORDS = string.ascii_lowercase
RENDER_OUTPUT_PATHS = []
NORMALS_RENDERING = False #(random.randint(0, 1) == 1)
+MATERIALS_NAMES = []
def pry():
code.interact(local=dict(globals(), **locals()))
sys.exit("Aborting execution")
def fetch_material(material_name):
new_material = bpy.data.materials[material_name].copy()
return new_material
-# Helper methods
+def apply_displacement(obj):
+ subdivide(obj, 6)
+ subsurf = obj.modifiers.new(name='subsurf', type='SUBSURF')
+ subsurf.levels = 2
+ subsurf.render_levels = 2
+ displace = obj.modifiers.new(name='displace', type='DISPLACE')
+ new_texture = bpy.data.textures.new(name='texture', type='IMAGE')
+ new_texture.image = random_height_map()
+ displace.texture = new_texture
+
def look_at(obj):
location_camera = CAMERA.matrix_world.to_translation()
location_object = obj.matrix_world.to_translation()
direction = location_object - location_camera
rot_quat = direction.to_track_quat('-Z', 'Y')
@@ -96,11 +106,15 @@
def camera_location_string(camera):
return str(int(camera.location.x)) + ' ' + str(int(camera.location.y)) + ' ' + str(int(camera.location.z))
def assign_material(obj, material):
- obj.data.materials.append(material)
+ flush_materials(obj.data.materials)
+ if len(obj.data.materials) == 0:
+ obj.data.materials.append(material)
+ else:
+ obj.data.materials[0] = material
return material
# Returns a new Cycles material with default DiffuseBsdf node linked to output
def create_cycles_material(name = 'Object Material - ', clean=False):
material = bpy.data.materials.new(name + str(uuid.uuid1()))
@@ -112,13 +126,18 @@
def random_texture():
texture_path = TEXTURE_FOLDER_PATH + random.choice(os.listdir(TEXTURE_FOLDER_PATH))
print("LOADING TEXTURE -> " + texture_path)
return bpy.data.images.load(texture_path)
-def random_material():
- return random.choice(bpy.data.materials)
+def random_height_map():
+ path = HEIGHT_MAP_FOLDER_PATH + random.choice(os.listdir(HEIGHT_MAP_FOLDER_PATH))
+ print("LOADING HEIGHT MAP -> " + path)
+ return bpy.data.images.load(path)
+def random_material(blacklist=[]):
+ return fetch_material(random.choice(MATERIALS_NAMES))
+
def assign_texture_to_material(material, texture):
assert material.use_nodes == True
texture_node = material.node_tree.nodes.new('ShaderNodeTexImage')
emission_node = material.node_tree.nodes.new('ShaderNodeEmission')
material.node_tree.links.new(texture_node.outputs['Color'], emission_node.inputs['Color'])
@@ -164,11 +183,11 @@
trans = material.node_tree.nodes.new('ShaderNodeBsdfTransparent')
trans.inputs[0].default_value = rand_color()
assign_node_to_output(material, trans)
assign_material(obj, material)
-def make_object_emitter(obj, emission_strength):
+def make_object_emitter(obj, emission_strength = 1):
emissive_material = assign_material(obj, fetch_material('emission'))
emission_node = emissive_material.node_tree.nodes['Emission']
emission_node.inputs[0].default_value = rand_color()
emission_node.inputs[1].default_value = emission_strength
return emission_node
@@ -206,13 +225,13 @@
def random_text():
global WORDS
return random.choice(WORDS)
-def create_mesh(name, verts, faces, location):
+def create_mesh(name, verts, faces, location, edges=[]):
mesh_data = bpy.data.meshes.new("mesh_data")
- mesh_data.from_pydata(verts, [], faces)
+ mesh_data.from_pydata(verts, edges, faces)
mesh_data.update()
obj = bpy.data.objects.new(name, mesh_data)
obj.location = location
SCENE.objects.link(obj)
return obj
@@ -224,24 +243,24 @@
new_text = bpy.data.objects.new("Text - " + identifier, new_curve)
new_text.data.body = random_text()
SCENE.objects.link(new_text)
return new_text
-def wireframize(obj):
+def wireframize(obj, emission_strength = 1):
SCENE.objects.active = obj
- bpy.ops.object.modifier_add(type='WIREFRAME')
- obj.modifiers['Wireframe'].thickness = WIREFRAME_THICKNESS
- make_object_emitter(obj, 1)
+ obj.modifiers.new(name = 'wireframe', type='WIREFRAME')
+ obj.modifiers['wireframe'].thickness = WIREFRAME_THICKNESS
+ make_object_emitter(obj, emission_strength)
return obj
def shuffle(obj):
obj.location = rand_location()
obj.scale = rand_scale_vector()
obj.rotation_euler = rand_rotation()
-def series(length):
- return list(map(lambda x: (0, x, math.cos(x)), pitched_array(0.0, length, 0.1)))
+def series(length, function = math.cos):
+ return list(map(lambda x: (0, x, function(x)), pitched_array(0.0, length, 0.1)))
def randomize_reflectors_colors():
for r in bpy.data.groups['Reflectors'].objects:
r.data.materials[-1].node_tree.nodes['Emission'].inputs[0].default_value = rand_color()
@@ -328,10 +347,11 @@
SCENE.objects.active = object
assert SCENE.objects.active == object
bpy.ops.object.mode_set(mode='EDIT')
for index in range(0, cuts):
bpy.ops.mesh.subdivide(cuts)
+ bpy.ops.object.editmode_toggle()
def clone(obj):
new_obj = obj.copy()
new_obj.data = obj.data.copy()
new_obj.animation_data_clear()
@@ -361,16 +381,22 @@
bpy.data.objects.remove(obj, do_unlink=True)
# Delete materials
def flush_materials(mats = bpy.data.materials):
for mat in mats:
- bpy.data.materials.remove(mat, do_unlink=True)
+ if mat != None:
+ bpy.data.materials.remove(mat, do_unlink=True)
def flush_nodes(material):
for node in material.node_tree.nodes:
material.node_tree.nodes.remove(node)
+def delete_useless_materials():
+ for mat in bpy.data.materials:
+ if mat.name.startswith('Material'):
+ bpy.data.materials.remove(mat, do_unlink=True)
+
# Rotate hue to generate palette
def adjacent_colors(r, g, b, number):
angle = (360 / 5) / 360
h, l, s = colorsys.rgb_to_hls(r, g, b)
hue_positions = []
@@ -400,10 +426,17 @@
faces.append([1,2,4])
faces.append([2,3,4])
faces.append([3,0,4])
return create_mesh('Pyramid ' + str(uuid.uuid1()), verts, faces, location)
+def build_segment(location, function = series, length = 2):
+ verts = function(length)
+ edges = []
+ for v in range(0, (len(verts) - 1)):
+ edges.append([v, v+1])
+ return create_mesh('Segment ' + str(uuid.uuid1()), verts, [], location, edges)
+
def camera_path(pitch = NUMBER_OF_FRAMES):
res = []
initial_z = INITIAL_CAMERA_LOCATION[2]
initial_x = INITIAL_CAMERA_LOCATION[0]
for y in pitched_array(initial_x, -initial_x, pitch):
@@ -417,20 +450,21 @@
return res
def pitched_array(minimum, maximum, pitch):
return list(map(lambda x: (minimum + pitch * x), range(int((maximum - minimum) / pitch))))
-def still_routine(index = 1):
- CAMERA.location = mathutils.Vector(INITIAL_CAMERA_LOCATION) + mathutils.Vector((round(random.uniform(-CAMERA_OFFSET, CAMERA_OFFSET), 10),round(random.uniform(-CAMERA_OFFSET, CAMERA_OFFSET), 10), round(random.uniform(-1, 1), 10)))
+def still_routine(max_index, index = 1):
+ CAMERA.location = CAMERA_PATH[int((len(CAMERA_PATH) / max_index) * index)]
+ CAMERA.rotation_euler.y += math.radians(round(random.uniform(-25, +25)))
randomize_reflectors_colors()
- make_object_glossy(OCEAN[0])
+ if OCEAN:
+ make_object_glossy(OCEAN[0])
assign_material(SUBJECT, random_material())
rotate(SUBJECT, index)
- CAMERA.rotation_euler.y += math.radians(round(random.uniform(-50, +50)))
for ocean in OCEAN:
ocean.modifiers['Ocean'].random_seed = round(random.uniform(0, 100))
- ocean.modifiers['Ocean'].choppiness += random.uniform(0, 0.5)
+ ocean.modifiers['Ocean'].choppiness += random.uniform(0, 0.3)
if bpy.data.groups['Lines'].objects:
for l in bpy.data.groups['Lines'].objects:
rotation = rand_rotation()
l.rotation_euler = rotation
if props:
@@ -445,18 +479,21 @@
for display in bpy.data.groups['Displays'].objects:
display.location = rand_location()
rotate(display, index)
def animation_routine(frame):
- assert len(CAMERA_PATH) >= NUMBER_OF_FRAMES
CAMERA.location = CAMERA_PATH[frame]
look_at(SUBJECT)
+ assign_material(SUBJECT, random_material())
randomize_reflectors_colors()
displace(SUBJECT)
for ocean in OCEAN:
ocean.modifiers['Ocean'].time += 0.5
- make_object_glossy(OCEAN[0])
+ if OCEAN:
+ make_object_glossy(OCEAN[0])
+ for particle_system in bpy.data.particles:
+ particle_system.phase_factor_random += 0.01
SUBJECT.rotation_euler.z += math.radians(1)
for l in bpy.data.groups['Lines'].objects:
l.rotation_euler.x += math.radians(1)
l.rotation_euler.z += math.radians(1)
if props:
@@ -505,10 +542,10 @@
world.node_tree.links.new(absorption_node.outputs[0], add_shader.inputs[1])
scatter_node.inputs['Density'].default_value = SCATTER_INTENSITY
absorption_node.inputs['Density'].default_value = ABSORPTION_INTENSITY
bg_node.inputs[0].default_value = rand_color()
-def add_frame(collection = bpy.data.objects):
- for obj in collection:
+def add_frame(collection = bpy.data.objects, blacklist = set([])):
+ for obj in set(collection) - blacklist:
obj.keyframe_insert(data_path="rotation_euler", index=-1)
obj.keyframe_insert(data_path="location", index=-1)
obj.keyframe_insert(data_path="scale", index=-1)
\ No newline at end of file