From 24f1500793e220830f981d7ba8ab5d03d2280a19 Mon Sep 17 00:00:00 2001 From: "Maarten A. Breddels" Date: Thu, 13 Apr 2023 15:35:07 +0200 Subject: [PATCH 1/3] feat: transform/rotate image in shader --- bqplot_image_gl/imagegl.py | 1 + js/lib/imagegl.js | 13 ++++ js/shaders/image-vertex.glsl | 8 ++- .../tests/notebooks/image_rotate_update.ipynb | 72 +++++++++++++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 ui-tests/tests/notebooks/image_rotate_update.ipynb diff --git a/bqplot_image_gl/imagegl.py b/bqplot_image_gl/imagegl.py index 18132fb..b37d1c9 100644 --- a/bqplot_image_gl/imagegl.py +++ b/bqplot_image_gl/imagegl.py @@ -37,6 +37,7 @@ class ImageGL(bqplot.Mark): atype='bqplot.Axis', **array_serialization)\ .valid(array_squeeze, shape(2)) + transform = List([1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], allow_none=False).tag(sync=True) scales_metadata = Dict({ 'x': {'orientation': 'horizontal', 'dimension': 'x'}, 'y': {'orientation': 'vertical', 'dimension': 'y'}, diff --git a/js/lib/imagegl.js b/js/lib/imagegl.js index 5118cb3..cb737b3 100644 --- a/js/lib/imagegl.js +++ b/js/lib/imagegl.js @@ -27,6 +27,8 @@ class ImageGLModel extends bqplot.MarkModel { opacity: 1.0, x: (0.0, 1.0), y: (0.0, 1.0), + // flat 3x3 identity matrix + transform: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], scales_metadata: { 'x': {'orientation': 'horizontal', 'dimension': 'x'}, 'y': {'orientation': 'vertical', 'dimension': 'y'}, @@ -114,6 +116,8 @@ class ImageGLView extends bqplot.Mark { // basically the corners of the image image_domain_x : { type: "2f", value: [0.0, 1.0] }, image_domain_y : { type: "2f", value: [0.0, 1.0] }, + // transform matrix + transform : { type: "mat3", value: this.model.get("transform") }, // extra opacity value opacity: {type: 'f', value: 1.0} }, @@ -200,6 +204,10 @@ class ImageGLView extends bqplot.Mark { }; this.listenTo(this.model, "change:visible", sync_visible , this); sync_visible(); + this.listenTo(this.model, "change:transform", () => { + this.update_transform(); + this.update_scene(); + }, this); this.listenTo(this.model, "change:opacity", () => { this.update_opacity(); this.update_scene(); @@ -235,6 +243,11 @@ class ImageGLView extends bqplot.Mark { this.image_material.uniforms.color_max.value = max; } + update_transform() { + var transform = this.model.get('transform'); + this.image_material.uniforms.transform.value = transform; + } + update_opacity() { this.image_material.uniforms.opacity.value = this.model.get('opacity'); } diff --git a/js/shaders/image-vertex.glsl b/js/shaders/image-vertex.glsl index 92dd3bd..17007f1 100644 --- a/js/shaders/image-vertex.glsl +++ b/js/shaders/image-vertex.glsl @@ -1,7 +1,11 @@ varying vec2 pixel_coordinate; +uniform mat3 transform; void main(void) { - vec4 view_position = modelViewMatrix * vec4(position,1.0); - pixel_coordinate = view_position.xy; + vec3 pos3d = transform * position; + vec2 pos2d = pos3d.xy;// / pos3d.z; + vec4 view_position = modelViewMatrix * vec4(pos2d.x, pos2d.y, 0., 1.0); + vec4 view_position2 = modelViewMatrix * vec4(position.x, position.y, 0., 1.0); + pixel_coordinate = view_position2.xy; gl_Position = projectionMatrix * view_position; } diff --git a/ui-tests/tests/notebooks/image_rotate_update.ipynb b/ui-tests/tests/notebooks/image_rotate_update.ipynb new file mode 100644 index 0000000..708e411 --- /dev/null +++ b/ui-tests/tests/notebooks/image_rotate_update.ipynb @@ -0,0 +1,72 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "940b6b42", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from math import cos, sin, pi\n", + "from bqplot import Figure, LinearScale, Axis, ColorScale\n", + "from bqplot_image_gl import ImageGL\n", + "scale_x = LinearScale(min=0, max=1, allow_padding=False)\n", + "scale_y = LinearScale(min=0, max=1, allow_padding=False)\n", + "scales = {'x': scale_x,\n", + " 'y': scale_y}\n", + "axis_x = Axis(scale=scale_x, label='x', )\n", + "axis_y = Axis(scale=scale_y, label='y', orientation='vertical')\n", + "\n", + "figure = Figure(scales=scales, axes=[axis_x, axis_y])\n", + "\n", + "scales_image = {'x': scale_x,\n", + " 'y': scale_y,\n", + " 'image': ColorScale(min=0, max=1)}\n", + "\n", + "def rotation_matrix(theta):\n", + " return [cos(theta), -sin(theta), 0,\n", + " sin(theta), cos(theta), 0,\n", + " 0, 0, 1]\n", + "\n", + "np.random.seed(0)\n", + "M = rotation_matrix(pi/8)\n", + "image = ImageGL(image=np.random.random((10, 10)).astype('float32'), scales=scales_image, transform=M)\n", + "\n", + "figure.marks = (image,)\n", + "figure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "658efd7a", + "metadata": {}, + "outputs": [], + "source": [ + "image.transform = rotation_matrix(pi/4)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 1195b391c5c59487f31b2d26c782010664919186 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 13 Apr 2023 13:40:40 +0000 Subject: [PATCH 2/3] chore: Update Galata References --- ...t-image-rotate-update-ipynb-cell-0-linux.png | Bin 0 -> 15594 bytes ...t-image-rotate-update-ipynb-cell-1-linux.png | Bin 0 -> 18914 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-rotate-update-ipynb-cell-0-linux.png create mode 100644 ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-rotate-update-ipynb-cell-1-linux.png diff --git a/ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-rotate-update-ipynb-cell-0-linux.png b/ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-rotate-update-ipynb-cell-0-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d14c715c5f83c7f8616c5b76a2b336d5732a4107 GIT binary patch literal 15594 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 Ze)ZYqHGWPL{CHVn_fE4NDZh~d{vWCQh~NMK literal 0 HcmV?d00001 diff --git a/ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-rotate-update-ipynb-cell-1-linux.png b/ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-rotate-update-ipynb-cell-1-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..36449140b6e28b1b7a58ab29a2717d3a6b045811 GIT binary patch literal 18914 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

&zBX(l57#> zHFX`RqaP{2;y!3e0Ex0S@U9JVXz9uQN@@xk239vza@ZNbvm`Y<;AbHcN+qxGXK=*b z3!*~2_J@!ib5T`SSNPT0??QTQCR)q#Px9#Ap*@uTZ)q)W}{pu9y;VRjmSp2y_Yx`tt4_Bi>{)?Hg&i&Aa*m($TBh$eg?cqrl>2sdz!LTwQlbuiBNxP@G?32w zRb7&n*k4}UNZ`VWpQ zAO@vNQ5#cgRas+X$W{15&)M}VQHL!!vLx6Er0i=yYMf>Dcu;SLL9#5X z0BL+=rM(Up;WTDLtYeZmErVc_odBEcpddF5wsEQ;vJ5=@oT76vo0;DnFg}(Se_P_~ z>z`Z+kNq&gbhfUrPGDb*n)t2p^MuhhATHe^84>X$&LboOJ=#)&oP(6}?dNDr&efL0D~5puRelAjoO9N4Z5qf{eOQS-*t zbda>a7d^Qbh&jN!&T-hNN=0G}e=2&p`AOcd``g;11b^88fVoA=ld4O{>7}uW6N`y5 z%38C927wfDLw) zq|5{--;FIf-nELx0)xiSmg~&gfczP-8cA47I!I5T{Gu@CB1J(0V+Qrl+68E};o6WI zRPBxHKS=cA0mYNlBs!2CnNx6e7O!KFH6j7YumwxLd-oT>3ftr6*n( z%%fJnIknTKjex%n!ccuPYTg&*64}3IgCn-vXO*x^4Ya+H*(E3Z95Q)n#07UjCH`K# z1BfPp0xo{M$QhoE*b9NZ%*|!H$x}swTdeCGFvOr~p!gyMym~-66V^<}fQu_D_TI0& zUVL^yWrR@P`L6C4d2zPxbm6L(l^UP-p@#b-o+sK!@J4$F@GnCzALBPg%RzzvFM{*B z$*Z@KB4pF^^G|_tQX9EOVK&>1X$(CIk622cVn_Nn+%s_I4;UNiulhH8_wKz~{qpte z6J+v0bF(R=`SNJv0?i4_Tww07RyQ_4HhK9fwxW49yv+f#NK%qgJ%2{(@|(f8~y=KL$R$7BPb)_2FZ| zkNXw;SX8Zpima}#u1`bKO6TgaA}AKKOxV8oo#Ej7H>U(POkI2^X(f>i({S;8mg$M`1I*aotMQOBeY`8rS|&mVVz2SFP}(+UW95vWkj+yCqV+e z^rOIwKR0=>d%f!S(&n|(N48-iY%j(%&~NkJlpCrBT;_QBb?hdeLjacDq^y&|GBEkT zjHkW}!w~szEhIVVPpHg@jddfF!@JUKK}ow%+|<_Q`}SG#)h}xm8F5=8@rOAe2Gdu@ zQIgTpOtg~%EzL|aD35u%|GORYb76DqJ)C(S*i9^K)6I3JD=yHB&y4S`=vMVj^>Jg0 zvWUmn7-+hX=uV)Olf@;=sR024Gi{+c;jbOG1XKS%Z@f7bg9~*LCiB(`sM%13q+*3i zPd0Ko`c88sg~CvGxrrm*2T`^Z}Ryn&K!)W&zkuH-s#a;YLE$(|-v2gO(OWNiGm(vnEd#3;1F8t@)N z0s*aap=-M2%qFm+0vK!Ug7*iPl!41=YTqgTI`B&X3J2k;ykB?{Fmq zkexjEMAXZ#%%UEr{s{^?{R0|0p)$DHkdOE!Eap;)0K)!3u-`x!YUs0jmMXMrFfO_WhO+s?euyMdprap9h{$%|DO*H zG>!~t-Ut6)GgjU9o16bv{}Q+vVMNLVulA66e3}pP8GVqK!vlM`o`$ z94$Bmb4#G{1+%xwrXDLi3yBYkkb6qy%Cg7evy|jVcc)(XK)=0Mkfo z>|=p)eXSsbz6`Hz%`75?y+(R~U19>U{*`?ea5Gc_qKMmYX=D(8d(q?uGj`K|t0HK- zV9c-N0^b_{(0>ob9XAD%v4Pft&DOw8ouq%8F$b81WEw~h!@b3r>ICQk~hOk<&`LOuN_w`FtC zstOCds`1psdwnRQ*SJn!%hOYh$P0S9jBC7NN;RK1@_;%Xnwy}Zboolw^;%8C_iG$? z(5IajTdPFA6d3v9#x$3!5&i=rTzY!?S%3dmB_<{&si~fd^m8-z`(#^i_!))wf650%Zv*4QPt(lg+nK@zxi(j z(5}s6YA5p&gA`p?1Vg}_&!H&!vFVpBC@gXS3 zXWO`LqdndBAPvlP6m!`QY_S%VyxsRLexOTpOf3l8OoPS*5~r|W{GmHV zn@fDK(BlO4%louaNsF0zsTMc77Rn)wxZtc$*x=`b0%Vq494&A@)3Qp^_U5kJ(|_>& zRn10EG`0n;bZ9{hbqCeu89r%+1(W~ebzYG4)xD26Ozd`4U48&c7#|$UHjA#EtsauW z1oot9!5Y>G>DF5$d5X7SiQ^v!!i8Tl+!);L-IMy|<-;W@mA0=eohGY_E~%ujY+t25 z5{K(f?=9f@)*fP!3*pAt3qiDIODWTTB)=QqFr`q0`_gGVbp*4UMlWzW+L3zMjd_~~ z_tm}2e=>u-r^H&)9>E7%^%;@f=gQ0z1Xufyl8d1D$c3&*9KMm`gRuW#hiY_x9ud9t zlWa^Z)w&a_?&|mOA~^pS_!`N@*C<*xF>Z+`P|Hz~EZrkZ>khzDE{g8c9E( zMenVR|C4jarFX+`x;5R)oFTF#k)-v@*;6!;m2{e-3$+@Jf8mU6+a4!?BIa$NtNs6ZOxNGTP&ezin~J^V-z=Ge_x;<}4`r z`!gG=mwkx}JMJ8nTrcqf{)$%$yBDw)4t1af%kiAuWb|iavoK%o4V{k|5BOlZ2juds3YkKccMAMk+iyqpAPFc zX!;}+Ppn(r%3l$zp86B?-w5J?minY>%mVS6@`=(jPi9Z%rv@!mC?WubnIrALZjpNF z-u~R|Bi+;D!eQv>KXS(h?c4XGP$-~R{deH5jr^TCq7J?6FJCA5%d)$FXh^&`k*_g5 zTLW zj__me35;*?aM`5%8l#1bo3>5W0^?7W3jb&}iaR5ebzAMv5s7;fouRNTL;lsR4F=<{ zqclrDHbd>)yb9oh9-!J~bkcM^#baY=b5fltck$@EDh21F(|ZonRgawU?_4ojjtkUP zTE3k7^l1N{O*?L9-dWMQ-@eqU|HRV3ne)UquEq@4iaLszF9mUDT>g@US0S9dKlb}P zCw~!!bqQX#5Ir$HtHVDk%Y0GE*ics~UQ~LsqkqG~?x>4@sSy4A>_uBi8Al?shxt4@ zKI~~Jsj79;kZ#ZiU0H1N?`7NdanYNKwhMhje;p4Af+L)rPJ)x1w{p&hlJJV{n}*`YH&g2XEOE zbADHtE57m8quOwH;GV#eR^4a1e2ng1j;8VSCl`7Dya{^}lmlL!6(6y`+dm4Qc5die z(9QKvx=KJJ=4WI8SQs#hDywoR3-Fto7;Pfooz83byRt#h|2ciS(=%`YFQe>!``jt^ zuo&tSVLo09#Gl9KukkoIlN}$kac-&*%1!*C=PKLq!$|F#G4+;s47v65x?=h?y?lD0 zTqEeZUMsggLv4|h=7OxE(9BKYXD>`#UmWb{IGvgJItu^_k9yx`UVE~%2KGb&33uq()mp_-W}dLAF1~HY;puGz2v^N zeALgH$={drF`OAV_Gp17-1NF-IoG?cdX6>)PrXfzw6L(KF+B}VU3ErQ-vzxd(dAX5 ztv(uf7U_t=qO+5t!aD))>u&XCZc5Zs$Li>0npO?1?N`1J-DPgKdX+;yMjUo^ntki+ zVs1`q<3rN>*FNmTvazyJ9=<;#6beYP>8n<*+<$*DY4}L@B21sA{o|Bwf36AGvIh?M zIOGf;+XyK>TtG|N7vwEJ@v z68n1>=H(scsK5iMUF6`=l5YOgX!2gl)Z;Kk2s$6sr(Po6Sy8ypMB2oNGi85u+~!66 z`7S=HVIDbASM+8^8@$+HJRYXk_UyA&Qv8i-Pd0iL1vk8LiQXPv4_9^`5q^HP=F9e0 z)s&v=V417?T3cGTsO5R3e~c*d8L<7#bJywncvkfw%o&2$`Xz+E(Ao&1#c;>e=;m%u z#nul0BP4Oqi$|Bt@`xgPcDIimdT$-2nh<#j$o9Yt#V=?3hi@yOh()cIe!>5LY&qz2_U|2ve^C>m%snvzofzTgmhG8$SAK(!N#b>`ZMEHfh^GFXw>}-< zacH`=!&W)trFx^8%KZy7*#{EmbJKrU3;eR;@F|7EU%cyP@6aK{cpiLMmD#$`N@UT0 zc(mnqiq7+{oZ>ShDeac6H5*fYpT@2ibSY1rNxr_W+mkRbSlW-jo6r?d__qIXuzz0r z{#N2Wc;P@`Ds(yS3J_bDgzCj*st`HxnEsk%lhB`Dj`P2~uI2ywwwN1xbv-&h)##Ru zJXW;a?F%J-<>MUBu411B-7C@8?p(2hC+b0OlD~%2!|l4dW4H4Hs>klkF-6}ubK_W3 z_vP{FvGVd`RdWJ#;q@$Y*QPs`o*gASPqstG^toVMaaFRm3N23aA1)nB@*mpa)4#M# z8U6h)EklsEp>xQbh7Ii1@2>QniH;H8e&SeiZmKP43i^7X)NQQO_fB#6@I3S_Hji@_ zEZ2bBwlweI`vcy-!(FA$Q~h?_X literal 0 HcmV?d00001 From 66b050ee5e1d4c139884f7b6f885aeaeb0372f99 Mon Sep 17 00:00:00 2001 From: "Maarten A. Breddels" Date: Thu, 13 Apr 2023 15:45:46 +0200 Subject: [PATCH 3/3] trigger ci