void vlang_run(const char* buffer) { ParserEnv e; ParserEnv_Init(&e, buffer); CFunctionConfig cfc(CFuncTest); cfc.AddInputParam(xhn::string("x"), FloatValue); cfc.AddOutputParam(xhn::string("ret"), FloatValue); cfc.AttachToParseEnv(&e, xhn::string("c_test")); yyparse(&e); ///vptr addr = FunctionClosures_get_vari_addr(&e, e.curt_func, "a"); if (array_n(e.exce_array)) { elog("error line %d char count %d\n", e.line_count, e.char_count); for (euint i = 0; i < array_n(e.exce_array); i++) { parser_exception exce = e.exce_array[i]; elog("EXCE:%s\n", exce.exce_desc); } return; } ParserEnv_print_all_function(&e); ///int vari_type; FunctionClosures fc = ParserEnv_find_function(&e, "main"); ///FunctionPrint(&e, fc); if (fc) e.curt_func = fc; elog("############################\n"); FunctionClosures_execute(&e, e.curt_func); }
void compile(const char* path, CompileOptions& opts) { Buffer buf = opts.read(path); TempAllocator4096 ta; JsonObject object(ta); sjson::parse(buf, object); Array<PhysicsConfigMaterial> materials(default_allocator()); Array<PhysicsConfigShape> shapes(default_allocator()); Array<PhysicsConfigActor> actors(default_allocator()); CollisionFilterCompiler cfc(opts); // Parse materials if (map::has(object, FixedString("collision_filters"))) cfc.parse(object["collision_filters"]); if (map::has(object, FixedString("materials"))) parse_materials(object["materials"], materials); if (map::has(object, FixedString("shapes"))) parse_shapes(object["shapes"], shapes); if (map::has(object, FixedString("actors"))) parse_actors(object["actors"], actors); // Setup struct for writing PhysicsConfigResource pcr; pcr.version = RESOURCE_VERSION_PHYSICS_CONFIG; pcr.num_materials = array::size(materials); pcr.num_shapes = array::size(shapes); pcr.num_actors = array::size(actors); pcr.num_filters = array::size(cfc._filters); u32 offt = sizeof(PhysicsConfigResource); pcr.materials_offset = offt; offt += sizeof(PhysicsConfigMaterial) * pcr.num_materials; pcr.shapes_offset = offt; offt += sizeof(PhysicsConfigShape) * pcr.num_shapes; pcr.actors_offset = offt; offt += sizeof(PhysicsConfigActor) * pcr.num_actors; pcr.filters_offset = offt; offt += sizeof(PhysicsCollisionFilter) * pcr.num_filters; // Write all opts.write(pcr.version); opts.write(pcr.num_materials); opts.write(pcr.materials_offset); opts.write(pcr.num_shapes); opts.write(pcr.shapes_offset); opts.write(pcr.num_actors); opts.write(pcr.actors_offset); opts.write(pcr.num_filters); opts.write(pcr.filters_offset); // Write material objects for (u32 i = 0; i < pcr.num_materials; ++i) { opts.write(materials[i].name._id); opts.write(materials[i].static_friction); opts.write(materials[i].dynamic_friction); opts.write(materials[i].restitution); } // Write material objects for (u32 i = 0; i < pcr.num_shapes; ++i) { opts.write(shapes[i].name._id); opts.write(shapes[i].trigger); opts.write(shapes[i]._pad[0]); opts.write(shapes[i]._pad[1]); opts.write(shapes[i]._pad[2]); } // Write actor objects for (u32 i = 0; i < pcr.num_actors; ++i) { opts.write(actors[i].name._id); opts.write(actors[i].linear_damping); opts.write(actors[i].angular_damping); opts.write(actors[i].flags); } for (u32 i = 0; i < array::size(cfc._filters); ++i) { opts.write(cfc._filters[i].name._id); opts.write(cfc._filters[i].me); opts.write(cfc._filters[i].mask); } }