Пример #1
0
static void Heightmap_new (LIScrArgs* args)
{
	int i;
	int size;
	float spacing;
	float scaling;
	LIExtHeightmap* heightmap;
	LIExtHeightmapModule* module;
	LIImgImage* image;
	LIMatVector position;
	LIScrData* data;

	/* Get arguments. */
	module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_HEIGHTMAP);
	if (!liscr_args_geti_vector (args, 0, &position))
		position = limat_vector_init (0.0f, 0.0f, 0.0f);
	if (!liscr_args_geti_int (args, 1, &size))
		size = 33;
	else if (size < 0)
		size = 0;
	if (!liscr_args_geti_float (args, 2, &spacing))
		spacing = 1.0f;
	else if (spacing <= 0.0f)
		spacing = 1.0f;
	if (!liscr_args_geti_float (args, 3, &scaling))
		scaling = 1.0f;
	else if (scaling <= 0.0f)
		scaling = 1.0f;
	if (liscr_args_geti_data (args, 4, LIEXT_SCRIPT_IMAGE, &data))
		image = liscr_data_get_data (data);
	else
		image = NULL;

	/* Ensure that the size is valid. */
	for (i = 32 ; i < 65536 ; i *= 2)
	{
		if (size == i + 1)
			break;
	}
	if (size != i + 1)
	{
		lisys_error_set (EINVAL, "invalid heightmap size");
		lisys_error_report ();
		return;
	}

	/* Allocate the heightmap. */
	heightmap = liext_heightmap_new (module, image, &position, size, spacing, scaling);
	if (heightmap == NULL)
		return;

	/* Allocate the userdata. */
	data = liscr_data_new (args->script, args->lua, heightmap, LIEXT_SCRIPT_HEIGHTMAP, liext_heightmap_free);
	if (data == NULL)
	{
		liext_heightmap_free (heightmap);
		return;
	}
	liscr_args_seti_stack (args);
}
Пример #2
0
static void Terrain_add_box (LIScrArgs* args)
{
	int grid_x1;
	int grid_z1;
	int grid_x2;
	int grid_z2;
	float world_y;
	float world_h;
	int material;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x1) || grid_x1 < 0)
		return;
	if (!liscr_args_geti_int (args, 1, &grid_z1) || grid_z1 < 0)
		return;
	if (!liscr_args_geti_int (args, 2, &grid_x2) || grid_x2 < grid_x1)
		return;
	if (!liscr_args_geti_int (args, 3, &grid_z2) || grid_z2 < grid_z1)
		return;
	if (!liscr_args_geti_float (args, 4, &world_y) || world_y < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 5, &world_h))
		return;
	world_h = LIMAT_MAX (world_h, LIEXT_STICK_EPSILON);
	if (!liscr_args_geti_int (args, 6, &material) || material < 0)
		return;

	liscr_args_seti_int (args, liext_terrain_add_box (args->self,
		grid_x1, grid_z1, grid_x2, grid_z2, world_y, world_h,
		material, NULL, NULL));
}
Пример #3
0
static void ImageMerger_blit_hsv_add_weightv (LIScrArgs* args)
{
	float val_range;
	LIImgAsyncMerger* self;
	LIImgColorHSV hsv;
	LIImgImage* image;
	LIScrData* data;

	/* Get arguments. */
	self = args->self;
	if (!liscr_args_geti_data (args, 0, LIEXT_SCRIPT_IMAGE, &data))
		return;
	if (!liscr_args_geti_float (args, 1, &hsv.h))
		hsv.h = 0.0f;
	if (!liscr_args_geti_float (args, 2, &hsv.s))
		hsv.s = 0.0f;
	if (!liscr_args_geti_float (args, 3, &hsv.v))
		hsv.v = 0.0f;
	if (!liscr_args_geti_float (args, 4, &val_range))
		val_range = 0.2f;
	image = liscr_data_get_data (data);

	/* Add the task. */
	liimg_async_merger_blit_hsv_add_weightv (self, image, NULL, NULL, &hsv, val_range);
}
Пример #4
0
static void Terrain_add_stick_filter_mask (LIScrArgs* args)
{
	int grid_x;
	int grid_z;
	float world_y;
	float world_h;
	int material;
	int mask;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x) || grid_x < 0)
		return;
	if (!liscr_args_geti_int (args, 1, &grid_z) || grid_z < 0)
		return;
	if (!liscr_args_geti_float (args, 2, &world_y) || world_y < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 3, &world_h))
		return;
	world_h = LIMAT_MAX (world_h, LIEXT_STICK_EPSILON);
	if (!liscr_args_geti_int (args, 4, &material) || material < 0)
		return;
	if (!liscr_args_geti_int (args, 5, &mask) || mask < 0)
		return;

	liscr_args_seti_bool (args, liext_terrain_add_stick (args->self, grid_x, grid_z, world_y, world_h, material,
		liext_terrain_stick_filter_mask, &mask));
}
Пример #5
0
static void Terrain_add_stick_corners (LIScrArgs* args)
{
	int grid_x;
	int grid_z;
	float bot[4];
	float top[4];
	int material;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x) || grid_x < 0)
		return;
	if (!liscr_args_geti_int (args, 1, &grid_z) || grid_z < 0)
		return;
	if (!liscr_args_geti_float (args, 2, bot + 0) || bot[0] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 3, bot + 1) || bot[1] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 4, bot + 2) || bot[2] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 5, bot + 3) || bot[3] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 6, top + 0) || top[0] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 7, top + 1) || top[1] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 8, top + 2) || top[2] < 0.0f)
		return;
	if (!liscr_args_geti_float (args, 9, top + 3) || top[3] < 0.0f)
		return;
	if (!liscr_args_geti_int (args, 10, &material) || material < 0)
		return;

	liscr_args_seti_bool (args, liext_terrain_add_stick_corners (args->self, grid_x, grid_z,
		bot[0], bot[1], bot[2], bot[3], top[0], top[1], top[2], top[3], material, NULL, NULL));
}
Пример #6
0
static void Camera_set_fov (LIScrArgs* args)
{
	float fov = M_PI / 5.0f;

	liscr_args_geti_float (args, 0, &fov);
	liext_camera_set_fov (args->self, fov);
}
Пример #7
0
static void Camera_zoom (LIScrArgs* args)
{
	float value;

	if (liscr_args_geti_float (args, 0, &value))
		liext_camera_zoom (args->self, value);
}
Пример #8
0
static void Camera_update (LIScrArgs* args)
{
	float secs;

	if (liscr_args_geti_float (args, 0, &secs))
		liext_camera_update (args->self, secs);
}
Пример #9
0
static void Camera_turn (LIScrArgs* args)
{
	float value;

	if (liscr_args_geti_float (args, 0, &value))
		liext_camera_turn (args->self, value * M_PI / 180.0f);
}
Пример #10
0
static void Terrain_new (LIScrArgs* args)
{
	int chunk_size;
	float grid_size;
	LIExtTerrain* self;
	LIExtTerrainModule* module;
	LIScrData* data;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &chunk_size) || chunk_size < 1)
		return;
	if (!liscr_args_geti_float (args, 1, &grid_size) || grid_size <= 0.0f)
		return;
	module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_TERRAIN);

	/* Allocate the object. */
	self = liext_terrain_new (module, chunk_size, grid_size);
	if (self == NULL)
		return;

	/* Allocate the userdata. */
	data = liscr_data_new (args->script, args->lua, self, LIEXT_SCRIPT_TERRAIN, liext_terrain_free);
	if (data == NULL)
	{
		liext_terrain_free (self);
		return;
	}
	liscr_args_seti_stack (args);
}
Пример #11
0
static void Heightmap_add_texture_layer (LIScrArgs* args)
{
	float size;
	const char* name;
	const char* diffuse;
	const char* specular;
	const char* normal;
	const char* height;
	const char* blend;

	/* Get arguments. */
	if (!liscr_args_geti_float (args, 0, &size))
		size = 1.0f;
	if (!liscr_args_geti_string (args, 1, &name) ||
	    !liscr_args_geti_string (args, 2, &diffuse) ||
	    !liscr_args_geti_string (args, 3, &specular) ||
	    !liscr_args_geti_string (args, 4, &normal) ||
	    !liscr_args_geti_string (args, 5, &height))
		return;
	if (!liscr_args_geti_string (args, 6, &blend))
		blend = NULL;

	/* Create the layer. */
	if (!liext_heightmap_add_texture_layer (args->self, size, name, diffuse, specular, normal, height, blend))
		lisys_error_report ();
}
Пример #12
0
static void Terrain_cast_sphere (LIScrArgs* args)
{
	float radius;
	LIExtTerrain* self;
	LIMatVector src;
	LIMatVector dst;
	LIExtTerrainCollision result;

	/* Get the arguments. */
	self = args->self;
	if (!liscr_args_geti_vector (args, 0, &src))
		return;
	if (!liscr_args_geti_vector (args, 1, &dst))
		return;
	if (!liscr_args_geti_float (args, 2, &radius))
		return;
	if (radius <= LIMAT_EPSILON)
		return;

	/* Convert into grid coordinates. */
	src.x /= self->grid_size;
	src.z /= self->grid_size;
	dst.x /= self->grid_size;
	dst.z /= self->grid_size;
	radius /= self->grid_size;

	/* Cast the sphere. */
	if (!liext_terrain_cast_sphere (self, &src, &dst, radius, &result))
		return;
	liscr_args_seti_float (args, result.fraction);
}
Пример #13
0
static void Widget_set_alpha (LIScrArgs* args)
{
	float value;

	if (liscr_args_geti_float (args, 0, &value))
		liwdg_widget_set_alpha (args->self, value);
}
Пример #14
0
static void ImageMerger_add_hsv (LIScrArgs* args)
{
	LIImgAsyncMerger* self;
	LIImgColorHSV hsv;

	/* Get arguments. */
	self = args->self;
	if (!liscr_args_geti_float (args, 0, &hsv.h))
		hsv.h = 0.0f;
	if (!liscr_args_geti_float (args, 1, &hsv.s))
		hsv.s = 0.0f;
	if (!liscr_args_geti_float (args, 2, &hsv.v))
		hsv.v = 0.0f;

	/* Add the task. */
	liimg_async_merger_add_hsv (self, &hsv);
}
Пример #15
0
static void FirFilter_add (LIScrArgs* args)
{
	float value;

	if (!liscr_args_geti_float (args, 0, &value))
		return;

	liext_fir_filter_add (args->self, value);
}
Пример #16
0
static void Camera_set_rotation_smoothing (LIScrArgs* args)
{
	float pos;
	float rot;

	liext_camera_get_smoothing (args->self, &pos, &rot);
	liscr_args_geti_float (args, 0, &rot);
	liext_camera_set_smoothing (args->self, pos, rot);
}
Пример #17
0
static void Terrain_smoothen_column (LIScrArgs* args)
{
	int grid_x;
	int grid_z;
	float y;
	float h;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x) || grid_x < 0)
		return;
	if (!liscr_args_geti_int (args, 1, &grid_z) || grid_z < 0)
		return;
	if (!liscr_args_geti_float (args, 2, &y))
		return;
	if (!liscr_args_geti_float (args, 3, &h) || h <= 0.0f)
		return;

	liscr_args_seti_bool (args, liext_terrain_smoothen_column (args->self, grid_x, grid_z, y, h));
}
Пример #18
0
static void Camera_calculate_smoothed_transform (LIScrArgs* args)
{
	float position_smoothing = 1.0f;
	float rotation_smoothing = 1.0f;
	LIMatTransform target;
	LIMatTransform result;

	if (!liscr_args_geti_vector (args, 0, &target.position))
		return;
	if (!liscr_args_geti_quaternion (args, 1, &target.rotation))
		return;
	liscr_args_geti_float (args, 2, &position_smoothing);
	liscr_args_geti_float (args, 3, &rotation_smoothing);

	liext_camera_calculate_smoothed_transform (
		args->self, &target, position_smoothing, rotation_smoothing, &result);
	liscr_args_seti_vector (args, &result.position);
	liscr_args_seti_quaternion (args, &result.rotation);
}
Пример #19
0
static void Camera_set_near (LIScrArgs* args)
{
	float value;
	LIExtCamera* camera;

	if (liscr_args_geti_float (args, 0, &value) && value > 0.0f)
	{
		camera = args->self;
		liext_camera_set_near (camera, value);
	}
}
Пример #20
0
static void ImageMerger_blit_rect_hsv_add_weightv (LIScrArgs* args)
{
	float val_range;
	LIImgAsyncMerger* self;
	LIImgColorHSV hsv;
	LIImgImage* image;
	LIScrData* data;
	LIMatRectInt dst_rect;
	LIMatRectInt src_rect;

	/* Get arguments. */
	self = args->self;
	if (!liscr_args_geti_data (args, 0, LIEXT_SCRIPT_IMAGE, &data))
		return;
	if (!liscr_args_geti_int (args, 1, &dst_rect.x))
		return;
	if (!liscr_args_geti_int (args, 2, &dst_rect.y))
		return;
	if (!liscr_args_geti_int (args, 3, &dst_rect.width))
		return;
	if (!liscr_args_geti_int (args, 4, &dst_rect.height))
		return;
	if (!liscr_args_geti_int (args, 5, &src_rect.x))
		return;
	if (!liscr_args_geti_int (args, 6, &src_rect.y))
		return;
	src_rect.width = dst_rect.width;
	src_rect.height = dst_rect.height;
	if (!liscr_args_geti_float (args, 7, &hsv.h))
		hsv.h = 0.0f;
	if (!liscr_args_geti_float (args, 8, &hsv.s))
		hsv.s = 0.0f;
	if (!liscr_args_geti_float (args, 9, &hsv.v))
		hsv.v = 0.0f;
	if (!liscr_args_geti_float (args, 10, &val_range))
		val_range = 0.2f;
	image = liscr_data_get_data (data);

	/* Add the task. */
	liimg_async_merger_blit_hsv_add_weightv (self, image, &dst_rect, &src_rect, &hsv, val_range);
}
Пример #21
0
static void Sound_set_music_volume (LIScrArgs* args)
{
#ifndef LI_DISABLE_SOUND
	float value;
	LIExtModule* module;

	if (liscr_args_geti_float (args, 0, &value))
	{
		module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_SOUND);
		liext_sound_set_music_volume (module, value);
	}
