fix find/search error for mask

This commit is contained in:
2026-02-26 16:40:38 -06:00
parent 9147db6fdc
commit b88d22aefc
4 changed files with 17 additions and 22 deletions

View File

@@ -221,7 +221,7 @@ function apply_effect(ctx, effect, input, params) {
} }
// Blur passes // Blur passes
blur_passes = effect.blur_passes || 2 blur_passes = effect.blur_passes != null ? effect.blur_passes : 2
blur_in = bright blur_in = bright
for (p = 0; p < blur_passes; p++) { for (p = 0; p < blur_passes; p++) {
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}}} 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}}}
@@ -230,12 +230,13 @@ function apply_effect(ctx, effect, input, params) {
} }
// Composite bloom // Composite bloom
ctx.passes[] = {type: 'composite_textures', base: input, overlay: blur2, output: output, mode: 'add'} ctx.passes[] = {type: 'composite_textures', base: input, overlay: blur_in, output: output, mode: 'add'}
} else if (effect.type == 'mask') { } else if (effect.type == 'mask') {
mask_group = effect.mask_group mask_group = effect.mask_group
// Query masks within the same plane to avoid cross-plane mask issues // Query masks within the same plane to avoid cross-plane mask issues
mask_sprites = film2d.query({group: mask_group, plane: current_plane}) mask_sprites = film2d.query({group: mask_group, plane: current_plane})
log.compositor("mask effect: group=" + mask_group + " plane=" + current_plane + " sprites=" + text(length(mask_sprites)))
if (length(mask_sprites) > 0) { if (length(mask_sprites) > 0) {
mask_target = ctx.alloc(size.width, size.height, hint + '_mask') mask_target = ctx.alloc(size.width, size.height, hint + '_mask')

View File

@@ -176,13 +176,13 @@ film2d.unregister = function(id) {
film2d.index_group = function(id, group) { film2d.index_group = function(id, group) {
if (!group_index[group]) group_index[group] = [] if (!group_index[group]) group_index[group] = []
if (search(group_index[group], text(id)) == null) if (find(group_index[group], text(id)) == null)
group_index[group][] = text(id) group_index[group][] = text(id)
} }
film2d.unindex_group = function(id, group) { film2d.unindex_group = function(id, group) {
if (!group_index[group]) return if (!group_index[group]) return
var idx = search(group_index[group], text(id)) var idx = find(group_index[group], text(id))
if (idx != null) if (idx != null)
group_index[group] = array(array(group_index[group], 0, idx), array(group_index[group], idx+1)) group_index[group] = array(array(group_index[group], 0, idx), array(group_index[group], idx+1))
} }
@@ -218,7 +218,7 @@ film2d.query = function(selector) {
// If also filtering by group, check membership // If also filtering by group, check membership
if (selector.group) { if (selector.group) {
groups = d.groups || [] groups = d.groups || []
if (search(groups, selector.group) != null) result[] = d if (find(groups, selector.group) != null) result[] = d
} else { } else {
result[] = d result[] = d
} }

View File

@@ -208,7 +208,7 @@ function _load_shaders() {
stage: "fragment", stage: "fragment",
format: "msl", format: "msl",
entrypoint: "fragment_main", entrypoint: "fragment_main",
num_uniform_buffers: 2, num_uniform_buffers: 1,
num_samplers: 2 num_samplers: 2
}) })
} }
@@ -452,20 +452,12 @@ function _create_pipelines() {
target: { target: {
color_targets: [{ color_targets: [{
format: _swapchain_format, format: _swapchain_format,
blend: { blend: {enabled: false}
enabled: true,
src_rgb: "src_alpha",
dst_rgb: "one_minus_src_alpha",
op_rgb: "add",
src_alpha: "one",
dst_alpha: "one_minus_src_alpha",
op_alpha: "add"
}
}] }]
} }
}) })
} }
// CRT pipeline // CRT pipeline
if (_blit_vert && _crt_frag) { if (_blit_vert && _crt_frag) {
_pipelines.crt =gpu_mod.graphics_pipeline(_gpu, { _pipelines.crt =gpu_mod.graphics_pipeline(_gpu, {
@@ -2077,10 +2069,10 @@ function _do_mask(cmd_buffer, cmd) {
var mode = cmd.mode || 'alpha' var mode = cmd.mode || 'alpha'
var invert = cmd.invert || false var invert = cmd.invert || false
if (!content || !content.texture) return if (!content || !content.texture) { log.graphics("mask: missing content texture"); return }
if (!mask || !mask.texture) return if (!mask || !mask.texture) { log.graphics("mask: missing mask texture"); return }
if (!output || !output.texture) return if (!output || !output.texture) { log.graphics("mask: missing output texture"); return }
// Check if mask pipeline is available // Check if mask pipeline is available
if (!_pipelines.mask) { if (!_pipelines.mask) {
log.console("sdl_gpu: Mask pipeline not available, falling back to blit") log.console("sdl_gpu: Mask pipeline not available, falling back to blit")

View File

@@ -35,6 +35,8 @@ fragment float4 fragment_main(
mask_value = 1.0 - mask_value; mask_value = 1.0 - mask_value;
} }
// Apply mask to content alpha // Content is premultiplied alpha from render pass blending.
return float4(content.rgb, content.a * mask_value); // Un-premultiply before masking so downstream blit (src_alpha blend) works correctly.
float3 rgb = content.a > 0.001 ? content.rgb / content.a : float3(0);
return float4(rgb, content.a * mask_value);
} }