From ccfa075d244c87171799941125decd143c3fb37a Mon Sep 17 00:00:00 2001 From: shylie Date: Fri, 18 Jul 2025 20:11:38 -0400 Subject: [PATCH] Allow for different sprites per layer in :put --- zprite.lua | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/zprite.lua b/zprite.lua index b35bf46..594d3ea 100644 --- a/zprite.lua +++ b/zprite.lua @@ -61,7 +61,7 @@ vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords) ]]) local function ZPRITE_DEFAULT_COLORMAP(_) - return 1, 1, 1, 1 + return 1, 1, 1 end ---@param texture love.Image @@ -117,9 +117,9 @@ end --- Add an 'entity' to be rendered ---@param x number ---@param y number ----@param quad love.Quad +---@param quad love.Quad|fun(layer: integer): love.Quad ---@param layer_count integer ----@param color_map function? +---@param color_map (fun(layer: integer): integer, integer, integer)? ---@param base_layer integer? function zprite:put(x, y, quad, layer_count, color_map, base_layer) 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 = 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 if not self._instances[i + base_layer] then 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 r = 1 end + if r < 0 then + r = 0 + end if g > 1 then g = 1 end + if g < 0 then + g = 0 + end if b > 1 then b = 1 end + if b < 0 then + b = 0 + end local rb = bit.lshift(bit.band(r * 0xFF, 0xFF), 8) local gb = bit.lshift(bit.band(g * 0xFF, 0xFF), 16) local bb = bit.lshift(bit.band(b * 0xFF, 0xFF), 24) 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 }) self._count = self._count + 1 end