-Fixed screen capture for viewports, added a screen capture demo, fixes #1529

This commit is contained in:
Juan Linietsky 2015-04-12 18:58:05 -03:00
parent 3e20391bf6
commit f9906eeac8
5 changed files with 47 additions and 8 deletions

View file

@ -0,0 +1,8 @@
[application]
name="Screen Capturing"
main_scene="res://screen_capture.scn"
[display]
stretch_mode="2d"

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 KiB

View file

@ -0,0 +1,27 @@
extends Control
# member variables here, example:
# var a=2
# var b="textvar"
func _ready():
# Initialization here
pass
func _on_button_pressed():
get_viewport().queue_screen_capture()
#let two frames pass to make sure the screen was aptured
yield(get_tree(),"idle_frame")
yield(get_tree(),"idle_frame")
#retrieve the captured image
var img = get_viewport().get_screen_capture()
#create a texture for it
var tex = ImageTexture.new()
tex.create_from_image(img)
#set it to the capture node
get_node("capture").set_texture(tex)
pass # replace with function body

Binary file not shown.

View file

@ -4270,17 +4270,21 @@ void RasterizerGLES2::capture_viewport(Image* r_capture) {
glReadPixels( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height,GL_RGBA,GL_UNSIGNED_BYTE,w.ptr());
}
uint32_t *imgptr = (uint32_t*)w.ptr();
for(int y=0;y<(viewport.height/2);y++) {
bool flip = current_rt==NULL;
uint32_t *ptr1 = &imgptr[y*viewport.width];
uint32_t *ptr2 = &imgptr[(viewport.height-y-1)*viewport.width];
if (flip) {
uint32_t *imgptr = (uint32_t*)w.ptr();
for(int y=0;y<(viewport.height/2);y++) {
for(int x=0;x<viewport.width;x++) {
uint32_t *ptr1 = &imgptr[y*viewport.width];
uint32_t *ptr2 = &imgptr[(viewport.height-y-1)*viewport.width];
uint32_t tmp = ptr1[x];
ptr1[x]=ptr2[x];
ptr2[x]=tmp;
for(int x=0;x<viewport.width;x++) {
uint32_t tmp = ptr1[x];
ptr1[x]=ptr2[x];
ptr2[x]=tmp;
}
}
}