def yaml_file_to_world_objects(file_path): tree = None with open(file_path, 'r') as f: tree = yaml.load(f, Loader=Loader) if tree is None: return [] rv = {'camera': None, 'lights': [], 'world': [], 'config': None} defines = {} extends_map = {} for obj in tree: if "define" in obj: k = obj["define"] v = obj.get("value") opt = obj.get("extend") defines[k] = v if opt is not None: extends_map[k] = opt # replace 'extends' in defines map for obj_name in extends_map: parent_name = extends_map[ obj_name] # name of object which will be extended parent_value = defines[parent_name] child_value = defines[ obj_name] # name of object with 'extends' keyword new_parent_value = deepcopy(parent_value) if type(new_parent_value) == dict: # assume child value is same type for k in child_value: new_parent_value[k] = child_value[k] defines[obj_name] = new_parent_value expand_defines_in_tree(tree, defines) for obj in tree: if "add" in obj: if obj["add"] == "camera": rv['camera'] = Camera.from_yaml(obj) elif obj["add"] == "light": rv['lights'].append(Light.from_yaml(obj)) elif obj['add'] == 'config': rv['config'] = GlobalConfig.from_yaml(obj) else: possible_item = recursive_add(obj, defines) if possible_item is not None: rv['world'].append(possible_item) g = Group(material=Material(), transform=matrix4x4identity(), children=rv['world']) rv['world'] = [g] return rv
def world_objects_to_c_file(obj): if 'config' not in obj or obj['config'] is None: obj['config'] = GlobalConfig.from_yaml(dict()) c_code = """#include <stdio.h> #include <string.h> #include <stdbool.h> #include <math.h> #include <unistd.h> #include "src/libs/canvas/canvas.h" #include "src/libs/linalg/linalg.h" #include "src/libs/obj_loader/obj_loader.h" #include "src/libs/photon_map/pm.h" #include "src/color/hsl.h" #include "src/color/lab.h" #include "src/color/rgb.h" #include "src/color/srgb.h" #include "src/color/xyz.h" #include "src/color/xyy.h" #include "src/renderer/camera.h" #include "src/renderer/config.h" #include "src/renderer/photon_tracer.h" #include "src/renderer/renderer.h" #include "src/renderer/world.h" #include "src/pattern/pattern.h" #include "src/shapes/shapes.h" #include "src/shapes/cone.h" #include "src/shapes/csg.h" #include "src/shapes/cube.h" #include "src/shapes/cylinder.h" #include "src/shapes/group.h" #include "src/shapes/plane.h" #include "src/shapes/sphere.h" #include "src/shapes/triangle.h" #include "src/shapes/toroid.h" #define True true #define False false int main() {{ {0} {1} {2} {4} Shape world_group = array_of_shapes(1); group(world_group, all_shapes, {5}); printf("Balancing scene..."); fflush(stdout); world_group->divide(world_group, global_config.scene.divide_threshold); printf("Done!\\n"); fflush(stdout); World w = world(); w->lights = all_lights; w->lights_num = {3}; w->shapes = world_group; w->shapes_num = 1; w->global_config = &global_config; if (global_config.illumination.gi.photon_count > 0 && (global_config.illumination.include_global || global_config.illumination.debug_visualize_photon_map || global_config.illumination.debug_visualize_soft_indirect)) {{ w->photon_maps = array_of_photon_maps(3); printf("Tracing photons..."); fflush(stdout); int i; for (i = 0; i < 3; ++i) {{ init_Photon_map(global_config.illumination.gi.photon_count, w->photon_maps + i); }} trace_photons(w, 3, global_config.illumination.gi.include_caustics, global_config.illumination.gi.include_final_gather); printf("Done!\\n"); fflush(stdout); }} else {{ w->photon_maps = NULL; printf("Skipping photon tracing because photon_count is 0.\\n"); fflush(stdout); }} Canvas c = render_multi(cam, w, cam->usteps, cam->vsteps, cam->aperture.jitter); write_ppm_file(c, true, global_config.output.file_path); write_png(c, global_config.output.file_path); canvas_free(c); return 0; }} """.format(obj['config'].c_repr(), obj['camera'].c_repr(), allocate_lights(obj['lights']), len(obj['lights']), allocate_shapes(obj['world']), len(obj['world'])) print(c_code)