The example loads an image bundled as a custom resource (bundled in the game archive) and uses it to replace the first image of an atlas. See code comments for implementation details.
modify_atlas.script
-- load image from custom resources
-- read pixels and write them to a buffer
local function create_buffer_from_image(filename)
local png = assert(sys.load_resource(filename))
local loaded_image = image.load(png)
local width = loaded_image.width
local height = loaded_image.height
local pixels = loaded_image.buffer
local buffer_declaration = {
{
name = hash("rgba"),
type = buffer.VALUE_TYPE_UINT8,
count = 4
}
}
local pixel_buffer = buffer.create(width * height, buffer_declaration)
local pixel_stream = buffer.get_stream(pixel_buffer, hash("rgba"))
for y = 1, height do
for x = 1, width do
-- flip image
local pixels_index = ((height - y) * width * 4) + ((x - 1) * 4) + 1
local r = pixels:byte(pixels_index + 0)
local g = pixels:byte(pixels_index + 1)
local b = pixels:byte(pixels_index + 2)
local a = pixels:byte(pixels_index + 3)
-- write to buffer stream
local stream_index = ((y - 1) * width * 4) + ((x - 1) * 4) + 1
pixel_stream[stream_index + 0] = r
pixel_stream[stream_index + 1] = g
pixel_stream[stream_index + 2] = b
pixel_stream[stream_index + 3] = a
end
end
return pixel_buffer, width, height
end
local function replace_atlas_image()
-- get table with information about an atlas
local atlas = resource.get_atlas("/example/modify_atlas.a.texturesetc")
-- get table with information about the textured used by the atlas
local texture = resource.get_texture_info(atlas.texture)
pprint(atlas)
pprint(texture)
-- load an image as a Defold buffer
local pixel_buffer, width, height = create_buffer_from_image("/example/resources/shipYellow_manned.png")
-- get the UV coordinates of the first image in the atlas
local first_uvs = atlas.geometries[1].uvs
-- this offset should not be necessary but it seems like there is an issue with the
-- UVs in Defold 1.5.0
local x = first_uvs[1] - 0
local y = first_uvs[2] - 6
print(x, y)
print(width, height)
-- create a table with texture update information
-- we want to update only a sub region of the atlas starting at a
-- certain position and with a certain size
local texture_info = {
type = resource.TEXTURE_TYPE_2D,
width = width,
height = height,
format = resource.TEXTURE_FORMAT_RGBA,
x = x,
y = y,
compression_type = resource.COMPRESSION_TYPE_DEFAULT,
num_mip_maps = texture.mipmaps,
}
-- update the atlas texture with the pixels from the provided buffer
resource.set_texture(atlas.texture, texture_info, pixel_buffer)
end
function init(self)
msg.post(".", "acquire_input_focus")
end
function on_input(self, action_id, action)
if action.pressed then
replace_atlas_image()
end
end
If you want to play with these examples, you can get the project on Github.
Do you want to see more examples? Why not write a few yourself and submit a pull request? We love contributions.
GITHUB