jin.graphics = jin.graphics or {} local jg = jin.graphics jg.RenderMode = { FILL = 1, LINE = 2, } jg.SpriteOrigin = { TOPLEFT = 0, TOPCENTER = 1, TOPRIGHT = 2, MIDDLELEFT = 3, MIDDLECENTER = 4, MIDDLERIGHT = 5, BOTTOMLEFT = 6, BOTTOMCENTER = 7, BOTTOMRIGHT = 8 } jg.SpriteMode = { SINGLE = 1, RANDOM = 2, ANIMATED = 3 } jg.BlendMode = { DEFAULT = 1, ALPHA = 1, ADDITIVE = 2, PREMULTIPLIEDALPHA = 3 } -- Built in shaders. jg.Shaders = nil local function compileBuiltInShaders() if jg.Shaders ~= nil then return end jg.Shaders = {} jg.Shaders.Font = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return Color(col.rgb, texel(tex, v.uv).a); } #END_FRAGMENT_SHADER ]] jg.Shaders.Texture = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return col * texel(tex, v.uv); } #END_FRAGMENT_SHADER ]] jg.Shaders.Sprite = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return col * texel(tex, v.uv); } #END_FRAGMENT_SHADER ]] jg.Shaders.SpriteBatch = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return col * texel(tex, v.uv); } #END_FRAGMENT_SHADER ]] jg.Shaders.Shape = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return col; } #END_FRAGMENT_SHADER ]] jg.Shaders.Mesh = jg.newShader[[ #VERTEX_SHADER in Vec4 color; Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return col * texel(tex, v.uv) * v.color; } #END_FRAGMENT_SHADER ]] jg.Shaders.Default = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return col * texel(tex, v.uv); } #END_FRAGMENT_SHADER ]] jg.Shaders.Error = jg.newShader[[ #VERTEX_SHADER Vertex vert(Vertex v) { return v; } #END_VERTEX_SHADER #FRAGMENT_SHADER Color frag(Color col, Texture tex, Vertex v) { return Color(1, 0, 1, 1); } #END_FRAGMENT_SHADER ]] end local _init = jg.init local initialized = false jg.init = function(setting) if initialized then return initialized end initialized = _init(setting) if initialized then compileBuiltInShaders() jg.useShader(jg.Shaders.Default) end return initialized end -- Reset all attributes to default value. jg.reset = function() jg.setColor(255, 255, 255, 255) jg.setClearColor(0, 0, 0, 0) jg.clear() jg.unsetFont() jg.unuseShader() end jg.unuseShader = function() jg.useShader(jg.Shaders.Default) end local _newShader = jg.newShader jg.newShader = function(program) local shader = _newShader(program) if shader == nil then jin.log.error("Compile shader failed:\n" .. debug.traceback()) return jg.Shaders.Error else return shader end end local _newShaderf = jg.newShaderf jg.newShaderf = function(file) local shader = _newShaderf(file) if shader == nil then jin.log.error("Compile shader failed:\n" .. debug.traceback()) return jg.Shaders.Error else return shader end end