Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion etc/three-loader-3dtiles.api.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## API Report File for "three-loader-3dtiles"
## API Report File for "@abyss/three-loader-3dtiles"

> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).

Expand All @@ -8,6 +8,7 @@ import { Blending } from 'three';
import { Camera } from 'three';
import { Color } from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
import { LoaderOptions as LoaderGLOptions } from '@loaders.gl/core';
import { LoadingManager } from 'three';
import { Material } from 'three';
import { Mesh } from 'three';
Expand Down Expand Up @@ -57,6 +58,8 @@ export class Loader3DTiles {
static loadGeoJSON(props: GeoJSONLoaderProps): Promise<Object3D>;
}

export { LoaderGLOptions }

// @public
export interface LoaderOptions {
basisTranscoderPath?: string;
Expand All @@ -67,6 +70,7 @@ export interface LoaderOptions {
dracoDecoderPath?: string;
gltfLoader?: GLTFLoader;
googleApiKey?: string;
loaderGLOptions?: LoaderGLOptions;
material?: Material;
maxConcurrency?: number;
maximumMemoryUsage?: number;
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "three-loader-3dtiles",
"name": "@abyss/three-loader-3dtiles",
"version": "1.2.7",
"description": "A 3D Tiles loader for Three.js",
"main": "dist/lib/three-loader-3dtiles.umd.cjs",
Expand All @@ -8,9 +8,8 @@
"license": "Apache-2.0",
"repository": {
"type": "git",
"url": "git+https://github.com/nytimes/three-loader-3dtiles.git"
"url": "git+https://github.com/abyss-solutions/three-loader-3dtiles.git"
},
"homepage": "https://github.com/nytimes/three-loader-3dtiles",
"directories": {
"example": "examples"
},
Expand Down Expand Up @@ -45,6 +44,7 @@
"docs": "npm run build:types && npm run api:extract && npm run api:generate",
"docs:production": "npm run build:types && npm run api:extract:production && npm run api:generate",
"build:production": "export NODE_ENV=production || set NODE_ENV=production && npm run build",
"build:production:lib": "export NODE_ENV=production || set NODE_ENV=production && npm run build:lib && npm run build:types && npm run api:extract:production",
"test": "mocha --experimental-specifier-resolution=node --loader=ts-node/esm test/**/*.spec.ts"
},
"browserslist": [
Expand Down
207 changes: 105 additions & 102 deletions src/draping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,128 +4,131 @@
* https://ieeexplore.ieee.org/abstract/document/8811991
*/
import {
Vector2,
Scene,
Object3D,
ShaderMaterial,
MeshBasicMaterial,
WebGLRenderTarget,
NearestFilter,
WebGLRenderer,
DoubleSide,
FloatType,
RGBAFormat,
NormalBlending,
Blending
} from 'three'
Vector2,
Scene,
Object3D,
ShaderMaterial,
MeshBasicMaterial,
WebGLRenderTarget,
NearestFilter,
WebGLRenderer,
DoubleSide,
FloatType,
RGBAFormat,
NormalBlending,
Blending,
} from 'three';

import type { Viewport } from './types';

let target: WebGLRenderTarget | null = null;
let targetRenderer: WebGLRenderer | null = null;
let targetScene: Scene | null = null;
let targetModel: Object3D | null = null;
let targetModel: Object3D | null = null;

interface DrapingShaderOptions {
/** Minimum terrain height when searching for a matching vertex to the GEOJson overlay. Default: `0` */
minHeight: number,
/** Maximum terrain height when searching for a matching vertex to the GEOJson overlay. Default: `300` */
maxHeight: number,
/** Number of samples to average around the render target cordinate when draping the GEOJson overlay. Default: `4` */
samples: number,
/** Number of pixels to step toward each sample when averaging the samples. Default: 4.0 */
sampleStep: number,
/** Opacity of the draped colors. Default: `0.5` */
opacity: number,
/** Blending algoritum of the draped colors. Default: `THREE.NormalBlending` */
blendingType: Blending
/** Minimum terrain height when searching for a matching vertex to the GEOJson overlay. Default: `0` */
minHeight: number;
/** Maximum terrain height when searching for a matching vertex to the GEOJson overlay. Default: `300` */
maxHeight: number;
/** Number of samples to average around the render target cordinate when draping the GEOJson overlay. Default: `4` */
samples: number;
/** Number of pixels to step toward each sample when averaging the samples. Default: 4.0 */
sampleStep: number;
/** Opacity of the draped colors. Default: `0.5` */
opacity: number;
/** Blending algoritum of the draped colors. Default: `THREE.NormalBlending` */
blendingType: Blending;
}

const defaultShaderOptions: DrapingShaderOptions = {
minHeight: 0,
maxHeight: 300,
samples: 4,
sampleStep: 4.0,
opacity: 0.5,
blendingType: NormalBlending
}
minHeight: 0,
maxHeight: 300,
samples: 4,
sampleStep: 4.0,
opacity: 0.5,
blendingType: NormalBlending,
};

