camera render to surface

This commit is contained in:
2025-07-30 08:47:11 -05:00
parent cba6f4fd59
commit ce5b4950d4
2 changed files with 61 additions and 26 deletions

View File

@@ -273,7 +273,7 @@ var alpha_blend_state = {
dst_rgb: "one_minus_src_alpha",
op_rgb: "add",
src_alpha: "one",
dst_alpha: "zero",
dst_alpha: "one_minus_src_alpha",
op_alpha: "add"
}
@@ -443,6 +443,8 @@ var cur_cam
var cmd_fns = {}
cmd_fns.camera = function(cmd)
{
if (cmd.camera.surface && !cmd.camera.surface[GPU])
cmd.camera.surface[GPU] = new sdl_gpu.texture(device, cmd.camera.surface)
draw_queue.push(cmd)
}
@@ -504,7 +506,7 @@ function render_geom(geom, img)
if (!img[GPU]) {
if (img.surface)
img[GPU] = get_img_gpu(img.surface)
else
else
img[GPU] = get_img_gpu(img.cpu)
}
@@ -527,7 +529,12 @@ function render_geom(geom, img)
cmd_fns.draw_image = function(cmd)
{
var img = graphics.texture(cmd.image)
var img
if (typeof cmd.image == 'string')
img = graphics.texture(cmd.image)
else
img = cmd.image
var geom = geometry.make_rect_quad({x:cmd.rect.x, y:cmd.rect.y, width: img.width, height: img.height})
geom.indices = geometry.make_quad_indices(1)
geom.num_indices = 6
@@ -641,33 +648,61 @@ prosperon.create_batch = function create_batch(draw_cmds, done) {
for (var g of new_tex)
render_queue.generate_mipmaps(g)
var render_pass = render_queue.swapchain_pass(window)
render_pass.bind_pipeline(pipey)
render_pass.bind_buffers(0, [
{ buffer: pos_buffer, offset: 0 },
{ buffer: uv_buffer, offset: 0 },
{ buffer: color_buffer, offset: 0 }
])
render_pass.bind_index_buffer(
{ buffer: index_buffer, offset: 0 }, // the binding itself is in bytes
16 // 16 = Uint32 indices
);
var render_pass
var render_target
for (var cmd of draw_queue) {
if (cmd.camera) {
render_pass.viewport({
x: cmd.camera.viewport.x*win_size.width,
y: cmd.camera.viewport.y * win_size.height,
width: cmd.camera.viewport.width * win_size.width,
height: cmd.camera.viewport.height * win_size.height
})
if (!cmd.camera.surface && render_target != "swap") {
if (render_pass)
render_pass.end()
render_target = "swap"
render_pass = render_queue.swapchain_pass(window)
} else if (cmd.camera.surface && render_target != cmd.camera.surface) {
if (render_pass)
render_pass.end()
render_target = cmd.camera.surface
render_pass = render_queue.render_pass({
color_targets: [{
texture: cmd.camera.surface[GPU],
mip_level: 0,
layer: 0,
load: "clear",
store: "store",
}]
})
}
render_pass.bind_pipeline(pipey)
render_pass.bind_buffers(0, [
{ buffer: pos_buffer, offset: 0 },
{ buffer: uv_buffer, offset: 0 },
{ buffer: color_buffer, offset: 0 }
])
render_pass.bind_index_buffer(
{ buffer: index_buffer, offset: 0 }, // the binding itself is in bytes
16 // 16 = Uint32 indices
);
var vpW, vpH
if (render_target == "swap") {
vpW = win_size.width
vpH = win_size.height
} else {
vpW = render_target.width
vpH = render_target.height
}
render_pass.viewport({
x: cmd.camera.viewport.x*vpW,
y: cmd.camera.viewport.y * vpH,
width: cmd.camera.viewport.width * vpW,
height: cmd.camera.viewport.height * vpH
})
cur_cam = make_camera_pblob(cmd.camera)
render_queue.push_vertex_uniform_data(0, cur_cam)
render_queue.push_vertex_uniform_data(0, cur_cam)
continue
}
render_pass.bind_samplers(false, 0, [{texture:cmd.texture, sampler: std_sampler}])

View File

@@ -313,7 +313,7 @@ ENUM_MAPPING_TABLE(SDL_GPUTextureFormat) = {
{SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM, "b5g6r5"},
{SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM, "b5g5r5a1"},
{SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM, "b4g4r4a4"},
{SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, "b8g8r8a8"},
{SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM, "bgra8"},
{SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM, "bc1"},
{SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM, "bc2"},
{SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM, "bc3"},