mirror of
https://github.com/godotengine/godot
synced 2024-10-14 09:44:34 +00:00
-Fixed screen capture for viewports, added a screen capture demo, fixes #1529
This commit is contained in:
parent
3e20391bf6
commit
f9906eeac8
8
demos/viewport/screen_capture/engine.cfg
Normal file
8
demos/viewport/screen_capture/engine.cfg
Normal file
|
@ -0,0 +1,8 @@
|
|||
[application]
|
||||
|
||||
name="Screen Capturing"
|
||||
main_scene="res://screen_capture.scn"
|
||||
|
||||
[display]
|
||||
|
||||
stretch_mode="2d"
|
BIN
demos/viewport/screen_capture/mountains.png
Normal file
BIN
demos/viewport/screen_capture/mountains.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 906 KiB |
27
demos/viewport/screen_capture/screen_capture.gd
Normal file
27
demos/viewport/screen_capture/screen_capture.gd
Normal 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
|
BIN
demos/viewport/screen_capture/screen_capture.scn
Normal file
BIN
demos/viewport/screen_capture/screen_capture.scn
Normal file
Binary file not shown.
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue