lib/glitch3d/bpy/helpers.py in glitch3d-0.2.2.2 vs lib/glitch3d/bpy/helpers.py in glitch3d-0.2.2.3
- old
+ new
@@ -10,10 +10,11 @@
import uuid
import sys
import logging
import string
import colorsys
+import numpy
REFLECTOR_SCALE = random.uniform(4, 6)
REFLECTOR_STRENGTH = random.uniform(8, 12)
REFLECTOR_LOCATION_PADDING = random.uniform(10, 12)
WIREFRAME_THICKNESS = random.uniform(0.008, 0.01)
@@ -61,11 +62,11 @@
bpy.context.scene.render.filepath = './renders/animation-' + str(uuid.uuid1()) + '/'
return bpy.ops.render.render(animation=animate)
bpy.ops.render.render(write_still=True)
def output_name(index, model_path):
- return './renders/' + os.path.splitext(model_path)[0].split('/')[-1] + '_' + str(index) + '_' + str(datetime.date.today()) + '.png'
+ return './renders/' + os.path.splitext(model_path)[0].split('/')[-1] + '_' + str(index) + '_' + str(datetime.date.today()) + '_' + str(mode) + '.png'
def rotate(model_object, index):
model_object.rotation_euler[2] = math.radians(index * (360.0 / shots_number))
# RGB 0 -> 1
@@ -79,10 +80,13 @@
return (rand_rotation_value(), rand_rotation_value(), rand_rotation_value())
def rand_rotation_value():
return round(random.uniform(0, 1), 10)
+def rand_rotation():
+ return (random.uniform(0, 20), random.uniform(0, 20), random.uniform(0, 20))
+
def rand_location_value():
return round(random.uniform(-4, 4), 10)
def rand_color():
return random.choice(COLORS)
@@ -138,14 +142,15 @@
logging.info('---------')
return bpy.data.images.load(texture_path)
def assign_texture_to_material(material, texture):
assert material.use_nodes == True
- bsdf_node = material.node_tree.nodes['Diffuse BSDF']
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'])
texture_node.image = texture
- material.node_tree.links.new(texture_node.outputs['Color'], bsdf_node.inputs['Color'])
+ assign_node_to_output(material, emission_node)
def assign_node_to_output(material, new_node):
assert material.use_nodes == True
output_node = material.node_tree.nodes['Material Output']
material.node_tree.links.new(new_node.outputs[0], output_node.inputs['Surface'])
@@ -194,10 +199,11 @@
material = bpy.data.materials.new('Fabulous #' + str(uuid.uuid1()))
material.use_nodes = True
assign_material(obj, material)
mixer_node = material.node_tree.nodes.new('ShaderNodeMixRGB')
gradient_node = material.node_tree.nodes.new('ShaderNodeTexGradient')
+ gradient_node.gradient_type = 'SPHERICAL'
bsdf_node = material.node_tree.nodes.new('ShaderNodeBsdfDiffuse')
material.node_tree.links.new(gradient_node.outputs['Fac'], mixer_node.inputs['Fac'])
material.node_tree.links.new(mixer_node.outputs[0], bsdf_node.inputs['Color'])
assign_node_to_output(material, bsdf_node)
mixer_node.inputs['Color1'].default_value = color1
@@ -246,10 +252,13 @@
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)), numpy.arange(0.0, length, 0.1)))
+
def randomize_reflectors_colors():
reflector1.data.materials[-1].node_tree.nodes['Emission'].inputs[0].default_value = rand_color()
reflector2.data.materials[-1].node_tree.nodes['Emission'].inputs[0].default_value = rand_color()
def add_object(obj, x, y, z, radius):
@@ -299,11 +308,11 @@
WIREFRAMES.append(new_obj)
group_add(obj, new_obj)
new_obj.location = ((last_object_group(obj).location.x + 2 * radius), y_index, z_index)
# Displace vertex by random offset
-def displace(vector):
+def displace_vector(vector):
return mathutils.Vector((vector.x + random.uniform(-DISPLACEMENT_AMPLITUDE, DISPLACEMENT_AMPLITUDE), vector.y + random.uniform(-DISPLACEMENT_AMPLITUDE, DISPLACEMENT_AMPLITUDE), vector.z + random.uniform(-DISPLACEMENT_AMPLITUDE, DISPLACEMENT_AMPLITUDE)))
# Replace vertex coordinate everywhere
def find_and_replace(vector):
return mathutils.Vector((float(str(vector.x).replace(REPLACE_TARGET, REPLACEMENT)), float(str(vector.y).replace(REPLACE_TARGET, REPLACEMENT)), float(str(vector.z).replace(REPLACE_TARGET, REPLACEMENT))))
@@ -312,18 +321,31 @@
bpy.ops.object.mode_set(mode='OBJECT')
assert object.type == 'MESH'
for vertex in object.data.vertices:
vertex.co = find_and_replace(vertex.co)
+def displace(object):
+ bpy.ops.object.mode_set(mode='OBJECT')
+ assert object.type == 'MESH'
+ for vertex in object.data.vertices:
+ vertex.co = displace_vector(vertex.co)
+
def subdivide(object, cuts):
if context.scene.objects.active != object:
context.scene.objects.active = object
assert context.scene.objects.active == object
bpy.ops.object.mode_set(mode='EDIT')
for index in range(0, cuts):
bpy.ops.mesh.subdivide(cuts)
+def clone(obj):
+ new_obj = obj.copy()
+ new_obj.data = obj.data.copy()
+ new_obj.animation_data_clear()
+ context.scene.objects.link(new_obj)
+ return new_obj
+
def add_ocean(spatial_size, resolution):
bpy.ops.mesh.primitive_cube_add(location=(0, 0, -1),radius=1)
ocean = last_added_object('CUBE')
context.scene.objects.active = ocean
ocean.scale = (2,2,2)
@@ -331,11 +353,15 @@
ocean.modifiers["Ocean"].spatial_size = spatial_size
ocean.modifiers["Ocean"].resolution = resolution
make_object_glossy(ocean, rand_color())
make_object_gradient_fabulous(ocean, rand_color(), rand_color())
mix_nodes(ocean.data.materials[0], ocean.data.materials[0].node_tree.nodes['Diffuse BSDF'], ocean.data.materials[0].node_tree.nodes['Glossy BSDF'])
- ocean.name = 'Ocean'
+ shadow = clone(ocean)
+ shadow.location.x += 3
+ wireframize(shadow)
+ shadow.name = 'ocean'
+ ocean.name = 'ocean'
return ocean
# Delete current objects
def flush_all_objects():
for index, obj in enumerate(bpy.data.objects):
@@ -375,21 +401,42 @@
return create_mesh('Pyramid ' + str(uuid.uuid1()), verts, faces, location)
def dance_routine():
camera_object.location.x = INITIAL_CAMERA_LOCATION[0] + round(random.uniform(-2, 2), 10)
camera_object.location.y = INITIAL_CAMERA_LOCATION[1] + round(random.uniform(-2, 2), 10)
- look_at(camera_object, model_object)
randomize_reflectors_colors()
OCEAN.modifiers['Ocean'].time += 1
OCEAN.modifiers['Ocean'].random_seed = round(random.uniform(0, 100))
make_object_glossy(OCEAN, rand_color())
OCEAN.modifiers['Ocean'].choppiness += 0.3
+ rotate(model_object, index)
+ for l in bpy.data.groups['Lines'].objects:
+ rotation = rand_rotation()
+ l.rotation_euler = rotation
for prop in props:
prop.location = rand_location()
prop.rotation_euler = rand_rotation()
for obj in WIREFRAMES:
rotate(obj, index)
obj.location.z += round(random.uniform(-1, 1), 10)
obj.rotation_euler.z += math.radians(round(random.uniform(0, 90)))
for display in bpy.data.groups['Displays'].objects:
display.location = rand_location()
+ rotate(display, index)
+def create_line(name, point_list, thickness = 0.002, location = (0, -10, 0)):
+ # setup basic line data
+ line_data = bpy.data.curves.new(name=name,type='CURVE')
+ line_data.dimensions = '3D'
+ line_data.fill_mode = 'FULL'
+ line_data.bevel_depth = thickness
+ # define points that make the line
+ polyline = line_data.splines.new('POLY')
+ polyline.points.add(len(point_list)-1)
+ for idx in range(len(point_list)):
+ polyline.points[idx].co = (point_list[idx])+(1.0,)
+ # create an object that uses the linedata
+ line = bpy.data.objects.new('LineOne', line_data)
+ bpy.context.scene.objects.link(line)
+ line.location = location
+ make_object_emitter(line, 0.8)
+ return line