Allow for different sprites per layer in :put
This commit is contained in:
parent
6eba579c96
commit
ccfa075d24
42
zprite.lua
42
zprite.lua
@ -61,7 +61,7 @@ vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords)
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
local function ZPRITE_DEFAULT_COLORMAP(_)
|
local function ZPRITE_DEFAULT_COLORMAP(_)
|
||||||
return 1, 1, 1, 1
|
return 1, 1, 1
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param texture love.Image
|
---@param texture love.Image
|
||||||
@ -117,9 +117,9 @@ end
|
|||||||
--- Add an 'entity' to be rendered
|
--- Add an 'entity' to be rendered
|
||||||
---@param x number
|
---@param x number
|
||||||
---@param y number
|
---@param y number
|
||||||
---@param quad love.Quad
|
---@param quad love.Quad|fun(layer: integer): love.Quad
|
||||||
---@param layer_count integer
|
---@param layer_count integer
|
||||||
---@param color_map function?
|
---@param color_map (fun(layer: integer): integer, integer, integer)?
|
||||||
---@param base_layer integer?
|
---@param base_layer integer?
|
||||||
function zprite:put(x, y, quad, layer_count, color_map, base_layer)
|
function zprite:put(x, y, quad, layer_count, color_map, base_layer)
|
||||||
if #self._instances + layer_count > self._instance_vertex_count then
|
if #self._instances + layer_count > self._instance_vertex_count then
|
||||||
@ -135,19 +135,6 @@ function zprite:put(x, y, quad, layer_count, color_map, base_layer)
|
|||||||
local pos_y = bit.lshift(bit.band(y + 32768, 0xFFFF), 16)
|
local pos_y = bit.lshift(bit.band(y + 32768, 0xFFFF), 16)
|
||||||
local pos = bit.bor(pos_x, pos_y)
|
local pos = bit.bor(pos_x, pos_y)
|
||||||
|
|
||||||
local qx, qy, qw, qh = quad:getViewport()
|
|
||||||
local tw, th = self._texture:getPixelDimensions()
|
|
||||||
|
|
||||||
local uv_x = bit.band(1024 * qx / tw, 0x3FF)
|
|
||||||
local uv_y = bit.lshift(bit.band(1024 * qy / th, 0x3FF), 10)
|
|
||||||
local uv = bit.bor(uv_x, uv_y)
|
|
||||||
|
|
||||||
local scale_x = bit.lshift(bit.band(qw, 0x3F), 20)
|
|
||||||
local scale_y = bit.lshift(bit.band(qh, 0x3F), 26)
|
|
||||||
local scale = bit.bor(scale_x, scale_y)
|
|
||||||
|
|
||||||
local uv_scale = bit.bor(uv, scale)
|
|
||||||
|
|
||||||
for i = 1, layer_count do
|
for i = 1, layer_count do
|
||||||
if not self._instances[i + base_layer] then
|
if not self._instances[i + base_layer] then
|
||||||
self._instances[i + base_layer] = {}
|
self._instances[i + base_layer] = {}
|
||||||
@ -161,18 +148,41 @@ function zprite:put(x, y, quad, layer_count, color_map, base_layer)
|
|||||||
if r > 1 then
|
if r > 1 then
|
||||||
r = 1
|
r = 1
|
||||||
end
|
end
|
||||||
|
if r < 0 then
|
||||||
|
r = 0
|
||||||
|
end
|
||||||
if g > 1 then
|
if g > 1 then
|
||||||
g = 1
|
g = 1
|
||||||
end
|
end
|
||||||
|
if g < 0 then
|
||||||
|
g = 0
|
||||||
|
end
|
||||||
if b > 1 then
|
if b > 1 then
|
||||||
b = 1
|
b = 1
|
||||||
end
|
end
|
||||||
|
if b < 0 then
|
||||||
|
b = 0
|
||||||
|
end
|
||||||
local rb = bit.lshift(bit.band(r * 0xFF, 0xFF), 8)
|
local rb = bit.lshift(bit.band(r * 0xFF, 0xFF), 8)
|
||||||
local gb = bit.lshift(bit.band(g * 0xFF, 0xFF), 16)
|
local gb = bit.lshift(bit.band(g * 0xFF, 0xFF), 16)
|
||||||
local bb = bit.lshift(bit.band(b * 0xFF, 0xFF), 24)
|
local bb = bit.lshift(bit.band(b * 0xFF, 0xFF), 24)
|
||||||
|
|
||||||
local layer_rgb = bit.bor(bit.bor(layer, rb), bit.bor(gb, bb))
|
local layer_rgb = bit.bor(bit.bor(layer, rb), bit.bor(gb, bb))
|
||||||
|
|
||||||
|
local q = type(quad) == "function" and quad(layer) or quad
|
||||||
|
local qx, qy, qw, qh = q:getViewport()
|
||||||
|
local tw, th = self._texture:getPixelDimensions()
|
||||||
|
|
||||||
|
local uv_x = bit.band(1024 * qx / tw, 0x3FF)
|
||||||
|
local uv_y = bit.lshift(bit.band(1024 * qy / th, 0x3FF), 10)
|
||||||
|
local uv = bit.bor(uv_x, uv_y)
|
||||||
|
|
||||||
|
local scale_x = bit.lshift(bit.band(qw, 0x3F), 20)
|
||||||
|
local scale_y = bit.lshift(bit.band(qh, 0x3F), 26)
|
||||||
|
local scale = bit.bor(scale_x, scale_y)
|
||||||
|
|
||||||
|
local uv_scale = bit.bor(uv, scale)
|
||||||
|
|
||||||
table.insert(self._instances[i], { pos, uv_scale, layer_rgb })
|
table.insert(self._instances[i], { pos, uv_scale, layer_rgb })
|
||||||
self._count = self._count + 1
|
self._count = self._count + 1
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user