Requires https://github.com/space-wizards/RobustToolbox/pull/5023 This uses the new engine features (above) to add a displacement map shader. This allows deforming a sprite based on another sprite. Primary use case is automatically adapting human clothing sprites to different species, something we want to make species like Vox a reality. A basic example of wiring this up with Vox has been added. The system is however incredibly simple and **will** need more work by a content developer to select and toggle displacement maps when appropriate. I am leaving that to somebody else. For example right now the displacement map is applied even if a species already has custom-fit sprites for a piece of clothing, such as the grey jumpsuit for Vox. Basic Aseprite plugins to help with authoring displacement maps have also been made.
79 lines
1.7 KiB
Lua
79 lines
1.7 KiB
Lua
local sprite = app.editor.sprite
|
|
local cel = app.cel
|
|
|
|
if sprite.selection.isEmpty then
|
|
print("You need to select something sorry")
|
|
return
|
|
end
|
|
|
|
local diag = Dialog{
|
|
title = "Flip Displacement Map"
|
|
}
|
|
|
|
diag:check{
|
|
id = "horizontal",
|
|
label = "flip horizontal?"
|
|
}
|
|
|
|
diag:check{
|
|
id = "vertical",
|
|
label = "flip vertical?"
|
|
}
|
|
|
|
diag:button{
|
|
text = "ok",
|
|
focus = true,
|
|
onclick = function(ev)
|
|
local horizontal = diag.data["horizontal"]
|
|
local vertical = diag.data["vertical"]
|
|
|
|
local selection = sprite.selection
|
|
local image = cel.image:clone()
|
|
|
|
for x = 0, selection.bounds.width do
|
|
for y = 0, selection.bounds.height do
|
|
local xSel = x + selection.origin.x
|
|
local ySel = y + selection.origin.y
|
|
|
|
local xImg = xSel - cel.position.x
|
|
local yImg = ySel - cel.position.y
|
|
|
|
if xImg < 0 or xImg >= image.width or yImg < 0 or yImg >= image.height then
|
|
goto continue
|
|
end
|
|
|
|
local imgValue = image:getPixel(xImg, yImg)
|
|
local color = Color(imgValue)
|
|
|
|
if horizontal then
|
|
color.red = 128 + -(color.red - 128)
|
|
end
|
|
|
|
if vertical then
|
|
color.green = 128 + -(color.green - 128)
|
|
end
|
|
|
|
image:drawPixel(
|
|
xImg,
|
|
yImg,
|
|
app.pixelColor.rgba(color.red, color.green, color.blue, color.alpha))
|
|
|
|
::continue::
|
|
end
|
|
end
|
|
|
|
cel.image = image
|
|
|
|
diag:close()
|
|
end
|
|
}
|
|
|
|
diag:button{
|
|
text = "cancel",
|
|
onclick = function(ev)
|
|
diag:close()
|
|
end
|
|
}
|
|
|
|
diag:show()
|