Files
tbd-station-14/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua
Pieter-Jan Briers 2f7d0dedbd Displacement map prototype (#26709)
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.
2024-04-27 16:03:58 +10:00

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()