fix syntax

This commit is contained in:
2026-02-17 09:15:15 -06:00
parent f310c18b84
commit 4e1b63fd0e
52 changed files with 2169 additions and 1754 deletions

View File

@@ -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}
}