static void Widget_set_request (LIScrArgs* args) { int internal = 0; int paddings[4]; const char* text; const char* font_name; LIMatVector vector; LIWdgSize size = { -1, -1 }; LIWdgSize size_tmp; LIWdgWidget* widget; widget = args->self; liscr_args_gets_bool (args, "internal", &internal); if (liscr_args_geti_vector (args, 0, &vector)) { size.width = (int) vector.x; size.height = (int) vector.y; } else { if (!liscr_args_geti_int (args, 0, &size.width)) liscr_args_gets_int (args, "width", &size.width); if (!liscr_args_geti_int (args, 1, &size.width)) liscr_args_gets_int (args, "height", &size.height); } /* Calculate from text if given. */ if (liscr_args_gets_string (args, "font", &font_name) && liscr_args_gets_string (args, "text", &text)) { if (liren_render_measure_text (widget->manager->render, font_name, text, size.width, &size_tmp.width, &size_tmp.height)) { if (size.width == -1) size.width = size_tmp.width; if (size.height == -1) size.height = size_tmp.height; } } /* Add paddings if given. */ if (liscr_args_gets_intv (args, "paddings", 4, paddings) == 4) { size.width += paddings[1] + paddings[2]; size.height += paddings[0] + paddings[3]; } /* Set the request. */ if (internal) liwdg_widget_set_request (args->self, 1, size.width, size.height); else liwdg_widget_set_request (args->self, 2, size.width, size.height); }
static void Sound_effect (LIScrArgs* args) { #ifndef LI_DISABLE_SOUND int tmp; int flags = 0; float pitch; float volume; const char* effect; LIEngObject* object; LIExtModule* module; LIMatVector velocity; LIScrData* data; LISndSource* source; if (liscr_args_gets_string (args, "effect", &effect) && liscr_args_gets_data (args, "object", LISCR_SCRIPT_OBJECT, &data)) { if (liscr_args_gets_bool (args, "positional", &tmp) && !tmp) flags |= LIEXT_SOUND_FLAG_NONPOSITIONAL; if (liscr_args_gets_bool (args, "repeating", &tmp) && tmp) flags |= LIEXT_SOUND_FLAG_REPEAT; object = liscr_data_get_data (data); module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_SOUND); source = liext_sound_set_effect (module, object->id, effect, flags); if (source != NULL) { if (liscr_args_gets_float (args, "pitch", &pitch)) lisnd_source_set_pitch (source, pitch); if (liscr_args_gets_float (args, "volume", &volume)) lisnd_source_set_volume (source, volume); if (liscr_args_gets_vector (args, "velocity", &velocity)) lisnd_source_set_velocity (source, &velocity); } } #endif }
static void Widget_get_request (LIScrArgs* args) { int internal = 0; LIWdgWidget* widget; widget = args->self; liscr_args_gets_bool (args, "internal", &internal); if (internal) { liscr_args_seti_int (args, widget->request[1].width); liscr_args_seti_int (args, widget->request[1].height); } else { if (widget->request[2].width >= 0) liscr_args_seti_int (args, widget->request[2].width); else liscr_args_seti_nil (args); if (widget->request[2].height >= 0) liscr_args_seti_int (args, widget->request[2].height); } }
static void Model_load (LIScrArgs* args) { int mesh = 1; char* file; const char* name; const char* path; LIMdlModel* tmpmdl; LIMaiProgram* program; program = liscr_script_get_userdata (args->script, LISCR_SCRIPT_PROGRAM); if (!liscr_args_geti_string (args, 0, &name) && !liscr_args_gets_string (args, "file", &name)) return; if (!liscr_args_geti_bool (args, 1, &mesh)) liscr_args_gets_bool (args, "mesh", &mesh); /* Find the absolute path. */ file = lisys_string_concat (name, ".lmdl"); if (file == NULL) return; path = lipth_paths_find_file (program->paths, file); if (path == NULL) { lisys_free (file); return; } lisys_free (file); /* Load the new model data. */ tmpmdl = limdl_model_new_from_file (path, mesh); if (tmpmdl == NULL) return; /* Replace the old model data. */ if (limdl_model_replace (args->self, tmpmdl)) liscr_args_seti_bool (args, 1); limdl_model_free (tmpmdl); }
static void Model_add_material (LIScrArgs* args) { int cull; float diffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; float specular[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; const char* shader; LIMdlBuilder* builder; LIMdlMaterial material; LIEngModel* model; /* Create a model builder. */ model = args->self; builder = limdl_builder_new (model->model); if (builder == NULL) return; /* Read material properties. */ /* TODO: Support more. */ limdl_material_init (&material); if (liscr_args_gets_bool (args, "cull", &cull) && !cull) material.flags &= ~LIMDL_MATERIAL_FLAG_CULLFACE; if (liscr_args_gets_floatv (args, "diffuse", 4, diffuse)) limdl_material_set_diffuse (&material, diffuse); if (liscr_args_gets_string (args, "shader", &shader)) limdl_material_set_shader (&material, shader); if (liscr_args_gets_floatv (args, "specular", 4, specular)) limdl_material_set_specular (&material, specular); /* Insert the material. */ limdl_builder_insert_material (builder, &material); limdl_builder_finish (builder); /* Cleanup. */ limdl_builder_free (builder); limdl_material_free (&material); }