@damienmortini/three 0.1.131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +5 -0
- package/copyExamples.js +15 -0
- package/ecs/THREEView.js +31 -0
- package/examples/loaders/BasisTextureLoader.js +783 -0
- package/examples/loaders/DRACOLoader.js +587 -0
- package/examples/loaders/GLTFLoader.js +4237 -0
- package/examples/objects/Lensflare.js +389 -0
- package/examples/utils/BufferGeometryUtils.js +943 -0
- package/gpgpu/THREEGPGPUSystem.js +175 -0
- package/loader/THREELoader.js +112 -0
- package/loader/meshoptimizerdecoder/THREE.EXT_meshopt_compression.js +41 -0
- package/loader/meshoptimizerdecoder/meshopt_decoder.js +129 -0
- package/material/THREEBaseMaterial.js +68 -0
- package/material/THREEPBRMaterial.js +107 -0
- package/material/THREEShaderMaterial.js +95 -0
- package/object/THREELine.js +113 -0
- package/object/THREEMotionVectorObject.js +284 -0
- package/object/THREERibbon.js +49 -0
- package/object/THREESky.js +279 -0
- package/object/THREESprite.js +96 -0
- package/object/THREESpriteAnimation.js +103 -0
- package/object/THREEText.js +240 -0
- package/package.json +33 -0
- package/renderer/THREERenderer.js +121 -0
- package/renderer/THREEStereoRenderer.js +60 -0
- package/renderer/THREEWebGLRenderTarget2D.js +63 -0
- package/shader/THREEBaseShader.js +33 -0
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@damienmortini/three",
|
|
3
|
+
"version": "0.1.131",
|
|
4
|
+
"description": "Three.js helpers",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"install": "npm run copyexamples",
|
|
7
|
+
"copyexamples": "node copyExamples.js"
|
|
8
|
+
},
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/damienmortini/lib",
|
|
15
|
+
"directory": "packages/three"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"three",
|
|
19
|
+
"3d",
|
|
20
|
+
"helpers",
|
|
21
|
+
"library"
|
|
22
|
+
],
|
|
23
|
+
"author": "Damien Mortini",
|
|
24
|
+
"license": "ISC",
|
|
25
|
+
"bugs": "https://github.com/damienmortini/lib/issues",
|
|
26
|
+
"homepage": "https://github.com/damienmortini/lib/tree/master/packages/three",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@damienmortini/core": "^0.2.106",
|
|
29
|
+
"fs-extra": "^10.0.0",
|
|
30
|
+
"three": "0.132.2"
|
|
31
|
+
},
|
|
32
|
+
"gitHead": "2629a6ebd623d7cd56684172d8ca6edf1af25eaf"
|
|
33
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { WebGLRenderer } from '../../../three/src/renderers/WebGLRenderer.js'
|
|
2
|
+
import { WebGLRenderTarget } from '../../../three/src/renderers/WebGLRenderTarget.js'
|
|
3
|
+
import { DepthTexture } from '../../../three/src/textures/DepthTexture.js'
|
|
4
|
+
import { RGBAFormat } from '../../../three/src/constants.js'
|
|
5
|
+
import { LinearFilter } from '../../../three/src/constants.js'
|
|
6
|
+
import { UnsignedShortType } from '../../../three/src/constants.js'
|
|
7
|
+
import { Scene } from '../../../three/src/scenes/Scene.js'
|
|
8
|
+
import { OrthographicCamera } from '../../../three/src/cameras/OrthographicCamera.js'
|
|
9
|
+
import { Mesh } from '../../../three/src/objects/Mesh.js'
|
|
10
|
+
import { PlaneBufferGeometry } from '../../../three/src/geometries/PlaneBufferGeometry.js'
|
|
11
|
+
|
|
12
|
+
export default class THREERenderer extends WebGLRenderer {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(Object.assign({ antialias: true }, options))
|
|
15
|
+
|
|
16
|
+
this.filters = []
|
|
17
|
+
this._renderTargets = new Map()
|
|
18
|
+
|
|
19
|
+
const renderTargetIn = new WebGLRenderTarget(this.domElement.width, this.domElement.height, {
|
|
20
|
+
format: RGBAFormat,
|
|
21
|
+
minFilter: LinearFilter,
|
|
22
|
+
magFilter: LinearFilter,
|
|
23
|
+
stencilBuffer: false,
|
|
24
|
+
})
|
|
25
|
+
renderTargetIn.texture.generateMipmaps = false
|
|
26
|
+
|
|
27
|
+
const renderTargetOut = renderTargetIn.clone()
|
|
28
|
+
renderTargetOut.texture.generateMipmaps = false
|
|
29
|
+
|
|
30
|
+
if (this.context.getExtension('WEBGL_depth_texture')) {
|
|
31
|
+
renderTargetIn.depthTexture = new DepthTexture()
|
|
32
|
+
renderTargetIn.depthTexture.type = UnsignedShortType
|
|
33
|
+
renderTargetOut.depthTexture = new DepthTexture()
|
|
34
|
+
renderTargetOut.depthTexture.type = UnsignedShortType
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
this._renderTargets.set(this, {
|
|
38
|
+
in: renderTargetIn,
|
|
39
|
+
out: renderTargetOut,
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
this.scene = new Scene()
|
|
43
|
+
this.scene.camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1)
|
|
44
|
+
this._quad = new Mesh(new PlaneBufferGeometry(2, 2))
|
|
45
|
+
this._quad.frustumCulled = false
|
|
46
|
+
this.scene.add(this._quad)
|
|
47
|
+
|
|
48
|
+
// Fix to make WebGLRenderer.render extendable
|
|
49
|
+
this._render = this.render
|
|
50
|
+
delete this.render
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
applyFilter(filter, renderTargetIn, renderTargetOut) {
|
|
54
|
+
this._quad.material = filter
|
|
55
|
+
if (filter.renderTargetTexture) {
|
|
56
|
+
filter.renderTargetTexture = renderTargetIn.texture
|
|
57
|
+
}
|
|
58
|
+
if (filter.renderTargetDepthTexture && renderTargetIn.depthTexture) {
|
|
59
|
+
filter.renderTargetDepthTexture = renderTargetIn.depthTexture
|
|
60
|
+
}
|
|
61
|
+
this._render(this.scene, this.scene.camera, renderTargetOut)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
resize(width, height) {
|
|
65
|
+
this.setSize(width, height, false)
|
|
66
|
+
const renderTargets = this._renderTargets.get(this)
|
|
67
|
+
renderTargets.in.setSize(width, height)
|
|
68
|
+
renderTargets.out.setSize(width, height)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
render({ scene, camera = undefined, filters = this.filters, renderTarget = undefined, viewport = undefined, scissor = viewport } = {}) {
|
|
72
|
+
if (arguments.length > 1) {
|
|
73
|
+
this._render(...arguments)
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
let renderTargets = this._renderTargets.get(renderTarget || this)
|
|
77
|
+
if (!renderTargets) {
|
|
78
|
+
renderTargets = {
|
|
79
|
+
in: renderTarget.clone(),
|
|
80
|
+
out: renderTarget.clone(),
|
|
81
|
+
}
|
|
82
|
+
renderTargets.in.texture.generateMipmaps = false
|
|
83
|
+
renderTargets.out.texture.generateMipmaps = false
|
|
84
|
+
this._renderTargets.set(renderTarget, renderTargets)
|
|
85
|
+
}
|
|
86
|
+
if (viewport || scissor) {
|
|
87
|
+
if (viewport) {
|
|
88
|
+
if (renderTarget) {
|
|
89
|
+
renderTarget.viewport.set(viewport[0], viewport[1], viewport[2], viewport[3])
|
|
90
|
+
} else {
|
|
91
|
+
this.setViewport(viewport[0], viewport[1], viewport[2], viewport[3])
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (renderTarget) {
|
|
95
|
+
renderTarget.scissor.set(scissor[0], scissor[1], scissor[2], scissor[3])
|
|
96
|
+
renderTarget.scissorTest = true
|
|
97
|
+
} else {
|
|
98
|
+
this.setScissor(scissor[0], scissor[1], scissor[2], scissor[3])
|
|
99
|
+
this.setScissorTest(true)
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
if (renderTarget) {
|
|
103
|
+
renderTarget.viewport.set(0, 0, renderTarget.width, renderTarget.height)
|
|
104
|
+
renderTarget.scissor.set(0, 0, renderTarget.width, renderTarget.height)
|
|
105
|
+
renderTarget.scissorTest = false
|
|
106
|
+
} else {
|
|
107
|
+
this.setViewport(0, 0, this.domElement.width, this.domElement.height)
|
|
108
|
+
this.setScissor(0, 0, this.domElement.width, this.domElement.height)
|
|
109
|
+
this.setScissorTest(false)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (scene) {
|
|
113
|
+
camera = camera || scene.camera
|
|
114
|
+
this._render(scene, camera, filters.length ? renderTargets.in : renderTarget)
|
|
115
|
+
}
|
|
116
|
+
for (const [i, filter] of filters.entries()) {
|
|
117
|
+
this.applyFilter(filter, renderTargets.in, i < filters.length - 1 ? renderTargets.out : renderTarget);
|
|
118
|
+
[renderTargets.in, renderTargets.out] = [renderTargets.out, renderTargets.in]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { WebGLRenderer, StereoCamera } from '../../../three/build/three.module.js'
|
|
2
|
+
|
|
3
|
+
export default class THREEStereoRenderer {
|
|
4
|
+
constructor(renderer = new WebGLRenderer()) {
|
|
5
|
+
this.renderer = renderer
|
|
6
|
+
|
|
7
|
+
this._stereoCamera = new StereoCamera()
|
|
8
|
+
this._stereoCamera.aspect = 0.5
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
set eyeOffset(value) {
|
|
12
|
+
this._stereoCamera.eyeSep = value
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
setSize(width, height) {
|
|
16
|
+
this.renderer.setSize(width, height)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
render(scene, camera, renderTarget) {
|
|
20
|
+
scene.updateMatrixWorld()
|
|
21
|
+
|
|
22
|
+
if (camera.parent === null) camera.updateMatrixWorld()
|
|
23
|
+
|
|
24
|
+
this._stereoCamera.update(camera)
|
|
25
|
+
|
|
26
|
+
const size = this.renderer.getSize()
|
|
27
|
+
|
|
28
|
+
this.renderer.clear()
|
|
29
|
+
|
|
30
|
+
if (renderTarget) {
|
|
31
|
+
renderTarget.scissorTest = true
|
|
32
|
+
renderTarget.scissor.set(0, 0, size.width * .5, size.height)
|
|
33
|
+
renderTarget.viewport.set(0, 0, size.width * .5, size.height)
|
|
34
|
+
} else {
|
|
35
|
+
this.renderer.setScissorTest(true)
|
|
36
|
+
this.renderer.setScissor(0, 0, size.width * .5, size.height)
|
|
37
|
+
this.renderer.setViewport(0, 0, size.width * .5, size.height)
|
|
38
|
+
}
|
|
39
|
+
this.renderer.render(scene, this._stereoCamera.cameraL, renderTarget)
|
|
40
|
+
|
|
41
|
+
if (renderTarget) {
|
|
42
|
+
renderTarget.scissor.set(size.width * .5, 0, size.width * .5, size.height)
|
|
43
|
+
renderTarget.viewport.set(size.width * .5, 0, size.width * .5, size.height)
|
|
44
|
+
} else {
|
|
45
|
+
this.renderer.setScissor(size.width * .5, 0, size.width * .5, size.height)
|
|
46
|
+
this.renderer.setViewport(size.width * .5, 0, size.width * .5, size.height)
|
|
47
|
+
}
|
|
48
|
+
this.renderer.render(scene, this._stereoCamera.cameraR, renderTarget)
|
|
49
|
+
|
|
50
|
+
if (renderTarget) {
|
|
51
|
+
renderTarget.scissorTest = false
|
|
52
|
+
renderTarget.scissor.set(0, 0, size.width, size.height)
|
|
53
|
+
renderTarget.viewport.set(0, 0, size.width, size.height)
|
|
54
|
+
} else {
|
|
55
|
+
this.renderer.setScissorTest(false)
|
|
56
|
+
this.renderer.setScissor(0, 0, size.width, size.height)
|
|
57
|
+
this.renderer.setViewport(0, 0, size.width, size.height)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Scene } from '../../../three/src/scenes/Scene.js'
|
|
2
|
+
import { Mesh } from '../../../three/src/objects/Mesh.js'
|
|
3
|
+
import { PlaneBufferGeometry } from '../../../three/src/geometries/PlaneBufferGeometry.js'
|
|
4
|
+
import { WebGLRenderTarget } from '../../../three/src/renderers/WebGLRenderTarget.js'
|
|
5
|
+
import { OrthographicCamera } from '../../../three/src/cameras/OrthographicCamera.js'
|
|
6
|
+
|
|
7
|
+
export default class THREEWebGLRenderTarget2D extends WebGLRenderTarget {
|
|
8
|
+
constructor({
|
|
9
|
+
renderer,
|
|
10
|
+
material = undefined,
|
|
11
|
+
width = 1024,
|
|
12
|
+
height = 1024,
|
|
13
|
+
wrapS = undefined,
|
|
14
|
+
wrapT = undefined,
|
|
15
|
+
magFilter = undefined,
|
|
16
|
+
minFilter = undefined,
|
|
17
|
+
format = undefined,
|
|
18
|
+
type = undefined,
|
|
19
|
+
anisotropy = undefined,
|
|
20
|
+
encoding = undefined,
|
|
21
|
+
generateMipmaps = undefined,
|
|
22
|
+
depthBuffer = undefined,
|
|
23
|
+
stencilBuffer = undefined,
|
|
24
|
+
depthTexture = undefined,
|
|
25
|
+
}) {
|
|
26
|
+
super(width, height, {
|
|
27
|
+
wrapS,
|
|
28
|
+
wrapT,
|
|
29
|
+
magFilter,
|
|
30
|
+
minFilter,
|
|
31
|
+
format,
|
|
32
|
+
type,
|
|
33
|
+
anisotropy,
|
|
34
|
+
encoding,
|
|
35
|
+
generateMipmaps,
|
|
36
|
+
depthBuffer,
|
|
37
|
+
stencilBuffer,
|
|
38
|
+
depthTexture,
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
this.renderer = renderer
|
|
42
|
+
|
|
43
|
+
this._scene = new Scene()
|
|
44
|
+
this._camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1)
|
|
45
|
+
|
|
46
|
+
this._quad = new Mesh(new PlaneBufferGeometry(2, 2), material)
|
|
47
|
+
this._scene.add(this._quad)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get material() {
|
|
51
|
+
return this._quad.material
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
set material(value) {
|
|
55
|
+
this._quad.material = value
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
render() {
|
|
59
|
+
this.renderer.setRenderTarget(this)
|
|
60
|
+
this.renderer.render(this._scene, this._camera)
|
|
61
|
+
this.renderer.setRenderTarget(null)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
vertexChunks: [
|
|
3
|
+
['start', `
|
|
4
|
+
out vec3 vPosition;
|
|
5
|
+
out vec3 vNormal;
|
|
6
|
+
out vec2 vUV;
|
|
7
|
+
out vec3 vWorldPosition;
|
|
8
|
+
out vec3 vViewDirection;
|
|
9
|
+
out float vFresnel;
|
|
10
|
+
`],
|
|
11
|
+
['end', `
|
|
12
|
+
vec3 worldPosition = (modelMatrix * vec4(position, 1.)).xyz;
|
|
13
|
+
gl_Position = projectionMatrix * viewMatrix * vec4(worldPosition, 1.);
|
|
14
|
+
|
|
15
|
+
vWorldPosition = worldPosition;
|
|
16
|
+
vViewDirection = normalize(worldPosition - cameraPosition);
|
|
17
|
+
vPosition = position;
|
|
18
|
+
vNormal = normalize(mat3(modelMatrix) * normal);
|
|
19
|
+
vUV = uv;
|
|
20
|
+
vFresnel = max(0., 1. - dot(-vViewDirection, vNormal));
|
|
21
|
+
`],
|
|
22
|
+
],
|
|
23
|
+
fragmentChunks: [
|
|
24
|
+
['start', `
|
|
25
|
+
in vec3 vPosition;
|
|
26
|
+
in vec3 vNormal;
|
|
27
|
+
in vec2 vUV;
|
|
28
|
+
in vec3 vWorldPosition;
|
|
29
|
+
in vec3 vViewDirection;
|
|
30
|
+
in float vFresnel;
|
|
31
|
+
`],
|
|
32
|
+
],
|
|
33
|
+
}
|