fix syntax
This commit is contained in:
156
compositor.cm
156
compositor.cm
@@ -27,9 +27,12 @@ compositor.compile = function(config) {
|
||||
|
||||
// Process each plane (supports both 'planes' and legacy 'layers' key)
|
||||
var planes = config.planes || config.layers || []
|
||||
for (var i = 0; i < length(planes); i++) {
|
||||
var plane = planes[i]
|
||||
var type = plane.type || 'film2d'
|
||||
var i = 0
|
||||
var plane = null
|
||||
var type = null
|
||||
for (i = 0; i < length(planes); i++) {
|
||||
plane = planes[i]
|
||||
type = plane.type || 'film2d'
|
||||
if (type == 'imgui') {
|
||||
compile_imgui_layer(plane, ctx)
|
||||
} else {
|
||||
@@ -58,7 +61,8 @@ function compile_plane(plane_config, ctx, group_effects) {
|
||||
var mask_groups = {}
|
||||
arrfor(array(group_effects), gname => {
|
||||
var effects = group_effects[gname].effects || []
|
||||
for (var e = 0; e < length(effects); e++) {
|
||||
var e = 0
|
||||
for (e = 0; e < length(effects); e++) {
|
||||
if (effects[e].type == 'mask' && effects[e].mask_group)
|
||||
mask_groups[effects[e].mask_group] = true
|
||||
}
|
||||
@@ -68,33 +72,41 @@ function compile_plane(plane_config, ctx, group_effects) {
|
||||
var all_sprites = film2d.query({plane: plane_name})
|
||||
|
||||
// Add manual drawables
|
||||
var di = 0
|
||||
if (plane_config.drawables) {
|
||||
for (var i = 0; i < length(plane_config.drawables); i++)
|
||||
push(all_sprites, plane_config.drawables[i])
|
||||
for (di = 0; di < length(plane_config.drawables); di++)
|
||||
push(all_sprites, plane_config.drawables[di])
|
||||
}
|
||||
|
||||
// Find which sprites belong to groups with effects
|
||||
var effect_groups = {} // group_name -> {sprites: [], effects: []}
|
||||
var base_sprites = []
|
||||
|
||||
for (var i = 0; i < length(all_sprites); i++) {
|
||||
var s = all_sprites[i]
|
||||
var sprite_groups = s.groups || []
|
||||
var assigned = false
|
||||
var is_mask_only = length(sprite_groups) > 0
|
||||
|
||||
|
||||
var si = 0
|
||||
var s = null
|
||||
var sprite_groups = null
|
||||
var assigned = false
|
||||
var is_mask_only = false
|
||||
var g = 0
|
||||
var gname = null
|
||||
for (si = 0; si < length(all_sprites); si++) {
|
||||
s = all_sprites[si]
|
||||
sprite_groups = s.groups || []
|
||||
assigned = false
|
||||
is_mask_only = length(sprite_groups) > 0
|
||||
|
||||
// First pass: check if sprite has any non-mask group
|
||||
for (var g = 0; g < length(sprite_groups); g++) {
|
||||
var gname = sprite_groups[g]
|
||||
for (g = 0; g < length(sprite_groups); g++) {
|
||||
gname = sprite_groups[g]
|
||||
if (!mask_groups[gname]) {
|
||||
is_mask_only = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Second pass: assign to effect groups
|
||||
for (var g = 0; g < length(sprite_groups); g++) {
|
||||
var gname = sprite_groups[g]
|
||||
for (g = 0; g < length(sprite_groups); g++) {
|
||||
gname = sprite_groups[g]
|
||||
if (group_effects[gname]) {
|
||||
if (!effect_groups[gname])
|
||||
effect_groups[gname] = {sprites: [], effects: group_effects[gname].effects}
|
||||
@@ -103,7 +115,7 @@ function compile_plane(plane_config, ctx, group_effects) {
|
||||
break // Only assign to first matching effect group
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Add to base sprites if not assigned to effect group and not mask-only
|
||||
if (!assigned && !is_mask_only) push(base_sprites, s)
|
||||
}
|
||||
@@ -136,9 +148,11 @@ function compile_plane(plane_config, ctx, group_effects) {
|
||||
|
||||
// Apply effects
|
||||
var current = group_target
|
||||
for (var e = 0; e < length(eg.effects); e++) {
|
||||
var effect = eg.effects[e]
|
||||
current = apply_effect(ctx, effect, current, res, camera, gname, plane_name, group_effects)
|
||||
var e = 0
|
||||
var effect = null
|
||||
for (e = 0; e < length(eg.effects); e++) {
|
||||
effect = eg.effects[e]
|
||||
current = apply_effect(ctx, effect, current, {size: res, camera: camera, hint: gname, current_plane: plane_name, group_effects: group_effects})
|
||||
}
|
||||
|
||||
// Composite result to plane
|
||||
@@ -176,14 +190,28 @@ function compile_plane(plane_config, ctx, group_effects) {
|
||||
})
|
||||
}
|
||||
|
||||
function apply_effect(ctx, effect, input, size, camera, hint, current_plane, group_effects) {
|
||||
function apply_effect(ctx, effect, input, params) {
|
||||
var size = params.size
|
||||
var camera = params.camera
|
||||
var hint = params.hint
|
||||
var current_plane = params.current_plane
|
||||
var group_effects = params.group_effects
|
||||
var output = ctx.alloc(size.width, size.height, hint + '_' + effect.type)
|
||||
|
||||
|
||||
var bright = null
|
||||
var blur1 = null
|
||||
var blur2 = null
|
||||
var blur_passes = null
|
||||
var blur_in = null
|
||||
var p = 0
|
||||
var mask_group = null
|
||||
var mask_sprites = null
|
||||
var mask_target = null
|
||||
if (effect.type == 'bloom') {
|
||||
var bright = ctx.alloc(size.width, size.height, hint + '_bright')
|
||||
var blur1 = ctx.alloc(size.width, size.height, hint + '_blur1')
|
||||
var blur2 = ctx.alloc(size.width, size.height, hint + '_blur2')
|
||||
|
||||
bright = ctx.alloc(size.width, size.height, hint + '_bright')
|
||||
blur1 = ctx.alloc(size.width, size.height, hint + '_blur1')
|
||||
blur2 = ctx.alloc(size.width, size.height, hint + '_blur2')
|
||||
|
||||
// Threshold
|
||||
push(ctx.passes, {
|
||||
type: 'shader_pass',
|
||||
@@ -192,11 +220,11 @@ function apply_effect(ctx, effect, input, size, camera, hint, current_plane, gro
|
||||
output: bright,
|
||||
uniforms: {threshold: effect.threshold || 0.8, intensity: effect.intensity || 1}
|
||||
})
|
||||
|
||||
|
||||
// Blur passes
|
||||
var blur_passes = effect.blur_passes || 2
|
||||
var blur_in = bright
|
||||
for (var p = 0; p < blur_passes; p++) {
|
||||
blur_passes = effect.blur_passes || 2
|
||||
blur_in = bright
|
||||
for (p = 0; p < blur_passes; p++) {
|
||||
push(ctx.passes, {type: 'shader_pass', shader: 'blur', input: blur_in, output: blur1, uniforms: {direction: {x: 1, y: 0}, texel_size: {x: 1/size.width, y: 1/size.height}}})
|
||||
push(ctx.passes, {type: 'shader_pass', shader: 'blur', input: blur1, output: blur2, uniforms: {direction: {x: 0, y: 1}, texel_size: {x: 1/size.width, y: 1/size.height}}})
|
||||
blur_in = blur2
|
||||
@@ -206,12 +234,12 @@ function apply_effect(ctx, effect, input, size, camera, hint, current_plane, gro
|
||||
push(ctx.passes, {type: 'composite_textures', base: input, overlay: blur2, output: output, mode: 'add'})
|
||||
|
||||
} else if (effect.type == 'mask') {
|
||||
var mask_group = effect.mask_group
|
||||
mask_group = effect.mask_group
|
||||
// Query masks within the same plane to avoid cross-plane mask issues
|
||||
var mask_sprites = film2d.query({group: mask_group, plane: current_plane})
|
||||
|
||||
mask_sprites = film2d.query({group: mask_group, plane: current_plane})
|
||||
|
||||
if (length(mask_sprites) > 0) {
|
||||
var mask_target = ctx.alloc(size.width, size.height, hint + '_mask')
|
||||
mask_target = ctx.alloc(size.width, size.height, hint + '_mask')
|
||||
|
||||
// Render mask
|
||||
push(ctx.passes, {
|
||||
@@ -261,17 +289,25 @@ compositor.execute = function(plan) {
|
||||
}
|
||||
|
||||
var commands = []
|
||||
|
||||
for (var i = 0; i < length(plan.passes); i++) {
|
||||
var pass = plan.passes[i]
|
||||
|
||||
|
||||
var i = 0
|
||||
var pass = null
|
||||
var target = null
|
||||
var result = null
|
||||
var c = 0
|
||||
var rect = null
|
||||
var src = null
|
||||
var dst = null
|
||||
for (i = 0; i < length(plan.passes); i++) {
|
||||
pass = plan.passes[i]
|
||||
|
||||
if (pass.type == 'clear') {
|
||||
var target = resolve(pass.target)
|
||||
target = resolve(pass.target)
|
||||
push(commands, {cmd: 'begin_render', target: target, clear: pass.color})
|
||||
push(commands, {cmd: 'end_render'})
|
||||
|
||||
|
||||
} else if (pass.type == 'render') {
|
||||
var result = film2d.render({
|
||||
result = film2d.render({
|
||||
drawables: pass.drawables,
|
||||
camera: pass.camera,
|
||||
target: resolve(pass.target),
|
||||
@@ -279,7 +315,7 @@ compositor.execute = function(plan) {
|
||||
layer_sort: pass.layer_sort || {},
|
||||
clear: pass.clear
|
||||
}, backend)
|
||||
for (var c = 0; c < length(result.commands); c++)
|
||||
for (c = 0; c < length(result.commands); c++)
|
||||
push(commands, result.commands[c])
|
||||
|
||||
} else if (pass.type == 'shader_pass') {
|
||||
@@ -319,7 +355,7 @@ compositor.execute = function(plan) {
|
||||
})
|
||||
|
||||
} else if (pass.type == 'blit_to_screen') {
|
||||
var rect = _calc_presentation(pass.source_size, pass.dest_size, pass.presentation)
|
||||
rect = _calc_presentation(pass.source_size, pass.dest_size, pass.presentation)
|
||||
push(commands, {
|
||||
cmd: 'blit',
|
||||
texture: resolve(pass.source),
|
||||
@@ -328,8 +364,8 @@ compositor.execute = function(plan) {
|
||||
filter: pass.presentation == 'integer_scale' ? 'nearest' : 'linear'
|
||||
})
|
||||
} else if (pass.type == 'blit') {
|
||||
var src = resolve(pass.source)
|
||||
var dst = resolve(pass.dest)
|
||||
src = resolve(pass.source)
|
||||
dst = resolve(pass.dest)
|
||||
push(commands, {
|
||||
cmd: 'blit',
|
||||
texture: src,
|
||||
@@ -351,20 +387,26 @@ compositor.execute = function(plan) {
|
||||
function _calc_presentation(src, dst, mode) {
|
||||
if (mode == 'stretch')
|
||||
return {x: 0, y: 0, width: dst.width, height: dst.height}
|
||||
|
||||
|
||||
var sx = 0
|
||||
var sy = 0
|
||||
var s = 0
|
||||
var w = 0
|
||||
var h = 0
|
||||
var scale = 0
|
||||
if (mode == 'integer_scale') {
|
||||
var sx = floor(dst.width / src.width)
|
||||
var sy = floor(dst.height / src.height)
|
||||
var s = max(1, min(sx, sy))
|
||||
var w = src.width * s
|
||||
var h = src.height * s
|
||||
sx = floor(dst.width / src.width)
|
||||
sy = floor(dst.height / src.height)
|
||||
s = max(1, min(sx, sy))
|
||||
w = src.width * s
|
||||
h = src.height * s
|
||||
return {x: (dst.width - w) / 2, y: (dst.height - h) / 2, width: w, height: h}
|
||||
}
|
||||
|
||||
|
||||
// letterbox
|
||||
var scale = min(dst.width / src.width, dst.height / src.height)
|
||||
var w = src.width * scale
|
||||
var h = src.height * scale
|
||||
scale = min(dst.width / src.width, dst.height / src.height)
|
||||
w = src.width * scale
|
||||
h = src.height * scale
|
||||
return {x: (dst.width - w) / 2, y: (dst.height - h) / 2, width: w, height: h}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user