This was written when using Defold version 1.6.3.
Sending variables to the shader program from a game object script is easy.
go.set("go#some_sprite", "primary_colour", vmath.vector4(0.5, 1, 0, 1))
Besides the above code, your custom material file also needs a Fragment Constant set with identical value: primary_color, type being: User.
Oh and the sprite needs to actually use that material.
You’re done now. ![]()
Oh what about sprites that are used in gui? Well.. Get ready to make your own custom renderer.. Fortunately it is surprisingly easy!
Links that helped me to figure things out:
Relevant code
gui_colour.fp
uniform lowp vec4 primary_colour;
custom.render_script
function init(self)
-- New pridicate which is what needs to be in the materials file "Tags" section.
self.gui_tint_pred = render.predicate({ "gui_colour" })
...
self.constants = render.constant_buffer()
self.constants.primary_colour = vmath.vector4(1, 0, 0, 1)
end
function update(self)
...
render.draw(self.gui_pred, { frustum = frustum })
-- Add the custom material which is set in the custom render file
render.enable_material("gui_mat")
render.draw(self.gui_tint_pred, {
frustum = frustum,
constants = self.constants
})
render.disable_material()
render.draw(self.text_pred, { frustum = frustum })
...
end
function on_message(self, message_id, message)
...
if message_id == hash("change_primary_colour") then
self.constants.primary_colour = message.p
end
end
cake.gui_script
msg.post("@render:", "change_primary_colour", { p = vmath.vector4(0.5, 1, 0, 1) })