more sg javascript options
This commit is contained in:
parent
5eac1d03e9
commit
26b42a6747
|
@ -95,7 +95,11 @@ game.engine_start = function (s) {
|
|||
s();
|
||||
|
||||
shape.quad = {
|
||||
pos: os.make_buffer([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0], 0),
|
||||
pos: os.make_buffer([
|
||||
0, 0, 0,
|
||||
0, 1, 0,
|
||||
1, 0, 0,
|
||||
1, 1, 0], 0),
|
||||
verts: 4,
|
||||
uv: os.make_buffer([0, 1, 1, 1, 0, 0, 1, 0], 2),
|
||||
index: os.make_buffer([0, 1, 2, 2, 1, 3], 1),
|
||||
|
@ -107,11 +111,15 @@ game.engine_start = function (s) {
|
|||
uv: os.make_buffer([0, 0, 0.5, 1, 1, 0], 2),
|
||||
verts: 3,
|
||||
count: 3,
|
||||
index: os.make_buffer([0, 2, 1], 1),
|
||||
index: os.make_buffer([0, 1, 2], 1),
|
||||
};
|
||||
|
||||
shape.centered_quad = {
|
||||
pos: os.make_buffer([-0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5], 0),
|
||||
pos: os.make_buffer([
|
||||
-0.5, -0.5, -0.5,
|
||||
-0.5, 0.5, -0.5,
|
||||
0.5, -0.5, -0.5,
|
||||
0.5, 0.5, -0.5], 0),
|
||||
verts: 4,
|
||||
uv: os.make_buffer([0, 1, 1, 1, 0, 0, 1, 0], 2),
|
||||
index: os.make_buffer([0, 1, 2, 2, 1, 3], 1),
|
||||
|
|
|
@ -8,6 +8,188 @@ var cur = {};
|
|||
cur.images = [];
|
||||
cur.samplers = [];
|
||||
|
||||
/* A pipeline defines the characteristics of the incoming draw.
|
||||
{
|
||||
shader <--- the shader determines the vertex layout,
|
||||
depth
|
||||
compare always (never/less/equal/less_equal/greater/not_equal/greater_equal/always)
|
||||
write false
|
||||
bias 0
|
||||
bias_slope_scale 0
|
||||
bias_clamp 0
|
||||
stencil
|
||||
enabled false
|
||||
front/back
|
||||
compare always
|
||||
fail_op keep (zero/replace/incr_clamp/decr_clamp/invert/incr_wrap/decr_wrap)
|
||||
depth_fail_op keep
|
||||
pass_op keep
|
||||
read true
|
||||
write false
|
||||
ref 0 (0-255)
|
||||
color
|
||||
write_mask rgba
|
||||
blend
|
||||
enabled false
|
||||
src_factor_rgb one
|
||||
dst_factor_rgb zero
|
||||
op_rgb add
|
||||
src_factor_alpha one
|
||||
dst_factor_alpha zero
|
||||
op_alpha add
|
||||
cull none
|
||||
face_winding cw
|
||||
alpha_to_coverage false
|
||||
label ""
|
||||
*/
|
||||
|
||||
var blendop = {
|
||||
add: 1,
|
||||
subtract: 2,
|
||||
reverse_subtract: 3
|
||||
};
|
||||
|
||||
var blendfactor = {
|
||||
zero: 1,
|
||||
one: 2,
|
||||
src_color: 3,
|
||||
one_minus_src_color: 4,
|
||||
src_alpha: 5,
|
||||
one_minus_src_alpha: 6,
|
||||
dst_color: 7,
|
||||
one_minus_dst_color: 8,
|
||||
dst_alpha: 9,
|
||||
one_minus_dst_alpha: 10,
|
||||
src_alpha_saturated: 11,
|
||||
blend_color: 12,
|
||||
one_minus_blend_color: 13,
|
||||
blend_alpha: 14,
|
||||
one_minus_blend_alpha: 15
|
||||
};
|
||||
|
||||
var colormask = {
|
||||
none: 0x10,
|
||||
r: 0x1,
|
||||
g: 0x2,
|
||||
rg: 0x3,
|
||||
b: 0x4,
|
||||
rb: 0x5,
|
||||
gb: 0x6,
|
||||
rgb: 0x7,
|
||||
a: 0x8,
|
||||
ra: 0x9,
|
||||
ga: 0xA,
|
||||
rga: 0xB,
|
||||
ba: 0xC,
|
||||
rba: 0xD,
|
||||
gba: 0xE,
|
||||
rgba: 0xF
|
||||
};
|
||||
|
||||
var primitive_map = {
|
||||
point: 1,
|
||||
line: 2,
|
||||
linestrip: 3,
|
||||
triangle: 4,
|
||||
trianglestrip: 5,
|
||||
};
|
||||
|
||||
var cull_map = {
|
||||
none: 1,
|
||||
front: 2,
|
||||
back: 3,
|
||||
};
|
||||
|
||||
var stencilop = {
|
||||
keep: 1,
|
||||
zero: 2,
|
||||
replace: 3,
|
||||
incr_clamp: 4,
|
||||
decr_clamp: 5,
|
||||
invert: 6,
|
||||
incr_wrap: 7,
|
||||
decr_wrap: 8
|
||||
};
|
||||
|
||||
var depth_map = {
|
||||
off: false,
|
||||
on: true,
|
||||
};
|
||||
|
||||
var face_map = {
|
||||
ccw: 1,
|
||||
cw: 2,
|
||||
};
|
||||
|
||||
var compare = {
|
||||
never: 1,
|
||||
less: 2,
|
||||
equal: 3,
|
||||
less_equal: 4,
|
||||
greater: 5,
|
||||
not_equal: 6,
|
||||
greater_equal: 7,
|
||||
always: 8
|
||||
};
|
||||
|
||||
var base_pipeline = {
|
||||
primitive: primitive_map.triangle,
|
||||
depth: {
|
||||
compare: compare.always,
|
||||
write: false,
|
||||
bias: 0,
|
||||
bias_slope_scale: 0,
|
||||
bias_clamp: 0
|
||||
},
|
||||
stencil: {
|
||||
enabled: false,
|
||||
front: {
|
||||
compare: compare.always,
|
||||
fail_op: stencilop.keep,
|
||||
depth_fail_op: stencilop.keep,
|
||||
pass_op: stencilop.keep
|
||||
},
|
||||
back: {
|
||||
compare: compare.always,
|
||||
fail_op: stencilop.keep,
|
||||
depth_fail_op: stencilop.keep,
|
||||
pass_op: stencilop.keep
|
||||
},
|
||||
read: true,
|
||||
write: false,
|
||||
ref: 0
|
||||
},
|
||||
write_mask: colormask.rgba,
|
||||
blend: {
|
||||
enabled: false,
|
||||
src_factor_rgb: blendfactor.one,
|
||||
dst_factor_rgb: blendfactor.zero,
|
||||
op_rgb: blendop.add,
|
||||
src_factor_alpha: blendfactor.one,
|
||||
dst_factor_alpha: blendfactor.zero,
|
||||
op_alpha: blendop.add,
|
||||
},
|
||||
cull: cull_map.none,
|
||||
face: face_map.cw,
|
||||
alpha_to_coverage: false,
|
||||
label: "scripted pipeline"
|
||||
}
|
||||
|
||||
render.base_pipeline = base_pipeline;
|
||||
render.colormask = colormask;
|
||||
render.primitive_map = primitive_map;
|
||||
render.cull_map = cull_map;
|
||||
render.stencilop = stencilop;
|
||||
render.depth_map = depth_map;
|
||||
render.face_map = face_map;
|
||||
render.compare = compare;
|
||||
render.blendfactor = blendfactor;
|
||||
|
||||
render.use_pipeline = function use_pipeline(pipeline)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// When changing a shader, everything must wipe
|
||||
render.use_shader = function use_shader(shader) {
|
||||
if (typeof shader === "string") shader = make_shader(shader);
|
||||
|
@ -72,35 +254,6 @@ var attr_map = {
|
|||
a_scale: 11,
|
||||
};
|
||||
|
||||
var blend_map = {
|
||||
mix: true,
|
||||
none: false,
|
||||
};
|
||||
|
||||
var primitive_map = {
|
||||
point: 1,
|
||||
line: 2,
|
||||
linestrip: 3,
|
||||
triangle: 4,
|
||||
trianglestrip: 5,
|
||||
};
|
||||
|
||||
var cull_map = {
|
||||
none: 1,
|
||||
front: 2,
|
||||
back: 3,
|
||||
};
|
||||
|
||||
var depth_map = {
|
||||
off: false,
|
||||
on: true,
|
||||
};
|
||||
|
||||
var face_map = {
|
||||
cw: 2,
|
||||
ccw: 1,
|
||||
};
|
||||
|
||||
render.poly_prim = function poly_prim(verts) {
|
||||
var index = [];
|
||||
if (verts.length < 1) return undefined;
|
||||
|
@ -121,18 +274,6 @@ render.poly_prim = function poly_prim(verts) {
|
|||
};
|
||||
};
|
||||
|
||||
function shader_directive(shader, name, map) {
|
||||
var reg = new RegExp(`#${name}.*`, "g");
|
||||
var mat = shader.match(reg);
|
||||
if (!mat) return undefined;
|
||||
|
||||
reg = new RegExp(`#${name}\s*`, "g");
|
||||
var ff = mat.map(d => d.replace(reg, ""))[0].trim();
|
||||
|
||||
if (map) return map[ff];
|
||||
return ff;
|
||||
}
|
||||
|
||||
var uni_globals = {
|
||||
time(stage, slot) {
|
||||
render.setuniv(stage, slot, profile.secs(profile.now()));
|
||||
|
@ -176,7 +317,7 @@ render.hotreload = function () {
|
|||
shader_times[i] = io.mod(i);
|
||||
var obj = create_shader_obj(i);
|
||||
obj = obj[os.sys()];
|
||||
obj.pipe = render.pipeline(obj);
|
||||
obj.pipe = render.pipeline(obj, base_pipeline);
|
||||
var old = shader_cache[i];
|
||||
Object.assign(shader_cache[i], obj);
|
||||
cur.bind = undefined;
|
||||
|
@ -202,17 +343,6 @@ function create_shader_obj(file) {
|
|||
files.push(filez);
|
||||
}
|
||||
|
||||
var blend = shader_directive(shader, "blend", blend_map);
|
||||
var primitive = shader_directive(shader, "primitive", primitive_map);
|
||||
var cull = shader_directive(shader, "cull", cull_map);
|
||||
var depth = shader_directive(shader, "depth", depth_map);
|
||||
var face = shader_directive(shader, "face", face_map);
|
||||
var indexed = shader_directive(shader, "indexed");
|
||||
var stencil = shader_directive(shader, "stencil");
|
||||
|
||||
if (typeof indexed == "undefined") indexed = true;
|
||||
if (indexed === "false") indexed = false;
|
||||
|
||||
shader = shader.replace(/uniform\s+(\w+)\s+(\w+);/g, "uniform _$2 { $1 $2; };");
|
||||
shader = shader.replace(/(texture2D|sampler) /g, "uniform $1 ");
|
||||
|
||||
|
@ -251,13 +381,7 @@ function create_shader_obj(file) {
|
|||
|
||||
add_code(obj.fs);
|
||||
|
||||
obj.blend = blend;
|
||||
obj.cull = cull;
|
||||
obj.primitive = primitive;
|
||||
obj.depth = depth;
|
||||
obj.face = face;
|
||||
obj.indexed = indexed;
|
||||
obj.stencil = stencil === 'write';
|
||||
obj.indexed = true;
|
||||
|
||||
if (obj.vs.inputs)
|
||||
for (var i of obj.vs.inputs) {
|
||||
|
@ -320,7 +444,7 @@ function make_shader(shader) {
|
|||
|
||||
var shaderobj = json.decode(io.slurp(writejson));
|
||||
var obj = shaderobj[os.sys()];
|
||||
obj.pipe = render.pipeline(obj);
|
||||
obj.pipe = render.pipeline(obj, base_pipeline);
|
||||
shader_cache[file] = obj;
|
||||
shader_times[file] = io.mod(file);
|
||||
return obj;
|
||||
|
@ -331,7 +455,7 @@ function make_shader(shader) {
|
|||
var compiled = create_shader_obj(file);
|
||||
io.slurpwrite(writejson, json.encode(compiled));
|
||||
var obj = compiled[os.sys()];
|
||||
obj.pipe = render.pipeline(obj);
|
||||
obj.pipe = render.pipeline(obj, base_pipeline);
|
||||
|
||||
shader_cache[file] = obj;
|
||||
shader_times[file] = io.mod(file);
|
||||
|
@ -758,7 +882,6 @@ render.floodmask = function(val)
|
|||
{
|
||||
render.use_shader(polyshader);
|
||||
render.use_mat({});
|
||||
render.draw(
|
||||
}
|
||||
|
||||
render.mask = function mask(tex, pos, scale, rotation = 0)
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
#blend mix
|
||||
#depth off
|
||||
#primitive triangle
|
||||
#cull none
|
||||
|
||||
@vs vs
|
||||
in vec3 a_pos;
|
||||
in vec2 a_uv;
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
#depth off
|
||||
#blend mix
|
||||
|
||||
@vs vs
|
||||
in vec2 a_pos;
|
||||
in vec2 a_uv;
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
#depth off
|
||||
#blend mix
|
||||
|
||||
@vs vs
|
||||
in vec2 a_pos;
|
||||
in vec2 a_uv;
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
#blend mix
|
||||
#primitive triangle
|
||||
#cull none
|
||||
#depth off
|
||||
|
||||
@vs vert
|
||||
in vec3 a_pos;
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#stencil write
|
||||
|
||||
@block vert
|
||||
uniform vec4 rect;
|
||||
|
||||
|
@ -16,7 +14,7 @@ void frag()
|
|||
{
|
||||
color = texture(sampler2D(diffuse,smp), uv);
|
||||
if (color.a == 0.0) discard;
|
||||
color = vec4(1.0);
|
||||
color = vec4(0.0);
|
||||
}
|
||||
@end
|
||||
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
#depth off
|
||||
#blend mix
|
||||
#primitive triangle
|
||||
#cull none
|
||||
|
||||
@vs vs
|
||||
in vec3 a_pos;
|
||||
uniform mat4 vp;
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
#depth off
|
||||
#blend mix
|
||||
#primitive triangle
|
||||
#cull none
|
||||
|
||||
@vs vs
|
||||
in vec3 a_pos;
|
||||
uniform mat4 vp;
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#cull back
|
||||
|
||||
@vs vs
|
||||
in vec3 a_pos;
|
||||
in vec2 a_uv;
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
#blend mix
|
||||
#depth off
|
||||
#primitive triangle
|
||||
#cull none
|
||||
|
||||
@vs vs
|
||||
in vec3 a_pos;
|
||||
in vec2 a_uv;
|
||||
|
|
|
@ -86,6 +86,12 @@ void sg_buffer_free(sg_buffer *b)
|
|||
free(b);
|
||||
}
|
||||
|
||||
void sg_pipeline_free(sg_pipeline *p)
|
||||
{
|
||||
sg_destroy_pipeline(*p);
|
||||
free(p);
|
||||
}
|
||||
|
||||
void cpShape_free(cpShape *s)
|
||||
{
|
||||
if (cpSpaceContainsShape(space, s))
|
||||
|
@ -115,6 +121,7 @@ QJSCLASS(warp_gravity)
|
|||
QJSCLASS(warp_damp)
|
||||
QJSCLASS(window)
|
||||
QJSCLASS(sg_buffer)
|
||||
QJSCLASS(sg_pipeline)
|
||||
QJSCLASS(datastream)
|
||||
QJSCLASS(cpShape)
|
||||
QJSCLASS(cpConstraint)
|
||||
|
@ -757,6 +764,8 @@ JSC_CCALL(render_glue_pass,
|
|||
.colors[0] = {
|
||||
.load_action = SG_LOADACTION_CLEAR,
|
||||
.clear_value = (sg_color){0,0,0,1}
|
||||
},
|
||||
.stencil = { .clear_value = 1
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -953,41 +962,73 @@ sg_vertex_layout_state js2layout(JSValue v)
|
|||
return st;
|
||||
}
|
||||
|
||||
sg_depth_state js2depth(JSValue v)
|
||||
{
|
||||
sg_depth_state depth = {0};
|
||||
depth.compare = js2number(js_getpropstr(v, "compare"));
|
||||
depth.write_enabled = js2boolean(js_getpropstr(v, "write"));
|
||||
depth.bias = js2number(js_getpropstr(v, "bias"));
|
||||
depth.bias_slope_scale = js2number(js_getpropstr(v, "bias_slope_scale"));
|
||||
depth.bias_clamp = js2number(js_getpropstr(v, "bias_clamp"));
|
||||
return depth;
|
||||
}
|
||||
|
||||
sg_stencil_face_state js2face_state(JSValue v)
|
||||
{
|
||||
sg_stencil_face_state face = {0};
|
||||
face.compare = js2number(js_getpropstr(v, "compare"));
|
||||
face.fail_op = js2number(js_getpropstr(v, "fail"));
|
||||
face.depth_fail_op = js2number(js_getpropstr(v, "depth_fail"));
|
||||
face.pass_op = js2number(js_getpropstr(v, "pass_op"));
|
||||
return face;
|
||||
}
|
||||
|
||||
sg_stencil_state js2stencil(JSValue v)
|
||||
{
|
||||
sg_stencil_state stencil = {0};
|
||||
stencil.enabled = js2boolean(js_getpropstr(v, "enabled"));
|
||||
stencil.read_mask = js2boolean(js_getpropstr(v, "read")) ? 0xFF : 0x00;
|
||||
stencil.write_mask = js2boolean(js_getpropstr(v, "write")) ? 0xFF : 0x00;
|
||||
stencil.front = js2face_state(js_getpropstr(v, "front"));
|
||||
stencil.back = js2face_state(js_getpropstr(v, "back"));
|
||||
return stencil;
|
||||
}
|
||||
|
||||
#define GETNUMVALUE(STRUCT, NAME) STRUCT.NAME = js2number(js_getpropstr(v, #NAME));
|
||||
sg_blend_state js2blend(JSValue v)
|
||||
{
|
||||
sg_blend_state blend = {0};
|
||||
blend.enabled = js2boolean(js_getpropstr(v, "enabled"));
|
||||
GETNUMVALUE(blend, src_factor_rgb);
|
||||
GETNUMVALUE(blend, dst_factor_rgb);
|
||||
GETNUMVALUE(blend, op_rgb);
|
||||
GETNUMVALUE(blend, src_factor_alpha);
|
||||
GETNUMVALUE(blend, dst_factor_alpha);
|
||||
GETNUMVALUE(blend, op_alpha);
|
||||
return blend;
|
||||
}
|
||||
|
||||
JSC_CCALL(render_pipeline,
|
||||
sg_pipeline_desc p = {0};
|
||||
p.shader = js2shader(argv[0]);
|
||||
p.layout = js2layout(argv[0]);
|
||||
p.cull_mode = js2number(js_getpropstr(argv[0], "cull"));
|
||||
p.primitive_type = js2number(js_getpropstr(argv[0], "primitive"));
|
||||
//p.face_winding = js2number(js_getpropstr(argv[0], "face"));
|
||||
p.face_winding = 1;
|
||||
if (js2boolean(js_getpropstr(argv[0], "indexed")))
|
||||
p.index_type = SG_INDEXTYPE_UINT16;
|
||||
if (js2boolean(js_getpropstr(argv[0], "blend")))
|
||||
p.colors[0].blend = blend_trans;
|
||||
|
||||
int depth = js2boolean(js_getpropstr(argv[0], "depth"));
|
||||
if (depth) {
|
||||
p.depth.write_enabled = true;
|
||||
p.depth.compare = SG_COMPAREFUNC_LESS;
|
||||
}
|
||||
|
||||
int stencil = js2boolean(js_getpropstr(argv[0], "stencil"));
|
||||
|
||||
p.stencil.enabled = true;
|
||||
p.stencil.front.compare = p.stencil.back.compare = SG_COMPAREFUNC_EQUAL;
|
||||
p.stencil.read_mask = 0xFF;
|
||||
p.stencil.ref = 1;
|
||||
|
||||
if (stencil) {
|
||||
p.stencil.write_mask = 0xFF;
|
||||
p.stencil.front.compare = p.stencil.back.compare = SG_COMPAREFUNC_NEVER;
|
||||
p.stencil.front.pass_op = p.stencil.back.pass_op = p.stencil.front.fail_op = p.stencil.front.depth_fail_op = p.stencil.back.depth_fail_op = p.stencil.back.fail_op = SG_STENCILOP_REPLACE;
|
||||
}
|
||||
|
||||
sg_pipeline pipe = sg_make_pipeline(&p);
|
||||
JSValue pipe = argv[1];
|
||||
p.primitive_type = js2number(js_getpropstr(pipe, "primitive"));
|
||||
p.cull_mode = js2number(js_getpropstr(pipe, "cull"));
|
||||
p.face_winding = js2number(js_getpropstr(pipe, "face"));
|
||||
p.colors[0].blend = js2blend(js_getpropstr(pipe, "blend"));
|
||||
p.colors[0].write_mask = js2number(js_getpropstr(pipe, "write_mask"));
|
||||
p.alpha_to_coverage_enabled = js2boolean(js_getpropstr(pipe, "alpha_to_coverage"));
|
||||
p.depth = js2depth(js_getpropstr(pipe, "depth"));
|
||||
p.stencil = js2stencil(js_getpropstr(pipe, "stencil"));
|
||||
|
||||
return number2js(pipe.id);
|
||||
sg_pipeline *g = malloc(sizeof(*g));
|
||||
*g = sg_make_pipeline(&p);
|
||||
return sg_pipeline2js(g);
|
||||
)
|
||||
|
||||
JSC_CCALL(render_setuniv,
|
||||
|
@ -1185,11 +1226,7 @@ JSC_CCALL(render_spdraw,
|
|||
sg_draw(js2number(argv[0]),js2number(argv[1]),js2number(argv[2]));
|
||||
)
|
||||
|
||||
JSC_CCALL(render_setpipeline,
|
||||
sg_pipeline p = {0};
|
||||
p.id = js2number(argv[0]);
|
||||
sg_apply_pipeline(p);
|
||||
)
|
||||
JSC_CCALL(render_setpipeline, sg_apply_pipeline(*js2sg_pipeline(argv[0]));)
|
||||
|
||||
JSC_CCALL(render_screencolor,
|
||||
texture *t = calloc(sizeof(*t), 1);
|
||||
|
|
|
@ -179,9 +179,6 @@ void render_init() {
|
|||
.depth = {
|
||||
.load_action = SG_LOADACTION_CLEAR,
|
||||
.clear_value = 1
|
||||
},
|
||||
.stencil = {
|
||||
.clear_value = 1
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -264,11 +261,3 @@ float *rgba2floats(float *r, struct rgba c)
|
|||
r[3] = (float)c.a / RGBA_MAX;
|
||||
return r;
|
||||
}
|
||||
|
||||
sg_blend_state blend_trans = {
|
||||
.enabled = true,
|
||||
.src_factor_rgb = SG_BLENDFACTOR_SRC_ALPHA,
|
||||
.dst_factor_rgb = SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
|
||||
.src_factor_alpha = SG_BLENDFACTOR_SRC_ALPHA,
|
||||
.dst_factor_alpha = SG_BLENDFACTOR_ONE_MINUS_SRC_ALPHA
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue