@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/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
+ }