Material* json_parse_material(const jsonvalue& json) { auto material = new Material(); json_set_optvalue(json, material->kd, "kd"); json_set_optvalue(json, material->ks, "ks"); json_set_optvalue(json, material->kr, "kr"); json_set_optvalue(json, material->n, "n"); return material; }
Surface* json_parse_surface(const jsonvalue& json) { auto surface = new Surface(); json_set_optvalue(json, surface->frame, "frame"); json_set_optvalue(json, surface->radius,"radius"); json_set_optvalue(json, surface->isquad,"isquad"); if(json.object_contains("material")) surface->mat = json_parse_material(json.object_element("material")); return surface; }
FrameAnimation* json_parse_frame_animation(const jsonvalue& json) { auto animation = new FrameAnimation(); json_set_optvalue(json, animation->rest_frame, "rest_frame"); json_set_optvalue(json, animation->keytimes, "keytimes"); json_set_optvalue(json, animation->translation, "translation"); json_set_optvalue(json, animation->rotation, "rotation"); return animation; }
Camera* json_parse_camera(const jsonvalue& json) { auto camera = new Camera(); json_set_optvalue(json, camera->frame, "frame"); json_set_optvalue(json, camera->width, "width"); json_set_optvalue(json, camera->height, "height"); json_set_optvalue(json, camera->focus, "focus"); json_set_optvalue(json, camera->dist, "dist"); return camera; }
MeshSkinning* json_parse_mesh_skinning(const jsonvalue& json) { auto skinning = new MeshSkinning(); json_set_optvalue(json, skinning->rest_pos, "rest_pos"); json_set_optvalue(json, skinning->rest_norm, "rest_norm"); json_set_optvalue(json, skinning->bone_ids, "bone_ids"); json_set_optvalue(json, skinning->bone_weights, "bone_weights"); json_set_optvalue(json, skinning->bone_xforms, "bone_xforms"); return skinning; }
Scene* json_parse_scene(const jsonvalue& json) { // prepare scene auto scene = new Scene(); // camera if (json.object_contains("camera")) scene->camera = json_parse_camera(json.object_element("camera")); if (json.object_contains("lookat_camera")) scene->camera = json_parse_lookatcamera(json.object_element("lookat_camera")); // surfaces if(json.object_contains("surfaces")) scene->surfaces = json_parse_surfaces(json.object_element("surfaces")); // meshes if(json.object_contains("json_meshes")) { json_texture_path_push(json.object_element("json_meshes").as_string()); scene->meshes = json_parse_meshes(load_json(json.object_element("json_meshes").as_string())); json_texture_path_pop(); } if(json.object_contains("meshes")) { scene->meshes = json_parse_meshes(json.object_element("meshes")); } // lights if(json.object_contains("lights")) scene->lights = json_parse_lights(json.object_element("lights")); // animation if(json.object_contains("animation")) scene->animation = json_parse_scene_animation(json.object_element("animation")); // rendering parameters json_set_optvalue(json, scene->image_width, "image_width"); json_set_optvalue(json, scene->image_height, "image_height"); json_set_optvalue(json, scene->image_samples, "image_samples"); json_set_optvalue(json, scene->background, "background"); json_parse_opttexture(json, scene->background_txt, "background_txt"); json_set_optvalue(json, scene->ambient, "ambient"); json_set_optvalue(json, scene->accelerate_bvh, "accelerate_bvh"); json_set_optvalue(json, scene->path_max_depth, "path_max_depth"); json_set_optvalue(json, scene->path_sample_brdf, "path_sample_brdf"); json_set_optvalue(json, scene->path_shadows, "path_shadows"); // done return scene; }
Surface* json_parse_surface(const jsonvalue& json) { auto surface = new Surface(); json_set_optvalue(json, surface->frame, "frame"); json_set_optvalue(json, surface->radius,"radius"); json_set_optvalue(json, surface->isquad,"isquad"); if(json.object_contains("material")) surface->mat = json_parse_material(json.object_element("material")); json_set_optvalue(json, surface->subdivision_level,"subdivision_level"); json_set_optvalue(json, surface->subdivision_smooth,"subdivision_smooth"); if(json.object_contains("animation")) surface->animation = json_parse_frame_animation(json.object_element("animation")); return surface; }
Scene* json_parse_scene(const jsonvalue& json) { // prepare scene auto scene = new Scene(); // camera if (json.object_contains("camera")) scene->camera = json_parse_camera(json.object_element("camera")); if (json.object_contains("lookat_camera")) scene->camera = json_parse_lookatcamera(json.object_element("lookat_camera")); // surfaces if(json.object_contains("surfaces")) scene->surfaces = json_parse_surfaces(json.object_element("surfaces")); // lights if(json.object_contains("lights")) scene->lights = json_parse_lights(json.object_element("lights")); // rendering parameters json_set_optvalue(json, scene->image_width, "image_width"); json_set_optvalue(json, scene->image_height, "image_height"); json_set_optvalue(json, scene->image_samples, "image_samples"); json_set_optvalue(json, scene->background, "background"); json_set_optvalue(json, scene->ambient, "ambient"); // done return scene; }
MeshSimulation* json_parse_mesh_simulation(const jsonvalue& json) { auto simulation = new MeshSimulation(); json_set_optvalue(json, simulation->init_pos, "init_pos"); json_set_optvalue(json, simulation->init_vel, "init_vel"); json_set_optvalue(json, simulation->mass, "mass"); json_set_optvalue(json, simulation->pinned, "pinned"); json_set_optvalue(json, simulation->vel, "vel"); json_set_optvalue(json, simulation->force, "force"); if (json.object_contains("springs")) { for(auto& elem : json.object_element("springs").as_array_ref()) { auto spring = MeshSimulation::Spring(); json_set_optvalue(elem, spring.ids, "ids"); json_set_optvalue(elem, spring.restlength, "restlength"); json_set_optvalue(elem, spring.ks, "ks"); json_set_optvalue(elem, spring.kd, "kd"); simulation->springs.push_back(spring); } } return simulation; }
SceneAnimation* json_parse_scene_animation(const jsonvalue& json) { auto animation = new SceneAnimation(); json_set_optvalue(json, animation->time, "time"); json_set_optvalue(json, animation->length, "length"); json_set_optvalue(json, animation->dt, "dt"); json_set_optvalue(json, animation->simsteps, "simsteps"); json_set_optvalue(json, animation->gravity, "gravity"); json_set_optvalue(json, animation->bounce_dump, "bounce_dump"); json_set_optvalue(json, animation->loop, "loop"); return animation; }
Camera* json_parse_lookatcamera(const jsonvalue& json) { auto from = z3f, to = zero3f, up = y3f; auto width = 1.0f, height = 1.0f, dist = 1.0f; json_set_optvalue(json, from, "from"); json_set_optvalue(json, to, "to"); json_set_optvalue(json, up, "up"); json_set_optvalue(json, width, "width"); json_set_optvalue(json, height, "height"); json_set_optvalue(json, dist, "dist"); return lookat_camera(from, to, up, width, height, dist); }
Material* json_parse_material(const jsonvalue& json) { auto material = new Material(); json_set_optvalue(json, material->kd, "kd"); json_set_optvalue(json, material->ks, "ks"); json_set_optvalue(json, material->kr, "kr"); json_set_optvalue(json, material->ke, "ke"); json_set_optvalue(json, material->n, "n"); json_set_optvalue(json, material->microfacet, "microfacet"); json_parse_opttexture(json, material->ke_txt, "ke_txt"); json_parse_opttexture(json, material->kd_txt, "kd_txt"); json_parse_opttexture(json, material->ks_txt, "ks_txt"); json_parse_opttexture(json, material->norm_txt, "norm_txt"); return material; }
Light* json_parse_light(const jsonvalue& json) { auto light = new Light(); json_set_optvalue(json, light->frame, "frame"); json_set_optvalue(json, light->intensity, "intensity"); return light; }
Mesh* json_parse_mesh(const jsonvalue& json) { auto mesh = new Mesh(); if(json.object_contains("json_mesh")) { json_texture_path_push(json.object_element("json_mesh").as_string()); mesh = json_parse_mesh(load_json(json.object_element("json_mesh").as_string())); json_texture_path_pop(); } json_set_optvalue(json, mesh->frame, "frame"); json_set_optvalue(json, mesh->pos, "pos"); json_set_optvalue(json, mesh->norm, "norm"); json_set_optvalue(json, mesh->texcoord, "texcoord"); json_set_optvalue(json, mesh->triangle, "triangle"); json_set_optvalue(json, mesh->quad, "quad"); json_set_optvalue(json, mesh->point, "point"); json_set_optvalue(json, mesh->line, "line"); json_set_optvalue(json, mesh->spline, "spline"); if(json.object_contains("material")) mesh->mat = json_parse_material(json.object_element("material")); json_set_optvalue(json, mesh->subdivision_catmullclark_level, "subdivision_catmullclark_level"); json_set_optvalue(json, mesh->subdivision_catmullclark_smooth, "subdivision_catmullclark_smooth"); json_set_optvalue(json, mesh->subdivision_bezier_level, "subdivision_bezier_level"); if(json.object_contains("animation")) mesh->animation = json_parse_frame_animation(json.object_element("animation")); if(json.object_contains("skinning")) mesh->skinning = json_parse_mesh_skinning(json.object_element("skinning")); if(json.object_contains("json_skinning")) mesh->skinning = json_parse_mesh_skinning(load_json(json.object_element("json_skinning").as_string())); if(json.object_contains("simulation")) mesh->simulation = json_parse_mesh_simulation(json.object_element("simulation")); if (mesh->skinning) { if (mesh->skinning->rest_pos.empty()) mesh->skinning->rest_pos = mesh->pos; if (mesh->skinning->rest_norm.empty()) mesh->skinning->rest_norm = mesh->norm; if (mesh->pos.empty()) mesh->pos = mesh->skinning->rest_pos; if (mesh->norm.empty()) mesh->norm = mesh->skinning->rest_norm; } // MYCODE json_set_optvalue(json, mesh->subdiv_quad, "subdiv_quad"); return mesh; }
Material* json_parse_material(const jsonvalue& json) { auto material = new Material(); json_set_optvalue(json, material->kd, "kd"); json_set_optvalue(json, material->ks, "ks"); json_set_optvalue(json, material->kr, "kr"); json_set_optvalue(json, material->ke, "ke"); json_set_optvalue(json, material->n, "n"); json_set_optvalue(json, material->num_blurred_samples, "num_blurred_samples"); json_set_optvalue(json, material->blurred_reflection_size, "blurred_reflection_size"); // JSON options for custom texturing json_set_optvalue(json, material->tiling, "tiling"); json_set_optvalue(json, material->bilinear_filter, "bilinear_filter"); json_set_optvalue(json, material->mipmap_filter, "mipmap_filter"); // Hook up the textures of varying resolutions for mipmapping json_parse_opttexture(json, material->mipmap_texture_1, "mipmap_texture_1"); json_parse_opttexture(json, material->mipmap_texture_2, "mipmap_texture_2"); json_parse_opttexture(json, material->mipmap_texture_3, "mipmap_texture_3"); json_parse_opttexture(json, material->mipmap_texture_4, "mipmap_texture_4"); json_parse_opttexture(json, material->mipmap_texture_5, "mipmap_texture_5"); json_parse_opttexture(json, material->mipmap_texture_6, "mipmap_texture_6"); json_parse_opttexture(json, material->mipmap_texture_7, "mipmap_texture_7"); json_parse_opttexture(json, material->mipmap_texture_8, "mipmap_texture_8"); json_parse_opttexture(json, material->mipmap_texture_9, "mipmap_texture_9"); json_parse_opttexture(json, material->mipmap_texture_10, "mipmap_texture_10"); json_set_optvalue(json, material->microfacet, "microfacet"); json_parse_opttexture(json, material->ke_txt, "ke_txt"); json_parse_opttexture(json, material->kd_txt, "kd_txt"); json_parse_opttexture(json, material->ks_txt, "ks_txt"); json_parse_opttexture(json, material->norm_txt, "norm_txt"); return material; }