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