#endif
}
Пример #22
0
static void Terrain_find_nearest_empty_stick (LIScrArgs* args)
{
	int grid_x;
	int grid_z;
	float y;
	float min_height;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x) || grid_x < 0 ||
	    !liscr_args_geti_int (args, 1, &grid_z) || grid_z < 0)
	{
		liscr_args_seti_float (args, 1000000000.0f);
		return;
	}
	if (!liscr_args_geti_float (args, 2, &y))
		return;
	if (!liscr_args_geti_float (args, 3, &min_height))
		min_height = 0.0f;

	/* Find the stick. */
	y = liext_terrain_find_nearest_empty_stick (args->self, grid_x, grid_z, y, min_height);
	liscr_args_seti_float (args, y);
}
Пример #23
0
static void Sound_set_music_offset (LIScrArgs* args)
{
#ifndef LI_DISABLE_SOUND
	float value;
	LIExtModule* module;

	if (liscr_args_geti_float (args, 0, &value))
	{
		module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_SOUND);
		if (module->music != NULL)
			lisnd_source_set_offset (module->music, value);
	}
#endif
}
Пример #24
0
static void Camera_calculate_3rd_person_clipped_distance (LIScrArgs* args)
{
	int group = 0xFFFF;
	int mask = 0xFFFF;
	float distance;
	float radius;
	float result;
	LIMatTransform center;

	if (!liscr_args_geti_vector (args, 0, &center.position))
		return;
	if (!liscr_args_geti_quaternion (args, 1, &center.rotation))
		return;
	if (!liscr_args_geti_float (args, 2, &distance))
		return;
	if (!liscr_args_geti_float (args, 3, &radius))
		radius = 0.0f;
	liscr_args_geti_int (args, 4, &group);
	liscr_args_geti_int (args, 5, &mask);

	result = liext_camera_calculate_3rd_person_clipped_distance (
		args->self, &center, distance, radius, group, mask);
	liscr_args_seti_float (args, result);
}
Пример #25
0
static void Camera_calculate_3rd_person_transform (LIScrArgs* args)
{
	float distance;
	LIMatTransform center;
	LIMatTransform result;

	if (!liscr_args_geti_vector (args, 0, &center.position))
		return;
	if (!liscr_args_geti_quaternion (args, 1, &center.rotation))
		return;
	if (!liscr_args_geti_float (args, 2, &distance))
		return;

	liext_camera_calculate_3rd_person_transform (
		args->self, &center, distance, &result);
	liscr_args_seti_vector (args, &result.position);
	liscr_args_seti_quaternion (args, &result.rotation);
}
Пример #26
0
static void Terrain_get_stick (LIScrArgs* args)
{
	int grid_x;
	int grid_z;
	float y;
	float ref_y;
	LIExtTerrainColumn* column;
	LIExtTerrainStick* stick;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x) || grid_x < 0)
		return;
	if (!liscr_args_geti_int (args, 1, &grid_z) || grid_z < 0)
		return;
	if (!liscr_args_geti_float (args, 2, &ref_y))
		return;

	/* Get the column. */
	column = liext_terrain_get_column (args->self, grid_x, grid_z);
	if (column == NULL)
		return;

	/* Find the stick. */
	y = 0.0f;
	for (stick = column->sticks ; stick != NULL ; stick = stick->next)
	{
		if (ref_y < y + stick->height)
		{
			liscr_args_seti_float (args, y);
			liscr_args_seti_float (args, stick->height);
			liscr_args_seti_int (args, stick->material);
			return;
		}
		y += stick->height;
	}

	/* Return the infinite end stick. */
	liscr_args_seti_float (args, y);
	liscr_args_seti_float (args, 1000000.0f);
	liscr_args_seti_int (args, 0);
}
Пример #27
0
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);
}
Пример #28
0
static void Model_morph (LIScrArgs* args)
{
	float value = 0.5f;
	const char* shape;
	LIEngModel* model;
	LIEngModel* ref = NULL;
	LIScrData* data;

	model = args->self;
	if (!liscr_args_geti_string (args, 0, &shape) &&
	    !liscr_args_gets_string (args, "shape", &shape))
		return;
	if (!liscr_args_geti_float (args, 1, &value))
		liscr_args_gets_float (args, "value", &value);
	if (!liscr_args_geti_data (args, 2, LISCR_SCRIPT_MODEL, &data))
		liscr_args_gets_data (args, "ref", LISCR_SCRIPT_MODEL, &data);
	if (data != NULL)
		ref = liscr_data_get_data (data);

	liscr_args_seti_bool (args, limdl_model_morph (model->model,
		(ref != NULL)? ref->model : NULL, shape, value));
}
Пример #29
0
static void Terrain_count_column_materials (LIScrArgs* args)
{
	int grid_x;
	int grid_z;
	float y;
	float min;
	float max;
	float length;
	float start = 0.0f;
	float height = -1.0f;
	LIExtTerrainColumn* column;
	LIExtTerrainStick* stick;

	/* Get the arguments. */
	if (!liscr_args_geti_int (args, 0, &grid_x) || grid_x < 0)
		return;
	if (!liscr_args_geti_int (args, 1, &grid_z) || grid_z < 0)
		return;
	if (liscr_args_geti_float (args, 2, &start))
		start = LIMAT_MAX (0.0f, start);
	if (liscr_args_geti_float (args, 3, &height))
		height = LIMAT_MAX (0.0f, height);
	if (!liscr_args_geti_table (args, 4))
		return;

	/* Get the column. */
	column = liext_terrain_get_column (args->self, grid_x, grid_z);
	if (column == NULL)
		return;

	/* Count the materials and add the counts to the table. */
	for (y = 0.0f, stick = column->sticks ; stick != NULL ; y += stick->height, stick = stick->next)
	{
		if (height >= 0.0f)
		{
			min = LIMAT_MAX (y, start);
			max = LIMAT_MIN (y + stick->height, start + height);
		}
		else
		{
			min = LIMAT_MAX (y, start);
			max = y + stick->height;
		}
		length = max - min;
		if (length > 0.0f)
		{
			lua_pushnumber (args->lua, stick->material);
			lua_pushnumber (args->lua, stick->material);
			lua_gettable (args->lua, -3);
			if (lua_type (args->lua, -1) == LUA_TNUMBER)
				length += lua_tonumber (args->lua, -1);
			lua_pop (args->lua, 1);
			lua_pushnumber (args->lua, length);
			lua_settable (args->lua, -3);
		}
	}

	/* Add the remainder if the range was given. */
	if (height >= 0.0f)
	{
		length = start + height - y;
		if (length > 0.0f)
		{
			lua_pushnumber (args->lua, 0);
			lua_pushnumber (args->lua, 0);
			lua_gettable (args->lua, -3);
			if (lua_type (args->lua, -1) == LUA_TNUMBER)
				length += lua_tonumber (args->lua, -1);
			lua_pop (args->lua, 1);
			lua_pushnumber (args->lua, length);
			lua_settable (args->lua, -3);
		}
	}
}