static void Widget_canvas_image (LIScrArgs* args) { float color[4]; int dest_clip[4]; int dest_position[2]; int dest_size[2]; int source_position[2]; int source_tiling[6]; float* color_ptr = NULL; int* dest_position_ptr = NULL; int* dest_size_ptr = NULL; int* dest_clip_ptr = NULL; int* source_position_ptr = NULL; int* source_tiling_ptr = NULL; const char* source_image; float rotation = 0.0f; LIScrData* vector = NULL; LIMatVector* rotation_center_ptr = NULL; LIWdgWidget* widget; /* Process arguments. */ widget = args->self; if (!liscr_args_gets_string (args, "source_image", &source_image)) return; if (liscr_args_gets_floatv (args, "color", 4, color) == 4) { color_ptr = color; color[0] = LIMAT_CLAMP (color[0], 0.0f, 1.0f); color[1] = LIMAT_CLAMP (color[1], 0.0f, 1.0f); color[2] = LIMAT_CLAMP (color[2], 0.0f, 1.0f); color[3] = LIMAT_CLAMP (color[3], 0.0f, 1.0f); } if (liscr_args_gets_intv (args, "dest_clip", 4, dest_clip) == 4) dest_clip_ptr = dest_clip; if (liscr_args_gets_intv (args, "dest_position", 2, dest_position) == 2) dest_position_ptr = dest_position; if (liscr_args_gets_intv (args, "dest_size", 2, dest_size) == 2) dest_size_ptr = dest_size; if (liscr_args_gets_intv (args, "source_position", 2, source_position) == 2) source_position_ptr = source_position; if (liscr_args_gets_intv (args, "source_tiling", 6, source_tiling) == 6) source_tiling_ptr = source_tiling; liscr_args_gets_float (args, "rotation", &rotation); if (liscr_args_gets_data (args, "rotation_center", LISCR_SCRIPT_VECTOR, &vector)) rotation_center_ptr = liscr_data_get_data (vector); /* Create the canvas element. */ liwdg_widget_canvas_insert_image (widget, source_image, color_ptr, dest_clip_ptr, dest_position_ptr, dest_size_ptr, source_position_ptr, source_tiling_ptr, rotation, rotation_center_ptr); }
static void Widget_canvas_text (LIScrArgs* args) { int dest_clip[4]; int dest_position[2]; int dest_size[2]; float text_align[2]; float text_color[6]; int* dest_position_ptr = NULL; int* dest_size_ptr = NULL; int* dest_clip_ptr = NULL; float* text_align_ptr = NULL; float* text_color_ptr = NULL; const char* text; const char* text_font = "default"; float rotation = 0.0f; LIScrData* vector = NULL; LIMatVector* rotation_center_ptr = NULL; LIWdgWidget* widget; /* Process arguments. */ widget = args->self; if (!liscr_args_gets_string (args, "text", &text)) return; liscr_args_gets_string (args, "text_font", &text_font); if (liscr_args_gets_intv (args, "dest_clip", 4, dest_clip) == 4) dest_clip_ptr = dest_clip; if (liscr_args_gets_intv (args, "dest_position", 2, dest_position) == 2) dest_position_ptr = dest_position; if (liscr_args_gets_intv (args, "dest_size", 2, dest_size) == 2) dest_size_ptr = dest_size; if (liscr_args_gets_floatv (args, "text_alignment", 2, text_align) == 2) text_align_ptr = text_align; if (liscr_args_gets_floatv (args, "text_color", 4, text_color) == 4) { text_color_ptr = text_color; text_color[0] = LIMAT_CLAMP (text_color[0], 0.0f, 1.0f); text_color[1] = LIMAT_CLAMP (text_color[1], 0.0f, 1.0f); text_color[2] = LIMAT_CLAMP (text_color[2], 0.0f, 1.0f); text_color[3] = LIMAT_CLAMP (text_color[3], 0.0f, 1.0f); } liscr_args_gets_float (args, "rotation", &rotation); if (liscr_args_gets_data (args, "rotation_center", LISCR_SCRIPT_VECTOR, &vector)) rotation_center_ptr = liscr_data_get_data (vector); /* Create the canvas element. */ liwdg_widget_canvas_insert_text (widget, text_font, text, dest_clip_ptr, dest_position_ptr, dest_size_ptr, text_align_ptr, text_color_ptr, rotation, rotation_center_ptr); }
static void Lobby_upload_server_info (LIScrArgs* args) { #ifdef HAVE_CURL int port = 0; int players = 0; char* url; char* decoded; const char* desc = NULL; const char* master = NULL; const char* name = NULL; char error_buffer[CURL_ERROR_SIZE]; CURL* curl; /* Get arguments. */ if (!liscr_args_gets_string (args, "desc", &desc) || !liscr_args_gets_string (args, "master", &master) || !liscr_args_gets_string (args, "name", &name) || !liscr_args_gets_int (args, "players", &players) || !liscr_args_gets_int (args, "port", &port)) return; players = LIMAT_CLAMP (players, 0, 256); port = LIMAT_CLAMP (port, 1, 65535); /* Format the script URL. */ url = lisys_string_concat (master, "/lossrvapi.php"); if (url == NULL) return; /* POST to the master server. */ curl = curl_easy_init(); if (curl != NULL) { decoded = lisys_string_format ("u=%d|%d|%s|%s", port, players, name, desc); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_POSTFIELDS, decoded); curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, error_buffer); if (curl_easy_perform (curl)) { lisys_error_set (EINVAL, "lobby: %s", error_buffer); lisys_error_report (); } curl_easy_cleanup (curl); lisys_free (decoded); } lisys_free (url); #endif }
static void Model_calculate_lod (LIScrArgs* args) { int levels = 5; float factor = 0.3f; LIEngModel* model; LIMdlBuilder* builder; model = args->self; if (liscr_args_geti_int (args, 0, &levels)) levels = LIMAT_MAX (1, levels); if (liscr_args_geti_float (args, 1, &factor)) factor = LIMAT_CLAMP (factor, 0.0f, 1.0f); builder = limdl_builder_new (model->model); if (builder == NULL) return; limdl_builder_calculate_lod (builder, levels, factor); limdl_builder_finish (builder); limdl_builder_free (builder); liscr_args_seti_bool (args, 1); }
/** * \brief Casts a sphere against the stick and returns the hit fraction. * * FIXME: Doesn't work yet. * * \param self Terrain stick. * \param bot00 Bottom surface Y offset. * \param bot10 Bottom surface Y offset. * \param bot01 Bottom surface Y offset. * \param bot11 Bottom surface Y offset. * \param top00 Top surface Y offset. * \param top10 Top surface Y offset. * \param top01 Top surface Y offset. * \param top11 Top surface Y offset. * \param sphere_rel_cast_start Cast start position of the sphere, in grid units relative to the column origin. * \param sphere_rel_cast_end Cast end position of the sphere, in grid units relative to the column origin. * \param sphere_radius Sphere radius, in grid units. * \param result Return location for the hit fraction. * \return Nonzero if hit. Zero otherwise. */ int liext_terrain_stick_cast_sphere ( const LIExtTerrainStick* self, float bot00, float bot10, float bot01, float bot11, float top00, float top10, float top01, float top11, const LIMatVector* sphere_rel_cast_start, const LIMatVector* sphere_rel_cast_end, float sphere_radius, LIExtTerrainCollision* result) { float min; float max; LIExtTerrainCollision best; LIExtTerrainCollision frac; LIMatVector v; LIMatVector vtx[3]; LIMatVector point; LIMatPlane plane; frac.x = 0; frac.z = 0; best.fraction = LIMAT_INFINITE; v = limat_vector_subtract (*sphere_rel_cast_end, *sphere_rel_cast_start); /* Left. */ limat_plane_init (&plane, -1.0f, 0.0f, 0.0f, 0.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); min = limat_mix (bot00, bot01, point.z); max = limat_mix (top00, top01, point.z); if (point.z >= 0 && point.z <= 1.0f && min <= point.y && point.y <= max) { /* Direct face hit. */ best = frac; best.normal = limat_vector_init (-1.0f, 0.0f, 0.0f); best.point = limat_vector_init (0.0f, point.y, point.z); } else { /* Potential edge hit. */ point.z = LIMAT_CLAMP (point.z, 0.0f, 1.0f); min = limat_mix (bot00, bot01, point.z); max = limat_mix (top00, top01, point.z); point.y = LIMAT_CLAMP (point.y, min, max); if (limat_intersect_point_cast_sphere (&point, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius, &frac.fraction)) { if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { best = frac; best.normal = limat_vector_init (-1.0f, 0.0f, 0.0f); best.point = limat_vector_init (0.0f, point.y, point.z); } } } } /* Right. */ limat_plane_init (&plane, 1.0f, 0.0f, 0.0f, 1.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); min = limat_mix (bot10, bot11, point.z); max = limat_mix (top10, top11, point.z); if (point.z >= 0 && point.z <= 1.0f && min <= point.y && point.y <= max) { /* Direct face hit. */ best = frac; best.normal = limat_vector_init (1.0f, 0.0f, 0.0f); best.point = limat_vector_init (1.0f, point.y, point.z); } else { /* Potential edge hit. */ point.z = LIMAT_CLAMP (point.z, 0.0f, 1.0f); min = limat_mix (bot10, bot11, point.z); max = limat_mix (top10, top11, point.z); point.y = LIMAT_CLAMP (point.y, min, max); if (limat_intersect_point_cast_sphere (&point, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius, &frac.fraction)) { if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { best = frac; best.normal = limat_vector_init (1.0f, 0.0f, 0.0f); best.point = limat_vector_init (1.0f, point.y, point.z); } } } } /* Front. */ limat_plane_init (&plane, 0.0f, 0.0f, -1.0f, 0.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); min = limat_mix (bot00, bot10, point.z); max = limat_mix (top00, top10, point.z); if (point.x >= 0 && point.x <= 1.0f && min <= point.y && point.y <= max) { /* Direct face hit. */ best = frac; best.normal = limat_vector_init (0.0f, 0.0f, -1.0f); best.point = limat_vector_init (point.x, point.y, 0.0f); } else { /* Potential edge hit. */ point.x = LIMAT_CLAMP (point.x, 0.0f, 1.0f); min = limat_mix (bot00, bot10, point.z); max = limat_mix (top00, top10, point.z); point.y = LIMAT_CLAMP (point.y, min, max); if (limat_intersect_point_cast_sphere (&point, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius, &frac.fraction)) { if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { best = frac; best.normal = limat_vector_init (0.0f, 0.0f, -1.0f); best.point = limat_vector_init (point.x, point.y, 0.0f); } } } } /* Back. */ limat_plane_init (&plane, 0.0f, 0.0f, 1.0f, 1.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); min = limat_mix (bot01, bot11, point.z); max = limat_mix (top01, top11, point.z); if (point.x >= 0 && point.x <= 1.0f && min <= point.y && point.y <= max) { /* Direct face hit. */ best = frac; best.normal = limat_vector_init (0.0f, 0.0f, 1.0f); best.point = limat_vector_init (point.x, point.y, 1.0f); } else { /* Potential edge hit. */ point.x = LIMAT_CLAMP (point.x, 0.0f, 1.0f); min = limat_mix (bot01, bot11, point.z); max = limat_mix (top01, top11, point.z); point.y = LIMAT_CLAMP (point.y, min, max); if (limat_intersect_point_cast_sphere (&point, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius, &frac.fraction)) { if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { best = frac; best.normal = limat_vector_init (0.0f, 0.0f, 1.0f); best.point = limat_vector_init (point.x, point.y, 1.0f); } } } } /* Bottom. */ vtx[2] = limat_vector_init (0.0f, bot00, 0.0f); vtx[1] = limat_vector_init (0.0f, bot01, 1.0f); vtx[0] = limat_vector_init (1.0f, bot11, 1.0f); limat_plane_init_from_points (&plane, vtx + 0, vtx + 1, vtx + 2); lisys_assert (plane.y < 0.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); if (point.x >= 0.0f && point.z >= 0.0f && point.z <= 1.0f && point.z >= point.x) { /* Direct face hit. */ best = frac; limat_plane_get_normal (&plane, &best.normal); best.point = limat_vector_add (point, limat_vector_multiply (best.normal, -sphere_radius)); } else { /* TODO: Potential edge hit. */ } } vtx[2] = limat_vector_init (0.0f, bot00, 0.0f); vtx[1] = limat_vector_init (1.0f, bot11, 1.0f); vtx[0] = limat_vector_init (1.0f, bot10, 0.0f); limat_plane_init_from_points (&plane, vtx + 0, vtx + 1, vtx + 2); lisys_assert (plane.y < 0.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); if (point.x >= 0.0f && point.z >= 0.0f && point.x <= 1.0f && point.x >= point.z) { /* Direct face hit. */ best = frac; limat_plane_get_normal (&plane, &best.normal); best.point = limat_vector_add (point, limat_vector_multiply (best.normal, -sphere_radius)); } else { /* TODO: Potential edge hit. */ } } /* Top. */ vtx[2] = limat_vector_init (0.0f, top00, 0.0f); vtx[1] = limat_vector_init (1.0f, top10, 0.0f); vtx[0] = limat_vector_init (1.0f, top11, 1.0f); limat_plane_init_from_points (&plane, vtx + 0, vtx + 1, vtx + 2); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); lisys_assert (plane.y > 0.0f); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); if (point.x >= 0.0f && point.z >= 0.0f && point.x <= 1.0f && point.x >= point.z) { /* Direct face hit. */ best = frac; limat_plane_get_normal (&plane, &best.normal); best.point = limat_vector_add (point, limat_vector_multiply (best.normal, -sphere_radius)); } else { /* TODO: Potential edge hit. */ } } vtx[2] = limat_vector_init (0.0f, top00, 0.0f); vtx[1] = limat_vector_init (1.0f, top11, 1.0f); vtx[0] = limat_vector_init (0.0f, top10, 1.0f); limat_plane_init_from_points (&plane, vtx + 0, vtx + 1, vtx + 2); lisys_assert (plane.y > 0.0f); frac.fraction = limat_plane_cast_sphere (&plane, sphere_rel_cast_start, sphere_rel_cast_end, sphere_radius); if (frac.fraction >= 0.0f && best.fraction > frac.fraction) { point = limat_vector_add (*sphere_rel_cast_start, limat_vector_multiply (v, frac.fraction)); if (point.x >= 0.0f && point.z >= 0.0f && point.z <= 1.0f && point.z >= point.x) { /* Direct face hit. */ best = frac; limat_plane_get_normal (&plane, &best.normal); best.point = limat_vector_add (point, limat_vector_multiply (best.normal, -sphere_radius)); } else { /* TODO: Potential edge hit. */ } } /* Check whether a collision occurred. */ if (best.fraction > 1.0f || best.fraction == LIMAT_INFINITE) return 0; *result = best; return 1; }