camera render to surface
This commit is contained in:
@@ -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}])
|
||||
|
||||
@@ -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"},
|
||||
|
||||
Reference in New Issue
Block a user