// main function int main(int argc, char** argv) { auto args = parse_cmdline(argc, argv, { "03_animate", "view scene", { {"resolution", "r", "image resolution", typeid(int), true, jsonvalue() } }, { {"scene_filename", "", "scene filename", typeid(string), false, jsonvalue("scene.json")}, {"image_filename", "", "image filename", typeid(string), true, jsonvalue("")} } }); // generate/load scene either by creating a test scene or loading from json file scene_filename = args.object_element("scene_filename").as_string(); scene = nullptr; if(scene_filename.length() > 9 and scene_filename.substr(0,9) == "testscene") { int scene_type = atoi(scene_filename.substr(9).c_str()); scene = create_test_scene(scene_type); scene_filename = scene_filename + ".json"; } else { scene = load_json_scene(scene_filename); } error_if_not(scene, "scene is nullptr"); image_filename = (args.object_element("image_filename").as_string() != "") ? args.object_element("image_filename").as_string() : scene_filename.substr(0,scene_filename.size()-5)+".png"; if(not args.object_element("resolution").is_null()) { scene->image_height = args.object_element("resolution").as_int(); scene->image_width = scene->camera->width * scene->image_height / scene->camera->height; } animate_reset(scene); subdivide(scene); uiloop(); }
static void JSON_parse(js_State *J) { const char *source = js_tostring(J, 1); jsY_initlex(J, "JSON", source); jsonnext(J); jsonvalue(J); // TODO: reviver Walk() }
// main function int main(int argc, char** argv) { auto args = parse_cmdline(argc, argv, { "03_model", "raytrace a scene", { {"resolution", "r", "image resolution", "int", true, jsonvalue() } }, { {"scene_filename", "", "scene filename", "string", false, jsonvalue("scene.json")}, {"image_filename", "", "image filename", "string", true, jsonvalue("")} } }); scene_filename = args.object_element("scene_filename").as_string(); image_filename = (args.object_element("image_filename").as_string() != "") ? args.object_element("image_filename").as_string() : scene_filename.substr(0,scene_filename.size()-5)+".png"; scene = load_json_scene(scene_filename); if(! args.object_element("resolution").is_null()) { scene->image_height = args.object_element("resolution").as_int(); scene->image_width = scene->camera->width * scene->image_height / scene->camera->height; } subdivide(scene); uiloop(); }
static void jsonvalue(js_State *J) { int i; const char *name; switch (J->lookahead) { case TK_STRING: js_pushliteral(J, J->text); jsonnext(J); break; case TK_NUMBER: js_pushnumber(J, J->number); jsonnext(J); break; case '{': js_newobject(J); jsonnext(J); if (jsonaccept(J, '}')) return; do { if (J->lookahead != TK_STRING) js_syntaxerror(J, "JSON: unexpected token: %s (expected string)", jsY_tokenstring(J->lookahead)); name = J->text; jsonnext(J); jsonexpect(J, ':'); jsonvalue(J); js_setproperty(J, -2, name); } while (jsonaccept(J, ',')); jsonexpect(J, '}'); break; case '[': js_newarray(J); jsonnext(J); i = 0; if (jsonaccept(J, ']')) return; do { jsonvalue(J); js_setindex(J, -2, i++); } while (jsonaccept(J, ',')); jsonexpect(J, ']'); break; case TK_TRUE: js_pushboolean(J, 1); jsonnext(J); break; case TK_FALSE: js_pushboolean(J, 0); jsonnext(J); break; case TK_NULL: js_pushnull(J); jsonnext(J); break; default: js_syntaxerror(J, "JSON: unexpected token: %s", jsY_tokenstring(J->lookahead)); } }