Skip to content

Commit

Permalink
Merge pull request #37 from TileDB-Inc/mg/show-fraction-of-points
Browse files Browse the repository at this point in the history
show fraction of points added
  • Loading branch information
MargrietGroenendijk committed Jul 7, 2022
2 parents 6792d76 + 7cfcb41 commit 0b211d8
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 20 deletions.
4 changes: 3 additions & 1 deletion pybabylonjs/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"wheel_precision": -1,
"point_size": 1,
"background_color": [0, 0, 0, 1],
"bbox": {"X": [0, 1], "Y": [0, 1], "Z": [0, 1]},
"bbox": None,
"rgb_max": None,
"time_offset": 0,
"classes": {"numbers": [], "names": []},
"mbtoken": None,
Expand All @@ -27,6 +28,7 @@
"array_name": None,
"token": None,
"tiledb_env": None,
"show_fraction": None,
}


Expand Down
110 changes: 91 additions & 19 deletions src/widget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ import {
import { MODULE_NAME, MODULE_VERSION } from './version';
import { ArcRotateCamera, Color3, Color4, Engine, PointsCloudSystem, Scene, SceneLoader, StandardMaterial,
SolidParticleSystem, MeshBuilder,
Vector3,
Texture} from '@babylonjs/core';
Vector3, Texture } from '@babylonjs/core';
import {AdvancedDynamicTexture, Control, StackPanel, Slider, TextBlock} from 'babylonjs-gui';
import "@babylonjs/loaders/glTF";
import "@babylonjs/core/Debug/debugLayer";
Expand All @@ -33,6 +32,7 @@ export class BabylonBaseModel extends DOMWidgetModel {
};
}


abstract class BabylonBaseView extends DOMWidgetView {
canvas?: HTMLCanvasElement;
engine?: Engine;
Expand Down Expand Up @@ -88,6 +88,7 @@ abstract class BabylonBaseView extends DOMWidgetView {
}
}


