three-stdlib 2.31.0 → 2.32.1
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/_polyfill/uv1.cjs +6 -0
- package/_polyfill/uv1.cjs.map +1 -0
- package/_polyfill/uv1.d.ts +5 -0
- package/_polyfill/uv1.js +6 -0
- package/_polyfill/uv1.js.map +1 -0
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.d.ts +2 -2
- package/controls/ArcballControls.js.map +1 -1
- package/controls/FirstPersonControls.cjs.map +1 -1
- package/controls/FirstPersonControls.d.ts +1 -1
- package/controls/FirstPersonControls.js.map +1 -1
- package/exporters/ColladaExporter.cjs +3 -2
- package/exporters/ColladaExporter.cjs.map +1 -1
- package/exporters/ColladaExporter.js +3 -2
- package/exporters/ColladaExporter.js.map +1 -1
- package/lines/LineSegments2.cjs +3 -2
- package/lines/LineSegments2.cjs.map +1 -1
- package/lines/LineSegments2.js +3 -2
- package/lines/LineSegments2.js.map +1 -1
- package/loaders/ColladaLoader.cjs +7 -6
- package/loaders/ColladaLoader.cjs.map +1 -1
- package/loaders/ColladaLoader.js +7 -6
- package/loaders/ColladaLoader.js.map +1 -1
- package/loaders/FBXLoader.cjs +4 -4
- package/loaders/FBXLoader.cjs.map +1 -1
- package/loaders/FBXLoader.js +4 -4
- package/loaders/FBXLoader.js.map +1 -1
- package/loaders/LWOLoader.cjs +3 -1
- package/loaders/LWOLoader.cjs.map +1 -1
- package/loaders/LWOLoader.js +3 -1
- package/loaders/LWOLoader.js.map +1 -1
- package/misc/ProgressiveLightmap.cjs +12 -10
- package/misc/ProgressiveLightmap.cjs.map +1 -1
- package/misc/ProgressiveLightmap.js +12 -10
- package/misc/ProgressiveLightmap.js.map +1 -1
- package/modifiers/TessellateModifier.cjs +20 -19
- package/modifiers/TessellateModifier.cjs.map +1 -1
- package/modifiers/TessellateModifier.js +20 -19
- package/modifiers/TessellateModifier.js.map +1 -1
- package/package.json +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ProgressiveLightmap.js","sources":["../../src/misc/ProgressiveLightmap.js"],"sourcesContent":["import {\n Scene,\n WebGLRenderTarget,\n FloatType,\n MeshBasicMaterial,\n MeshPhongMaterial,\n DoubleSide,\n PlaneGeometry,\n Mesh,\n} from 'three'\nimport potpack from 'potpack'\n\n/**\n * Progressive Light Map Accumulator, by [zalo](https://github.com/zalo/)\n *\n * To use, simply construct a `ProgressiveLightMap` object,\n * `plmap.addObjectsToLightMap(object)` an array of semi-static\n * objects and lights to the class once, and then call\n * `plmap.update(camera)` every frame to begin accumulating\n * lighting samples.\n *\n * This should begin accumulating lightmaps which apply to\n * your objects, so you can start jittering lighting to achieve\n * the texture-space effect you're looking for.\n *\n * @param {WebGLRenderer} renderer A WebGL Rendering Context\n * @param {number} res The side-long dimension of you total lightmap\n */\nclass ProgressiveLightMap {\n constructor(renderer, res = 1024) {\n this.renderer = renderer\n this.res = res\n this.lightMapContainers = []\n this.compiled = false\n this.scene = new Scene()\n this.scene.background = null\n this.tinyTarget = new WebGLRenderTarget(1, 1)\n this.buffer1Active = false\n this.firstUpdate = true\n this.warned = false\n\n // Create the Progressive LightMap Texture\n const format = /(Android|iPad|iPhone|iPod)/g.test(navigator.userAgent) ? alfFloatType : FloatType\n this.progressiveLightMap1 = new WebGLRenderTarget(this.res, this.res, { type: format })\n this.progressiveLightMap2 = new WebGLRenderTarget(this.res, this.res, { type: format })\n\n // Inject some spicy new logic into a standard phong material\n this.uvMat = new MeshPhongMaterial()\n this.uvMat.uniforms = {}\n this.uvMat.onBeforeCompile = (shader) => {\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n shader.vertexShader =\n '#define USE_LIGHTMAP\\n' +\n shader.vertexShader.slice(0, -1) +\n '\tgl_Position = vec4((uv2 - 0.5) * 2.0, 1.0, 1.0); }'\n\n // Fragment Shader: Set Pixels to average in the Previous frame's Shadows\n const bodyStart = shader.fragmentShader.indexOf('void main() {')\n shader.fragmentShader =\n 'varying vec2 vUv2;\\n' +\n shader.fragmentShader.slice(0, bodyStart) +\n '\tuniform sampler2D previousShadowMap;\\n\tuniform float averagingWindow;\\n' +\n shader.fragmentShader.slice(bodyStart - 1, -1) +\n `\\nvec3 texelOld = texture2D(previousShadowMap, vUv2).rgb;\n\t\t\t\tgl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, 1.0/averagingWindow);\n\t\t\t}`\n\n // Set the Previous Frame's Texture Buffer and Averaging Window\n shader.uniforms.previousShadowMap = { value: this.progressiveLightMap1.texture }\n shader.uniforms.averagingWindow = { value: 100 }\n\n this.uvMat.uniforms = shader.uniforms\n\n // Set the new Shader to this\n this.uvMat.userData.shader = shader\n\n this.compiled = true\n }\n }\n\n /**\n * Sets these objects' materials' lightmaps and modifies their uv2's.\n * @param {Object3D} objects An array of objects and lights to set up your lightmap.\n */\n addObjectsToLightMap(objects) {\n // Prepare list of UV bounding boxes for packing later...\n this.uv_boxes = []\n const padding = 3 / this.res\n\n for (let ob = 0; ob < objects.length; ob++) {\n const object = objects[ob]\n\n // If this object is a light, simply add it to the internal scene\n if (object.isLight) {\n this.scene.attach(object)\n continue\n }\n\n if (!object.geometry.hasAttribute('uv')) {\n console.warn('All lightmap objects need UVs!')\n continue\n }\n\n if (this.blurringPlane == null) {\n this._initializeBlurPlane(this.res, this.progressiveLightMap1)\n }\n\n // Apply the lightmap to the object\n object.material.lightMap = this.progressiveLightMap2.texture\n object.material.dithering = true\n object.castShadow = true\n object.receiveShadow = true\n object.renderOrder = 1000 + ob\n\n // Prepare UV boxes for potpack\n // TODO: Size these by object surface area\n this.uv_boxes.push({ w: 1 + padding * 2, h: 1 + padding * 2, index: ob })\n\n this.lightMapContainers.push({ basicMat: object.material, object: object })\n\n this.compiled = false\n }\n\n // Pack the objects' lightmap UVs into the same global space\n const dimensions = potpack(this.uv_boxes)\n this.uv_boxes.forEach((box) => {\n const uv2 = objects[box.index].geometry.getAttribute('uv').clone()\n for (let i = 0; i < uv2.array.length; i += uv2.itemSize) {\n uv2.array[i] = (uv2.array[i] + box.x + padding) / dimensions.w\n uv2.array[i + 1] = (uv2.array[i + 1] + box.y + padding) / dimensions.h\n }\n\n objects[box.index].geometry.setAttribute('uv2', uv2)\n objects[box.index].geometry.getAttribute('uv2').needsUpdate = true\n })\n }\n\n /**\n * This function renders each mesh one at a time into their respective surface maps\n * @param {Camera} camera Standard Rendering Camera\n * @param {number} blendWindow When >1, samples will accumulate over time.\n * @param {boolean} blurEdges Whether to fix UV Edges via blurring\n */\n update(camera, blendWindow = 100, blurEdges = true) {\n if (this.blurringPlane == null) {\n return\n }\n\n // Store the original Render Target\n const oldTarget = this.renderer.getRenderTarget()\n\n // The blurring plane applies blur to the seams of the lightmap\n this.blurringPlane.visible = blurEdges\n\n // Steal the Object3D from the real world to our special dimension\n for (let l = 0; l < this.lightMapContainers.length; l++) {\n this.lightMapContainers[l].object.oldScene = this.lightMapContainers[l].object.parent\n this.scene.attach(this.lightMapContainers[l].object)\n }\n\n // Render once normally to initialize everything\n if (this.firstUpdate) {\n this.renderer.setRenderTarget(this.tinyTarget) // Tiny for Speed\n this.renderer.render(this.scene, camera)\n this.firstUpdate = false\n }\n\n // Set each object's material to the UV Unwrapped Surface Mapping Version\n for (let l = 0; l < this.lightMapContainers.length; l++) {\n this.uvMat.uniforms.averagingWindow = { value: blendWindow }\n this.lightMapContainers[l].object.material = this.uvMat\n this.lightMapContainers[l].object.oldFrustumCulled = this.lightMapContainers[l].object.frustumCulled\n this.lightMapContainers[l].object.frustumCulled = false\n }\n\n // Ping-pong two surface buffers for reading/writing\n const activeMap = this.buffer1Active ? this.progressiveLightMap1 : this.progressiveLightMap2\n const inactiveMap = this.buffer1Active ? this.progressiveLightMap2 : this.progressiveLightMap1\n\n // Render the object's surface maps\n this.renderer.setRenderTarget(activeMap)\n this.uvMat.uniforms.previousShadowMap = { value: inactiveMap.texture }\n this.blurringPlane.material.uniforms.previousShadowMap = { value: inactiveMap.texture }\n this.buffer1Active = !this.buffer1Active\n this.renderer.render(this.scene, camera)\n\n // Restore the object's Real-time Material and add it back to the original world\n for (let l = 0; l < this.lightMapContainers.length; l++) {\n this.lightMapContainers[l].object.frustumCulled = this.lightMapContainers[l].object.oldFrustumCulled\n this.lightMapContainers[l].object.material = this.lightMapContainers[l].basicMat\n this.lightMapContainers[l].object.oldScene.attach(this.lightMapContainers[l].object)\n }\n\n // Restore the original Render Target\n this.renderer.setRenderTarget(oldTarget)\n }\n\n /** DEBUG\n * Draw the lightmap in the main scene. Call this after adding the objects to it.\n * @param {boolean} visible Whether the debug plane should be visible\n * @param {Vector3} position Where the debug plane should be drawn\n */\n showDebugLightmap(visible, position = undefined) {\n if (this.lightMapContainers.length == 0) {\n if (!this.warned) {\n console.warn('Call this after adding the objects!')\n this.warned = true\n }\n\n return\n }\n\n if (this.labelMesh == null) {\n this.labelMaterial = new MeshBasicMaterial({\n map: this.progressiveLightMap1.texture,\n side: DoubleSide,\n })\n this.labelPlane = new PlaneGeometry(100, 100)\n this.labelMesh = new Mesh(this.labelPlane, this.labelMaterial)\n this.labelMesh.position.y = 250\n this.lightMapContainers[0].object.parent.add(this.labelMesh)\n }\n\n if (position != undefined) {\n this.labelMesh.position.copy(position)\n }\n\n this.labelMesh.visible = visible\n }\n\n /**\n * INTERNAL Creates the Blurring Plane\n * @param {number} res The square resolution of this object's lightMap.\n * @param {WebGLRenderTexture} lightMap The lightmap to initialize the plane with.\n */\n _initializeBlurPlane(res, lightMap = null) {\n const blurMaterial = new MeshBasicMaterial()\n blurMaterial.uniforms = {\n previousShadowMap: { value: null },\n pixelOffset: { value: 1.0 / res },\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: 3.0,\n }\n blurMaterial.onBeforeCompile = (shader) => {\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n shader.vertexShader =\n '#define USE_UV\\n' + shader.vertexShader.slice(0, -1) + '\tgl_Position = vec4((uv - 0.5) * 2.0, 1.0, 1.0); }'\n\n // Fragment Shader: Set Pixels to 9-tap box blur the current frame's Shadows\n const bodyStart = shader.fragmentShader.indexOf('void main() {')\n shader.fragmentShader =\n '#define USE_UV\\n' +\n shader.fragmentShader.slice(0, bodyStart) +\n '\tuniform sampler2D previousShadowMap;\\n\tuniform float pixelOffset;\\n' +\n shader.fragmentShader.slice(bodyStart - 1, -1) +\n `\tgl_FragColor.rgb = (\n\t\t\t texture2D(previousShadowMap, vUv + vec2( pixelOffset, 0.0 )).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( 0.0 , pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( 0.0 , -pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2(-pixelOffset, 0.0 )).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( pixelOffset, pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2(-pixelOffset, pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( pixelOffset, -pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2(-pixelOffset, -pixelOffset)).rgb)/8.0;\n\t\t}`\n\n // Set the LightMap Accumulation Buffer\n shader.uniforms.previousShadowMap = { value: lightMap.texture }\n shader.uniforms.pixelOffset = { value: 0.5 / res }\n blurMaterial.uniforms = shader.uniforms\n\n // Set the new Shader to this\n blurMaterial.userData.shader = shader\n\n this.compiled = true\n }\n\n this.blurringPlane = new Mesh(new PlaneGeometry(1, 1), blurMaterial)\n this.blurringPlane.name = 'Blurring Plane'\n this.blurringPlane.frustumCulled = false\n this.blurringPlane.renderOrder = 0\n this.blurringPlane.material.depthWrite = false\n this.scene.add(this.blurringPlane)\n }\n}\n\nexport { ProgressiveLightMap }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"ProgressiveLightmap.js","sources":["../../src/misc/ProgressiveLightmap.js"],"sourcesContent":["import {\n Scene,\n WebGLRenderTarget,\n FloatType,\n MeshBasicMaterial,\n MeshPhongMaterial,\n DoubleSide,\n PlaneGeometry,\n Mesh,\n} from 'three'\nimport potpack from 'potpack'\nimport { UV1 } from '../_polyfill/uv1'\n\n/**\n * Progressive Light Map Accumulator, by [zalo](https://github.com/zalo/)\n *\n * To use, simply construct a `ProgressiveLightMap` object,\n * `plmap.addObjectsToLightMap(object)` an array of semi-static\n * objects and lights to the class once, and then call\n * `plmap.update(camera)` every frame to begin accumulating\n * lighting samples.\n *\n * This should begin accumulating lightmaps which apply to\n * your objects, so you can start jittering lighting to achieve\n * the texture-space effect you're looking for.\n *\n * @param {WebGLRenderer} renderer A WebGL Rendering Context\n * @param {number} res The side-long dimension of you total lightmap\n */\nclass ProgressiveLightMap {\n constructor(renderer, res = 1024) {\n this.renderer = renderer\n this.res = res\n this.lightMapContainers = []\n this.compiled = false\n this.scene = new Scene()\n this.scene.background = null\n this.tinyTarget = new WebGLRenderTarget(1, 1)\n this.buffer1Active = false\n this.firstUpdate = true\n this.warned = false\n\n // Create the Progressive LightMap Texture\n const format = /(Android|iPad|iPhone|iPod)/g.test(navigator.userAgent) ? alfFloatType : FloatType\n this.progressiveLightMap1 = new WebGLRenderTarget(this.res, this.res, { type: format })\n this.progressiveLightMap2 = new WebGLRenderTarget(this.res, this.res, { type: format })\n\n // Inject some spicy new logic into a standard phong material\n this.uvMat = new MeshPhongMaterial()\n this.uvMat.uniforms = {}\n this.uvMat.onBeforeCompile = (shader) => {\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n shader.vertexShader =\n '#define USE_LIGHTMAP\\n' +\n shader.vertexShader.slice(0, -1) +\n `\tgl_Position = vec4((${UV1} - 0.5) * 2.0, 1.0, 1.0); }`\n\n // Fragment Shader: Set Pixels to average in the Previous frame's Shadows\n const bodyStart = shader.fragmentShader.indexOf('void main() {')\n shader.fragmentShader =\n `varying vec2 v${UV1 === 'uv1' ? UV1 : 'Uv2'};\\n` +\n shader.fragmentShader.slice(0, bodyStart) +\n '\tuniform sampler2D previousShadowMap;\\n\tuniform float averagingWindow;\\n' +\n shader.fragmentShader.slice(bodyStart - 1, -1) +\n `\\nvec3 texelOld = texture2D(previousShadowMap, v${UV1 === 'uv1' ? UV1 : 'Uv2'}).rgb;\n\t\t\t\tgl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, 1.0/averagingWindow);\n\t\t\t}`\n\n // Set the Previous Frame's Texture Buffer and Averaging Window\n shader.uniforms.previousShadowMap = { value: this.progressiveLightMap1.texture }\n shader.uniforms.averagingWindow = { value: 100 }\n\n this.uvMat.uniforms = shader.uniforms\n\n // Set the new Shader to this\n this.uvMat.userData.shader = shader\n\n this.compiled = true\n }\n }\n\n /**\n * Sets these objects' materials' lightmaps and modifies their uv1's.\n * @param {Object3D} objects An array of objects and lights to set up your lightmap.\n */\n addObjectsToLightMap(objects) {\n // Prepare list of UV bounding boxes for packing later...\n this.uv_boxes = []\n const padding = 3 / this.res\n\n for (let ob = 0; ob < objects.length; ob++) {\n const object = objects[ob]\n\n // If this object is a light, simply add it to the internal scene\n if (object.isLight) {\n this.scene.attach(object)\n continue\n }\n\n if (!object.geometry.hasAttribute('uv')) {\n console.warn('All lightmap objects need UVs!')\n continue\n }\n\n if (this.blurringPlane == null) {\n this._initializeBlurPlane(this.res, this.progressiveLightMap1)\n }\n\n // Apply the lightmap to the object\n object.material.lightMap = this.progressiveLightMap2.texture\n object.material.dithering = true\n object.castShadow = true\n object.receiveShadow = true\n object.renderOrder = 1000 + ob\n\n // Prepare UV boxes for potpack\n // TODO: Size these by object surface area\n this.uv_boxes.push({ w: 1 + padding * 2, h: 1 + padding * 2, index: ob })\n\n this.lightMapContainers.push({ basicMat: object.material, object: object })\n\n this.compiled = false\n }\n\n // Pack the objects' lightmap UVs into the same global space\n const dimensions = potpack(this.uv_boxes)\n this.uv_boxes.forEach((box) => {\n const uv1 = objects[box.index].geometry.getAttribute('uv').clone()\n for (let i = 0; i < uv1.array.length; i += uv1.itemSize) {\n uv1.array[i] = (uv1.array[i] + box.x + padding) / dimensions.w\n uv1.array[i + 1] = (uv1.array[i + 1] + box.y + padding) / dimensions.h\n }\n\n objects[box.index].geometry.setAttribute(UV1, uv1)\n objects[box.index].geometry.getAttribute(UV1).needsUpdate = true\n })\n }\n\n /**\n * This function renders each mesh one at a time into their respective surface maps\n * @param {Camera} camera Standard Rendering Camera\n * @param {number} blendWindow When >1, samples will accumulate over time.\n * @param {boolean} blurEdges Whether to fix UV Edges via blurring\n */\n update(camera, blendWindow = 100, blurEdges = true) {\n if (this.blurringPlane == null) {\n return\n }\n\n // Store the original Render Target\n const oldTarget = this.renderer.getRenderTarget()\n\n // The blurring plane applies blur to the seams of the lightmap\n this.blurringPlane.visible = blurEdges\n\n // Steal the Object3D from the real world to our special dimension\n for (let l = 0; l < this.lightMapContainers.length; l++) {\n this.lightMapContainers[l].object.oldScene = this.lightMapContainers[l].object.parent\n this.scene.attach(this.lightMapContainers[l].object)\n }\n\n // Render once normally to initialize everything\n if (this.firstUpdate) {\n this.renderer.setRenderTarget(this.tinyTarget) // Tiny for Speed\n this.renderer.render(this.scene, camera)\n this.firstUpdate = false\n }\n\n // Set each object's material to the UV Unwrapped Surface Mapping Version\n for (let l = 0; l < this.lightMapContainers.length; l++) {\n this.uvMat.uniforms.averagingWindow = { value: blendWindow }\n this.lightMapContainers[l].object.material = this.uvMat\n this.lightMapContainers[l].object.oldFrustumCulled = this.lightMapContainers[l].object.frustumCulled\n this.lightMapContainers[l].object.frustumCulled = false\n }\n\n // Ping-pong two surface buffers for reading/writing\n const activeMap = this.buffer1Active ? this.progressiveLightMap1 : this.progressiveLightMap2\n const inactiveMap = this.buffer1Active ? this.progressiveLightMap2 : this.progressiveLightMap1\n\n // Render the object's surface maps\n this.renderer.setRenderTarget(activeMap)\n this.uvMat.uniforms.previousShadowMap = { value: inactiveMap.texture }\n this.blurringPlane.material.uniforms.previousShadowMap = { value: inactiveMap.texture }\n this.buffer1Active = !this.buffer1Active\n this.renderer.render(this.scene, camera)\n\n // Restore the object's Real-time Material and add it back to the original world\n for (let l = 0; l < this.lightMapContainers.length; l++) {\n this.lightMapContainers[l].object.frustumCulled = this.lightMapContainers[l].object.oldFrustumCulled\n this.lightMapContainers[l].object.material = this.lightMapContainers[l].basicMat\n this.lightMapContainers[l].object.oldScene.attach(this.lightMapContainers[l].object)\n }\n\n // Restore the original Render Target\n this.renderer.setRenderTarget(oldTarget)\n }\n\n /** DEBUG\n * Draw the lightmap in the main scene. Call this after adding the objects to it.\n * @param {boolean} visible Whether the debug plane should be visible\n * @param {Vector3} position Where the debug plane should be drawn\n */\n showDebugLightmap(visible, position = undefined) {\n if (this.lightMapContainers.length == 0) {\n if (!this.warned) {\n console.warn('Call this after adding the objects!')\n this.warned = true\n }\n\n return\n }\n\n if (this.labelMesh == null) {\n this.labelMaterial = new MeshBasicMaterial({\n map: this.progressiveLightMap1.texture,\n side: DoubleSide,\n })\n this.labelPlane = new PlaneGeometry(100, 100)\n this.labelMesh = new Mesh(this.labelPlane, this.labelMaterial)\n this.labelMesh.position.y = 250\n this.lightMapContainers[0].object.parent.add(this.labelMesh)\n }\n\n if (position != undefined) {\n this.labelMesh.position.copy(position)\n }\n\n this.labelMesh.visible = visible\n }\n\n /**\n * INTERNAL Creates the Blurring Plane\n * @param {number} res The square resolution of this object's lightMap.\n * @param {WebGLRenderTexture} lightMap The lightmap to initialize the plane with.\n */\n _initializeBlurPlane(res, lightMap = null) {\n const blurMaterial = new MeshBasicMaterial()\n blurMaterial.uniforms = {\n previousShadowMap: { value: null },\n pixelOffset: { value: 1.0 / res },\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: 3.0,\n }\n blurMaterial.onBeforeCompile = (shader) => {\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n shader.vertexShader =\n '#define USE_UV\\n' + shader.vertexShader.slice(0, -1) + '\tgl_Position = vec4((uv - 0.5) * 2.0, 1.0, 1.0); }'\n\n // Fragment Shader: Set Pixels to 9-tap box blur the current frame's Shadows\n const bodyStart = shader.fragmentShader.indexOf('void main() {')\n shader.fragmentShader =\n '#define USE_UV\\n' +\n shader.fragmentShader.slice(0, bodyStart) +\n '\tuniform sampler2D previousShadowMap;\\n\tuniform float pixelOffset;\\n' +\n shader.fragmentShader.slice(bodyStart - 1, -1) +\n `\tgl_FragColor.rgb = (\n\t\t\t texture2D(previousShadowMap, vUv + vec2( pixelOffset, 0.0 )).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( 0.0 , pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( 0.0 , -pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2(-pixelOffset, 0.0 )).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( pixelOffset, pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2(-pixelOffset, pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2( pixelOffset, -pixelOffset)).rgb +\n\t\t\t texture2D(previousShadowMap, vUv + vec2(-pixelOffset, -pixelOffset)).rgb)/8.0;\n\t\t}`\n\n // Set the LightMap Accumulation Buffer\n shader.uniforms.previousShadowMap = { value: lightMap.texture }\n shader.uniforms.pixelOffset = { value: 0.5 / res }\n blurMaterial.uniforms = shader.uniforms\n\n // Set the new Shader to this\n blurMaterial.userData.shader = shader\n\n this.compiled = true\n }\n\n this.blurringPlane = new Mesh(new PlaneGeometry(1, 1), blurMaterial)\n this.blurringPlane.name = 'Blurring Plane'\n this.blurringPlane.frustumCulled = false\n this.blurringPlane.renderOrder = 0\n this.blurringPlane.material.depthWrite = false\n this.scene.add(this.blurringPlane)\n }\n}\n\nexport { ProgressiveLightMap }\n"],"names":[],"mappings":"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"}
|
@@ -7,6 +7,7 @@ var __publicField = (obj, key, value) => {
|
|
7
7
|
};
|
8
8
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
9
9
|
const THREE = require("three");
|
10
|
+
const uv1 = require("../_polyfill/uv1.cjs");
|
10
11
|
class TessellateModifier {
|
11
12
|
constructor(maxEdgeLength = 0.1, maxIterations = 6) {
|
12
13
|
__publicField(this, "maxEdgeLength");
|
@@ -46,17 +47,17 @@ class TessellateModifier {
|
|
46
47
|
const hasNormals = attributes.normal !== void 0;
|
47
48
|
const hasColors = attributes.color !== void 0;
|
48
49
|
const hasUVs = attributes.uv !== void 0;
|
49
|
-
const
|
50
|
+
const hasUV1s = attributes[uv1.UV1] !== void 0;
|
50
51
|
let positions = attributes.position.array;
|
51
52
|
let normals = hasNormals ? attributes.normal.array : null;
|
52
53
|
let colors = hasColors ? attributes.color.array : null;
|
53
54
|
let uvs = hasUVs ? attributes.uv.array : null;
|
54
|
-
let
|
55
|
+
let uv1s = hasUV1s ? attributes.uv1.array : null;
|
55
56
|
let positions2 = positions;
|
56
57
|
let normals2 = normals;
|
57
58
|
let colors2 = colors;
|
58
59
|
let uvs2 = uvs;
|
59
|
-
let
|
60
|
+
let uv1s2 = uv1s;
|
60
61
|
let iteration = 0;
|
61
62
|
let tessellating = true;
|
62
63
|
function addTriangle(a, b, c) {
|
@@ -90,13 +91,13 @@ class TessellateModifier {
|
|
90
91
|
uvs2.push(u2.x, u2.y);
|
91
92
|
uvs2.push(u3.x, u3.y);
|
92
93
|
}
|
93
|
-
if (
|
94
|
+
if (hasUV1s) {
|
94
95
|
const u21 = u2s[a];
|
95
96
|
const u22 = u2s[b];
|
96
97
|
const u23 = u2s[c];
|
97
|
-
|
98
|
-
|
99
|
-
|
98
|
+
uv1s2.push(u21.x, u21.y);
|
99
|
+
uv1s2.push(u22.x, u22.y);
|
100
|
+
uv1s2.push(u23.x, u23.y);
|
100
101
|
}
|
101
102
|
}
|
102
103
|
while (tessellating && iteration < maxIterations) {
|
@@ -116,9 +117,9 @@ class TessellateModifier {
|
|
116
117
|
uvs = uvs2;
|
117
118
|
uvs2 = [];
|
118
119
|
}
|
119
|
-
if (
|
120
|
-
|
121
|
-
|
120
|
+
if (hasUV1s) {
|
121
|
+
uv1s = uv1s2;
|
122
|
+
uv1s2 = [];
|
122
123
|
}
|
123
124
|
for (let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6) {
|
124
125
|
va.fromArray(positions, i + 0);
|
@@ -139,10 +140,10 @@ class TessellateModifier {
|
|
139
140
|
ub.fromArray(uvs, i2 + 2);
|
140
141
|
uc.fromArray(uvs, i2 + 4);
|
141
142
|
}
|
142
|
-
if (
|
143
|
-
u2a.fromArray(
|
144
|
-
u2b.fromArray(
|
145
|
-
u2c.fromArray(
|
143
|
+
if (hasUV1s && uv1s) {
|
144
|
+
u2a.fromArray(uv1s, i2 + 0);
|
145
|
+
u2b.fromArray(uv1s, i2 + 2);
|
146
|
+
u2c.fromArray(uv1s, i2 + 4);
|
146
147
|
}
|
147
148
|
const dab = va.distanceToSquared(vb);
|
148
149
|
const dbc = vb.distanceToSquared(vc);
|
@@ -157,7 +158,7 @@ class TessellateModifier {
|
|
157
158
|
cm.lerpColors(ca, cb, 0.5);
|
158
159
|
if (hasUVs)
|
159
160
|
um.lerpVectors(ua, ub, 0.5);
|
160
|
-
if (
|
161
|
+
if (hasUV1s)
|
161
162
|
u2m.lerpVectors(u2a, u2b, 0.5);
|
162
163
|
addTriangle(0, 3, 2);
|
163
164
|
addTriangle(3, 1, 2);
|
@@ -169,7 +170,7 @@ class TessellateModifier {
|
|
169
170
|
cm.lerpColors(cb, cc, 0.5);
|
170
171
|
if (hasUVs)
|
171
172
|
um.lerpVectors(ub, uc, 0.5);
|
172
|
-
if (
|
173
|
+
if (hasUV1s)
|
173
174
|
u2m.lerpVectors(u2b, u2c, 0.5);
|
174
175
|
addTriangle(0, 1, 3);
|
175
176
|
addTriangle(3, 2, 0);
|
@@ -181,7 +182,7 @@ class TessellateModifier {
|
|
181
182
|
cm.lerpColors(ca, cc, 0.5);
|
182
183
|
if (hasUVs)
|
183
184
|
um.lerpVectors(ua, uc, 0.5);
|
184
|
-
if (
|
185
|
+
if (hasUV1s)
|
185
186
|
u2m.lerpVectors(u2a, u2c, 0.5);
|
186
187
|
addTriangle(0, 1, 3);
|
187
188
|
addTriangle(3, 1, 2);
|
@@ -202,8 +203,8 @@ class TessellateModifier {
|
|
202
203
|
if (hasUVs) {
|
203
204
|
geometry2.setAttribute("uv", new THREE.Float32BufferAttribute(uvs2, 2));
|
204
205
|
}
|
205
|
-
if (
|
206
|
-
geometry2.setAttribute(
|
206
|
+
if (hasUV1s) {
|
207
|
+
geometry2.setAttribute(uv1.UV1, new THREE.Float32BufferAttribute(uv1s2, 2));
|
207
208
|
}
|
208
209
|
return geometry2;
|
209
210
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"TessellateModifier.cjs","sources":["../../src/modifiers/TessellateModifier.ts"],"sourcesContent":["import { BufferGeometry, Color, Float32BufferAttribute, Vector2, Vector3 } from 'three'\n\n/**\n * Break faces with edges longer than maxEdgeLength\n */\n\nclass TessellateModifier {\n public maxEdgeLength: number\n public maxIterations: number\n\n constructor(maxEdgeLength = 0.1, maxIterations = 6) {\n this.maxEdgeLength = maxEdgeLength\n this.maxIterations = maxIterations\n }\n\n public modify = (geometry: BufferGeometry): BufferGeometry => {\n if (geometry.index !== null) {\n geometry = geometry.toNonIndexed()\n }\n\n //\n\n const maxIterations = this.maxIterations\n const maxEdgeLengthSquared = this.maxEdgeLength * this.maxEdgeLength\n\n const va = new Vector3()\n const vb = new Vector3()\n const vc = new Vector3()\n const vm = new Vector3()\n const vs = [va, vb, vc, vm]\n\n const na = new Vector3()\n const nb = new Vector3()\n const nc = new Vector3()\n const nm = new Vector3()\n const ns = [na, nb, nc, nm]\n\n const ca = new Color()\n const cb = new Color()\n const cc = new Color()\n const cm = new Color()\n const cs = [ca, cb, cc, cm]\n\n const ua = new Vector2()\n const ub = new Vector2()\n const uc = new Vector2()\n const um = new Vector2()\n const us = [ua, ub, uc, um]\n\n const u2a = new Vector2()\n const u2b = new Vector2()\n const u2c = new Vector2()\n const u2m = new Vector2()\n const u2s = [u2a, u2b, u2c, u2m]\n\n const attributes = geometry.attributes\n const hasNormals = attributes.normal !== undefined\n const hasColors = attributes.color !== undefined\n const hasUVs = attributes.uv !== undefined\n const hasUV2s = attributes.uv2 !== undefined\n\n let positions = attributes.position.array\n let normals = hasNormals ? attributes.normal.array : null\n let colors = hasColors ? attributes.color.array : null\n let uvs = hasUVs ? attributes.uv.array : null\n let uv2s = hasUV2s ? attributes.uv2.array : null\n\n let positions2 = (positions as unknown) as number[]\n let normals2 = (normals as unknown) as number[]\n let colors2 = (colors as unknown) as number[]\n let uvs2 = (uvs as unknown) as number[]\n let uv2s2 = (uv2s as unknown) as number[]\n\n let iteration = 0\n let tessellating = true\n\n function addTriangle(a: number, b: number, c: number): void {\n const v1 = vs[a]\n const v2 = vs[b]\n const v3 = vs[c]\n\n positions2.push(v1.x, v1.y, v1.z)\n positions2.push(v2.x, v2.y, v2.z)\n positions2.push(v3.x, v3.y, v3.z)\n\n if (hasNormals) {\n const n1 = ns[a]\n const n2 = ns[b]\n const n3 = ns[c]\n\n normals2.push(n1.x, n1.y, n1.z)\n normals2.push(n2.x, n2.y, n2.z)\n normals2.push(n3.x, n3.y, n3.z)\n }\n\n if (hasColors) {\n const c1 = cs[a]\n const c2 = cs[b]\n const c3 = cs[c]\n\n colors2.push(c1.r, c1.g, c1.b)\n colors2.push(c2.r, c2.g, c2.b)\n colors2.push(c3.r, c3.g, c3.b)\n }\n\n if (hasUVs) {\n const u1 = us[a]\n const u2 = us[b]\n const u3 = us[c]\n\n uvs2.push(u1.x, u1.y)\n uvs2.push(u2.x, u2.y)\n uvs2.push(u3.x, u3.y)\n }\n\n if (hasUV2s) {\n const u21 = u2s[a]\n const u22 = u2s[b]\n const u23 = u2s[c]\n\n uv2s2.push(u21.x, u21.y)\n uv2s2.push(u22.x, u22.y)\n uv2s2.push(u23.x, u23.y)\n }\n }\n\n while (tessellating && iteration < maxIterations) {\n iteration++\n tessellating = false\n\n positions = positions2 as any\n positions2 = []\n\n if (hasNormals) {\n normals = normals2 as any\n normals2 = []\n }\n\n if (hasColors) {\n colors = colors2 as any\n colors2 = []\n }\n\n if (hasUVs) {\n uvs = uvs2 as any\n uvs2 = []\n }\n\n if (hasUV2s) {\n uv2s = uv2s2 as any\n uv2s2 = []\n }\n\n for (let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6) {\n va.fromArray(positions, i + 0)\n vb.fromArray(positions, i + 3)\n vc.fromArray(positions, i + 6)\n\n if (hasNormals && normals) {\n na.fromArray(normals, i + 0)\n nb.fromArray(normals, i + 3)\n nc.fromArray(normals, i + 6)\n }\n\n if (hasColors && colors) {\n ca.fromArray(colors, i + 0)\n cb.fromArray(colors, i + 3)\n cc.fromArray(colors, i + 6)\n }\n\n if (hasUVs && uvs) {\n ua.fromArray(uvs, i2 + 0)\n ub.fromArray(uvs, i2 + 2)\n uc.fromArray(uvs, i2 + 4)\n }\n\n if (hasUV2s && uv2s) {\n u2a.fromArray(uv2s, i2 + 0)\n u2b.fromArray(uv2s, i2 + 2)\n u2c.fromArray(uv2s, i2 + 4)\n }\n\n const dab = va.distanceToSquared(vb)\n const dbc = vb.distanceToSquared(vc)\n const dac = va.distanceToSquared(vc)\n\n if (dab > maxEdgeLengthSquared || dbc > maxEdgeLengthSquared || dac > maxEdgeLengthSquared) {\n tessellating = true\n\n if (dab >= dbc && dab >= dac) {\n vm.lerpVectors(va, vb, 0.5)\n if (hasNormals) nm.lerpVectors(na, nb, 0.5)\n if (hasColors) cm.lerpColors(ca, cb, 0.5)\n if (hasUVs) um.lerpVectors(ua, ub, 0.5)\n if (hasUV2s) u2m.lerpVectors(u2a, u2b, 0.5)\n\n addTriangle(0, 3, 2)\n addTriangle(3, 1, 2)\n } else if (dbc >= dab && dbc >= dac) {\n vm.lerpVectors(vb, vc, 0.5)\n if (hasNormals) nm.lerpVectors(nb, nc, 0.5)\n if (hasColors) cm.lerpColors(cb, cc, 0.5)\n if (hasUVs) um.lerpVectors(ub, uc, 0.5)\n if (hasUV2s) u2m.lerpVectors(u2b, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 2, 0)\n } else {\n vm.lerpVectors(va, vc, 0.5)\n if (hasNormals) nm.lerpVectors(na, nc, 0.5)\n if (hasColors) cm.lerpColors(ca, cc, 0.5)\n if (hasUVs) um.lerpVectors(ua, uc, 0.5)\n if (hasUV2s) u2m.lerpVectors(u2a, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 1, 2)\n }\n } else {\n addTriangle(0, 1, 2)\n }\n }\n }\n\n const geometry2 = new BufferGeometry()\n\n geometry2.setAttribute('position', new Float32BufferAttribute(positions2, 3))\n\n if (hasNormals) {\n geometry2.setAttribute('normal', new Float32BufferAttribute(normals2 as any, 3))\n }\n\n if (hasColors) {\n geometry2.setAttribute('color', new Float32BufferAttribute(colors2 as any, 3))\n }\n\n if (hasUVs) {\n geometry2.setAttribute('uv', new Float32BufferAttribute(uvs2 as any, 2))\n }\n\n if (hasUV2s) {\n geometry2.setAttribute('uv2', new Float32BufferAttribute(uv2s2 as any, 2))\n }\n\n return geometry2\n }\n}\n\nexport { TessellateModifier }\n"],"names":["Vector3","Color","Vector2","BufferGeometry","Float32BufferAttribute"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"TessellateModifier.cjs","sources":["../../src/modifiers/TessellateModifier.ts"],"sourcesContent":["import { BufferGeometry, Color, Float32BufferAttribute, Vector2, Vector3 } from 'three'\nimport { UV1 } from '../_polyfill/uv1'\n\n/**\n * Break faces with edges longer than maxEdgeLength\n */\n\nclass TessellateModifier {\n public maxEdgeLength: number\n public maxIterations: number\n\n constructor(maxEdgeLength = 0.1, maxIterations = 6) {\n this.maxEdgeLength = maxEdgeLength\n this.maxIterations = maxIterations\n }\n\n public modify = (geometry: BufferGeometry): BufferGeometry => {\n if (geometry.index !== null) {\n geometry = geometry.toNonIndexed()\n }\n\n //\n\n const maxIterations = this.maxIterations\n const maxEdgeLengthSquared = this.maxEdgeLength * this.maxEdgeLength\n\n const va = new Vector3()\n const vb = new Vector3()\n const vc = new Vector3()\n const vm = new Vector3()\n const vs = [va, vb, vc, vm]\n\n const na = new Vector3()\n const nb = new Vector3()\n const nc = new Vector3()\n const nm = new Vector3()\n const ns = [na, nb, nc, nm]\n\n const ca = new Color()\n const cb = new Color()\n const cc = new Color()\n const cm = new Color()\n const cs = [ca, cb, cc, cm]\n\n const ua = new Vector2()\n const ub = new Vector2()\n const uc = new Vector2()\n const um = new Vector2()\n const us = [ua, ub, uc, um]\n\n const u2a = new Vector2()\n const u2b = new Vector2()\n const u2c = new Vector2()\n const u2m = new Vector2()\n const u2s = [u2a, u2b, u2c, u2m]\n\n const attributes = geometry.attributes\n const hasNormals = attributes.normal !== undefined\n const hasColors = attributes.color !== undefined\n const hasUVs = attributes.uv !== undefined\n const hasUV1s = attributes[UV1] !== undefined\n\n let positions = attributes.position.array\n let normals = hasNormals ? attributes.normal.array : null\n let colors = hasColors ? attributes.color.array : null\n let uvs = hasUVs ? attributes.uv.array : null\n let uv1s = hasUV1s ? attributes.uv1.array : null\n\n let positions2 = (positions as unknown) as number[]\n let normals2 = (normals as unknown) as number[]\n let colors2 = (colors as unknown) as number[]\n let uvs2 = (uvs as unknown) as number[]\n let uv1s2 = (uv1s as unknown) as number[]\n\n let iteration = 0\n let tessellating = true\n\n function addTriangle(a: number, b: number, c: number): void {\n const v1 = vs[a]\n const v2 = vs[b]\n const v3 = vs[c]\n\n positions2.push(v1.x, v1.y, v1.z)\n positions2.push(v2.x, v2.y, v2.z)\n positions2.push(v3.x, v3.y, v3.z)\n\n if (hasNormals) {\n const n1 = ns[a]\n const n2 = ns[b]\n const n3 = ns[c]\n\n normals2.push(n1.x, n1.y, n1.z)\n normals2.push(n2.x, n2.y, n2.z)\n normals2.push(n3.x, n3.y, n3.z)\n }\n\n if (hasColors) {\n const c1 = cs[a]\n const c2 = cs[b]\n const c3 = cs[c]\n\n colors2.push(c1.r, c1.g, c1.b)\n colors2.push(c2.r, c2.g, c2.b)\n colors2.push(c3.r, c3.g, c3.b)\n }\n\n if (hasUVs) {\n const u1 = us[a]\n const u2 = us[b]\n const u3 = us[c]\n\n uvs2.push(u1.x, u1.y)\n uvs2.push(u2.x, u2.y)\n uvs2.push(u3.x, u3.y)\n }\n\n if (hasUV1s) {\n const u21 = u2s[a]\n const u22 = u2s[b]\n const u23 = u2s[c]\n\n uv1s2.push(u21.x, u21.y)\n uv1s2.push(u22.x, u22.y)\n uv1s2.push(u23.x, u23.y)\n }\n }\n\n while (tessellating && iteration < maxIterations) {\n iteration++\n tessellating = false\n\n positions = positions2 as any\n positions2 = []\n\n if (hasNormals) {\n normals = normals2 as any\n normals2 = []\n }\n\n if (hasColors) {\n colors = colors2 as any\n colors2 = []\n }\n\n if (hasUVs) {\n uvs = uvs2 as any\n uvs2 = []\n }\n\n if (hasUV1s) {\n uv1s = uv1s2 as any\n uv1s2 = []\n }\n\n for (let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6) {\n va.fromArray(positions, i + 0)\n vb.fromArray(positions, i + 3)\n vc.fromArray(positions, i + 6)\n\n if (hasNormals && normals) {\n na.fromArray(normals, i + 0)\n nb.fromArray(normals, i + 3)\n nc.fromArray(normals, i + 6)\n }\n\n if (hasColors && colors) {\n ca.fromArray(colors, i + 0)\n cb.fromArray(colors, i + 3)\n cc.fromArray(colors, i + 6)\n }\n\n if (hasUVs && uvs) {\n ua.fromArray(uvs, i2 + 0)\n ub.fromArray(uvs, i2 + 2)\n uc.fromArray(uvs, i2 + 4)\n }\n\n if (hasUV1s && uv1s) {\n u2a.fromArray(uv1s, i2 + 0)\n u2b.fromArray(uv1s, i2 + 2)\n u2c.fromArray(uv1s, i2 + 4)\n }\n\n const dab = va.distanceToSquared(vb)\n const dbc = vb.distanceToSquared(vc)\n const dac = va.distanceToSquared(vc)\n\n if (dab > maxEdgeLengthSquared || dbc > maxEdgeLengthSquared || dac > maxEdgeLengthSquared) {\n tessellating = true\n\n if (dab >= dbc && dab >= dac) {\n vm.lerpVectors(va, vb, 0.5)\n if (hasNormals) nm.lerpVectors(na, nb, 0.5)\n if (hasColors) cm.lerpColors(ca, cb, 0.5)\n if (hasUVs) um.lerpVectors(ua, ub, 0.5)\n if (hasUV1s) u2m.lerpVectors(u2a, u2b, 0.5)\n\n addTriangle(0, 3, 2)\n addTriangle(3, 1, 2)\n } else if (dbc >= dab && dbc >= dac) {\n vm.lerpVectors(vb, vc, 0.5)\n if (hasNormals) nm.lerpVectors(nb, nc, 0.5)\n if (hasColors) cm.lerpColors(cb, cc, 0.5)\n if (hasUVs) um.lerpVectors(ub, uc, 0.5)\n if (hasUV1s) u2m.lerpVectors(u2b, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 2, 0)\n } else {\n vm.lerpVectors(va, vc, 0.5)\n if (hasNormals) nm.lerpVectors(na, nc, 0.5)\n if (hasColors) cm.lerpColors(ca, cc, 0.5)\n if (hasUVs) um.lerpVectors(ua, uc, 0.5)\n if (hasUV1s) u2m.lerpVectors(u2a, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 1, 2)\n }\n } else {\n addTriangle(0, 1, 2)\n }\n }\n }\n\n const geometry2 = new BufferGeometry()\n\n geometry2.setAttribute('position', new Float32BufferAttribute(positions2, 3))\n\n if (hasNormals) {\n geometry2.setAttribute('normal', new Float32BufferAttribute(normals2 as any, 3))\n }\n\n if (hasColors) {\n geometry2.setAttribute('color', new Float32BufferAttribute(colors2 as any, 3))\n }\n\n if (hasUVs) {\n geometry2.setAttribute('uv', new Float32BufferAttribute(uvs2 as any, 2))\n }\n\n if (hasUV1s) {\n geometry2.setAttribute(UV1, new Float32BufferAttribute(uv1s2 as any, 2))\n }\n\n return geometry2\n }\n}\n\nexport { TessellateModifier }\n"],"names":["Vector3","Color","Vector2","UV1","BufferGeometry","Float32BufferAttribute"],"mappings":"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"}
|
@@ -5,6 +5,7 @@ var __publicField = (obj, key, value) => {
|
|
5
5
|
return value;
|
6
6
|
};
|
7
7
|
import { Vector3, Color, Vector2, BufferGeometry, Float32BufferAttribute } from "three";
|
8
|
+
import { UV1 } from "../_polyfill/uv1.js";
|
8
9
|
class TessellateModifier {
|
9
10
|
constructor(maxEdgeLength = 0.1, maxIterations = 6) {
|
10
11
|
__publicField(this, "maxEdgeLength");
|
@@ -44,17 +45,17 @@ class TessellateModifier {
|
|
44
45
|
const hasNormals = attributes.normal !== void 0;
|
45
46
|
const hasColors = attributes.color !== void 0;
|
46
47
|
const hasUVs = attributes.uv !== void 0;
|
47
|
-
const
|
48
|
+
const hasUV1s = attributes[UV1] !== void 0;
|
48
49
|
let positions = attributes.position.array;
|
49
50
|
let normals = hasNormals ? attributes.normal.array : null;
|
50
51
|
let colors = hasColors ? attributes.color.array : null;
|
51
52
|
let uvs = hasUVs ? attributes.uv.array : null;
|
52
|
-
let
|
53
|
+
let uv1s = hasUV1s ? attributes.uv1.array : null;
|
53
54
|
let positions2 = positions;
|
54
55
|
let normals2 = normals;
|
55
56
|
let colors2 = colors;
|
56
57
|
let uvs2 = uvs;
|
57
|
-
let
|
58
|
+
let uv1s2 = uv1s;
|
58
59
|
let iteration = 0;
|
59
60
|
let tessellating = true;
|
60
61
|
function addTriangle(a, b, c) {
|
@@ -88,13 +89,13 @@ class TessellateModifier {
|
|
88
89
|
uvs2.push(u2.x, u2.y);
|
89
90
|
uvs2.push(u3.x, u3.y);
|
90
91
|
}
|
91
|
-
if (
|
92
|
+
if (hasUV1s) {
|
92
93
|
const u21 = u2s[a];
|
93
94
|
const u22 = u2s[b];
|
94
95
|
const u23 = u2s[c];
|
95
|
-
|
96
|
-
|
97
|
-
|
96
|
+
uv1s2.push(u21.x, u21.y);
|
97
|
+
uv1s2.push(u22.x, u22.y);
|
98
|
+
uv1s2.push(u23.x, u23.y);
|
98
99
|
}
|
99
100
|
}
|
100
101
|
while (tessellating && iteration < maxIterations) {
|
@@ -114,9 +115,9 @@ class TessellateModifier {
|
|
114
115
|
uvs = uvs2;
|
115
116
|
uvs2 = [];
|
116
117
|
}
|
117
|
-
if (
|
118
|
-
|
119
|
-
|
118
|
+
if (hasUV1s) {
|
119
|
+
uv1s = uv1s2;
|
120
|
+
uv1s2 = [];
|
120
121
|
}
|
121
122
|
for (let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6) {
|
122
123
|
va.fromArray(positions, i + 0);
|
@@ -137,10 +138,10 @@ class TessellateModifier {
|
|
137
138
|
ub.fromArray(uvs, i2 + 2);
|
138
139
|
uc.fromArray(uvs, i2 + 4);
|
139
140
|
}
|
140
|
-
if (
|
141
|
-
u2a.fromArray(
|
142
|
-
u2b.fromArray(
|
143
|
-
u2c.fromArray(
|
141
|
+
if (hasUV1s && uv1s) {
|
142
|
+
u2a.fromArray(uv1s, i2 + 0);
|
143
|
+
u2b.fromArray(uv1s, i2 + 2);
|
144
|
+
u2c.fromArray(uv1s, i2 + 4);
|
144
145
|
}
|
145
146
|
const dab = va.distanceToSquared(vb);
|
146
147
|
const dbc = vb.distanceToSquared(vc);
|
@@ -155,7 +156,7 @@ class TessellateModifier {
|
|
155
156
|
cm.lerpColors(ca, cb, 0.5);
|
156
157
|
if (hasUVs)
|
157
158
|
um.lerpVectors(ua, ub, 0.5);
|
158
|
-
if (
|
159
|
+
if (hasUV1s)
|
159
160
|
u2m.lerpVectors(u2a, u2b, 0.5);
|
160
161
|
addTriangle(0, 3, 2);
|
161
162
|
addTriangle(3, 1, 2);
|
@@ -167,7 +168,7 @@ class TessellateModifier {
|
|
167
168
|
cm.lerpColors(cb, cc, 0.5);
|
168
169
|
if (hasUVs)
|
169
170
|
um.lerpVectors(ub, uc, 0.5);
|
170
|
-
if (
|
171
|
+
if (hasUV1s)
|
171
172
|
u2m.lerpVectors(u2b, u2c, 0.5);
|
172
173
|
addTriangle(0, 1, 3);
|
173
174
|
addTriangle(3, 2, 0);
|
@@ -179,7 +180,7 @@ class TessellateModifier {
|
|
179
180
|
cm.lerpColors(ca, cc, 0.5);
|
180
181
|
if (hasUVs)
|
181
182
|
um.lerpVectors(ua, uc, 0.5);
|
182
|
-
if (
|
183
|
+
if (hasUV1s)
|
183
184
|
u2m.lerpVectors(u2a, u2c, 0.5);
|
184
185
|
addTriangle(0, 1, 3);
|
185
186
|
addTriangle(3, 1, 2);
|
@@ -200,8 +201,8 @@ class TessellateModifier {
|
|
200
201
|
if (hasUVs) {
|
201
202
|
geometry2.setAttribute("uv", new Float32BufferAttribute(uvs2, 2));
|
202
203
|
}
|
203
|
-
if (
|
204
|
-
geometry2.setAttribute(
|
204
|
+
if (hasUV1s) {
|
205
|
+
geometry2.setAttribute(UV1, new Float32BufferAttribute(uv1s2, 2));
|
205
206
|
}
|
206
207
|
return geometry2;
|
207
208
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"TessellateModifier.js","sources":["../../src/modifiers/TessellateModifier.ts"],"sourcesContent":["import { BufferGeometry, Color, Float32BufferAttribute, Vector2, Vector3 } from 'three'\n\n/**\n * Break faces with edges longer than maxEdgeLength\n */\n\nclass TessellateModifier {\n public maxEdgeLength: number\n public maxIterations: number\n\n constructor(maxEdgeLength = 0.1, maxIterations = 6) {\n this.maxEdgeLength = maxEdgeLength\n this.maxIterations = maxIterations\n }\n\n public modify = (geometry: BufferGeometry): BufferGeometry => {\n if (geometry.index !== null) {\n geometry = geometry.toNonIndexed()\n }\n\n //\n\n const maxIterations = this.maxIterations\n const maxEdgeLengthSquared = this.maxEdgeLength * this.maxEdgeLength\n\n const va = new Vector3()\n const vb = new Vector3()\n const vc = new Vector3()\n const vm = new Vector3()\n const vs = [va, vb, vc, vm]\n\n const na = new Vector3()\n const nb = new Vector3()\n const nc = new Vector3()\n const nm = new Vector3()\n const ns = [na, nb, nc, nm]\n\n const ca = new Color()\n const cb = new Color()\n const cc = new Color()\n const cm = new Color()\n const cs = [ca, cb, cc, cm]\n\n const ua = new Vector2()\n const ub = new Vector2()\n const uc = new Vector2()\n const um = new Vector2()\n const us = [ua, ub, uc, um]\n\n const u2a = new Vector2()\n const u2b = new Vector2()\n const u2c = new Vector2()\n const u2m = new Vector2()\n const u2s = [u2a, u2b, u2c, u2m]\n\n const attributes = geometry.attributes\n const hasNormals = attributes.normal !== undefined\n const hasColors = attributes.color !== undefined\n const hasUVs = attributes.uv !== undefined\n const hasUV2s = attributes.uv2 !== undefined\n\n let positions = attributes.position.array\n let normals = hasNormals ? attributes.normal.array : null\n let colors = hasColors ? attributes.color.array : null\n let uvs = hasUVs ? attributes.uv.array : null\n let uv2s = hasUV2s ? attributes.uv2.array : null\n\n let positions2 = (positions as unknown) as number[]\n let normals2 = (normals as unknown) as number[]\n let colors2 = (colors as unknown) as number[]\n let uvs2 = (uvs as unknown) as number[]\n let uv2s2 = (uv2s as unknown) as number[]\n\n let iteration = 0\n let tessellating = true\n\n function addTriangle(a: number, b: number, c: number): void {\n const v1 = vs[a]\n const v2 = vs[b]\n const v3 = vs[c]\n\n positions2.push(v1.x, v1.y, v1.z)\n positions2.push(v2.x, v2.y, v2.z)\n positions2.push(v3.x, v3.y, v3.z)\n\n if (hasNormals) {\n const n1 = ns[a]\n const n2 = ns[b]\n const n3 = ns[c]\n\n normals2.push(n1.x, n1.y, n1.z)\n normals2.push(n2.x, n2.y, n2.z)\n normals2.push(n3.x, n3.y, n3.z)\n }\n\n if (hasColors) {\n const c1 = cs[a]\n const c2 = cs[b]\n const c3 = cs[c]\n\n colors2.push(c1.r, c1.g, c1.b)\n colors2.push(c2.r, c2.g, c2.b)\n colors2.push(c3.r, c3.g, c3.b)\n }\n\n if (hasUVs) {\n const u1 = us[a]\n const u2 = us[b]\n const u3 = us[c]\n\n uvs2.push(u1.x, u1.y)\n uvs2.push(u2.x, u2.y)\n uvs2.push(u3.x, u3.y)\n }\n\n if (hasUV2s) {\n const u21 = u2s[a]\n const u22 = u2s[b]\n const u23 = u2s[c]\n\n uv2s2.push(u21.x, u21.y)\n uv2s2.push(u22.x, u22.y)\n uv2s2.push(u23.x, u23.y)\n }\n }\n\n while (tessellating && iteration < maxIterations) {\n iteration++\n tessellating = false\n\n positions = positions2 as any\n positions2 = []\n\n if (hasNormals) {\n normals = normals2 as any\n normals2 = []\n }\n\n if (hasColors) {\n colors = colors2 as any\n colors2 = []\n }\n\n if (hasUVs) {\n uvs = uvs2 as any\n uvs2 = []\n }\n\n if (hasUV2s) {\n uv2s = uv2s2 as any\n uv2s2 = []\n }\n\n for (let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6) {\n va.fromArray(positions, i + 0)\n vb.fromArray(positions, i + 3)\n vc.fromArray(positions, i + 6)\n\n if (hasNormals && normals) {\n na.fromArray(normals, i + 0)\n nb.fromArray(normals, i + 3)\n nc.fromArray(normals, i + 6)\n }\n\n if (hasColors && colors) {\n ca.fromArray(colors, i + 0)\n cb.fromArray(colors, i + 3)\n cc.fromArray(colors, i + 6)\n }\n\n if (hasUVs && uvs) {\n ua.fromArray(uvs, i2 + 0)\n ub.fromArray(uvs, i2 + 2)\n uc.fromArray(uvs, i2 + 4)\n }\n\n if (hasUV2s && uv2s) {\n u2a.fromArray(uv2s, i2 + 0)\n u2b.fromArray(uv2s, i2 + 2)\n u2c.fromArray(uv2s, i2 + 4)\n }\n\n const dab = va.distanceToSquared(vb)\n const dbc = vb.distanceToSquared(vc)\n const dac = va.distanceToSquared(vc)\n\n if (dab > maxEdgeLengthSquared || dbc > maxEdgeLengthSquared || dac > maxEdgeLengthSquared) {\n tessellating = true\n\n if (dab >= dbc && dab >= dac) {\n vm.lerpVectors(va, vb, 0.5)\n if (hasNormals) nm.lerpVectors(na, nb, 0.5)\n if (hasColors) cm.lerpColors(ca, cb, 0.5)\n if (hasUVs) um.lerpVectors(ua, ub, 0.5)\n if (hasUV2s) u2m.lerpVectors(u2a, u2b, 0.5)\n\n addTriangle(0, 3, 2)\n addTriangle(3, 1, 2)\n } else if (dbc >= dab && dbc >= dac) {\n vm.lerpVectors(vb, vc, 0.5)\n if (hasNormals) nm.lerpVectors(nb, nc, 0.5)\n if (hasColors) cm.lerpColors(cb, cc, 0.5)\n if (hasUVs) um.lerpVectors(ub, uc, 0.5)\n if (hasUV2s) u2m.lerpVectors(u2b, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 2, 0)\n } else {\n vm.lerpVectors(va, vc, 0.5)\n if (hasNormals) nm.lerpVectors(na, nc, 0.5)\n if (hasColors) cm.lerpColors(ca, cc, 0.5)\n if (hasUVs) um.lerpVectors(ua, uc, 0.5)\n if (hasUV2s) u2m.lerpVectors(u2a, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 1, 2)\n }\n } else {\n addTriangle(0, 1, 2)\n }\n }\n }\n\n const geometry2 = new BufferGeometry()\n\n geometry2.setAttribute('position', new Float32BufferAttribute(positions2, 3))\n\n if (hasNormals) {\n geometry2.setAttribute('normal', new Float32BufferAttribute(normals2 as any, 3))\n }\n\n if (hasColors) {\n geometry2.setAttribute('color', new Float32BufferAttribute(colors2 as any, 3))\n }\n\n if (hasUVs) {\n geometry2.setAttribute('uv', new Float32BufferAttribute(uvs2 as any, 2))\n }\n\n if (hasUV2s) {\n geometry2.setAttribute('uv2', new Float32BufferAttribute(uv2s2 as any, 2))\n }\n\n return geometry2\n }\n}\n\nexport { TessellateModifier }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"TessellateModifier.js","sources":["../../src/modifiers/TessellateModifier.ts"],"sourcesContent":["import { BufferGeometry, Color, Float32BufferAttribute, Vector2, Vector3 } from 'three'\nimport { UV1 } from '../_polyfill/uv1'\n\n/**\n * Break faces with edges longer than maxEdgeLength\n */\n\nclass TessellateModifier {\n public maxEdgeLength: number\n public maxIterations: number\n\n constructor(maxEdgeLength = 0.1, maxIterations = 6) {\n this.maxEdgeLength = maxEdgeLength\n this.maxIterations = maxIterations\n }\n\n public modify = (geometry: BufferGeometry): BufferGeometry => {\n if (geometry.index !== null) {\n geometry = geometry.toNonIndexed()\n }\n\n //\n\n const maxIterations = this.maxIterations\n const maxEdgeLengthSquared = this.maxEdgeLength * this.maxEdgeLength\n\n const va = new Vector3()\n const vb = new Vector3()\n const vc = new Vector3()\n const vm = new Vector3()\n const vs = [va, vb, vc, vm]\n\n const na = new Vector3()\n const nb = new Vector3()\n const nc = new Vector3()\n const nm = new Vector3()\n const ns = [na, nb, nc, nm]\n\n const ca = new Color()\n const cb = new Color()\n const cc = new Color()\n const cm = new Color()\n const cs = [ca, cb, cc, cm]\n\n const ua = new Vector2()\n const ub = new Vector2()\n const uc = new Vector2()\n const um = new Vector2()\n const us = [ua, ub, uc, um]\n\n const u2a = new Vector2()\n const u2b = new Vector2()\n const u2c = new Vector2()\n const u2m = new Vector2()\n const u2s = [u2a, u2b, u2c, u2m]\n\n const attributes = geometry.attributes\n const hasNormals = attributes.normal !== undefined\n const hasColors = attributes.color !== undefined\n const hasUVs = attributes.uv !== undefined\n const hasUV1s = attributes[UV1] !== undefined\n\n let positions = attributes.position.array\n let normals = hasNormals ? attributes.normal.array : null\n let colors = hasColors ? attributes.color.array : null\n let uvs = hasUVs ? attributes.uv.array : null\n let uv1s = hasUV1s ? attributes.uv1.array : null\n\n let positions2 = (positions as unknown) as number[]\n let normals2 = (normals as unknown) as number[]\n let colors2 = (colors as unknown) as number[]\n let uvs2 = (uvs as unknown) as number[]\n let uv1s2 = (uv1s as unknown) as number[]\n\n let iteration = 0\n let tessellating = true\n\n function addTriangle(a: number, b: number, c: number): void {\n const v1 = vs[a]\n const v2 = vs[b]\n const v3 = vs[c]\n\n positions2.push(v1.x, v1.y, v1.z)\n positions2.push(v2.x, v2.y, v2.z)\n positions2.push(v3.x, v3.y, v3.z)\n\n if (hasNormals) {\n const n1 = ns[a]\n const n2 = ns[b]\n const n3 = ns[c]\n\n normals2.push(n1.x, n1.y, n1.z)\n normals2.push(n2.x, n2.y, n2.z)\n normals2.push(n3.x, n3.y, n3.z)\n }\n\n if (hasColors) {\n const c1 = cs[a]\n const c2 = cs[b]\n const c3 = cs[c]\n\n colors2.push(c1.r, c1.g, c1.b)\n colors2.push(c2.r, c2.g, c2.b)\n colors2.push(c3.r, c3.g, c3.b)\n }\n\n if (hasUVs) {\n const u1 = us[a]\n const u2 = us[b]\n const u3 = us[c]\n\n uvs2.push(u1.x, u1.y)\n uvs2.push(u2.x, u2.y)\n uvs2.push(u3.x, u3.y)\n }\n\n if (hasUV1s) {\n const u21 = u2s[a]\n const u22 = u2s[b]\n const u23 = u2s[c]\n\n uv1s2.push(u21.x, u21.y)\n uv1s2.push(u22.x, u22.y)\n uv1s2.push(u23.x, u23.y)\n }\n }\n\n while (tessellating && iteration < maxIterations) {\n iteration++\n tessellating = false\n\n positions = positions2 as any\n positions2 = []\n\n if (hasNormals) {\n normals = normals2 as any\n normals2 = []\n }\n\n if (hasColors) {\n colors = colors2 as any\n colors2 = []\n }\n\n if (hasUVs) {\n uvs = uvs2 as any\n uvs2 = []\n }\n\n if (hasUV1s) {\n uv1s = uv1s2 as any\n uv1s2 = []\n }\n\n for (let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6) {\n va.fromArray(positions, i + 0)\n vb.fromArray(positions, i + 3)\n vc.fromArray(positions, i + 6)\n\n if (hasNormals && normals) {\n na.fromArray(normals, i + 0)\n nb.fromArray(normals, i + 3)\n nc.fromArray(normals, i + 6)\n }\n\n if (hasColors && colors) {\n ca.fromArray(colors, i + 0)\n cb.fromArray(colors, i + 3)\n cc.fromArray(colors, i + 6)\n }\n\n if (hasUVs && uvs) {\n ua.fromArray(uvs, i2 + 0)\n ub.fromArray(uvs, i2 + 2)\n uc.fromArray(uvs, i2 + 4)\n }\n\n if (hasUV1s && uv1s) {\n u2a.fromArray(uv1s, i2 + 0)\n u2b.fromArray(uv1s, i2 + 2)\n u2c.fromArray(uv1s, i2 + 4)\n }\n\n const dab = va.distanceToSquared(vb)\n const dbc = vb.distanceToSquared(vc)\n const dac = va.distanceToSquared(vc)\n\n if (dab > maxEdgeLengthSquared || dbc > maxEdgeLengthSquared || dac > maxEdgeLengthSquared) {\n tessellating = true\n\n if (dab >= dbc && dab >= dac) {\n vm.lerpVectors(va, vb, 0.5)\n if (hasNormals) nm.lerpVectors(na, nb, 0.5)\n if (hasColors) cm.lerpColors(ca, cb, 0.5)\n if (hasUVs) um.lerpVectors(ua, ub, 0.5)\n if (hasUV1s) u2m.lerpVectors(u2a, u2b, 0.5)\n\n addTriangle(0, 3, 2)\n addTriangle(3, 1, 2)\n } else if (dbc >= dab && dbc >= dac) {\n vm.lerpVectors(vb, vc, 0.5)\n if (hasNormals) nm.lerpVectors(nb, nc, 0.5)\n if (hasColors) cm.lerpColors(cb, cc, 0.5)\n if (hasUVs) um.lerpVectors(ub, uc, 0.5)\n if (hasUV1s) u2m.lerpVectors(u2b, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 2, 0)\n } else {\n vm.lerpVectors(va, vc, 0.5)\n if (hasNormals) nm.lerpVectors(na, nc, 0.5)\n if (hasColors) cm.lerpColors(ca, cc, 0.5)\n if (hasUVs) um.lerpVectors(ua, uc, 0.5)\n if (hasUV1s) u2m.lerpVectors(u2a, u2c, 0.5)\n\n addTriangle(0, 1, 3)\n addTriangle(3, 1, 2)\n }\n } else {\n addTriangle(0, 1, 2)\n }\n }\n }\n\n const geometry2 = new BufferGeometry()\n\n geometry2.setAttribute('position', new Float32BufferAttribute(positions2, 3))\n\n if (hasNormals) {\n geometry2.setAttribute('normal', new Float32BufferAttribute(normals2 as any, 3))\n }\n\n if (hasColors) {\n geometry2.setAttribute('color', new Float32BufferAttribute(colors2 as any, 3))\n }\n\n if (hasUVs) {\n geometry2.setAttribute('uv', new Float32BufferAttribute(uvs2 as any, 2))\n }\n\n if (hasUV1s) {\n geometry2.setAttribute(UV1, new Float32BufferAttribute(uv1s2 as any, 2))\n }\n\n return geometry2\n }\n}\n\nexport { TessellateModifier }\n"],"names":[],"mappings":"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"}
|