From 00b0c1792b2d750d605518b1faa5afa909cfc3e2 Mon Sep 17 00:00:00 2001 From: Vidar Tonaas Fauske <510760+vidartf@users.noreply.github.com> Date: Wed, 25 May 2022 12:20:43 +0100 Subject: [PATCH 1/6] Drop py2 support --- js/scripts/templates/py_wrapper.mustache | 8 +++---- pythreejs/_base/uniforms.py | 4 +--- pythreejs/core/Renderer.py | 28 +++++++++++------------- pythreejs/traits.py | 8 ++----- setup.cfg | 2 +- setup.py | 1 + 6 files changed, 21 insertions(+), 30 deletions(-) diff --git a/js/scripts/templates/py_wrapper.mustache b/js/scripts/templates/py_wrapper.mustache index 431bcda9..ff257a0a 100644 --- a/js/scripts/templates/py_wrapper.mustache +++ b/js/scripts/templates/py_wrapper.mustache @@ -1,4 +1,3 @@ -import six from ipywidgets import ( Widget, DOMWidget, widget_serialization, register ) @@ -57,7 +56,6 @@ class {{ className }}({{ superClass.className }}): {{/each}} -if six.PY3: - import inspect - # Include explicit signature since the metaclass screws it up - {{ className }}.__signature__ = inspect.signature({{ className }}.__init__) +import inspect +# Include explicit signature since the metaclass screws it up +{{ className }}.__signature__ = inspect.signature({{ className }}.__init__) diff --git a/pythreejs/_base/uniforms.py b/pythreejs/_base/uniforms.py index d9e88473..aafef704 100644 --- a/pythreejs/_base/uniforms.py +++ b/pythreejs/_base/uniforms.py @@ -1,6 +1,4 @@ -from six import string_types - from ipywidgets import Widget, widget_serialization def serialize_uniforms(uniforms, obj): @@ -19,7 +17,7 @@ def serialize_uniforms(uniforms, obj): 'value': widget_serialization['to_json'](value, None) } - elif isinstance(value, string_types): + elif isinstance(value, str): serialized[name] = { 'type': 'c', 'value': value diff --git a/pythreejs/core/Renderer.py b/pythreejs/core/Renderer.py index 050dc2e0..beeac9dd 100644 --- a/pythreejs/core/Renderer.py +++ b/pythreejs/core/Renderer.py @@ -1,7 +1,6 @@ """ """ -import six from contextlib import contextmanager from ipywidgets import widget_serialization from traitlets import ( @@ -69,17 +68,16 @@ def hold(self): self._pause_autorender = False -if six.PY3: - from inspect import Signature, Parameter - # Include explicit signature since the metaclass screws it up - parameters = [ - Parameter('scene', Parameter.POSITIONAL_OR_KEYWORD), - Parameter('camera', Parameter.POSITIONAL_OR_KEYWORD), - Parameter('controls', Parameter.POSITIONAL_OR_KEYWORD, default=None), - ] - for name in ('width', 'height', 'background', 'background_opacity'): - parameters.append(Parameter( - name, Parameter.KEYWORD_ONLY, default=getattr(Renderer, name).default_value)) - parameters.append(Parameter('kwargs', Parameter.VAR_KEYWORD)) - Renderer.__signature__ = Signature(parameters=tuple(parameters)) - del parameters +from inspect import Signature, Parameter +# Include explicit signature since the metaclass screws it up +parameters = [ + Parameter('scene', Parameter.POSITIONAL_OR_KEYWORD), + Parameter('camera', Parameter.POSITIONAL_OR_KEYWORD), + Parameter('controls', Parameter.POSITIONAL_OR_KEYWORD, default=None), +] +for name in ('width', 'height', 'background', 'background_opacity'): + parameters.append(Parameter( + name, Parameter.KEYWORD_ONLY, default=getattr(Renderer, name).default_value)) +parameters.append(Parameter('kwargs', Parameter.VAR_KEYWORD)) +Renderer.__signature__ = Signature(parameters=tuple(parameters)) +del parameters diff --git a/pythreejs/traits.py b/pythreejs/traits.py index d35dae8b..9792d752 100644 --- a/pythreejs/traits.py +++ b/pythreejs/traits.py @@ -2,11 +2,7 @@ # -*- coding: utf-8 -*- from collections import namedtuple -try: - from collections.abc import Sequence # python3 -except ImportError: - from collections import Sequence # python2 -import six +from collections.abc import Sequence import re import warnings @@ -254,7 +250,7 @@ class Color(Unicode): def validate(self, obj, value): if value is None and self.allow_none: return value - if isinstance(value, six.string_types): + if isinstance(value, str): if value.lower() in _color_names or _color_re.match(value): return value elif _color_hexa_re.match(value) or _color_rgbhsl_re.match(value): diff --git a/setup.cfg b/setup.cfg index 0b022df6..8f2a464e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bdist_wheel] -universal=1 +universal=0 [metadata] license_file = LICENSE diff --git a/setup.py b/setup.py index 6de136eb..383471bb 100644 --- a/setup.py +++ b/setup.py @@ -62,6 +62,7 @@ 'long_description_content_type': 'text/markdown', 'license': 'BSD-3-Clause', 'include_package_data': True, + 'python_requires': '>=3.7', 'install_requires': [ 'ipywidgets>=7.2.1', 'ipydatawidgets>=1.1.1', From 41b87e663ccde754bb130672aa3f0ce70fa247e1 Mon Sep 17 00:00:00 2001 From: Vidar Tonaas Fauske <510760+vidartf@users.noreply.github.com> Date: Thu, 19 May 2022 17:41:28 +0100 Subject: [PATCH 2/6] Update for ipywidgets 8 --- js/package.json | 24 +-- js/scripts/templates/js_wrapper.mustache | 36 ++-- js/src/_base/Preview.js | 77 ++++--- js/src/_base/Renderable.js | 151 +++++++------- js/src/_base/RendererPool.js | 84 ++++---- js/src/_base/Three.js | 240 +++++++++++----------- js/src/_base/utils.js | 4 +- js/src/animation/AnimationAction.js | 77 +++---- js/src/cameras/CombinedCamera.js | 20 +- js/src/cameras/OrthographicCamera.js | 6 +- js/src/cameras/PerspectiveCamera.js | 6 +- js/src/controls/FlyControls.js | 32 +-- js/src/controls/OrbitControls.js | 16 +- js/src/controls/Picker.js | 36 ++-- js/src/controls/TrackballControls.js | 16 +- js/src/core/BufferAttribute.js | 28 +-- js/src/core/BufferGeometry.js | 20 +- js/src/core/Geometry.js | 10 +- js/src/core/InstancedBufferGeometry.js | 16 +- js/src/core/InstancedInterleavedBuffer.js | 8 +- js/src/core/InterleavedBuffer.js | 28 +-- js/src/core/Object3D.js | 34 +-- js/src/core/Renderer.js | 80 ++++---- js/src/examples/.eslintrc.js | 2 +- js/src/extension.js | 2 +- js/src/geometries/EdgesGeometry.js | 16 +- js/src/geometries/LineGeometry.js | 8 +- js/src/geometries/LineSegmentsGeometry.js | 20 +- js/src/helpers/ArrowHelper.js | 18 +- js/src/jupyterlab-plugin.js | 2 +- js/src/lights/LightShadow.js | 6 +- js/src/materials/LineMaterial.js | 8 +- js/src/materials/Material.js | 8 +- js/src/objects/Blackbox.js | 14 +- js/src/objects/CloneArray.js | 52 +++-- js/src/objects/Line2.js | 8 +- js/src/objects/LineSegments2.js | 8 +- js/src/objects/Mesh.js | 16 +- js/src/objects/SkinnedMesh.js | 10 +- js/src/renderers/WebGLRenderer.js | 43 ++-- js/src/renderers/webgl/WebGLShadowMap.js | 20 +- js/src/textures/DataTexture.js | 34 +-- js/src/textures/DataTexture3D.js | 33 +-- js/src/textures/DepthTexture.js | 16 +- js/src/textures/ImageTexture.js | 8 +- js/src/textures/TextTexture.js | 14 +- pythreejs/_base/Three.py | 17 +- 47 files changed, 720 insertions(+), 712 deletions(-) diff --git a/js/package.json b/js/package.json index 106f70fa..e7f17d8c 100644 --- a/js/package.json +++ b/js/package.json @@ -24,33 +24,33 @@ "autogen:shaders": "node ./scripts/generate-shader-utils.js", "autogen:wrappers": "node ./scripts/generate-wrappers.js", "build:all": "npm run build:labextension", - "build:bundles": "webpack -d && node ./scripts/post-build.js --debug", - "build:bundles-prod": "webpack -p && node ./scripts/post-build.js", + "build:bundles": "webpack --mode development && node ./scripts/post-build.js --debug", + "build:bundles-prod": "webpack --mode production && node ./scripts/post-build.js", "build:labextension": "rimraf lab-dist && mkdirp lab-dist && cd lab-dist && npm pack .. && cd .. && jupyter labextension build .", "clean": "rimraf dist && rimraf ../pythreejs/static && rimraf lab-dist && node ./scripts/clean-generated-files.js", "prepack": "npm run build:bundles-prod", "prepare": "npm run autogen", "update:deps": "update-dependency --minimal --regex \"^(?!@jupyter-widgets|three)\"", - "watch": "webpack -d -w" + "watch": "webpack --mode development -w" }, "dependencies": { - "@jupyter-widgets/base": "^1.2.5 || ^2.0.0 || ^3.0.0 || ^4.0.0", + "@jupyter-widgets/base": "^6.0.0-rc.0", "bluebird": "^3.5.5", - "jupyter-dataserializers": "^2.2.0", + "jupyter-dataserializers": "^3.0.0", "three": "^0.97.0", - "underscore": "^1.8.3" + "underscore": "^1.13.1" }, "devDependencies": { "@jupyterlab/builder": "^3.0.0", - "@jupyterlab/buildutils": "^2.0.2", - "eslint": "^6.8.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.4", + "@jupyterlab/buildutils": "^3.2.4", + "eslint": "^8.4.1", + "fs-extra": "^10.0.0", + "glob": "^8.0.3", "handlebars": "^4.1.2", "mkdirp": "^1.0.3", "rimraf": "^3.0.2", - "webpack": "^4.34.0", - "webpack-cli": "^3.3.4" + "webpack": "^5.65.0", + "webpack-cli": "^4.9.1" }, "jupyterlab": { "extension": "src/jupyterlab-plugin", diff --git a/js/scripts/templates/js_wrapper.mustache b/js/scripts/templates/js_wrapper.mustache index 07b01412..ebe3cc21 100644 --- a/js/scripts/templates/js_wrapper.mustache +++ b/js/scripts/templates/js_wrapper.mustache @@ -17,9 +17,9 @@ var {{ dep.modelName }} = require('{{ dep.requirePath }}').{{ dep.modelName }}; {{/notSuper}} {{/each}} -var {{ modelName }} = {{ superClass.modelName }}.extend({ +class {{ modelName }} extends {{ superClass.modelName }} { - defaults: function() { + defaults() { return _.extend({{ superClass.modelName }}.prototype.defaults.call(this), { {{#each properties as |prop propName|}} @@ -27,9 +27,9 @@ var {{ modelName }} = {{ superClass.modelName }}.extend({ {{/each}} }); - }, + } - constructThreeObject: function() { + constructThreeObject() { var result = new THREE.{{ className }}({{#if constructor.args}} {{#each constructor.args as |arg|}} @@ -38,9 +38,9 @@ var {{ modelName }} = {{ superClass.modelName }}.extend({ {{/if}}); return Promise.resolve(result); - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { {{ superClass.modelName }}.prototype.createPropertiesArrays.call(this); {{#each properties as |prop propName|}} @@ -70,20 +70,18 @@ var {{ modelName }} = {{ superClass.modelName }}.extend({ {{/if}} {{/each}} - }, + } +} -}, { - - model_name: '{{ modelName }}', - - {{#if serialized_props }} - serializers: _.extend({ - {{#each serialized_props as |serializer propName|}} - {{ propName }}: {{ serializer }}, - {{/each}} - }{{#if superClass }}, {{ superClass.modelName }}.serializers){{/if}}, - {{/if}} -}); +{{ modelName }}.model_name = '{{ modelName }}'; +{{#if serialized_props }} +{{ modelName }}.serializers = { + {{#if superClass }}...{{ superClass.modelName }}.serializers,{{/if}} + {{#each serialized_props as |serializer propName|}} + {{ propName }}: {{ serializer }}, + {{/each}} +}; +{{/if}} module.exports = { {{ modelName }}: {{ modelName }}, diff --git a/js/src/_base/Preview.js b/js/src/_base/Preview.js index d00534bc..c8743ecf 100644 --- a/js/src/_base/Preview.js +++ b/js/src/_base/Preview.js @@ -13,23 +13,23 @@ var unpackThreeModel = require('./serializers').unpackThreeModel; var BLACK = new THREE.Color('black'); -var PreviewView = RenderableView.extend({ +class PreviewView extends RenderableView { - initialize: function() { + initialize() { RenderableView.prototype.initialize.apply(this, arguments); this._resetCameraNeeded = true; this._rebuildNeeded = true; - }, + } - render: function() { + render() { // ensure that model is fully initialized before attempting render return this.model.initPromise.bind(this).then(this.doRender); - }, + } - setupEventListeners: function() { + setupEventListeners() { RenderableView.prototype.setupEventListeners.call(this); var child = this.model.get('child'); this.listenTo(child, 'change', this.onChildChanged.bind(this)); @@ -38,17 +38,17 @@ var PreviewView = RenderableView.extend({ // any nested change instead of just rerendering. this.listenTo(child, 'childchange', this.onChildChanged.bind(this)); } - }, + } - onChildChanged: function() { + onChildChanged() { // Enabling this line will reset the camera // when any changes are made to the child //this._resetCameraNeeded = true; this._rebuildNeeded = true; - }, + } - constructScene: function() { + constructScene() { var obj = this.model.get('child').obj; @@ -131,9 +131,9 @@ var PreviewView = RenderableView.extend({ // Clear at end to ensure that any changes to obj does not // cause infinite rebuild chain. this._rebuildNeeded = false; - }, + } - resetCamera: function() { + resetCamera() { // Compute bounding sphere for entire scene var sphere = utils.computeBoundingSphere(this.scene); if (sphere === null) { @@ -152,14 +152,14 @@ var PreviewView = RenderableView.extend({ // Position light up to the left and behind camera var dist = 2.5 * (this.camera.position.z - sphere.center.z); this.pointLight.position.set(-dist, dist, dist); - }, + } - clearScene: function() { + clearScene() { // this.controls.reset(); this.scene.remove.apply(this.scene, this.scene.children.slice()); - }, + } - setupControls: function() { + setupControls() { // Allow user to inspect object with mouse/scrollwheel this.debug('setting up controls'); var control = new OrbitControls(this.camera, this.renderer.domElement); @@ -168,9 +168,9 @@ var PreviewView = RenderableView.extend({ control.target.set(0, 0, 0); control.update(); this.controls = [control]; - }, + } - lazyRendererSetup: function() { + lazyRendererSetup() { this.camera = new THREE.PerspectiveCamera(60, 1.0); // aspect is updated by this.updateSize() // position and lookat target is updated to fit scene @@ -194,9 +194,9 @@ var PreviewView = RenderableView.extend({ this.enableControls(); this.renderScene(); - }, + } - renderScene: function() { + renderScene() { this.debug('renderScene'); if (this.isFrozen) { @@ -220,9 +220,9 @@ var PreviewView = RenderableView.extend({ if (this.scene.ipymodel) { this.scene.ipymodel.trigger('afterRender', this.scene, this.renderer, this.camera); } - }, + } - updateSize: function() { + updateSize() { RenderableView.prototype.updateSize.call(this); if (this.camera) { var width = this.model.get('_width'); @@ -230,14 +230,14 @@ var PreviewView = RenderableView.extend({ this.camera.aspect = width / height; this.camera.updateProjectionMatrix(); } - }, + } -}); +} -var PreviewModel = RenderableModel.extend({ +class PreviewModel extends RenderableModel { - defaults: function() { + defaults() { return _.extend(RenderableModel.prototype.defaults.call(this), { _model_name: 'PreviewModel', _view_name: 'PreviewView', @@ -246,34 +246,33 @@ var PreviewModel = RenderableModel.extend({ _wire: false, child: null, }); - }, + } - initialize: function(attributes, options) { + initialize(attributes, options) { RenderableModel.prototype.initialize.apply(this, arguments); // Don't listen to child until it is finished it's setup this.initPromise = this.get('child').initPromise.bind(this).then(function() { this.setupListeners(); }); - }, + } - setupListeners: function() { + setupListeners() { var child = this.get('child'); this.listenTo(child, 'change', this.onChildChanged.bind(this)); this.listenTo(child, 'childchange', this.onChildChanged.bind(this)); - }, + } - onChildChanged: function(model, options) { + onChildChanged(model, options) { this.trigger('rerender', this, {}); - }, + } -}, { +} - serializers: _.extend({ - child: { deserialize: unpackThreeModel }, - }, RenderableModel.serializers), - -}); +PreviewModel.serializers = { + ...RenderableModel.serializers, + child: { deserialize: unpackThreeModel }, +}; module.exports = { diff --git a/js/src/_base/Renderable.js b/js/src/_base/Renderable.js index 2329891d..8e6b3c19 100644 --- a/js/src/_base/Renderable.js +++ b/js/src/_base/Renderable.js @@ -11,9 +11,9 @@ var ThreeModel = require('./Three').ThreeModel; var unpackThreeModel = require('./serializers').unpackThreeModel; -var RenderableModel = widgets.DOMWidgetModel.extend({ +class RenderableModel extends widgets.DOMWidgetModel { - defaults: function() { + defaults() { return _.extend(widgets.DOMWidgetModel.prototype.defaults.call(this), { _model_module: pkgName, _view_module: pkgName, @@ -48,16 +48,16 @@ var RenderableModel = widgets.DOMWidgetModel.extend({ clearColor: '#000000', clearOpacity: 1.0, }); - }, + } - initialize: function(attributes, options) { + initialize(attributes, options) { widgets.DOMWidgetModel.prototype.initialize.apply(this, arguments); this.createPropertiesArrays(); ThreeModel.prototype.setupListeners.call(this); - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { // This does not inherit ThreeModel, but follow same pattern ThreeModel.prototype.createPropertiesArrays.call(this); this.three_nested_properties.push('clippingPlanes'); @@ -80,21 +80,21 @@ var RenderableModel = widgets.DOMWidgetModel.extend({ this.property_converters['toneMapping'] = 'convertEnum'; this.property_converters['toneMappingExposure'] = 'convertFloat'; this.property_converters['toneMappingWhitepoint'] = 'convertFloat'; - }, + } - onChange: function(model, options) { - }, + onChange(model, options) { + } - onChildChanged: function(model, options) { + onChildChanged(model, options) { console.debug('child changed: ' + model.model_id); // Let listeners (e.g. views) know: this.trigger('childchange', this); - }, + } /** * Find a view, preferrably a live one */ - _findView: function() { + _findView() { var viewPromises = Object.keys(this.views).map(function(key) { return this.views[key]; }, this); @@ -107,12 +107,12 @@ var RenderableModel = widgets.DOMWidgetModel.extend({ } return views[0]; }); - }, + } /** * Interface for jupyter-webrtc. */ - captureStream: function(fps) { + captureStream(fps) { var stream = new MediaStream(); var that = this; @@ -166,37 +166,38 @@ var RenderableModel = widgets.DOMWidgetModel.extend({ return updateStream().then(function() { return stream; }); - }, + } -}, { - serializers: _.extend({ - clippingPlanes: { deserialize: unpackThreeModel }, - shadowMap: { deserialize: unpackThreeModel }, - }, widgets.DOMWidgetModel.serializers) -}); +} +RenderableModel.serializers = { + ...widgets.DOMWidgetModel.serializers, + clippingPlanes: { deserialize: unpackThreeModel }, + shadowMap: { deserialize: unpackThreeModel }, +} -var RenderableView = widgets.DOMWidgetView.extend({ - initialize: function () { +class RenderableView extends widgets.DOMWidgetView { + + initialize() { widgets.DOMWidgetView.prototype.initialize.apply(this, arguments); // starts as "frozen" until renderer is acquired this.isFrozen = true; this.id = Math.floor(Math.random() * 1000000); this._ticking = false; - }, + } - remove: function() { - widgets.DOMWidgetView.prototype.remove.apply(this, arguments); + remove() { + super.remove(); this.$el.empty(); if (!this.isFrozen) { this.teardownViewer(); } - }, + } - processPhosphorMessage: function(msg) { + processPhosphorMessage(msg) { widgets.DOMWidgetView.prototype.processPhosphorMessage.call(this, msg); switch (msg.type) { case 'after-attach': @@ -206,9 +207,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.el.removeEventListener('contextmenu', this, true); break; } - }, + } - handleEvent: function(event) { + handleEvent(event) { switch (event.type) { case 'contextmenu': this.handleContextMenu(event); @@ -217,9 +218,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ widgets.DOMWidgetView.prototype.handleEvent.call(this, event); break; } - }, + } - handleContextMenu: function(event) { + handleContextMenu(event) { // Cancel context menu if on renderer: var candidates = []; if (this.renderer) { @@ -232,13 +233,13 @@ var RenderableView = widgets.DOMWidgetView.extend({ event.preventDefault(); event.stopPropagation(); } - }, + } - render: function() { + render() { this.doRender(); - }, + } - doRender: function() { + doRender() { this.el.className = 'jupyter-widget jupyter-threejs'; this.unfreeze(); @@ -246,29 +247,29 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.lazyRendererSetup(); this.setupEventListeners(); - }, + } - setupEventListeners: function() { + setupEventListeners() { this.listenTo(this.model, 'rerender', this.tick.bind(this)); this.listenTo(this.model, 'msg:custom', this.onCustomMessage.bind(this)); this.listenTo(this.model, 'change:_width', this.updateSize.bind(this)); this.listenTo(this.model, 'change:_height', this.updateSize.bind(this)); - }, + } - tick: function() { + tick() { if (!this._ticking) { requestAnimationFrame(this.tock.bind(this)); this._ticking = true; } - }, + } - tock: function() { + tock() { this._ticking = false; this.renderScene(); - }, + } - updateSize: function() { + updateSize() { var width = this.model.get('_width'); var height = this.model.get('_height'); if (this.isFrozen) { @@ -278,9 +279,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.renderer.setSize(width, height); } this.trigger('updatestream'); - }, + } - updateProperties: function(force) { + updateProperties(force) { if (this.isFrozen) { return; } @@ -315,9 +316,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ var clearColor = ThreeModel.prototype.convertColorModelToThree(model.get('clearColor')); var clearOpacity = ThreeModel.prototype.convertFloatModelToThree(model.get('clearOpacity')); this.renderer.setClearColor(clearColor, clearOpacity); - }, + } - _updateShadowMap: function(force) { + _updateShadowMap(force) { var model = this.model.get('shadowMap'); var obj = this.renderer.shadowMap; var changes = false; @@ -353,15 +354,15 @@ var RenderableView = widgets.DOMWidgetView.extend({ if (changes) { obj.needsUpdate = true; } - }, + } - convertThreeTypeArray: function(modelArr, propName) { + convertThreeTypeArray(modelArr, propName) { return modelArr.map(function(model) { return ThreeModel.prototype.convertThreeTypeModelToThree(model, propName); }, this); - }, + } - renderScene: function(scene, camera) { + renderScene(scene, camera) { this.debug('renderScene'); scene = scene || this.scene; @@ -384,9 +385,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ if (scene.ipymodel) { scene.ipymodel.trigger('afterRender', scene, this.renderer, camera); } - }, + } - unfreeze: function() { + unfreeze() { if (!this.isFrozen) { return; } @@ -404,9 +405,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ if (this.controls) { this.enableControls(); } - }, + } - acquireRenderer: function() { + acquireRenderer() { this.debug('ThreeView.acquiring...'); @@ -427,9 +428,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.updateSize(); this.debug('ThreeView.acquireRenderer(' + this.renderer.poolId + ')'); - }, + } - freeze: function() { + freeze() { if (this.isFrozen) { this.log('already frozen...'); return; @@ -452,9 +453,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ }, this)); } - }, + } - teardownViewer: function() { + teardownViewer() { this.$renderer.off('mouseenter'); this.$renderer.off('mouseleave'); @@ -471,9 +472,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ this.$el.css('margin-bottom', 'auto'); - }, + } - enableControls: function() { + enableControls() { this.debug('Enable controls'); this.boundTick = this.tick.bind(this); var that = this; @@ -482,9 +483,9 @@ var RenderableView = widgets.DOMWidgetView.extend({ control.connectEvents(that.$renderer[0]); control.addEventListener('change', that.boundTick); }); - }, + } - disableControls: function() { + disableControls() { this.debug('Disable controls'); var that = this; this.controls.forEach(function(control) { @@ -492,35 +493,35 @@ var RenderableView = widgets.DOMWidgetView.extend({ control.dispose(); // Disconnect from DOM events control.removeEventListener('change', that.boundTick); }); - }, + } - onCustomMessage: function(content, buffers) { + onCustomMessage(content, buffers) { switch(content.type) { case 'freeze': this.freeze(); break; default: } - }, + } - onRendererReclaimed: function() { + onRendererReclaimed() { this.debug('ThreeView WebGL context is being reclaimed: ' + this.renderer.poolId); this.freeze(); - }, + } - log: function(str) { + log(str) { console.log('TV(' + this.id + '): ' + str); - }, + } - debug: function(str) { + debug(str) { console.debug('TV(' + this.id + '): ' + str); - }, + } - lazyRendererSetup: function() { + lazyRendererSetup() { throw new Error('RenderableView should not be used directly, please subclass!'); } -}); +} module.exports = { diff --git a/js/src/_base/RendererPool.js b/js/src/_base/RendererPool.js index bc02ec07..6235eaf8 100644 --- a/js/src/_base/RendererPool.js +++ b/js/src/_base/RendererPool.js @@ -15,15 +15,16 @@ function makeRendererClaimToken(renderer, onReclaim) { }; } -function KeyedCollection() { - this._collection = []; -} -_.extend(KeyedCollection.prototype, { - push: function(key, value) { +class KeyedCollection { + constructor() { + this._collection = []; + } + + push(key, value) { this._collection.push({key: key, value: value}); - }, + } - pop: function(key) { + pop(key) { for (var i=0, l=this._collection.length; i < l; ++i) { var el = this._collection[i]; if (_.isEqual(el.key, key)) { @@ -32,20 +33,20 @@ _.extend(KeyedCollection.prototype, { } } return null; - }, + } - shift: function() { + shift() { var el = this._collection.shift(); return el.value; - }, + } - find: function(evaluator) { + find(evaluator) { return _.find(this._collection, function(kv) { return evaluator(kv.value); }); - }, + } - popFind: function(evaluator) { + popFind(evaluator) { for (var i=0, l=this._collection.length; i < l; ++i) { var el = this._collection[i]; if (evaluator(el.value)) { @@ -54,12 +55,12 @@ _.extend(KeyedCollection.prototype, { } } return null; - }, + } - length: function() { + length() { return this._collection.length; - }, -}); + } +} var isWebgl2Available = (function() { var isAvailable; @@ -77,14 +78,14 @@ var isWebgl2Available = (function() { return inner; })(); -function RendererPool() { - this.numCreated = 0; - this.freePool = new KeyedCollection(); - this.claimedPool = new KeyedCollection(); -} -_.extend(RendererPool.prototype, { +class RendererPool { + constructor() { + this.numCreated = 0; + this.freePool = new KeyedCollection(); + this.claimedPool = new KeyedCollection(); + } - _createRenderer: function(config) { + _createRenderer(config) { config = _.extend({}, config); var webglVersion = config.webglVersion; delete config.webglVersion; @@ -96,7 +97,7 @@ _.extend(RendererPool.prototype, { depth: true, stencil: true, premultipliedAlpha: true, - preserveDrawingBuffer: false, + preserveDrawingBuffer: true, powerPreference: 'default' }, config); var context = canvas.getContext('webgl2', config); @@ -104,31 +105,28 @@ _.extend(RendererPool.prototype, { config.context = context; } - var renderer = new THREE.WebGLRenderer( - _.extend({}, - config, - { - // required for converting canvas to png - preserveDrawingBuffer: true - } - )); + var renderer = new THREE.WebGLRenderer({ + ...config, + // required for converting canvas to png + preserveDrawingBuffer: true + }); renderer.setPixelRatio(window.devicePixelRatio || 1); renderer.context.canvas.addEventListener('webglcontextlost', this.onContextLost.bind(this), false); renderer.poolId = this.numCreated; this.numCreated++; return renderer; - }, + } - _replaceRenderer: function(renderer, config) { + _replaceRenderer(renderer, config) { var id = renderer.poolId; renderer.dispose(); this.numCreated--; renderer = this._createRenderer(config); renderer.poolId = id; return renderer; - }, + } - acquire: function(config, onReclaim) { + acquire(config, onReclaim) { var renderer; console.debug('RendererPool.acquiring...'); @@ -180,9 +178,9 @@ _.extend(RendererPool.prototype, { this.claimedPool.push(config, makeRendererClaimToken(renderer, onReclaim)); renderer.clear(); return renderer; - }, + } - release: function(renderer) { + release(renderer) { console.debug('RendererPool.release(id=' + renderer.poolId + ')'); var id = renderer.poolId; @@ -200,9 +198,9 @@ _.extend(RendererPool.prototype, { // notify previous claimant kvPair.value.onReclaim(); - }, + } - onContextLost: function(event) { + onContextLost(event) { // Find the relevant renderer, and remove claim: var kvPair = this.claimedPool.popFind(function(claimToken) { return claimToken.renderer.domElement === event.target; @@ -217,8 +215,8 @@ _.extend(RendererPool.prototype, { // notify previous claimant kvPair.value.onReclaim(); - }, + } -}); +} module.exports = new RendererPool(); diff --git a/js/src/_base/Three.js b/js/src/_base/Three.js index 0e1733c0..859fc88f 100644 --- a/js/src/_base/Three.js +++ b/js/src/_base/Three.js @@ -54,18 +54,18 @@ function listenNested(model, propNames, callback) { return; } if (prev instanceof ThreeModel) { - // Implies curr is array + // Implies curr is array/dict utils.childModelsNested(curr).forEach(function(childModel) { model.listenTo(childModel, 'change', callback); model.listenTo(childModel, 'childchange', callback); }); } else if (curr instanceof ThreeModel) { - // Implies prev is array + // Implies prev is array/dict utils.childModelsNested(prev).forEach(function(childModel) { model.stopListening(childModel); }); } else { - // Both are arrays + // Both are arrays/dicts var diff = utils.nestedDiff(curr, prev); diff.added.forEach(function(childModel) { @@ -81,17 +81,17 @@ function listenNested(model, propNames, callback) { } -var ThreeModel = widgets.WidgetModel.extend({ +class ThreeModel extends widgets.WidgetModel { - defaults: function() { + defaults() { return _.extend(widgets.WidgetModel.prototype.defaults.call(this), { _model_name: this.constructor.model_name, _model_module: this.constructor.model_module, _model_module_version: this.constructor.model_module_version }); - }, + } - initialize: function(attributes, options) { + initialize(attributes, options) { widgets.WidgetModel.prototype.initialize.apply(this, arguments); this.createPropertiesArrays(); @@ -139,9 +139,9 @@ var ThreeModel = widgets.WidgetModel.extend({ }); - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { // initialize properties arrays this.three_properties = []; this.three_nested_properties = []; @@ -154,9 +154,9 @@ var ThreeModel = widgets.WidgetModel.extend({ this.property_mappers = {}; this.initialized_from_three = {}; - }, + } - setupListeners: function() { + setupListeners() { // Handle changes in three instance props this.three_properties.forEach(function(propName) { @@ -193,9 +193,9 @@ var ThreeModel = widgets.WidgetModel.extend({ this.on('msg:custom', this.onCustomMessage, this); this.on('destroy', this.onDestroy, this); - }, + } - processNewObj: function(obj) { + processNewObj(obj) { obj.ipymodelId = this.model_id; // brand that sucker obj.ipymodel = this; @@ -203,9 +203,9 @@ var ThreeModel = widgets.WidgetModel.extend({ this.obj = obj; return obj; - }, + } - createUninitializedChildren: function() { + createUninitializedChildren() { // Get any properties to create from this side var uninit = _.filter(this.three_properties, function(propName) { @@ -224,9 +224,9 @@ var ThreeModel = widgets.WidgetModel.extend({ var modelPromise = utils.createModel(ctor, this.widget_manager, obj); return modelPromise; }, this)); - }, + } - createThreeObjectAsync: function() { + createThreeObjectAsync() { var objPromise; @@ -242,27 +242,27 @@ var ThreeModel = widgets.WidgetModel.extend({ return objPromise.bind(this).then(this.processNewObj); - }, + } // Over-ride this method to customize how THREE object is created - constructThreeObject: function() {}, + constructThreeObject() {} - onDestroy: function() { + onDestroy() { if (this.obj) { if (this.obj.dispose) { this.obj.dispose(); } delete this.obj; } - }, + } // // Remote execution of three.js object methods // - onCustomMessage: function(content, buffers) { + onCustomMessage(content, buffers) { switch(content.type) { case 'exec_three_obj_method': this.onExecThreeObjMethod(content.method_name, content.args, content.buffers); @@ -275,9 +275,9 @@ var ThreeModel = widgets.WidgetModel.extend({ default: console.error('ERROR: invalid custom message', content); } - }, + } - onExecThreeObjMethod: function(methodName, args, buffers) { + onExecThreeObjMethod(methodName, args, buffers) { console.debug('execThreeObjMethod: ' + methodName + '(' + args.map(JSON.stringify).join(',') + ')'); @@ -339,27 +339,27 @@ var ThreeModel = widgets.WidgetModel.extend({ }); - }, + } // // Data-binding methods for syncing between model and three.js object // - onChange: function(model, options) { + onChange(model, options) { if (options !== 'pushFromThree') { this.syncToThreeObj(); // Also sync back out any generated properties: this.syncToModel(); } - }, + } - onChildChanged: function(model) { + onChildChanged(model) { console.debug('child changed: ' + model.model_id); // Propagate up hierarchy: this.trigger('childchange', this); - }, + } - onDataChanged: function(model, options) { + onDataChanged(model, options) { console.debug('child data changed: ' + model.model_id); // Treat a data widget change as if data attribute changed // Note: hasChanged() etc won't identify the attribute, so @@ -367,10 +367,10 @@ var ThreeModel = widgets.WidgetModel.extend({ this.onChange(model, options); // Propagate up hierarchy: this.trigger('childchange', this); - }, + } // push data from model to three object - syncToThreeObj: function(force) { + syncToThreeObj(force) { _.each(this.property_converters, function(converterName, propName) { if (!force && !this.hasChanged(propName)) { @@ -407,10 +407,10 @@ var ThreeModel = widgets.WidgetModel.extend({ mapperFn.bind(this)(); }, this); - }, + } // push data from three object to model - syncToModel: function(syncAllProps) { + syncToModel(syncAllProps) { syncAllProps = syncAllProps === null ? false : syncAllProps; @@ -462,20 +462,20 @@ var ThreeModel = widgets.WidgetModel.extend({ }, this); this.save_changes(); - }, + } // // Conversions // - assignDirect: function(obj, key, value) { + assignDirect(obj, key, value) { obj[key] = value; - }, + } /** * Check if array exists, if so replace content. Otherwise assign value. */ - assignArray: function(obj, key, value) { + assignArray(obj, key, value) { var existing = obj[key]; if (existing !== null && existing !== undefined) { // existing.splice(0, existing.length, ...value); @@ -483,10 +483,10 @@ var ThreeModel = widgets.WidgetModel.extend({ } else { obj[key] = value; } - }, + } // Float - convertFloatModelToThree: function(v) { + convertFloatModelToThree(v) { if (typeof v === 'string' || v instanceof String) { v = v.toLowerCase(); if (v === 'inf') { @@ -498,9 +498,9 @@ var ThreeModel = widgets.WidgetModel.extend({ } } return v; - }, + } - convertFloatThreeToModel: function(v) { + convertFloatThreeToModel(v) { if (isFinite(v)) { // Most common first return v; } else if (isNaN(v)) { @@ -511,30 +511,30 @@ var ThreeModel = widgets.WidgetModel.extend({ return '-inf'; } return v; - }, + } // Bool - convertBoolModelToThree: function(v) { + convertBoolModelToThree(v) { return v; - }, + } - convertBoolThreeToModel: function(v) { + convertBoolThreeToModel(v) { if (v === null) { return null; } // Coerce falsy/truthy: return !!v; - }, + } // Enum - convertEnumModelToThree: function(e) { + convertEnumModelToThree(e) { if (e === null) { return null; } return THREE[e]; - }, + } - convertEnumThreeToModel: function(e, propName) { + convertEnumThreeToModel(e, propName) { if (e === null) { return null; } @@ -542,10 +542,10 @@ var ThreeModel = widgets.WidgetModel.extend({ var enumValues = Enums[enumType]; var enumValueName = enumValues[e]; return enumValueName; - }, + } // Vectors - convertVectorModelToThree: function(v) { + convertVectorModelToThree(v) { var result; switch(v.length) { case 2: result = new THREE.Vector2(); break; @@ -556,57 +556,57 @@ var ThreeModel = widgets.WidgetModel.extend({ } result.fromArray(v); return result; - }, + } - convertVectorThreeToModel: function(v) { + convertVectorThreeToModel(v) { return v.toArray(); - }, + } - assignVector: function(obj, key, value) { + assignVector(obj, key, value) { obj[key].copy(value); - }, + } // Euler - convertEulerModelToThree: function(v) { + convertEulerModelToThree(v) { return new THREE.Euler().fromArray(v); - }, + } - convertEulerThreeToModel: function(v) { + convertEulerThreeToModel(v) { return v.toArray(); - }, + } - assignEuler: function(obj, key, value) { + assignEuler(obj, key, value) { obj[key].copy(value); - }, + } // Vector Array - convertVectorArrayModelToThree: function(varr, propName) { + convertVectorArrayModelToThree(varr, propName) { return varr.map(function(v) { return this.convertVectorModelToThree(v, propName); }, this); - }, + } - convertVectorArrayThreeToModel: function(varr, propName) { + convertVectorArrayThreeToModel(varr, propName) { return varr.map(function(v) { return this.convertVectorThreeToModel(v, propName); }, this); - }, + } // Color Array - convertColorArrayModelToThree: function(carr, propName) { + convertColorArrayModelToThree(carr, propName) { return carr.map(function(c) { return this.convertColorModelToThree(c, propName); }, this); - }, + } - convertColorArrayThreeToModel: function(carr, propName) { + convertColorArrayThreeToModel(carr, propName) { return carr.map(function(c) { return this.convertColorThreeToModel(c, propName); }, this); - }, + } // Faces - convertFaceModelToThree: function(f) { + convertFaceModelToThree(f) { var normal = f[3]; if (normal !== undefined && normal !== null) { if (Array.isArray(normal) && normal.length > 0 && Array.isArray(normal[0])) { @@ -637,9 +637,9 @@ var ThreeModel = widgets.WidgetModel.extend({ ); return result; - }, + } - convertFaceThreeToModel: function(f) { + convertFaceThreeToModel(f) { return [ f.a, f.b, @@ -652,23 +652,23 @@ var ThreeModel = widgets.WidgetModel.extend({ : this.convertColorThreeToModel(f.color), f.materialIndex, ]; - }, + } // Face Array - convertFaceArrayModelToThree: function(farr, propName) { + convertFaceArrayModelToThree(farr, propName) { return farr.map(function(f) { return this.convertFaceModelToThree(f, propName); }, this); - }, + } - convertFaceArrayThreeToModel: function(farr, propName) { + convertFaceArrayThreeToModel(farr, propName) { return farr.map(function(f) { return this.convertFaceThreeToModel(f, propName); }, this); - }, + } // Matrices - convertMatrixModelToThree: function(m) { + convertMatrixModelToThree(m) { var result; switch(m.length) { case 9: result = new THREE.Matrix3(); break; @@ -678,44 +678,44 @@ var ThreeModel = widgets.WidgetModel.extend({ } result.fromArray(m); return result; - }, + } - convertMatrixThreeToModel: function(m) { + convertMatrixThreeToModel(m) { return m.toArray(); - }, + } - assignMatrix: function(obj, key, value) { + assignMatrix(obj, key, value) { obj[key].copy(value); - }, + } // Functions - convertFunctionModelToThree: function(fnStr) { + convertFunctionModelToThree(fnStr) { var fn; eval('fn = ' + fnStr); return fn; - }, + } - convertFunctionThreeToModelToThree: function(fn) { + convertFunctionThreeToModelToThree(fn) { return fn.toString(); - }, + } // ThreeType - convertThreeTypeModelToThree: function(model) { + convertThreeTypeModelToThree(model) { if (model) { return model.obj; } return null; - }, + } - convertThreeTypeThreeToModel: function(threeType) { + convertThreeTypeThreeToModel(threeType) { if (!threeType) { return threeType; } return threeType.ipymodel; - }, + } // Dict - assignDict: function(obj, key, value) { + assignDict(obj, key, value) { if (obj[key] === value) { // If instance equality, do nothing. return; @@ -733,64 +733,64 @@ var ThreeModel = widgets.WidgetModel.extend({ }); // Put in the new values Object.assign(obj[key], value); - }, + } // ThreeTypeArray - convertThreeTypeArrayModelToThree: function(modelArr, propName) { + convertThreeTypeArrayModelToThree(modelArr, propName) { if (!Array.isArray(modelArr)) { return this.convertThreeTypeModelToThree(modelArr, propName); } return modelArr.map(function(model) { return this.convertThreeTypeModelToThree(model, propName); }, this); - }, + } - convertThreeTypeArrayThreeToModel: function(threeTypeArr, propName) { + convertThreeTypeArrayThreeToModel(threeTypeArr, propName) { if (!Array.isArray(threeTypeArr)) { return this.convertThreeTypeThreeToModel(threeTypeArr, propName); } return threeTypeArr.map(function(threeType) { return this.convertThreeTypeThreeToModel(threeType, propName); }, this); - }, + } // ThreeTypeDict - convertThreeTypeDictModelToThree: function(modelDict, propName) { + convertThreeTypeDictModelToThree(modelDict, propName) { return _.mapObject(modelDict, function(model) { return this.convertThreeTypeModelToThree(model, propName); }, this); - }, + } - convertThreeTypeDictThreeToModel: function(threeTypeDict, propName) { + convertThreeTypeDictThreeToModel(threeTypeDict, propName) { return _.mapObject(threeTypeDict, function(threeType) { return this.convertThreeTypeThreeToModel(threeType, propName); }, this); - }, + } // BufferMorphAttributes - convertMorphAttributesModelToThree: function(modelDict, propName) { + convertMorphAttributesModelToThree(modelDict, propName) { return _.mapObject(modelDict, function(arr) { return arr.map(function(model) { return this.convertThreeTypeModelToThree(model, propName); }, this); }, this); - }, + } - convertMorphAttributesThreeToModel: function(threeTypeDict, propName) { + convertMorphAttributesThreeToModel(threeTypeDict, propName) { return _.mapObject(threeTypeDict, function(arr) { return arr.map(function(model) { return this.convertThreeTypeThreeToModel(model, propName); }, this); }, this); - }, + } // ArrayBuffer - convertArrayBufferModelToThree: function(ref, propName) { + convertArrayBufferModelToThree(ref, propName) { var arr = dataserializers.getArray(ref); return arr && arr.data; - }, + } - convertArrayBufferThreeToModel: function(arrBuffer, propName) { + convertArrayBufferThreeToModel(arrBuffer, propName) { if (arrBuffer === null) { return null; } @@ -802,28 +802,28 @@ var ThreeModel = widgets.WidgetModel.extend({ } // Never create a new widget, even if current is one return ndarray(arrBuffer); - }, + } // Color - convertColorModelToThree: function(c) { + convertColorModelToThree(c) { if (c === null) { return null; } return new THREE.Color(c); - }, + } - convertColorThreeToModel: function(c) { + convertColorThreeToModel(c) { if (c === null) { return null; } return '#' + c.getHexString(); - }, + } -}, { - model_module: 'jupyter-threejs', - model_name: 'ThreeModel', - model_module_version: EXTENSION_SPEC_VERSION, -}); +} + +ThreeModel.model_module = 'jupyter-threejs'; +ThreeModel.model_name = 'ThreeModel'; +ThreeModel.model_module_version = EXTENSION_SPEC_VERSION; module.exports = { ThreeModel: ThreeModel, diff --git a/js/src/_base/utils.js b/js/src/_base/utils.js index 8f5583d4..61484d81 100644 --- a/js/src/_base/utils.js +++ b/js/src/_base/utils.js @@ -307,7 +307,7 @@ function dictDiff(newDict, oldDict) { /** * Get the diff of two arbitrarily nested combinations of - * arrays an dicts (hash maps). + * arrays and dicts (hash maps). * * Note: This function assumes the structure of both are the same, * i.e. they both have the same type at the same nesting level. @@ -324,7 +324,7 @@ function nestedDiff(newObj, oldObj) { } else { diff = dictDiff(newObj, oldObj); } - var all = _.flatten([diff.added, diff.removed, diff.kept]); + var all = [...diff.added, ...diff.removed, ...diff.kept]; if (all.length === 0) { return all; } diff --git a/js/src/animation/AnimationAction.js b/js/src/animation/AnimationAction.js index a0578947..9c479ca7 100644 --- a/js/src/animation/AnimationAction.js +++ b/js/src/animation/AnimationAction.js @@ -8,9 +8,9 @@ var THREE = require('three'); var pkgName = require('../../package.json').name; -var AnimationActionModel = AnimationActionAutogen.extend({ +class AnimationActionModel extends AnimationActionAutogen { - defaults: function() { + defaults() { return _.extend( AnimationActionAutogen.prototype.defaults.call(this), widgets.DOMWidgetModel.prototype.defaults.call(this), @@ -18,19 +18,18 @@ var AnimationActionModel = AnimationActionAutogen.extend({ _view_module: pkgName, _view_name: 'AnimationActionView', }); - }, + } - - createPropertiesArrays: function() { + createPropertiesArrays() { AnimationActionAutogen.prototype.createPropertiesArrays.call(this); // Prevent from syncing these to object delete this.property_converters['mixer']; delete this.property_converters['clip']; delete this.property_converters['localRoot']; - }, + } - constructThreeObject: function() { + constructThreeObject() { // Use mixer.clipAction() instead of constructor for cache // (according to THREE docs) var mixer = this.convertThreeTypeModelToThree(this.get('mixer'), 'mixer'); @@ -43,9 +42,9 @@ var AnimationActionModel = AnimationActionAutogen.extend({ rootObj.animations.push(result); this.timer = new THREE.Clock(); return Promise.resolve(result); - }, + } - play: function() { + play() { this.obj.play(); this.timer.start(); this.obj.paused = false; @@ -57,17 +56,17 @@ var AnimationActionModel = AnimationActionAutogen.extend({ } this.animateFrame(); this.syncAnimationState(); - }, + } - syncAnimationState: function() { + syncAnimationState() { var root = this.get('localRoot'); var mixer = this.get('mixer'); root.syncToModel(true); mixer.syncToModel(true); this.syncToModel(true); - }, + } - animateFrame: function() { + animateFrame() { var mixer = this.get('mixer').obj; var delta = this.timer.getDelta(); mixer.update(delta); @@ -77,35 +76,35 @@ var AnimationActionModel = AnimationActionAutogen.extend({ if (scene) { scene.trigger('rerender', this, {}); } - }, + } - pause: function() { + pause() { this.obj.paused = true; this.resetRenderHook(); this.timer.stop(); this.syncAnimationState(); - }, + } - stop: function() { + stop() { this.obj.stop(); this.resetRenderHook(); this.timer.stop(); this.syncAnimationState(); - }, + } - repeat: function() { + repeat() { this.obj.reset(); this.obj.play(); - }, + } - resetRenderHook: function() { + resetRenderHook() { var scene = utils.getModelScene(this.get('localRoot')); if (scene) { this.stopListening(scene, 'afterRender'); } - }, + } - onCustomMessage: function(content, buffers) { + onCustomMessage(content, buffers) { switch(content.type) { case 'play': this.play(); @@ -119,17 +118,19 @@ var AnimationActionModel = AnimationActionAutogen.extend({ default: AnimationActionAutogen.prototype.onCustomMessage.call(arguments); } - }, -}, { - serializers: _.extend({ + } + +} - }, widgets.DOMWidgetModel.serializers, AnimationActionAutogen.serializers), -}); +AnimationActionModel.serializers = { + ...AnimationActionAutogen.serializers, + ...widgets.DOMWidgetModel.serializers, +} -var AnimationActionView = widgets.DOMWidgetView.extend({ +class AnimationActionView extends widgets.DOMWidgetView { - render: function() { + render() { widgets.DOMWidgetView.prototype.render(); this.el.classList.add('jupyter-widgets'); this.el.classList.add('widget-inline-hbox'); @@ -177,18 +178,18 @@ var AnimationActionView = widgets.DOMWidgetView.extend({ this.update_repeat(); this.update(); }); - }, + } - update: function() { + update() { var disabled = !this.model.get('enabled'); this.playButton.disabled = disabled; this.pauseButton.disabled = disabled; this.stopButton.disabled = disabled; this.repeatButton.disabled = disabled; this.update_playing(); - }, + } - update_playing: function() { + update_playing() { var playing = !this.model.get('paused'); var disabled = !this.model.get('enabled'); if (playing) { @@ -202,9 +203,9 @@ var AnimationActionView = widgets.DOMWidgetView.extend({ } this.playButton.classList.remove('mod-active'); } - }, + } - update_repeat: function() { + update_repeat() { // TODO: Add loop/repetition modifiers // LoopOnce/LoopRepeate/LoopPingPong // Zero slope at end @@ -214,8 +215,8 @@ var AnimationActionView = widgets.DOMWidgetView.extend({ } else { this.repeatButton.classList.remove('mod-active'); } - }, -}); + } +} module.exports = { AnimationActionModel: AnimationActionModel, diff --git a/js/src/cameras/CombinedCamera.js b/js/src/cameras/CombinedCamera.js index bcc666c7..319f06a4 100644 --- a/js/src/cameras/CombinedCamera.js +++ b/js/src/cameras/CombinedCamera.js @@ -2,9 +2,9 @@ var Promise = require('bluebird'); var CombinedCamera = require('../examples/cameras/CombinedCamera.js').CombinedCamera; var CombinedCameraAutogen = require('./CombinedCamera.autogen').CombinedCameraModel; -var CombinedCameraModel = CombinedCameraAutogen.extend({ +class CombinedCameraModel extends CombinedCameraAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { CombinedCameraAutogen.prototype.createPropertiesArrays.call(this); this.property_mappers['CombinedCamera'] = 'mapCombinedCamera'; @@ -15,9 +15,9 @@ var CombinedCameraModel = CombinedCameraAutogen.extend({ delete this.property_converters['orthoNear']; delete this.property_converters['orthoFar']; delete this.property_converters['mode']; - }, + } - constructThreeObject: function() { + constructThreeObject() { var result = new CombinedCamera( this.convertFloatModelToThree(this.get('width'), 'width'), @@ -32,9 +32,9 @@ var CombinedCameraModel = CombinedCameraAutogen.extend({ this.get('impersonate'), 'impersonate'); return Promise.resolve(result); - }, + } - mapCombinedCameraModelToThree: function() { + mapCombinedCameraModelToThree() { var width = this.convertFloatModelToThree(this.get('width')); var height = this.convertFloatModelToThree(this.get('height')); @@ -54,9 +54,9 @@ var CombinedCameraModel = CombinedCameraAutogen.extend({ if (this.get('mode') === 'orthographic') { this.obj.toOrthographic(); } - }, + } - mapCombinedCameraThreeToModel: function() { + mapCombinedCameraThreeToModel() { var toSet = {}; toSet.width = this.convertFloatThreeToModel(this.obj.right - this.obj.left); @@ -71,8 +71,8 @@ var CombinedCameraModel = CombinedCameraAutogen.extend({ this.set(toSet, 'pushFromThree'); - }, -}); + } +} module.exports = { CombinedCameraModel: CombinedCameraModel, diff --git a/js/src/cameras/OrthographicCamera.js b/js/src/cameras/OrthographicCamera.js index d062fb77..bf05344f 100644 --- a/js/src/cameras/OrthographicCamera.js +++ b/js/src/cameras/OrthographicCamera.js @@ -1,14 +1,14 @@ var _ = require('underscore'); var OrthographicCameraAutogen = require('./OrthographicCamera.autogen'); -var OrthographicCameraModel = OrthographicCameraAutogen.OrthographicCameraModel.extend({ +class OrthographicCameraModel extends OrthographicCameraAutogen.OrthographicCameraModel { // push data from model to three object - syncToThreeObj: function() { + syncToThreeObj() { OrthographicCameraAutogen.OrthographicCameraModel.prototype.syncToThreeObj.apply(this, arguments); // Always update the projection matrix after setting the attributes: this.obj.updateProjectionMatrix(); } -}); +} module.exports = { OrthographicCameraModel: OrthographicCameraModel, diff --git a/js/src/cameras/PerspectiveCamera.js b/js/src/cameras/PerspectiveCamera.js index da478e64..9c193ce9 100644 --- a/js/src/cameras/PerspectiveCamera.js +++ b/js/src/cameras/PerspectiveCamera.js @@ -1,14 +1,14 @@ var _ = require('underscore'); var PerspectiveCameraAutogen = require('./PerspectiveCamera.autogen'); -var PerspectiveCameraModel = PerspectiveCameraAutogen.PerspectiveCameraModel.extend({ +class PerspectiveCameraModel extends PerspectiveCameraAutogen.PerspectiveCameraModel { // push data from model to three object - syncToThreeObj: function() { + syncToThreeObj() { PerspectiveCameraAutogen.PerspectiveCameraModel.prototype.syncToThreeObj.apply(this, arguments); // Always update the projection matrix after setting the attributes: this.obj.updateProjectionMatrix(); } -}); +} module.exports = { PerspectiveCameraModel: PerspectiveCameraModel, diff --git a/js/src/controls/FlyControls.js b/js/src/controls/FlyControls.js index 8d3f26ae..1feab19d 100644 --- a/js/src/controls/FlyControls.js +++ b/js/src/controls/FlyControls.js @@ -4,9 +4,9 @@ var FlyControls = require('../examples/controls/MomentumCameraControls.js').FlyC var FlyControlsAutogen = require('./FlyControls.autogen'); -var FlyControlsModel = FlyControlsAutogen.FlyControlsModel.extend({ +class FlyControlsModel extends FlyControlsAutogen.FlyControlsModel { - constructThreeObject: function() { + constructThreeObject() { this.clock = new THREE.Clock(); var controlling = this.get('controlling'); this.renderer = null; @@ -15,9 +15,9 @@ var FlyControlsModel = FlyControlsAutogen.FlyControlsModel.extend({ var obj = new FlyControls(controlling.obj); obj.dispose(); // Disconnect events, we need to (dis-)connect on freeze/thaw return obj; - }, + } - setupListeners: function() { + setupListeners() { FlyControlsAutogen.FlyControlsModel.prototype.setupListeners.call(this); var that = this; this.obj.addEventListener('change', function() { @@ -30,31 +30,31 @@ var FlyControlsModel = FlyControlsAutogen.FlyControlsModel.extend({ }); this.on('enableControl', this.onEnable, this); this.on('disableControl', this.onDisable, this); - }, + } - onEnable: function(renderer) { + onEnable(renderer) { this.clock.start(); this.renderer = renderer; this._update(); - }, + } - onDisable: function(renderer) { + onDisable(renderer) { this.clock.stop(); this.renderer = null; - }, + } - allowSync: function() { + allowSync() { this.syncAtWill = true; - }, + } - _update: function() { + _update() { if (this.renderer !== null) { this.obj.update(this.clock.getDelta()); requestAnimationFrame(this._update.bind(this)); } - }, + } - update_controlled: function() { + update_controlled() { var controlling = this.get('controlling'); var pos = controlling.obj.position; var qat = controlling.obj.quaternion; @@ -66,9 +66,9 @@ var FlyControlsModel = FlyControlsAutogen.FlyControlsModel.extend({ 'pushFromThree' ); controlling.save_changes(); - }, + } -}); +} module.exports = { FlyControlsModel: FlyControlsModel, diff --git a/js/src/controls/OrbitControls.js b/js/src/controls/OrbitControls.js index 284c1bda..ee5dd0d0 100644 --- a/js/src/controls/OrbitControls.js +++ b/js/src/controls/OrbitControls.js @@ -3,26 +3,26 @@ var OrbitControls = require('../examples/controls/OrbitControls.js').OrbitContro var OrbitControlsAutogen = require('./OrbitControls.autogen'); -var OrbitControlsModel = OrbitControlsAutogen.OrbitControlsModel.extend({ +class OrbitControlsModel extends OrbitControlsAutogen.OrbitControlsModel { - constructThreeObject: function() { + constructThreeObject() { var controlling = this.get('controlling'); var obj = new OrbitControls(controlling.obj); obj.dispose(); // Disconnect events, we need to (dis-)connect on freeze/thaw obj.enableKeys = false; // turn off keyboard navigation return obj; - }, + } - setupListeners: function() { + setupListeners() { OrbitControlsAutogen.OrbitControlsModel.prototype.setupListeners.call(this); var that = this; this.obj.addEventListener('end', function() { that.update_controlled(); }); - }, + } - update_controlled: function() { + update_controlled() { // Since OrbitControls changes the position of the object, we // update the position when we've stopped moving the object. // It's probably prohibitive to update it in real-time @@ -44,9 +44,9 @@ var OrbitControlsModel = OrbitControlsAutogen.OrbitControlsModel.extend({ target: this.obj.target.toArray(), }, 'pushFromThree'); this.save_changes(); - }, + } -}); +} module.exports = { OrbitControlsModel: OrbitControlsModel, diff --git a/js/src/controls/Picker.js b/js/src/controls/Picker.js index 87db7def..54924de8 100644 --- a/js/src/controls/Picker.js +++ b/js/src/controls/Picker.js @@ -3,37 +3,37 @@ var THREE = require('three'); var PickerAutogen = require('./Picker.autogen'); -var PickerModel = PickerAutogen.PickerModel.extend({ +class PickerModel extends PickerAutogen.PickerModel { - syncToThreeObj: function(force) { - }, + syncToThreeObj(force) { + } - syncToModel: function() { - }, + syncToModel() { + } - constructThreeObject: function() { + constructThreeObject() { this.camera = null; var event = this.get('event'); var obj = new PickerControls(event); return obj; - }, + } - setupListeners: function() { + setupListeners() { PickerAutogen.PickerModel.prototype.setupListeners.call(this); this.obj.addEventListener('pick', this.onPick.bind(this)); this.on('enableControl', this.onEnable, this); this.on('disableControl', this.onDisable, this); - }, + } - onEnable: function(view) { + onEnable(view) { this.camera = view.camera; - }, + } - onDisable: function(view) { + onDisable(view) { this.camera = null; - }, + } - onPick: function() { + onPick() { var mouse = this.obj.pickCoordinates; var objects = pick(mouse, this.camera, this.get('controlling').obj); @@ -47,12 +47,11 @@ var PickerModel = PickerAutogen.PickerModel.extend({ info.modifiers = this.obj.modifiers; this.set(info, 'pushFromThree'); this.save_changes(); - }, -}); + } +} var PickerControls = function(event) { - var changeEvent = { type: 'change' }; var pickEvent = { type: 'pick' }; var scope = this; @@ -70,7 +69,7 @@ var PickerControls = function(event) { scope.element.removeEventListener(event, onEvent, false); }; - function onEvent( event ) { + function onEvent(event) { var el = scope.element; var r = el.getBoundingClientRect(); var offsetX = r.x + window.pageXOffset; @@ -95,7 +94,6 @@ var PickerControls = function(event) { scope.dispatchEvent( pickEvent ); } - }; PickerControls.prototype = Object.create( THREE.EventDispatcher.prototype ); diff --git a/js/src/controls/TrackballControls.js b/js/src/controls/TrackballControls.js index b970dc16..675dc87e 100644 --- a/js/src/controls/TrackballControls.js +++ b/js/src/controls/TrackballControls.js @@ -2,26 +2,26 @@ var _ = require('underscore'); var TrackballControls = require('../examples/controls/TrackballControls.js').TrackballControls; var TrackballControlsAutogen = require('./TrackballControls.autogen'); -var TrackballControlsModel = TrackballControlsAutogen.TrackballControlsModel.extend({ +class TrackballControlsModel extends TrackballControlsAutogen.TrackballControlsModel { - constructThreeObject: function() { + constructThreeObject() { var controlling = this.get('controlling'); var obj = new TrackballControls(controlling.obj); obj.dispose(); // Disconnect events, we need to (dis-)connect on freeze/thaw obj.noKeys = true; // turn off keyboard navigation return obj; - }, + } - setupListeners: function() { + setupListeners() { TrackballControlsAutogen.TrackballControlsModel.prototype.setupListeners.call(this); var that = this; this.obj.addEventListener('end', function() { that.update_controlled(); }); - }, + } - update_controlled: function() { + update_controlled() { // Since TrackballControlsView changes the position of the object, // we update the position when we've stopped moving the object. // It's probably prohibitive to update it in real-time @@ -42,9 +42,9 @@ var TrackballControlsModel = TrackballControlsAutogen.TrackballControlsModel.ext target: this.obj.target.toArray(), }, 'pushFromThree'); this.save_changes(); - }, + } -}); +} module.exports = { TrackballControlsModel: TrackballControlsModel, diff --git a/js/src/core/BufferAttribute.js b/js/src/core/BufferAttribute.js index 700c4e4f..5ffdf8d4 100644 --- a/js/src/core/BufferAttribute.js +++ b/js/src/core/BufferAttribute.js @@ -4,17 +4,17 @@ var ndarray = require('ndarray'); var THREE = require('three'); var BufferAttributeAutogen = require('./BufferAttribute.autogen').BufferAttributeModel; -var BufferAttributeModel = BufferAttributeAutogen.extend({ +class BufferAttributeModel extends BufferAttributeAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { BufferAttributeAutogen.prototype.createPropertiesArrays.call(this); // three.js DataTexture stores the data, width, and height props together in a dict called 'image' this.property_mappers['BufferAttributeArray'] = 'mapBufferAttributeArray'; delete this.property_converters['array']; - }, + } - decodeData: function() { + decodeData() { var rawData = dataserializers.getArray(this.get('array')); var itemSize = rawData.dimension === 1 ? 1 : rawData.shape[rawData.dimension - 1]; @@ -23,9 +23,9 @@ var BufferAttributeModel = BufferAttributeAutogen.extend({ array: data, itemSize: itemSize, }; - }, + } - constructThreeObject: function() { + constructThreeObject() { var data = this.decodeData(); var result = new THREE.BufferAttribute( data.array, @@ -35,16 +35,16 @@ var BufferAttributeModel = BufferAttributeAutogen.extend({ result.needsUpdate = true; return Promise.resolve(result); - }, + } - mapBufferAttributeArrayModelToThree: function() { + mapBufferAttributeArrayModelToThree() { var data = this.decodeData(); this.obj.setArray(data.array); this.obj.needsUpdate = true; this.set({ version: this.obj.version }, 'pushFromThree'); - }, + } - mapBufferAttributeArrayThreeToModel: function() { + mapBufferAttributeArrayThreeToModel() { /* * There are a few different cases to take into account here: * 1. We are during initial setup of a normal creation, with a widget ref @@ -63,16 +63,16 @@ var BufferAttributeModel = BufferAttributeAutogen.extend({ // 3. / 4. this.set('array', ndarray(attributeData, [this.obj.count, this.obj.itemSize])); } - }, + } - onChildChanged: function(model) { + onChildChanged(model) { if (model === this.get('array')) { // We need to update data this.mapBufferAttributeArrayModelToThree(); } - }, + } -}); +} module.exports = { BufferAttributeModel: BufferAttributeModel, diff --git a/js/src/core/BufferGeometry.js b/js/src/core/BufferGeometry.js index d81f80c6..f8638688 100644 --- a/js/src/core/BufferGeometry.js +++ b/js/src/core/BufferGeometry.js @@ -11,14 +11,14 @@ var BaseGeometryModel = require('../core/BaseGeometry.autogen.js').BaseGeometryM var BaseBufferGeometryModel = require('../core/BaseBufferGeometry.autogen.js').BaseBufferGeometryModel; -var BufferGeometryModel = AutogenBufferGeometryModel.extend({ +class BufferGeometryModel extends AutogenBufferGeometryModel { - createPropertiesArrays: function() { + createPropertiesArrays() { AutogenBufferGeometryModel.prototype.createPropertiesArrays.call(this); this.property_assigners['attributes'] = 'assignAttributesMap'; - }, + } - constructFromRef: function(ref, keep_ref) { + constructFromRef(ref, keep_ref) { var result = new THREE.BufferGeometry(); var chain = ref.initPromise.bind(this); @@ -109,9 +109,9 @@ var BufferGeometryModel = AutogenBufferGeometryModel.extend({ return result; }); - }, + } - constructThreeObject: function() { + constructThreeObject() { var ref = this.get('_ref_geometry'); var keep_ref = this.get('_store_ref'); if (ref) { @@ -120,9 +120,9 @@ var BufferGeometryModel = AutogenBufferGeometryModel.extend({ var result = new THREE.BufferGeometry(); return Promise.resolve(result); - }, + } - assignAttributesMap: function(obj, key, value) { + assignAttributesMap(obj, key, value) { var three = obj[key]; var oldKeys = three ? Object.keys(three).sort() : []; @@ -150,9 +150,9 @@ var BufferGeometryModel = AutogenBufferGeometryModel.extend({ console.warn('Cannot reassign buffer geometry attribute:', commonChanged); } - }, + } -}); +} module.exports = { BufferGeometryModel: BufferGeometryModel, diff --git a/js/src/core/Geometry.js b/js/src/core/Geometry.js index 9c6f6354..225b200d 100644 --- a/js/src/core/Geometry.js +++ b/js/src/core/Geometry.js @@ -3,9 +3,9 @@ var THREE = require('three'); var AutogenGeometryModel = require('../core/Geometry.autogen').GeometryModel; -var GeometryModel = AutogenGeometryModel.extend({ +class GeometryModel extends AutogenGeometryModel { - constructThreeObject: function() { + constructThreeObject() { var result = new THREE.Geometry(); @@ -38,9 +38,9 @@ var GeometryModel = AutogenGeometryModel.extend({ return Promise.resolve(result); - }, + } - onChange: function(model, options) { + onChange(model, options) { if (options !== 'pushFromThree') { if (this.hasChanged('vertices')) { this.obj.verticesNeedUpdate = true; @@ -64,7 +64,7 @@ var GeometryModel = AutogenGeometryModel.extend({ AutogenGeometryModel.prototype.onChange.call(this, model, options); } -}); +} module.exports = { GeometryModel: GeometryModel, diff --git a/js/src/core/InstancedBufferGeometry.js b/js/src/core/InstancedBufferGeometry.js index 90d9e17f..fc6933c9 100644 --- a/js/src/core/InstancedBufferGeometry.js +++ b/js/src/core/InstancedBufferGeometry.js @@ -1,30 +1,30 @@ var InstancedBufferGeometryAutogen = require('./InstancedBufferGeometry.autogen').InstancedBufferGeometryModel; -var InstancedBufferGeometryModel = InstancedBufferGeometryAutogen.extend({ +class InstancedBufferGeometryModel extends InstancedBufferGeometryAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { InstancedBufferGeometryAutogen.prototype.createPropertiesArrays.call(this); this.property_converters['maxInstancedCount'] = 'convertNullToUndefined'; - }, + } - convertNullToUndefinedModelToThree: function(v) { + convertNullToUndefinedModelToThree(v) { if (v === null) { return undefined; } return v; - }, + } - convertNullToUndefinedThreeToModel: function(v) { + convertNullToUndefinedThreeToModel(v) { if (v === undefined) { return null; } return v; - }, + } -}); +} module.exports = { InstancedBufferGeometryModel: InstancedBufferGeometryModel, diff --git a/js/src/core/InstancedInterleavedBuffer.js b/js/src/core/InstancedInterleavedBuffer.js index ce5f22b2..7bcfa0e6 100644 --- a/js/src/core/InstancedInterleavedBuffer.js +++ b/js/src/core/InstancedInterleavedBuffer.js @@ -2,9 +2,9 @@ var Promise = require('bluebird'); var THREE = require('three'); var InstancedInterleavedBufferAutogen = require('./InstancedInterleavedBuffer.autogen').InstancedInterleavedBufferModel; -var InstancedInterleavedBufferModel = InstancedInterleavedBufferAutogen.extend({ +class InstancedInterleavedBufferModel extends InstancedInterleavedBufferAutogen { - constructThreeObject: function() { + constructThreeObject() { var data = this.decodeData(); var result = new THREE.InstancedInterleavedBuffer( data.array, @@ -14,9 +14,9 @@ var InstancedInterleavedBufferModel = InstancedInterleavedBufferAutogen.extend({ result.needsUpdate = true; return Promise.resolve(result); - }, + } -}); +} module.exports = { InstancedInterleavedBufferModel: InstancedInterleavedBufferModel, diff --git a/js/src/core/InterleavedBuffer.js b/js/src/core/InterleavedBuffer.js index ec2f287e..6fe724e0 100644 --- a/js/src/core/InterleavedBuffer.js +++ b/js/src/core/InterleavedBuffer.js @@ -4,17 +4,17 @@ var ndarray = require('ndarray'); var THREE = require('three'); var InterleavedBufferAutogen = require('./InterleavedBuffer.autogen').InterleavedBufferModel; -var InterleavedBufferModel = InterleavedBufferAutogen.extend({ +class InterleavedBufferModel extends InterleavedBufferAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { InterleavedBufferAutogen.prototype.createPropertiesArrays.call(this); // three.js DataTexture stores the data, width, and height props together in a dict called 'image' this.property_mappers['InterleavedBufferArray'] = 'mapInterleavedBufferArray'; delete this.property_converters['array']; - }, + } - decodeData: function() { + decodeData() { var rawData = dataserializers.getArray(this.get('array')); var itemSize = rawData.dimension === 1 ? 1 : rawData.shape[rawData.dimension - 1]; @@ -23,9 +23,9 @@ var InterleavedBufferModel = InterleavedBufferAutogen.extend({ array: data, itemSize: itemSize, }; - }, + } - constructThreeObject: function() { + constructThreeObject() { var data = this.decodeData(); var result = new THREE.InterleavedBuffer( data.array, @@ -34,16 +34,16 @@ var InterleavedBufferModel = InterleavedBufferAutogen.extend({ result.needsUpdate = true; return Promise.resolve(result); - }, + } - mapInterleavedBufferArrayModelToThree: function() { + mapInterleavedBufferArrayModelToThree() { var data = this.decodeData(); this.obj.setArray(data.array); this.obj.needsUpdate = true; this.set({ version: this.obj.version }, 'pushFromThree'); - }, + } - mapInterleavedBufferArrayThreeToModel: function() { + mapInterleavedBufferArrayThreeToModel() { /* * There are a few different cases to take into account here: * 1. We are during initial setup of a normal creation, with a widget ref @@ -62,16 +62,16 @@ var InterleavedBufferModel = InterleavedBufferAutogen.extend({ // 3. / 4. this.set('array', ndarray(attributeData, [this.obj.count, this.obj.itemSize])); } - }, + } - onChildChanged: function(model) { + onChildChanged(model) { if (model === this.get('array')) { // We need to update data this.mapInterleavedBufferArrayModelToThree(); } - }, + } -}); +} module.exports = { InterleavedBufferModel: InterleavedBufferModel, diff --git a/js/src/core/Object3D.js b/js/src/core/Object3D.js index 362b6429..b453e95f 100644 --- a/js/src/core/Object3D.js +++ b/js/src/core/Object3D.js @@ -1,20 +1,20 @@ var _ = require('underscore'); var Object3DAutogen = require('./Object3D.autogen').Object3DModel; -var Object3DModel = Object3DAutogen.extend({ +class Object3DModel extends Object3DAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { Object3DAutogen.prototype.createPropertiesArrays.call(this); this.property_assigners['children'] = 'assignChildren'; - + _.each(['position', 'quaternion', 'rotation', 'scale'], function(key) { delete this.property_converters[key]; delete this.property_assigners[key]; }, this); - }, + } - assignChildren: function(obj, key, value) { + assignChildren(obj, key, value) { var old = obj[key]; var removed = _.difference(old, value); var added = _.difference(value, old); @@ -24,9 +24,9 @@ var Object3DModel = Object3DAutogen.extend({ if (added.length > 0) { obj.add.apply(obj, added); } - }, + } - syncToThreeObj: function(force) { + syncToThreeObj(force) { var matrixChanged; if (force) { matrixChanged = !_.isEqual(this.obj.matrix.elements, this.get('matrix')); @@ -50,25 +50,25 @@ var Object3DModel = Object3DAutogen.extend({ this.syncMatrixDependentsToModel(!matrixChanged); this.save_changes(); } - }, + } - syncToModel: function(syncAllProps) { + syncToModel(syncAllProps) { if (syncAllProps) { this.syncMatrixDependentsToModel(true); } Object3DAutogen.prototype.syncToModel.call(this, syncAllProps); - }, + } - changedDeps: function(force) { + changedDeps(force) { return _.filter(['position', 'quaternion', 'rotation', 'scale'], function(key) { if (force) { return !_.isEqual(this.obj[key].toArray(), this.get(key)); } return this.hasChanged(key); }, this); - }, + } - syncMatrixDependentsToThree: function(changedDeps) { + syncMatrixDependentsToThree(changedDeps) { if (changedDeps.indexOf('rotation') !== -1) { this.assignEuler(this.obj, 'rotation', this.convertEulerModelToThree(this.get('rotation'), 'rotation') @@ -83,9 +83,9 @@ var Object3DModel = Object3DAutogen.extend({ this.convertVectorModelToThree(this.get(key), key) ); }, this); - }, + } - syncMatrixDependentsToModel: function(includeMatrix) { + syncMatrixDependentsToModel(includeMatrix) { var toSet = { position: this.convertVectorThreeToModel(this.obj.position, 'position'), quaternion: this.convertVectorThreeToModel(this.obj.quaternion, 'quaternion'), @@ -102,9 +102,9 @@ var Object3DModel = Object3DAutogen.extend({ }, this); } this.set(toSet, 'pushFromThree'); - }, + } -}); +} module.exports = { Object3DModel: Object3DModel, diff --git a/js/src/core/Renderer.js b/js/src/core/Renderer.js index 70142e22..5b1b0872 100644 --- a/js/src/core/Renderer.js +++ b/js/src/core/Renderer.js @@ -10,9 +10,9 @@ var RenderableView = require('../_base/Renderable').RenderableView; var ThreeModel = require('../_base/Three').ThreeModel; var unpackThreeModel = require('../_base/serializers').unpackThreeModel; -var RendererModel = RenderableModel.extend({ +class RendererModel extends RenderableModel { - defaults: function() { + defaults() { return _.extend(RenderableModel.prototype.defaults.call(this), { _view_name: 'RendererView', @@ -28,17 +28,17 @@ var RendererModel = RenderableModel.extend({ background: 'black', background_opacity: 1.0, }); - }, + } - initialize: function(attributes, options) { + initialize(attributes, options) { RenderableModel.prototype.initialize.apply(this, arguments); this.initPromise = this.get('scene').initPromise.bind(this).then(function() { this.setupListeners(); }); - }, + } - setupListeners: function() { + setupListeners() { var scene = this.get('scene'); var camera = this.get('camera'); @@ -47,38 +47,36 @@ var RendererModel = RenderableModel.extend({ this.listenTo(scene, 'rerender', this.onChildChanged.bind(this)); this.listenTo(camera, 'change', this.onCameraChange.bind(this)); - }, + } - onCameraChange: function(model, options) { + onCameraChange(model, options) { this.onChildChanged(model, options); - }, + } - onChildChanged: function(model, options) { + onChildChanged(model, options) { RenderableModel.prototype.onChildChanged.apply(this, arguments); if (!this.get('_pause_autorender')) { this.trigger('rerender', this, {}); } - }, + } -}, { - - serializers: _.extend({ + static serializers = { + ...RenderableModel.serializers, scene: { deserialize: unpackThreeModel }, camera: { deserialize: unpackThreeModel }, controls: { deserialize: unpackThreeModel }, effect: { deserialize: unpackThreeModel }, - }, RenderableModel.serializers), - -}); + } +} -var RendererView = RenderableView.extend({ +class RendererView extends RenderableView { - render: function() { + render() { // ensure that model is fully initialized before attempting render return this.model.initPromise.bind(this).then(this.doRender); - }, + } - lazyRendererSetup: function() { + lazyRendererSetup() { this.scene = this.model.get('scene').obj; this.camera = this.model.get('camera').obj; var controls = []; @@ -90,9 +88,9 @@ var RendererView = RenderableView.extend({ this.enableControls(); } this.renderScene(); - }, + } - setupEventListeners: function() { + setupEventListeners() { RenderableView.prototype.setupEventListeners.call(this); this.listenTo(this.model, 'change:camera', this.onCameraSwitched.bind(this)); @@ -114,17 +112,17 @@ var RendererView = RenderableView.extend({ } this.listenTo(this.model, 'change', wrap); this.listenTo(this.model.get('shadowMap'), 'change', wrap); - }, + } - onCameraSwitched: function() { + onCameraSwitched() { this.camera = this.model.get('camera').obj; - }, + } - onSceneSwitched: function() { + onSceneSwitched() { this.scene = this.model.get('scene').obj; - }, + } - onControlsSwitched: function() { + onControlsSwitched() { if (!this.isFrozen) { this.disableControls(); } @@ -138,45 +136,45 @@ var RendererView = RenderableView.extend({ if (!this.isFrozen) { this.enableControls(); } - }, + } - enableControls: function() { + enableControls() { RenderableView.prototype.enableControls.apply(this, arguments); this.model.get('controls').forEach(function (controlModel) { controlModel.trigger('enableControl', this); }, this); - }, + } - disableControls: function() { + disableControls() { RenderableView.prototype.disableControls.apply(this, arguments); this.model.get('controls').forEach(function (controlModel) { controlModel.trigger('disableControl', this); }, this); - }, + } - applyBackground: function() { + applyBackground() { if (!this.isFrozen) { var background = ThreeModel.prototype.convertColorModelToThree(this.model.get('background')); var background_opacity = ThreeModel.prototype.convertFloatModelToThree(this.model.get('background_opacity')); this.renderer.setClearColor(background, background_opacity); } - }, + } - update: function() { + update() { if (!this.model.get('_pause_autorender')) { this.tick(); } - }, + } - acquireRenderer: function() { + acquireRenderer() { RenderableView.prototype.acquireRenderer.call(this); // We need to ensure that renderer properties are applied // (we have no idea where the renderer has been...) this.updateProperties(true); - }, + } -}); +} module.exports = { RendererView: RendererView, diff --git a/js/src/examples/.eslintrc.js b/js/src/examples/.eslintrc.js index 0399c4eb..4af609b6 100644 --- a/js/src/examples/.eslintrc.js +++ b/js/src/examples/.eslintrc.js @@ -2,7 +2,7 @@ module.exports = { "env": { "browser": true, "commonjs": true - }, + } "extends": "eslint:recommended", "rules": { "indent": [ diff --git a/js/src/extension.js b/js/src/extension.js index ffcc2e3b..61cf2599 100644 --- a/js/src/extension.js +++ b/js/src/extension.js @@ -22,5 +22,5 @@ if (window.requirejs) { // Export the required load_ipython_extention module.exports = { - load_ipython_extension: function() {} + load_ipython_extension() {} }; diff --git a/js/src/geometries/EdgesGeometry.js b/js/src/geometries/EdgesGeometry.js index 6552befc..5979f953 100644 --- a/js/src/geometries/EdgesGeometry.js +++ b/js/src/geometries/EdgesGeometry.js @@ -1,23 +1,23 @@ var EdgesGeometryAutogen = require('./EdgesGeometry.autogen').EdgesGeometryModel; -var EdgesGeometryModel = EdgesGeometryAutogen.extend({ +class EdgesGeometryModel extends EdgesGeometryAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { EdgesGeometryAutogen.prototype.createPropertiesArrays.call(this); // three.js DataTexture stores the data, width, and height props together in a dict called 'image' this.property_mappers['EdgesGeometryProps'] = 'mapEdgesGeometryProps'; delete this.property_converters['geometry']; delete this.property_converters['thresholdAngle']; - }, + } - mapEdgesGeometryPropsModelToThree: function() { + mapEdgesGeometryPropsModelToThree() { var params = this.obj.parameters; params['geometry'] = this.convertThreeTypeModelToThree(this.get('geometry')); params['thresholdAngle'] = this.convertFloatModelToThree(this.get('thresholdAngle')); - }, + } - mapEdgesGeometryPropsThreeToModel: function() { + mapEdgesGeometryPropsThreeToModel() { var params = this.obj.parameters; var toSet = { thresholdAngle: this.convertFloatThreeToModel(params.thresholdAngle), @@ -28,9 +28,9 @@ var EdgesGeometryModel = EdgesGeometryAutogen.extend({ toSet.geometry = this.get('geometry'); } this.set(toSet, 'pushFromThree'); - }, + } -}); +} module.exports = { EdgesGeometryModel: EdgesGeometryModel, diff --git a/js/src/geometries/LineGeometry.js b/js/src/geometries/LineGeometry.js index 607888cc..e2b9b8b1 100644 --- a/js/src/geometries/LineGeometry.js +++ b/js/src/geometries/LineGeometry.js @@ -5,17 +5,17 @@ var LineGeometryAutogen = require('./LineGeometry.autogen'); var utils = require('../_base/utils'); -var LineGeometryModel = LineGeometryAutogen.LineGeometryModel.extend({ +class LineGeometryModel extends LineGeometryAutogen.LineGeometryModel { - constructThreeObject: function() { + constructThreeObject() { var result = new LineGeometry(); return Promise.resolve(result); - }, + } -}); +} utils.customModelsLut[LineGeometry.prototype.constructor.name] = 'LineGeometry'; diff --git a/js/src/geometries/LineSegmentsGeometry.js b/js/src/geometries/LineSegmentsGeometry.js index 42beef3c..3fdb7105 100644 --- a/js/src/geometries/LineSegmentsGeometry.js +++ b/js/src/geometries/LineSegmentsGeometry.js @@ -7,25 +7,25 @@ var LineSegmentsGeometryAutogen = require('./LineSegmentsGeometry.autogen').Line var utils = require('../_base/utils'); -var LineSegmentsGeometryModel = LineSegmentsGeometryAutogen.extend({ +class LineSegmentsGeometryModel extends LineSegmentsGeometryAutogen { - constructThreeObject: function() { + constructThreeObject() { var result = new LineSegmentsGeometry(); return Promise.resolve(result); - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { LineSegmentsGeometryAutogen.prototype.createPropertiesArrays.call(this); this.property_assigners['positions'] = 'assignLineAttribute'; this.property_assigners['colors'] = 'assignLineAttribute'; - }, + } - assignLineAttribute: function(obj, key, value) { + assignLineAttribute(obj, key, value) { if (key === 'positions') { obj.setPositions(value || []); } else if (key === 'colors') { @@ -35,14 +35,14 @@ var LineSegmentsGeometryModel = LineSegmentsGeometryAutogen.extend({ } else { throw new Error(`Unknown line attribute key: ${key}`); } - }, + } - convertArrayBufferThreeToModel: function(arrBuffer, propName) { + convertArrayBufferThreeToModel(arrBuffer, propName) { // This property is write-only, so always return current value. return this.get(propName); - }, + } -}); +} utils.customModelsLut[LineSegmentsGeometry.prototype.constructor.name] = 'LineSegmentsGeometry'; diff --git a/js/src/helpers/ArrowHelper.js b/js/src/helpers/ArrowHelper.js index 97c3bb08..d7bc680b 100644 --- a/js/src/helpers/ArrowHelper.js +++ b/js/src/helpers/ArrowHelper.js @@ -2,9 +2,9 @@ var ArrowHelperAutogen = require('./ArrowHelper.autogen').ArrowHelperModel; var THREE = require('three'); -var ArrowHelperModel = ArrowHelperAutogen.extend({ +class ArrowHelperModel extends ArrowHelperAutogen { - constructThreeObject: function() { + constructThreeObject() { var headLength = this.get('headLength'); var headWidth = this.get('headWidth'); @@ -26,10 +26,10 @@ var ArrowHelperModel = ArrowHelperAutogen.extend({ ); return Promise.resolve(result); - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { ArrowHelperAutogen.prototype.createPropertiesArrays.call(this); // Prevent from syncing these to object @@ -47,9 +47,9 @@ var ArrowHelperModel = ArrowHelperAutogen.extend({ delete this.property_converters['headWidth']; this.property_mappers['mapArrowHelper'] = 'mapArrowHelper'; - }, + } - mapArrowHelperModelToThree: function() { + mapArrowHelperModelToThree() { var headLength = this.get('headLength'); var headWidth = this.get('headWidth'); @@ -69,9 +69,9 @@ var ArrowHelperModel = ArrowHelperAutogen.extend({ this.convertFloatModelToThree(headLength, 'headLength'), this.convertFloatModelToThree(headWidth, 'headWidth') ); - }, + } - mapArrowHelperThreeToModel: function() { + mapArrowHelperThreeToModel() { this.set({ headLength: this.convertFloatThreeToModel(this.obj.cone.scale.y, 'headLength'), headWidth: this.convertFloatThreeToModel(this.obj.cone.scale.x, 'headWidth'), @@ -79,7 +79,7 @@ var ArrowHelperModel = ArrowHelperAutogen.extend({ }); } -}); +} module.exports = { ArrowHelperModel: ArrowHelperModel, diff --git a/js/src/jupyterlab-plugin.js b/js/src/jupyterlab-plugin.js index 35d546cf..9545ec87 100644 --- a/js/src/jupyterlab-plugin.js +++ b/js/src/jupyterlab-plugin.js @@ -4,7 +4,7 @@ var version = require('./version'); module.exports = { id: 'jupyter.extensions.jupyter-threejs', requires: [base.IJupyterWidgetRegistry], - activate: function(app, widgets) { + activate: (app, widgets) => { widgets.registerWidget({ name: 'jupyter-threejs', version: version.version, diff --git a/js/src/lights/LightShadow.js b/js/src/lights/LightShadow.js index 981a7cc3..c0ecdcbb 100644 --- a/js/src/lights/LightShadow.js +++ b/js/src/lights/LightShadow.js @@ -1,9 +1,9 @@ var _ = require('underscore'); var LightShadowAutogen = require('./LightShadow.autogen').LightShadowModel; -var LightShadowModel = LightShadowAutogen.extend({ +class LightShadowModel extends LightShadowAutogen { - syncToThreeObj: function(force) { + syncToThreeObj(force) { if (force || this.hasChanged('mapSize')) { // The map needs to be recreated! this.obj.map = null; @@ -11,7 +11,7 @@ var LightShadowModel = LightShadowAutogen.extend({ LightShadowAutogen.prototype.syncToThreeObj.apply(this, arguments); } -}); +} module.exports = { LightShadowModel: LightShadowModel, diff --git a/js/src/materials/LineMaterial.js b/js/src/materials/LineMaterial.js index accd0557..346f4cfa 100644 --- a/js/src/materials/LineMaterial.js +++ b/js/src/materials/LineMaterial.js @@ -5,9 +5,9 @@ var LineMaterialAutogen = require('./LineMaterial.autogen').LineMaterialModel; var utils = require('../_base/utils'); -var LineMaterialModel = LineMaterialAutogen.extend({ +class LineMaterialModel extends LineMaterialAutogen { - constructThreeObject: function() { + constructThreeObject() { var result = new LineMaterial({ color: this.convertColorModelToThree(this.get('color'), 'color'), @@ -19,9 +19,9 @@ var LineMaterialModel = LineMaterialAutogen.extend({ }); return Promise.resolve(result); - }, + } -}); +} utils.customModelsLut[LineMaterial.prototype.constructor.name] = 'LineMaterial'; diff --git a/js/src/materials/Material.js b/js/src/materials/Material.js index 6467b732..3ace6c6f 100644 --- a/js/src/materials/Material.js +++ b/js/src/materials/Material.js @@ -1,8 +1,8 @@ var MaterialAutogen = require('./Material.autogen').MaterialModel; -var MaterialModel = MaterialAutogen.extend({ +class MaterialModel extends MaterialAutogen { - onCustomMessage: function(content, buffers) { + onCustomMessage(content, buffers) { switch(content.type) { case 'needsUpdate': this.obj.needsUpdate = true; @@ -11,9 +11,9 @@ var MaterialModel = MaterialAutogen.extend({ default: MaterialAutogen.prototype.onCustomMessage.call(arguments); } - }, + } -}); +} module.exports = { MaterialModel: MaterialModel, diff --git a/js/src/objects/Blackbox.js b/js/src/objects/Blackbox.js index 8eb0d663..0241f52d 100644 --- a/js/src/objects/Blackbox.js +++ b/js/src/objects/Blackbox.js @@ -22,23 +22,23 @@ var BlackboxAutogen = require('./Blackbox.autogen').BlackboxModel; * - If you do not want a basic Object3D as the "root" of your black * box, you need to override constructThreeObject[Async]. */ -var BlackboxModel = BlackboxAutogen.extend({ +class BlackboxModel extends BlackboxAutogen { - defaults: function() { + defaults() { var superdef = BlackboxAutogen.prototype.defaults.call(this); delete superdef['children']; return superdef; - }, + } - constructThreeObject: function() { + constructThreeObject() { var result = new THREE.Object3D(); return Promise.resolve(result); - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { BlackboxAutogen.prototype.createPropertiesArrays.call(this); delete this.three_nested_properties['children']; @@ -46,7 +46,7 @@ var BlackboxModel = BlackboxAutogen.extend({ } -}); +} module.exports = { BlackboxModel: BlackboxModel, diff --git a/js/src/objects/CloneArray.js b/js/src/objects/CloneArray.js index 7510d7b0..947d281c 100644 --- a/js/src/objects/CloneArray.js +++ b/js/src/objects/CloneArray.js @@ -5,30 +5,26 @@ var CloneArrayAutogen = require('./CloneArray.autogen').CloneArrayModel; var utils = require('../_base/utils'); -function ThreeCloneArray(original, positions, merge) { - THREE.Object3D.call(this); +class ThreeCloneArray extends THREE.Object3D { + constructor(original, positions, merge) { + THREE.Object3D.call(this); - this.original = original; - this.positions = positions; - this.merge = merge; + this.original = original; + this.positions = positions; + this.merge = merge; - this.build(); -} - - -ThreeCloneArray.prototype = Object.assign(Object.create(THREE.Object3D.prototype), { - - constructor: ThreeCloneArray, + this.build(); + } - clear: function() { + clear() { - }, + } - isComplete: function() { + isComplete() { return !!this.original && !!this.positions; - }, + } - build: function() { + build() { if (this.children) { this.clear(); } @@ -101,14 +97,14 @@ ThreeCloneArray.prototype = Object.assign(Object.create(THREE.Object3D.prototype }, this); } - }, + } -} ); +} -var CloneArrayModel = CloneArrayAutogen.extend({ +class CloneArrayModel extends CloneArrayAutogen { - constructThreeObject: function() { + constructThreeObject() { var result = new ThreeCloneArray( this.convertThreeTypeModelToThree(this.get('original'), 'original'), @@ -117,10 +113,10 @@ var CloneArrayModel = CloneArrayAutogen.extend({ ); return Promise.resolve(result); - }, + } // push data from model to three object - syncToThreeObj: function(force) { + syncToThreeObj(force) { this._needs_rebuild = false; CloneArrayAutogen.prototype.syncToThreeObj.apply(this, arguments); @@ -128,9 +124,9 @@ var CloneArrayModel = CloneArrayAutogen.extend({ this.obj.build(); } - }, + } - createPropertiesArrays: function() { + createPropertiesArrays() { CloneArrayAutogen.prototype.createPropertiesArrays.call(this); @@ -138,9 +134,9 @@ var CloneArrayModel = CloneArrayAutogen.extend({ this.property_assigners['positions'] = 'rebuildAssigner'; this.property_assigners['merge'] = 'rebuildAssigner'; - }, + } - rebuildAssigner: function(obj, key, value) { + rebuildAssigner(obj, key, value) { if (key === 'positions') { this.assignArray(obj, key, value); } else { @@ -149,7 +145,7 @@ var CloneArrayModel = CloneArrayAutogen.extend({ this._needs_rebuild = true; } -}); +} utils.customModelsLut[ThreeCloneArray.prototype.constructor.name] = 'CloneArray'; diff --git a/js/src/objects/Line2.js b/js/src/objects/Line2.js index c4fd5cfd..c28c1f17 100644 --- a/js/src/objects/Line2.js +++ b/js/src/objects/Line2.js @@ -2,9 +2,9 @@ var Promise = require('bluebird'); var Line2 = require('../examples/lines/Line2.js').Line2; var Line2Autogen = require('./Line2.autogen').Line2Model; -var Line2Model = Line2Autogen.extend({ +class Line2Model extends Line2Autogen { - constructThreeObject: function() { + constructThreeObject() { var result = new Line2( this.convertThreeTypeModelToThree(this.get('geometry'), 'geometry'), @@ -12,9 +12,9 @@ var Line2Model = Line2Autogen.extend({ ); return Promise.resolve(result); - }, + } -}); +} module.exports = { Line2Model: Line2Model, diff --git a/js/src/objects/LineSegments2.js b/js/src/objects/LineSegments2.js index a601334b..1be8f28e 100644 --- a/js/src/objects/LineSegments2.js +++ b/js/src/objects/LineSegments2.js @@ -2,9 +2,9 @@ var Promise = require('bluebird'); var LineSegments2 = require('../examples/lines/LineSegments2.js').LineSegments2; var LineSegments2Autogen = require('./LineSegments2.autogen').LineSegments2Model; -var LineSegments2Model = LineSegments2Autogen.extend({ +class LineSegments2Model extends LineSegments2Autogen { - constructThreeObject: function() { + constructThreeObject() { var result = new LineSegments2( this.convertThreeTypeModelToThree(this.get('geometry'), 'geometry'), @@ -12,9 +12,9 @@ var LineSegments2Model = LineSegments2Autogen.extend({ ); return Promise.resolve(result); - }, + } -}); +} module.exports = { LineSegments2Model: LineSegments2Model, diff --git a/js/src/objects/Mesh.js b/js/src/objects/Mesh.js index 79f461c5..b3928f8e 100644 --- a/js/src/objects/Mesh.js +++ b/js/src/objects/Mesh.js @@ -3,19 +3,21 @@ var MeshAutogen = require('./Mesh.autogen').MeshModel; var optionalArraySerializer = { - serialize: function(value, manager) { + serialize(value, manager) { if (value === undefined) { return []; } } }; -var MeshModel = MeshAutogen.extend({ -}, { - serializers: _.extend({ - morphTargetInfluences: optionalArraySerializer, - }, MeshAutogen.serializers), -}); +class MeshModel extends MeshAutogen { +} + + +MeshModel.serializers = { + ...MeshAutogen.serializers, + morphTargetInfluences: optionalArraySerializer, +} module.exports = { MeshModel: MeshModel, diff --git a/js/src/objects/SkinnedMesh.js b/js/src/objects/SkinnedMesh.js index 9b7f5d6c..77c8b284 100644 --- a/js/src/objects/SkinnedMesh.js +++ b/js/src/objects/SkinnedMesh.js @@ -1,21 +1,21 @@ var SkinnedMeshAutogen = require('./SkinnedMesh.autogen').SkinnedMeshModel; -var SkinnedMeshModel = SkinnedMeshAutogen.extend({ +class SkinnedMeshModel extends SkinnedMeshAutogen { - createPropertiesArrays: function() { + createPropertiesArrays() { SkinnedMeshAutogen.prototype.createPropertiesArrays.call(this); this.property_assigners['skeleton'] = 'assignSkeleton'; - }, + } - assignSkeleton: function(obj, key, value) { + assignSkeleton(obj, key, value) { if (value) { obj.bind(value); obj.scale.multiplyScalar(1); } } -}); +} module.exports = { SkinnedMeshModel: SkinnedMeshModel, diff --git a/js/src/renderers/WebGLRenderer.js b/js/src/renderers/WebGLRenderer.js index 3e390ea4..ab575224 100644 --- a/js/src/renderers/WebGLRenderer.js +++ b/js/src/renderers/WebGLRenderer.js @@ -11,60 +11,63 @@ var RenderableView = require('../_base/Renderable').RenderableView; var unpackThreeModel = require('../_base/serializers').unpackThreeModel; -var WebGLRendererModel = RenderableModel.extend({ +class WebGLRendererModel extends RenderableModel { - defaults: _.extend({}, RenderableModel.prototype.defaults, { + defaults() { + return _.extend({}, RenderableModel.prototype.defaults, { _view_name: 'WebGLRendererView', _model_name: 'WebGLRendererModel', width: 200, height: 200, - }), + }); + } -}, { - serializers: _.extend({ - clippingPlanes: { deserialize: unpackThreeModel }, - }, RenderableModel.serializers) -}); +} +WebGLRendererModel.serializers = { + ...RenderableModel.serializers, + clippingPlanes: { deserialize: unpackThreeModel }, +} -var WebGLRendererView = RenderableView.extend({ + +class WebGLRendererView extends RenderableView { // // Backbone methods // - lazyRendererSetup: function() { + lazyRendererSetup() { // Only do setup when widget is being shown // i.e. everything except renderScene - }, + } - objFromCommWidgetId: function(commWidgetId) { + objFromCommWidgetId(commWidgetId) { var modelPromise = unpackThreeModel( commWidgetId, this.model.widget_manager); return modelPromise.then(function(model) { return model.obj; }); - }, + } - log: function(str) { + log(str) { console.log('WGLR(' + this.id + '): ' + str); - }, + } - acquireRenderer: function() { + acquireRenderer() { RenderableView.prototype.acquireRenderer.call(this); // We need to ensure that renderer properties are applied // (we have no idea where the renderer has been...) this.updateProperties(); - }, + } // // Handlers // - onCustomMessage: function(content, buffers) { + onCustomMessage(content, buffers) { switch(content.type) { case 'render': @@ -80,9 +83,9 @@ var WebGLRendererView = RenderableView.extend({ return RenderableView.prototype.onCustomMessage.apply(this, arguments); } - }, + } -}); +} module.exports = { diff --git a/js/src/renderers/webgl/WebGLShadowMap.js b/js/src/renderers/webgl/WebGLShadowMap.js index efc9b85d..1db87793 100644 --- a/js/src/renderers/webgl/WebGLShadowMap.js +++ b/js/src/renderers/webgl/WebGLShadowMap.js @@ -10,26 +10,26 @@ var WebGLShadowMapAutogenModel = require('./WebGLShadowMap.autogen').WebGLShadow * depending on how many views there are. Much of the sync logic is therefore * put in the `Renderable` class instead. */ -var WebGLShadowMapModel = WebGLShadowMapAutogenModel.extend({ +class WebGLShadowMapModel extends WebGLShadowMapAutogenModel { - constructThreeObject: function() { + constructThreeObject() { // This should never be instantiated directly return Promise.resolve(null); - }, + } - processNewObj: function() { + processNewObj() { // Leave this to Renderable - }, + } - syncToThreeObj: function(force) { + syncToThreeObj(force) { // Leave this to Renderable - }, + } - synToModel: function(syncAllProps) { + synToModel(syncAllProps) { // Leave this to Renderable - }, + } -}); +} module.exports = { WebGLShadowMapModel: WebGLShadowMapModel, diff --git a/js/src/textures/DataTexture.js b/js/src/textures/DataTexture.js index 3376fbf9..473bda49 100644 --- a/js/src/textures/DataTexture.js +++ b/js/src/textures/DataTexture.js @@ -5,17 +5,17 @@ var ndarray = require('ndarray'); var THREE = require('three'); var DataTextureBase = require('./DataTexture.autogen').DataTextureModel; -var DataTextureModel = DataTextureBase.extend({ +class DataTextureModel extends DataTextureBase { - createPropertiesArrays: function() { + createPropertiesArrays() { DataTextureBase.prototype.createPropertiesArrays.call(this); // three.js DataTexture stores the data, width, and height props together in a dict called 'image' this.property_mappers['DataTextureData'] = 'mapDataTextureData'; delete this.property_converters['data']; - }, + } - decodeData: function() { + decodeData() { var rawData = dataserializers.getArray(this.get('data')); if (rawData.dimension < 2 || rawData.dimension > 3) { throw Error('DataTexture data dimensions need to be 2 or 3, got:', rawData.dimension); @@ -28,9 +28,9 @@ var DataTextureModel = DataTextureBase.extend({ width: rawData.shape[1], height: rawData.shape[0], }; - }, + } - constructThreeObject: function() { + constructThreeObject() { var data = this.decodeData(); // Make a copy of buffer @@ -53,10 +53,10 @@ var DataTextureModel = DataTextureBase.extend({ result.needsUpdate = true; return Promise.resolve(result); - }, + } - mapDataTextureDataModelToThree: function() { + mapDataTextureDataModelToThree() { var imageRecord = this.obj.image; var data = this.decodeData(); if (imageRecord.width !== data.width || @@ -67,9 +67,9 @@ var DataTextureModel = DataTextureBase.extend({ this.obj.image.data.set(data.data); this.obj.needsUpdate = true; this.set({ version: this.obj.version }, 'pushFromThree'); - }, + } - mapDataTextureDataThreeToModel: function() { + mapDataTextureDataThreeToModel() { var imageRecord = this.obj.image; var modelNDArray = this.get('data'); if (modelNDArray) { @@ -82,13 +82,15 @@ var DataTextureModel = DataTextureBase.extend({ [imageRecord.height, imageRecord.width] )); } - }, + } -}, { - serializers: _.extend({ - data: dataserializers.data_union_serialization, - }, DataTextureBase.serializers), -}); +} + + +DataTextureModel.serializers = { + ...DataTextureBase.serializers, + data: dataserializers.data_union_serialization, +}; module.exports = { DataTextureModel: DataTextureModel, diff --git a/js/src/textures/DataTexture3D.js b/js/src/textures/DataTexture3D.js index 3158b564..d2a8c051 100644 --- a/js/src/textures/DataTexture3D.js +++ b/js/src/textures/DataTexture3D.js @@ -5,17 +5,17 @@ var ndarray = require('ndarray'); var THREE = require('three'); var DataTexture3DBase = require('./DataTexture3D.autogen').DataTexture3DModel; -var DataTexture3DModel = DataTexture3DBase.extend({ +class DataTexture3DModel extends DataTexture3DBase { - createPropertiesArrays: function() { + createPropertiesArrays() { DataTexture3DBase.prototype.createPropertiesArrays.call(this); // three.js DataTexture stores the data, width, and height props together in a dict called 'image' this.property_mappers['DataTexture3DData'] = 'mapDataTexture3DData'; delete this.property_converters['data']; - }, + } - decodeData: function() { + decodeData() { var rawData = dataserializers.getArray(this.get('data')); if (rawData.dimension < 2 || rawData.dimension > 3) { throw Error('DataTexture3D data dimensions need to be 2 or 3, got:', rawData.dimension); @@ -27,9 +27,9 @@ var DataTexture3DModel = DataTexture3DBase.extend({ width: rawData.shape[0], height: rawData.shape[1], }; - }, + } - constructThreeObject: function() { + constructThreeObject() { var data = this.decodeData(); // Make a copy of buffer @@ -45,10 +45,10 @@ var DataTexture3DModel = DataTexture3DBase.extend({ result.needsUpdate = true; return Promise.resolve(result); - }, + } - mapDataTexture3DDataModelToThree: function() { + mapDataTexture3DDataModelToThree() { var imageRecord = this.obj.image; var data = this.decodeData(); if (imageRecord.width !== data.width || @@ -60,9 +60,9 @@ var DataTexture3DModel = DataTexture3DBase.extend({ this.obj.image.data.set(data.data); this.obj.needsUpdate = true; this.set({ version: this.obj.version }, 'pushFromThree'); - }, + } - mapDataTexture3DDataThreeToModel: function() { + mapDataTexture3DDataThreeToModel() { var imageRecord = this.obj.image; var modelNDArray = this.get('data'); if (modelNDArray) { @@ -74,13 +74,14 @@ var DataTexture3DModel = DataTexture3DBase.extend({ [imageRecord.width, imageRecord.height, imageRecord.depth] )); } - }, + } -}, { - serializers: _.extend({ - data: dataserializers.data_union_serialization, - }, DataTexture3DBase.serializers), -}); +} + +DataTexture3DModel.serializers = { + ...DataTexture3DBase.serializers, + data: dataserializers.data_union_serialization, +} module.exports = { DataTexture3DModel: DataTexture3DModel, diff --git a/js/src/textures/DepthTexture.js b/js/src/textures/DepthTexture.js index 45ba0563..31b81653 100644 --- a/js/src/textures/DepthTexture.js +++ b/js/src/textures/DepthTexture.js @@ -1,23 +1,23 @@ var DepthTextureBase = require('./DepthTexture.autogen'); -var DepthTextureModel = DepthTextureBase.DepthTextureModel.extend({ +class DepthTextureModel extends DepthTextureBase.DepthTextureModel { - createPropertiesArrays: function() { + createPropertiesArrays() { DepthTextureBase.DepthTextureModel.prototype.createPropertiesArrays.call(this); // three.js DepthTexture stores the width, and height props together in a dict called 'image' this.property_mappers['DepthTextureData'] = 'mapDepthTextureData'; - }, + } - mapDepthTextureDataModelToThree: function() { + mapDepthTextureDataModelToThree() { var width = this.get('width'); var height = this.get('height'); this.obj.image = { width: width, height: height }; this.obj.needsUpdate = true; - }, + } - mapDepthTextureDataThreeToModel: function() { + mapDepthTextureDataThreeToModel() { var imageRecord = this.obj.image; // this.image = { width: width, height: height }; @@ -26,9 +26,9 @@ var DepthTextureModel = DepthTextureBase.DepthTextureModel.extend({ this.set('width', dataWidth); this.set('height', dataHeight); - }, + } -}); +} module.exports = { DepthTextureModel: DepthTextureModel, diff --git a/js/src/textures/ImageTexture.js b/js/src/textures/ImageTexture.js index a62db5ff..cbb5562d 100644 --- a/js/src/textures/ImageTexture.js +++ b/js/src/textures/ImageTexture.js @@ -2,9 +2,9 @@ var Promise = require('bluebird'); var THREE = require('three'); var ImageTextureBase = require('./ImageTexture.autogen'); -var ImageTextureModel = ImageTextureBase.ImageTextureModel.extend({ +class ImageTextureModel extends ImageTextureBase.ImageTextureModel { - constructThreeObjectAsync: function() { + constructThreeObjectAsync() { var loader = new THREE.TextureLoader(); // Ensure we resolve any local paths according to current notebook location: @@ -28,9 +28,9 @@ var ImageTextureModel = ImageTextureBase.ImageTextureModel.extend({ }, reject); }); return p; - }, + } -}); +} module.exports = { ImageTextureModel: ImageTextureModel, diff --git a/js/src/textures/TextTexture.js b/js/src/textures/TextTexture.js index 67559938..6831b4a5 100644 --- a/js/src/textures/TextTexture.js +++ b/js/src/textures/TextTexture.js @@ -2,9 +2,9 @@ var Promise = require('bluebird'); var THREE = require('three'); var TextTextureBase = require('./TextTexture.autogen').TextTextureModel; -var TextTextureModel = TextTextureBase.extend({ +class TextTextureModel extends TextTextureBase { - constructThreeObjectAsync: function() { + constructThreeObjectAsync() { var self = this; @@ -13,10 +13,10 @@ var TextTextureModel = TextTextureBase.extend({ return resolve(new THREE.CanvasTexture(canvas)); }); return p; - }, + } // push data from model to three object - syncToThreeObj: function(force) { + syncToThreeObj(force) { TextTextureBase.prototype.syncToThreeObj.apply(this, arguments); // TODO: Use mapping of relevant properties instead of sync? @@ -25,9 +25,9 @@ var TextTextureModel = TextTextureBase.extend({ this.obj.needsUpdate = true; this.set({ version: this.obj.version }, 'pushFromThree'); this.save_changes(); - }, + } - buildCanvas: function() { + buildCanvas() { var fontFace = this.get('fontFace'); var size = this.get('size'); var color = this.get('color'); @@ -58,7 +58,7 @@ var TextTextureModel = TextTextureBase.extend({ return canvas; } -}); +} module.exports = { TextTextureModel: TextTextureModel, diff --git a/pythreejs/_base/Three.py b/pythreejs/_base/Three.py index 13f35003..7d1beee8 100644 --- a/pythreejs/_base/Three.py +++ b/pythreejs/_base/Three.py @@ -39,10 +39,21 @@ def _on_ret_val(self, method_name, ret_val): """Message callback used internally for logging exec returns""" self.log.info('%s() -> %s' % (method_name, ret_val)) - def _ipython_display_(self, **kwargs): + def _repr_mimebundle_(self, **kwargs): if self._previewable: from IPython.display import display from .renderable import Preview - return display(Preview(self), **kwargs) + plaintext = repr(self) + if len(plaintext) > 110: + plaintext = plaintext[:110] + '…' + preview = Preview(self) + return { + 'text/plain': plaintext, + 'application/vnd.jupyter.widget-view+json': { + "version_major": 2, + "version_minor": 0, + "model_id": preview._model_id + } + } else: - return super(ThreeWidget, self)._ipython_display_(**kwargs) + return super(ThreeWidget, self)._repr_mimebundle_(**kwargs) From f294530d7b7d5e6e7469360f34fd0770a7485a31 Mon Sep 17 00:00:00 2001 From: Vidar Tonaas Fauske <510760+vidartf@users.noreply.github.com> Date: Thu, 26 May 2022 12:40:29 +0100 Subject: [PATCH 3/6] Ensure support for non-finite floats jupyter_client has deprecated support for non-finite floats, and aggressively prints to stderr if you try to serialize them. Notes: We do not need a deserializer, as CFloats will handle the conversion in its validator. We were already relying on this fact, so no change. Similarly, the JS convertFloat[...] functions continue to serialize/deserialize there. This also extends Vector/Matrix/Euler to support IEEE floats. --- js/scripts/prop-types.js | 2 +- js/src/_base/Three.js | 18 +++--- pythreejs/_base/renderable.py | 11 ++-- pythreejs/_base/uniforms.py | 87 ++++++++++++++++---------- pythreejs/animation/AnimationAction.py | 10 ++- pythreejs/traits.py | 76 +++++++++++++++++++--- 6 files changed, 145 insertions(+), 59 deletions(-) diff --git a/js/scripts/prop-types.js b/js/scripts/prop-types.js index 2df6fd22..617e0878 100644 --- a/js/scripts/prop-types.js +++ b/js/scripts/prop-types.js @@ -303,7 +303,7 @@ class Float extends BaseType { if (this.maxValue !== undefined) { limits += `, max=${this.maxValue}`; } - return `CFloat(${this.getPythonDefaultValue()}, ${nullableStr}${limits})${this.getTagString()}`; + return `IEEEFloat(${this.getPythonDefaultValue()}, ${nullableStr}${limits})${this.getTagString()}`; } getPropertyConverterFn() { return 'convertFloat'; diff --git a/js/src/_base/Three.js b/js/src/_base/Three.js index 859fc88f..7f09d79c 100644 --- a/js/src/_base/Three.js +++ b/js/src/_base/Three.js @@ -501,9 +501,9 @@ class ThreeModel extends widgets.WidgetModel { } convertFloatThreeToModel(v) { - if (isFinite(v)) { // Most common first + if (Number.isFinite(v)) { // Most common first return v; - } else if (isNaN(v)) { + } else if (Number.isNaN(v)) { return 'nan'; } else if (v === Infinity) { return 'inf'; @@ -554,12 +554,12 @@ class ThreeModel extends widgets.WidgetModel { default: throw new Error('model vector has invalid length: ' + v.length); } - result.fromArray(v); + result.fromArray(v.map(this.convertFloatModelToThree)); return result; } convertVectorThreeToModel(v) { - return v.toArray(); + return v.toArray().map(this.convertFloatThreeToModel); } assignVector(obj, key, value) { @@ -568,11 +568,13 @@ class ThreeModel extends widgets.WidgetModel { // Euler convertEulerModelToThree(v) { - return new THREE.Euler().fromArray(v); + // The float conversions will ignore the "XYZ" order strings + return new THREE.Euler().fromArray(v.map(this.convertFloatModelToThree)); } convertEulerThreeToModel(v) { - return v.toArray(); + // The float conversions will ignore the "XYZ" order strings + return v.toArray().map(this.convertFloatThreeToModel); } assignEuler(obj, key, value) { @@ -676,12 +678,12 @@ class ThreeModel extends widgets.WidgetModel { default: throw new Error('model matrix has invalid length: ' + m.length); } - result.fromArray(m); + result.fromArray(m.map(this.convertFloatModelToThree)); return result; } convertMatrixThreeToModel(m) { - return m.toArray(); + return m.toArray().map(this.convertFloatThreeToModel); } assignMatrix(obj, key, value) { diff --git a/pythreejs/_base/renderable.py b/pythreejs/_base/renderable.py index 303cca19..daf928e7 100644 --- a/pythreejs/_base/renderable.py +++ b/pythreejs/_base/renderable.py @@ -1,5 +1,5 @@ from ipywidgets import DOMWidget, Widget, widget_serialization -from traitlets import Unicode, CInt, CFloat, Enum, Bool, Int, Instance, List +from traitlets import Unicode, CInt, Enum, Bool, Int, Instance, List from .._package import npm_pkg_name from .._version import EXTENSION_SPEC_VERSION @@ -8,6 +8,7 @@ from ..enums import ToneMappings from ..math.Plane_autogen import Plane from ..renderers.webgl.WebGLShadowMap_autogen import WebGLShadowMap +from ..traits import IEEEFloat class RenderableWidget(DOMWidget): @@ -28,7 +29,7 @@ class RenderableWidget(DOMWidget): autoClearDepth = Bool(True).tag(sync=True) autoClearStencil = Bool(True).tag(sync=True) clippingPlanes = List(Instance(Plane)).tag(sync=True, **widget_serialization) - gammaFactor = CFloat(2.0).tag(sync=True) + gammaFactor = IEEEFloat(2.0).tag(sync=True) gammaInput = Bool(False).tag(sync=True) gammaOutput = Bool(False).tag(sync=True) localClippingEnabled = Bool(False).tag(sync=True) @@ -38,11 +39,11 @@ class RenderableWidget(DOMWidget): shadowMap = Instance(WebGLShadowMap, args=(), allow_none=True).tag(sync=True, **widget_serialization) sortObject = Bool(True).tag(sync=True) toneMapping = Enum(ToneMappings, 'LinearToneMapping').tag(sync=True) - toneMappingExposure = CFloat(1.0).tag(sync=True) - toneMappingWhitePoint = CFloat(1.0).tag(sync=True) + toneMappingExposure = IEEEFloat(1.0).tag(sync=True) + toneMappingWhitePoint = IEEEFloat(1.0).tag(sync=True) clearColor = Unicode('#000000').tag(sync=True) - clearOpacity = CFloat(1.0).tag(sync=True) + clearOpacity = IEEEFloat(1.0).tag(sync=True) def send_msg(self, message_type, payload=None): if payload is None: diff --git a/pythreejs/_base/uniforms.py b/pythreejs/_base/uniforms.py index aafef704..629b350d 100644 --- a/pythreejs/_base/uniforms.py +++ b/pythreejs/_base/uniforms.py @@ -1,51 +1,70 @@ +import numbers +import math + from ipywidgets import Widget, widget_serialization + +def _serialize_item(value): + if value is None: + return { 'value': None } + + elif isinstance(value, Widget): + return { + 'type': 't', + 'value': widget_serialization['to_json'](value, None) + } + + elif isinstance(value, str): + return { + 'type': 'c', + 'value': value + } + + elif isinstance(value, numbers.Real): + # cast non-finite floats to repr + if math.isnan(value) or math.isinf(value): + value = repr(value) + return { + 'value': value + } + + elif isinstance(value, (list, tuple)): + ret = { + 'value': list(value) + } + for i, e in enumerate(value): + if isinstance(e, numbers.Real) and (math.isnan(e) or math.isinf(e)): + ret["value"][i] = repr(e) + + ll = len(value) + if 2 <= ll <= 4: + ret['type'] = 'v%d' % ll + elif ll == 9: + ret['type'] = 'm3' + elif ll == 16: + ret['type'] = 'm4' + return ret + + else: + return { + 'value': value + } + def serialize_uniforms(uniforms, obj): + """Serialize a uniform dict""" serialized = {} for name, uniform in uniforms.items(): - value = uniform['value'] - - if value is None: - serialized[name] = { 'value': None } - - elif isinstance(value, Widget): - serialized[name] = { - 'type': 't', - 'value': widget_serialization['to_json'](value, None) - } - - elif isinstance(value, str): - serialized[name] = { - 'type': 'c', - 'value': value - } - - elif isinstance(value, (list, tuple)): - serialized[name] = { - 'value': value - } - - ll = len(value) - if 2 <= ll <= 4: - serialized[name]['type'] = 'v%d' % ll - elif ll == 9: - serialized[name]['type'] = 'm3' - elif ll == 16: - serialized[name]['type'] = 'm4' - - else: - serialized[name] = { - 'value': value - } + serialized[name] = _serialize_item(uniform['value']) return serialized def deserialize_uniforms(serialized, obj): + """Deserialize a uniform dict""" uniforms = {} diff --git a/pythreejs/animation/AnimationAction.py b/pythreejs/animation/AnimationAction.py index 2f4b6f89..b11b1436 100644 --- a/pythreejs/animation/AnimationAction.py +++ b/pythreejs/animation/AnimationAction.py @@ -1,5 +1,7 @@ from ipywidgets import register, DOMWidget, Widget -from traitlets import Unicode, Union, CInt, CFloat +from traitlets import Unicode, Union, CInt + +from ..traits import IEEEFloat, ieee_float_serializers from .._package import npm_pkg_name from .._version import EXTENSION_SPEC_VERSION @@ -21,7 +23,11 @@ class AnimationAction(AnimationActionBase, DOMWidget): _previewable = False # Normally an int, but can also be inf: - repititions = Union([CInt(), CFloat()], default_value=float('inf'), allow_none=False).tag(sync=True) + repititions = Union( + [CInt(), IEEEFloat()], + default_value=float('inf'), + allow_none=False + ).tag(sync=True, **ieee_float_serializers) def play(self): content = { diff --git a/pythreejs/traits.py b/pythreejs/traits.py index 9792d752..96e66973 100644 --- a/pythreejs/traits.py +++ b/pythreejs/traits.py @@ -3,12 +3,14 @@ from collections import namedtuple from collections.abc import Sequence +import numbers +import math import re import warnings from traitlets import ( Unicode, Int, CInt, Instance, Enum, List, Dict, Float, CFloat, - Bool, Tuple, Undefined, TraitError, Union, TraitType + Bool, Tuple, Undefined, TraitError, Union, TraitType, CaselessStrEnum ) from ipywidgets import widget_serialization @@ -29,6 +31,30 @@ def new_new(cls, *args, **kwargs): return type(typename, (base,), {'__new__': new_new}) +def _ieee_to_json(value, owner): + if isinstance(value, numbers.Real): + # cast out-of-range floats to their reprs + if math.isnan(value) or math.isinf(value): + return repr(value) + return value + +ieee_float_serializers = { + 'to_json': _ieee_to_json, +} + + +class IEEEFloat(CFloat): + def __init__(self, default_value=Undefined, **kwargs): + super().__init__(default_value=default_value, **kwargs) + self.metadata.setdefault("to_json", _ieee_to_json) + + +def _ieee_tuple_to_json(value, owner): + if value is None: + return value + return [_ieee_to_json(e, owner) for e in value] + + class Vector2(Tuple): """A trait for a 2-tuple corresponding to a three.js Vector2. """ @@ -38,12 +64,14 @@ class Vector2(Tuple): def __init__(self, trait=Undefined, default_value=Undefined, **kwargs): if trait is Undefined: - trait = CFloat() + trait = IEEEFloat() if default_value is Undefined: default_value = self.default_value else: self.default_value = default_value super(Vector2, self).__init__(*(trait, trait), default_value=default_value, **kwargs) + if isinstance(trait, IEEEFloat): + self.metadata.setdefault("to_json", _ieee_tuple_to_json) class Vector3(Tuple): @@ -55,12 +83,14 @@ class Vector3(Tuple): def __init__(self, trait=Undefined, default_value=Undefined, **kwargs): if trait is Undefined: - trait = CFloat() + trait = IEEEFloat() if default_value is Undefined: default_value = self.default_value else: self.default_value = default_value super(Vector3, self).__init__(*(trait, trait, trait), default_value=default_value, **kwargs) + if isinstance(trait, IEEEFloat): + self.metadata.setdefault("to_json", _ieee_tuple_to_json) class Vector4(Tuple): @@ -72,12 +102,14 @@ class Vector4(Tuple): def __init__(self, trait=Undefined, default_value=Undefined, **kwargs): if trait is Undefined: - trait = CFloat() + trait = IEEEFloat() if default_value is Undefined: default_value = self.default_value else: self.default_value = default_value super(Vector4, self).__init__(*(trait, trait, trait, trait), default_value=default_value, **kwargs) + if isinstance(trait, IEEEFloat): + self.metadata.setdefault("to_json", _ieee_tuple_to_json) class Matrix3(Tuple): @@ -93,12 +125,14 @@ class Matrix3(Tuple): def __init__(self, trait=Undefined, default_value=Undefined, **kwargs): if trait is Undefined: - trait = CFloat() + trait = IEEEFloat() if default_value is Undefined: default_value = self.default_value else: self.default_value = default_value super(Matrix3, self).__init__(*((trait,) * 9), default_value=default_value, **kwargs) + if isinstance(trait, IEEEFloat): + self.metadata.setdefault("to_json", _ieee_tuple_to_json) class Matrix4(Tuple): @@ -115,12 +149,29 @@ class Matrix4(Tuple): def __init__(self, trait=Undefined, default_value=Undefined, **kwargs): if trait is Undefined: - trait = CFloat() + trait = IEEEFloat() if default_value is Undefined: default_value = self.default_value else: self.default_value = default_value super(Matrix4, self).__init__(*((trait,) * 16), default_value=default_value, **kwargs) + if isinstance(trait, IEEEFloat): + self.metadata.setdefault("to_json", _ieee_tuple_to_json) + + +def _face_to_json(value, owner): + if value is None: + return None + value = list(value) + if value[3] is not None: + normal = list(value[3]) + for i, v in enumerate(normal): + if isinstance(v, tuple): + normal[i] = _ieee_tuple_to_json(v, owner) + else: + normal[i] = _ieee_to_json(v, owner) + value[3] = normal + return value class Face3(Tuple): @@ -150,7 +201,13 @@ def __init__(self, **kwargs): CInt(allow_none=True), # materialIndex - (optional) which index of an array of materials to associate with the face. default_value=(0, 0, 0, None, None, None) ) + self.metadata.setdefault("to_json", _face_to_json) + +def _euler_to_json(value, owner): + if value is None: + return None + return _ieee_tuple_to_json(value[:3], owner) + [value[3]] class Euler(Tuple): """A trait for a set of Euler angles. @@ -170,9 +227,10 @@ def __init__(self, default_value=Undefined, **kwargs): else: self.default_value = default_value super(Euler, self).__init__( - CFloat(), CFloat(), CFloat(), + IEEEFloat(), IEEEFloat(), IEEEFloat(), Enum(self._accepted_orders, self._accepted_orders[0]), default_value=default_value , **kwargs) + self.metadata.setdefault("to_json", _euler_to_json) class WebGLDataUnion(DataUnion): @@ -264,9 +322,9 @@ class Uniform(Dict): def __init__(self, default_value=Undefined, **kwargs): super(Uniform, self).__init__(traits=dict( value=Union(( - Int(), Float(), Color(), Instance('pythreejs.Texture'), + Int(), IEEEFloat(), Color(), Instance('pythreejs.Texture'), List(trait=Union(( - Int(), Float(), Color(), Instance('pythreejs.Texture')))), + Int(), IEEEFloat(), Color(), Instance('pythreejs.Texture')))), ), allow_none=True), type=Unicode() ), default_value=default_value, **kwargs) From 1d22d84d1c9e1f03dafe5ab592836a3bb70d8a2a Mon Sep 17 00:00:00 2001 From: Vidar Tonaas Fauske <510760+vidartf@users.noreply.github.com> Date: Thu, 26 May 2022 14:18:14 +0100 Subject: [PATCH 4/6] eslint --- js/.eslintrc.js | 55 ++++++++++++++------- js/scripts/.eslintrc.js | 4 +- js/scripts/generate-shader-utils.js | 2 +- js/scripts/generate-wrappers.js | 2 +- js/scripts/templates/js_index.mustache | 4 +- js/src/_base/Renderable.js | 2 +- js/src/animation/AnimationAction.js | 2 +- js/src/cameras/OrthographicCamera.js | 1 - js/src/cameras/PerspectiveCamera.js | 1 - js/src/controls/FlyControls.js | 1 - js/src/controls/OrbitControls.js | 1 - js/src/controls/Picker.js | 8 +-- js/src/controls/TrackballControls.js | 1 - js/src/core/Renderer.js | 16 +++--- js/src/examples/.eslintrc.js | 53 ++++++++++---------- js/src/examples/cameras/CombinedCamera.js | 2 +- js/src/examples/lines/LineMaterial.js | 6 +-- js/src/examples/renderers/CanvasRenderer.js | 8 +-- js/src/examples/renderers/Projector.js | 4 +- js/src/geometries/LineSegmentsGeometry.js | 2 - js/src/lights/LightShadow.js | 1 - js/src/objects/CloneArray.js | 2 +- js/src/objects/Mesh.js | 3 +- js/src/renderers/WebGLRenderer.js | 12 ++--- js/src/renderers/webgl/WebGLShadowMap.js | 1 - js/src/textures/DataTexture.js | 1 - js/src/textures/DataTexture3D.js | 3 +- js/webpack.config.js | 8 +-- 28 files changed, 106 insertions(+), 100 deletions(-) diff --git a/js/.eslintrc.js b/js/.eslintrc.js index f1a15baa..878f97f5 100644 --- a/js/.eslintrc.js +++ b/js/.eslintrc.js @@ -1,27 +1,44 @@ module.exports = { - "env": { - "browser": true, - "commonjs": true + 'env': { + 'browser': true, + 'commonjs': true, + 'es2018': true, + 'node': true }, - "extends": "eslint:recommended", - "rules": { - "indent": [ - "error", + 'extends': 'eslint:recommended', + 'ignorePatterns': ['dist/**/*', 'lab-dist/**/*'], + 'globals': { + '__webpack_public_path__': true + }, + 'rules': { + 'indent': [ + 'error', 4 ], - "linebreak-style": [ - "error", - "windows" + 'linebreak-style': [ + 'error', + 'windows' ], - "quotes": [ - "error", - "single" + 'quotes': [ + 'error', + 'single' ], - "semi": [ - "error", - "always" + 'semi': [ + 'error', + 'always' ], - "no-console": "off", - "no-unused-vars": "warn", - } + 'no-console': 'off', + 'no-unused-vars': ['warn', { 'args': 'none' }], + 'prefer-object-spread': 'error', + }, + 'overrides': [ + { + 'files': [ 'src/**/*.autogen.js' ], + 'rules': { + 'quotes': 0, + 'linebreak-style': 0, + 'no-unused-vars': 0, + } + } + ] }; diff --git a/js/scripts/.eslintrc.js b/js/scripts/.eslintrc.js index c8c40940..9194dbc8 100644 --- a/js/scripts/.eslintrc.js +++ b/js/scripts/.eslintrc.js @@ -1,12 +1,12 @@ module.exports = { "env": { - "es6": true, + "es2018": true, "node": true }, "extends": "eslint:recommended", "parserOptions": { "sourceType": "script", - "ecmaVersion": 2017 + "ecmaVersion": 2018 }, "rules": { "indent": [ diff --git a/js/scripts/generate-shader-utils.js b/js/scripts/generate-shader-utils.js index 27598be1..2e1aa4c9 100644 --- a/js/scripts/generate-shader-utils.js +++ b/js/scripts/generate-shader-utils.js @@ -73,7 +73,7 @@ async function createPythonWrapper(name, relativePath) { if (data[section]['uniforms'] === undefined) { continue; } - serialized[section] = Object.assign({}, data[section]); + serialized[section] = { ...data[section]}; serialized[section]['uniforms'] = serializeUniforms(data[section]['uniforms']); } } else { diff --git a/js/scripts/generate-wrappers.js b/js/scripts/generate-wrappers.js index 01d03ef0..41bcce8b 100644 --- a/js/scripts/generate-wrappers.js +++ b/js/scripts/generate-wrappers.js @@ -155,7 +155,7 @@ function getClassConfig(className) { const curClass = classConfigs[className]; - const result = Object.assign({}, curClass); + const result = { ...curClass}; result.propsDefinedByThree = []; result.propsDefinedByThree = result.propsDefinedByThree.concat(curClass.propsDefinedByThree || []); diff --git a/js/scripts/templates/js_index.mustache b/js/scripts/templates/js_index.mustache index f1d97380..59d92fc3 100644 --- a/js/scripts/templates/js_index.mustache +++ b/js/scripts/templates/js_index.mustache @@ -15,10 +15,10 @@ var loadedModules = [ ]; for (var i in loadedModules) { - if (loadedModules.hasOwnProperty(i)) { + if (Object.prototype.hasOwnProperty.call(loadedModules, i)) { var loadedModule = loadedModules[i]; for (var target_name in loadedModule) { - if (loadedModule.hasOwnProperty(target_name)) { + if (Object.prototype.hasOwnProperty.call(loadedModule, target_name)) { module.exports[target_name] = loadedModule[target_name]; } } diff --git a/js/src/_base/Renderable.js b/js/src/_base/Renderable.js index 8e6b3c19..a284f282 100644 --- a/js/src/_base/Renderable.js +++ b/js/src/_base/Renderable.js @@ -174,7 +174,7 @@ RenderableModel.serializers = { ...widgets.DOMWidgetModel.serializers, clippingPlanes: { deserialize: unpackThreeModel }, shadowMap: { deserialize: unpackThreeModel }, -} +}; class RenderableView extends widgets.DOMWidgetView { diff --git a/js/src/animation/AnimationAction.js b/js/src/animation/AnimationAction.js index 9c479ca7..f0800f96 100644 --- a/js/src/animation/AnimationAction.js +++ b/js/src/animation/AnimationAction.js @@ -125,7 +125,7 @@ class AnimationActionModel extends AnimationActionAutogen { AnimationActionModel.serializers = { ...AnimationActionAutogen.serializers, ...widgets.DOMWidgetModel.serializers, -} +}; class AnimationActionView extends widgets.DOMWidgetView { diff --git a/js/src/cameras/OrthographicCamera.js b/js/src/cameras/OrthographicCamera.js index bf05344f..9bacf15b 100644 --- a/js/src/cameras/OrthographicCamera.js +++ b/js/src/cameras/OrthographicCamera.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var OrthographicCameraAutogen = require('./OrthographicCamera.autogen'); class OrthographicCameraModel extends OrthographicCameraAutogen.OrthographicCameraModel { diff --git a/js/src/cameras/PerspectiveCamera.js b/js/src/cameras/PerspectiveCamera.js index 9c193ce9..60bfdd7e 100644 --- a/js/src/cameras/PerspectiveCamera.js +++ b/js/src/cameras/PerspectiveCamera.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var PerspectiveCameraAutogen = require('./PerspectiveCamera.autogen'); class PerspectiveCameraModel extends PerspectiveCameraAutogen.PerspectiveCameraModel { diff --git a/js/src/controls/FlyControls.js b/js/src/controls/FlyControls.js index 1feab19d..a7698097 100644 --- a/js/src/controls/FlyControls.js +++ b/js/src/controls/FlyControls.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var THREE = require('three'); var FlyControls = require('../examples/controls/MomentumCameraControls.js').FlyControls; var FlyControlsAutogen = require('./FlyControls.autogen'); diff --git a/js/src/controls/OrbitControls.js b/js/src/controls/OrbitControls.js index ee5dd0d0..8d136903 100644 --- a/js/src/controls/OrbitControls.js +++ b/js/src/controls/OrbitControls.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var OrbitControls = require('../examples/controls/OrbitControls.js').OrbitControls; var OrbitControlsAutogen = require('./OrbitControls.autogen'); diff --git a/js/src/controls/Picker.js b/js/src/controls/Picker.js index 54924de8..8e234eae 100644 --- a/js/src/controls/Picker.js +++ b/js/src/controls/Picker.js @@ -114,13 +114,13 @@ function getinfo(o) { if (o.face && o.object.geometry.isBufferGeometry) { v = o.object.geometry.attributes.position.array; verts = [[v[o.face.a], v[o.face.a] + 1, v[o.face.a] + 2], - [v[o.face.b], v[o.face.b] + 1, v[o.face.b] + 2], - [v[o.face.c], v[o.face.c] + 1, v[o.face.c] + 2]]; + [v[o.face.b], v[o.face.b] + 1, v[o.face.b] + 2], + [v[o.face.c], v[o.face.c] + 1, v[o.face.c] + 2]]; } else if (o.face) { v = o.object.geometry.vertices; verts = [[v[o.face.a].x, v[o.face.a].y, v[o.face.a].z], - [v[o.face.b].x, v[o.face.b].y, v[o.face.b].z], - [v[o.face.c].x, v[o.face.c].y, v[o.face.c].z]]; + [v[o.face.b].x, v[o.face.b].y, v[o.face.b].z], + [v[o.face.c].x, v[o.face.c].y, v[o.face.c].z]]; } return { point: [o.point.x, o.point.y, o.point.z], diff --git a/js/src/controls/TrackballControls.js b/js/src/controls/TrackballControls.js index 675dc87e..59f3f66c 100644 --- a/js/src/controls/TrackballControls.js +++ b/js/src/controls/TrackballControls.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var TrackballControls = require('../examples/controls/TrackballControls.js').TrackballControls; var TrackballControlsAutogen = require('./TrackballControls.autogen'); diff --git a/js/src/core/Renderer.js b/js/src/core/Renderer.js index 5b1b0872..1395ffc9 100644 --- a/js/src/core/Renderer.js +++ b/js/src/core/Renderer.js @@ -59,16 +59,16 @@ class RendererModel extends RenderableModel { this.trigger('rerender', this, {}); } } - - static serializers = { - ...RenderableModel.serializers, - scene: { deserialize: unpackThreeModel }, - camera: { deserialize: unpackThreeModel }, - controls: { deserialize: unpackThreeModel }, - effect: { deserialize: unpackThreeModel }, - } } +RendererModel.serializers = { + ...RenderableModel.serializers, + scene: { deserialize: unpackThreeModel }, + camera: { deserialize: unpackThreeModel }, + controls: { deserialize: unpackThreeModel }, + effect: { deserialize: unpackThreeModel }, +}; + class RendererView extends RenderableView { render() { diff --git a/js/src/examples/.eslintrc.js b/js/src/examples/.eslintrc.js index 4af609b6..1bc0b3df 100644 --- a/js/src/examples/.eslintrc.js +++ b/js/src/examples/.eslintrc.js @@ -1,28 +1,29 @@ module.exports = { - "env": { - "browser": true, - "commonjs": true - } - "extends": "eslint:recommended", - "rules": { - "indent": [ - "error", - "tab" - ], - "linebreak-style": [ - "error", - "windows" - ], - "quotes": [ - "error", - "single" - ], - "semi": [ - "error", - "always" - ], - "no-console": "off", - "no-unused-vars": "warn", - "no-redeclare": "warn", - } + 'env': { + 'browser': true, + 'commonjs': true + }, + 'extends': 'eslint:recommended', + 'rules': { + 'indent': [ + 'error', + 'tab' + ], + 'linebreak-style': [ + 'error', + 'windows' + ], + 'quotes': [ + 'error', + 'single' + ], + 'semi': [ + 'error', + 'always' + ], + 'no-console': 'off', + 'no-unused-vars': 'warn', + 'no-undef': 'warn', + 'no-redeclare': 'warn', + } }; diff --git a/js/src/examples/cameras/CombinedCamera.js b/js/src/examples/cameras/CombinedCamera.js index 32baafbf..a377db1f 100644 --- a/js/src/examples/cameras/CombinedCamera.js +++ b/js/src/examples/cameras/CombinedCamera.js @@ -138,7 +138,7 @@ CombinedCamera.prototype.copy = function ( source ) { this.bottom = source.bottom; this.zoom = source.zoom; - this.view = source.view === null ? null : Object.assign( {}, source.view ); + this.view = source.view === null ? null : ({ ...source.view }); this.aspect = source.aspect; this.cameraO.copy( source.cameraO ); diff --git a/js/src/examples/lines/LineMaterial.js b/js/src/examples/lines/LineMaterial.js index b797a022..22205e32 100644 --- a/js/src/examples/lines/LineMaterial.js +++ b/js/src/examples/lines/LineMaterial.js @@ -384,11 +384,11 @@ LineMaterial.prototype.copy = function ( source ) { this.linewidth = source.linewidth; - this.resolution = source.resolution; + this.resolution = source.resolution; - this.dashScale = source.dashScale; + this.dashScale = source.dashScale; - this.dashSize = source.dashSize; + this.dashSize = source.dashSize; this.gapSize = source.gapSize; diff --git a/js/src/examples/renderers/CanvasRenderer.js b/js/src/examples/renderers/CanvasRenderer.js index c4427c8a..6272323c 100644 --- a/js/src/examples/renderers/CanvasRenderer.js +++ b/js/src/examples/renderers/CanvasRenderer.js @@ -47,8 +47,8 @@ var CanvasRenderer = function ( parameters ) { _projector = new THREE.Projector(), _canvas = parameters.canvas !== undefined - ? parameters.canvas - : document.createElement( 'canvas' ), + ? parameters.canvas + : document.createElement( 'canvas' ), _canvasWidth = _canvas.width, _canvasHeight = _canvas.height, @@ -766,8 +766,8 @@ var CanvasRenderer = function ( parameters ) { _color.r = _color.g = _color.b = 1 - smoothstep( v1.positionScreen.z * v1.positionScreen.w, _camera.near, _camera.far ); material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); + ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) + : fillPath( _color ); } else if ( material instanceof THREE.MeshNormalMaterial ) { diff --git a/js/src/examples/renderers/Projector.js b/js/src/examples/renderers/Projector.js index a68cea2a..7df3f4dd 100644 --- a/js/src/examples/renderers/Projector.js +++ b/js/src/examples/renderers/Projector.js @@ -860,8 +860,8 @@ var Projector = function () { var alpha1 = 0, alpha2 = 1, - // Calculate the boundary coordinate of each vertex for the near and far clip planes, - // Z = -1 and Z = +1, respectively. + // Calculate the boundary coordinate of each vertex for the near and far clip planes, + // Z = -1 and Z = +1, respectively. bc1near = s1.z + s1.w, bc2near = s2.z + s2.w, bc1far = - s1.z + s1.w, diff --git a/js/src/geometries/LineSegmentsGeometry.js b/js/src/geometries/LineSegmentsGeometry.js index 3fdb7105..90896e49 100644 --- a/js/src/geometries/LineSegmentsGeometry.js +++ b/js/src/geometries/LineSegmentsGeometry.js @@ -1,6 +1,4 @@ var Promise = require('bluebird'); -var dataserializers = require('jupyter-dataserializers'); -var ndarray = require('ndarray'); var LineSegmentsGeometry = require('../examples/lines/LineSegmentsGeometry.js').LineSegmentsGeometry; var LineSegmentsGeometryAutogen = require('./LineSegmentsGeometry.autogen').LineSegmentsGeometryModel; diff --git a/js/src/lights/LightShadow.js b/js/src/lights/LightShadow.js index c0ecdcbb..c133615e 100644 --- a/js/src/lights/LightShadow.js +++ b/js/src/lights/LightShadow.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var LightShadowAutogen = require('./LightShadow.autogen').LightShadowModel; class LightShadowModel extends LightShadowAutogen { diff --git a/js/src/objects/CloneArray.js b/js/src/objects/CloneArray.js index 947d281c..ac202a23 100644 --- a/js/src/objects/CloneArray.js +++ b/js/src/objects/CloneArray.js @@ -7,7 +7,7 @@ var utils = require('../_base/utils'); class ThreeCloneArray extends THREE.Object3D { constructor(original, positions, merge) { - THREE.Object3D.call(this); + super(); this.original = original; this.positions = positions; diff --git a/js/src/objects/Mesh.js b/js/src/objects/Mesh.js index b3928f8e..928b9a4a 100644 --- a/js/src/objects/Mesh.js +++ b/js/src/objects/Mesh.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var MeshAutogen = require('./Mesh.autogen').MeshModel; @@ -17,7 +16,7 @@ class MeshModel extends MeshAutogen { MeshModel.serializers = { ...MeshAutogen.serializers, morphTargetInfluences: optionalArraySerializer, -} +}; module.exports = { MeshModel: MeshModel, diff --git a/js/src/renderers/WebGLRenderer.js b/js/src/renderers/WebGLRenderer.js index ab575224..0c5a94bb 100644 --- a/js/src/renderers/WebGLRenderer.js +++ b/js/src/renderers/WebGLRenderer.js @@ -15,13 +15,13 @@ class WebGLRendererModel extends RenderableModel { defaults() { return _.extend({}, RenderableModel.prototype.defaults, { - _view_name: 'WebGLRendererView', - _model_name: 'WebGLRendererModel', + _view_name: 'WebGLRendererView', + _model_name: 'WebGLRendererModel', - width: 200, - height: 200, + width: 200, + height: 200, - }); + }); } } @@ -29,7 +29,7 @@ class WebGLRendererModel extends RenderableModel { WebGLRendererModel.serializers = { ...RenderableModel.serializers, clippingPlanes: { deserialize: unpackThreeModel }, -} +}; class WebGLRendererView extends RenderableView { diff --git a/js/src/renderers/webgl/WebGLShadowMap.js b/js/src/renderers/webgl/WebGLShadowMap.js index 1db87793..446571a3 100644 --- a/js/src/renderers/webgl/WebGLShadowMap.js +++ b/js/src/renderers/webgl/WebGLShadowMap.js @@ -1,5 +1,4 @@ -var _ = require('underscore'); var Promise = require('bluebird'); var WebGLShadowMapAutogenModel = require('./WebGLShadowMap.autogen').WebGLShadowMapModel; diff --git a/js/src/textures/DataTexture.js b/js/src/textures/DataTexture.js index 473bda49..280e3092 100644 --- a/js/src/textures/DataTexture.js +++ b/js/src/textures/DataTexture.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Promise = require('bluebird'); var dataserializers = require('jupyter-dataserializers'); var ndarray = require('ndarray'); diff --git a/js/src/textures/DataTexture3D.js b/js/src/textures/DataTexture3D.js index d2a8c051..2755f813 100644 --- a/js/src/textures/DataTexture3D.js +++ b/js/src/textures/DataTexture3D.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Promise = require('bluebird'); var dataserializers = require('jupyter-dataserializers'); var ndarray = require('ndarray'); @@ -81,7 +80,7 @@ class DataTexture3DModel extends DataTexture3DBase { DataTexture3DModel.serializers = { ...DataTexture3DBase.serializers, data: dataserializers.data_union_serialization, -} +}; module.exports = { DataTexture3DModel: DataTexture3DModel, diff --git a/js/webpack.config.js b/js/webpack.config.js index fd56695a..b81b6deb 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -12,7 +12,7 @@ module.exports = [ libraryTarget: 'amd' }, resolve: { - extensions: [ ".autogen.js", ".js" ] + extensions: [ '.autogen.js', '.js' ] }, }, { @@ -26,7 +26,7 @@ module.exports = [ devtool: 'source-map', externals: externals, resolve: { - extensions: [ ".autogen.js", ".js" ] + extensions: [ '.autogen.js', '.js' ] }, }, @@ -36,12 +36,12 @@ module.exports = [ output: { filename: 'index.js', path: path.resolve(__dirname, 'dist'), - library: "jupyter-threejs", + library: 'jupyter-threejs', libraryTarget: 'amd' }, externals: ['@jupyter-widgets/base'], resolve: { - extensions: [ ".autogen.js", ".js" ] + extensions: [ '.autogen.js', '.js' ] }, }, From 1b633f370b0963ddf067c5c485c791711783d57a Mon Sep 17 00:00:00 2001 From: Vidar Tonaas Fauske <510760+vidartf@users.noreply.github.com> Date: Thu, 26 May 2022 14:56:12 +0100 Subject: [PATCH 5/6] Regenerate examples with state --- examples/Animation.ipynb | 728 ++++++++++++++++++-------------------- examples/Geometries.ipynb | 348 ++++++++++-------- examples/Renderer.ipynb | 182 ++++++---- examples/Textures.ipynb | 37 +- examples/ThickLines.ipynb | 254 ++++++------- 5 files changed, 788 insertions(+), 761 deletions(-) diff --git a/examples/Animation.ipynb b/examples/Animation.ipynb index af7ac049..ba9570ad 100644 --- a/examples/Animation.ipynb +++ b/examples/Animation.ipynb @@ -181,8 +181,9 @@ "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(10.0, 6.0, 10.0), projectionMatrix=(1.4296712803397058…" ] }, + "execution_count": 10, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -209,8 +210,9 @@ "AnimationAction(clip=AnimationClip(duration=5.0, tracks=(VectorKeyframeTrack(name='.position', times=array([0,…" ] }, + "execution_count": 11, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -253,8 +255,9 @@ "AnimationAction(clip=AnimationClip(duration=1.5, tracks=(ColorKeyframeTrack(name='.material.color', times=arra…" ] }, + "execution_count": 13, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -290,7 +293,7 @@ "version_minor": 0 }, "text/plain": [ - "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(10.0, 6.0, 10.0), quaternion=(0.0, 0.0, 0.0, 1.0), sca…" + "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(10.0, 6.0, 10.0), projectionMatrix=(1.0, 0.0, 0.0, 0.0…" ] }, "metadata": {}, @@ -345,8 +348,9 @@ "AnimationAction(clip=AnimationClip(tracks=(NumberKeyframeTrack(name='.rotation[y]', times=array([0, 2]), value…" ] }, + "execution_count": 15, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -449,7 +453,7 @@ "version_minor": 0 }, "text/plain": [ - "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(5.0, 3.0, 5.0), quaternion=(0.0, 0.0, 0.0, 1.0), scale…" + "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(5.0, 3.0, 5.0), projectionMatrix=(1.0, 0.0, 0.0, 0.0, …" ] }, "metadata": {}, @@ -632,7 +636,7 @@ "version_minor": 0 }, "text/plain": [ - "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(40.0, 24.0, 40.0), quaternion=(0.0, 0.0, 0.0, 1.0), sc…" + "Renderer(camera=PerspectiveCamera(aspect=1.5, position=(40.0, 24.0, 40.0), projectionMatrix=(1.0, 0.0, 0.0, 0.…" ] }, "metadata": {}, @@ -670,8 +674,9 @@ "AnimationAction(clip=AnimationClip(duration=2.0, tracks=(NumberKeyframeTrack(name='.bones[1].rotation[x]', tim…" ] }, + "execution_count": 25, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -698,8 +703,9 @@ "AnimationAction(clip=AnimationClip(duration=2.0, tracks=(NumberKeyframeTrack(name='.bones[1].rotation[y]', tim…" ] }, + "execution_count": 26, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -716,7 +722,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -730,15 +736,15 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.9.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { - "0d3ce496-43e1-4721-b040-8e4a50f531b2": { + "01e41797-4165-4c89-9e86-3e3e419f3636": { "buffers": [ { - "data": "AAAAAAAAgD/NzEw+AACAP83MzD4AAIA/mpkZPwAAgD/NzEw/AACAPwAAgD8AAIA/AAAAAO/ubj/NzEw+7+5uP83MzD7v7m4/mpkZP+/ubj/NzEw/7+5uPwAAgD/v7m4/AAAAAN7dXT/NzEw+3t1dP83MzD7e3V0/mpkZP97dXT/NzEw/3t1dPwAAgD/e3V0/AAAAAM3MTD/NzEw+zcxMP83MzD7NzEw/mpkZP83MTD/NzEw/zcxMPwAAgD/NzEw/AAAAALy7Oz/NzEw+vLs7P83MzD68uzs/mpkZP7y7Oz/NzEw/vLs7PwAAgD+8uzs/AAAAAKuqKj/NzEw+q6oqP83MzD6rqio/mpkZP6uqKj/NzEw/q6oqPwAAgD+rqio/AAAAAJqZGT/NzEw+mpkZP83MzD6amRk/mpkZP5qZGT/NzEw/mpkZPwAAgD+amRk/AAAAAImICD/NzEw+iYgIP83MzD6JiAg/mpkZP4mICD/NzEw/iYgIPwAAgD+JiAg/AAAAAO/u7j7NzEw+7+7uPs3MzD7v7u4+mpkZP+/u7j7NzEw/7+7uPgAAgD/v7u4+AAAAAM3MzD7NzEw+zczMPs3MzD7NzMw+mpkZP83MzD7NzEw/zczMPgAAgD/NzMw+AAAAAKuqqj7NzEw+q6qqPs3MzD6rqqo+mpkZP6uqqj7NzEw/q6qqPgAAgD+rqqo+AAAAAImIiD7NzEw+iYiIPs3MzD6JiIg+mpkZP4mIiD7NzEw/iYiIPgAAgD+JiIg+AAAAAM3MTD7NzEw+zcxMPs3MzD7NzEw+mpkZP83MTD7NzEw/zcxMPgAAgD/NzEw+AAAAAImICD7NzEw+iYgIPs3MzD6JiAg+mpkZP4mICD7NzEw/iYgIPgAAgD+JiAg+AAAAAImIiD3NzEw+iYiIPc3MzD6JiIg9mpkZP4mIiD3NzEw/iYiIPQAAgD+JiIg9AAAAAAAAAADNzEw+AAAAAM3MzD4AAAAAmpkZPwAAAADNzEw/AAAAAAAAgD8AAAAA", + "data": "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", "encoding": "base64", "path": [ "array", @@ -747,24 +753,45 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { + "_view_module": null, + "_view_module_version": "", "array": { "dtype": "float32", "shape": [ - 96, - 2 + 561, + 3 ] }, "normalized": true, - "version": 1 + "version": 2 } }, - "11242342-d8f9-46a0-9b69-96ad891e4e00": { + "074520d5-22c5-4e8b-a471-7241c59d66eb": { + "model_module": "jupyter-threejs", + "model_module_version": "^2.1.0", + "model_name": "DirectionalLightShadowModel", + "state": { + "_view_module": null, + "_view_module_version": "", + "camera": "IPY_MODEL_b2988686-03dd-480e-973e-af305b937377" + } + }, + "1789e33c-ce7d-4c60-9777-690b8ff8f23c": { + "model_module": "jupyter-threejs", + "model_module_version": "^2.1.0", + "model_name": "Object3DModel", + "state": { + "_view_module": null, + "_view_module_version": "" + } + }, + "24125725-c9b3-4e5e-b4ce-2b476ee97b2f": { "buffers": [ { - "data": "AAAAAAAAgD8AAAA9AACAPwAAgD0AAIA/AADAPQAAgD8AAAA+AACAPwAAID4AAIA/AABAPgAAgD8AAGA+AACAPwAAgD4AAIA/AACQPgAAgD8AAKA+AACAPwAAsD4AAIA/AADAPgAAgD8AANA+AACAPwAA4D4AAIA/AADwPgAAgD8AAAA/AACAPwAACD8AAIA/AAAQPwAAgD8AABg/AACAPwAAID8AAIA/AAAoPwAAgD8AADA/AACAPwAAOD8AAIA/AABAPwAAgD8AAEg/AACAPwAAUD8AAIA/AABYPwAAgD8AAGA/AACAPwAAaD8AAIA/AABwPwAAgD8AAHg/AACAPwAAgD8AAIA/AAAAAAAAcD8AAAA9AABwPwAAgD0AAHA/AADAPQAAcD8AAAA+AABwPwAAID4AAHA/AABAPgAAcD8AAGA+AABwPwAAgD4AAHA/AACQPgAAcD8AAKA+AABwPwAAsD4AAHA/AADAPgAAcD8AANA+AABwPwAA4D4AAHA/AADwPgAAcD8AAAA/AABwPwAACD8AAHA/AAAQPwAAcD8AABg/AABwPwAAID8AAHA/AAAoPwAAcD8AADA/AABwPwAAOD8AAHA/AABAPwAAcD8AAEg/AABwPwAAUD8AAHA/AABYPwAAcD8AAGA/AABwPwAAaD8AAHA/AABwPwAAcD8AAHg/AABwPwAAgD8AAHA/AAAAAAAAYD8AAAA9AABgPwAAgD0AAGA/AADAPQAAYD8AAAA+AABgPwAAID4AAGA/AABAPgAAYD8AAGA+AABgPwAAgD4AAGA/AACQPgAAYD8AAKA+AABgPwAAsD4AAGA/AADAPgAAYD8AANA+AABgPwAA4D4AAGA/AADwPgAAYD8AAAA/AABgPwAACD8AAGA/AAAQPwAAYD8AABg/AABgPwAAID8AAGA/AAAoPwAAYD8AADA/AABgPwAAOD8AAGA/AABAPwAAYD8AAEg/AABgPwAAUD8AAGA/AABYPwAAYD8AAGA/AABgPwAAaD8AAGA/AABwPwAAYD8AAHg/AABgPwAAgD8AAGA/AAAAAAAAUD8AAAA9AABQPwAAgD0AAFA/AADAPQAAUD8AAAA+AABQPwAAID4AAFA/AABAPgAAUD8AAGA+AABQPwAAgD4AAFA/AACQPgAAUD8AAKA+AABQPwAAsD4AAFA/AADAPgAAUD8AANA+AABQPwAA4D4AAFA/AADwPgAAUD8AAAA/AABQPwAACD8AAFA/AAAQPwAAUD8AABg/AABQPwAAID8AAFA/AAAoPwAAUD8AADA/AABQPwAAOD8AAFA/AABAPwAAUD8AAEg/AABQPwAAUD8AAFA/AABYPwAAUD8AAGA/AABQPwAAaD8AAFA/AABwPwAAUD8AAHg/AABQPwAAgD8AAFA/AAAAAAAAQD8AAAA9AABAPwAAgD0AAEA/AADAPQAAQD8AAAA+AABAPwAAID4AAEA/AABAPgAAQD8AAGA+AABAPwAAgD4AAEA/AACQPgAAQD8AAKA+AABAPwAAsD4AAEA/AADAPgAAQD8AANA+AABAPwAA4D4AAEA/AADwPgAAQD8AAAA/AABAPwAACD8AAEA/AAAQPwAAQD8AABg/AABAPwAAID8AAEA/AAAoPwAAQD8AADA/AABAPwAAOD8AAEA/AABAPwAAQD8AAEg/AABAPwAAUD8AAEA/AABYPwAAQD8AAGA/AABAPwAAaD8AAEA/AABwPwAAQD8AAHg/AABAPwAAgD8AAEA/AAAAAAAAMD8AAAA9AAAwPwAAgD0AADA/AADAPQAAMD8AAAA+AAAwPwAAID4AADA/AABAPgAAMD8AAGA+AAAwPwAAgD4AADA/AACQPgAAMD8AAKA+AAAwPwAAsD4AADA/AADAPgAAMD8AANA+AAAwPwAA4D4AADA/AADwPgAAMD8AAAA/AAAwPwAACD8AADA/AAAQPwAAMD8AABg/AAAwPwAAID8AADA/AAAoPwAAMD8AADA/AAAwPwAAOD8AADA/AABAPwAAMD8AAEg/AAAwPwAAUD8AADA/AABYPwAAMD8AAGA/AAAwPwAAaD8AADA/AABwPwAAMD8AAHg/AAAwPwAAgD8AADA/AAAAAAAAID8AAAA9AAAgPwAAgD0AACA/AADAPQAAID8AAAA+AAAgPwAAID4AACA/AABAPgAAID8AAGA+AAAgPwAAgD4AACA/AACQPgAAID8AAKA+AAAgPwAAsD4AACA/AADAPgAAID8AANA+AAAgPwAA4D4AACA/AADwPgAAID8AAAA/AAAgPwAACD8AACA/AAAQPwAAID8AABg/AAAgPwAAID8AACA/AAAoPwAAID8AADA/AAAgPwAAOD8AACA/AABAPwAAID8AAEg/AAAgPwAAUD8AACA/AABYPwAAID8AAGA/AAAgPwAAaD8AACA/AABwPwAAID8AAHg/AAAgPwAAgD8AACA/AAAAAAAAED8AAAA9AAAQPwAAgD0AABA/AADAPQAAED8AAAA+AAAQPwAAID4AABA/AABAPgAAED8AAGA+AAAQPwAAgD4AABA/AACQPgAAED8AAKA+AAAQPwAAsD4AABA/AADAPgAAED8AANA+AAAQPwAA4D4AABA/AADwPgAAED8AAAA/AAAQPwAACD8AABA/AAAQPwAAED8AABg/AAAQPwAAID8AABA/AAAoPwAAED8AADA/AAAQPwAAOD8AABA/AABAPwAAED8AAEg/AAAQPwAAUD8AABA/AABYPwAAED8AAGA/AAAQPwAAaD8AABA/AABwPwAAED8AAHg/AAAQPwAAgD8AABA/AAAAAAAAAD8AAAA9AAAAPwAAgD0AAAA/AADAPQAAAD8AAAA+AAAAPwAAID4AAAA/AABAPgAAAD8AAGA+AAAAPwAAgD4AAAA/AACQPgAAAD8AAKA+AAAAPwAAsD4AAAA/AADAPgAAAD8AANA+AAAAPwAA4D4AAAA/AADwPgAAAD8AAAA/AAAAPwAACD8AAAA/AAAQPwAAAD8AABg/AAAAPwAAID8AAAA/AAAoPwAAAD8AADA/AAAAPwAAOD8AAAA/AABAPwAAAD8AAEg/AAAAPwAAUD8AAAA/AABYPwAAAD8AAGA/AAAAPwAAaD8AAAA/AABwPwAAAD8AAHg/AAAAPwAAgD8AAAA/AAAAAAAA4D4AAAA9AADgPgAAgD0AAOA+AADAPQAA4D4AAAA+AADgPgAAID4AAOA+AABAPgAA4D4AAGA+AADgPgAAgD4AAOA+AACQPgAA4D4AAKA+AADgPgAAsD4AAOA+AADAPgAA4D4AANA+AADgPgAA4D4AAOA+AADwPgAA4D4AAAA/AADgPgAACD8AAOA+AAAQPwAA4D4AABg/AADgPgAAID8AAOA+AAAoPwAA4D4AADA/AADgPgAAOD8AAOA+AABAPwAA4D4AAEg/AADgPgAAUD8AAOA+AABYPwAA4D4AAGA/AADgPgAAaD8AAOA+AABwPwAA4D4AAHg/AADgPgAAgD8AAOA+AAAAAAAAwD4AAAA9AADAPgAAgD0AAMA+AADAPQAAwD4AAAA+AADAPgAAID4AAMA+AABAPgAAwD4AAGA+AADAPgAAgD4AAMA+AACQPgAAwD4AAKA+AADAPgAAsD4AAMA+AADAPgAAwD4AANA+AADAPgAA4D4AAMA+AADwPgAAwD4AAAA/AADAPgAACD8AAMA+AAAQPwAAwD4AABg/AADAPgAAID8AAMA+AAAoPwAAwD4AADA/AADAPgAAOD8AAMA+AABAPwAAwD4AAEg/AADAPgAAUD8AAMA+AABYPwAAwD4AAGA/AADAPgAAaD8AAMA+AABwPwAAwD4AAHg/AADAPgAAgD8AAMA+AAAAAAAAoD4AAAA9AACgPgAAgD0AAKA+AADAPQAAoD4AAAA+AACgPgAAID4AAKA+AABAPgAAoD4AAGA+AACgPgAAgD4AAKA+AACQPgAAoD4AAKA+AACgPgAAsD4AAKA+AADAPgAAoD4AANA+AACgPgAA4D4AAKA+AADwPgAAoD4AAAA/AACgPgAACD8AAKA+AAAQPwAAoD4AABg/AACgPgAAID8AAKA+AAAoPwAAoD4AADA/AACgPgAAOD8AAKA+AABAPwAAoD4AAEg/AACgPgAAUD8AAKA+AABYPwAAoD4AAGA/AACgPgAAaD8AAKA+AABwPwAAoD4AAHg/AACgPgAAgD8AAKA+AAAAAAAAgD4AAAA9AACAPgAAgD0AAIA+AADAPQAAgD4AAAA+AACAPgAAID4AAIA+AABAPgAAgD4AAGA+AACAPgAAgD4AAIA+AACQPgAAgD4AAKA+AACAPgAAsD4AAIA+AADAPgAAgD4AANA+AACAPgAA4D4AAIA+AADwPgAAgD4AAAA/AACAPgAACD8AAIA+AAAQPwAAgD4AABg/AACAPgAAID8AAIA+AAAoPwAAgD4AADA/AACAPgAAOD8AAIA+AABAPwAAgD4AAEg/AACAPgAAUD8AAIA+AABYPwAAgD4AAGA/AACAPgAAaD8AAIA+AABwPwAAgD4AAHg/AACAPgAAgD8AAIA+AAAAAAAAQD4AAAA9AABAPgAAgD0AAEA+AADAPQAAQD4AAAA+AABAPgAAID4AAEA+AABAPgAAQD4AAGA+AABAPgAAgD4AAEA+AACQPgAAQD4AAKA+AABAPgAAsD4AAEA+AADAPgAAQD4AANA+AABAPgAA4D4AAEA+AADwPgAAQD4AAAA/AABAPgAACD8AAEA+AAAQPwAAQD4AABg/AABAPgAAID8AAEA+AAAoPwAAQD4AADA/AABAPgAAOD8AAEA+AABAPwAAQD4AAEg/AABAPgAAUD8AAEA+AABYPwAAQD4AAGA/AABAPgAAaD8AAEA+AABwPwAAQD4AAHg/AABAPgAAgD8AAEA+AAAAAAAAAD4AAAA9AAAAPgAAgD0AAAA+AADAPQAAAD4AAAA+AAAAPgAAID4AAAA+AABAPgAAAD4AAGA+AAAAPgAAgD4AAAA+AACQPgAAAD4AAKA+AAAAPgAAsD4AAAA+AADAPgAAAD4AANA+AAAAPgAA4D4AAAA+AADwPgAAAD4AAAA/AAAAPgAACD8AAAA+AAAQPwAAAD4AABg/AAAAPgAAID8AAAA+AAAoPwAAAD4AADA/AAAAPgAAOD8AAAA+AABAPwAAAD4AAEg/AAAAPgAAUD8AAAA+AABYPwAAAD4AAGA/AAAAPgAAaD8AAAA+AABwPwAAAD4AAHg/AAAAPgAAgD8AAAA+AAAAAAAAgD0AAAA9AACAPQAAgD0AAIA9AADAPQAAgD0AAAA+AACAPQAAID4AAIA9AABAPgAAgD0AAGA+AACAPQAAgD4AAIA9AACQPgAAgD0AAKA+AACAPQAAsD4AAIA9AADAPgAAgD0AANA+AACAPQAA4D4AAIA9AADwPgAAgD0AAAA/AACAPQAACD8AAIA9AAAQPwAAgD0AABg/AACAPQAAID8AAIA9AAAoPwAAgD0AADA/AACAPQAAOD8AAIA9AABAPwAAgD0AAEg/AACAPQAAUD8AAIA9AABYPwAAgD0AAGA/AACAPQAAaD8AAIA9AABwPwAAgD0AAHg/AACAPQAAgD8AAIA9AAAAAAAAAAAAAAA9AAAAAAAAgD0AAAAAAADAPQAAAAAAAAA+AAAAAAAAID4AAAAAAABAPgAAAAAAAGA+AAAAAAAAgD4AAAAAAACQPgAAAAAAAKA+AAAAAAAAsD4AAAAAAADAPgAAAAAAANA+AAAAAAAA4D4AAAAAAADwPgAAAAAAAAA/AAAAAAAACD8AAAAAAAAQPwAAAAAAABg/AAAAAAAAID8AAAAAAAAoPwAAAAAAADA/AAAAAAAAOD8AAAAAAABAPwAAAAAAAEg/AAAAAAAAUD8AAAAAAABYPwAAAAAAAGA/AAAAAAAAaD8AAAAAAABwPwAAAAAAAHg/AAAAAAAAgD8AAAAA", + "data": "AAAAAAAAgD/NzEw+AACAP83MzD4AAIA/mpkZPwAAgD/NzEw/AACAPwAAgD8AAIA/AAAAAO/ubj/NzEw+7+5uP83MzD7v7m4/mpkZP+/ubj/NzEw/7+5uPwAAgD/v7m4/AAAAAN7dXT/NzEw+3t1dP83MzD7e3V0/mpkZP97dXT/NzEw/3t1dPwAAgD/e3V0/AAAAAM3MTD/NzEw+zcxMP83MzD7NzEw/mpkZP83MTD/NzEw/zcxMPwAAgD/NzEw/AAAAALy7Oz/NzEw+vLs7P83MzD68uzs/mpkZP7y7Oz/NzEw/vLs7PwAAgD+8uzs/AAAAAKuqKj/NzEw+q6oqP83MzD6rqio/mpkZP6uqKj/NzEw/q6oqPwAAgD+rqio/AAAAAJqZGT/NzEw+mpkZP83MzD6amRk/mpkZP5qZGT/NzEw/mpkZPwAAgD+amRk/AAAAAImICD/NzEw+iYgIP83MzD6JiAg/mpkZP4mICD/NzEw/iYgIPwAAgD+JiAg/AAAAAO/u7j7NzEw+7+7uPs3MzD7v7u4+mpkZP+/u7j7NzEw/7+7uPgAAgD/v7u4+AAAAAM3MzD7NzEw+zczMPs3MzD7NzMw+mpkZP83MzD7NzEw/zczMPgAAgD/NzMw+AAAAAKuqqj7NzEw+q6qqPs3MzD6rqqo+mpkZP6uqqj7NzEw/q6qqPgAAgD+rqqo+AAAAAImIiD7NzEw+iYiIPs3MzD6JiIg+mpkZP4mIiD7NzEw/iYiIPgAAgD+JiIg+AAAAAM3MTD7NzEw+zcxMPs3MzD7NzEw+mpkZP83MTD7NzEw/zcxMPgAAgD/NzEw+AAAAAImICD7NzEw+iYgIPs3MzD6JiAg+mpkZP4mICD7NzEw/iYgIPgAAgD+JiAg+AAAAAImIiD3NzEw+iYiIPc3MzD6JiIg9mpkZP4mIiD3NzEw/iYiIPQAAgD+JiIg9AAAAAAAAAADNzEw+AAAAAM3MzD4AAAAAmpkZPwAAAADNzEw/AAAAAAAAgD8AAAAA", "encoding": "base64", "path": [ "array", @@ -773,32 +800,59 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { + "_view_module": null, + "_view_module_version": "", "array": { "dtype": "float32", "shape": [ - 561, + 96, 2 ] }, "normalized": true, - "version": 1 + "version": 2 } }, - "142291ce-ad0c-49be-8258-3c7123d1d633": { + "25217d19-3b9b-4567-87a0-548599a8d40a": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "DirectionalLightShadowModel", + "model_module_version": "^2.1.0", + "model_name": "OrthographicCameraModel", "state": { - "camera": "IPY_MODEL_a974aa85-db6d-43ad-9d34-e2f0b4d17e1c" + "_view_module": null, + "_view_module_version": "", + "bottom": -5, + "far": 500, + "left": -5, + "near": 0.5, + "projectionMatrix": [ + 0.2, + 0, + 0, + 0, + 0, + 0.2, + 0, + 0, + 0, + 0, + -0.004004004004004004, + 0, + 0, + 0, + -1.002002002002002, + 1 + ], + "right": 5, + "top": 5 } }, - "175da34b-a1b9-43f4-b4bd-dd778dd33c8b": { + "4b477487-2c5b-48c4-b924-bbb9ba0b1f96": { "buffers": [ { - "data": "AAAAAAAAyEEAAKBARiuYQAAAyEFYxcU/Xhc8QAAAyEFWcYHAXhc8wAAAyEFWcYHARiuYwAAAyEFYxcU/fn2wpgAAyEEAAKBAAAAAAFVVrUEAAKBARiuYQFVVrUFYxcU/Xhc8QFVVrUFWcYHAXhc8wFVVrUFWcYHARiuYwFVVrUFYxcU/fn2wplVVrUEAAKBAAAAAAKuqkkEAAKBARiuYQKuqkkFYxcU/Xhc8QKuqkkFWcYHAXhc8wKuqkkFWcYHARiuYwKuqkkFYxcU/fn2wpquqkkEAAKBAAAAAAAAAcEEAAKBARiuYQAAAcEFYxcU/Xhc8QAAAcEFWcYHAXhc8wAAAcEFWcYHARiuYwAAAcEFYxcU/fn2wpgAAcEEAAKBAAAAAAKuqOkEAAKBARiuYQKuqOkFYxcU/Xhc8QKuqOkFWcYHAXhc8wKuqOkFWcYHARiuYwKuqOkFYxcU/fn2wpquqOkEAAKBAAAAAAFVVBUEAAKBARiuYQFVVBUFYxcU/Xhc8QFVVBUFWcYHAXhc8wFVVBUFWcYHARiuYwFVVBUFYxcU/fn2wplVVBUEAAKBAAAAAAAAAoEAAAKBARiuYQAAAoEBYxcU/Xhc8QAAAoEBWcYHAXhc8wAAAoEBWcYHARiuYwAAAoEBYxcU/fn2wpgAAoEAAAKBAAAAAAFVV1T8AAKBARiuYQFVV1T9YxcU/Xhc8QFVV1T9WcYHAXhc8wFVV1T9WcYHARiuYwFVV1T9YxcU/fn2wplVV1T8AAKBAAAAAAFVV1b8AAKBARiuYQFVV1b9YxcU/Xhc8QFVV1b9WcYHAXhc8wFVV1b9WcYHARiuYwFVV1b9YxcU/fn2wplVV1b8AAKBAAAAAAAAAoMAAAKBARiuYQAAAoMBYxcU/Xhc8QAAAoMBWcYHAXhc8wAAAoMBWcYHARiuYwAAAoMBYxcU/fn2wpgAAoMAAAKBAAAAAAFVVBcEAAKBARiuYQFVVBcFYxcU/Xhc8QFVVBcFWcYHAXhc8wFVVBcFWcYHARiuYwFVVBcFYxcU/fn2wplVVBcEAAKBAAAAAAKuqOsEAAKBARiuYQKuqOsFYxcU/Xhc8QKuqOsFWcYHAXhc8wKuqOsFWcYHARiuYwKuqOsFYxcU/fn2wpquqOsEAAKBAAAAAAAAAcMEAAKBARiuYQAAAcMFYxcU/Xhc8QAAAcMFWcYHAXhc8wAAAcMFWcYHARiuYwAAAcMFYxcU/fn2wpgAAcMEAAKBAAAAAAKuqksEAAKBARiuYQKuqksFYxcU/Xhc8QKuqksFWcYHAXhc8wKuqksFWcYHARiuYwKuqksFYxcU/fn2wpquqksEAAKBAAAAAAFVVrcEAAKBARiuYQFVVrcFYxcU/Xhc8QFVVrcFWcYHAXhc8wFVVrcFWcYHARiuYwFVVrcFYxcU/fn2wplVVrcEAAKBAAAAAAAAAyMEAAKBARiuYQAAAyMFYxcU/Xhc8QAAAyMFWcYHAXhc8wAAAyMFWcYHARiuYwAAAyMFYxcU/fn2wpgAAyMEAAKBA", + "data": "AAAhACIAAQAiACMAAgAjACQAAwAkACUABAAlACYABQAmACcABgAnACgABwAoACkACAApACoACQAqACsACgArACwACwAsAC0ADAAtAC4ADQAuAC8ADgAvADAADwAwADEAEAAxADIAEQAyADMAEgAzADQAEwA0ADUAFAA1ADYAFQA2ADcAFgA3ADgAFwA4ADkAGAA5ADoAGQA6ADsAGgA7ADwAGwA8AD0AHAA9AD4AHQA+AD8AHgA/AEAAHwBAAEEAIgAhAEMAIQBCAEMAIwAiAEQAIgBDAEQAJAAjAEUAIwBEAEUAJQAkAEYAJABFAEYAJgAlAEcAJQBGAEcAJwAmAEgAJgBHAEgAKAAnAEkAJwBIAEkAKQAoAEoAKABJAEoAKgApAEsAKQBKAEsAKwAqAEwAKgBLAEwALAArAE0AKwBMAE0ALQAsAE4ALABNAE4ALgAtAE8ALQBOAE8ALwAuAFAALgBPAFAAMAAvAFEALwBQAFEAMQAwAFIAMABRAFIAMgAxAFMAMQBSAFMAMwAyAFQAMgBTAFQANAAzAFUAMwBUAFUANQA0AFYANABVAFYANgA1AFcANQBWAFcANwA2AFgANgBXAFgAOAA3AFkANwBYAFkAOQA4AFoAOABZAFoAOgA5AFsAOQBaAFsAOwA6AFwAOgBbAFwAPAA7AF0AOwBcAF0APQA8AF4APABdAF4APgA9AF8APQBeAF8APwA+AGAAPgBfAGAAQAA/AGEAPwBgAGEAQQBAAGIAQABhAGIAQwBCAGQAQgBjAGQARABDAGUAQwBkAGUARQBEAGYARABlAGYARgBFAGcARQBmAGcARwBGAGgARgBnAGgASABHAGkARwBoAGkASQBIAGoASABpAGoASgBJAGsASQBqAGsASwBKAGwASgBrAGwATABLAG0ASwBsAG0ATQBMAG4ATABtAG4ATgBNAG8ATQBuAG8ATwBOAHAATgBvAHAAUABPAHEATwBwAHEAUQBQAHIAUABxAHIAUgBRAHMAUQByAHMAUwBSAHQAUgBzAHQAVABTAHUAUwB0AHUAVQBUAHYAVAB1AHYAVgBVAHcAVQB2AHcAVwBWAHgAVgB3AHgAWABXAHkAVwB4AHkAWQBYAHoAWAB5AHoAWgBZAHsAWQB6AHsAWwBaAHwAWgB7AHwAXABbAH0AWwB8AH0AXQBcAH4AXAB9AH4AXgBdAH8AXQB+AH8AXwBeAIAAXgB/AIAAYABfAIEAXwCAAIEAYQBgAIIAYACBAIIAYgBhAIMAYQCCAIMAZABjAIUAYwCEAIUAZQBkAIYAZACFAIYAZgBlAIcAZQCGAIcAZwBmAIgAZgCHAIgAaABnAIkAZwCIAIkAaQBoAIoAaACJAIoAagBpAIsAaQCKAIsAawBqAIwAagCLAIwAbABrAI0AawCMAI0AbQBsAI4AbACNAI4AbgBtAI8AbQCOAI8AbwBuAJAAbgCPAJAAcABvAJEAbwCQAJEAcQBwAJIAcACRAJIAcgBxAJMAcQCSAJMAcwByAJQAcgCTAJQAdABzAJUAcwCUAJUAdQB0AJYAdACVAJYAdgB1AJcAdQCWAJcAdwB2AJgAdgCXAJgAeAB3AJkAdwCYAJkAeQB4AJoAeACZAJoAegB5AJsAeQCaAJsAewB6AJwAegCbAJwAfAB7AJ0AewCcAJ0AfQB8AJ4AfACdAJ4AfgB9AJ8AfQCeAJ8AfwB+AKAAfgCfAKAAgAB/AKEAfwCgAKEAgQCAAKIAgAChAKIAggCBAKMAgQCiAKMAgwCCAKQAggCjAKQAhQCEAKYAhAClAKYAhgCFAKcAhQCmAKcAhwCGAKgAhgCnAKgAiACHAKkAhwCoAKkAiQCIAKoAiACpAKoAigCJAKsAiQCqAKsAiwCKAKwAigCrAKwAjACLAK0AiwCsAK0AjQCMAK4AjACtAK4AjgCNAK8AjQCuAK8AjwCOALAAjgCvALAAkACPALEAjwCwALEAkQCQALIAkACxALIAkgCRALMAkQCyALMAkwCSALQAkgCzALQAlACTALUAkwC0ALUAlQCUALYAlAC1ALYAlgCVALcAlQC2ALcAlwCWALgAlgC3ALgAmACXALkAlwC4ALkAmQCYALoAmAC5ALoAmgCZALsAmQC6ALsAmwCaALwAmgC7ALwAnACbAL0AmwC8AL0AnQCcAL4AnAC9AL4AngCdAL8AnQC+AL8AnwCeAMAAngC/AMAAoACfAMEAnwDAAMEAoQCgAMIAoADBAMIAogChAMMAoQDCAMMAowCiAMQAogDDAMQApACjAMUAowDEAMUApgClAMcApQDGAMcApwCmAMgApgDHAMgAqACnAMkApwDIAMkAqQCoAMoAqADJAMoAqgCpAMsAqQDKAMsAqwCqAMwAqgDLAMwArACrAM0AqwDMAM0ArQCsAM4ArADNAM4ArgCtAM8ArQDOAM8ArwCuANAArgDPANAAsACvANEArwDQANEAsQCwANIAsADRANIAsgCxANMAsQDSANMAswCyANQAsgDTANQAtACzANUAswDUANUAtQC0ANYAtADVANYAtgC1ANcAtQDWANcAtwC2ANgAtgDXANgAuAC3ANkAtwDYANkAuQC4ANoAuADZANoAugC5ANsAuQDaANsAuwC6ANwAugDbANwAvAC7AN0AuwDcAN0AvQC8AN4AvADdAN4AvgC9AN8AvQDeAN8AvwC+AOAAvgDfAOAAwAC/AOEAvwDgAOEAwQDAAOIAwADhAOIAwgDBAOMAwQDiAOMAwwDCAOQAwgDjAOQAxADDAOUAwwDkAOUAxQDEAOYAxADlAOYAxwDGAOgAxgDnAOgAyADHAOkAxwDoAOkAyQDIAOoAyADpAOoAygDJAOsAyQDqAOsAywDKAOwAygDrAOwAzADLAO0AywDsAO0AzQDMAO4AzADtAO4AzgDNAO8AzQDuAO8AzwDOAPAAzgDvAPAA0ADPAPEAzwDwAPEA0QDQAPIA0ADxAPIA0gDRAPMA0QDyAPMA0wDSAPQA0gDzAPQA1ADTAPUA0wD0APUA1QDUAPYA1AD1APYA1gDVAPcA1QD2APcA1wDWAPgA1gD3APgA2ADXAPkA1wD4APkA2QDYAPoA2AD5APoA2gDZAPsA2QD6APsA2wDaAPwA2gD7APwA3ADbAP0A2wD8AP0A3QDcAP4A3AD9AP4A3gDdAP8A3QD+AP8A3wDeAAAB3gD/AAAB4ADfAAEB3wAAAQEB4QDgAAIB4AABAQIB4gDhAAMB4QACAQMB4wDiAAQB4gADAQQB5ADjAAUB4wAEAQUB5QDkAAYB5AAFAQYB5gDlAAcB5QAGAQcB6ADnAAkB5wAIAQkB6QDoAAoB6AAJAQoB6gDpAAsB6QAKAQsB6wDqAAwB6gALAQwB7ADrAA0B6wAMAQ0B7QDsAA4B7AANAQ4B7gDtAA8B7QAOAQ8B7wDuABAB7gAPARAB8ADvABEB7wAQAREB8QDwABIB8AARARIB8gDxABMB8QASARMB8wDyABQB8gATARQB9ADzABUB8wAUARUB9QD0ABYB9AAVARYB9gD1ABcB9QAWARcB9wD2ABgB9gAXARgB+AD3ABkB9wAYARkB+QD4ABoB+AAZARoB+gD5ABsB+QAaARsB+wD6ABwB+gAbARwB/AD7AB0B+wAcAR0B/QD8AB4B/AAdAR4B/gD9AB8B/QAeAR8B/wD+ACAB/gAfASABAAH/ACEB/wAgASEBAQEAASIBAAEhASIBAgEBASMBAQEiASMBAwECASQBAgEjASQBBAEDASUBAwEkASUBBQEEASYBBAElASYBBgEFAScBBQEmAScBBwEGASgBBgEnASgBCQEIASoBCAEpASoBCgEJASsBCQEqASsBCwEKASwBCgErASwBDAELAS0BCwEsAS0BDQEMAS4BDAEtAS4BDgENAS8BDQEuAS8BDwEOATABDgEvATABEAEPATEBDwEwATEBEQEQATIBEAExATIBEgERATMBEQEyATMBEwESATQBEgEzATQBFAETATUBEwE0ATUBFQEUATYBFAE1ATYBFgEVATcBFQE2ATcBFwEWATgBFgE3ATgBGAEXATkBFwE4ATkBGQEYAToBGAE5AToBGgEZATsBGQE6ATsBGwEaATwBGgE7ATwBHAEbAT0BGwE8AT0BHQEcAT4BHAE9AT4BHgEdAT8BHQE+AT8BHwEeAUABHgE/AUABIAEfAUEBHwFAAUEBIQEgAUIBIAFBAUIBIgEhAUMBIQFCAUMBIwEiAUQBIgFDAUQBJAEjAUUBIwFEAUUBJQEkAUYBJAFFAUYBJgElAUcBJQFGAUcBJwEmAUgBJgFHAUgBKAEnAUkBJwFIAUkBKgEpAUsBKQFKAUsBKwEqAUwBKgFLAUwBLAErAU0BKwFMAU0BLQEsAU4BLAFNAU4BLgEtAU8BLQFOAU8BLwEuAVABLgFPAVABMAEvAVEBLwFQAVEBMQEwAVIBMAFRAVIBMgExAVMBMQFSAVMBMwEyAVQBMgFTAVQBNAEzAVUBMwFUAVUBNQE0AVYBNAFVAVYBNgE1AVcBNQFWAVcBNwE2AVgBNgFXAVgBOAE3AVkBNwFYAVkBOQE4AVoBOAFZAVoBOgE5AVsBOQFaAVsBOwE6AVwBOgFbAVwBPAE7AV0BOwFcAV0BPQE8AV4BPAFdAV4BPgE9AV8BPQFeAV8BPwE+AWABPgFfAWABQAE/AWEBPwFgAWEBQQFAAWIBQAFhAWIBQgFBAWMBQQFiAWMBQwFCAWQBQgFjAWQBRAFDAWUBQwFkAWUBRQFEAWYBRAFlAWYBRgFFAWcBRQFmAWcBRwFGAWgBRgFnAWgBSAFHAWkBRwFoAWkBSQFIAWoBSAFpAWoBSwFKAWwBSgFrAWwBTAFLAW0BSwFsAW0BTQFMAW4BTAFtAW4BTgFNAW8BTQFuAW8BTwFOAXABTgFvAXABUAFPAXEBTwFwAXEBUQFQAXIBUAFxAXIBUgFRAXMBUQFyAXMBUwFSAXQBUgFzAXQBVAFTAXUBUwF0AXUBVQFUAXYBVAF1AXYBVgFVAXcBVQF2AXcBVwFWAXgBVgF3AXgBWAFXAXkBVwF4AXkBWQFYAXoBWAF5AXoBWgFZAXsBWQF6AXsBWwFaAXwBWgF7AXwBXAFbAX0BWwF8AX0BXQFcAX4BXAF9AX4BXgFdAX8BXQF+AX8BXwFeAYABXgF/AYABYAFfAYEBXwGAAYEBYQFgAYIBYAGBAYIBYgFhAYMBYQGCAYMBYwFiAYQBYgGDAYQBZAFjAYUBYwGEAYUBZQFkAYYBZAGFAYYBZgFlAYcBZQGGAYcBZwFmAYgBZgGHAYgBaAFnAYkBZwGIAYkBaQFoAYoBaAGJAYoBagFpAYsBaQGKAYsBbAFrAY0BawGMAY0BbQFsAY4BbAGNAY4BbgFtAY8BbQGOAY8BbwFuAZABbgGPAZABcAFvAZEBbwGQAZEBcQFwAZIBcAGRAZIBcgFxAZMBcQGSAZMBcwFyAZQBcgGTAZQBdAFzAZUBcwGUAZUBdQF0AZYBdAGVAZYBdgF1AZcBdQGWAZcBdwF2AZgBdgGXAZgBeAF3AZkBdwGYAZkBeQF4AZoBeAGZAZoBegF5AZsBeQGaAZsBewF6AZwBegGbAZwBfAF7AZ0BewGcAZ0BfQF8AZ4BfAGdAZ4BfgF9AZ8BfQGeAZ8BfwF+AaABfgGfAaABgAF/AaEBfwGgAaEBgQGAAaIBgAGhAaIBggGBAaMBgQGiAaMBgwGCAaQBggGjAaQBhAGDAaUBgwGkAaUBhQGEAaYBhAGlAaYBhgGFAacBhQGmAacBhwGGAagBhgGnAagBiAGHAakBhwGoAakBiQGIAaoBiAGpAaoBigGJAasBiQGqAasBiwGKAawBigGrAawBjQGMAa4BjAGtAa4BjgGNAa8BjQGuAa8BjwGOAbABjgGvAbABkAGPAbEBjwGwAbEBkQGQAbIBkAGxAbIBkgGRAbMBkQGyAbMBkwGSAbQBkgGzAbQBlAGTAbUBkwG0AbUBlQGUAbYBlAG1AbYBlgGVAbcBlQG2AbcBlwGWAbgBlgG3AbgBmAGXAbkBlwG4AbkBmQGYAboBmAG5AboBmgGZAbsBmQG6AbsBmwGaAbwBmgG7AbwBnAGbAb0BmwG8Ab0BnQGcAb4BnAG9Ab4BngGdAb8BnQG+Ab8BnwGeAcABngG/AcABoAGfAcEBnwHAAcEBoQGgAcIBoAHBAcIBogGhAcMBoQHCAcMBowGiAcQBogHDAcQBpAGjAcUBowHEAcUBpQGkAcYBpAHFAcYBpgGlAccBpQHGAccBpwGmAcgBpgHHAcgBqAGnAckBpwHIAckBqQGoAcoBqAHJAcoBqgGpAcsBqQHKAcsBqwGqAcwBqgHLAcwBrAGrAc0BqwHMAc0BrgGtAc8BrQHOAc8BrwGuAdABrgHPAdABsAGvAdEBrwHQAdEBsQGwAdIBsAHRAdIBsgGxAdMBsQHSAdMBswGyAdQBsgHTAdQBtAGzAdUBswHUAdUBtQG0AdYBtAHVAdYBtgG1AdcBtQHWAdcBtwG2AdgBtgHXAdgBuAG3AdkBtwHYAdkBuQG4AdoBuAHZAdoBugG5AdsBuQHaAdsBuwG6AdwBugHbAdwBvAG7Ad0BuwHcAd0BvQG8Ad4BvAHdAd4BvgG9Ad8BvQHeAd8BvwG+AeABvgHfAeABwAG/AeEBvwHgAeEBwQHAAeIBwAHhAeIBwgHBAeMBwQHiAeMBwwHCAeQBwgHjAeQBxAHDAeUBwwHkAeUBxQHEAeYBxAHlAeYBxgHFAecBxQHmAecBxwHGAegBxgHnAegByAHHAekBxwHoAekByQHIAeoByAHpAeoBygHJAesByQHqAesBywHKAewBygHrAewBzAHLAe0BywHsAe0BzQHMAe4BzAHtAe4BzwHOAfABzgHvAfAB0AHPAfEBzwHwAfEB0QHQAfIB0AHxAfIB0gHRAfMB0QHyAfMB0wHSAfQB0gHzAfQB1AHTAfUB0wH0AfUB1QHUAfYB1AH1AfYB1gHVAfcB1QH2AfcB1wHWAfgB1gH3AfgB2AHXAfkB1wH4AfkB2QHYAfoB2AH5AfoB2gHZAfsB2QH6AfsB2wHaAfwB2gH7AfwB3AHbAf0B2wH8Af0B3QHcAf4B3AH9Af4B3gHdAf8B3QH+Af8B3wHeAQAC3gH/AQAC4AHfAQEC3wEAAgEC4QHgAQIC4AEBAgIC4gHhAQMC4QECAgMC4wHiAQQC4gEDAgQC5AHjAQUC4wEEAgUC5QHkAQYC5AEFAgYC5gHlAQcC5QEGAgcC5wHmAQgC5gEHAggC6AHnAQkC5wEIAgkC6QHoAQoC6AEJAgoC6gHpAQsC6QEKAgsC6wHqAQwC6gELAgwC7AHrAQ0C6wEMAg0C7QHsAQ4C7AENAg4C7gHtAQ8C7QEOAg8C8AHvAREC8QHwARIC8gHxARMC8wHyARQC9AHzARUC9QH0ARYC9gH1ARcC9wH2ARgC+AH3ARkC+QH4ARoC+gH5ARsC+wH6ARwC/AH7AR0C/QH8AR4C/gH9AR8C/wH+ASACAAL/ASECAQIAAiICAgIBAiMCAwICAiQCBAIDAiUCBQIEAiYCBgIFAicCBwIGAigCCAIHAikCCQIIAioCCgIJAisCCwIKAiwCDAILAi0CDQIMAi4CDgINAi8CDwIOAjAC", "encoding": "base64", "path": [ "array", @@ -807,24 +861,26 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { + "_view_module": null, + "_view_module_version": "", "array": { - "dtype": "float32", + "dtype": "uint16", "shape": [ - 96, - 3 + 2880, + 1 ] }, "normalized": true, - "version": 1 + "version": 2 } }, - "2bd38c3d-390b-4c4e-993f-dc4160143cd7": { + "5324ed35-f945-4895-b864-365f644286d0": { "buffers": [ { - "data": "AAAhACIAAQAiACMAAgAjACQAAwAkACUABAAlACYABQAmACcABgAnACgABwAoACkACAApACoACQAqACsACgArACwACwAsAC0ADAAtAC4ADQAuAC8ADgAvADAADwAwADEAEAAxADIAEQAyADMAEgAzADQAEwA0ADUAFAA1ADYAFQA2ADcAFgA3ADgAFwA4ADkAGAA5ADoAGQA6ADsAGgA7ADwAGwA8AD0AHAA9AD4AHQA+AD8AHgA/AEAAHwBAAEEAIgAhAEMAIQBCAEMAIwAiAEQAIgBDAEQAJAAjAEUAIwBEAEUAJQAkAEYAJABFAEYAJgAlAEcAJQBGAEcAJwAmAEgAJgBHAEgAKAAnAEkAJwBIAEkAKQAoAEoAKABJAEoAKgApAEsAKQBKAEsAKwAqAEwAKgBLAEwALAArAE0AKwBMAE0ALQAsAE4ALABNAE4ALgAtAE8ALQBOAE8ALwAuAFAALgBPAFAAMAAvAFEALwBQAFEAMQAwAFIAMABRAFIAMgAxAFMAMQBSAFMAMwAyAFQAMgBTAFQANAAzAFUAMwBUAFUANQA0AFYANABVAFYANgA1AFcANQBWAFcANwA2AFgANgBXAFgAOAA3AFkANwBYAFkAOQA4AFoAOABZAFoAOgA5AFsAOQBaAFsAOwA6AFwAOgBbAFwAPAA7AF0AOwBcAF0APQA8AF4APABdAF4APgA9AF8APQBeAF8APwA+AGAAPgBfAGAAQAA/AGEAPwBgAGEAQQBAAGIAQABhAGIAQwBCAGQAQgBjAGQARABDAGUAQwBkAGUARQBEAGYARABlAGYARgBFAGcARQBmAGcARwBGAGgARgBnAGgASABHAGkARwBoAGkASQBIAGoASABpAGoASgBJAGsASQBqAGsASwBKAGwASgBrAGwATABLAG0ASwBsAG0ATQBMAG4ATABtAG4ATgBNAG8ATQBuAG8ATwBOAHAATgBvAHAAUABPAHEATwBwAHEAUQBQAHIAUABxAHIAUgBRAHMAUQByAHMAUwBSAHQAUgBzAHQAVABTAHUAUwB0AHUAVQBUAHYAVAB1AHYAVgBVAHcAVQB2AHcAVwBWAHgAVgB3AHgAWABXAHkAVwB4AHkAWQBYAHoAWAB5AHoAWgBZAHsAWQB6AHsAWwBaAHwAWgB7AHwAXABbAH0AWwB8AH0AXQBcAH4AXAB9AH4AXgBdAH8AXQB+AH8AXwBeAIAAXgB/AIAAYABfAIEAXwCAAIEAYQBgAIIAYACBAIIAYgBhAIMAYQCCAIMAZABjAIUAYwCEAIUAZQBkAIYAZACFAIYAZgBlAIcAZQCGAIcAZwBmAIgAZgCHAIgAaABnAIkAZwCIAIkAaQBoAIoAaACJAIoAagBpAIsAaQCKAIsAawBqAIwAagCLAIwAbABrAI0AawCMAI0AbQBsAI4AbACNAI4AbgBtAI8AbQCOAI8AbwBuAJAAbgCPAJAAcABvAJEAbwCQAJEAcQBwAJIAcACRAJIAcgBxAJMAcQCSAJMAcwByAJQAcgCTAJQAdABzAJUAcwCUAJUAdQB0AJYAdACVAJYAdgB1AJcAdQCWAJcAdwB2AJgAdgCXAJgAeAB3AJkAdwCYAJkAeQB4AJoAeACZAJoAegB5AJsAeQCaAJsAewB6AJwAegCbAJwAfAB7AJ0AewCcAJ0AfQB8AJ4AfACdAJ4AfgB9AJ8AfQCeAJ8AfwB+AKAAfgCfAKAAgAB/AKEAfwCgAKEAgQCAAKIAgAChAKIAggCBAKMAgQCiAKMAgwCCAKQAggCjAKQAhQCEAKYAhAClAKYAhgCFAKcAhQCmAKcAhwCGAKgAhgCnAKgAiACHAKkAhwCoAKkAiQCIAKoAiACpAKoAigCJAKsAiQCqAKsAiwCKAKwAigCrAKwAjACLAK0AiwCsAK0AjQCMAK4AjACtAK4AjgCNAK8AjQCuAK8AjwCOALAAjgCvALAAkACPALEAjwCwALEAkQCQALIAkACxALIAkgCRALMAkQCyALMAkwCSALQAkgCzALQAlACTALUAkwC0ALUAlQCUALYAlAC1ALYAlgCVALcAlQC2ALcAlwCWALgAlgC3ALgAmACXALkAlwC4ALkAmQCYALoAmAC5ALoAmgCZALsAmQC6ALsAmwCaALwAmgC7ALwAnACbAL0AmwC8AL0AnQCcAL4AnAC9AL4AngCdAL8AnQC+AL8AnwCeAMAAngC/AMAAoACfAMEAnwDAAMEAoQCgAMIAoADBAMIAogChAMMAoQDCAMMAowCiAMQAogDDAMQApACjAMUAowDEAMUApgClAMcApQDGAMcApwCmAMgApgDHAMgAqACnAMkApwDIAMkAqQCoAMoAqADJAMoAqgCpAMsAqQDKAMsAqwCqAMwAqgDLAMwArACrAM0AqwDMAM0ArQCsAM4ArADNAM4ArgCtAM8ArQDOAM8ArwCuANAArgDPANAAsACvANEArwDQANEAsQCwANIAsADRANIAsgCxANMAsQDSANMAswCyANQAsgDTANQAtACzANUAswDUANUAtQC0ANYAtADVANYAtgC1ANcAtQDWANcAtwC2ANgAtgDXANgAuAC3ANkAtwDYANkAuQC4ANoAuADZANoAugC5ANsAuQDaANsAuwC6ANwAugDbANwAvAC7AN0AuwDcAN0AvQC8AN4AvADdAN4AvgC9AN8AvQDeAN8AvwC+AOAAvgDfAOAAwAC/AOEAvwDgAOEAwQDAAOIAwADhAOIAwgDBAOMAwQDiAOMAwwDCAOQAwgDjAOQAxADDAOUAwwDkAOUAxQDEAOYAxADlAOYAxwDGAOgAxgDnAOgAyADHAOkAxwDoAOkAyQDIAOoAyADpAOoAygDJAOsAyQDqAOsAywDKAOwAygDrAOwAzADLAO0AywDsAO0AzQDMAO4AzADtAO4AzgDNAO8AzQDuAO8AzwDOAPAAzgDvAPAA0ADPAPEAzwDwAPEA0QDQAPIA0ADxAPIA0gDRAPMA0QDyAPMA0wDSAPQA0gDzAPQA1ADTAPUA0wD0APUA1QDUAPYA1AD1APYA1gDVAPcA1QD2APcA1wDWAPgA1gD3APgA2ADXAPkA1wD4APkA2QDYAPoA2AD5APoA2gDZAPsA2QD6APsA2wDaAPwA2gD7APwA3ADbAP0A2wD8AP0A3QDcAP4A3AD9AP4A3gDdAP8A3QD+AP8A3wDeAAAB3gD/AAAB4ADfAAEB3wAAAQEB4QDgAAIB4AABAQIB4gDhAAMB4QACAQMB4wDiAAQB4gADAQQB5ADjAAUB4wAEAQUB5QDkAAYB5AAFAQYB5gDlAAcB5QAGAQcB6ADnAAkB5wAIAQkB6QDoAAoB6AAJAQoB6gDpAAsB6QAKAQsB6wDqAAwB6gALAQwB7ADrAA0B6wAMAQ0B7QDsAA4B7AANAQ4B7gDtAA8B7QAOAQ8B7wDuABAB7gAPARAB8ADvABEB7wAQAREB8QDwABIB8AARARIB8gDxABMB8QASARMB8wDyABQB8gATARQB9ADzABUB8wAUARUB9QD0ABYB9AAVARYB9gD1ABcB9QAWARcB9wD2ABgB9gAXARgB+AD3ABkB9wAYARkB+QD4ABoB+AAZARoB+gD5ABsB+QAaARsB+wD6ABwB+gAbARwB/AD7AB0B+wAcAR0B/QD8AB4B/AAdAR4B/gD9AB8B/QAeAR8B/wD+ACAB/gAfASABAAH/ACEB/wAgASEBAQEAASIBAAEhASIBAgEBASMBAQEiASMBAwECASQBAgEjASQBBAEDASUBAwEkASUBBQEEASYBBAElASYBBgEFAScBBQEmAScBBwEGASgBBgEnASgBCQEIASoBCAEpASoBCgEJASsBCQEqASsBCwEKASwBCgErASwBDAELAS0BCwEsAS0BDQEMAS4BDAEtAS4BDgENAS8BDQEuAS8BDwEOATABDgEvATABEAEPATEBDwEwATEBEQEQATIBEAExATIBEgERATMBEQEyATMBEwESATQBEgEzATQBFAETATUBEwE0ATUBFQEUATYBFAE1ATYBFgEVATcBFQE2ATcBFwEWATgBFgE3ATgBGAEXATkBFwE4ATkBGQEYAToBGAE5AToBGgEZATsBGQE6ATsBGwEaATwBGgE7ATwBHAEbAT0BGwE8AT0BHQEcAT4BHAE9AT4BHgEdAT8BHQE+AT8BHwEeAUABHgE/AUABIAEfAUEBHwFAAUEBIQEgAUIBIAFBAUIBIgEhAUMBIQFCAUMBIwEiAUQBIgFDAUQBJAEjAUUBIwFEAUUBJQEkAUYBJAFFAUYBJgElAUcBJQFGAUcBJwEmAUgBJgFHAUgBKAEnAUkBJwFIAUkBKgEpAUsBKQFKAUsBKwEqAUwBKgFLAUwBLAErAU0BKwFMAU0BLQEsAU4BLAFNAU4BLgEtAU8BLQFOAU8BLwEuAVABLgFPAVABMAEvAVEBLwFQAVEBMQEwAVIBMAFRAVIBMgExAVMBMQFSAVMBMwEyAVQBMgFTAVQBNAEzAVUBMwFUAVUBNQE0AVYBNAFVAVYBNgE1AVcBNQFWAVcBNwE2AVgBNgFXAVgBOAE3AVkBNwFYAVkBOQE4AVoBOAFZAVoBOgE5AVsBOQFaAVsBOwE6AVwBOgFbAVwBPAE7AV0BOwFcAV0BPQE8AV4BPAFdAV4BPgE9AV8BPQFeAV8BPwE+AWABPgFfAWABQAE/AWEBPwFgAWEBQQFAAWIBQAFhAWIBQgFBAWMBQQFiAWMBQwFCAWQBQgFjAWQBRAFDAWUBQwFkAWUBRQFEAWYBRAFlAWYBRgFFAWcBRQFmAWcBRwFGAWgBRgFnAWgBSAFHAWkBRwFoAWkBSQFIAWoBSAFpAWoBSwFKAWwBSgFrAWwBTAFLAW0BSwFsAW0BTQFMAW4BTAFtAW4BTgFNAW8BTQFuAW8BTwFOAXABTgFvAXABUAFPAXEBTwFwAXEBUQFQAXIBUAFxAXIBUgFRAXMBUQFyAXMBUwFSAXQBUgFzAXQBVAFTAXUBUwF0AXUBVQFUAXYBVAF1AXYBVgFVAXcBVQF2AXcBVwFWAXgBVgF3AXgBWAFXAXkBVwF4AXkBWQFYAXoBWAF5AXoBWgFZAXsBWQF6AXsBWwFaAXwBWgF7AXwBXAFbAX0BWwF8AX0BXQFcAX4BXAF9AX4BXgFdAX8BXQF+AX8BXwFeAYABXgF/AYABYAFfAYEBXwGAAYEBYQFgAYIBYAGBAYIBYgFhAYMBYQGCAYMBYwFiAYQBYgGDAYQBZAFjAYUBYwGEAYUBZQFkAYYBZAGFAYYBZgFlAYcBZQGGAYcBZwFmAYgBZgGHAYgBaAFnAYkBZwGIAYkBaQFoAYoBaAGJAYoBagFpAYsBaQGKAYsBbAFrAY0BawGMAY0BbQFsAY4BbAGNAY4BbgFtAY8BbQGOAY8BbwFuAZABbgGPAZABcAFvAZEBbwGQAZEBcQFwAZIBcAGRAZIBcgFxAZMBcQGSAZMBcwFyAZQBcgGTAZQBdAFzAZUBcwGUAZUBdQF0AZYBdAGVAZYBdgF1AZcBdQGWAZcBdwF2AZgBdgGXAZgBeAF3AZkBdwGYAZkBeQF4AZoBeAGZAZoBegF5AZsBeQGaAZsBewF6AZwBegGbAZwBfAF7AZ0BewGcAZ0BfQF8AZ4BfAGdAZ4BfgF9AZ8BfQGeAZ8BfwF+AaABfgGfAaABgAF/AaEBfwGgAaEBgQGAAaIBgAGhAaIBggGBAaMBgQGiAaMBgwGCAaQBggGjAaQBhAGDAaUBgwGkAaUBhQGEAaYBhAGlAaYBhgGFAacBhQGmAacBhwGGAagBhgGnAagBiAGHAakBhwGoAakBiQGIAaoBiAGpAaoBigGJAasBiQGqAasBiwGKAawBigGrAawBjQGMAa4BjAGtAa4BjgGNAa8BjQGuAa8BjwGOAbABjgGvAbABkAGPAbEBjwGwAbEBkQGQAbIBkAGxAbIBkgGRAbMBkQGyAbMBkwGSAbQBkgGzAbQBlAGTAbUBkwG0AbUBlQGUAbYBlAG1AbYBlgGVAbcBlQG2AbcBlwGWAbgBlgG3AbgBmAGXAbkBlwG4AbkBmQGYAboBmAG5AboBmgGZAbsBmQG6AbsBmwGaAbwBmgG7AbwBnAGbAb0BmwG8Ab0BnQGcAb4BnAG9Ab4BngGdAb8BnQG+Ab8BnwGeAcABngG/AcABoAGfAcEBnwHAAcEBoQGgAcIBoAHBAcIBogGhAcMBoQHCAcMBowGiAcQBogHDAcQBpAGjAcUBowHEAcUBpQGkAcYBpAHFAcYBpgGlAccBpQHGAccBpwGmAcgBpgHHAcgBqAGnAckBpwHIAckBqQGoAcoBqAHJAcoBqgGpAcsBqQHKAcsBqwGqAcwBqgHLAcwBrAGrAc0BqwHMAc0BrgGtAc8BrQHOAc8BrwGuAdABrgHPAdABsAGvAdEBrwHQAdEBsQGwAdIBsAHRAdIBsgGxAdMBsQHSAdMBswGyAdQBsgHTAdQBtAGzAdUBswHUAdUBtQG0AdYBtAHVAdYBtgG1AdcBtQHWAdcBtwG2AdgBtgHXAdgBuAG3AdkBtwHYAdkBuQG4AdoBuAHZAdoBugG5AdsBuQHaAdsBuwG6AdwBugHbAdwBvAG7Ad0BuwHcAd0BvQG8Ad4BvAHdAd4BvgG9Ad8BvQHeAd8BvwG+AeABvgHfAeABwAG/AeEBvwHgAeEBwQHAAeIBwAHhAeIBwgHBAeMBwQHiAeMBwwHCAeQBwgHjAeQBxAHDAeUBwwHkAeUBxQHEAeYBxAHlAeYBxgHFAecBxQHmAecBxwHGAegBxgHnAegByAHHAekBxwHoAekByQHIAeoByAHpAeoBygHJAesByQHqAesBywHKAewBygHrAewBzAHLAe0BywHsAe0BzQHMAe4BzAHtAe4BzwHOAfABzgHvAfAB0AHPAfEBzwHwAfEB0QHQAfIB0AHxAfIB0gHRAfMB0QHyAfMB0wHSAfQB0gHzAfQB1AHTAfUB0wH0AfUB1QHUAfYB1AH1AfYB1gHVAfcB1QH2AfcB1wHWAfgB1gH3AfgB2AHXAfkB1wH4AfkB2QHYAfoB2AH5AfoB2gHZAfsB2QH6AfsB2wHaAfwB2gH7AfwB3AHbAf0B2wH8Af0B3QHcAf4B3AH9Af4B3gHdAf8B3QH+Af8B3wHeAQAC3gH/AQAC4AHfAQEC3wEAAgEC4QHgAQIC4AEBAgIC4gHhAQMC4QECAgMC4wHiAQQC4gEDAgQC5AHjAQUC4wEEAgUC5QHkAQYC5AEFAgYC5gHlAQcC5QEGAgcC5wHmAQgC5gEHAggC6AHnAQkC5wEIAgkC6QHoAQoC6AEJAgoC6gHpAQsC6QEKAgsC6wHqAQwC6gELAgwC7AHrAQ0C6wEMAg0C7QHsAQ4C7AENAg4C7gHtAQ8C7QEOAg8C8AHvAREC8QHwARIC8gHxARMC8wHyARQC9AHzARUC9QH0ARYC9gH1ARcC9wH2ARgC+AH3ARkC+QH4ARoC+gH5ARsC+wH6ARwC/AH7AR0C/QH8AR4C/gH9AR8C/wH+ASACAAL/ASECAQIAAiICAgIBAiMCAwICAiQCBAIDAiUCBQIEAiYCBgIFAicCBwIGAigCCAIHAikCCQIIAioCCgIJAisCCwIKAiwCDAILAi0CDQIMAi4CDgINAi8CDwIOAjAC", + "data": "AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/", "encoding": "base64", "path": [ "array", @@ -833,24 +889,26 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { + "_view_module": null, + "_view_module_version": "", "array": { - "dtype": "uint16", + "dtype": "float32", "shape": [ - 2880, - 1 + 96, + 3 ] }, "normalized": true, - "version": 1 + "version": 2 } }, - "2ed2242a-4677-47b4-b745-54a0a5fe88bf": { + "6ab23949-0fb8-42d6-806d-c64d84d14c34": { "buffers": [ { - "data": "AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/AAAAAAAAAAAAAIA/cXhzPwAAAAB6N54+GHkWPwAAAAC9G0+/GHkWvwAAAAC9G0+/cXhzvwAAAAB6N54+MjGNpQAAAAAAAIA/", + "data": "AAAAAAAAgD8AAAA9AACAPwAAgD0AAIA/AADAPQAAgD8AAAA+AACAPwAAID4AAIA/AABAPgAAgD8AAGA+AACAPwAAgD4AAIA/AACQPgAAgD8AAKA+AACAPwAAsD4AAIA/AADAPgAAgD8AANA+AACAPwAA4D4AAIA/AADwPgAAgD8AAAA/AACAPwAACD8AAIA/AAAQPwAAgD8AABg/AACAPwAAID8AAIA/AAAoPwAAgD8AADA/AACAPwAAOD8AAIA/AABAPwAAgD8AAEg/AACAPwAAUD8AAIA/AABYPwAAgD8AAGA/AACAPwAAaD8AAIA/AABwPwAAgD8AAHg/AACAPwAAgD8AAIA/AAAAAAAAcD8AAAA9AABwPwAAgD0AAHA/AADAPQAAcD8AAAA+AABwPwAAID4AAHA/AABAPgAAcD8AAGA+AABwPwAAgD4AAHA/AACQPgAAcD8AAKA+AABwPwAAsD4AAHA/AADAPgAAcD8AANA+AABwPwAA4D4AAHA/AADwPgAAcD8AAAA/AABwPwAACD8AAHA/AAAQPwAAcD8AABg/AABwPwAAID8AAHA/AAAoPwAAcD8AADA/AABwPwAAOD8AAHA/AABAPwAAcD8AAEg/AABwPwAAUD8AAHA/AABYPwAAcD8AAGA/AABwPwAAaD8AAHA/AABwPwAAcD8AAHg/AABwPwAAgD8AAHA/AAAAAAAAYD8AAAA9AABgPwAAgD0AAGA/AADAPQAAYD8AAAA+AABgPwAAID4AAGA/AABAPgAAYD8AAGA+AABgPwAAgD4AAGA/AACQPgAAYD8AAKA+AABgPwAAsD4AAGA/AADAPgAAYD8AANA+AABgPwAA4D4AAGA/AADwPgAAYD8AAAA/AABgPwAACD8AAGA/AAAQPwAAYD8AABg/AABgPwAAID8AAGA/AAAoPwAAYD8AADA/AABgPwAAOD8AAGA/AABAPwAAYD8AAEg/AABgPwAAUD8AAGA/AABYPwAAYD8AAGA/AABgPwAAaD8AAGA/AABwPwAAYD8AAHg/AABgPwAAgD8AAGA/AAAAAAAAUD8AAAA9AABQPwAAgD0AAFA/AADAPQAAUD8AAAA+AABQPwAAID4AAFA/AABAPgAAUD8AAGA+AABQPwAAgD4AAFA/AACQPgAAUD8AAKA+AABQPwAAsD4AAFA/AADAPgAAUD8AANA+AABQPwAA4D4AAFA/AADwPgAAUD8AAAA/AABQPwAACD8AAFA/AAAQPwAAUD8AABg/AABQPwAAID8AAFA/AAAoPwAAUD8AADA/AABQPwAAOD8AAFA/AABAPwAAUD8AAEg/AABQPwAAUD8AAFA/AABYPwAAUD8AAGA/AABQPwAAaD8AAFA/AABwPwAAUD8AAHg/AABQPwAAgD8AAFA/AAAAAAAAQD8AAAA9AABAPwAAgD0AAEA/AADAPQAAQD8AAAA+AABAPwAAID4AAEA/AABAPgAAQD8AAGA+AABAPwAAgD4AAEA/AACQPgAAQD8AAKA+AABAPwAAsD4AAEA/AADAPgAAQD8AANA+AABAPwAA4D4AAEA/AADwPgAAQD8AAAA/AABAPwAACD8AAEA/AAAQPwAAQD8AABg/AABAPwAAID8AAEA/AAAoPwAAQD8AADA/AABAPwAAOD8AAEA/AABAPwAAQD8AAEg/AABAPwAAUD8AAEA/AABYPwAAQD8AAGA/AABAPwAAaD8AAEA/AABwPwAAQD8AAHg/AABAPwAAgD8AAEA/AAAAAAAAMD8AAAA9AAAwPwAAgD0AADA/AADAPQAAMD8AAAA+AAAwPwAAID4AADA/AABAPgAAMD8AAGA+AAAwPwAAgD4AADA/AACQPgAAMD8AAKA+AAAwPwAAsD4AADA/AADAPgAAMD8AANA+AAAwPwAA4D4AADA/AADwPgAAMD8AAAA/AAAwPwAACD8AADA/AAAQPwAAMD8AABg/AAAwPwAAID8AADA/AAAoPwAAMD8AADA/AAAwPwAAOD8AADA/AABAPwAAMD8AAEg/AAAwPwAAUD8AADA/AABYPwAAMD8AAGA/AAAwPwAAaD8AADA/AABwPwAAMD8AAHg/AAAwPwAAgD8AADA/AAAAAAAAID8AAAA9AAAgPwAAgD0AACA/AADAPQAAID8AAAA+AAAgPwAAID4AACA/AABAPgAAID8AAGA+AAAgPwAAgD4AACA/AACQPgAAID8AAKA+AAAgPwAAsD4AACA/AADAPgAAID8AANA+AAAgPwAA4D4AACA/AADwPgAAID8AAAA/AAAgPwAACD8AACA/AAAQPwAAID8AABg/AAAgPwAAID8AACA/AAAoPwAAID8AADA/AAAgPwAAOD8AACA/AABAPwAAID8AAEg/AAAgPwAAUD8AACA/AABYPwAAID8AAGA/AAAgPwAAaD8AACA/AABwPwAAID8AAHg/AAAgPwAAgD8AACA/AAAAAAAAED8AAAA9AAAQPwAAgD0AABA/AADAPQAAED8AAAA+AAAQPwAAID4AABA/AABAPgAAED8AAGA+AAAQPwAAgD4AABA/AACQPgAAED8AAKA+AAAQPwAAsD4AABA/AADAPgAAED8AANA+AAAQPwAA4D4AABA/AADwPgAAED8AAAA/AAAQPwAACD8AABA/AAAQPwAAED8AABg/AAAQPwAAID8AABA/AAAoPwAAED8AADA/AAAQPwAAOD8AABA/AABAPwAAED8AAEg/AAAQPwAAUD8AABA/AABYPwAAED8AAGA/AAAQPwAAaD8AABA/AABwPwAAED8AAHg/AAAQPwAAgD8AABA/AAAAAAAAAD8AAAA9AAAAPwAAgD0AAAA/AADAPQAAAD8AAAA+AAAAPwAAID4AAAA/AABAPgAAAD8AAGA+AAAAPwAAgD4AAAA/AACQPgAAAD8AAKA+AAAAPwAAsD4AAAA/AADAPgAAAD8AANA+AAAAPwAA4D4AAAA/AADwPgAAAD8AAAA/AAAAPwAACD8AAAA/AAAQPwAAAD8AABg/AAAAPwAAID8AAAA/AAAoPwAAAD8AADA/AAAAPwAAOD8AAAA/AABAPwAAAD8AAEg/AAAAPwAAUD8AAAA/AABYPwAAAD8AAGA/AAAAPwAAaD8AAAA/AABwPwAAAD8AAHg/AAAAPwAAgD8AAAA/AAAAAAAA4D4AAAA9AADgPgAAgD0AAOA+AADAPQAA4D4AAAA+AADgPgAAID4AAOA+AABAPgAA4D4AAGA+AADgPgAAgD4AAOA+AACQPgAA4D4AAKA+AADgPgAAsD4AAOA+AADAPgAA4D4AANA+AADgPgAA4D4AAOA+AADwPgAA4D4AAAA/AADgPgAACD8AAOA+AAAQPwAA4D4AABg/AADgPgAAID8AAOA+AAAoPwAA4D4AADA/AADgPgAAOD8AAOA+AABAPwAA4D4AAEg/AADgPgAAUD8AAOA+AABYPwAA4D4AAGA/AADgPgAAaD8AAOA+AABwPwAA4D4AAHg/AADgPgAAgD8AAOA+AAAAAAAAwD4AAAA9AADAPgAAgD0AAMA+AADAPQAAwD4AAAA+AADAPgAAID4AAMA+AABAPgAAwD4AAGA+AADAPgAAgD4AAMA+AACQPgAAwD4AAKA+AADAPgAAsD4AAMA+AADAPgAAwD4AANA+AADAPgAA4D4AAMA+AADwPgAAwD4AAAA/AADAPgAACD8AAMA+AAAQPwAAwD4AABg/AADAPgAAID8AAMA+AAAoPwAAwD4AADA/AADAPgAAOD8AAMA+AABAPwAAwD4AAEg/AADAPgAAUD8AAMA+AABYPwAAwD4AAGA/AADAPgAAaD8AAMA+AABwPwAAwD4AAHg/AADAPgAAgD8AAMA+AAAAAAAAoD4AAAA9AACgPgAAgD0AAKA+AADAPQAAoD4AAAA+AACgPgAAID4AAKA+AABAPgAAoD4AAGA+AACgPgAAgD4AAKA+AACQPgAAoD4AAKA+AACgPgAAsD4AAKA+AADAPgAAoD4AANA+AACgPgAA4D4AAKA+AADwPgAAoD4AAAA/AACgPgAACD8AAKA+AAAQPwAAoD4AABg/AACgPgAAID8AAKA+AAAoPwAAoD4AADA/AACgPgAAOD8AAKA+AABAPwAAoD4AAEg/AACgPgAAUD8AAKA+AABYPwAAoD4AAGA/AACgPgAAaD8AAKA+AABwPwAAoD4AAHg/AACgPgAAgD8AAKA+AAAAAAAAgD4AAAA9AACAPgAAgD0AAIA+AADAPQAAgD4AAAA+AACAPgAAID4AAIA+AABAPgAAgD4AAGA+AACAPgAAgD4AAIA+AACQPgAAgD4AAKA+AACAPgAAsD4AAIA+AADAPgAAgD4AANA+AACAPgAA4D4AAIA+AADwPgAAgD4AAAA/AACAPgAACD8AAIA+AAAQPwAAgD4AABg/AACAPgAAID8AAIA+AAAoPwAAgD4AADA/AACAPgAAOD8AAIA+AABAPwAAgD4AAEg/AACAPgAAUD8AAIA+AABYPwAAgD4AAGA/AACAPgAAaD8AAIA+AABwPwAAgD4AAHg/AACAPgAAgD8AAIA+AAAAAAAAQD4AAAA9AABAPgAAgD0AAEA+AADAPQAAQD4AAAA+AABAPgAAID4AAEA+AABAPgAAQD4AAGA+AABAPgAAgD4AAEA+AACQPgAAQD4AAKA+AABAPgAAsD4AAEA+AADAPgAAQD4AANA+AABAPgAA4D4AAEA+AADwPgAAQD4AAAA/AABAPgAACD8AAEA+AAAQPwAAQD4AABg/AABAPgAAID8AAEA+AAAoPwAAQD4AADA/AABAPgAAOD8AAEA+AABAPwAAQD4AAEg/AABAPgAAUD8AAEA+AABYPwAAQD4AAGA/AABAPgAAaD8AAEA+AABwPwAAQD4AAHg/AABAPgAAgD8AAEA+AAAAAAAAAD4AAAA9AAAAPgAAgD0AAAA+AADAPQAAAD4AAAA+AAAAPgAAID4AAAA+AABAPgAAAD4AAGA+AAAAPgAAgD4AAAA+AACQPgAAAD4AAKA+AAAAPgAAsD4AAAA+AADAPgAAAD4AANA+AAAAPgAA4D4AAAA+AADwPgAAAD4AAAA/AAAAPgAACD8AAAA+AAAQPwAAAD4AABg/AAAAPgAAID8AAAA+AAAoPwAAAD4AADA/AAAAPgAAOD8AAAA+AABAPwAAAD4AAEg/AAAAPgAAUD8AAAA+AABYPwAAAD4AAGA/AAAAPgAAaD8AAAA+AABwPwAAAD4AAHg/AAAAPgAAgD8AAAA+AAAAAAAAgD0AAAA9AACAPQAAgD0AAIA9AADAPQAAgD0AAAA+AACAPQAAID4AAIA9AABAPgAAgD0AAGA+AACAPQAAgD4AAIA9AACQPgAAgD0AAKA+AACAPQAAsD4AAIA9AADAPgAAgD0AANA+AACAPQAA4D4AAIA9AADwPgAAgD0AAAA/AACAPQAACD8AAIA9AAAQPwAAgD0AABg/AACAPQAAID8AAIA9AAAoPwAAgD0AADA/AACAPQAAOD8AAIA9AABAPwAAgD0AAEg/AACAPQAAUD8AAIA9AABYPwAAgD0AAGA/AACAPQAAaD8AAIA9AABwPwAAgD0AAHg/AACAPQAAgD8AAIA9AAAAAAAAAAAAAAA9AAAAAAAAgD0AAAAAAADAPQAAAAAAAAA+AAAAAAAAID4AAAAAAABAPgAAAAAAAGA+AAAAAAAAgD4AAAAAAACQPgAAAAAAAKA+AAAAAAAAsD4AAAAAAADAPgAAAAAAANA+AAAAAAAA4D4AAAAAAADwPgAAAAAAAAA/AAAAAAAACD8AAAAAAAAQPwAAAAAAABg/AAAAAAAAID8AAAAAAAAoPwAAAAAAADA/AAAAAAAAOD8AAAAAAABAPwAAAAAAAEg/AAAAAAAAUD8AAAAAAABYPwAAAAAAAGA/AAAAAAAAaD8AAAAAAABwPwAAAAAAAHg/AAAAAAAAgD8AAAAA", "encoding": "base64", "path": [ "array", @@ -859,30 +917,45 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { + "_view_module": null, + "_view_module_version": "", "array": { "dtype": "float32", "shape": [ - 96, - 3 + 561, + 2 ] }, "normalized": true, - "version": 1 + "version": 2 } }, - "38e60e6d-b7bf-4101-a6c4-097a16b4dc8f": { + "70b40900-ea4b-4c68-9174-1e0c84aec45e": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "Object3DModel", - "state": {} + "state": { + "_view_module": null, + "_view_module_version": "" + } }, - "3d6fba05-7cce-4b48-a8d2-90cc6539d1dd": { + "8004cc94-f94a-4c20-a66d-8bf72f563dca": { + "model_module": "jupyter-threejs", + "model_module_version": "^2.1.0", + "model_name": "DirectionalLightShadowModel", + "state": { + "_view_module": null, + "_view_module_version": "", + "camera": "IPY_MODEL_25217d19-3b9b-4567-87a0-548599a8d40a" + } + }, + "83070970-b57a-4338-a85e-c3c6de38ac8c": { "buffers": [ { - "data": "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", + "data": "AAAAAAAAyEEAAKBARiuYQAAAyEFYxcU/Xhc8QAAAyEFWcYHAXhc8wAAAyEFWcYHARiuYwAAAyEFYxcU/fn2wpgAAyEEAAKBAAAAAAFVVrUEAAKBARiuYQFVVrUFYxcU/Xhc8QFVVrUFWcYHAXhc8wFVVrUFWcYHARiuYwFVVrUFYxcU/fn2wplVVrUEAAKBAAAAAAKuqkkEAAKBARiuYQKuqkkFYxcU/Xhc8QKuqkkFWcYHAXhc8wKuqkkFWcYHARiuYwKuqkkFYxcU/fn2wpquqkkEAAKBAAAAAAAAAcEEAAKBARiuYQAAAcEFYxcU/Xhc8QAAAcEFWcYHAXhc8wAAAcEFWcYHARiuYwAAAcEFYxcU/fn2wpgAAcEEAAKBAAAAAAKuqOkEAAKBARiuYQKuqOkFYxcU/Xhc8QKuqOkFWcYHAXhc8wKuqOkFWcYHARiuYwKuqOkFYxcU/fn2wpquqOkEAAKBAAAAAAFVVBUEAAKBARiuYQFVVBUFYxcU/Xhc8QFVVBUFWcYHAXhc8wFVVBUFWcYHARiuYwFVVBUFYxcU/fn2wplVVBUEAAKBAAAAAAAAAoEAAAKBARiuYQAAAoEBYxcU/Xhc8QAAAoEBWcYHAXhc8wAAAoEBWcYHARiuYwAAAoEBYxcU/fn2wpgAAoEAAAKBAAAAAAFVV1T8AAKBARiuYQFVV1T9YxcU/Xhc8QFVV1T9WcYHAXhc8wFVV1T9WcYHARiuYwFVV1T9YxcU/fn2wplVV1T8AAKBAAAAAAFVV1b8AAKBARiuYQFVV1b9YxcU/Xhc8QFVV1b9WcYHAXhc8wFVV1b9WcYHARiuYwFVV1b9YxcU/fn2wplVV1b8AAKBAAAAAAAAAoMAAAKBARiuYQAAAoMBYxcU/Xhc8QAAAoMBWcYHAXhc8wAAAoMBWcYHARiuYwAAAoMBYxcU/fn2wpgAAoMAAAKBAAAAAAFVVBcEAAKBARiuYQFVVBcFYxcU/Xhc8QFVVBcFWcYHAXhc8wFVVBcFWcYHARiuYwFVVBcFYxcU/fn2wplVVBcEAAKBAAAAAAKuqOsEAAKBARiuYQKuqOsFYxcU/Xhc8QKuqOsFWcYHAXhc8wKuqOsFWcYHARiuYwKuqOsFYxcU/fn2wpquqOsEAAKBAAAAAAAAAcMEAAKBARiuYQAAAcMFYxcU/Xhc8QAAAcMFWcYHAXhc8wAAAcMFWcYHARiuYwAAAcMFYxcU/fn2wpgAAcMEAAKBAAAAAAKuqksEAAKBARiuYQKuqksFYxcU/Xhc8QKuqksFWcYHAXhc8wKuqksFWcYHARiuYwKuqksFYxcU/fn2wpquqksEAAKBAAAAAAFVVrcEAAKBARiuYQFVVrcFYxcU/Xhc8QFVVrcFWcYHAXhc8wFVVrcFWcYHARiuYwFVVrcFYxcU/fn2wplVVrcEAAKBAAAAAAAAAyMEAAKBARiuYQAAAyMFYxcU/Xhc8QAAAyMFWcYHAXhc8wAAAyMFWcYHARiuYwAAAyMFYxcU/fn2wpgAAyMEAAKBA", "encoding": "base64", "path": [ "array", @@ -891,39 +964,48 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { + "_view_module": null, + "_view_module_version": "", "array": { "dtype": "float32", "shape": [ - 561, + 96, 3 ] }, "normalized": true, - "version": 1 + "version": 2 } }, - "4299cd67-d270-4871-af24-cf81caaf42a8": { + "90ee3645-b4cd-4946-9c53-64617fd490b6": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "Object3DModel", - "state": {} + "state": { + "_view_module": null, + "_view_module_version": "" + } }, - "47e521ae-c606-4657-a1f9-d93f1eb43b36": { + "914bc1ee-4b19-45a1-9427-1fd075c78f1a": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightShadowModel", "state": { - "camera": "IPY_MODEL_4a5b9e8e-de1c-4a88-9906-0f76b6e3668a" + "_view_module": null, + "_view_module_version": "", + "camera": "IPY_MODEL_929cf65e-82d5-40cf-9a2a-5a318ecf62f7" } }, - "4a5b9e8e-de1c-4a88-9906-0f76b6e3668a": { + "929cf65e-82d5-40cf-9a2a-5a318ecf62f7": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrthographicCameraModel", "state": { + "_view_module": null, + "_view_module_version": "", "bottom": -5, "far": 500, "left": -5, @@ -950,19 +1032,41 @@ "top": 5 } }, - "551703ef-3cac-40de-b87e-e0939d915fea": { + "a90c28ce-01fd-47aa-ae8e-50265dd0dc16": { + "buffers": [ + { + "data": "AAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAgAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAAAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAAAAAgAAAgD8AAACAwsVHvr4Uez8AAAAAFe9Dvr4Uez8M5Rs905A4vr4Uez815pg90Romvr4Uez+t+d09r0INvr4Uez+vQg0+rfndvb4Uez/RGiY+NeaYvb4Uez/TkDg+DOUbvb4Uez8V70M+n1xco74Uez/CxUc+DOUbPb4Uez8V70M+NeaYPb4Uez/TkDg+rfndPb4Uez/RGiY+r0INPr4Uez+vQg0+0RomPr4Uez+t+d0905A4Pr4Uez815pg9Fe9DPr4Uez8M5Rs9wsVHPr4Uez+fXNwjFe9DPr4Uez8M5Ru905A4Pr4Uez815pi90RomPr4Uez+t+d29r0INPr4Uez+vQg2+rfndPb4Uez/RGia+NeaYPb4Uez/TkDi+DOUbPb4Uez8V70O+d0UlJL4Uez/CxUe+DOUbvb4Uez8V70O+NeaYvb4Uez/TkDi+rfndvb4Uez/RGia+r0INvr4Uez+vQg2+0Romvr4Uez+t+d2905A4vr4Uez815pi9Fe9Dvr4Uez8M5Ru9wsVHvr4Uez+fXFykFe/Dvl6DbD8AAAAASivAvl6DbD815pg98wS1vl6DbD8a9hU+wemivl6DbD/JtVk+1IuKvl6DbD/Ui4o+ybVZvl6DbD/B6aI+GvYVvl6DbD/zBLU+NeaYvV6DbD9KK8A+qyDYo16DbD8V78M+NeaYPV6DbD9KK8A+GvYVPl6DbD/zBLU+ybVZPl6DbD/B6aI+1IuKPl6DbD/Ui4o+wemiPl6DbD/JtVk+8wS1Pl6DbD8a9hU+SivAPl6DbD815pg9Fe/DPl6DbD+rIFgkSivAPl6DbD815pi98wS1Pl6DbD8a9hW+wemiPl6DbD/JtVm+1IuKPl6DbD/Ui4q+ybVZPl6DbD/B6aK+GvYVPl6DbD/zBLW+NeaYPV6DbD9KK8C+gBiiJF6DbD8V78O+NeaYvV6DbD9KK8C+GvYVvl6DbD/zBLW+ybVZvl6DbD/B6aK+1IuKvl6DbD/Ui4q+wemivl6DbD/JtVm+8wS1vl6DbD8a9hW+SivAvl6DbD815pi9Fe/Dvl6DbD+rINik2jkOvzHbVD8AAAAAP34LvzHbVD+t+d09UWYDvzHbVD/JtVk+XoPsvjHbVD91CJ4+TiPJvjHbVD9OI8k+dQievjHbVD9eg+w+ybVZvjHbVD9RZgM/rfndvTHbVD8/fgs/Y+IcpDHbVD/aOQ4/rfndPTHbVD8/fgs/ybVZPjHbVD9RZgM/dQiePjHbVD9eg+w+TiPJPjHbVD9OI8k+XoPsPjHbVD91CJ4+UWYDPzHbVD/JtVk+P34LPzHbVD+t+d092jkOPzHbVD9j4pwkP34LPzHbVD+t+d29UWYDPzHbVD/JtVm+XoPsPjHbVD91CJ6+TiPJPjHbVD9OI8m+dQiePjHbVD9eg+y+ybVZPjHbVD9RZgO/rfndPTHbVD8/fgu/lVPrJDHbVD/aOQ6/rfndvTHbVD8/fgu/ybVZvjHbVD9RZgO/dQievjHbVD9eg+y+TiPJvjHbVD9OI8m+XoPsvjHbVD91CJ6+UWYDvzHbVD/JtVm+P34LvzHbVD+t+d292jkOvzHbVD9j4hyl8wQ1v/MENT8AAAAAhooxv/MENT+vQg0+dT0nv/MENT/Ui4o+F4MWv/MENT9OI8k+AAAAv/MENT8AAAA/TiPJvvMENT8XgxY/1IuKvvMENT91PSc/r0INvvMENT+GijE/Bq1HpPMENT/zBDU/r0INPvMENT+GijE/1IuKPvMENT91PSc/TiPJPvMENT8XgxY/AAAAP/MENT8AAAA/F4MWP/MENT9OI8k+dT0nP/MENT/Ui4o+hooxP/MENT+vQg0+8wQ1P/MENT8GrcckhooxP/MENT+vQg2+dT0nP/MENT/Ui4q+F4MWP/MENT9OI8m+AAAAP/MENT8AAAC/TiPJPvMENT8Xgxa/1IuKPvMENT91PSe/r0INPvMENT+GijG/xMEVJfMENT/zBDW/r0INvvMENT+GijG/1IuKvvMENT91PSe/TiPJvvMENT8Xgxa/AAAAv/MENT8AAAC/F4MWv/MENT9OI8m+dT0nv/MENT/Ui4q+hooxv/MENT+vQg2+8wQ1v/MENT8GrUelMdtUv9o5Dj8AAAAAKcRQv9o5Dj/RGiY+TKdEv9o5Dj/B6aI+xfswv9o5Dj9eg+w+F4MWv9o5Dj8XgxY/XoPsvto5Dj/F+zA/wemivto5Dj9Mp0Q/0Romvto5Dj8pxFA/Q8tqpNo5Dj8x21Q/0RomPto5Dj8pxFA/wemiPto5Dj9Mp0Q/XoPsPto5Dj/F+zA/F4MWP9o5Dj8XgxY/xfswP9o5Dj9eg+w+TKdEP9o5Dj/B6aI+KcRQP9o5Dj/RGiY+MdtUP9o5Dj9Dy+okKcRQP9o5Dj/RGia+TKdEP9o5Dj/B6aK+xfswP9o5Dj9eg+y+F4MWP9o5Dj8Xgxa/XoPsPto5Dj/F+zC/wemiPto5Dj9Mp0S/0RomPto5Dj8pxFC/chgwJdo5Dj8x21S/0Romvto5Dj8pxFC/wemivto5Dj9Mp0S/XoPsvto5Dj/F+zC/F4MWv9o5Dj8Xgxa/xfswv9o5Dj9eg+y+TKdEv9o5Dj/B6aK+KcRQv9o5Dj/RGia+MdtUv9o5Dj9Dy2qlXoNsvxXvwz4AAAAA+PdnvxXvwz7TkDg+eoJavxXvwz7zBLU+TKdEvxXvwz5RZgM/dT0nvxXvwz51PSc/UWYDvxXvwz5Mp0Q/8wS1vhXvwz56glo/05A4vhXvwz7492c/znGCpBXvwz5eg2w/05A4PhXvwz7492c/8wS1PhXvwz56glo/UWYDPxXvwz5Mp0Q/dT0nPxXvwz51PSc/TKdEPxXvwz5RZgM/eoJaPxXvwz7zBLU++PdnPxXvwz7TkDg+XoNsPxXvwz7OcQIl+PdnPxXvwz7TkDi+eoJaPxXvwz7zBLW+TKdEPxXvwz5RZgO/dT0nPxXvwz51PSe/UWYDPxXvwz5Mp0S/8wS1PhXvwz56glq/05A4PhXvwz7492e/tapDJRXvwz5eg2y/05A4vhXvwz7492e/8wS1vhXvwz56glq/UWYDvxXvwz5Mp0S/dT0nvxXvwz51PSe/TKdEvxXvwz5RZgO/eoJavxXvwz7zBLW++PdnvxXvwz7TkDi+XoNsvxXvwz7OcYKlvhR7v8LFRz4AAAAAr0F2v8LFRz4V70M++Pdnv8LFRz5KK8A+KcRQv8LFRz4/fgs/hooxv8LFRz6GijE/P34Lv8LFRz4pxFA/SivAvsLFRz7492c/Fe9DvsLFRz6vQXY/rXqKpMLFRz6+FHs/Fe9DPsLFRz6vQXY/SivAPsLFRz7492c/P34LP8LFRz4pxFA/hooxP8LFRz6GijE/KcRQP8LFRz4/fgs/+PdnP8LFRz5KK8A+r0F2P8LFRz4V70M+vhR7P8LFRz6tegolr0F2P8LFRz4V70O++PdnP8LFRz5KK8C+KcRQP8LFRz4/fgu/hooxP8LFRz6GijG/P34LP8LFRz4pxFC/SivAPsLFRz7492e/Fe9DPsLFRz6vQXa/A7hPJcLFRz6+FHu/Fe9DvsLFRz6vQXa/SivAvsLFRz7492e/P34Lv8LFRz4pxFC/hooxv8LFRz6GijG/KcRQv8LFRz4/fgu/+Pdnv8LFRz5KK8C+r0F2v8LFRz4V70O+vhR7v8LFRz6teoqlAACAvzIxjSQAAAAAvhR7vzIxjSTCxUc+XoNsvzIxjSQV78M+MdtUvzIxjSTaOQ4/8wQ1vzIxjSTzBDU/2jkOvzIxjSQx21Q/Fe/DvjIxjSReg2w/wsVHvjIxjSS+FHs/MjGNpDIxjSQAAIA/wsVHPjIxjSS+FHs/Fe/DPjIxjSReg2w/2jkOPzIxjSQx21Q/8wQ1PzIxjSTzBDU/MdtUPzIxjSTaOQ4/XoNsPzIxjSQV78M+vhR7PzIxjSTCxUc+AACAPzIxjSQyMQ0lvhR7PzIxjSTCxUe+XoNsPzIxjSQV78O+MdtUPzIxjSTaOQ6/8wQ1PzIxjSTzBDW/2jkOPzIxjSQx21S/Fe/DPjIxjSReg2y/wsVHPjIxjSS+FHu/yslTJTIxjSQAAIC/wsVHvjIxjSS+FHu/Fe/DvjIxjSReg2y/2jkOvzIxjSQx21S/8wQ1vzIxjSTzBDW/MdtUvzIxjSTaOQ6/XoNsvzIxjSQV78O+vhR7vzIxjSTCxUe+AACAvzIxjSQyMY2lvhR7v8LFR74AAAAAr0F2v8LFR74V70M++Pdnv8LFR75KK8A+KcRQv8LFR74/fgs/hooxv8LFR76GijE/P34Lv8LFR74pxFA/SivAvsLFR77492c/Fe9DvsLFR76vQXY/rXqKpMLFR76+FHs/Fe9DPsLFR76vQXY/SivAPsLFR77492c/P34LP8LFR74pxFA/hooxP8LFR76GijE/KcRQP8LFR74/fgs/+PdnP8LFR75KK8A+r0F2P8LFR74V70M+vhR7P8LFR76tegolr0F2P8LFR74V70O++PdnP8LFR75KK8C+KcRQP8LFR74/fgu/hooxP8LFR76GijG/P34LP8LFR74pxFC/SivAPsLFR77492e/Fe9DPsLFR76vQXa/A7hPJcLFR76+FHu/Fe9DvsLFR76vQXa/SivAvsLFR77492e/P34Lv8LFR74pxFC/hooxv8LFR76GijG/KcRQv8LFR74/fgu/+Pdnv8LFR75KK8C+r0F2v8LFR74V70O+vhR7v8LFR76teoqlXoNsvxXvw74AAAAA+PdnvxXvw77TkDg+eoJavxXvw77zBLU+TKdEvxXvw75RZgM/dT0nvxXvw751PSc/UWYDvxXvw75Mp0Q/8wS1vhXvw756glo/05A4vhXvw77492c/znGCpBXvw75eg2w/05A4PhXvw77492c/8wS1PhXvw756glo/UWYDPxXvw75Mp0Q/dT0nPxXvw751PSc/TKdEPxXvw75RZgM/eoJaPxXvw77zBLU++PdnPxXvw77TkDg+XoNsPxXvw77OcQIl+PdnPxXvw77TkDi+eoJaPxXvw77zBLW+TKdEPxXvw75RZgO/dT0nPxXvw751PSe/UWYDPxXvw75Mp0S/8wS1PhXvw756glq/05A4PhXvw77492e/tapDJRXvw75eg2y/05A4vhXvw77492e/8wS1vhXvw756glq/UWYDvxXvw75Mp0S/dT0nvxXvw751PSe/TKdEvxXvw75RZgO/eoJavxXvw77zBLW++PdnvxXvw77TkDi+XoNsvxXvw77OcYKlMdtUv9o5Dr8AAAAAKcRQv9o5Dr/RGiY+TKdEv9o5Dr/B6aI+xfswv9o5Dr9eg+w+F4MWv9o5Dr8XgxY/XoPsvto5Dr/F+zA/wemivto5Dr9Mp0Q/0Romvto5Dr8pxFA/Q8tqpNo5Dr8x21Q/0RomPto5Dr8pxFA/wemiPto5Dr9Mp0Q/XoPsPto5Dr/F+zA/F4MWP9o5Dr8XgxY/xfswP9o5Dr9eg+w+TKdEP9o5Dr/B6aI+KcRQP9o5Dr/RGiY+MdtUP9o5Dr9Dy+okKcRQP9o5Dr/RGia+TKdEP9o5Dr/B6aK+xfswP9o5Dr9eg+y+F4MWP9o5Dr8Xgxa/XoPsPto5Dr/F+zC/wemiPto5Dr9Mp0S/0RomPto5Dr8pxFC/chgwJdo5Dr8x21S/0Romvto5Dr8pxFC/wemivto5Dr9Mp0S/XoPsvto5Dr/F+zC/F4MWv9o5Dr8Xgxa/xfswv9o5Dr9eg+y+TKdEv9o5Dr/B6aK+KcRQv9o5Dr/RGia+MdtUv9o5Dr9Dy2ql8wQ1v/MENb8AAAAAhooxv/MENb+vQg0+dT0nv/MENb/Ui4o+F4MWv/MENb9OI8k+AAAAv/MENb8AAAA/TiPJvvMENb8XgxY/1IuKvvMENb91PSc/r0INvvMENb+GijE/Bq1HpPMENb/zBDU/r0INPvMENb+GijE/1IuKPvMENb91PSc/TiPJPvMENb8XgxY/AAAAP/MENb8AAAA/F4MWP/MENb9OI8k+dT0nP/MENb/Ui4o+hooxP/MENb+vQg0+8wQ1P/MENb8GrcckhooxP/MENb+vQg2+dT0nP/MENb/Ui4q+F4MWP/MENb9OI8m+AAAAP/MENb8AAAC/TiPJPvMENb8Xgxa/1IuKPvMENb91PSe/r0INPvMENb+GijG/xMEVJfMENb/zBDW/r0INvvMENb+GijG/1IuKvvMENb91PSe/TiPJvvMENb8Xgxa/AAAAv/MENb8AAAC/F4MWv/MENb9OI8m+dT0nv/MENb/Ui4q+hooxv/MENb+vQg2+8wQ1v/MENb8GrUel2jkOvzHbVL8AAAAAP34LvzHbVL+t+d09UWYDvzHbVL/JtVk+XoPsvjHbVL91CJ4+TiPJvjHbVL9OI8k+dQievjHbVL9eg+w+ybVZvjHbVL9RZgM/rfndvTHbVL8/fgs/Y+IcpDHbVL/aOQ4/rfndPTHbVL8/fgs/ybVZPjHbVL9RZgM/dQiePjHbVL9eg+w+TiPJPjHbVL9OI8k+XoPsPjHbVL91CJ4+UWYDPzHbVL/JtVk+P34LPzHbVL+t+d092jkOPzHbVL9j4pwkP34LPzHbVL+t+d29UWYDPzHbVL/JtVm+XoPsPjHbVL91CJ6+TiPJPjHbVL9OI8m+dQiePjHbVL9eg+y+ybVZPjHbVL9RZgO/rfndPTHbVL8/fgu/lVPrJDHbVL/aOQ6/rfndvTHbVL8/fgu/ybVZvjHbVL9RZgO/dQievjHbVL9eg+y+TiPJvjHbVL9OI8m+XoPsvjHbVL91CJ6+UWYDvzHbVL/JtVm+P34LvzHbVL+t+d292jkOvzHbVL9j4hylFe/Dvl6DbL8AAAAASivAvl6DbL815pg98wS1vl6DbL8a9hU+wemivl6DbL/JtVk+1IuKvl6DbL/Ui4o+ybVZvl6DbL/B6aI+GvYVvl6DbL/zBLU+NeaYvV6DbL9KK8A+qyDYo16DbL8V78M+NeaYPV6DbL9KK8A+GvYVPl6DbL/zBLU+ybVZPl6DbL/B6aI+1IuKPl6DbL/Ui4o+wemiPl6DbL/JtVk+8wS1Pl6DbL8a9hU+SivAPl6DbL815pg9Fe/DPl6DbL+rIFgkSivAPl6DbL815pi98wS1Pl6DbL8a9hW+wemiPl6DbL/JtVm+1IuKPl6DbL/Ui4q+ybVZPl6DbL/B6aK+GvYVPl6DbL/zBLW+NeaYPV6DbL9KK8C+gBiiJF6DbL8V78O+NeaYvV6DbL9KK8C+GvYVvl6DbL/zBLW+ybVZvl6DbL/B6aK+1IuKvl6DbL/Ui4q+wemivl6DbL/JtVm+8wS1vl6DbL8a9hW+SivAvl6DbL815pi9Fe/Dvl6DbL+rINikwsVHvr4Ue78AAAAAFe9Dvr4Ue78M5Rs905A4vr4Ue7815pg90Romvr4Ue7+t+d09r0INvr4Ue7+vQg0+rfndvb4Ue7/RGiY+NeaYvb4Ue7/TkDg+DOUbvb4Ue78V70M+n1xco74Ue7/CxUc+DOUbPb4Ue78V70M+NeaYPb4Ue7/TkDg+rfndPb4Ue7/RGiY+r0INPr4Ue7+vQg0+0RomPr4Ue7+t+d0905A4Pr4Ue7815pg9Fe9DPr4Ue78M5Rs9wsVHPr4Ue7+fXNwjFe9DPr4Ue78M5Ru905A4Pr4Ue7815pi90RomPr4Ue7+t+d29r0INPr4Ue7+vQg2+rfndPb4Ue7/RGia+NeaYPb4Ue7/TkDi+DOUbPb4Ue78V70O+d0UlJL4Ue7/CxUe+DOUbvb4Ue78V70O+NeaYvb4Ue7/TkDi+rfndvb4Ue7/RGia+r0INvr4Ue7+vQg2+0Romvr4Ue7+t+d2905A4vr4Ue7815pi9Fe9Dvr4Ue78M5Ru9wsVHvr4Ue7+fXFykMjENpQAAgL8AAAAArXoKpQAAgL+fXNwjznECpQAAgL+rIFgkQ8vqpAAAgL9j4pwkBq3HpAAAgL8GrcckY+KcpAAAgL9Dy+okqyBYpAAAgL/OcQIln1zcowAAgL+tegoldL4bigAAgL8yMQ0ln1zcIwAAgL+tegolqyBYJAAAgL/OcQIlY+KcJAAAgL9Dy+okBq3HJAAAgL8GrcckQ8vqJAAAgL9j4pwkznECJQAAgL+rIFgkrXoKJQAAgL+fXNwjMjENJQAAgL90vpsKrXoKJQAAgL+fXNyjznECJQAAgL+rIFikQ8vqJAAAgL9j4pykBq3HJAAAgL8GrcekY+KcJAAAgL9Dy+qkqyBYJAAAgL/OcQKln1zcIwAAgL+tegqlrp3pCgAAgL8yMQ2ln1zcowAAgL+tegqlqyBYpAAAgL/OcQKlY+KcpAAAgL9Dy+qkBq3HpAAAgL8GrcekQ8vqpAAAgL9j4pykznECpQAAgL+rIFikrXoKpQAAgL+fXNyjMjENpQAAgL90vhuL", + "encoding": "base64", + "path": [ + "array", + "buffer" + ] + } + ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "DirectionalLightShadowModel", + "model_module_version": "^2.1.0", + "model_name": "BufferAttributeModel", "state": { - "camera": "IPY_MODEL_598ae67d-a279-4811-945e-171f17024d87" + "_view_module": null, + "_view_module_version": "", + "array": { + "dtype": "float32", + "shape": [ + 561, + 3 + ] + }, + "normalized": true, + "version": 2 } }, - "598ae67d-a279-4811-945e-171f17024d87": { + "b2988686-03dd-480e-973e-af305b937377": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrthographicCameraModel", "state": { + "_view_module": null, + "_view_module_version": "", "bottom": -5, "far": 500, "left": -5, @@ -989,50 +1093,60 @@ "top": 5 } }, - "6d74a63d-2705-4a85-a356-9b7ef13d3415": { + "b5e77a95-7e84-48df-86a6-1b26055eafa7": { + "buffers": [ + { + "data": "AAAGAAEABgAHAAEABgAMAAcADAANAAcADAASAA0AEgATAA0AEgAYABMAGAAZABMAGAAeABkAHgAfABkAHgAkAB8AJAAlAB8AJAAqACUAKgArACUAKgAwACsAMAAxACsAMAA2ADEANgA3ADEANgA8ADcAPAA9ADcAPABCAD0AQgBDAD0AQgBIAEMASABJAEMASABOAEkATgBPAEkATgBUAE8AVABVAE8AVABaAFUAWgBbAFUAAQAHAAIABwAIAAIABwANAAgADQAOAAgADQATAA4AEwAUAA4AEwAZABQAGQAaABQAGQAfABoAHwAgABoAHwAlACAAJQAmACAAJQArACYAKwAsACYAKwAxACwAMQAyACwAMQA3ADIANwA4ADIANwA9ADgAPQA+ADgAPQBDAD4AQwBEAD4AQwBJAEQASQBKAEQASQBPAEoATwBQAEoATwBVAFAAVQBWAFAAVQBbAFYAWwBcAFYAAgAIAAMACAAJAAMACAAOAAkADgAPAAkADgAUAA8AFAAVAA8AFAAaABUAGgAbABUAGgAgABsAIAAhABsAIAAmACEAJgAnACEAJgAsACcALAAtACcALAAyAC0AMgAzAC0AMgA4ADMAOAA5ADMAOAA+ADkAPgA/ADkAPgBEAD8ARABFAD8ARABKAEUASgBLAEUASgBQAEsAUABRAEsAUABWAFEAVgBXAFEAVgBcAFcAXABdAFcAAwAJAAQACQAKAAQACQAPAAoADwAQAAoADwAVABAAFQAWABAAFQAbABYAGwAcABYAGwAhABwAIQAiABwAIQAnACIAJwAoACIAJwAtACgALQAuACgALQAzAC4AMwA0AC4AMwA5ADQAOQA6ADQAOQA/ADoAPwBAADoAPwBFAEAARQBGAEAARQBLAEYASwBMAEYASwBRAEwAUQBSAEwAUQBXAFIAVwBYAFIAVwBdAFgAXQBeAFgABAAKAAUACgALAAUACgAQAAsAEAARAAsAEAAWABEAFgAXABEAFgAcABcAHAAdABcAHAAiAB0AIgAjAB0AIgAoACMAKAApACMAKAAuACkALgAvACkALgA0AC8ANAA1AC8ANAA6ADUAOgA7ADUAOgBAADsAQABBADsAQABGAEEARgBHAEEARgBMAEcATABNAEcATABSAE0AUgBTAE0AUgBYAFMAWABZAFMAWABeAFkAXgBfAFkA", + "encoding": "base64", + "path": [ + "array", + "buffer" + ] + } + ], "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", + "model_name": "BufferAttributeModel", + "state": { + "_view_module": null, + "_view_module_version": "", + "array": { + "dtype": "uint16", + "shape": [ + 450, + 1 + ] + }, + "normalized": true, + "version": 2 + } + }, + "d0af0ec0-ace6-45bc-bb45-945fa0da6029": { + "model_module": "jupyter-threejs", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightShadowModel", "state": { - "camera": "IPY_MODEL_87bca44e-706f-4bb0-a8e1-2a233c0b8510" + "_view_module": null, + "_view_module_version": "", + "camera": "IPY_MODEL_edfc42a1-c9d6-4c33-b56a-c068cffe2297" } }, - "87bca44e-706f-4bb0-a8e1-2a233c0b8510": { + "d3ed8c5f-636b-4292-b363-063e2cfd843c": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "OrthographicCameraModel", + "model_module_version": "^2.1.0", + "model_name": "Object3DModel", "state": { - "bottom": -5, - "far": 500, - "left": -5, - "near": 0.5, - "projectionMatrix": [ - 0.2, - 0, - 0, - 0, - 0, - 0.2, - 0, - 0, - 0, - 0, - -0.004004004004004004, - 0, - 0, - 0, - -1.002002002002002, - 1 - ], - "right": 5, - "top": 5 + "_view_module": null, + "_view_module_version": "" } }, - "a974aa85-db6d-43ad-9d34-e2f0b4d17e1c": { + "edfc42a1-c9d6-4c33-b56a-c068cffe2297": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrthographicCameraModel", "state": { + "_view_module": null, + "_view_module_version": "", "bottom": -5, "far": 500, "left": -5, @@ -1059,76 +1173,11 @@ "top": 5 } }, - "be516a93-e440-4dc2-93e7-16defd1f7d81": { - "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "Object3DModel", - "state": {} - }, - "c2d6d53f-d1a9-461e-977b-5376cf36d941": { - "buffers": [ - { - "data": "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", - "encoding": "base64", - "path": [ - "array", - "buffer" - ] - } - ], - "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "BufferAttributeModel", - "state": { - "array": { - "dtype": "float32", - "shape": [ - 561, - 3 - ] - }, - "normalized": true, - "version": 1 - } - }, - "df9bc36f-14ba-466c-8d32-7f97afd98169": { - "buffers": [ - { - "data": "AAAGAAEABgAHAAEABgAMAAcADAANAAcADAASAA0AEgATAA0AEgAYABMAGAAZABMAGAAeABkAHgAfABkAHgAkAB8AJAAlAB8AJAAqACUAKgArACUAKgAwACsAMAAxACsAMAA2ADEANgA3ADEANgA8ADcAPAA9ADcAPABCAD0AQgBDAD0AQgBIAEMASABJAEMASABOAEkATgBPAEkATgBUAE8AVABVAE8AVABaAFUAWgBbAFUAAQAHAAIABwAIAAIABwANAAgADQAOAAgADQATAA4AEwAUAA4AEwAZABQAGQAaABQAGQAfABoAHwAgABoAHwAlACAAJQAmACAAJQArACYAKwAsACYAKwAxACwAMQAyACwAMQA3ADIANwA4ADIANwA9ADgAPQA+ADgAPQBDAD4AQwBEAD4AQwBJAEQASQBKAEQASQBPAEoATwBQAEoATwBVAFAAVQBWAFAAVQBbAFYAWwBcAFYAAgAIAAMACAAJAAMACAAOAAkADgAPAAkADgAUAA8AFAAVAA8AFAAaABUAGgAbABUAGgAgABsAIAAhABsAIAAmACEAJgAnACEAJgAsACcALAAtACcALAAyAC0AMgAzAC0AMgA4ADMAOAA5ADMAOAA+ADkAPgA/ADkAPgBEAD8ARABFAD8ARABKAEUASgBLAEUASgBQAEsAUABRAEsAUABWAFEAVgBXAFEAVgBcAFcAXABdAFcAAwAJAAQACQAKAAQACQAPAAoADwAQAAoADwAVABAAFQAWABAAFQAbABYAGwAcABYAGwAhABwAIQAiABwAIQAnACIAJwAoACIAJwAtACgALQAuACgALQAzAC4AMwA0AC4AMwA5ADQAOQA6ADQAOQA/ADoAPwBAADoAPwBFAEAARQBGAEAARQBLAEYASwBMAEYASwBRAEwAUQBSAEwAUQBXAFIAVwBYAFIAVwBdAFgAXQBeAFgABAAKAAUACgALAAUACgAQAAsAEAARAAsAEAAWABEAFgAXABEAFgAcABcAHAAdABcAHAAiAB0AIgAjAB0AIgAoACMAKAApACMAKAAuACkALgAvACkALgA0AC8ANAA1AC8ANAA6ADUAOgA7ADUAOgBAADsAQABBADsAQABGAEEARgBHAEEARgBMAEcATABNAEcATABSAE0AUgBTAE0AUgBYAFMAWABZAFMAWABeAFkAXgBfAFkA", - "encoding": "base64", - "path": [ - "array", - "buffer" - ] - } - ], - "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "BufferAttributeModel", - "state": { - "array": { - "dtype": "uint16", - "shape": [ - 450, - 1 - ] - }, - "normalized": true, - "version": 1 - } - }, - "ed20e9cd-3bd3-43ae-bf39-d4ac11e691ba": { - "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "Object3DModel", - "state": {} - }, "pythree_example_model_001": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SphereBufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "heightSegments": 16, @@ -1137,10 +1186,9 @@ }, "pythree_example_model_002": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshStandardMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "red" @@ -1148,33 +1196,29 @@ }, "pythree_example_model_003": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_001", - "material": "IPY_MODEL_pythree_example_model_002", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_002" } }, "pythree_example_model_004": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BoxBufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_005": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshPhysicalMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "green" @@ -1182,10 +1226,9 @@ }, "pythree_example_model_006": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_004", @@ -1208,7 +1251,6 @@ 4, 1 ], - "morphTargetInfluences": [], "position": [ 2, 0, @@ -1218,10 +1260,9 @@ }, "pythree_example_model_007": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PerspectiveCameraModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "aspect": 1.5, @@ -1270,10 +1311,9 @@ }, "pythree_example_model_008": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "matrixWorldNeedsUpdate": true, @@ -1282,16 +1322,15 @@ 10, 10 ], - "shadow": "IPY_MODEL_6d74a63d-2705-4a85-a356-9b7ef13d3415", - "target": "IPY_MODEL_38e60e6d-b7bf-4101-a6c4-097a16b4dc8f" + "shadow": "IPY_MODEL_d0af0ec0-ace6-45bc-bb45-945fa0da6029", + "target": "IPY_MODEL_70b40900-ea4b-4c68-9174-1e0c84aec45e" } }, "pythree_example_model_009": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AmbientLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -1316,10 +1355,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "VectorKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".position", @@ -1357,10 +1395,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "QuaternionKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".quaternion", @@ -1380,10 +1417,9 @@ }, "pythree_example_model_015": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationClipModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "duration": 5, @@ -1395,10 +1431,9 @@ }, "pythree_example_model_016": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationMixerModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "rootObject": "IPY_MODEL_pythree_example_model_007" @@ -1406,13 +1441,13 @@ }, "pythree_example_model_017": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationActionModel", "state": { "_model_module": "jupyter-threejs", - "_model_module_version": "^2.0.0", + "_model_module_version": "^2.1.0", "_model_name": "AnimationActionModel", - "_view_module_version": "^2.0.0", + "_view_module_version": "^2.1.0", "clip": "IPY_MODEL_pythree_example_model_015", "layout": "IPY_MODEL_pythree_example_model_018", "localRoot": "IPY_MODEL_pythree_example_model_007", @@ -1422,16 +1457,15 @@ }, "pythree_example_model_018": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_019": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SceneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -1445,10 +1479,9 @@ }, "pythree_example_model_020": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrbitControlsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "controlling": "IPY_MODEL_pythree_example_model_007", @@ -1460,12 +1493,11 @@ }, "pythree_example_model_021": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "RendererModel", "state": { "_height": 400, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "_width": 600, "camera": "IPY_MODEL_pythree_example_model_007", "controls": [ @@ -1478,16 +1510,15 @@ }, "pythree_example_model_022": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_023": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -1512,10 +1543,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "ColorKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".material.color", @@ -1535,10 +1565,9 @@ }, "pythree_example_model_025": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationClipModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "duration": 1.5, @@ -1549,10 +1578,9 @@ }, "pythree_example_model_026": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationMixerModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "rootObject": "IPY_MODEL_pythree_example_model_003" @@ -1560,13 +1588,13 @@ }, "pythree_example_model_027": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationActionModel", "state": { "_model_module": "jupyter-threejs", - "_model_module_version": "^2.0.0", + "_model_module_version": "^2.1.0", "_model_name": "AnimationActionModel", - "_view_module_version": "^2.0.0", + "_view_module_version": "^2.1.0", "clip": "IPY_MODEL_pythree_example_model_025", "layout": "IPY_MODEL_pythree_example_model_028", "localRoot": "IPY_MODEL_pythree_example_model_003", @@ -1576,16 +1604,15 @@ }, "pythree_example_model_028": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_029": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "ParametricGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "func": "\nfunction f(origu, origv, out) {\n // scale u and v to the ranges I want: [0, 2*pi]\n var u = 2*Math.PI*origu;\n var v = 2*Math.PI*origv;\n \n var x = Math.sin(u);\n var y = Math.cos(v);\n var z = Math.cos(u+v);\n \n out.set(x,y,z)\n}\n", @@ -1595,10 +1622,9 @@ }, "pythree_example_model_030": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshLambertMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "green" @@ -1606,23 +1632,20 @@ }, "pythree_example_model_031": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_029", - "material": "IPY_MODEL_pythree_example_model_030", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_030" } }, "pythree_example_model_032": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshLambertMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "yellow", @@ -1631,23 +1654,20 @@ }, "pythree_example_model_033": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_029", - "material": "IPY_MODEL_pythree_example_model_032", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_032" } }, "pythree_example_model_034": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "GroupModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -1658,10 +1678,9 @@ }, "pythree_example_model_035": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PerspectiveCameraModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "aspect": 1.5, @@ -1710,10 +1729,9 @@ }, "pythree_example_model_036": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "intensity": 0.6, @@ -1723,16 +1741,15 @@ 5, 1 ], - "shadow": "IPY_MODEL_551703ef-3cac-40de-b87e-e0939d915fea", - "target": "IPY_MODEL_4299cd67-d270-4871-af24-cf81caaf42a8" + "shadow": "IPY_MODEL_074520d5-22c5-4e8b-a471-7241c59d66eb", + "target": "IPY_MODEL_d3ed8c5f-636b-4292-b363-063e2cfd843c" } }, "pythree_example_model_037": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AmbientLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "intensity": 0.5 @@ -1740,10 +1757,9 @@ }, "pythree_example_model_038": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SceneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -1756,10 +1772,9 @@ }, "pythree_example_model_039": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrbitControlsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "controlling": "IPY_MODEL_pythree_example_model_035", @@ -1771,12 +1786,11 @@ }, "pythree_example_model_040": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "RendererModel", "state": { "_height": 400, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "_width": 600, "camera": "IPY_MODEL_pythree_example_model_035", "controls": [ @@ -1789,16 +1803,15 @@ }, "pythree_example_model_041": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_042": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -1823,10 +1836,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".rotation[y]", @@ -1846,10 +1858,9 @@ }, "pythree_example_model_047": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationClipModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "duration": 2, @@ -1860,10 +1871,9 @@ }, "pythree_example_model_048": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationMixerModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "rootObject": "IPY_MODEL_pythree_example_model_034" @@ -1871,13 +1881,13 @@ }, "pythree_example_model_049": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationActionModel", "state": { "_model_module": "jupyter-threejs", - "_model_module_version": "^2.0.0", + "_model_module_version": "^2.1.0", "_model_name": "AnimationActionModel", - "_view_module_version": "^2.0.0", + "_view_module_version": "^2.1.0", "clip": "IPY_MODEL_pythree_example_model_047", "layout": "IPY_MODEL_pythree_example_model_050", "localRoot": "IPY_MODEL_pythree_example_model_034", @@ -1887,16 +1897,15 @@ }, "pythree_example_model_050": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_051": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SphereBufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "heightSegments": 16, @@ -1905,18 +1914,17 @@ }, "pythree_example_model_052": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "attributes": { - "normal": "IPY_MODEL_3d6fba05-7cce-4b48-a8d2-90cc6539d1dd", - "position": "IPY_MODEL_c2d6d53f-d1a9-461e-977b-5376cf36d941", - "uv": "IPY_MODEL_11242342-d8f9-46a0-9b69-96ad891e4e00" + "normal": "IPY_MODEL_a90c28ce-01fd-47aa-ae8e-50265dd0dc16", + "position": "IPY_MODEL_01e41797-4165-4c89-9e86-3e3e419f3636", + "uv": "IPY_MODEL_6ab23949-0fb8-42d6-806d-c64d84d14c34" }, - "index": "IPY_MODEL_2bd38c3d-390b-4c4e-993f-dc4160143cd7", + "index": "IPY_MODEL_4b477487-2c5b-48c4-b924-bbb9ba0b1f96", "morphAttributes": { "position": [ "IPY_MODEL_pythree_example_model_057" @@ -1936,10 +1944,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -1955,10 +1962,9 @@ }, "pythree_example_model_058": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshPhongMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "#ff3333", @@ -1968,10 +1974,9 @@ }, "pythree_example_model_059": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_052", @@ -1998,10 +2003,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".morphTargetInfluences[0]", @@ -2021,10 +2025,9 @@ }, "pythree_example_model_061": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationClipModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "duration": 3, @@ -2035,10 +2038,9 @@ }, "pythree_example_model_062": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationMixerModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "rootObject": "IPY_MODEL_pythree_example_model_059" @@ -2046,13 +2048,13 @@ }, "pythree_example_model_063": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationActionModel", "state": { "_model_module": "jupyter-threejs", - "_model_module_version": "^2.0.0", + "_model_module_version": "^2.1.0", "_model_name": "AnimationActionModel", - "_view_module_version": "^2.0.0", + "_view_module_version": "^2.1.0", "clip": "IPY_MODEL_pythree_example_model_061", "layout": "IPY_MODEL_pythree_example_model_064", "localRoot": "IPY_MODEL_pythree_example_model_059", @@ -2062,16 +2064,15 @@ }, "pythree_example_model_064": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_065": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PerspectiveCameraModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "aspect": 1.5, @@ -2120,10 +2121,9 @@ }, "pythree_example_model_066": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "intensity": 0.6, @@ -2133,16 +2133,15 @@ 5, 1 ], - "shadow": "IPY_MODEL_47e521ae-c606-4657-a1f9-d93f1eb43b36", - "target": "IPY_MODEL_ed20e9cd-3bd3-43ae-bf39-d4ac11e691ba" + "shadow": "IPY_MODEL_914bc1ee-4b19-45a1-9427-1fd075c78f1a", + "target": "IPY_MODEL_1789e33c-ce7d-4c60-9777-690b8ff8f23c" } }, "pythree_example_model_067": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AmbientLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "intensity": 0.5 @@ -2150,10 +2149,9 @@ }, "pythree_example_model_068": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SceneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -2166,10 +2164,9 @@ }, "pythree_example_model_069": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrbitControlsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "controlling": "IPY_MODEL_pythree_example_model_065", @@ -2181,12 +2178,11 @@ }, "pythree_example_model_070": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "RendererModel", "state": { "_height": 400, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "_width": 600, "camera": "IPY_MODEL_pythree_example_model_065", "controls": [ @@ -2199,58 +2195,55 @@ }, "pythree_example_model_071": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_072": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_076": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "CylinderBufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "height": 50, "heightSegments": 15, "openEnded": true, - "radiusBottom": 5, "radialSegments": 5, + "radiusBottom": 5, "radiusTop": 5 } }, "pythree_example_model_077": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "attributes": { - "normal": "IPY_MODEL_2ed2242a-4677-47b4-b745-54a0a5fe88bf", - "position": "IPY_MODEL_175da34b-a1b9-43f4-b4bd-dd778dd33c8b", + "normal": "IPY_MODEL_5324ed35-f945-4895-b864-365f644286d0", + "position": "IPY_MODEL_83070970-b57a-4338-a85e-c3c6de38ac8c", "skinIndex": "IPY_MODEL_pythree_example_model_082", "skinWeight": "IPY_MODEL_pythree_example_model_083", - "uv": "IPY_MODEL_0d3ce496-43e1-4721-b040-8e4a50f531b2" + "uv": "IPY_MODEL_24125725-c9b3-4e5e-b4ce-2b476ee97b2f" }, - "index": "IPY_MODEL_df9bc36f-14ba-466c-8d32-7f97afd98169" + "index": "IPY_MODEL_b5e77a95-7e84-48df-86a6-1b26055eafa7" } }, "pythree_example_model_082": { "buffers": [ { - "data": "AAAAQAAAQEAAAAAAAAAAAAAAAEAAAEBAAAAAAAAAAAAAAABAAABAQAAAAAAAAAAAAAAAQAAAQEAAAAAAAAAAAAAAAEAAAEBAAAAAAAAAAAAAAABAAABAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAAAAAAgAAAgD8AAAAAAAAAAAAAAIAAAIA/AAAAAAAAAAAAAACAAACAPwAAAAAAAAAA", + "data": "AAAAQAAAQEAAAAAAAAAAAAAAAEAAAEBAAAAAAAAAAAAAAABAAABAQAAAAAAAAAAAAAAAQAAAQEAAAAAAAAAAAAAAAEAAAEBAAAAAAAAAAAAAAABAAABAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAACAPwAAAEAAAAAAAAAAAAAAgD8AAABAAAAAAAAAAAAAAIA/AAAAQAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAA", "encoding": "base64", "path": [ "array", @@ -2259,10 +2252,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -2288,10 +2280,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -2307,10 +2298,9 @@ }, "pythree_example_model_084": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BoneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -2343,10 +2333,9 @@ }, "pythree_example_model_085": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BoneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -2379,10 +2368,9 @@ }, "pythree_example_model_086": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BoneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "matrix": [ @@ -2412,10 +2400,9 @@ }, "pythree_example_model_087": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SkeletonModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "bones": [ @@ -2427,10 +2414,9 @@ }, "pythree_example_model_088": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshPhongMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "side": "DoubleSide", @@ -2439,10 +2425,9 @@ }, "pythree_example_model_089": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SkinnedMeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -2450,16 +2435,14 @@ ], "geometry": "IPY_MODEL_pythree_example_model_077", "material": "IPY_MODEL_pythree_example_model_088", - "morphTargetInfluences": [], "skeleton": "IPY_MODEL_pythree_example_model_087" } }, "pythree_example_model_090": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SkeletonHelperModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "root": "IPY_MODEL_pythree_example_model_089", @@ -2486,10 +2469,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".bones[1].rotation[x]", @@ -2527,10 +2509,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".bones[1].rotation[z]", @@ -2568,10 +2549,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".bones[2].rotation[x]", @@ -2609,10 +2589,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".bones[2].rotation[z]", @@ -2632,10 +2611,9 @@ }, "pythree_example_model_095": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationClipModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "duration": 2, @@ -2649,10 +2627,9 @@ }, "pythree_example_model_096": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationMixerModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "rootObject": "IPY_MODEL_pythree_example_model_089" @@ -2660,13 +2637,13 @@ }, "pythree_example_model_097": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationActionModel", "state": { "_model_module": "jupyter-threejs", - "_model_module_version": "^2.0.0", + "_model_module_version": "^2.1.0", "_model_name": "AnimationActionModel", - "_view_module_version": "^2.0.0", + "_view_module_version": "^2.1.0", "clip": "IPY_MODEL_pythree_example_model_095", "layout": "IPY_MODEL_pythree_example_model_098", "localRoot": "IPY_MODEL_pythree_example_model_089", @@ -2676,7 +2653,7 @@ }, "pythree_example_model_098": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, @@ -2700,10 +2677,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".bones[1].rotation[y]", @@ -2741,10 +2717,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "NumberKeyframeTrackModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "name": ".bones[2].rotation[y]", @@ -2764,10 +2739,9 @@ }, "pythree_example_model_101": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationClipModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "duration": 2, @@ -2779,10 +2753,9 @@ }, "pythree_example_model_102": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationMixerModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "rootObject": "IPY_MODEL_pythree_example_model_089" @@ -2790,13 +2763,13 @@ }, "pythree_example_model_103": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AnimationActionModel", "state": { "_model_module": "jupyter-threejs", - "_model_module_version": "^2.0.0", + "_model_module_version": "^2.1.0", "_model_name": "AnimationActionModel", - "_view_module_version": "^2.0.0", + "_view_module_version": "^2.1.0", "clip": "IPY_MODEL_pythree_example_model_101", "layout": "IPY_MODEL_pythree_example_model_104", "localRoot": "IPY_MODEL_pythree_example_model_089", @@ -2806,16 +2779,15 @@ }, "pythree_example_model_104": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_105": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PerspectiveCameraModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "aspect": 1.5, @@ -2864,10 +2836,9 @@ }, "pythree_example_model_106": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "intensity": 0.6, @@ -2877,16 +2848,15 @@ 5, 1 ], - "shadow": "IPY_MODEL_142291ce-ad0c-49be-8258-3c7123d1d633", - "target": "IPY_MODEL_be516a93-e440-4dc2-93e7-16defd1f7d81" + "shadow": "IPY_MODEL_8004cc94-f94a-4c20-a66d-8bf72f563dca", + "target": "IPY_MODEL_90ee3645-b4cd-4946-9c53-64617fd490b6" } }, "pythree_example_model_107": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AmbientLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "intensity": 0.5 @@ -2894,10 +2864,9 @@ }, "pythree_example_model_108": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SceneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -2911,10 +2880,9 @@ }, "pythree_example_model_109": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrbitControlsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "controlling": "IPY_MODEL_pythree_example_model_105", @@ -2926,12 +2894,11 @@ }, "pythree_example_model_110": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "RendererModel", "state": { "_height": 400, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "_width": 600, "camera": "IPY_MODEL_pythree_example_model_105", "controls": [ @@ -2944,16 +2911,15 @@ }, "pythree_example_model_111": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_112": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -2965,5 +2931,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/Geometries.ipynb b/examples/Geometries.ipynb index 9434ea82..24a91514 100644 --- a/examples/Geometries.ipynb +++ b/examples/Geometries.ipynb @@ -42,11 +42,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=BoxGeometry(depth=15.0, depthSegments=15, height=10.0, heightSegments=10, width=5.0, widthSegmen…" + "BoxGeometry(depth=15.0, depthSegments=15, height=10.0, heightSegments=10, width=5.0, widthSegments=5)" ] }, + "execution_count": 3, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -72,11 +73,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=BoxBufferGeometry(depth=15.0, depthSegments=15, height=10.0, heightSegments=10, width=5.0, width…" + "BoxBufferGeometry(depth=15.0, depthSegments=15, height=10.0, heightSegments=10, width=5.0, widthSegments=5)" ] }, + "execution_count": 4, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -102,11 +104,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=CircleGeometry(radius=10.0, segments=10, thetaLength=5.0, thetaStart=0.25), shadowMap=WebGLShado…" + "CircleGeometry(radius=10.0, segments=10, thetaLength=5.0, thetaStart=0.25)" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -130,11 +133,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=CircleBufferGeometry(radius=10.0, segments=10, thetaLength=5.0, thetaStart=0.25), shadowMap=WebG…" + "CircleBufferGeometry(radius=10.0, segments=10, thetaLength=5.0, thetaStart=0.25)" ] }, + "execution_count": 6, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -158,11 +162,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=CylinderGeometry(height=15.0, heightSegments=10, radialSegments=6, radiusBottom=10.0, radiusTop=…" + "CylinderGeometry(height=15.0, heightSegments=10, radialSegments=6, radiusBottom=10.0, radiusTop=5.0)" ] }, + "execution_count": 7, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -190,11 +195,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=CylinderBufferGeometry(height=15.0, heightSegments=10, radialSegments=6, radiusBottom=10.0, radi…" + "CylinderBufferGeometry(height=15.0, heightSegments=10, radialSegments=6, radiusBottom=10.0, radiusTop=5.0)" ] }, + "execution_count": 8, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -222,11 +228,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=DodecahedronGeometry(radius=10.0), shadowMap=WebGLShadowMap())" + "DodecahedronGeometry(radius=10.0)" ] }, + "execution_count": 9, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -247,11 +254,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=LineSegments(geometry=EdgesGeometry(geometry=DodecahedronGeometry(radius=10.0)), material=LineBa…" + "LineSegments(geometry=EdgesGeometry(geometry=DodecahedronGeometry(radius=10.0)), material=LineBasicMaterial(),…" ] }, + "execution_count": 10, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -284,11 +292,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=IcosahedronGeometry(radius=10.0), shadowMap=WebGLShadowMap())" + "IcosahedronGeometry(radius=10.0)" ] }, + "execution_count": 11, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -308,11 +317,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=LatheBufferGeometry(points=[[0, -10, 0], [10, -5, 0], [5, 5, 0], [0, 10, 0]], segments=16), shad…" + "LatheBufferGeometry(points=[[0, -10, 0], [10, -5, 0], [5, 5, 0], [0, 10, 0]], segments=16)" ] }, + "execution_count": 12, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -341,11 +351,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=OctahedronGeometry(radius=10.0), shadowMap=WebGLShadowMap())" + "OctahedronGeometry(radius=10.0)" ] }, + "execution_count": 13, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -365,11 +376,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=ParametricGeometry(func='function(u,v,out) { \\n var x = 5 * (0.5 - u);\\n var y = 5…" + "ParametricGeometry(func='function(u,v,out) { \\n var x = 5 * (0.5 - u);\\n var y = 5 * (0.5 - v);\\…" ] }, + "execution_count": 14, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -396,11 +408,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=PlaneGeometry(height=15.0, heightSegments=10, width=10.0, widthSegments=5), shadowMap=WebGLShado…" + "PlaneGeometry(height=15.0, heightSegments=10, width=10.0, widthSegments=5)" ] }, + "execution_count": 15, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -424,11 +437,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=PlaneBufferGeometry(height=15.0, heightSegments=10, width=10.0, widthSegments=5), shadowMap=WebG…" + "PlaneBufferGeometry(height=15.0, heightSegments=10, width=10.0, widthSegments=5)" ] }, + "execution_count": 16, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -462,11 +476,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=RingGeometry(innerRadius=10.0, outerRadius=25.0, phiSegments=12), shadowMap=WebGLShadowMap())" + "RingGeometry(innerRadius=10.0, outerRadius=25.0, phiSegments=12)" ] }, + "execution_count": 17, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -493,11 +508,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=RingBufferGeometry(innerRadius=10.0, outerRadius=25.0, phiSegments=12), shadowMap=WebGLShadowMap…" + "RingBufferGeometry(innerRadius=10.0, outerRadius=25.0, phiSegments=12)" ] }, + "execution_count": 18, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -534,11 +550,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=SphereGeometry(phiLength=4.71238898038469, radius=20.0, thetaLength=2.0943951023931953), shadowM…" + "SphereGeometry(phiLength=4.71238898038469, radius=20.0, thetaLength=2.0943951023931953)" ] }, + "execution_count": 19, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -565,11 +582,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=SphereBufferGeometry(phiLength=4.71238898038469, radius=20.0, thetaLength=2.0943951023931953), s…" + "SphereBufferGeometry(phiLength=4.71238898038469, radius=20.0, thetaLength=2.0943951023931953)" ] }, + "execution_count": 20, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -596,11 +614,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=TetrahedronGeometry(detail=1, radius=10.0), shadowMap=WebGLShadowMap())" + "TetrahedronGeometry(detail=1, radius=10.0)" ] }, + "execution_count": 21, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -630,11 +649,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=TorusGeometry(arc=4.71238898038469, radialSegments=20, radius=20.0, tube=5.0), shadowMap=WebGLSh…" + "TorusGeometry(arc=4.71238898038469, radialSegments=20, radius=20.0, tube=5.0)" ] }, + "execution_count": 22, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -659,11 +679,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=TorusBufferGeometry(radius=100.0), shadowMap=WebGLShadowMap())" + "TorusBufferGeometry(radius=100.0)" ] }, + "execution_count": 23, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -683,11 +704,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=TorusKnotGeometry(radius=20.0, tube=5.0), shadowMap=WebGLShadowMap())" + "TorusKnotGeometry(radius=20.0, tube=5.0)" ] }, + "execution_count": 24, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -713,11 +735,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=TorusKnotBufferGeometry(radius=20.0, tube=5.0), shadowMap=WebGLShadowMap())" + "TorusKnotBufferGeometry(radius=20.0, tube=5.0)" ] }, + "execution_count": 25, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -758,11 +781,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=WireframeGeometry(geometry=TorusBufferGeometry(radialSegments=6, radius=20.0, tube=5.0, tubularS…" + "WireframeGeometry(geometry=TorusBufferGeometry(radialSegments=6, radius=20.0, tube=5.0, tubularSegments=20))" ] }, + "execution_count": 26, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -786,7 +810,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -800,14 +824,14 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.9.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "pythree_example_model_001": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "BoxGeometryModel", "state": { "_view_module": null, @@ -822,10 +846,11 @@ }, "pythree_example_model_002": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_001", "layout": "IPY_MODEL_pythree_example_model_003", "shadowMap": "IPY_MODEL_pythree_example_model_004" @@ -833,13 +858,13 @@ }, "pythree_example_model_003": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_004": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -848,7 +873,7 @@ }, "pythree_example_model_005": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "BoxBufferGeometryModel", "state": { "_view_module": null, @@ -863,10 +888,11 @@ }, "pythree_example_model_006": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_005", "layout": "IPY_MODEL_pythree_example_model_007", "shadowMap": "IPY_MODEL_pythree_example_model_008" @@ -874,13 +900,13 @@ }, "pythree_example_model_007": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_008": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -889,7 +915,7 @@ }, "pythree_example_model_009": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "CircleGeometryModel", "state": { "_view_module": null, @@ -902,10 +928,11 @@ }, "pythree_example_model_010": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_009", "layout": "IPY_MODEL_pythree_example_model_011", "shadowMap": "IPY_MODEL_pythree_example_model_012" @@ -913,13 +940,13 @@ }, "pythree_example_model_011": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_012": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -928,7 +955,7 @@ }, "pythree_example_model_013": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "CircleBufferGeometryModel", "state": { "_view_module": null, @@ -941,10 +968,11 @@ }, "pythree_example_model_014": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_013", "layout": "IPY_MODEL_pythree_example_model_015", "shadowMap": "IPY_MODEL_pythree_example_model_016" @@ -952,13 +980,13 @@ }, "pythree_example_model_015": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_016": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -967,7 +995,7 @@ }, "pythree_example_model_017": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "CylinderGeometryModel", "state": { "_view_module": null, @@ -981,10 +1009,11 @@ }, "pythree_example_model_018": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_017", "layout": "IPY_MODEL_pythree_example_model_019", "shadowMap": "IPY_MODEL_pythree_example_model_020" @@ -992,13 +1021,13 @@ }, "pythree_example_model_019": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_020": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1007,7 +1036,7 @@ }, "pythree_example_model_021": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "CylinderBufferGeometryModel", "state": { "_view_module": null, @@ -1021,10 +1050,11 @@ }, "pythree_example_model_022": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_021", "layout": "IPY_MODEL_pythree_example_model_023", "shadowMap": "IPY_MODEL_pythree_example_model_024" @@ -1032,13 +1062,13 @@ }, "pythree_example_model_023": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_024": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1047,7 +1077,7 @@ }, "pythree_example_model_025": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "DodecahedronGeometryModel", "state": { "_view_module": null, @@ -1057,10 +1087,11 @@ }, "pythree_example_model_026": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_025", "layout": "IPY_MODEL_pythree_example_model_027", "shadowMap": "IPY_MODEL_pythree_example_model_028" @@ -1068,13 +1099,13 @@ }, "pythree_example_model_027": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_028": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1083,7 +1114,7 @@ }, "pythree_example_model_029": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "EdgesGeometryModel", "state": { "_view_module": null, @@ -1093,7 +1124,7 @@ }, "pythree_example_model_030": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "LineBasicMaterialModel", "state": { "_view_module": null, @@ -1102,7 +1133,7 @@ }, "pythree_example_model_031": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "LineSegmentsModel", "state": { "_view_module": null, @@ -1113,10 +1144,11 @@ }, "pythree_example_model_032": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_031", "layout": "IPY_MODEL_pythree_example_model_033", "shadowMap": "IPY_MODEL_pythree_example_model_034" @@ -1124,13 +1156,13 @@ }, "pythree_example_model_033": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_034": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1139,7 +1171,7 @@ }, "pythree_example_model_035": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "IcosahedronGeometryModel", "state": { "_view_module": null, @@ -1149,10 +1181,11 @@ }, "pythree_example_model_036": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_035", "layout": "IPY_MODEL_pythree_example_model_037", "shadowMap": "IPY_MODEL_pythree_example_model_038" @@ -1160,13 +1193,13 @@ }, "pythree_example_model_037": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_038": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1175,7 +1208,7 @@ }, "pythree_example_model_039": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "LatheBufferGeometryModel", "state": { "_view_module": null, @@ -1207,10 +1240,11 @@ }, "pythree_example_model_040": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_039", "layout": "IPY_MODEL_pythree_example_model_041", "shadowMap": "IPY_MODEL_pythree_example_model_042" @@ -1218,13 +1252,13 @@ }, "pythree_example_model_041": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_042": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1233,7 +1267,7 @@ }, "pythree_example_model_043": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "OctahedronGeometryModel", "state": { "_view_module": null, @@ -1243,10 +1277,11 @@ }, "pythree_example_model_044": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_043", "layout": "IPY_MODEL_pythree_example_model_045", "shadowMap": "IPY_MODEL_pythree_example_model_046" @@ -1254,13 +1289,13 @@ }, "pythree_example_model_045": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_046": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1269,7 +1304,7 @@ }, "pythree_example_model_047": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "ParametricGeometryModel", "state": { "_view_module": null, @@ -1281,10 +1316,11 @@ }, "pythree_example_model_048": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_047", "layout": "IPY_MODEL_pythree_example_model_049", "shadowMap": "IPY_MODEL_pythree_example_model_050" @@ -1292,13 +1328,13 @@ }, "pythree_example_model_049": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_050": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1307,7 +1343,7 @@ }, "pythree_example_model_051": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PlaneGeometryModel", "state": { "_view_module": null, @@ -1320,10 +1356,11 @@ }, "pythree_example_model_052": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_051", "layout": "IPY_MODEL_pythree_example_model_053", "shadowMap": "IPY_MODEL_pythree_example_model_054" @@ -1331,13 +1368,13 @@ }, "pythree_example_model_053": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_054": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1346,7 +1383,7 @@ }, "pythree_example_model_055": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PlaneBufferGeometryModel", "state": { "_view_module": null, @@ -1359,10 +1396,11 @@ }, "pythree_example_model_056": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_055", "layout": "IPY_MODEL_pythree_example_model_057", "shadowMap": "IPY_MODEL_pythree_example_model_058" @@ -1370,13 +1408,13 @@ }, "pythree_example_model_057": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_058": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1385,7 +1423,7 @@ }, "pythree_example_model_059": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "RingGeometryModel", "state": { "_view_module": null, @@ -1397,10 +1435,11 @@ }, "pythree_example_model_060": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_059", "layout": "IPY_MODEL_pythree_example_model_061", "shadowMap": "IPY_MODEL_pythree_example_model_062" @@ -1408,13 +1447,13 @@ }, "pythree_example_model_061": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_062": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1423,7 +1462,7 @@ }, "pythree_example_model_063": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "RingBufferGeometryModel", "state": { "_view_module": null, @@ -1435,10 +1474,11 @@ }, "pythree_example_model_064": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_063", "layout": "IPY_MODEL_pythree_example_model_065", "shadowMap": "IPY_MODEL_pythree_example_model_066" @@ -1446,13 +1486,13 @@ }, "pythree_example_model_065": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_066": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1461,7 +1501,7 @@ }, "pythree_example_model_067": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "SphereGeometryModel", "state": { "_view_module": null, @@ -1473,10 +1513,11 @@ }, "pythree_example_model_068": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_067", "layout": "IPY_MODEL_pythree_example_model_069", "shadowMap": "IPY_MODEL_pythree_example_model_070" @@ -1484,13 +1525,13 @@ }, "pythree_example_model_069": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_070": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1499,7 +1540,7 @@ }, "pythree_example_model_071": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "SphereBufferGeometryModel", "state": { "_view_module": null, @@ -1511,10 +1552,11 @@ }, "pythree_example_model_072": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_071", "layout": "IPY_MODEL_pythree_example_model_073", "shadowMap": "IPY_MODEL_pythree_example_model_074" @@ -1522,13 +1564,13 @@ }, "pythree_example_model_073": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_074": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1537,7 +1579,7 @@ }, "pythree_example_model_075": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "TetrahedronGeometryModel", "state": { "_view_module": null, @@ -1548,10 +1590,11 @@ }, "pythree_example_model_076": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_075", "layout": "IPY_MODEL_pythree_example_model_077", "shadowMap": "IPY_MODEL_pythree_example_model_078" @@ -1559,13 +1602,13 @@ }, "pythree_example_model_077": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_078": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1574,7 +1617,7 @@ }, "pythree_example_model_079": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "TorusGeometryModel", "state": { "_view_module": null, @@ -1587,10 +1630,11 @@ }, "pythree_example_model_080": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_079", "layout": "IPY_MODEL_pythree_example_model_081", "shadowMap": "IPY_MODEL_pythree_example_model_082" @@ -1598,13 +1642,13 @@ }, "pythree_example_model_081": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_082": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1613,7 +1657,7 @@ }, "pythree_example_model_083": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "TorusBufferGeometryModel", "state": { "_view_module": null, @@ -1623,10 +1667,11 @@ }, "pythree_example_model_084": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_083", "layout": "IPY_MODEL_pythree_example_model_085", "shadowMap": "IPY_MODEL_pythree_example_model_086" @@ -1634,13 +1679,13 @@ }, "pythree_example_model_085": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_086": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1649,7 +1694,7 @@ }, "pythree_example_model_087": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "TorusKnotGeometryModel", "state": { "_view_module": null, @@ -1660,10 +1705,11 @@ }, "pythree_example_model_088": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_087", "layout": "IPY_MODEL_pythree_example_model_089", "shadowMap": "IPY_MODEL_pythree_example_model_090" @@ -1671,13 +1717,13 @@ }, "pythree_example_model_089": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_090": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1686,7 +1732,7 @@ }, "pythree_example_model_091": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "TorusKnotBufferGeometryModel", "state": { "_view_module": null, @@ -1697,10 +1743,11 @@ }, "pythree_example_model_092": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_091", "layout": "IPY_MODEL_pythree_example_model_093", "shadowMap": "IPY_MODEL_pythree_example_model_094" @@ -1708,13 +1755,13 @@ }, "pythree_example_model_093": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_094": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1723,7 +1770,7 @@ }, "pythree_example_model_095": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "TorusBufferGeometryModel", "state": { "_view_module": null, @@ -1736,7 +1783,7 @@ }, "pythree_example_model_096": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WireframeGeometryModel", "state": { "_view_module": null, @@ -1746,10 +1793,11 @@ }, "pythree_example_model_097": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_096", "layout": "IPY_MODEL_pythree_example_model_098", "shadowMap": "IPY_MODEL_pythree_example_model_099" @@ -1757,13 +1805,13 @@ }, "pythree_example_model_098": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_099": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.3", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { "_view_module": null, @@ -1777,5 +1825,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/Renderer.ipynb b/examples/Renderer.ipynb index 663abc75..00151c63 100644 --- a/examples/Renderer.ipynb +++ b/examples/Renderer.ipynb @@ -180,7 +180,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -194,22 +194,37 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.9.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { - "20dd14fe-5613-423c-bf5a-f2131033c4f2": { + "0456a30f-9eff-4996-b0aa-d9c1ccdd97e8": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", + "model_name": "DirectionalLightShadowModel", + "state": { + "_view_module": null, + "_view_module_version": "", + "camera": "IPY_MODEL_ea462d43-102c-4cac-9178-384f89bdda36" + } + }, + "e8282acb-06c6-4403-b48d-766d2c4e7169": { + "model_module": "jupyter-threejs", + "model_module_version": "^2.1.0", "model_name": "Object3DModel", - "state": {} + "state": { + "_view_module": null, + "_view_module_version": "" + } }, - "29e8caf5-30b3-4165-ac95-c84079b83375": { + "ea462d43-102c-4cac-9178-384f89bdda36": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrthographicCameraModel", "state": { + "_view_module": null, + "_view_module_version": "", "bottom": -5, "far": 500, "left": -5, @@ -236,30 +251,20 @@ "top": 5 } }, - "c30e2bbc-a155-4f51-8ff9-92009d762f5b": { - "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", - "model_name": "DirectionalLightShadowModel", - "state": { - "camera": "IPY_MODEL_29e8caf5-30b3-4165-ac95-c84079b83375" - } - }, "pythree_example_model_001": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SphereGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_002": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshLambertMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "red" @@ -267,23 +272,20 @@ }, "pythree_example_model_003": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_001", - "material": "IPY_MODEL_pythree_example_model_002", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_002" } }, "pythree_example_model_004": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "white", @@ -294,16 +296,15 @@ 5, 1 ], - "shadow": "IPY_MODEL_c30e2bbc-a155-4f51-8ff9-92009d762f5b", - "target": "IPY_MODEL_20dd14fe-5613-423c-bf5a-f2131033c4f2" + "shadow": "IPY_MODEL_0456a30f-9eff-4996-b0aa-d9c1ccdd97e8", + "target": "IPY_MODEL_e8282acb-06c6-4403-b48d-766d2c4e7169" } }, "pythree_example_model_005": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PerspectiveCameraModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -354,10 +355,9 @@ }, "pythree_example_model_006": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AmbientLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "#777777" @@ -365,10 +365,9 @@ }, "pythree_example_model_007": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SceneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "background": null, @@ -381,10 +380,9 @@ }, "pythree_example_model_008": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrbitControlsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "controlling": "IPY_MODEL_pythree_example_model_005", @@ -396,12 +394,11 @@ }, "pythree_example_model_009": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "RendererModel", "state": { "_alpha": true, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "camera": "IPY_MODEL_pythree_example_model_005", "clearColor": "black", "clearOpacity": 0, @@ -415,25 +412,25 @@ }, "pythree_example_model_010": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_011": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_015": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "FloatSliderModel", "state": { + "behavior": "drag-tap", "layout": "IPY_MODEL_pythree_example_model_016", "max": 1, "step": 0.1, @@ -442,13 +439,13 @@ }, "pythree_example_model_016": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_017": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "SliderStyleModel", "state": { "description_width": "" @@ -456,7 +453,7 @@ }, "pythree_example_model_018": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LinkModel", "state": { "source": [ @@ -471,7 +468,7 @@ }, "pythree_example_model_019": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "ColorPickerModel", "state": { "disabled": false, @@ -481,13 +478,13 @@ }, "pythree_example_model_020": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_021": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" @@ -495,7 +492,7 @@ }, "pythree_example_model_022": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LinkModel", "state": { "source": [ @@ -510,7 +507,7 @@ }, "pythree_example_model_023": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LabelModel", "state": { "layout": "IPY_MODEL_pythree_example_model_024", @@ -520,21 +517,28 @@ }, "pythree_example_model_024": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_025": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "LabelStyleModel", "state": { - "description_width": "" + "description_width": "", + "font_family": null, + "font_size": null, + "font_style": null, + "font_variant": null, + "font_weight": null, + "text_color": null, + "text_decoration": null } }, "pythree_example_model_026": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LabelModel", "state": { "layout": "IPY_MODEL_pythree_example_model_027", @@ -544,21 +548,28 @@ }, "pythree_example_model_027": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_028": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "LabelStyleModel", "state": { - "description_width": "" + "description_width": "", + "font_family": null, + "font_size": null, + "font_style": null, + "font_variant": null, + "font_weight": null, + "text_color": null, + "text_decoration": null } }, "pythree_example_model_029": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ @@ -572,13 +583,13 @@ }, "pythree_example_model_030": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_031": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "ColorPickerModel", "state": { "disabled": false, @@ -588,13 +599,13 @@ }, "pythree_example_model_032": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_033": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" @@ -602,31 +613,39 @@ }, "pythree_example_model_034": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "ToggleButtonModel", "state": { "description": "Scene Color", "layout": "IPY_MODEL_pythree_example_model_035", - "style": "IPY_MODEL_pythree_example_model_036" + "style": "IPY_MODEL_pythree_example_model_036", + "tooltip": null } }, "pythree_example_model_035": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_036": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "ToggleButtonStyleModel", "state": { - "description_width": "" + "description_width": "", + "font_family": null, + "font_size": null, + "font_style": null, + "font_variant": null, + "font_weight": null, + "text_color": null, + "text_decoration": null } }, "pythree_example_model_037": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LabelModel", "state": { "layout": "IPY_MODEL_pythree_example_model_038", @@ -636,21 +655,28 @@ }, "pythree_example_model_038": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_039": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "LabelStyleModel", "state": { - "description_width": "" + "description_width": "", + "font_family": null, + "font_size": null, + "font_style": null, + "font_variant": null, + "font_weight": null, + "text_color": null, + "text_decoration": null } }, "pythree_example_model_040": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ @@ -663,7 +689,7 @@ }, "pythree_example_model_041": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} } @@ -674,5 +700,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/Textures.ipynb b/examples/Textures.ipynb index 9eba9913..93a4dd21 100644 --- a/examples/Textures.ipynb +++ b/examples/Textures.ipynb @@ -56,11 +56,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=ImageTexture(imageUri='img/checkerboard.png', offset=(0.0, 0.0), repeat=(1.0, 1.0), version=1), …" + "ImageTexture(imageUri='img/checkerboard.png', offset=(0.0, 0.0), repeat=(1.0, 1.0), version=1)" ] }, + "execution_count": 4, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -84,11 +85,12 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=ImageTexture(imageUri='img/earth.jpg', offset=(0.0, 0.0), repeat=(1.0, 1.0), version=1), shadowM…" + "ImageTexture(imageUri='img/earth.jpg', offset=(0.0, 0.0), repeat=(1.0, 1.0), version=1)" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -154,14 +156,16 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=DataTexture(data=array([[[0., 0., 0.],\n", + "DataTexture(data=array([[[0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.],\n", - " [0., …" + " [0., 0., 0.],\n", + " …" ] }, + "execution_count": 7, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -176,12 +180,19 @@ "source": [ "data_tex.data = gen_checkers(arr_w, arr_h, 8, 2)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -195,7 +206,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.9.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { @@ -236,7 +247,7 @@ }, "pythree_example_model_004": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, @@ -263,7 +274,7 @@ }, "pythree_example_model_007": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, @@ -320,7 +331,7 @@ }, "pythree_example_model_011": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, @@ -340,5 +351,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/examples/ThickLines.ipynb b/examples/ThickLines.ipynb index c24b052f..48bf2487 100644 --- a/examples/ThickLines.ipynb +++ b/examples/ThickLines.ipynb @@ -57,11 +57,13 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=LineSegments(geometry=BufferGeometry(attributes={'position': BufferAttribute(array=array([[0., 0…" + "LineSegments(geometry=BufferGeometry(attributes={'position': BufferAttribute(array=array([[0., 0., 0.],\n", + " …" ] }, + "execution_count": 3, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -102,12 +104,15 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=LineSegments2(geometry=LineSegmentsGeometry(positions=array([[[0., 0., 0.],\n", - " [1., 1., 1.]…" + "LineSegments2(geometry=LineSegmentsGeometry(positions=array([[[0., 0., 0.],\n", + " [1., 1., 1.]],\n", + "\n", + " [[2…" ] }, + "execution_count": 4, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -135,13 +140,15 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=LineSegments2(geometry=LineSegmentsGeometry(colors=array([[[1., 0., 0.],\n", + "LineSegments2(geometry=LineSegmentsGeometry(colors=array([[[1., 0., 0.],\n", " [1., 0., 0.]],\n", - "…" + "\n", + " [[0., …" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -208,8 +215,9 @@ "VBox(children=(Renderer(camera=PerspectiveCamera(aspect=1.5, position=(10.0, 0.0, 0.0), projectionMatrix=(1.42…" ] }, + "execution_count": 8, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -481,11 +489,13 @@ "version_minor": 0 }, "text/plain": [ - "Preview(child=Mesh(geometry=InstancedBufferGeometry(attributes={'position': BufferAttribute(array=array([[ 1.,…" + "Mesh(geometry=InstancedBufferGeometry(attributes={'position': BufferAttribute(array=array([[ 1., 2., 0.],\n", + " …" ] }, + "execution_count": 11, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -502,7 +512,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -516,16 +526,18 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.9.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { - "2108202c-c417-468e-a67f-4c8422eb49e2": { + "4acbfb1a-adea-48cb-b9fd-0b5b011421f0": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrthographicCameraModel", "state": { + "_view_module": null, + "_view_module_version": "", "bottom": -5, "far": 500, "left": -5, @@ -552,19 +564,24 @@ "top": 5 } }, - "a0da8954-9821-487a-8da1-409e8679c9cc": { + "58e372db-0e7d-4561-b976-59082a8c1cf6": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightShadowModel", "state": { - "camera": "IPY_MODEL_2108202c-c417-468e-a67f-4c8422eb49e2" + "_view_module": null, + "_view_module_version": "", + "camera": "IPY_MODEL_4acbfb1a-adea-48cb-b9fd-0b5b011421f0" } }, - "dedd8574-6920-4f16-bdee-ae7fad1749b1": { + "a59d6281-91da-4a04-ab6e-7210b990bc68": { "model_module": "jupyter-threejs", - "model_module_version": "2.0.0", + "model_module_version": "^2.1.0", "model_name": "Object3DModel", - "state": {} + "state": { + "_view_module": null, + "_view_module_version": "" + } }, "pythree_example_model_001": { "buffers": [ @@ -578,10 +595,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -606,10 +622,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -624,10 +639,9 @@ }, "pythree_example_model_003": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "attributes": { @@ -638,10 +652,9 @@ }, "pythree_example_model_004": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineBasicMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "linewidth": 10, @@ -650,10 +663,9 @@ }, "pythree_example_model_005": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineSegmentsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_003", @@ -662,12 +674,11 @@ }, "pythree_example_model_006": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_005", "layout": "IPY_MODEL_pythree_example_model_007", "shadowMap": "IPY_MODEL_pythree_example_model_008" @@ -675,16 +686,15 @@ }, "pythree_example_model_007": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_008": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -701,10 +711,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineSegmentsGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "positions": { @@ -719,10 +728,9 @@ }, "pythree_example_model_010": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "color": "cyan", @@ -731,25 +739,22 @@ }, "pythree_example_model_011": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineSegments2Model", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_009", - "material": "IPY_MODEL_pythree_example_model_010", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_010" } }, "pythree_example_model_012": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_011", "layout": "IPY_MODEL_pythree_example_model_013", "shadowMap": "IPY_MODEL_pythree_example_model_014" @@ -757,16 +762,15 @@ }, "pythree_example_model_013": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_014": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -774,27 +778,26 @@ "pythree_example_model_015": { "buffers": [ { - "data": "AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/", + "data": "AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/AAAAQAAAAEAAAABAAACAQAAAgEAAAIBA", "encoding": "base64", "path": [ - "colors", + "positions", "buffer" ] }, { - "data": "AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/AAAAQAAAAEAAAABAAACAQAAAgEAAAIBA", + "data": "AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/", "encoding": "base64", "path": [ - "positions", + "colors", "buffer" ] } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineSegmentsGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "colors": { @@ -817,10 +820,9 @@ }, "pythree_example_model_016": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "linewidth": 10, @@ -829,25 +831,22 @@ }, "pythree_example_model_017": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "LineSegments2Model", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_015", - "material": "IPY_MODEL_pythree_example_model_016", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_016" } }, "pythree_example_model_018": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_017", "layout": "IPY_MODEL_pythree_example_model_019", "shadowMap": "IPY_MODEL_pythree_example_model_020" @@ -855,26 +854,24 @@ }, "pythree_example_model_019": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_020": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_021": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PerspectiveCameraModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "aspect": 1.5, @@ -923,10 +920,9 @@ }, "pythree_example_model_022": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "DirectionalLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "matrixWorldNeedsUpdate": true, @@ -935,26 +931,24 @@ 10, 10 ], - "shadow": "IPY_MODEL_a0da8954-9821-487a-8da1-409e8679c9cc", - "target": "IPY_MODEL_dedd8574-6920-4f16-bdee-ae7fad1749b1" + "shadow": "IPY_MODEL_58e372db-0e7d-4561-b976-59082a8c1cf6", + "target": "IPY_MODEL_a59d6281-91da-4a04-ab6e-7210b990bc68" } }, "pythree_example_model_023": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "AmbientLightModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_027": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "SceneModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "children": [ @@ -969,10 +963,9 @@ }, "pythree_example_model_028": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "OrbitControlsModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "controlling": "IPY_MODEL_pythree_example_model_021", @@ -985,12 +978,11 @@ }, "pythree_example_model_029": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "RendererModel", "state": { "_height": 400, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "_width": 600, "camera": "IPY_MODEL_pythree_example_model_021", "controls": [ @@ -1003,23 +995,22 @@ }, "pythree_example_model_030": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_031": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } }, "pythree_example_model_032": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "CheckboxModel", "state": { "description": "GL line", @@ -1031,21 +1022,21 @@ }, "pythree_example_model_033": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_034": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "CheckboxStyleModel", "state": { "description_width": "" } }, "pythree_example_model_035": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "CheckboxModel", "state": { "description": "Fat line (single color)", @@ -1057,21 +1048,21 @@ }, "pythree_example_model_036": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_037": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "CheckboxStyleModel", "state": { "description_width": "" } }, "pythree_example_model_038": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "CheckboxModel", "state": { "description": "Fat line (vertex colors)", @@ -1083,21 +1074,21 @@ }, "pythree_example_model_039": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_040": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", - "model_name": "DescriptionStyleModel", + "model_module_version": "2.0.0", + "model_name": "CheckboxStyleModel", "state": { "description_width": "" } }, "pythree_example_model_041": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LinkModel", "state": { "source": [ @@ -1112,7 +1103,7 @@ }, "pythree_example_model_042": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LinkModel", "state": { "source": [ @@ -1127,7 +1118,7 @@ }, "pythree_example_model_043": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "LinkModel", "state": { "source": [ @@ -1142,7 +1133,7 @@ }, "pythree_example_model_044": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ @@ -1155,13 +1146,13 @@ }, "pythree_example_model_045": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_046": { "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.3.0", + "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "children": [ @@ -1173,7 +1164,7 @@ }, "pythree_example_model_047": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, @@ -1189,10 +1180,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InstancedInterleavedBufferModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -1217,10 +1207,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InstancedInterleavedBufferModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -1245,10 +1234,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -1274,10 +1262,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -1303,10 +1290,9 @@ } ], "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "BufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "array": { @@ -1321,10 +1307,9 @@ }, "pythree_example_model_053": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InterleavedBufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "data": "IPY_MODEL_pythree_example_model_048", @@ -1333,10 +1318,9 @@ }, "pythree_example_model_054": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InterleavedBufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "data": "IPY_MODEL_pythree_example_model_048", @@ -1346,10 +1330,9 @@ }, "pythree_example_model_055": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InterleavedBufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "data": "IPY_MODEL_pythree_example_model_049", @@ -1358,10 +1341,9 @@ }, "pythree_example_model_056": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InterleavedBufferAttributeModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "data": "IPY_MODEL_pythree_example_model_049", @@ -1371,10 +1353,9 @@ }, "pythree_example_model_057": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "InstancedBufferGeometryModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "attributes": { @@ -1390,10 +1371,9 @@ }, "pythree_example_model_058": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "ShaderMaterialModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "fragmentShader": "\nuniform vec3 diffuse;\nuniform float opacity;\n\nvarying float vLineDistance;\n\n#include \n#include \n#include \n#include \n#include \n\nvarying vec2 vUv;\n\nvoid main() {\n\n #include \n\n\n if ( abs( vUv.y ) > 1.0 ) {\n\n float a = vUv.x;\n float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n float len2 = a * a + b * b;\n\n if ( len2 > 1.0 ) discard;\n\n }\n\n vec4 diffuseColor = vec4( diffuse, opacity );\n\n #include \n #include \n\n gl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\n\n #include \n #include \n #include \n #include \n\n}\n", @@ -1442,25 +1422,22 @@ }, "pythree_example_model_059": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "MeshModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "", "geometry": "IPY_MODEL_pythree_example_model_057", - "material": "IPY_MODEL_pythree_example_model_058", - "morphTargetInfluences": [] + "material": "IPY_MODEL_pythree_example_model_058" } }, "pythree_example_model_060": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "PreviewModel", "state": { "_alpha": false, - "_model_module_version": "^2.0.0", - "_view_module_version": "^2.0.0", + "_webgl_version": 2, "child": "IPY_MODEL_pythree_example_model_059", "layout": "IPY_MODEL_pythree_example_model_061", "shadowMap": "IPY_MODEL_pythree_example_model_062" @@ -1468,16 +1445,15 @@ }, "pythree_example_model_061": { "model_module": "@jupyter-widgets/base", - "model_module_version": "1.1.0", + "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "pythree_example_model_062": { "model_module": "jupyter-threejs", - "model_module_version": "^2.0.0", + "model_module_version": "^2.1.0", "model_name": "WebGLShadowMapModel", "state": { - "_model_module_version": "^2.0.0", "_view_module": null, "_view_module_version": "" } @@ -1489,5 +1465,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From a7f9cca7f14375c54d00ecf449a12ee7635a144e Mon Sep 17 00:00:00 2001 From: Vidar Tonaas Fauske <510760+vidartf@users.noreply.github.com> Date: Thu, 26 May 2022 15:11:33 +0100 Subject: [PATCH 6/6] Fix overaggressive replacement --- js/src/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/extension.js b/js/src/extension.js index 61cf2599..ffcc2e3b 100644 --- a/js/src/extension.js +++ b/js/src/extension.js @@ -22,5 +22,5 @@ if (window.requirejs) { // Export the required load_ipython_extention module.exports = { - load_ipython_extension() {} + load_ipython_extension: function() {} };