export class BabylonPointCloudModel extends BabylonBaseModel {
defaults(): any {
return {
Expand All @@ -105,6 +106,7 @@ export class BabylonPointCloudModel extends BabylonBaseModel {
static view_name = 'BabylonPointCloudView';
}


export class BabylonPointCloudView extends BabylonBaseView {
protected async createScene(): Promise<Scene> {
return super.createScene().then(async scene => {
Expand All @@ -114,6 +116,7 @@ export class BabylonPointCloudView extends BabylonBaseView {
var isTopo = false;
var isGltf = false;

var dataIn: any
var data: any

if (this.values.mode === "time"){
Expand All @@ -129,16 +132,19 @@ export class BabylonPointCloudView extends BabylonBaseView {
if (this.values.source === "cloud"){
var dataUnsorted = await loadPointCloud(this.values).then((results) => {return results});
if (isTime){
data = sortDataArrays(dataUnsorted);
dataIn = sortDataArrays(dataUnsorted);
}else{
data = dataUnsorted;
dataIn = dataUnsorted;
}
}else{
data = this.values.data;
dataIn = this.values.data;
}

console.log("data")
console.log(data)
if (this.values.show_fraction){
data = reduceDataArrays(dataIn, this.values.show_fraction);
}else{
data = dataIn;
}

const numCoords = data.X.length;
const gltfData = this.values.gltf_data;
Expand All @@ -151,15 +157,41 @@ export class BabylonPointCloudView extends BabylonBaseView {
const topo_offset = this.values.topo_offset;
const scale = this.zScale;
let doClear = false;

const xmin = data.X.reduce((accum: number, currentNumber: number) => Math.min(accum, currentNumber));
const xmax = data.X.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const ymin = data.Y.reduce((accum: number, currentNumber: number) => Math.min(accum, currentNumber));
const ymax = data.Y.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const redmax = data.Red.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const greenmax = data.Green.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const bluemax = data.Blue.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const rgbMax = Math.max(redmax, greenmax, bluemax);

var xmin: number
var xmax: number
var ymin: number
var ymax: number
var zmin: number
var zmax: number
var rgbMax: number

if (this.values.bbox) {
xmin = this.values.bbox.X[0];
xmax = this.values.bbox.X[1];
ymin = this.values.bbox.Y[0];
ymax = this.values.bbox.Y[1];
zmin = this.values.bbox.Z[0];
zmax = this.values.bbox.Z[1];
}
else {
xmin = data.X.reduce((accum: number, currentNumber: number) => Math.min(accum, currentNumber));
xmax = data.X.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
ymin = data.Y.reduce((accum: number, currentNumber: number) => Math.min(accum, currentNumber));
ymax = data.Y.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
zmin = data.Z.reduce((accum: number, currentNumber: number) => Math.min(accum, currentNumber));
zmax = data.Z.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
}

if (this.values.rgb_max) {
rgbMax = this.values.rgb_max;
}
else {
const redmax = data.Red.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const greenmax = data.Green.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
const bluemax = data.Blue.reduce((accum: number, currentNumber: number) => Math.max(accum, currentNumber));
rgbMax = Math.max(redmax, greenmax, bluemax);
}

scene.clearColor = new Color4(backgroundColor[0], backgroundColor[1], backgroundColor[2],backgroundColor[3]);

Expand All @@ -181,7 +213,6 @@ export class BabylonPointCloudView extends BabylonBaseView {
(data.Z[i]-topo_offset) * scale,
data.Y[i]
);

if (isTime) {
particle.color = scene.clearColor;
}
Expand All @@ -202,10 +233,11 @@ export class BabylonPointCloudView extends BabylonBaseView {
var blob = new Blob([gltfData]);
var url = URL.createObjectURL(blob);
tasks.push(SceneLoader.AppendAsync(url, "", scene, null, ".gltf"));
}
};

await Promise.all(tasks);
scene.createDefaultCameraOrLight(true, true, false);

if (isTime || isClass) {

var advancedTexture = AdvancedDynamicTexture.CreateFullscreenUI(
Expand Down Expand Up @@ -318,13 +350,14 @@ export class BabylonPointCloudView extends BabylonBaseView {
if (this.wheelPrecision > 0)
camera.wheelPrecision = this.wheelPrecision;
camera.alpha += Math.PI;
camera.setTarget(new Vector3((xmin + xmax) / 2, 0, (ymin + ymax) / 2));
camera.setTarget(new Vector3((xmin + xmax) / 2, ((zmin + zmax) / 2)*0.5, (ymin + ymax) / 2));
camera.attachControl(this.canvas, false);
return scene;
});
}
}


export class BabylonMBRSModel extends BabylonBaseModel {
defaults(): any {
return {
Expand All @@ -342,6 +375,7 @@ export class BabylonMBRSModel extends BabylonBaseModel {
static view_name = 'BabylonMBRSView';
}


export class BabylonMBRSView extends BabylonBaseView {
protected async createScene(): Promise<Scene> {
return super.createScene().then( ( scene ) => {
Expand Down Expand Up @@ -412,6 +446,7 @@ export class BabylonMBRSView extends BabylonBaseView {
}
}


export class BabylonImageModel extends BabylonBaseModel {
defaults(): any {
return {
Expand All @@ -429,6 +464,7 @@ export class BabylonImageModel extends BabylonBaseModel {
static view_name = 'BabylonImageView';
}


export class BabylonImageView extends BabylonBaseView {

protected async createScene(): Promise<Scene> {
Expand Down Expand Up @@ -476,6 +512,7 @@ export class BabylonImageView extends BabylonBaseView {
}
}


async function loadPointCloud(values: {name_space: string, array_name: string, bbox: { X: number[], Y: number[], Z: number[]}, token: string, tiledb_env: string}) {

const config: Record<string, any> = {};
Expand Down Expand Up @@ -505,6 +542,7 @@ async function loadPointCloud(values: {name_space: string, array_name: string, b

}


function sortDataArrays(data: any){

const GpsTime = data.GpsTime
Expand All @@ -521,6 +559,7 @@ function sortDataArrays(data: any){

}


function sortArrays(arrays: any, comparator = (a: number, b: number) => (a < b) ? -1 : (a > b) ? 1 : 0) {

const arrayKeys = Object.keys(arrays);
Expand All @@ -539,4 +578,37 @@ function sortArrays(arrays: any, comparator = (a: number, b: number) => (a < b)
});
return sortedArrays;
}
}


function reduceDataArrays(data: any, show_fraction: number){

const GpsTime = data.GpsTime
const X = data.X
const Y = data.Y
const Z = data.Z
const Red = data.Red
const Green = data.Green
const Blue = data.Blue

const reducedData = reduceArrays({GpsTime, X, Y, Z, Red, Green, Blue}, show_fraction)

return reducedData;
}


function reduceArrays(arrays: any, show_fraction: number){

const arrayKeys = Object.keys(arrays);
const reducedArrays: any = {};

for (let arrayKey of arrayKeys) {
if (Array.isArray(arrays[arrayKey])){
reducedArrays[arrayKey] = arrays[arrayKey].filter(function(value: any, index: any, Arr: any) {
return index % show_fraction == 0;
});
}
}

return reducedArrays;
}

0 comments on commit 0b211d8

Please sign in to comment.