function setup(
viewport: Viewport,
model: Object3D,
renderer: WebGLRenderer,
shaderOptions: DrapingShaderOptions = defaultShaderOptions
viewport: Viewport,
model: Object3D,
renderer: WebGLRenderer,
shaderOptions: DrapingShaderOptions = defaultShaderOptions,
) {
if ( target ) {
target.dispose();
}

if (!targetRenderer) {
targetRenderer = renderer;
}

const options = { ...defaultShaderOptions, ...shaderOptions };

target = new WebGLRenderTarget(viewport.width * viewport.devicePixelRatio, viewport.height * viewport.devicePixelRatio);
target.texture.minFilter = NearestFilter;
target.texture.magFilter = NearestFilter;
target.stencilBuffer = false;
target.texture.format = RGBAFormat;
target.texture.type = FloatType;

targetRenderer.setPixelRatio(devicePixelRatio);
targetRenderer.setSize(viewport.width, viewport.height);
targetRenderer.setRenderTarget(target);

targetScene = new Scene();
targetScene.overrideMaterial = positionShaderMaterial;
targetModel = model;

drapingMaterial.uniforms.tPosition.value = target.texture;
drapingMaterial.uniforms.minHeight.value = options.minHeight;
drapingMaterial.uniforms.maxHeight.value = options.maxHeight;
drapingMaterial.uniforms.samples.value = options.samples;
drapingMaterial.uniforms.sampleStep.value = options.sampleStep;
drapingMaterial.uniforms.opacity.value = options.opacity;
drapingMaterial.blending = options.blendingType;
if (target) {
target.dispose();
}

if (!targetRenderer) {
targetRenderer = renderer;
}

const options = { ...defaultShaderOptions, ...shaderOptions };

target = new WebGLRenderTarget(
viewport.width * viewport.devicePixelRatio,
viewport.height * viewport.devicePixelRatio,
);
target.texture.minFilter = NearestFilter;
target.texture.magFilter = NearestFilter;
target.stencilBuffer = false;
target.texture.format = RGBAFormat;
target.texture.type = FloatType;

targetRenderer.setPixelRatio(devicePixelRatio);
targetRenderer.setSize(viewport.width, viewport.height);
targetRenderer.setRenderTarget(target);

targetScene = new Scene();
targetScene.overrideMaterial = positionShaderMaterial;
targetModel = model;

drapingMaterial.uniforms.tPosition.value = target.texture;
drapingMaterial.uniforms.minHeight.value = options.minHeight;
drapingMaterial.uniforms.maxHeight.value = options.maxHeight;
drapingMaterial.uniforms.samples.value = options.samples;
drapingMaterial.uniforms.sampleStep.value = options.sampleStep;
drapingMaterial.uniforms.opacity.value = options.opacity;
drapingMaterial.blending = options.blendingType;
}
function resizeRenderTarget(viewport: Viewport) {
target.setSize(viewport.width * viewport.devicePixelRatio, viewport.height * viewport.devicePixelRatio);
targetRenderer.setPixelRatio(devicePixelRatio);
targetRenderer.setSize(viewport.width, viewport.height);
target.setSize(viewport.width * viewport.devicePixelRatio, viewport.height * viewport.devicePixelRatio);
targetRenderer.setPixelRatio(devicePixelRatio);
targetRenderer.setSize(viewport.width, viewport.height);
}

function update(camera) {
if (targetRenderer) {
const oldParent = targetModel.parent;
targetScene.add(targetModel);
targetRenderer.setRenderTarget(target);
targetRenderer.render(targetScene, camera);
if (oldParent) {
oldParent.add(targetModel);
}
targetRenderer.setRenderTarget(null);
if (targetRenderer) {
const oldParent = targetModel.parent;
targetScene.add(targetModel);
targetRenderer.setRenderTarget(target);
targetRenderer.render(targetScene, camera);
if (oldParent) {
oldParent.add(targetModel);
}
targetRenderer.setRenderTarget(null);
}
}

// For syntax highlighting
const glsl = (x:any) => x.toString();
const glsl = (x: any) => x.toString();

const positionShaderMaterial = new ShaderMaterial({
vertexShader: glsl`
vertexShader: glsl`
varying vec3 vPosition;
void main() {
vPosition = (modelMatrix * vec4(position, 1.0)).xyz;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragmentShader: glsl`
fragmentShader: glsl`
varying vec3 vPosition;
void main() {
gl_FragColor = vec4(vPosition, 1.0);
}
`,
side: DoubleSide
side: DoubleSide,
});

const drapingVertexShader = glsl`
Expand Down Expand Up @@ -212,21 +215,21 @@ const drapingFragmentShader = glsl`
}
`;

const drapingMaterial = new ShaderMaterial( {
vertexShader: drapingVertexShader,
fragmentShader: drapingFragmentShader,
uniforms: {
tPosition: { value: null },
minHeight: { value: 0.0 },
maxHeight: { value: 300.0 },
opacity: { value: 0.5 },
samples: { value: 4 },
sampleStep: { value: 4.0 }
},
vertexColors: true,
transparent: true,
depthTest: false,
blending: NormalBlending
const drapingMaterial = new ShaderMaterial({
vertexShader: drapingVertexShader,
fragmentShader: drapingFragmentShader,
uniforms: {
tPosition: { value: null },
minHeight: { value: 0.0 },
maxHeight: { value: 300.0 },
opacity: { value: 0.5 },
samples: { value: 4 },
sampleStep: { value: 4.0 },
},
vertexColors: true,
transparent: true,
depthTest: false,
blending: NormalBlending,
});

export { target, setup, resizeRenderTarget, update, drapingMaterial, DrapingShaderOptions }
export { target, setup, resizeRenderTarget, update, drapingMaterial, DrapingShaderOptions };
9 changes: 4 additions & 5 deletions src/gradients.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Color } from 'three'
import { Color } from 'three';
type Gradient = Array<[number, Color]>;

const Gradients: {[key: string] : Gradient } = {
const Gradients: { [key: string]: Gradient } = {
// From chroma spectral http://gka.github.io/chroma.js/
SPECTRAL: [
[0, new Color(0.3686, 0.3098, 0.6353)],
Expand Down Expand Up @@ -108,7 +108,6 @@ const Gradients: {[key: string] : Gradient } = {
[0.04, new Color(1, 1, 1)],
[1.0, new Color(1, 1, 1)],
],
}

export {Gradients, Gradient}
};

export { Gradients, Gradient };
Loading