diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f175e249..6c4bc58d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,32 +1,8 @@ -name: Build and Test +name: Test on: [push, pull_request] jobs: - build_wheels: - name: Build wheels on ${{ matrix.os }} - runs-on: ubuntu-22.04 - - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 - - name: Install dependencies - run: python -m pip install --upgrade pip setuptools wheel build - - name: Use Node.js - uses: actions/setup-node@v3 - with: - node-version: "16" - - name: Build wheels - run: python -m build . - - - uses: actions/upload-artifact@v3 - with: - name: k3d_wheel - path: ./dist/k3d*.whl - - uses: actions/upload-artifact@v3 - with: - name: k3d_sdist - path: ./dist/k3d*.tar.gz test: name: Run pytest on ${{ matrix.os }} runs-on: ${{ matrix.os }} diff --git a/examples/point_cloud_advanced_compression_in_html.ipynb b/examples/point_cloud_advanced_compression_in_html.ipynb new file mode 100644 index 00000000..0b25b359 --- /dev/null +++ b/examples/point_cloud_advanced_compression_in_html.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from k3d.helpers import download\n", + "from pyunpack import Archive\n", + "import os\n", + "from IPython.display import IFrame\n", + "\n", + "filename = download('http://www.semantic3d.net/data/point-clouds/testing1/stgallencathedral_station1_intensity_rgb.7z')\n", + "Archive(filename).extractall('./')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import csv\n", + "import numpy as np \n", + "\n", + "data = None\n", + "\n", + "with open(filename.replace('.7z', '.txt'), mode='r') as csv_file:\n", + " csv_reader = csv.reader(csv_file, delimiter=' ') \n", + " data = np.array(list(csv_reader), dtype=np.float32)\n", + "\n", + "# compute color in hex format\n", + "data[:, 4] = np.sum(data[:, 4:7].astype(np.uint32) * np.array([1, 256, 256 ** 2]), axis=1) \n", + "data = data[:, 0:5]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "positions = data[::10, 0:3]\n", + "colors1 = data[::10, 4].astype(np.uint32)\n", + "colors2 = np.clip(colors1.view(np.uint8) * 1.5, 0, 255).astype(np.uint8).view('uint32')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "positions.shape, colors1.shape, colors2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cam_pos = [5.251483149143791,\n", + " -7.92683507646606,\n", + " 3.144285796928443,\n", + " -2.470283607444292,\n", + " 3.6558150584160503,\n", + " 2.3721091212696286,\n", + " 0,\n", + " 0,\n", + " 1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import json\n", + "import k3d\n", + "import ipywidgets as widgets\n", + "\n", + "plot = k3d.plot()\n", + "plot += k3d.points(positions, colors1, point_size=0.2, shader=\"flat\") \n", + "plot += k3d.points(positions, colors2, point_size=0.2, shader=\"flat\") \n", + "plot.display()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot.camera = cam_pos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"point_cloud_full.html\", \"w\") as f:\n", + " f.write(plot.get_snapshot(additional_js_code=\"\"\"\n", + " let json = K3DInstance.getWorld().ObjectsListJson; \n", + " let active = Object.keys(json)[0];\n", + " \n", + " setInterval(() => {\n", + " let newActive;\n", + " \n", + " Object.keys(json).forEach(function (id) {\n", + " if (active === id) {\n", + " json[id].opacity = 0;\n", + " K3DInstance.reload(json[id], {opacity: 0}); \n", + " } else {\n", + " json[id].opacity = 1;\n", + " K3DInstance.reload(json[id], {opacity: 1});\n", + " newActive = id;\n", + " } \n", + " });\n", + " \n", + " active = newActive;\n", + " \n", + " }, 2000);\n", + " \n", + " \n", + " \"\"\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# size in html\n", + "os.stat(\"point_cloud_full.html\").st_size / 1024 / 1024 # size in MB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IFrame('point_cloud_full.html', width=900, height=350)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Advanced approach" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import json\n", + "import k3d\n", + "import ipywidgets as widgets\n", + "\n", + "plot2 = k3d.plot()\n", + "\n", + "positions_placeholder = positions.copy()\n", + "positions_placeholder.fill(0.0) # filling with one value will boost compression ratio\n", + "\n", + "plot2 += k3d.points(positions, colors1, point_size=0.2, shader=\"flat\", name=\"main\") \n", + "plot2 += k3d.points(positions_placeholder, colors2, point_size=0.2, shader=\"flat\", name=\"second\") \n", + "\n", + "plot2.display()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot2.camera = cam_pos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"point_cloud_advanced.html\", \"w\") as f:\n", + " f.write(plot2.get_snapshot(additional_js_code=\"\"\"\n", + " let json = K3DInstance.getWorld().ObjectsListJson; \n", + " let active = Object.keys(json)[0];\n", + " let positions = null;\n", + " \n", + " // search for main and save positions from it\n", + " Object.keys(json).forEach(function (id) {\n", + " if (json[id].name === 'main') {\n", + " positions = json[id].positions.data;\n", + " }\n", + " });\n", + " \n", + " // search for second and update positions\n", + " Object.keys(json).forEach(function (id) {\n", + " if (json[id].name === 'second') {\n", + " json[id].positions.data.set(positions);\n", + " K3DInstance.reload(json[id], {positions: json[id].positions}); \n", + " }\n", + " });\n", + " \n", + " \n", + " // like before\n", + " \n", + " setInterval(() => {\n", + " let json = K3DInstance.getWorld().ObjectsListJson;\n", + " let newActive;\n", + " \n", + " Object.keys(json).forEach(function (id) {\n", + " if (active === id) {\n", + " json[id].opacity = 0;\n", + " K3DInstance.reload(json[id], {opacity: 0}); \n", + " } else {\n", + " json[id].opacity = 1;\n", + " K3DInstance.reload(json[id], {opacity: 1});\n", + " newActive = id;\n", + " } \n", + " });\n", + " \n", + " active = newActive;\n", + " \n", + " }, 2000);\n", + " \n", + " \n", + " \"\"\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# size in html\n", + "os.stat(\"point_cloud_advanced.html\").st_size / 1024 / 1024 # size in MB" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IFrame('point_cloud_advanced.html', width=900, height=350)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ratio\n", + "os.stat(\"point_cloud_advanced.html\").st_size / os.stat(\"point_cloud_full.html\").st_size" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ratio cannot be 0.5 because we pass information about each points color" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/js/package.json b/js/package.json index 84c02534..034d1c8f 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "k3d", - "version": "2.16.0", + "version": "2.16.1", "description": "3D visualization library", "author": "k3d team", "main": "src/index.js", diff --git a/js/src/core/lib/headless.html b/js/src/core/lib/headless.html index 4e9899cf..4ca42779 100644 --- a/js/src/core/lib/headless.html +++ b/js/src/core/lib/headless.html @@ -162,10 +162,14 @@ if (promises.length > 0) { Promise.all(promises).then(function () { window.refreshed = true; + }).catch(function(error) { + console.error(error); }); } else { window.refreshed = true; } + } else { + console.error('k3dRefresh', req.response); } } }); diff --git a/js/src/providers/threejs/initializers/Scene.js b/js/src/providers/threejs/initializers/Scene.js index d163b10c..af167595 100644 --- a/js/src/providers/threejs/initializers/Scene.js +++ b/js/src/providers/threejs/initializers/Scene.js @@ -156,8 +156,8 @@ function cleanup(grids, gridScene) { }); }); - Object.keys(grids.labelsOnEdges).forEach((key) => { - grids.labelsOnEdges[key].labels.forEach((label) => { + Object.keys(grids.labelsOnPlanes).forEach((key) => { + grids.labelsOnPlanes[key].labels.forEach((label) => { label.onRemove(); }); }); @@ -179,17 +179,28 @@ function rebuildSceneData(K3D, grids, axesHelper, force) { const promises = []; let originalEdges; let updateAxesHelper; - let extendedEdges; let size; let majorScale; let minorScale; + let i; let sceneBoundingBox = new THREE.Box3().setFromArray(K3D.parameters.grid); - let extendedSceneBoundingBox; const unitVectors = { x: new THREE.Vector3(1.0, 0.0, 0.0), y: new THREE.Vector3(0.0, 1.0, 0.0), z: new THREE.Vector3(0.0, 0.0, 1.0), }; + const cornerToLabeledEdges = { + '+x+y+z': ['+x-y', '+x-z', '-x+y', '+y-z', '-x+z', '-y+z'], + '+x+y-z': ['+x-y', '+x+z', '-x+y', '+y+z', '-x-z', '-y-z'], + '+x-y+z': ['+x+y', '+x-z', '-x-y', '-y-z', '-x+z', '+y+z'], + '+x-y-z': ['+x+y', '+x+z', '-x-y', '-y+z', '-x-z', '+y-z'], + '-x+y+z': ['-x-y', '-x-z', '+x+y', '+y-z', '+x+z', '-y+z'], + '-x+y-z': ['-x-y', '-x+z', '+x+y', '+y+z', '+x-z', '-y-z'], + '-x-y+z': ['-x+y', '-x-z', '+x-y', '-y-z', '+x+z', '+y+z'], + '-x-y-z': ['-x+y', '-x+z', '+x-y', '-y+z', '+x-z', '+y-z'] + }; + const labelsShiftMap = ['x', 'x', 'y', 'y', 'z', 'z']; + const gridColor = new THREE.Color(K3D.parameters.gridColor); const labelColor = new THREE.Color(K3D.parameters.labelColor); @@ -249,6 +260,7 @@ function rebuildSceneData(K3D, grids, axesHelper, force) { // generate new one size = sceneBoundingBox.getSize(new THREE.Vector3()); + majorScale = pow10ceil(Math.max(size.x, size.y, size.z)) / 10.0; minorScale = majorScale / 10.0; @@ -261,15 +273,15 @@ function rebuildSceneData(K3D, grids, axesHelper, force) { size = sceneBoundingBox.getSize(new THREE.Vector3()); sceneBoundingBox.min = new THREE.Vector3( - Math.floor(sceneBoundingBox.min.x / majorScale) * majorScale, - Math.floor(sceneBoundingBox.min.y / majorScale) * majorScale, - Math.floor(sceneBoundingBox.min.z / majorScale) * majorScale, + Math.floor(sceneBoundingBox.min.x / minorScale) * minorScale, + Math.floor(sceneBoundingBox.min.y / minorScale) * minorScale, + Math.floor(sceneBoundingBox.min.z / minorScale) * minorScale, ); sceneBoundingBox.max = new THREE.Vector3( - Math.ceil(sceneBoundingBox.max.x / majorScale) * majorScale, - Math.ceil(sceneBoundingBox.max.y / majorScale) * majorScale, - Math.ceil(sceneBoundingBox.max.z / majorScale) * majorScale, + Math.ceil(sceneBoundingBox.max.x / minorScale) * minorScale, + Math.ceil(sceneBoundingBox.max.y / minorScale) * minorScale, + Math.ceil(sceneBoundingBox.max.z / minorScale) * minorScale, ); size = sceneBoundingBox.getSize(new THREE.Vector3()); @@ -310,90 +322,77 @@ function rebuildSceneData(K3D, grids, axesHelper, force) { }], }; - // expand sceneBoundingBox to avoid labels overlapping - extendedSceneBoundingBox = sceneBoundingBox.clone().expandByScalar(majorScale * 0.15); - originalEdges = generateEdgesPoints(sceneBoundingBox); - extendedEdges = generateEdgesPoints(extendedSceneBoundingBox); - Object.keys(originalEdges).forEach((key) => { - grids.labelsOnEdges[key] = {}; - grids.labelsOnEdges[key].v = originalEdges[key]; - grids.labelsOnEdges[key].p = extendedEdges[key]; - grids.labelsOnEdges[key].labels = []; - }); + // create labels for ticks - iterate over all 8 corners of box - // create labels - Object.keys(grids.labelsOnEdges).forEach((key) => { - const iterateAxis = _.difference(['x', 'y', 'z'], key.replace(/[^xyz]/g, '').split(''))[0]; - let iterationCount = size[iterateAxis] / majorScale; - - let deltaValue = unitVectors[iterateAxis].clone().multiplyScalar(majorScale); - let deltaPosition = unitVectors[iterateAxis].clone().multiplyScalar( - grids.labelsOnEdges[key].p[0].distanceTo(grids.labelsOnEdges[key].p[1]) / iterationCount, - ); - let j; - let v; - let p; - let label; - - if (iterationCount <= 2) { - const originalIterationCount = iterationCount; - - iterationCount = originalIterationCount * 5; - deltaValue = unitVectors[iterateAxis].clone() - .multiplyScalar((originalIterationCount * majorScale) / iterationCount); - deltaPosition = unitVectors[iterateAxis].clone().multiplyScalar( - grids.labelsOnEdges[key].p[0].distanceTo(grids.labelsOnEdges[key].p[1]) / iterationCount, - ); - } + for (i = 0; i < 8; i++) { + let corner = (i & 0x01 ? '-' : '+') + 'x' + (i & 0x02 ? '-' : '+') + 'y' + (i & 0x04 ? '-' : '+') + 'z'; - for (j = 1; j <= iterationCount - 1; j++) { - v = grids.labelsOnEdges[key].v[0].clone().add(deltaValue.clone().multiplyScalar(j)); - p = grids.labelsOnEdges[key].p[0].clone().add(deltaPosition.clone().multiplyScalar(j)); + grids.labelsOnPlanes[corner] = {}; + grids.labelsOnPlanes[corner].labels = []; - label = Text.create({ + cornerToLabeledEdges[corner].forEach(function (edge, index) { + let j; + let p; + let label; + const iterateAxis = _.difference(['x', 'y', 'z'], edge.replace(/[^xyz]/g, '').split(''))[0]; + + let deltaPosition = unitVectors[iterateAxis].clone().multiplyScalar(majorScale); + let iterationCount = size[iterateAxis] / majorScale; + let line = originalEdges[edge]; + + if (iterationCount <= 2) { + const originalIterationCount = iterationCount; + + iterationCount = Math.max(originalIterationCount * 5, 2); + deltaPosition = unitVectors[iterateAxis].clone() + .multiplyScalar((originalIterationCount * majorScale) / iterationCount); + } + + let labelShiftDirection = corner[Math.floor(index / 2) * 2] === "+"; + + // axis ticks labels + for (j = 1; j <= iterationCount - 1; j++) { + p = line[0].clone().add(deltaPosition.clone().multiplyScalar(j)).add( + unitVectors[labelsShiftMap[index]].clone() + .multiplyScalar(minorScale * (labelShiftDirection ? 1 : -1)) + ); + + label = Text.create({ + position: p.toArray(), + reference_point: 'cc', + color: labelColor, + text: parseFloat((p[iterateAxis]).toFixed(10)).toString(), + size: 0.75, + }, K3D); + + /* jshint loopfunc: true */ + promises.push(label.then((obj) => { + grids.labelsOnPlanes[corner].labels.push(obj); + })); + /* jshint loopfunc: false */ + } + + // axis label + p = (new THREE.Vector3()).lerpVectors(line[0], line[1], 0.5).add( + unitVectors[labelsShiftMap[index]].clone() + .multiplyScalar(minorScale * 2.0 * (labelShiftDirection ? 1 : -1)) + ); + + const axisLabel = Text.create({ position: p.toArray(), reference_point: 'cc', color: labelColor, - text: parseFloat((v[iterateAxis]).toFixed(15)).toString(), - size: 0.75, + text: K3D.parameters.axes[['x', 'y', 'z'].indexOf(iterateAxis)], + size: 1.0, }, K3D); - /* jshint loopfunc: true */ - promises.push(label.then((obj) => { - grids.labelsOnEdges[key].labels.push(obj); - })); - /* jshint loopfunc: false */ - } - - // add axis label - const middleValue = grids.labelsOnEdges[key].v[0].clone().add( - (new THREE.Vector3()).subVectors(grids.labelsOnEdges[key].v[1], grids.labelsOnEdges[key].v[0]) - .multiplyScalar(0.5), - ); - - const middlePosition = grids.labelsOnEdges[key].p[0].clone().add( - (new THREE.Vector3()).subVectors(grids.labelsOnEdges[key].p[1], grids.labelsOnEdges[key].p[0]) - .multiplyScalar(0.5), - ); - - const middle = middlePosition.add( - (new THREE.Vector3()).subVectors(middlePosition, middleValue).multiplyScalar(2.0), - ); - - const axisLabel = Text.create({ - position: middle.toArray(), - reference_point: 'cc', - color: labelColor, - text: K3D.parameters.axes[['x', 'y', 'z'].indexOf(iterateAxis)], - size: 1.0, - }, K3D); - - axisLabel.then((obj) => { - grids.labelsOnEdges[key].labels.push(obj); + axisLabel.then((obj) => { + grids.labelsOnPlanes[corner].labels.push(obj); + }); }); - }); + } // create grids Object.keys(grids.planes).forEach(function (axis) { @@ -475,7 +474,7 @@ function rebuildSceneData(K3D, grids, axesHelper, force) { function refreshGrid(K3D, grids) { /* jshint validthis:true */ - const visiblePlanes = []; + let currentCorner = ''; const cameraDirection = new THREE.Vector3(); this.camera.getWorldDirection(cameraDirection); @@ -487,21 +486,12 @@ function refreshGrid(K3D, grids) { grids.planes[axis][0].obj.visible = dot1 <= dot2 && K3D.parameters.gridVisible; grids.planes[axis][1].obj.visible = dot1 > dot2 && K3D.parameters.gridVisible; - if (grids.planes[axis][0].obj.visible) { - visiblePlanes.push(`+${axis}`); - } - - if (grids.planes[axis][1].obj.visible) { - visiblePlanes.push(`-${axis}`); - } + currentCorner += (dot1 <= dot2 ? '-' : '+') + axis; }, this); - Object.keys(grids.labelsOnEdges).forEach((key) => { - const axes = key.match(/.{2}/g); - const shouldBeVisible = _.intersection(axes, visiblePlanes).length === 1; - - grids.labelsOnEdges[key].labels.forEach((label) => { - if (shouldBeVisible && K3D.parameters.gridVisible) { + Object.keys(grids.labelsOnPlanes).forEach((corner) => { + grids.labelsOnPlanes[corner].labels.forEach((label) => { + if (corner === currentCorner && K3D.parameters.gridVisible) { label.show(); } else { label.hide(); @@ -533,7 +523,7 @@ function raycast(K3D, x, y, camera, click, viewMode) { }); if (meshes.length > 0) { - intersects = intersect.concat(this.raycaster.intersectObjects(meshes)); + intersects = intersects.concat(this.raycaster.intersectObjects(meshes)); } if (intersects.length > 0) { @@ -573,7 +563,7 @@ module.exports = { const ambientLight = new THREE.AmbientLight(0xffffff); const grids = { planes: {}, - labelsOnEdges: {}, + labelsOnPlanes: {}, }; const self = this; diff --git a/k3d/factory.py b/k3d/factory.py index 8a747b27..f9afaad2 100644 --- a/k3d/factory.py +++ b/k3d/factory.py @@ -1959,7 +1959,7 @@ def vtk_poly_data( poly_data.GetCellData().GetArray(cell_color_attribute[0]) ) color_range = cell_color_attribute[1:3] - elif volume != []: + elif len(volume) > 0: color_range = check_attribute_color_range(volume, color_range) vertices = nps.vtk_to_numpy(poly_data.GetPoints().GetData()) diff --git a/k3d/headless.py b/k3d/headless.py index b5f5346e..15c38113 100644 --- a/k3d/headless.py +++ b/k3d/headless.py @@ -69,7 +69,10 @@ def generate(): try: sync = (o[p] != self.synced_objects[o.id][p]).any() except Exception: - sync = o[p] != self.synced_objects[o.id][p] + try: + sync = o[p].shape != self.synced_objects[o.id][p].shape + except Exception: + sync = o[p] != self.synced_objects[o.id][p] if sync: if o.id not in objects_diff.keys(): @@ -93,7 +96,8 @@ def generate(): return Response(msgpack.packb(diff, use_bin_type=True), mimetype='application/octet-stream') - while self.browser.execute_script("return typeof(window.headlessK3D) !== 'undefined'") == False: + while self.browser.execute_script( + "return typeof(window.headlessK3D) !== 'undefined'") == False: time.sleep(1) self.browser.get(url="http://localhost:" + str(port) + "/headless.html") @@ -149,3 +153,19 @@ def get_headless_driver(no_headless=False): return webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options) + + +def get_headless_firefox_driver(no_headless=False): + from selenium import webdriver + from selenium.webdriver.firefox.service import Service as FirefoxService + from webdriver_manager.firefox import GeckoDriverManager + + options = webdriver.FirefoxOptions() + + options.add_argument("--no-sandbox") + + if not no_headless: + options.add_argument("--headless") + + return webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()), + options=options) diff --git a/k3d/helpers.py b/k3d/helpers.py index 2b971dbe..03d668fd 100644 --- a/k3d/helpers.py +++ b/k3d/helpers.py @@ -214,7 +214,7 @@ def check_attribute_color_range(attribute, color_range=()): Parameters ---------- - attribute : list + attribute : list or dict (for timeseries) Array of numbers. color_range : tuple, optional Two numbers, by default (). @@ -224,10 +224,16 @@ def check_attribute_color_range(attribute, color_range=()): tuple Color range. """ - if type(attribute) is dict or attribute.size == 0 or len(color_range) == 2: - return color_range - color_range = minmax(attribute) + if len(color_range) == 2: + return color_range + elif type(attribute) is dict: + t = [minmax(attribute[k]) for k in attribute.keys()] + color_range = [min([v[0] for v in t]), max([v[1] for v in t])] + elif attribute.size == 0: + return color_range + else: + color_range = minmax(attribute) if color_range[0] == color_range[1]: color_range[1] += 1.0 diff --git a/k3d/test/references/line_advanced.png b/k3d/test/references/line_advanced.png index 01a148ae..83d88654 100644 Binary files a/k3d/test/references/line_advanced.png and b/k3d/test/references/line_advanced.png differ diff --git a/k3d/test/references/line_mesh.png b/k3d/test/references/line_mesh.png index 97827172..ba31d4bb 100644 Binary files a/k3d/test/references/line_mesh.png and b/k3d/test/references/line_mesh.png differ diff --git a/k3d/test/references/line_mesh_clipping_plane.png b/k3d/test/references/line_mesh_clipping_plane.png index 1fcd9fe6..0760e5e1 100644 Binary files a/k3d/test/references/line_mesh_clipping_plane.png and b/k3d/test/references/line_mesh_clipping_plane.png differ diff --git a/k3d/test/references/line_simple.png b/k3d/test/references/line_simple.png index 604a56f0..7c3a84f5 100644 Binary files a/k3d/test/references/line_simple.png and b/k3d/test/references/line_simple.png differ diff --git a/k3d/test/references/line_simple_clipping_plane.png b/k3d/test/references/line_simple_clipping_plane.png index 858a245b..c10fda85 100644 Binary files a/k3d/test/references/line_simple_clipping_plane.png and b/k3d/test/references/line_simple_clipping_plane.png differ diff --git a/k3d/test/references/line_simple_red.png b/k3d/test/references/line_simple_red.png index 05b78cb9..545092e8 100644 Binary files a/k3d/test/references/line_simple_red.png and b/k3d/test/references/line_simple_red.png differ diff --git a/k3d/test/references/line_simplified_mesh.png b/k3d/test/references/line_simplified_mesh.png index e3e2cc96..8f5f30ba 100644 Binary files a/k3d/test/references/line_simplified_mesh.png and b/k3d/test/references/line_simplified_mesh.png differ diff --git a/k3d/test/references/line_thick.png b/k3d/test/references/line_thick.png index 2cc7cf0e..8aad3a06 100644 Binary files a/k3d/test/references/line_thick.png and b/k3d/test/references/line_thick.png differ diff --git a/k3d/test/references/line_thick_clipping_plane.png b/k3d/test/references/line_thick_clipping_plane.png index 2111772f..6a779e83 100644 Binary files a/k3d/test/references/line_thick_clipping_plane.png and b/k3d/test/references/line_thick_clipping_plane.png differ diff --git a/k3d/test/references/lines_mesh.png b/k3d/test/references/lines_mesh.png index b4decdf9..da2b6d25 100644 Binary files a/k3d/test/references/lines_mesh.png and b/k3d/test/references/lines_mesh.png differ diff --git a/k3d/test/references/lines_mesh_attribute.png b/k3d/test/references/lines_mesh_attribute.png index c7a55466..980cfe8f 100644 Binary files a/k3d/test/references/lines_mesh_attribute.png and b/k3d/test/references/lines_mesh_attribute.png differ diff --git a/k3d/test/references/lines_mesh_attribute_segment.png b/k3d/test/references/lines_mesh_attribute_segment.png index 9b148b43..edb078b4 100644 Binary files a/k3d/test/references/lines_mesh_attribute_segment.png and b/k3d/test/references/lines_mesh_attribute_segment.png differ diff --git a/k3d/test/references/lines_mesh_colors.png b/k3d/test/references/lines_mesh_colors.png index 513298b6..1b021eb7 100644 Binary files a/k3d/test/references/lines_mesh_colors.png and b/k3d/test/references/lines_mesh_colors.png differ diff --git a/k3d/test/references/lines_simple.png b/k3d/test/references/lines_simple.png index f024bdfb..4b037468 100644 Binary files a/k3d/test/references/lines_simple.png and b/k3d/test/references/lines_simple.png differ diff --git a/k3d/test/references/lines_simple_attribute.png b/k3d/test/references/lines_simple_attribute.png index 1cada250..1104808a 100644 Binary files a/k3d/test/references/lines_simple_attribute.png and b/k3d/test/references/lines_simple_attribute.png differ diff --git a/k3d/test/references/lines_simple_attribute_segment.png b/k3d/test/references/lines_simple_attribute_segment.png index eb6e3125..7f756cea 100644 Binary files a/k3d/test/references/lines_simple_attribute_segment.png and b/k3d/test/references/lines_simple_attribute_segment.png differ diff --git a/k3d/test/references/lines_simple_colors.png b/k3d/test/references/lines_simple_colors.png index 1195f8ae..807d7e3d 100644 Binary files a/k3d/test/references/lines_simple_colors.png and b/k3d/test/references/lines_simple_colors.png differ diff --git a/k3d/test/references/lines_thick.png b/k3d/test/references/lines_thick.png index 708eebed..dfa90699 100644 Binary files a/k3d/test/references/lines_thick.png and b/k3d/test/references/lines_thick.png differ diff --git a/k3d/test/references/lines_thick_attribute.png b/k3d/test/references/lines_thick_attribute.png index 4b52837e..f467ed5d 100644 Binary files a/k3d/test/references/lines_thick_attribute.png and b/k3d/test/references/lines_thick_attribute.png differ diff --git a/k3d/test/references/lines_thick_attribute_segment.png b/k3d/test/references/lines_thick_attribute_segment.png index 64670a06..80a6a8e0 100644 Binary files a/k3d/test/references/lines_thick_attribute_segment.png and b/k3d/test/references/lines_thick_attribute_segment.png differ diff --git a/k3d/test/references/lines_thick_colors.png b/k3d/test/references/lines_thick_colors.png index 7149e84e..939e09ff 100644 Binary files a/k3d/test/references/lines_thick_colors.png and b/k3d/test/references/lines_thick_colors.png differ diff --git a/k3d/test/references/linux/labels.png b/k3d/test/references/linux/labels.png index 9d045c64..1a70a569 100644 Binary files a/k3d/test/references/linux/labels.png and b/k3d/test/references/linux/labels.png differ diff --git a/k3d/test/references/linux/labels_without_box.png b/k3d/test/references/linux/labels_without_box.png index e8e42b75..50ae6f9f 100644 Binary files a/k3d/test/references/linux/labels_without_box.png and b/k3d/test/references/linux/labels_without_box.png differ diff --git a/k3d/test/references/linux/text.png b/k3d/test/references/linux/text.png index fd2e2242..60b8e142 100644 Binary files a/k3d/test/references/linux/text.png and b/k3d/test/references/linux/text.png differ diff --git a/k3d/test/references/linux/text2d.png b/k3d/test/references/linux/text2d.png index ee96dab5..f018b720 100644 Binary files a/k3d/test/references/linux/text2d.png and b/k3d/test/references/linux/text2d.png differ diff --git a/k3d/test/references/linux/text2d_without_box.png b/k3d/test/references/linux/text2d_without_box.png index b5b81b2b..b4b6a7a9 100644 Binary files a/k3d/test/references/linux/text2d_without_box.png and b/k3d/test/references/linux/text2d_without_box.png differ diff --git a/k3d/test/references/linux/text_without_box.png b/k3d/test/references/linux/text_without_box.png index 31c211d9..e4f76555 100644 Binary files a/k3d/test/references/linux/text_without_box.png and b/k3d/test/references/linux/text_without_box.png differ diff --git a/k3d/test/references/linux/texture_text.png b/k3d/test/references/linux/texture_text.png index 6c8e323a..cdd66d72 100644 Binary files a/k3d/test/references/linux/texture_text.png and b/k3d/test/references/linux/texture_text.png differ diff --git a/k3d/test/references/linux/vectors_labels.png b/k3d/test/references/linux/vectors_labels.png index 061846d2..e162a1aa 100644 Binary files a/k3d/test/references/linux/vectors_labels.png and b/k3d/test/references/linux/vectors_labels.png differ diff --git a/k3d/test/references/linux/vectors_labels_dynamic_head_size.png b/k3d/test/references/linux/vectors_labels_dynamic_head_size.png index 7a58d909..05fae46c 100644 Binary files a/k3d/test/references/linux/vectors_labels_dynamic_head_size.png and b/k3d/test/references/linux/vectors_labels_dynamic_head_size.png differ diff --git a/k3d/test/references/marching_cubes.png b/k3d/test/references/marching_cubes.png index 90fc1745..3a08720c 100644 Binary files a/k3d/test/references/marching_cubes.png and b/k3d/test/references/marching_cubes.png differ diff --git a/k3d/test/references/marching_cubes_dynamic_level.png b/k3d/test/references/marching_cubes_dynamic_level.png index 4d0833e2..4448000d 100644 Binary files a/k3d/test/references/marching_cubes_dynamic_level.png and b/k3d/test/references/marching_cubes_dynamic_level.png differ diff --git a/k3d/test/references/marching_cubes_non_uniformly_spaced.png b/k3d/test/references/marching_cubes_non_uniformly_spaced.png index 9739fa73..64284bfd 100644 Binary files a/k3d/test/references/marching_cubes_non_uniformly_spaced.png and b/k3d/test/references/marching_cubes_non_uniformly_spaced.png differ diff --git a/k3d/test/references/marching_cubes_smoothed.png b/k3d/test/references/marching_cubes_smoothed.png index 9c75e754..0c376ccb 100644 Binary files a/k3d/test/references/marching_cubes_smoothed.png and b/k3d/test/references/marching_cubes_smoothed.png differ diff --git a/k3d/test/references/marching_cubes_wireframe.png b/k3d/test/references/marching_cubes_wireframe.png index 0dbd54f4..7bc9a3bb 100644 Binary files a/k3d/test/references/marching_cubes_wireframe.png and b/k3d/test/references/marching_cubes_wireframe.png differ diff --git a/k3d/test/references/mesh.png b/k3d/test/references/mesh.png index 287b6a98..c40c57de 100644 Binary files a/k3d/test/references/mesh.png and b/k3d/test/references/mesh.png differ diff --git a/k3d/test/references/mesh_advanced.png b/k3d/test/references/mesh_advanced.png index 8dbb42f5..731f70d2 100644 Binary files a/k3d/test/references/mesh_advanced.png and b/k3d/test/references/mesh_advanced.png differ diff --git a/k3d/test/references/mesh_advanced_opacity.png b/k3d/test/references/mesh_advanced_opacity.png index cf2d79c8..b7fee5ee 100644 Binary files a/k3d/test/references/mesh_advanced_opacity.png and b/k3d/test/references/mesh_advanced_opacity.png differ diff --git a/k3d/test/references/mesh_advanced_smoothed.png b/k3d/test/references/mesh_advanced_smoothed.png index 7a24a4d7..a135e889 100644 Binary files a/k3d/test/references/mesh_advanced_smoothed.png and b/k3d/test/references/mesh_advanced_smoothed.png differ diff --git a/k3d/test/references/mesh_advanced_wireframe.png b/k3d/test/references/mesh_advanced_wireframe.png index 5b59d45c..1ae657d0 100644 Binary files a/k3d/test/references/mesh_advanced_wireframe.png and b/k3d/test/references/mesh_advanced_wireframe.png differ diff --git a/k3d/test/references/mesh_attribute.png b/k3d/test/references/mesh_attribute.png index 94dd5e81..7024ac5d 100644 Binary files a/k3d/test/references/mesh_attribute.png and b/k3d/test/references/mesh_attribute.png differ diff --git a/k3d/test/references/mesh_attribute_advanced.png b/k3d/test/references/mesh_attribute_advanced.png index c61c7f28..e13775db 100644 Binary files a/k3d/test/references/mesh_attribute_advanced.png and b/k3d/test/references/mesh_attribute_advanced.png differ diff --git a/k3d/test/references/mesh_attribute_advanced_clipping_planes.png b/k3d/test/references/mesh_attribute_advanced_clipping_planes.png index 8c753e86..1e1d9792 100644 Binary files a/k3d/test/references/mesh_attribute_advanced_clipping_planes.png and b/k3d/test/references/mesh_attribute_advanced_clipping_planes.png differ diff --git a/k3d/test/references/mesh_triangle_attribute.png b/k3d/test/references/mesh_triangle_attribute.png index 113127b1..b39aecdc 100644 Binary files a/k3d/test/references/mesh_triangle_attribute.png and b/k3d/test/references/mesh_triangle_attribute.png differ diff --git a/k3d/test/references/mesh_volume_data.png b/k3d/test/references/mesh_volume_data.png index 5081de23..6b7c40e8 100644 Binary files a/k3d/test/references/mesh_volume_data.png and b/k3d/test/references/mesh_volume_data.png differ diff --git a/k3d/test/references/mip.png b/k3d/test/references/mip.png index c7189cf7..d8638e47 100644 Binary files a/k3d/test/references/mip.png and b/k3d/test/references/mip.png differ diff --git a/k3d/test/references/mip_heart.png b/k3d/test/references/mip_heart.png index 205bdaa8..4eb5f2af 100644 Binary files a/k3d/test/references/mip_heart.png and b/k3d/test/references/mip_heart.png differ diff --git a/k3d/test/references/mip_heart_dynamic_mask_opacities.png b/k3d/test/references/mip_heart_dynamic_mask_opacities.png index 87ff9cbe..fe3dfb9a 100644 Binary files a/k3d/test/references/mip_heart_dynamic_mask_opacities.png and b/k3d/test/references/mip_heart_dynamic_mask_opacities.png differ diff --git a/k3d/test/references/mip_opacity_function.png b/k3d/test/references/mip_opacity_function.png index 910b735c..d44d962c 100644 Binary files a/k3d/test/references/mip_opacity_function.png and b/k3d/test/references/mip_opacity_function.png differ diff --git a/k3d/test/references/points_3d.png b/k3d/test/references/points_3d.png index b2f852b2..ec941260 100644 Binary files a/k3d/test/references/points_3d.png and b/k3d/test/references/points_3d.png differ diff --git a/k3d/test/references/points_3dSpecular.png b/k3d/test/references/points_3dSpecular.png index cb7307af..025909d2 100644 Binary files a/k3d/test/references/points_3dSpecular.png and b/k3d/test/references/points_3dSpecular.png differ diff --git a/k3d/test/references/points_3dSpecular_sizes.png b/k3d/test/references/points_3dSpecular_sizes.png index 2e2c73cc..35f03c31 100644 Binary files a/k3d/test/references/points_3dSpecular_sizes.png and b/k3d/test/references/points_3dSpecular_sizes.png differ diff --git a/k3d/test/references/points_3d_clipping_plane.png b/k3d/test/references/points_3d_clipping_plane.png index 9be428d0..f5b70ae4 100644 Binary files a/k3d/test/references/points_3d_clipping_plane.png and b/k3d/test/references/points_3d_clipping_plane.png differ diff --git a/k3d/test/references/points_3d_no_opacity.png b/k3d/test/references/points_3d_no_opacity.png index 374a8420..ac6a62de 100644 Binary files a/k3d/test/references/points_3d_no_opacity.png and b/k3d/test/references/points_3d_no_opacity.png differ diff --git a/k3d/test/references/points_3d_no_opacity_with_plane.png b/k3d/test/references/points_3d_no_opacity_with_plane.png index a5737eb3..f8ad1616 100644 Binary files a/k3d/test/references/points_3d_no_opacity_with_plane.png and b/k3d/test/references/points_3d_no_opacity_with_plane.png differ diff --git a/k3d/test/references/points_dot.png b/k3d/test/references/points_dot.png index 558d88f6..48912dda 100644 Binary files a/k3d/test/references/points_dot.png and b/k3d/test/references/points_dot.png differ diff --git a/k3d/test/references/points_flat.png b/k3d/test/references/points_flat.png index 1b216aae..0474a08f 100644 Binary files a/k3d/test/references/points_flat.png and b/k3d/test/references/points_flat.png differ diff --git a/k3d/test/references/points_mesh.png b/k3d/test/references/points_mesh.png index ade9d9ea..33149667 100644 Binary files a/k3d/test/references/points_mesh.png and b/k3d/test/references/points_mesh.png differ diff --git a/k3d/test/references/points_mesh_clipping_plane.png b/k3d/test/references/points_mesh_clipping_plane.png index cc94cef1..bed8c97c 100644 Binary files a/k3d/test/references/points_mesh_clipping_plane.png and b/k3d/test/references/points_mesh_clipping_plane.png differ diff --git a/k3d/test/references/points_mesh_high_detail.png b/k3d/test/references/points_mesh_high_detail.png index 0774bad2..c9f74429 100644 Binary files a/k3d/test/references/points_mesh_high_detail.png and b/k3d/test/references/points_mesh_high_detail.png differ diff --git a/k3d/test/references/points_mesh_low_detail.png b/k3d/test/references/points_mesh_low_detail.png index 270a47c6..c412ad44 100644 Binary files a/k3d/test/references/points_mesh_low_detail.png and b/k3d/test/references/points_mesh_low_detail.png differ diff --git a/k3d/test/references/points_mesh_sizes.png b/k3d/test/references/points_mesh_sizes.png index 9771d192..972feab0 100644 Binary files a/k3d/test/references/points_mesh_sizes.png and b/k3d/test/references/points_mesh_sizes.png differ diff --git a/k3d/test/references/stl.png b/k3d/test/references/stl.png index f015029a..f9bd17fb 100644 Binary files a/k3d/test/references/stl.png and b/k3d/test/references/stl.png differ diff --git a/k3d/test/references/stl_color.png b/k3d/test/references/stl_color.png index 33cf9533..52202af0 100644 Binary files a/k3d/test/references/stl_color.png and b/k3d/test/references/stl_color.png differ diff --git a/k3d/test/references/stl_smooth.png b/k3d/test/references/stl_smooth.png index f7ae0247..e736abb0 100644 Binary files a/k3d/test/references/stl_smooth.png and b/k3d/test/references/stl_smooth.png differ diff --git a/k3d/test/references/stl_wireframe.png b/k3d/test/references/stl_wireframe.png index 4f178004..c540c655 100644 Binary files a/k3d/test/references/stl_wireframe.png and b/k3d/test/references/stl_wireframe.png differ diff --git a/k3d/test/references/surface.png b/k3d/test/references/surface.png index f926fd29..0a57e415 100644 Binary files a/k3d/test/references/surface.png and b/k3d/test/references/surface.png differ diff --git a/k3d/test/references/surface_attribute.png b/k3d/test/references/surface_attribute.png index 43e678b5..6cc6d2f9 100644 Binary files a/k3d/test/references/surface_attribute.png and b/k3d/test/references/surface_attribute.png differ diff --git a/k3d/test/references/surface_attribute_low.png b/k3d/test/references/surface_attribute_low.png index 978c9c48..f6f44c2f 100644 Binary files a/k3d/test/references/surface_attribute_low.png and b/k3d/test/references/surface_attribute_low.png differ diff --git a/k3d/test/references/surface_attribute_low_dynamic_smooth.png b/k3d/test/references/surface_attribute_low_dynamic_smooth.png index 969b324a..6ae24b85 100644 Binary files a/k3d/test/references/surface_attribute_low_dynamic_smooth.png and b/k3d/test/references/surface_attribute_low_dynamic_smooth.png differ diff --git a/k3d/test/references/surface_attribute_low_dynamic_wireframe.png b/k3d/test/references/surface_attribute_low_dynamic_wireframe.png index 9ccd8119..93bf6b00 100644 Binary files a/k3d/test/references/surface_attribute_low_dynamic_wireframe.png and b/k3d/test/references/surface_attribute_low_dynamic_wireframe.png differ diff --git a/k3d/test/references/surface_dynamic_color.png b/k3d/test/references/surface_dynamic_color.png index 2edd423f..64e016ea 100644 Binary files a/k3d/test/references/surface_dynamic_color.png and b/k3d/test/references/surface_dynamic_color.png differ diff --git a/k3d/test/references/texture.png b/k3d/test/references/texture.png index 0d409de7..fe7e6c6f 100644 Binary files a/k3d/test/references/texture.png and b/k3d/test/references/texture.png differ diff --git a/k3d/test/references/texture_attribute.png b/k3d/test/references/texture_attribute.png index 218a9e73..174299f8 100644 Binary files a/k3d/test/references/texture_attribute.png and b/k3d/test/references/texture_attribute.png differ diff --git a/k3d/test/references/texture_attribute_dynamic_interpolation.png b/k3d/test/references/texture_attribute_dynamic_interpolation.png index 9f48116c..49693978 100644 Binary files a/k3d/test/references/texture_attribute_dynamic_interpolation.png and b/k3d/test/references/texture_attribute_dynamic_interpolation.png differ diff --git a/k3d/test/references/texture_dynamic_change.png b/k3d/test/references/texture_dynamic_change.png index 0be6cee2..49d391bc 100644 Binary files a/k3d/test/references/texture_dynamic_change.png and b/k3d/test/references/texture_dynamic_change.png differ diff --git a/k3d/test/references/vector_field.png b/k3d/test/references/vector_field.png index e217f17d..db985c6d 100644 Binary files a/k3d/test/references/vector_field.png and b/k3d/test/references/vector_field.png differ diff --git a/k3d/test/references/vector_field_3d.png b/k3d/test/references/vector_field_3d.png index 8443c520..2cda9118 100644 Binary files a/k3d/test/references/vector_field_3d.png and b/k3d/test/references/vector_field_3d.png differ diff --git a/k3d/test/references/vector_field_3d_no_head.png b/k3d/test/references/vector_field_3d_no_head.png index 14443558..6960b94f 100644 Binary files a/k3d/test/references/vector_field_3d_no_head.png and b/k3d/test/references/vector_field_3d_no_head.png differ diff --git a/k3d/test/references/vector_field_3d_scale.png b/k3d/test/references/vector_field_3d_scale.png index c16a3001..6b7f9f69 100644 Binary files a/k3d/test/references/vector_field_3d_scale.png and b/k3d/test/references/vector_field_3d_scale.png differ diff --git a/k3d/test/references/vector_field_no_head.png b/k3d/test/references/vector_field_no_head.png index e532742a..293ebe25 100644 Binary files a/k3d/test/references/vector_field_no_head.png and b/k3d/test/references/vector_field_no_head.png differ diff --git a/k3d/test/references/vector_field_scale.png b/k3d/test/references/vector_field_scale.png index 3285d40e..5cb93bb4 100644 Binary files a/k3d/test/references/vector_field_scale.png and b/k3d/test/references/vector_field_scale.png differ diff --git a/k3d/test/references/vectors.png b/k3d/test/references/vectors.png index 63e3a89e..b61aad7a 100644 Binary files a/k3d/test/references/vectors.png and b/k3d/test/references/vectors.png differ diff --git a/k3d/test/references/vectors_advance.png b/k3d/test/references/vectors_advance.png index e9975eb0..7517102f 100644 Binary files a/k3d/test/references/vectors_advance.png and b/k3d/test/references/vectors_advance.png differ diff --git a/k3d/test/references/volume.png b/k3d/test/references/volume.png index 31f83db7..54977025 100644 Binary files a/k3d/test/references/volume.png and b/k3d/test/references/volume.png differ diff --git a/k3d/test/references/volume_alpha_coef.png b/k3d/test/references/volume_alpha_coef.png index ec3d9b61..49f8b961 100644 Binary files a/k3d/test/references/volume_alpha_coef.png and b/k3d/test/references/volume_alpha_coef.png differ diff --git a/k3d/test/references/volume_heart.png b/k3d/test/references/volume_heart.png index 489ec9a3..d4c7ebfa 100644 Binary files a/k3d/test/references/volume_heart.png and b/k3d/test/references/volume_heart.png differ diff --git a/k3d/test/references/volume_heart_dynamic_mask_opacities.png b/k3d/test/references/volume_heart_dynamic_mask_opacities.png index cfb4e780..bc48aa3f 100644 Binary files a/k3d/test/references/volume_heart_dynamic_mask_opacities.png and b/k3d/test/references/volume_heart_dynamic_mask_opacities.png differ diff --git a/k3d/test/references/volume_opacity_function.png b/k3d/test/references/volume_opacity_function.png index 970309f4..3f670f21 100644 Binary files a/k3d/test/references/volume_opacity_function.png and b/k3d/test/references/volume_opacity_function.png differ diff --git a/k3d/test/references/voxels.png b/k3d/test/references/voxels.png index e7c3f5b4..441c8312 100644 Binary files a/k3d/test/references/voxels.png and b/k3d/test/references/voxels.png differ diff --git a/k3d/test/references/voxels_box.png b/k3d/test/references/voxels_box.png index 01c8e5f9..da88c90c 100644 Binary files a/k3d/test/references/voxels_box.png and b/k3d/test/references/voxels_box.png differ diff --git a/k3d/test/references/voxels_dynamic_opacity.png b/k3d/test/references/voxels_dynamic_opacity.png index 15d8f25b..4559feed 100644 Binary files a/k3d/test/references/voxels_dynamic_opacity.png and b/k3d/test/references/voxels_dynamic_opacity.png differ diff --git a/k3d/test/references/voxels_group.png b/k3d/test/references/voxels_group.png index be67d506..b6d35ad4 100644 Binary files a/k3d/test/references/voxels_group.png and b/k3d/test/references/voxels_group.png differ diff --git a/k3d/test/references/voxels_group_dynamic_opacity.png b/k3d/test/references/voxels_group_dynamic_opacity.png index 7ceb2c83..2c1f6518 100644 Binary files a/k3d/test/references/voxels_group_dynamic_opacity.png and b/k3d/test/references/voxels_group_dynamic_opacity.png differ diff --git a/k3d/test/references/voxels_group_opacity.png b/k3d/test/references/voxels_group_opacity.png index 7ceb2c83..2c1f6518 100644 Binary files a/k3d/test/references/voxels_group_opacity.png and b/k3d/test/references/voxels_group_opacity.png differ diff --git a/k3d/test/references/voxels_group_wireframe.png b/k3d/test/references/voxels_group_wireframe.png index bdf6da2d..34d411d7 100644 Binary files a/k3d/test/references/voxels_group_wireframe.png and b/k3d/test/references/voxels_group_wireframe.png differ diff --git a/k3d/test/references/voxels_outline.png b/k3d/test/references/voxels_outline.png index 859ed7d5..b0e774b6 100644 Binary files a/k3d/test/references/voxels_outline.png and b/k3d/test/references/voxels_outline.png differ diff --git a/k3d/test/references/voxels_outline_clipping_plane.png b/k3d/test/references/voxels_outline_clipping_plane.png index f8b91c19..30b06744 100644 Binary files a/k3d/test/references/voxels_outline_clipping_plane.png and b/k3d/test/references/voxels_outline_clipping_plane.png differ diff --git a/k3d/test/references/voxels_outline_dynamic_outlines_color.png b/k3d/test/references/voxels_outline_dynamic_outlines_color.png index c1c0b0fc..ef1b0cd5 100644 Binary files a/k3d/test/references/voxels_outline_dynamic_outlines_color.png and b/k3d/test/references/voxels_outline_dynamic_outlines_color.png differ diff --git a/k3d/test/references/voxels_outline_opacity.png b/k3d/test/references/voxels_outline_opacity.png index f5280594..e068a7fd 100644 Binary files a/k3d/test/references/voxels_outline_opacity.png and b/k3d/test/references/voxels_outline_opacity.png differ diff --git a/k3d/test/references/voxels_sparse.png b/k3d/test/references/voxels_sparse.png index 2df590ee..a08dbe7a 100644 Binary files a/k3d/test/references/voxels_sparse.png and b/k3d/test/references/voxels_sparse.png differ diff --git a/k3d/test/references/voxels_sparse_dynamic_opacity.png b/k3d/test/references/voxels_sparse_dynamic_opacity.png index 68169476..4abe8a8f 100644 Binary files a/k3d/test/references/voxels_sparse_dynamic_opacity.png and b/k3d/test/references/voxels_sparse_dynamic_opacity.png differ diff --git a/k3d/test/references/voxels_wireframe.png b/k3d/test/references/voxels_wireframe.png index 8c4ee8c0..d7e9e3ee 100644 Binary files a/k3d/test/references/voxels_wireframe.png and b/k3d/test/references/voxels_wireframe.png differ diff --git a/k3d/test/references/win32/labels.png b/k3d/test/references/win32/labels.png index e80675c6..6bcfda50 100644 Binary files a/k3d/test/references/win32/labels.png and b/k3d/test/references/win32/labels.png differ diff --git a/k3d/test/references/win32/labels_without_box.png b/k3d/test/references/win32/labels_without_box.png index 6921feed..7b8342c5 100644 Binary files a/k3d/test/references/win32/labels_without_box.png and b/k3d/test/references/win32/labels_without_box.png differ diff --git a/k3d/test/references/win32/text.png b/k3d/test/references/win32/text.png index 343f3fc0..eebdce04 100644 Binary files a/k3d/test/references/win32/text.png and b/k3d/test/references/win32/text.png differ diff --git a/k3d/test/references/win32/text2d.png b/k3d/test/references/win32/text2d.png index 876b0ba5..50106c3e 100644 Binary files a/k3d/test/references/win32/text2d.png and b/k3d/test/references/win32/text2d.png differ diff --git a/k3d/test/references/win32/text2d_without_box.png b/k3d/test/references/win32/text2d_without_box.png index c281bf96..6aa24304 100644 Binary files a/k3d/test/references/win32/text2d_without_box.png and b/k3d/test/references/win32/text2d_without_box.png differ diff --git a/k3d/test/references/win32/text_without_box.png b/k3d/test/references/win32/text_without_box.png index 0444dd3f..e85831b0 100644 Binary files a/k3d/test/references/win32/text_without_box.png and b/k3d/test/references/win32/text_without_box.png differ diff --git a/k3d/test/references/win32/texture_text.png b/k3d/test/references/win32/texture_text.png index dc07041c..70b62ec4 100644 Binary files a/k3d/test/references/win32/texture_text.png and b/k3d/test/references/win32/texture_text.png differ diff --git a/k3d/test/references/win32/vectors_labels.png b/k3d/test/references/win32/vectors_labels.png index 99345354..e3f16ca6 100644 Binary files a/k3d/test/references/win32/vectors_labels.png and b/k3d/test/references/win32/vectors_labels.png differ diff --git a/k3d/test/references/win32/vectors_labels_dynamic_head_size.png b/k3d/test/references/win32/vectors_labels_dynamic_head_size.png index b9df36f1..6de1148f 100644 Binary files a/k3d/test/references/win32/vectors_labels_dynamic_head_size.png and b/k3d/test/references/win32/vectors_labels_dynamic_head_size.png differ diff --git a/package.json b/package.json index 6156a2d5..b5db7163 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "k3d", - "version": "2.16.0", + "version": "2.16.1", "description": "3D visualization library", "keywords": [ "jupyter",