summaryrefslogtreecommitdiff
path: root/servers
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-10-05 01:26:35 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-10-05 01:26:35 -0300
commitcf5778e51a883936ffc896231da8259e5ebabc0a (patch)
tree286f7eb7956a5c2c275276bbc9e3db5e3ff0730f /servers
parenta6e9dc615346f44b68b418483dd218d11ba4a674 (diff)
-Added ViewportContainer, this is the only way to make viewports show up in GUI now
-2D editing now seems to work -Added some functions and refactoring to Viewport
Diffstat (limited to 'servers')
-rw-r--r--servers/visual/rasterizer.h1
-rw-r--r--servers/visual/visual_server_raster.h3
-rw-r--r--servers/visual/visual_server_viewport.cpp41
-rw-r--r--servers/visual/visual_server_viewport.h27
-rw-r--r--servers/visual_server.h5
5 files changed, 61 insertions, 16 deletions
diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h
index 6a6eb7ad20..865298f64e 100644
--- a/servers/visual/rasterizer.h
+++ b/servers/visual/rasterizer.h
@@ -233,7 +233,6 @@ public:
virtual RID render_target_create()=0;
virtual void render_target_set_size(RID p_render_target,int p_width, int p_height)=0;
virtual RID render_target_get_texture(RID p_render_target) const=0;
- virtual Image render_target_get_image(RID p_render_target) const=0;
virtual void render_target_set_flag(RID p_render_target,RenderTargetFlags p_flag,bool p_value)=0;
virtual bool render_target_renedered_in_frame(RID p_render_target)=0;
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index cd6d7b38d3..2171998f3f 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -807,6 +807,7 @@ public:
BIND3(viewport_set_size,RID,int ,int )
BIND2(viewport_set_active,RID ,bool )
+ BIND2(viewport_set_parent_viewport,RID,RID)
BIND2(viewport_set_clear_mode,RID,ViewportClearMode )
@@ -818,11 +819,11 @@ public:
BIND1RC(RID,viewport_get_texture,RID )
- BIND1RC(Image,viewport_capture,RID )
BIND2(viewport_set_hide_scenario,RID,bool )
BIND2(viewport_set_hide_canvas,RID,bool )
BIND2(viewport_set_disable_environment,RID,bool )
+ BIND2(viewport_set_disable_3d,RID,bool )
BIND2(viewport_attach_camera,RID,RID )
BIND2(viewport_set_scenario,RID,RID )
diff --git a/servers/visual/visual_server_viewport.cpp b/servers/visual/visual_server_viewport.cpp
index b30a57a5b8..baf18b7a56 100644
--- a/servers/visual/visual_server_viewport.cpp
+++ b/servers/visual/visual_server_viewport.cpp
@@ -1,6 +1,7 @@
#include "visual_server_viewport.h"
#include "visual_server_global.h"
#include "visual_server_canvas.h"
+#include "globals.h"
void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
@@ -50,7 +51,12 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
}
#endif
- VSG::rasterizer->clear_render_target(Color(0.5,0.5,0.5,1.0));
+ if (p_viewport->clear_mode!=VS::VIEWPORT_CLEAR_NEVER) {
+ VSG::rasterizer->clear_render_target(clear_color);
+ if (p_viewport->clear_mode==VS::VIEWPORT_CLEAR_ONLY_NEXT_FRAME) {
+ p_viewport->clear_mode=VS::VIEWPORT_CLEAR_NEVER;
+ }
+ }
if (!p_viewport->hide_canvas) {
int i=0;
@@ -161,10 +167,10 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
light=light->shadows_next_ptr;
}
- VSG::rasterizer->restore_render_target();
// VSG::canvas_render->reset_canvas();
}
+ VSG::rasterizer->restore_render_target();
#if 0
@@ -175,6 +181,8 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
}
#endif
+
+
for (Map<Viewport::CanvasKey,Viewport::CanvasData*>::Element *E=canvas_map.front();E;E=E->next()) {
VisualServerCanvas::Canvas *canvas = static_cast<VisualServerCanvas::Canvas*>(E->get()->canvas);
@@ -226,6 +234,10 @@ void VisualServerViewport::draw_viewports() {
//draw viewports
+ clear_color=GLOBAL_DEF("rendering/viewport/default_clear_color",Color(0.5,0.5,0.5));
+
+
+ active_viewports.sort_custom<ViewportSort>();
for(int i=0;i<active_viewports.size();i++) {
@@ -297,6 +309,14 @@ void VisualServerViewport::viewport_set_active(RID p_viewport,bool p_active) {
}
+void VisualServerViewport::viewport_set_parent_viewport(RID p_viewport,RID p_parent_viewport) {
+
+ Viewport * viewport = viewport_owner.getornull(p_viewport);
+ ERR_FAIL_COND(!viewport);
+
+ viewport->parent=p_parent_viewport;
+}
+
void VisualServerViewport::viewport_set_clear_mode(RID p_viewport,VS::ViewportClearMode p_clear_mode) {
Viewport * viewport = viewport_owner.getornull(p_viewport);
@@ -350,13 +370,6 @@ RID VisualServerViewport::viewport_get_texture(RID p_viewport) const{
return VSG::storage->render_target_get_texture(viewport->render_target);
}
-Image VisualServerViewport::viewport_capture(RID p_viewport) const{
-
- const Viewport * viewport = viewport_owner.getornull(p_viewport);
- ERR_FAIL_COND_V(!viewport,Image());
- return VSG::storage->render_target_get_image(viewport->render_target);
-
-}
void VisualServerViewport::viewport_set_hide_scenario(RID p_viewport,bool p_hide){
@@ -381,6 +394,16 @@ void VisualServerViewport::viewport_set_disable_environment(RID p_viewport,bool
viewport->disable_environment=p_disable;
}
+void VisualServerViewport::viewport_set_disable_3d(RID p_viewport,bool p_disable){
+
+ Viewport * viewport = viewport_owner.getornull(p_viewport);
+ ERR_FAIL_COND(!viewport);
+
+
+ viewport->disable_3d=p_disable;
+ VSG::storage->render_target_set_flag(viewport->render_target,RasterizerStorage::RENDER_TARGET_NO_3D,p_disable);
+}
+
void VisualServerViewport::viewport_attach_camera(RID p_viewport,RID p_camera){
Viewport * viewport = viewport_owner.getornull(p_viewport);
diff --git a/servers/visual/visual_server_viewport.h b/servers/visual/visual_server_viewport.h
index e5c888fbcb..cba33a3b2d 100644
--- a/servers/visual/visual_server_viewport.h
+++ b/servers/visual/visual_server_viewport.h
@@ -13,6 +13,8 @@ public:
};
+
+
struct Viewport : public RID_Data {
RID self;
@@ -32,8 +34,8 @@ public:
bool hide_scenario;
bool hide_canvas;
bool disable_environment;
+ bool disable_3d;
- Image capture;
VS::ViewportClearMode clear_mode;
@@ -70,8 +72,27 @@ public:
};
mutable RID_Owner<Viewport> viewport_owner;
+
+
+ struct ViewportSort {
+ _FORCE_INLINE_ bool operator()(const Viewport*p_left,const Viewport* p_right) const {
+
+ bool left_to_screen = p_left->viewport_to_screen_rect.size!=Size2();
+ bool right_to_screen = p_right->viewport_to_screen_rect.size!=Size2();
+
+ if (left_to_screen==right_to_screen) {
+
+ return p_left->parent==p_right->self;
+ } else {
+ return right_to_screen;
+ }
+ }
+ };
+
+
Vector<Viewport*> active_viewports;
private:
+ Color clear_color;
void _draw_viewport(Viewport *p_viewport);
public:
@@ -84,7 +105,7 @@ public:
void viewport_detach(RID p_viewport);
void viewport_set_active(RID p_viewport,bool p_active);
-
+ void viewport_set_parent_viewport(RID p_viewport,RID p_parent_viewport);
void viewport_set_update_mode(RID p_viewport,VS::ViewportUpdateMode p_mode);
void viewport_set_vflip(RID p_viewport,bool p_enable);
@@ -92,11 +113,11 @@ public:
void viewport_set_clear_mode(RID p_viewport,VS::ViewportClearMode p_clear_mode);
RID viewport_get_texture(RID p_viewport) const;
- Image viewport_capture(RID p_viewport) const;
void viewport_set_hide_scenario(RID p_viewport,bool p_hide);
void viewport_set_hide_canvas(RID p_viewport,bool p_hide);
void viewport_set_disable_environment(RID p_viewport,bool p_disable);
+ void viewport_set_disable_3d(RID p_viewport,bool p_disable);
void viewport_attach_camera(RID p_viewport,RID p_camera);
void viewport_set_scenario(RID p_viewport,RID p_scenario);
diff --git a/servers/visual_server.h b/servers/visual_server.h
index 4eb2b2a5fa..238bcc216d 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -424,6 +424,7 @@ public:
virtual void viewport_set_size(RID p_viewport,int p_width,int p_height)=0;
virtual void viewport_set_active(RID p_viewport,bool p_active)=0;
+ virtual void viewport_set_parent_viewport(RID p_viewport,RID p_parent_viewport)=0;
virtual void viewport_attach_to_screen(RID p_viewport,const Rect2& p_rect=Rect2(),int p_screen=0)=0;
virtual void viewport_detach(RID p_viewport)=0;
@@ -442,18 +443,18 @@ public:
enum ViewportClearMode {
VIEWPORT_CLEAR_ALWAYS,
- VIWEPORT_CLEAR_NEVER,
+ VIEWPORT_CLEAR_NEVER,
VIEWPORT_CLEAR_ONLY_NEXT_FRAME
};
virtual void viewport_set_clear_mode(RID p_viewport,ViewportClearMode p_clear_mode)=0;
virtual RID viewport_get_texture(RID p_viewport) const=0;
- virtual Image viewport_capture(RID p_viewport) const=0;
virtual void viewport_set_hide_scenario(RID p_viewport,bool p_hide)=0;
virtual void viewport_set_hide_canvas(RID p_viewport,bool p_hide)=0;
virtual void viewport_set_disable_environment(RID p_viewport,bool p_disable)=0;
+ virtual void viewport_set_disable_3d(RID p_viewport,bool p_disable)=0;
virtual void viewport_attach_camera(RID p_viewport,RID p_camera)=0;
virtual void viewport_set_scenario(RID p_viewport,RID p_scenario)=0;