From e5f1014baab9965bc32b3607ffb22b27f46ec26d Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Tue, 19 Apr 2022 20:40:30 -0600 Subject: [PATCH 1/7] add requirements to test --- setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.py b/setup.py index 6de136eb..9bc422ce 100644 --- a/setup.py +++ b/setup.py @@ -72,6 +72,9 @@ 'nbval', 'pytest-check-links', 'numpy>=1.14', + 'matplotlib', + 'ipywebrtc', + 'scikit-image', ], 'examples': [ 'scipy', From bd7494eba2856f7f00433ecff94fda6615b5b66e Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Tue, 19 Apr 2022 20:43:57 -0600 Subject: [PATCH 2/7] ignore venv --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c6a7c4d7..e095772f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ build/ *.py[cod] node_modules/ .vscode +.venv # Compiled javascript pythreejs/static/ From 7c63231ada44d6a825f77496ed444b0213baa762 Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Tue, 19 Apr 2022 23:54:18 -0600 Subject: [PATCH 3/7] add resize --- js/src/_base/Renderable.js | 27 +++++++++++++++++++++++++++ pythreejs/_base/renderable.py | 8 +++++++- pythreejs/core/Renderer.py | 6 ++++++ pythreejs/renderers/WebGLRenderer.py | 5 +++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/js/src/_base/Renderable.js b/js/src/_base/Renderable.js index 2329891d..68c9366f 100644 --- a/js/src/_base/Renderable.js +++ b/js/src/_base/Renderable.js @@ -454,6 +454,29 @@ var RenderableView = widgets.DOMWidgetView.extend({ }, + // resize the renderer + resize: function() { + const { width, height } = this.el.getBoundingClientRect(); + this.renderer.setSize(width, height); + + this.camera.aspect = width / height; + this.camera.updateProjectionMatrix(); + + // if (this.controls) { + // try { + // this.controls.handleResize(); + // this.controls.screen.width = width; + // this.controls.screen.height = height; + // } catch (error) { + // this.log("unable to update controls"); + // this.log(error); + // } + // } + + // finally render + this.render() + }, + teardownViewer: function() { this.$renderer.off('mouseenter'); @@ -494,11 +517,15 @@ var RenderableView = widgets.DOMWidgetView.extend({ }); }, + // Permit custom calls from pythreejs onCustomMessage: function(content, buffers) { switch(content.type) { case 'freeze': this.freeze(); break; + case 'resize': + this.resize(); + break; default: } }, diff --git a/pythreejs/_base/renderable.py b/pythreejs/_base/renderable.py index 303cca19..44069ac8 100644 --- a/pythreejs/_base/renderable.py +++ b/pythreejs/_base/renderable.py @@ -55,7 +55,7 @@ def send_msg(self, message_type, payload=None): def log(self, msg): content = { - 'type': 'print', + 'type': 'log', 'msg': msg } self.send(content=content, buffers=None) @@ -66,6 +66,12 @@ def freeze(self): } self.send(content) + def resize(self): + content = { + "type": "resize" + } + self.send(content) + class Preview(RenderableWidget): # renderer properties diff --git a/pythreejs/core/Renderer.py b/pythreejs/core/Renderer.py index 050dc2e0..5c61c15d 100644 --- a/pythreejs/core/Renderer.py +++ b/pythreejs/core/Renderer.py @@ -60,6 +60,12 @@ def freeze(self): } self.send(content) + def resize(self): + content = { + "type": "resize" + } + self.send(content) + @contextmanager def hold(self): self._pause_autorender = True diff --git a/pythreejs/renderers/WebGLRenderer.py b/pythreejs/renderers/WebGLRenderer.py index 1aa25cf2..82582f9a 100644 --- a/pythreejs/renderers/WebGLRenderer.py +++ b/pythreejs/renderers/WebGLRenderer.py @@ -42,3 +42,8 @@ def freeze(self): } self.send(content) + def resize(self): + content = { + "type": "resize" + } + self.send(content) From 56f49c823fe84010a80987267276ffedf8687597 Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Tue, 19 Apr 2022 23:56:46 -0600 Subject: [PATCH 4/7] Update pythreejs/_base/renderable.py --- pythreejs/_base/renderable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythreejs/_base/renderable.py b/pythreejs/_base/renderable.py index 44069ac8..e871885c 100644 --- a/pythreejs/_base/renderable.py +++ b/pythreejs/_base/renderable.py @@ -55,7 +55,7 @@ def send_msg(self, message_type, payload=None): def log(self, msg): content = { - 'type': 'log', + 'type': 'print', 'msg': msg } self.send(content=content, buffers=None) From ec2a4237758094c35e4f77388eda8b7056703115 Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Wed, 20 Apr 2022 10:04:19 -0600 Subject: [PATCH 5/7] add listener event --- examples/Renderer.ipynb | 125 ++++++++++++------------------------- examples/test.ipynb | 6 +- js/package.json | 2 +- js/src/_base/Renderable.js | 5 ++ 4 files changed, 48 insertions(+), 90 deletions(-) diff --git a/examples/Renderer.ipynb b/examples/Renderer.ipynb index 663abc75..0e4a812a 100644 --- a/examples/Renderer.ipynb +++ b/examples/Renderer.ipynb @@ -31,7 +31,9 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "## Transparent background\n", "\n", @@ -44,21 +46,19 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [ { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "pythree_example_model_009", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.5, position=(3.0, 5.0,…" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/alex/python/pythreejs/.venv/lib/python3.8/site-packages/jupyter_client/session.py:716: UserWarning: Message serialization failed with:\n", + "Out of range float values are not JSON compliant\n", + "Supporting this message is deprecated in jupyter-client 7, please make sure your message is JSON-compliant\n", + " content = self.pack(content)\n" + ] } ], "source": [ @@ -70,38 +70,29 @@ "\n", "scene = Scene(children=[ball, c, AmbientLight(color='#777777')], background=None)\n", "\n", - "renderer = Renderer(camera=c, \n", + "renderer = Renderer(camera=c,\n", + " width=600,\n", + " height=600,\n", " scene=scene,\n", " alpha=True,\n", " clearOpacity=0,\n", - " controls=[OrbitControls(controlling=c)])\n", - "display(renderer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The use of clear color/opacity is explained in more detailed in the docs of three.js, but in short:\n", - "- If `autoClear` is true the renderer output is cleared on each rendered frame.\n", - "- If `autoClearColor` is true the background color is cleared on each frame.\n", - "- When the background color is cleared, it is reset to `Renderer.clearColor`, with an opacity of `Renderer.clearOpacity`." + " controls=[OrbitControls(controlling=c)])\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "pythree_example_model_029", + "model_id": "pythree_example_model_018", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(Label(value='Clear color:'), ColorPicker(value='black'), Label(value='Clear opactiy:'), FloatSl…" + "Box(children=(Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.5, matri…" ] }, "metadata": {}, @@ -109,78 +100,40 @@ } ], "source": [ - "# Let's set up some controls for the clear color/opacity:\n", - "\n", - "opacity = ipywidgets.FloatSlider(min=0., max=1.)\n", - "ipywidgets.jslink((opacity, 'value'), (renderer, 'clearOpacity'))\n", - "\n", - "color = ipywidgets.ColorPicker()\n", - "ipywidgets.jslink((color, 'value'), (renderer, 'clearColor'))\n", + "from ipywidgets import Layout, Button, Box\n", + "box_layout = Layout(display='flex',\n", + " flex_flow='column',\n", + " align_items='stretch',\n", + " border='solid',\n", + " width='50%')\n", "\n", - "display(ipywidgets.HBox(children=[\n", - " ipywidgets.Label('Clear color:'), color, ipywidgets.Label('Clear opactiy:'), opacity]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Scene background\n", - "\n", - "If we set the background property of the scene, it will be filled in on top of whatever clear color is there, basically making the clear color ineffective." + "box = Box(children=(renderer,), layout=box_layout)\n", + "box" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "pythree_example_model_040", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(Label(value='Scene background color:'), ColorPicker(value='black'), ToggleButton(value=False, d…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "scene_background = ipywidgets.ColorPicker()\n", - "_background_link = None\n", - "\n", - "def toggle_scene_background(change):\n", - " global _background_link\n", - " if change['new']:\n", - " _background_link = ipywidgets.jslink((scene_background, 'value'), (scene, 'background'))\n", - " else:\n", - " _background_link.close()\n", - " _background_link = None\n", - " scene.background = None\n", - "\n", - "scene_background_toggle = ipywidgets.ToggleButton(False, description='Scene Color')\n", - "scene_background_toggle.observe(toggle_scene_background, 'value')\n", - "\n", - "display(ipywidgets.HBox(children=[\n", - " ipywidgets.Label('Scene background color:'), scene_background, scene_background_toggle]))" + "# renderer.send({\"type\": \"resize\"})" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# renderer.send({\"type\": \"resize\"})\n", + "# renderer.render(scene, c)" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -194,7 +147,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.8.10" }, "widgets": { "application/vnd.jupyter.widget-state+json": { @@ -674,5 +627,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/test.ipynb b/examples/test.ipynb index f3d4c5b7..47b57f55 100644 --- a/examples/test.ipynb +++ b/examples/test.ipynb @@ -189,7 +189,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -203,9 +203,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.4" + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/js/package.json b/js/package.json index 106f70fa..fde01151 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "jupyter-threejs", - "version": "2.3.0", + "version": "2.3.1", "description": "jupyter - threejs bridge", "keywords": [ "jupyterlab", diff --git a/js/src/_base/Renderable.js b/js/src/_base/Renderable.js index 68c9366f..48711bc8 100644 --- a/js/src/_base/Renderable.js +++ b/js/src/_base/Renderable.js @@ -55,6 +55,8 @@ var RenderableModel = widgets.DOMWidgetModel.extend({ this.createPropertiesArrays(); ThreeModel.prototype.setupListeners.call(this); + + window.addEventListener('resize', this.resize, false); }, createPropertiesArrays: function() { @@ -205,6 +207,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ case 'before-detach': this.el.removeEventListener('contextmenu', this, true); break; + case 'resize': + this.resize(); + break; } }, From 6096af65ba4c67eabe894ad46eac2469226848dc Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Wed, 20 Apr 2022 10:06:02 -0600 Subject: [PATCH 6/7] revert file changes --- examples/Renderer.ipynb | 125 +++++++++++++++++++++++++++------------- examples/test.ipynb | 6 +- js/package.json | 2 +- 3 files changed, 90 insertions(+), 43 deletions(-) diff --git a/examples/Renderer.ipynb b/examples/Renderer.ipynb index 0e4a812a..663abc75 100644 --- a/examples/Renderer.ipynb +++ b/examples/Renderer.ipynb @@ -31,9 +31,7 @@ }, { "cell_type": "markdown", - "metadata": { - "tags": [] - }, + "metadata": {}, "source": [ "## Transparent background\n", "\n", @@ -46,19 +44,21 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/alex/python/pythreejs/.venv/lib/python3.8/site-packages/jupyter_client/session.py:716: UserWarning: Message serialization failed with:\n", - "Out of range float values are not JSON compliant\n", - "Supporting this message is deprecated in jupyter-client 7, please make sure your message is JSON-compliant\n", - " content = self.pack(content)\n" - ] + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "pythree_example_model_009", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.5, position=(3.0, 5.0,…" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -70,29 +70,38 @@ "\n", "scene = Scene(children=[ball, c, AmbientLight(color='#777777')], background=None)\n", "\n", - "renderer = Renderer(camera=c,\n", - " width=600,\n", - " height=600,\n", + "renderer = Renderer(camera=c, \n", " scene=scene,\n", " alpha=True,\n", " clearOpacity=0,\n", - " controls=[OrbitControls(controlling=c)])\n" + " controls=[OrbitControls(controlling=c)])\n", + "display(renderer)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The use of clear color/opacity is explained in more detailed in the docs of three.js, but in short:\n", + "- If `autoClear` is true the renderer output is cleared on each rendered frame.\n", + "- If `autoClearColor` is true the background color is cleared on each frame.\n", + "- When the background color is cleared, it is reset to `Renderer.clearColor`, with an opacity of `Renderer.clearOpacity`." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "pythree_example_model_018", + "model_id": "pythree_example_model_029", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Box(children=(Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.5, matri…" + "HBox(children=(Label(value='Clear color:'), ColorPicker(value='black'), Label(value='Clear opactiy:'), FloatSl…" ] }, "metadata": {}, @@ -100,40 +109,78 @@ } ], "source": [ - "from ipywidgets import Layout, Button, Box\n", - "box_layout = Layout(display='flex',\n", - " flex_flow='column',\n", - " align_items='stretch',\n", - " border='solid',\n", - " width='50%')\n", + "# Let's set up some controls for the clear color/opacity:\n", + "\n", + "opacity = ipywidgets.FloatSlider(min=0., max=1.)\n", + "ipywidgets.jslink((opacity, 'value'), (renderer, 'clearOpacity'))\n", + "\n", + "color = ipywidgets.ColorPicker()\n", + "ipywidgets.jslink((color, 'value'), (renderer, 'clearColor'))\n", "\n", - "box = Box(children=(renderer,), layout=box_layout)\n", - "box" + "display(ipywidgets.HBox(children=[\n", + " ipywidgets.Label('Clear color:'), color, ipywidgets.Label('Clear opactiy:'), opacity]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scene background\n", + "\n", + "If we set the background property of the scene, it will be filled in on top of whatever clear color is there, basically making the clear color ineffective." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "pythree_example_model_040", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(Label(value='Scene background color:'), ColorPicker(value='black'), ToggleButton(value=False, d…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "# renderer.send({\"type\": \"resize\"})" + "scene_background = ipywidgets.ColorPicker()\n", + "_background_link = None\n", + "\n", + "def toggle_scene_background(change):\n", + " global _background_link\n", + " if change['new']:\n", + " _background_link = ipywidgets.jslink((scene_background, 'value'), (scene, 'background'))\n", + " else:\n", + " _background_link.close()\n", + " _background_link = None\n", + " scene.background = None\n", + "\n", + "scene_background_toggle = ipywidgets.ToggleButton(False, description='Scene Color')\n", + "scene_background_toggle.observe(toggle_scene_background, 'value')\n", + "\n", + "display(ipywidgets.HBox(children=[\n", + " ipywidgets.Label('Scene background color:'), scene_background, scene_background_toggle]))" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# renderer.send({\"type\": \"resize\"})\n", - "# renderer.render(scene, c)" - ] + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -147,7 +194,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.6.6" }, "widgets": { "application/vnd.jupyter.widget-state+json": { @@ -627,5 +674,5 @@ } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 2 } diff --git a/examples/test.ipynb b/examples/test.ipynb index 47b57f55..f3d4c5b7 100644 --- a/examples/test.ipynb +++ b/examples/test.ipynb @@ -189,7 +189,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -203,9 +203,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.5.4" } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 2 } diff --git a/js/package.json b/js/package.json index fde01151..106f70fa 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "jupyter-threejs", - "version": "2.3.1", + "version": "2.3.0", "description": "jupyter - threejs bridge", "keywords": [ "jupyterlab", From 671f610443f600a9d943940d6929c7d4c844863c Mon Sep 17 00:00:00 2001 From: Alex Kaszynski Date: Wed, 20 Apr 2022 22:24:41 -0600 Subject: [PATCH 7/7] allow resize in browser --- js/src/_base/Renderable.js | 50 ++++++++++++++++++---------- pythreejs/_base/renderable.py | 7 +--- pythreejs/core/Renderer.py | 13 +++----- pythreejs/renderers/WebGLRenderer.py | 9 ++--- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/js/src/_base/Renderable.js b/js/src/_base/Renderable.js index 48711bc8..2656bb74 100644 --- a/js/src/_base/Renderable.js +++ b/js/src/_base/Renderable.js @@ -2,6 +2,7 @@ var _ = require('underscore'); var widgets = require('@jupyter-widgets/base'); var $ = require('jquery'); var Promise = require('bluebird'); +var THREE = require('three'); var pkgName = require('../../package.json').name; var EXTENSION_SPEC_VERSION = require('../version').EXTENSION_SPEC_VERSION; @@ -56,7 +57,6 @@ var RenderableModel = widgets.DOMWidgetModel.extend({ this.createPropertiesArrays(); ThreeModel.prototype.setupListeners.call(this); - window.addEventListener('resize', this.resize, false); }, createPropertiesArrays: function() { @@ -187,6 +187,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.isFrozen = true; this.id = Math.floor(Math.random() * 1000000); this._ticking = false; + if (this.model.get('autoResize')) { + window.addEventListener('resize', this.resize.bind(this), false); + } }, remove: function() { @@ -198,6 +201,7 @@ var RenderableView = widgets.DOMWidgetView.extend({ } }, + // This allows dynamic messages from jupyterlab processPhosphorMessage: function(msg) { widgets.DOMWidgetView.prototype.processPhosphorMessage.call(this, msg); switch (msg.type) { @@ -208,7 +212,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.el.removeEventListener('contextmenu', this, true); break; case 'resize': - this.resize(); + if (this.model.get('autoResize')) { + this.resize(); + } break; } }, @@ -245,7 +251,6 @@ var RenderableView = widgets.DOMWidgetView.extend({ doRender: function() { this.el.className = 'jupyter-widget jupyter-threejs'; - this.unfreeze(); this.lazyRendererSetup(); @@ -459,27 +464,36 @@ var RenderableView = widgets.DOMWidgetView.extend({ }, + // Get the size of the container, or if that doesn't exist, the window + getSize: function() { + try { + const { width, height } = this.el.getBoundingClientRect(); + console.log("bounding client size"); + return [width, height]; + } catch (error) { + // Not using a container for the renderer + console.log("Window size"); + return [window.innerWidth, window.innerHeight] + } + }, + // resize the renderer resize: function() { - const { width, height } = this.el.getBoundingClientRect(); - this.renderer.setSize(width, height); + let size = this.getSize(); + const width = size[0], + height = size[1]; + if (width === 0){ + return; + } + this.renderer.setSize(width, height - 4.4); // Seems to grow by 4.4 px on each resize this.camera.aspect = width / height; this.camera.updateProjectionMatrix(); - // if (this.controls) { - // try { - // this.controls.handleResize(); - // this.controls.screen.width = width; - // this.controls.screen.height = height; - // } catch (error) { - // this.log("unable to update controls"); - // this.log(error); - // } - // } - - // finally render - this.render() + // finally render if not frozen + if (!this.isFrozen) { + this.render() + } }, teardownViewer: function() { diff --git a/pythreejs/_base/renderable.py b/pythreejs/_base/renderable.py index e871885c..99da6960 100644 --- a/pythreejs/_base/renderable.py +++ b/pythreejs/_base/renderable.py @@ -23,6 +23,7 @@ class RenderableWidget(DOMWidget): _alpha = Bool(False).tag(sync=True) _webgl_version = Int(2).tag(sync=True) + autoResize = Bool(False).tag(sync=True) autoClear = Bool(True).tag(sync=True) autoClearColor = Bool(True).tag(sync=True) autoClearDepth = Bool(True).tag(sync=True) @@ -66,12 +67,6 @@ def freeze(self): } self.send(content) - def resize(self): - content = { - "type": "resize" - } - self.send(content) - class Preview(RenderableWidget): # renderer properties diff --git a/pythreejs/core/Renderer.py b/pythreejs/core/Renderer.py index 5c61c15d..c6aef25f 100644 --- a/pythreejs/core/Renderer.py +++ b/pythreejs/core/Renderer.py @@ -5,7 +5,7 @@ from contextlib import contextmanager from ipywidgets import widget_serialization from traitlets import ( - Unicode, CInt, Instance, Float, Tuple, Undefined, link) + Unicode, CInt, Instance, Float, Tuple, Undefined, link, Bool) from ..traits import * @@ -27,6 +27,7 @@ class Renderer(RenderableWidget): width = CInt(200) height = CInt(200) + scene = Instance(Scene).tag(sync=True, **widget_serialization) camera = Instance(Camera).tag(sync=True, **widget_serialization) controls = List(Instance(Controls)).tag(sync=True, **widget_serialization) @@ -34,7 +35,7 @@ class Renderer(RenderableWidget): background = Color('black', allow_none=True).tag(sync=True) background_opacity = Float(1.0, min=0.0, max=1.0).tag(sync=True) - def __init__(self, scene, camera, controls=None, antialias=False, alpha=False, webgl_version=2, **kwargs): + def __init__(self, scene, camera, controls=None, antialias=False, alpha=False, webgl_version=2, auto_resize=False, **kwargs): super(Renderer, self).__init__( scene=scene, camera=camera, @@ -42,9 +43,11 @@ def __init__(self, scene, camera, controls=None, antialias=False, alpha=False, w _antialias=antialias, _alpha=alpha, _webgl_version=webgl_version, + auto_resize=False, **kwargs) link((self, 'width'), (self, '_width')) link((self, 'height'), (self, '_height')) + self.autoResize = auto_resize def render(self, scene, camera): content = { @@ -60,12 +63,6 @@ def freeze(self): } self.send(content) - def resize(self): - content = { - "type": "resize" - } - self.send(content) - @contextmanager def hold(self): self._pause_autorender = True diff --git a/pythreejs/renderers/WebGLRenderer.py b/pythreejs/renderers/WebGLRenderer.py index 82582f9a..ccede28e 100644 --- a/pythreejs/renderers/WebGLRenderer.py +++ b/pythreejs/renderers/WebGLRenderer.py @@ -1,5 +1,5 @@ from ipywidgets import widget_serialization -from traitlets import Unicode, CInt, link +from traitlets import Unicode, CInt, link, Bool from .._base.renderable import RenderableWidget @@ -18,6 +18,7 @@ class WebGLRenderer(RenderableWidget): width = CInt(200) height = CInt(200) + autoResize = Bool(False) def __init__(self, antialias=False, alpha=False, webgl_version=2, **kwargs): super(WebGLRenderer, self).__init__( @@ -41,9 +42,3 @@ def freeze(self): "type": "freeze" } self.send(content) - - def resize(self): - content = { - "type": "resize" - } - self.send(content)