Skip to content

Commit

Permalink
Merge pull request ejoy#9 from ejoy/render
Browse files Browse the repository at this point in the history
change render layer
  • Loading branch information
cloudwu committed Nov 3, 2014
2 parents 1676a18 + 42c05d7 commit 0033286
Show file tree
Hide file tree
Showing 33 changed files with 2,365 additions and 416 deletions.
11 changes: 9 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
.PHONY : mingw ej2d linux undefined

CFLAGS = -g -Wall -Ilib -Ilua -D EJOY2D_OS=$(OS)
CFLAGS = -g -Wall -Ilib -Ilib/render -Ilua -D EJOY2D_OS=$(OS)
LDFLAGS :=

SRC := \
RENDER := \
lib/render/render.c \
lib/render/carray.c \
lib/render/log.c

EJOY2D := \
lib/shader.c \
lib/lshader.c \
lib/ejoy2dgame.c \
Expand All @@ -24,6 +29,8 @@ lib/scissor.c \
lib/renderbuffer.c \
lib/lrenderbuffer.c

SRC := $(EJOY2D) $(RENDER)

LUASRC := \
lua/lapi.c \
lua/lauxlib.c \
Expand Down
8 changes: 7 additions & 1 deletion ejoy2d/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ local shader = require "ejoy2d.shader"
local fw = require "ejoy2d.framework"

function fw.EJOY2D_INIT()
shader.init()
-- shader.init()
end

shader.init()

local ejoy2d = {}

local touch = {
Expand Down Expand Up @@ -43,4 +45,8 @@ function ejoy2d.clear(color)
return shader.clear(color)
end

function ejoy2d.define_shader(args)
return shader.define(args)
end

return ejoy2d
91 changes: 91 additions & 0 deletions ejoy2d/shader.lua
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,8 @@ local shader_name = {
BLEND = 6,
}

local shader_material = {}

function shader.init()
s.load(shader_name.NORMAL, PRECISION .. sprite_fs, PRECISION .. sprite_vs)
s.load(shader_name.TEXT, PRECISION .. text_fs, PRECISION .. sprite_vs)
Expand All @@ -210,15 +212,104 @@ function shader.init()
s.load(shader_name.COLOR, PRECISION .. color_fs, PRECISION .. sprite_vs)
s.load(shader_name.BLEND, PRECISION .. blend_fs, PRECISION .. blend_vs)
s.load(shader_name.RENDERBUFFER, PRECISION .. renderbuffer_fs, PRECISION_HIGH .. renderbuffer_vs)
s.uniform_bind(shader_name.RENDERBUFFER, { { name = "st", type = 4} }) -- st must the first uniform (the type is float4/4)
end

shader.draw = s.draw
shader.blend = s.blend
shader.clear = s.clear
shader.texture = s.shader_texture

function shader.id(name)
local id = assert(shader_name[name] , "Invalid shader name " .. name)
return id
end

-- user defined shader (or replace default shader)

local MAX_PROGRAM = 16
local USER_PROGRAM = 7

local uniform_format = {
float = 1,
float2 = 2,
float3 = 3,
float4 = 4,
matrix33 = 5,
matrix44 = 6,
}

local uniform_set = s.uniform_set

local function create_shader(id, uniform)
if uniform then
local s = {}
for index , u in ipairs(uniform) do
local loc = index-1
local format = u.type
s[u.name] = function(...)
uniform_set(id, loc, format, ...)
end
end
return s
end
end

local material_setuniform = s.material_setuniform
local material_settexture = s.material_settexture

local function material_meta(id, arg)
local uniform = arg.uniform
local meta
if uniform then
local index_table = {}
meta = { __index = index_table }
for index , u in ipairs(uniform) do
local loc = index-1
index_table[u.name] = function(self, ...)
material_setuniform(self.__obj, loc, ...)
end
end
if arg.texture then
index_table.texture = function(self, ...)
material_settexture(self.__obj, ...)
end
end
end
shader_material[id] = meta
end

function shader.define( arg )
local name = assert(arg.name)
local id = shader_name[name]
if id == nil then
assert(USER_PROGRAM < MAX_PROGRAM)
id = USER_PROGRAM
USER_PROGRAM = id + 1
end

local vs = PRECISION .. (arg.vs or sprite_vs)
local fs = PRECISION_HIGH .. (arg.fs or sprite_fs)

s.load(id, fs, vs, arg.texture)

local uniform = arg.uniform
if uniform then
for _,v in ipairs(uniform) do
v.type = assert(uniform_format[v.type])
end
s.uniform_bind(id, uniform)
end

local r = create_shader(id, uniform)
shader_name[name] = id

material_meta(id, arg)
return r
end

function shader.material_meta(prog)
return shader_material[prog]
end

return shader
17 changes: 17 additions & 0 deletions ejoy2d/sprite.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ local pack = require "ejoy2d.spritepack"
local shader = require "ejoy2d.shader"
local richtext = require "ejoy2d.richtext"

local setmetatable = setmetatable
local method = c.method
local method_fetch = method.fetch
local method_test = method.test
Expand All @@ -14,6 +15,22 @@ local test
local get = c.get
local set = c.set

local get_material = get.material
function get:material()
local m = get_material(self)
if m == nil then
local prog
m, prog = c.new_material(self)
if m == nil then
return
end
local meta = shader.material_meta(prog)
setmetatable(m, meta)
end

return m
end

local set_program = set.program
function set:program(prog)
if prog == nil then
Expand Down
3 changes: 3 additions & 0 deletions examples/ex07.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,12 @@ function game.update()
p=p+1
end

bird:ps(200,0)

function game.drawframe()
ej.clear()
rb:draw(p,p)
bird:draw(screencoord)
end

function game.touch(what, x, y)
Expand Down
86 changes: 86 additions & 0 deletions examples/ex08.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
-- This example show how user defined shader works

local ej = require "ejoy2d"
local fw = require "ejoy2d.framework"
local pack = require "ejoy2d.simplepackage"

pack.load {
pattern = fw.WorkDir..[[examples/asset/?]],
"sample",
}


-- define a shader
local s = ej.define_shader {
name = "EXAMPLE",
fs = [[
varying vec2 v_texcoord;
uniform vec4 color;
uniform sampler2D texture0;
void main() {
vec4 tmp = texture2D(texture0, v_texcoord);
gl_FragColor = color + tmp;
}
]],
uniform = {
{
name = "color",
type = "float4",
}
},
texture = {
"texture0",
}
}

s.color(1,0,0,1) -- set shader color


local obj = ej.sprite("sample","cannon")
obj:ps(100,100)
obj.program = "EXAMPLE"
obj.turret.program = "EXAMPLE"
obj.turret.material:color(0,0,1,1)


local obj2 = ej.sprite("sample","cannon")
obj2:ps(200,100)

obj2.turret.program = "EXAMPLE"
obj2.turret.material:color(0,1,0,1) -- uniform can be set in material


local obj3 = ej.sprite("sample","cannon")
obj3:ps(300,100)
obj3.program = "EXAMPLE"

local game = {}

function game.update()
end

function game.drawframe()
ej.clear(0xff808080) -- clear (0.5,0.5,0.5,1) gray
obj:draw()
obj2:draw()
obj3:draw()
end

function game.touch(what, x, y)
end

function game.message(...)
end

function game.handle_error(...)
end

function game.on_resume()
end

function game.on_pause()
end

ej.start(game)

Loading

0 comments on commit 0033286

Please sign in to comment.