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