Sprite:setStencilOperation

From GiderosMobile
Revision as of 14:31, 13 July 2023 by Hgy29 (talk | contribs) (Text replacement - "<source" to "<syntaxhighlight")

Available since: Gideros 2017.6
Class: Sprite

Description

Allows to set a stencil operation to be used when drawing this sprite. <syntaxhighlight lang="lua"> Sprite:setStencilOperation(op) </source>


The op table can contain the following fields:

  • stencilClear: (boolean) whether the stencil should be cleared beforehand
  • stencilMask: (integer) the mask value used in stencil operations
  • stencilWriteMask: (integer) the mask value used when writing to stencil
  • stencilRef: (integer) the reference value used in stencil operations
  • stencilFunc: (integer) the stencil function to use
  • stencilFail: (integer) the stencil operation when stencil test failed
  • depthFail: (integer) the stencil operation when depth test failed
  • depthPass: (integer) the stencil operation when depth test has passed

Stencil function and operations code are defined in Sprite.STENCIL_xxx fields and correspond to the GL_xxx relevant values in OpenGL stencil documentation https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glStencilFunc.xhtml.

Parameters

op: (table) a table containing the stencil operation settings, or nil to disable stencil

Example

A glowing ticket effect: <syntaxhighlight lang="lua"> -- STENCILOPERATION @hgy29 local bg = Bitmap.new(Texture.new("gfx/vip/background.png")) local ticket = Bitmap.new(Texture.new("gfx/vip/ticket.png")) local text = Bitmap.new(Texture.new("gfx/vip/text.png")) local fx1 = Bitmap.new(Texture.new("gfx/vip/fx1.png")) local fx2 = Bitmap.new(Texture.new("gfx/vip/fx2.png"))

stage:addChild(bg) bg:setScale(0.5) stage:addChild(ticket) ticket:setPosition(80,20) ticket:setScale(0.5) ticket:addChild(fx1) fx1:setX(-100) fx1:addChild(fx2) fx2:setX(-100) ticket:addChild(text)

-- Use auto layout on ticket to center text automatically ticket:setLayoutParameters{ rowWeights = {1}, columnWeights = {1} } text:setLayoutConstraints{}

-- Use stencil for masking glow: -- 1) Clear stencil and set it to '1' for every pixel drawn on 'ticket' ticket:setStencilOperation{ stencilClear = true, stenciMask = 1, stencilWriteMask = 1, stencilRef = 1, stencilFunc = Sprite.STENCIL_ALWAYS, depthPass = Sprite.STENCIL_REPLACE } --2) Only draw fx1/fx2 if stencil isn't 0 fx1:setStencilOperation{ stencilClear = false, stencilMask = 1, stencilRef = 0, stencilFunc = Sprite.STENCIL_NOTEQUAL }

local dir = 1 stage:addEventListener(Event.ENTER_FRAME, function() if fx1:getX() > 450 then dir = -1 elseif fx1:getX() < -100 then dir = 1 end fx1:setX(fx1:getX() + dir*5) end) </source>