예제 #1
0
void TexturePacker::save_resources(const CL_String &filename)
{
	// Map containing generated texture filenames for packed CL_Textures
	std::map<CL_Texture, CL_String> generated_texture_filenames;
	int generated_texture_index = 0;

	CL_String images_pathname = CL_PathHelp::get_fullpath(filename);

	// Loop through all resource items
	std::vector<ResourceItem *> &items = get_resource_items();
	std::vector<ResourceItem *>::size_type item_index, item_size;
	item_size = items.size();
	for(item_index = 0; item_index < item_size; ++item_index)
	{
		SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]);
		if (sprite_item)
			process_resource(sprite_item->resource, sprite_item->packed_sub_textures, generated_texture_filenames, generated_texture_index, images_pathname);

		ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]);
		if (image_item)
			process_resource(image_item->resource, image_item->packed_sub_textures, generated_texture_filenames, generated_texture_index, images_pathname);
	}

	// Save the entire resource DOM
	resources.save(filename);
}
예제 #2
0
clan::TextureGroup *TexturePacker::pack(clan::Canvas &canvas, const clan::Size &texture_size, int border_size, bool sort_on_width)
{
	clan::TextureGroup *group = new clan::TextureGroup(texture_size);

	std::vector<ResourceItem *> items = get_resource_items();

	if(sort_on_width)
		std::sort(items.begin(), items.end(), ImageWidthSortPredicate);

	std::vector<ResourceItem *>::size_type item_index, item_size;
	item_size = items.size();
	for(item_index = 0; item_index < item_size; ++item_index)
	{
		SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]);
		if(sprite_item)
		{
			sprite_item->packed_sub_textures.clear();

			unsigned int size = sprite_item->sprite.get_frame_count();
			for(unsigned int index = 0; index < size; ++index)
			{
				clan::Size frame_size = sprite_item->sprite.get_frame_size(index);

				clan::Subtexture sub_texture = group->add(canvas, clan::Size(frame_size.width + border_size*2, frame_size.height + border_size*2));
				sprite_item->packed_sub_textures.push_back(sub_texture);

				clan::Subtexture subtexture = sprite_item->sprite.get_frame_texture(index);
				clan::PixelBuffer pb = subtexture.get_texture().get_pixeldata(canvas, clan::tf_rgba8);
				pb = pb.copy(subtexture.get_geometry());
				last_border_size = border_size;
				if (last_border_size < 0) last_border_size= 0;
				clan::PixelBuffer new_pb = clan::PixelBufferHelp::add_border(pb, border_size, pb.get_size());
				sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size());
			}
		}

		ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]);
		if(image_item)
		{
			image_item->packed_sub_textures.clear();

			clan::Size frame_size = image_item->image.get_size();

			clan::Subtexture sub_texture = group->add(canvas, clan::Size(frame_size.width + border_size*2, frame_size.height + border_size*2));
			image_item->packed_sub_textures.push_back(sub_texture);

			clan::Subtexture subtexture = image_item->image.get_texture();
			clan::PixelBuffer pb = subtexture.get_texture().get_pixeldata(canvas, clan::tf_rgba8);
			pb = pb.copy(subtexture.get_geometry());
			last_border_size = border_size;
			if (last_border_size < 0) last_border_size = 0;
			clan::PixelBuffer new_pb = clan::PixelBufferHelp::add_border(pb, border_size, pb.get_size());
			sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size());
		}

		if(!func_pack_progress.is_null())
			func_pack_progress.invoke((int)item_index + 1, (int)item_size);
	}

	return group;
}
예제 #3
0
CL_TextureGroup *TexturePacker::pack(CL_GraphicContext &gc, const CL_Size &texture_size, int border_size)
{
	CL_TextureGroup *group = new CL_TextureGroup(gc, texture_size);

	std::vector<ResourceItem *> &items = get_resource_items();
	std::vector<ResourceItem *>::size_type item_index, item_size;
	item_size = items.size();
	for(item_index = 0; item_index < item_size; ++item_index)
	{
		SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]);
		if(sprite_item)
		{
			sprite_item->packed_sub_textures.clear();

			const std::vector<CL_SpriteDescriptionFrame> &frames = sprite_item->sprite_description.get_frames();
			std::vector<CL_SpriteDescriptionFrame>::size_type index, size;
			size = frames.size();
			for(index = 0; index < size; ++index)
			{
				CL_Rect frame_rect = frames[index].rect;

				CL_Subtexture sub_texture = group->add(gc, CL_Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2));
				sprite_item->packed_sub_textures.push_back(sub_texture);

				CL_Texture texture = frames[index].texture;
				const CL_PixelBuffer &pb = texture.get_pixeldata();
				last_border_size = border_size;
				if (last_border_size < 0) last_border_size= 0;
				CL_PixelBuffer new_pb = CL_PixelBufferHelp::add_border(pb, border_size, pb.get_size());
				sub_texture.get_texture().set_subimage(sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size());
			}
		}

		ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]);
		if(image_item)
		{
			image_item->packed_sub_textures.clear();

			const std::vector<CL_SpriteDescriptionFrame> &frames = image_item->sprite_description.get_frames();
			std::vector<CL_SpriteDescriptionFrame>::size_type index, size;
			size = frames.size();
			for(index = 0; index < size; ++index)
			{
				CL_Rect frame_rect = frames[index].rect;

				CL_Subtexture sub_texture = group->add(gc, CL_Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2));
				image_item->packed_sub_textures.push_back(sub_texture);

				CL_Texture texture = frames[index].texture;
				const CL_PixelBuffer &pb = texture.get_pixeldata();
				last_border_size = border_size;
				if (last_border_size < 0) last_border_size = 0;
				CL_PixelBuffer new_pb = CL_PixelBufferHelp::add_border(pb, border_size, pb.get_size());
				sub_texture.get_texture().set_subimage(sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size());
			}
		}

		if(!func_pack_progress.is_null())
			func_pack_progress.invoke((int)item_index + 1, (int)item_size);
	}

	return group;
}
예제 #4
0
TextureGroup *TexturePacker::pack(Canvas &canvas, const Size &texture_size, int border_size, bool sort_on_width)
{
	TextureGroup *group = new TextureGroup(texture_size);

	std::vector<ResourceItem *> items = get_resource_items();

	if(sort_on_width)
		std::sort(items.begin(), items.end(), ImageWidthSortPredicate);

	std::vector<ResourceItem *>::size_type item_index, item_size;
	item_size = items.size();
	for(item_index = 0; item_index < item_size; ++item_index)
	{
		SpriteResourceItem *sprite_item = dynamic_cast<SpriteResourceItem *>(items[item_index]);
		if(sprite_item)
		{
			sprite_item->packed_sub_textures.clear();

			const std::vector<SpriteDescriptionFrame> &frames = sprite_item->sprite_description.get_frames();
			std::vector<SpriteDescriptionFrame>::size_type index, size;
			size = frames.size();
			for(index = 0; index < size; ++index)
			{
				Rect frame_rect = frames[index].rect;

				Subtexture sub_texture = group->add(canvas, Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2));
				sprite_item->packed_sub_textures.push_back(sub_texture);

				Texture2D texture = frames[index].texture;
				const PixelBuffer &pb = texture.get_pixeldata(canvas);
				last_border_size = border_size;
				if (last_border_size < 0) last_border_size= 0;
				PixelBuffer new_pb = PixelBufferHelp::add_border(pb, border_size, pb.get_size());
				sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size());
			}
		}

		ImageResourceItem *image_item = dynamic_cast<ImageResourceItem *>(items[item_index]);
		if(image_item)
		{
			image_item->packed_sub_textures.clear();

			const std::vector<SpriteDescriptionFrame> &frames = image_item->sprite_description.get_frames();
			std::vector<SpriteDescriptionFrame>::size_type index, size;
			size = frames.size();
			for(index = 0; index < size; ++index)
			{
				Rect frame_rect = frames[index].rect;

				Subtexture sub_texture = group->add(canvas, Size(frame_rect.get_width() + border_size*2, frame_rect.get_height() + border_size*2));
				image_item->packed_sub_textures.push_back(sub_texture);

				Texture2D texture = frames[index].texture;
				const PixelBuffer &pb = texture.get_pixeldata(canvas);
				last_border_size = border_size;
				if (last_border_size < 0) last_border_size = 0;
				PixelBuffer new_pb = PixelBufferHelp::add_border(pb, border_size, pb.get_size());
				sub_texture.get_texture().set_subimage(canvas, sub_texture.get_geometry().get_top_left(), new_pb, new_pb.get_size());
			}
		}

		if(!func_pack_progress.is_null())
			func_pack_progress.invoke((int)item_index + 1, (int)item_size);
	}

	return group;
}