From 5072134f419f749b8b47021565dad3b0ee15c979 Mon Sep 17 00:00:00 2001 From: Saracen Date: Sat, 4 Jul 2015 00:59:03 +0100 Subject: [PATCH 1/4] Fixed canvas clipping on offscreen viewports. --- drivers/gles2/rasterizer_gles2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index d84ee5a7589..0bb58708eef 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -9349,7 +9349,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list,int p_z,const int h = current_clip->final_clip_rect.size.y; */ int x = current_clip->final_clip_rect.pos.x; - int y = window_size.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.y); + int y = viewport.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.y); int w = current_clip->final_clip_rect.size.x; int h = current_clip->final_clip_rect.size.y; From ff363c94db0d456e171aeacf10f11f5a51ca2ee3 Mon Sep 17 00:00:00 2001 From: Saracen Date: Sat, 31 Oct 2015 09:05:03 +0000 Subject: [PATCH 2/4] Another clipping fix: default back to using window size to calculate clipping on viewports which don't have a rendertarget which fixes clipping on the editor viewport. --- drivers/gles2/rasterizer_gles2.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 0bb58708eef..daac4123e0e 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -9348,10 +9348,23 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list,int p_z,const int w = current_clip->final_clip_rect.size.x; int h = current_clip->final_clip_rect.size.y; */ - int x = current_clip->final_clip_rect.pos.x; - int y = viewport.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.y); - int w = current_clip->final_clip_rect.size.x; - int h = current_clip->final_clip_rect.size.y; + int x; + int y; + int w; + int h; + + if (current_rt) { + x = current_clip->final_clip_rect.pos.x; + y = viewport.height - (current_clip->final_clip_rect.pos.y + current_clip->final_clip_rect.size.y); + w = current_clip->final_clip_rect.size.x; + h = current_clip->final_clip_rect.size.y; + } + else { + x = current_clip->final_clip_rect.pos.x; + y = window_size.height - (current_clip->final_clip_rect.pos.y + current_clip->final_clip_rect.size.y); + w = current_clip->final_clip_rect.size.x; + h = current_clip->final_clip_rect.size.y; + } glScissor(x,y,w,h); From 2cc52bc3ffde14dd7685588e9b4884bf7f8cfa4e Mon Sep 17 00:00:00 2001 From: Saracen Date: Thu, 19 Nov 2015 23:47:25 +0000 Subject: [PATCH 3/4] Modification to GUI in 3D demo to show resolved viewport clipping bug and small fix to bug causing viewport clipping to be inverted. --- demos/viewport/gui_in_3d/gui.scn | Bin 2270 -> 3267 bytes drivers/gles2/rasterizer_gles2.cpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/viewport/gui_in_3d/gui.scn b/demos/viewport/gui_in_3d/gui.scn index 4d665226b70ba79844e8c20a654a8e1068f75eb6..5e8c04754e8d6572215ef00407db124508e5b3fa 100644 GIT binary patch delta 3216 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 delta 2228 zcmX>sc~8(ODA?JV0R#jX7{Y`Z82s277)lr!7#JBC8W@F{RibknN0WZ+U@=gP@XPRy~=*Ee9;qrmIH@PK`}Lox%C zf&_z<0y6`<0y6`v0y6`f0<%LVQ!#^*0w;r|0<%LeQ+jD;f+Sl&VqR(vgRp`qS6OCp zW>RKOW=W-f0vBUW>H~H$=KO-hWCb}!28jo(x-7-1Icf0+q!}b1uuAhKrDkN-=cU9K zBo?LSl`!xs$Z+Q-7NuwA=@(_DXOtwoUm(DqlwVSkpUWVspv0b*pIllTpO>nj#E_(@ z$)=x^npVOf@__yaD<1*s126H@u~Gt=|(i&Eor^Gl0U83Yd) zGU^vAL@f|;NDwK`tV)ef%SlWx4%E-cFUqXS&nrpHNtpD2Ns^^3wWuUhabY6!1152v z;*z4&lH`o|qQsKS{Kofe@wurbiShA?jZ8j?Ns5h*Cl_)iykp>2=vu(9(3SX)qbMgtfwaD%-fJ|{IVy(A+++M$IZ(J9|)6H{?&a=oG+BLjzmd!i(xf>DCe0eb~L2USL= zQYGDn4yKgMVh0aGDaBVz+40GWrVJ%XW)6G|#SR%v zN%{3f3Q7#c3Ca%`wlJ6^*s%o{Wac^LS0o%z=x0pJY~W%lE=_abdcauCV3IJ;fnO*HC8@G9bS=I7m1suvEks<(DiFZP0TNWvG0>A?jSElEx6Pkjj#gpPrwmqV<6J zowJpL9D8bBS!PjwUaqp!0~UFQ$xQVH`Nc`kA22gK_`CeU%jHgW9{z`Rs;yV~>dfwZ z`G72YN@`kSX--MJ>JIe+r~Cu5PG32SGxE#h(~B}w9f%u5vuDoOI%IkXJz-#EEGkw0$C_GFl9`wOgq^`5QvHtlONMw2c821Fr4H>Zx;ga< zD#dCh45Yz=(lqsW3xdin*ib0u6=*3ltc( zEMRBYm7w6#*|v(oYJob#g9Y6TrxvI)e5p@Rclf{_P+FX!;G3$L=@v+~=U|nCBqv;OQXkKFwj3!z>4BhszG^j`tkc9n&4yotPZV z>%Dj!7@Q6{IJ?R^usakx#C!HQ1V3PAU=UK^abR|s%^<75?cnaf;85>i>`?E(?vU;v z?fKlH-^<3K-yz~P;N+Gx8rfgY6oe@^$zvV9oQcxA9wuh zaMI%$`%uebLrJ0?=9sWD$J2D?U?i3HU^P%{022F*@4(beA3)mU7 z7qC0tciPXOqrmUL&7iBm?x4<~w}9P|*@5{1GlS!E27LtqhsO@m4*DP;Ja=?kFgUO?NGh;1 z@F*~Yt2ibFW(H{mW=Qa{fTCVjfti6%ftf)LEGn?#L&D!-x&ymIutPb6sDg}xHiMV~JA<+UGlRGS zvxB%JHyHCD*nE(i!AL>fA(+8ff!!e;l*CLGco^zU6qprWG5kNE@4)at`n5x|!~6rU z8B`Q39+ZPP3=C!pERNF|%onhO0(3Hig@S;>Cx-t{@&|<<2!D36cf9Yw?C{yi-SNI- z_XFwA4h#?3??2?e?zsOU^K}P)$Lo&wAF^L}dd#4z5aDpx@xH@i2X=?q4woNsKXz(& Z*w2zIoS&ChoS?`KYMlfH2RVb9DgZeuiw^(* diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index daac4123e0e..8b70e7cfbfc 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -9355,7 +9355,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list,int p_z,const if (current_rt) { x = current_clip->final_clip_rect.pos.x; - y = viewport.height - (current_clip->final_clip_rect.pos.y + current_clip->final_clip_rect.size.y); + y = current_clip->final_clip_rect.pos.y; w = current_clip->final_clip_rect.size.x; h = current_clip->final_clip_rect.size.y; } From 157b97b0872221224ba80099f4c11fd78123e576 Mon Sep 17 00:00:00 2001 From: Saracen Date: Mon, 7 Dec 2015 13:25:36 +0000 Subject: [PATCH 4/4] Extended clipping fix to missing clipping-related features. --- drivers/gles2/rasterizer_gles2.cpp | 42 ++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 8b70e7cfbfc..136e8162e92 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -9155,10 +9155,23 @@ void RasterizerGLES2::_canvas_item_render_commands(CanvasItem *p_item,CanvasItem //glScissor(viewport.x+current_clip->final_clip_rect.pos.x,viewport.y+ (viewport.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.height)), //current_clip->final_clip_rect.size.width,current_clip->final_clip_rect.size.height); - int x = current_clip->final_clip_rect.pos.x; - int y = window_size.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.y); - int w = current_clip->final_clip_rect.size.x; - int h = current_clip->final_clip_rect.size.y; + int x; + int y; + int w; + int h; + + if (current_rt) { + x = current_clip->final_clip_rect.pos.x; + y = current_clip->final_clip_rect.pos.y; + w = current_clip->final_clip_rect.size.x; + h = current_clip->final_clip_rect.size.y; + } + else { + x = current_clip->final_clip_rect.pos.x; + y = window_size.height - (current_clip->final_clip_rect.pos.y + current_clip->final_clip_rect.size.y); + w = current_clip->final_clip_rect.size.x; + h = current_clip->final_clip_rect.size.y; + } glScissor(x,y,w,h); @@ -9666,10 +9679,23 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list,int p_z,const //glScissor(viewport.x+current_clip->final_clip_rect.pos.x,viewport.y+ (viewport.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.height)), //current_clip->final_clip_rect.size.width,current_clip->final_clip_rect.size.height); - int x = current_clip->final_clip_rect.pos.x; - int y = window_size.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.y); - int w = current_clip->final_clip_rect.size.x; - int h = current_clip->final_clip_rect.size.y; + int x; + int y; + int w; + int h; + + if (current_rt) { + x = current_clip->final_clip_rect.pos.x; + y = current_clip->final_clip_rect.pos.y; + w = current_clip->final_clip_rect.size.x; + h = current_clip->final_clip_rect.size.y; + } + else { + x = current_clip->final_clip_rect.pos.x; + y = window_size.height - (current_clip->final_clip_rect.pos.y + current_clip->final_clip_rect.size.y); + w = current_clip->final_clip_rect.size.x; + h = current_clip->final_clip_rect.size.y; + } glScissor(x,y,w,h);