From d67b8abb1fa6db3ecdeb31f8f191db49638314bd Mon Sep 17 00:00:00 2001 From: etienne Date: Thu, 22 Mar 2018 18:44:21 -0400 Subject: [PATCH 1/6] [for dima] 5 minutes gl tests on ci --- .circleci/test.sh | 8 ++------ tasks/cibundle.js | 4 +--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/.circleci/test.sh b/.circleci/test.sh index c2e82b26442..c69ff9d0722 100755 --- a/.circleci/test.sh +++ b/.circleci/test.sh @@ -28,20 +28,16 @@ retry () { case $1 in jasmine) - npm run test-jasmine -- --skip-tags=gl,noCI,flaky || EXIT_STATE=$? + retry npm run test-jasmine -- --tags=flaky,gl exit $EXIT_STATE ;; jasmine2) - npm run test-jasmine -- --tags=gl --skip-tags=noCI,flaky || EXIT_STATE=$? - retry npm run test-jasmine -- --tags=flaky --skip-tags=noCI - npm run test-bundle || EXIT_STATE=$? + npm run test-jasmine -- --tags=gl || EXIT_STATE=$? exit $EXIT_STATE ;; image) - npm run test-image || EXIT_STATE=$? - npm run test-export || EXIT_STATE=$? npm run test-image-gl2d || EXIT_STATE=$? exit $EXIT_STATE ;; diff --git a/tasks/cibundle.js b/tasks/cibundle.js index f6f88ea87a5..f4f5a1afdd9 100644 --- a/tasks/cibundle.js +++ b/tasks/cibundle.js @@ -16,9 +16,7 @@ var _bundle = require('./util/browserify_wrapper'); _bundle(constants.pathToPlotlyIndex, constants.pathToPlotlyBuild, { standalone: 'Plotly', debug: true, - compressAttrs: true, - packFlat: true, - pathToMinBundle: constants.pathToPlotlyDistMin + compressAttrs: true }); // Browserify the geo assets From d867c55ea097a6a8858846d3f053e9db497aaffa Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 22 Mar 2018 21:57:25 -0400 Subject: [PATCH 2/6] Introduce point-cluster --- src/traces/scattergl/index.js | 74 +++++++++++++++++------------- src/traces/scatterpolargl/index.js | 1 + 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/traces/scattergl/index.js b/src/traces/scattergl/index.js index b7ab521e34d..262eaf389d0 100644 --- a/src/traces/scattergl/index.js +++ b/src/traces/scattergl/index.js @@ -12,7 +12,7 @@ var createRegl = require('regl'); var createScatter = require('regl-scatter2d'); var createLine = require('regl-line2d'); var createError = require('regl-error2d'); -var kdtree = require('kdgrass'); +var cluster = require('point-cluster'); var rgba = require('color-normalize'); var svgSdf = require('svg-path-sdf'); var arrayRange = require('array-range'); @@ -42,6 +42,7 @@ var SYMBOL_SVG_CIRCLE = Drawing.symbolFuncs[0](SYMBOL_SIZE * 0.05); var TOO_MANY_POINTS = 1e5; var DOT_RE = /-dot/; var OPEN_RE = /-open/; +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; function calc(gd, trace) { var fullLayout = gd._fullLayout; @@ -81,7 +82,7 @@ function calc(gd, trace) { // and it is also if(xa.type !== 'log' && ya.type !== 'log') { // FIXME: delegate this to webworker - stash.tree = kdtree(positions, 512); + stash.tree = cluster(positions); } else { var ids = stash.ids = new Array(count); for(i = 0; i < count; i++) { @@ -89,6 +90,7 @@ function calc(gd, trace) { } } + // create scene options and scene calcColorscales(trace); var options = sceneOptions(gd, subplot, trace, positions); @@ -114,6 +116,13 @@ function calc(gd, trace) { if(options.line && !scene.line2d) scene.line2d = true; if((options.errorX || options.errorY) && !scene.error2d) scene.error2d = true; + // FIXME: organize it in a more appropriate manner, probably in sceneOptions + // put point-cluster instance for optimized regl calc + if (options.marker) { + options.marker.cluster = stash.tree; + } + + // save scene options batch scene.lineOptions.push(options.line); scene.errorXOptions.push(options.errorX); @@ -176,6 +185,33 @@ function sceneOptions(gd, subplot, trace, positions) { } } + function makeErrorOptions(axLetter, errorOpts, vals) { + var options = {}; + options.positions = positions; + + var ax = AxisIDs.getFromId(gd, trace[axLetter + 'axis']); + var errors = options.errors = new Float64Array(4 * count); + var pOffset = {x: 0, y: 1}[axLetter]; + var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter]; + + for(var i = 0, p = 0; i < count; i++, p += 4) { + errors[p + eOffset[0]] = positions[i * 2 + pOffset] - ax.d2l(vals[i][axLetter + 's']) || 0; + errors[p + eOffset[1]] = ax.d2l(vals[i][axLetter + 'h']) - positions[i * 2 + pOffset] || 0; + errors[p + eOffset[2]] = 0; + errors[p + eOffset[3]] = 0; + } + + if(errorOpts.copy_ystyle) { + errorOpts = trace.error_y; + } + + options.capSize = errorOpts.width * 2; + options.lineWidth = errorOpts.thickness; + options.color = errorOpts.color; + + return options; + } + if(hasLines) { lineOptions = {}; lineOptions.thickness = trace.line.width; @@ -271,34 +307,9 @@ function sceneOptions(gd, subplot, trace, positions) { markerOptions = makeMarkerOptions(markerOpts); selectedOptions = makeSelectedOptions(trace.selected, markerOpts); unselectedOptions = makeSelectedOptions(trace.unselected, markerOpts); - markerOptions.positions = positions; - } - - function makeErrorOptions(axLetter, errorOpts, vals) { - var options = {}; - options.positions = positions; - - var ax = AxisIDs.getFromId(gd, trace[axLetter + 'axis']); - var errors = options.errors = new Float64Array(4 * count); - var pOffset = {x: 0, y: 1}[axLetter]; - var eOffset = {x: [0, 1, 2, 3], y: [2, 3, 0, 1]}[axLetter]; - - for(var i = 0, p = 0; i < count; i++, p += 4) { - errors[p + eOffset[0]] = positions[i * 2 + pOffset] - ax.d2l(vals[i][axLetter + 's']) || 0; - errors[p + eOffset[1]] = ax.d2l(vals[i][axLetter + 'h']) - positions[i * 2 + pOffset] || 0; - errors[p + eOffset[2]] = 0; - errors[p + eOffset[3]] = 0; - } - - if(errorOpts.copy_ystyle) { - errorOpts = trace.error_y; - } + if (!trace.unselected) unselectedOptions.opacity = DESELECTDIM; - options.capSize = errorOpts.width * 2; - options.lineWidth = errorOpts.thickness; - options.color = errorOpts.color; - - return options; + markerOptions.positions = positions; } function makeSelectedOptions(selected, markerOpts) { @@ -882,8 +893,8 @@ function plot(gd, subplot, cdata) { if(selectMode) { // create select2d if(!scene.select2d) { - // create scatter instance by cloning scatter2d - scene.select2d = createScatter(fullLayout._glcanvas.data()[1].regl, {clone: scene.scatter2d}); + // create select scatter instance by cloning scatter2d + scene.select2d = createScatter(fullLayout._glcanvas.data()[1].regl); } if(scene.scatter2d && scene.selectBatch && scene.selectBatch.length) { @@ -1126,7 +1137,6 @@ function selectPoints(searchInfo, polygon) { scene.selectBatch = []; scene.unselectBatch = []; } - if(!scene.selectBatch[stash.index]) { // enter every trace select mode for(i = 0; i < scene.count; i++) { diff --git a/src/traces/scatterpolargl/index.js b/src/traces/scatterpolargl/index.js index 8bd78e52393..ea6d94ddf21 100644 --- a/src/traces/scatterpolargl/index.js +++ b/src/traces/scatterpolargl/index.js @@ -98,6 +98,7 @@ function plot(container, subplot, cdata) { } } + var options = ScatterGl.sceneOptions(container, subplot, trace, positions); // set flags to create scene renderers From b7016da1e740b330af62803377042cfc221b7db9 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 22 Mar 2018 21:58:00 -0400 Subject: [PATCH 3/6] Add point-cluster dep --- package-lock.json | 27 +++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 28 insertions(+) diff --git a/package-lock.json b/package-lock.json index b24da60fab4..470e726704b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9188,6 +9188,33 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, + "point-cluster": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-2.0.0.tgz", + "integrity": "sha512-KyTmFOZUni8/RQ2KthS4RQEHTgijqn/2rWVerU4SgJKT6l5H/XrHisxdwbIAKurFBMCjQz7xzFPfJXQqCTsyyg==", + "requires": { + "array-bounds": "1.0.1", + "array-normalize": "1.1.3", + "binary-search-bounds": "2.0.4", + "clamp": "1.0.1", + "parse-rect": "1.2.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + }, + "parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "requires": { + "pick-by-alias": "1.2.0" + } + } + } + }, "point-in-big-polygon": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/point-in-big-polygon/-/point-in-big-polygon-2.0.0.tgz", diff --git a/package.json b/package.json index 1813e41c5b5..0536c72e619 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "ndarray-fill": "^1.0.2", "ndarray-homography": "^1.0.0", "ndarray-ops": "^1.2.2", + "point-cluster": "^2.0.0", "polybooljs": "^1.2.0", "regl": "^1.3.1", "regl-error2d": "^2.0.3", From 40159f83be30033c68f8eb69bd9b65d2378e14a1 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 23 Mar 2018 01:29:15 -0400 Subject: [PATCH 4/6] Fix scatterpolar clustering --- package.json | 1 - src/traces/scatterpolargl/index.js | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 0536c72e619..bcbf0bc92d5 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "glslify": "^6.1.1", "has-hover": "^1.0.1", "has-passive-events": "^1.0.0", - "kdgrass": "^1.0.1", "mapbox-gl": "0.44.1", "matrix-camera-controller": "^2.1.3", "mouse-change": "^1.4.0", diff --git a/src/traces/scatterpolargl/index.js b/src/traces/scatterpolargl/index.js index ea6d94ddf21..508e0357fcd 100644 --- a/src/traces/scatterpolargl/index.js +++ b/src/traces/scatterpolargl/index.js @@ -8,7 +8,7 @@ 'use strict'; -var kdtree = require('kdgrass'); +var cluster = require('point-cluster'); var isNumeric = require('fast-isnumeric'); var ScatterGl = require('../scattergl'); @@ -101,6 +101,12 @@ function plot(container, subplot, cdata) { var options = ScatterGl.sceneOptions(container, subplot, trace, positions); + stash.tree = cluster(positions); + + if (options.marker) { + options.marker.cluster = stash.tree; + } + // set flags to create scene renderers if(options.fill && !scene.fill2d) scene.fill2d = true; if(options.marker && !scene.scatter2d) scene.scatter2d = true; @@ -133,7 +139,6 @@ function plot(container, subplot, cdata) { stash.theta = thetaArray; stash.positions = positions; stash.count = count; - stash.tree = kdtree(positions, 512); }); return ScatterGl.plot(container, subplot, cdata); From cbe66025903623a5ab2382a35bc595a151d033cf Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 23 Mar 2018 01:33:15 -0400 Subject: [PATCH 5/6] Lintify --- src/traces/scattergl/index.js | 4 ++-- src/traces/scatterpolargl/index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/traces/scattergl/index.js b/src/traces/scattergl/index.js index 262eaf389d0..40c1e1989c5 100644 --- a/src/traces/scattergl/index.js +++ b/src/traces/scattergl/index.js @@ -118,7 +118,7 @@ function calc(gd, trace) { // FIXME: organize it in a more appropriate manner, probably in sceneOptions // put point-cluster instance for optimized regl calc - if (options.marker) { + if(options.marker) { options.marker.cluster = stash.tree; } @@ -307,7 +307,7 @@ function sceneOptions(gd, subplot, trace, positions) { markerOptions = makeMarkerOptions(markerOpts); selectedOptions = makeSelectedOptions(trace.selected, markerOpts); unselectedOptions = makeSelectedOptions(trace.unselected, markerOpts); - if (!trace.unselected) unselectedOptions.opacity = DESELECTDIM; + if(!trace.unselected) unselectedOptions.opacity = DESELECTDIM; markerOptions.positions = positions; } diff --git a/src/traces/scatterpolargl/index.js b/src/traces/scatterpolargl/index.js index 508e0357fcd..f850dd96383 100644 --- a/src/traces/scatterpolargl/index.js +++ b/src/traces/scatterpolargl/index.js @@ -103,7 +103,7 @@ function plot(container, subplot, cdata) { stash.tree = cluster(positions); - if (options.marker) { + if(options.marker) { options.marker.cluster = stash.tree; } From d97202356b9be95cc7293ab07e102de315283715 Mon Sep 17 00:00:00 2001 From: etienne Date: Fri, 23 Mar 2018 10:54:21 -0400 Subject: [PATCH 6/6] dep updates --- package-lock.json | 35 ++++++----------------------------- package.json | 2 +- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 470e726704b..195331ff81d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6865,11 +6865,6 @@ "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-1.0.1.tgz", "integrity": "sha1-PL0D6d6tnA9vZszblkUOXOzGQOA=" }, - "kdgrass": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kdgrass/-/kdgrass-1.0.1.tgz", - "integrity": "sha512-2sfleTaNfu4AQdL9Om42i7D+NnnIwTd+MJYkbCdyv1DvFtHkLLBc8ZwrM2nD1zp4AuSBzCfoDSWcba4c7iHodQ==" - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -8959,9 +8954,9 @@ "dev": true }, "parse-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.1.1.tgz", - "integrity": "sha512-SjynuO1UNvW9EvQJa5arv5edLkdf6lzTVTBmTW+FPACLaYahRCam8jJeICoOyLv27e3lY7Mo6m3qh6ASxxfR1A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", "requires": { "pick-by-alias": "1.2.0" } @@ -10013,12 +10008,9 @@ } }, "regl-scatter2d": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-2.1.17.tgz", - "integrity": "sha512-G0/VFuXVHgYp1/F3GkY+7+28OIBOhd/bmVCmUw43tsnb0h3N8p2hJz5xyrD4mLaAF+cG06Ko/Gn2FEbxwC58AA==", + "version": "github:dfcreative/regl-scatter2d#b1b4e8074c8be04f36d67e591b31bfa27fb72832", "requires": { "array-range": "1.0.1", - "binary-search-bounds": "2.0.4", "bubleify": "1.1.0", "clamp": "1.0.1", "color-id": "1.1.0", @@ -10027,18 +10019,11 @@ "glslify": "6.1.1", "is-iexplorer": "1.0.0", "object-assign": "4.1.1", - "parse-rect": "1.1.1", + "parse-rect": "1.2.0", "pick-by-alias": "1.2.0", - "snap-points-2d": "3.2.0", + "point-cluster": "2.0.0", "to-float32": "1.0.0", "update-diff": "1.1.0" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" - } } }, "remove-trailing-separator": { @@ -10787,14 +10772,6 @@ "nodemailer-shared": "1.1.0" } }, - "snap-points-2d": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/snap-points-2d/-/snap-points-2d-3.2.0.tgz", - "integrity": "sha1-DhniKjoOlrziHN9cfx1+1blnRfA=", - "requires": { - "array-bounds": "1.0.1" - } - }, "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", diff --git a/package.json b/package.json index bcbf0bc92d5..86f286be6ab 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "regl": "^1.3.1", "regl-error2d": "^2.0.3", "regl-line2d": "^2.1.5", - "regl-scatter2d": "^2.1.17", + "regl-scatter2d": "github:dfcreative/regl-scatter2d", "right-now": "^1.0.0", "robust-orientation": "^1.1.3", "sane-topojson": "^2.0.0",