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 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); }
/** Script callback Los.heightmap_generate This function converts the image data to Voxels: <li>First image contains height information in color values</li> <li>Second image contains material information in color values</li> <li>Position is the lower inferior voxel of the mapped area</li> <li>Size is the volume of the mapped area. Base size must fit with image size</li> <li>Materials is an array of mat ID used to associate voxel types</li> \param LIScrArgs* args */ static void Heightmap_heightmap_generate (LIScrArgs* args) { LIExtModule* module; LIVoxManager* voxels; LIVoxVoxel* tmp; const char* map_file; const char* tiles_file; LIMatVector posv; LIMatVector sizev; int materials[MAX_TEXTURES]; void* map_data; void* tiles_data; int min[3]; int max[3]; int size[3]; int x,y,z, y2, i, value; printf("Starting heightmap generation\n"); module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_HEIGHTMAP); voxels = limai_program_find_component (module->program, "voxels"); if (voxels == NULL) return; if (!liscr_args_geti_string (args, 0, &map_file) && liscr_args_gets_string (args, "map", &map_file)) return; if (!liscr_args_geti_string (args, 1, &tiles_file)) liscr_args_gets_string (args, "tiles", &tiles_file); if (!liscr_args_geti_vector (args, 2, &posv)) liscr_args_gets_vector (args, "pos", &posv); if (!liscr_args_geti_vector (args, 3, &sizev)) liscr_args_gets_vector (args, "size", &sizev); if (!liscr_args_geti_intv (args, 4, MAX_TEXTURES, materials)) liscr_args_gets_intv (args, "materials", MAX_TEXTURES, materials); if (liext_heightmap_generate(module, map_file, &map_data) != 0) { return; } if (liext_heightmap_generate(module, tiles_file, &tiles_data) != 0) { liext_heightmap_cleanup(module, &map_data); return; } /* Calculate the size of the area. */ size[0] = sizev.x; size[1] = sizev.y; size[2] = sizev.z; min[0] = posv.x; min[1] = posv.y; min[2] = posv.z; max[0] = (int)posv.x + size[0]; max[1] = (int)posv.y + size[1]; max[2] = (int)posv.z + size[2]; printf("Coords: %d %d %d / %d %d %d / %d %d %d\n", min[0], min[1], min[2], max[0], max[1], max[2], size[0], size[1], size[2]); /* Batch copy terrain data. */ /* Reading all tiles at once is faster than operating on individual tiles since there are fewer sector lookups. */ tmp = lisys_calloc (size[0] * size[1] * size[2], sizeof (LIVoxVoxel)); if (tmp == NULL) { liext_heightmap_cleanup(module, &map_data); liext_heightmap_cleanup(module, &tiles_data); return; } livox_manager_copy_voxels (voxels, min[0], min[1], min[2], size[0], size[1], size[2], tmp); /* Apply heightmap to the copied tiles. */ i = 0; for (z = min[2] ; z < max[2] ; z++) for (y = min[1] ; y < max[1] ; y++) for (x = min[0] ; x < max[0] ; x++) { //TODO: better resolution y2 = 255 - liext_heightmap_find(module, x, z, map_data); printf("gen y: %d\n", y2); if (y2 != -1 && y <= y2) { value = liext_heightmap_find(module, x, z, tiles_data); if (value < 0 || value >= MAX_TEXTURES) { value = 0; } livox_voxel_init (tmp + i, 15 /* materials[value] */); printf("voxel: %d %d\n", i, value); } i++; } /* Batch write the copied tiles. */ livox_manager_paste_voxels (voxels, min[0], min[1], min[2], size[0], size[1], size[2], tmp); lisys_free (tmp); printf("Area has been successfully loaded from heightmap\n"); liext_heightmap_cleanup(module, &map_data); liext_heightmap_cleanup(module, &tiles_data); }