three-stdlib 2.28.10 → 2.28.12
Sign up to get free protection for your applications and to get access to all the features.
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.js.map +1 -1
- package/controls/DeviceOrientationControls.cjs.map +1 -1
- package/controls/DeviceOrientationControls.js.map +1 -1
- package/controls/DragControls.cjs.map +1 -1
- package/controls/DragControls.js.map +1 -1
- package/controls/FlyControls.cjs +1 -1
- package/controls/FlyControls.cjs.map +1 -1
- package/controls/FlyControls.js +1 -1
- package/controls/FlyControls.js.map +1 -1
- package/controls/OrbitControls.cjs.map +1 -1
- package/controls/OrbitControls.js.map +1 -1
- package/controls/PointerLockControls.cjs.map +1 -1
- package/controls/PointerLockControls.js.map +1 -1
- package/controls/TrackballControls.cjs +0 -2
- package/controls/TrackballControls.cjs.map +1 -1
- package/controls/TrackballControls.js +0 -2
- package/controls/TrackballControls.js.map +1 -1
- package/controls/TransformControls.cjs +2 -2
- package/controls/TransformControls.cjs.map +1 -1
- package/controls/TransformControls.js +2 -2
- package/controls/TransformControls.js.map +1 -1
- package/controls/experimental/CameraControls.cjs.map +1 -1
- package/controls/experimental/CameraControls.js.map +1 -1
- package/loaders/EXRLoader.cjs +1 -1
- package/loaders/EXRLoader.cjs.map +1 -1
- package/loaders/EXRLoader.js +1 -1
- package/loaders/EXRLoader.js.map +1 -1
- package/loaders/FontLoader.cjs.map +1 -1
- package/loaders/FontLoader.js.map +1 -1
- package/loaders/HDRCubeTextureLoader.cjs +3 -1
- package/loaders/HDRCubeTextureLoader.cjs.map +1 -1
- package/loaders/HDRCubeTextureLoader.d.ts +1 -1
- package/loaders/HDRCubeTextureLoader.js +3 -1
- package/loaders/HDRCubeTextureLoader.js.map +1 -1
- package/modifiers/CurveModifier.cjs.map +1 -1
- package/modifiers/CurveModifier.js.map +1 -1
- package/modifiers/TessellateModifier.cjs.map +1 -1
- package/modifiers/TessellateModifier.js.map +1 -1
- package/package.json +1 -1
- package/postprocessing/BloomPass.cjs.map +1 -1
- package/postprocessing/BloomPass.d.ts +16 -3
- package/postprocessing/BloomPass.js.map +1 -1
- package/postprocessing/DotScreenPass.cjs.map +1 -1
- package/postprocessing/DotScreenPass.d.ts +3 -2
- package/postprocessing/DotScreenPass.js.map +1 -1
- package/postprocessing/FilmPass.cjs.map +1 -1
- package/postprocessing/FilmPass.d.ts +3 -2
- package/postprocessing/FilmPass.js.map +1 -1
- package/postprocessing/GlitchPass.cjs.map +1 -1
- package/postprocessing/GlitchPass.d.ts +3 -2
- package/postprocessing/GlitchPass.js.map +1 -1
- package/postprocessing/WaterPass.cjs +2 -2
- package/postprocessing/WaterPass.cjs.map +1 -1
- package/postprocessing/WaterPass.d.ts +7 -2
- package/postprocessing/WaterPass.js +3 -3
- package/postprocessing/WaterPass.js.map +1 -1
- package/webxr/OculusHandModel.cjs.map +1 -1
- package/webxr/OculusHandModel.js.map +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"HDRCubeTextureLoader.js","sources":["../../src/loaders/HDRCubeTextureLoader.js"],"sourcesContent":["import { CubeTexture, DataTexture, FileLoader, FloatType, HalfFloatType, LinearFilter, Loader } from 'three'\nimport { RGBELoader } from '../loaders/RGBELoader.js'\n\nclass HDRCubeTextureLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.hdrLoader = new RGBELoader()\n this.type = HalfFloatType\n }\n\n load(urls, onLoad, onProgress, onError) {\n if (!Array.isArray(urls)) {\n console.warn('THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead.')\n\n this.setDataType(urls)\n\n urls = onLoad\n onLoad = onProgress\n onProgress = onError\n onError = arguments[4]\n }\n\n const texture = new CubeTexture()\n\n texture.type = this.type\n\n switch (texture.type) {\n case FloatType:\n case HalfFloatType:\n if ('colorSpace' in texture) texture.colorSpace = 'srgb-linear'\n else texture.encoding = 3000 // LinearEncoding\n texture.minFilter = LinearFilter\n texture.magFilter = LinearFilter\n texture.generateMipmaps = false\n break\n }\n\n const scope = this\n\n let loaded = 0\n\n function loadHDRData(i, onLoad, onProgress, onError) {\n new FileLoader(scope.manager)\n .setPath(scope.path)\n .setResponseType('arraybuffer')\n .setWithCredentials(scope.withCredentials)\n .load(\n urls[i],\n function (buffer) {\n loaded++\n\n const texData = scope.hdrLoader.parse(buffer)\n\n if (!texData) return\n\n if (texData.data !== undefined) {\n const dataTexture = new DataTexture(texData.data, texData.width, texData.height)\n\n dataTexture.type = texture.type\n dataTexture.encoding = texture.encoding\n dataTexture.format = texture.format\n dataTexture.minFilter = texture.minFilter\n dataTexture.magFilter = texture.magFilter\n dataTexture.generateMipmaps = texture.generateMipmaps\n\n texture.images[i] = dataTexture\n }\n\n if (loaded === 6) {\n texture.needsUpdate = true\n if (onLoad) onLoad(texture)\n }\n },\n onProgress,\n onError,\n )\n }\n\n for (let i = 0; i < urls.length; i++) {\n loadHDRData(i, onLoad, onProgress, onError)\n }\n\n return texture\n }\n\n setDataType(value) {\n this.type = value\n this.hdrLoader.setDataType(value)\n\n return this\n }\n}\n\nexport { HDRCubeTextureLoader }\n"],"names":["onLoad","onProgress","onError"],"mappings":";;AAGA,MAAM,6BAA6B,OAAO;AAAA,EACxC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,YAAY,IAAI,WAAY;AACjC,SAAK,OAAO;AAAA,EACb;AAAA,EAED,KAAK,MAAM,QAAQ,YAAY,SAAS;AACtC,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;
|
1
|
+
{"version":3,"file":"HDRCubeTextureLoader.js","sources":["../../src/loaders/HDRCubeTextureLoader.js"],"sourcesContent":["import { CubeTexture, DataTexture, FileLoader, FloatType, HalfFloatType, LinearFilter, Loader } from 'three'\nimport { RGBELoader } from '../loaders/RGBELoader.js'\n\nclass HDRCubeTextureLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.hdrLoader = new RGBELoader()\n this.type = HalfFloatType\n }\n\n load(urls, onLoad, onProgress, onError) {\n if (typeof urls === 'string') {\n urls = [urls]\n } else if (!Array.isArray(urls)) {\n console.warn('THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead.')\n\n this.setDataType(urls)\n\n urls = onLoad\n onLoad = onProgress\n onProgress = onError\n onError = arguments[4]\n }\n\n const texture = new CubeTexture()\n\n texture.type = this.type\n\n switch (texture.type) {\n case FloatType:\n case HalfFloatType:\n if ('colorSpace' in texture) texture.colorSpace = 'srgb-linear'\n else texture.encoding = 3000 // LinearEncoding\n texture.minFilter = LinearFilter\n texture.magFilter = LinearFilter\n texture.generateMipmaps = false\n break\n }\n\n const scope = this\n\n let loaded = 0\n\n function loadHDRData(i, onLoad, onProgress, onError) {\n new FileLoader(scope.manager)\n .setPath(scope.path)\n .setResponseType('arraybuffer')\n .setWithCredentials(scope.withCredentials)\n .load(\n urls[i],\n function (buffer) {\n loaded++\n\n const texData = scope.hdrLoader.parse(buffer)\n\n if (!texData) return\n\n if (texData.data !== undefined) {\n const dataTexture = new DataTexture(texData.data, texData.width, texData.height)\n\n dataTexture.type = texture.type\n dataTexture.encoding = texture.encoding\n dataTexture.format = texture.format\n dataTexture.minFilter = texture.minFilter\n dataTexture.magFilter = texture.magFilter\n dataTexture.generateMipmaps = texture.generateMipmaps\n\n texture.images[i] = dataTexture\n }\n\n if (loaded === 6) {\n texture.needsUpdate = true\n if (onLoad) onLoad(texture)\n }\n },\n onProgress,\n onError,\n )\n }\n\n for (let i = 0; i < urls.length; i++) {\n loadHDRData(i, onLoad, onProgress, onError)\n }\n\n return texture\n }\n\n setDataType(value) {\n this.type = value\n this.hdrLoader.setDataType(value)\n\n return this\n }\n}\n\nexport { HDRCubeTextureLoader }\n"],"names":["onLoad","onProgress","onError"],"mappings":";;AAGA,MAAM,6BAA6B,OAAO;AAAA,EACxC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,YAAY,IAAI,WAAY;AACjC,SAAK,OAAO;AAAA,EACb;AAAA,EAED,KAAK,MAAM,QAAQ,YAAY,SAAS;AACtC,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,CAAC,IAAI;AAAA,IACb,WAAU,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC/B,cAAQ,KAAK,+EAA+E;AAE5F,WAAK,YAAY,IAAI;AAErB,aAAO;AACP,eAAS;AACT,mBAAa;AACb,gBAAU,UAAU,CAAC;AAAA,IACtB;AAED,UAAM,UAAU,IAAI,YAAa;AAEjC,YAAQ,OAAO,KAAK;AAEpB,YAAQ,QAAQ,MAAI;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AACH,YAAI,gBAAgB;AAAS,kBAAQ,aAAa;AAAA;AAC7C,kBAAQ,WAAW;AACxB,gBAAQ,YAAY;AACpB,gBAAQ,YAAY;AACpB,gBAAQ,kBAAkB;AAC1B;AAAA,IACH;AAED,UAAM,QAAQ;AAEd,QAAI,SAAS;AAEb,aAAS,YAAY,GAAGA,SAAQC,aAAYC,UAAS;AACnD,UAAI,WAAW,MAAM,OAAO,EACzB,QAAQ,MAAM,IAAI,EAClB,gBAAgB,aAAa,EAC7B,mBAAmB,MAAM,eAAe,EACxC;AAAA,QACC,KAAK,CAAC;AAAA,QACN,SAAU,QAAQ;AAChB;AAEA,gBAAM,UAAU,MAAM,UAAU,MAAM,MAAM;AAE5C,cAAI,CAAC;AAAS;AAEd,cAAI,QAAQ,SAAS,QAAW;AAC9B,kBAAM,cAAc,IAAI,YAAY,QAAQ,MAAM,QAAQ,OAAO,QAAQ,MAAM;AAE/E,wBAAY,OAAO,QAAQ;AAC3B,wBAAY,WAAW,QAAQ;AAC/B,wBAAY,SAAS,QAAQ;AAC7B,wBAAY,YAAY,QAAQ;AAChC,wBAAY,YAAY,QAAQ;AAChC,wBAAY,kBAAkB,QAAQ;AAEtC,oBAAQ,OAAO,CAAC,IAAI;AAAA,UACrB;AAED,cAAI,WAAW,GAAG;AAChB,oBAAQ,cAAc;AACtB,gBAAIF;AAAQ,cAAAA,QAAO,OAAO;AAAA,UAC3B;AAAA,QACF;AAAA,QACDC;AAAA,QACAC;AAAA,MACD;AAAA,IACJ;AAED,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,kBAAY,GAAG,QAAQ,YAAY,OAAO;AAAA,IAC3C;AAED,WAAO;AAAA,EACR;AAAA,EAED,YAAY,OAAO;AACjB,SAAK,OAAO;AACZ,SAAK,UAAU,YAAY,KAAK;AAEhC,WAAO;AAAA,EACR;AACH;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CurveModifier.cjs","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Shader,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: Shader & { __modified: boolean }): void => {\n if (shader.__modified) return\n shader.__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":["DataTexture","RGBAFormat","FloatType","RepeatWrapping","NearestFilter","Mesh","InstancedMesh","Matrix4","DynamicDrawUsage"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"CurveModifier.cjs","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":["DataTexture","RGBAFormat","FloatType","RepeatWrapping","NearestFilter","Mesh","InstancedMesh","Matrix4","DynamicDrawUsage"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CurveModifier.js","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Shader,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: Shader & { __modified: boolean }): void => {\n if (shader.__modified) return\n shader.__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"CurveModifier.js","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":[],"mappings":"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"}
|
@@ -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 number[]\n let normals2 = normals\n let colors2 = colors\n let uvs2 = uvs\n let uv2s2 = uv2s\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 as number[]).push(n1.x, n1.y, n1.z)\n ;(normals2 as number[]).push(n2.x, n2.y, n2.z)\n ;(normals2 as number[]).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 as number[]).push(c1.r, c1.g, c1.b)\n ;(colors2 as number[]).push(c2.r, c2.g, c2.b)\n ;(colors2 as number[]).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 as number[]).push(u1.x, u1.y)\n ;(uvs2 as number[]).push(u2.x, u2.y)\n ;(uvs2 as number[]).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 as number[]).push(u21.x, u21.y)\n ;(uv2s2 as number[]).push(u22.x, u22.y)\n ;(uv2s2 as number[]).push(u23.x, u23.y)\n }\n }\n\n while (tessellating && iteration < maxIterations) {\n iteration++\n tessellating = false\n\n positions = positions2\n positions2 = []\n\n if (hasNormals) {\n normals = normals2\n normals2 = []\n }\n\n if (hasColors) {\n colors = colors2\n colors2 = []\n }\n\n if (hasUVs) {\n uvs = uvs2\n uvs2 = []\n }\n\n if (hasUV2s) {\n uv2s = uv2s2\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 number[], 3))\n }\n\n if (hasColors) {\n geometry2.setAttribute('color', new Float32BufferAttribute(colors2 as number[], 3))\n }\n\n if (hasUVs) {\n geometry2.setAttribute('uv', new Float32BufferAttribute(uvs2 as number[], 2))\n }\n\n if (hasUV2s) {\n geometry2.setAttribute('uv2', new Float32BufferAttribute(uv2s2 as number[], 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'\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 +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 number[]\n let normals2 = normals\n let colors2 = colors\n let uvs2 = uvs\n let uv2s2 = uv2s\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 as number[]).push(n1.x, n1.y, n1.z)\n ;(normals2 as number[]).push(n2.x, n2.y, n2.z)\n ;(normals2 as number[]).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 as number[]).push(c1.r, c1.g, c1.b)\n ;(colors2 as number[]).push(c2.r, c2.g, c2.b)\n ;(colors2 as number[]).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 as number[]).push(u1.x, u1.y)\n ;(uvs2 as number[]).push(u2.x, u2.y)\n ;(uvs2 as number[]).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 as number[]).push(u21.x, u21.y)\n ;(uv2s2 as number[]).push(u22.x, u22.y)\n ;(uv2s2 as number[]).push(u23.x, u23.y)\n }\n }\n\n while (tessellating && iteration < maxIterations) {\n iteration++\n tessellating = false\n\n positions = positions2\n positions2 = []\n\n if (hasNormals) {\n normals = normals2\n normals2 = []\n }\n\n if (hasColors) {\n colors = colors2\n colors2 = []\n }\n\n if (hasUVs) {\n uvs = uvs2\n uvs2 = []\n }\n\n if (hasUV2s) {\n uv2s = uv2s2\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 number[], 3))\n }\n\n if (hasColors) {\n geometry2.setAttribute('color', new Float32BufferAttribute(colors2 as number[], 3))\n }\n\n if (hasUVs) {\n geometry2.setAttribute('uv', new Float32BufferAttribute(uvs2 as number[], 2))\n }\n\n if (hasUV2s) {\n geometry2.setAttribute('uv2', new Float32BufferAttribute(uv2s2 as number[], 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'\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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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"BloomPass.cjs","sources":["../../src/postprocessing/BloomPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {
|
1
|
+
{"version":3,"file":"BloomPass.cjs","sources":["../../src/postprocessing/BloomPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n AdditiveBlending,\n IUniform,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n WebGLRenderer,\n WebGLRenderTarget,\n} from 'three'\nimport { ConvolutionShader } from '../shaders/ConvolutionShader'\n\nclass BloomPass extends Pass {\n public renderTargetX: WebGLRenderTarget\n public renderTargetY: WebGLRenderTarget\n public materialCombine: ShaderMaterial\n public materialConvolution: ShaderMaterial\n public fsQuad: FullScreenQuad\n public combineUniforms: Record<keyof typeof CombineShader['uniforms'], IUniform<any>>\n public convolutionUniforms: Record<keyof typeof ConvolutionShader['uniforms'], IUniform<any>>\n\n public blurX = new Vector2(0.001953125, 0.0)\n public blurY = new Vector2(0.0, 0.001953125)\n\n constructor(strength = 1, kernelSize = 25, sigma = 4, resolution = 256) {\n super() // render targets\n\n this.renderTargetX = new WebGLRenderTarget(resolution, resolution)\n this.renderTargetX.texture.name = 'BloomPass.x'\n this.renderTargetY = new WebGLRenderTarget(resolution, resolution)\n this.renderTargetY.texture.name = 'BloomPass.y' // combine material\n\n this.combineUniforms = UniformsUtils.clone(CombineShader.uniforms)\n this.combineUniforms['strength'].value = strength\n this.materialCombine = new ShaderMaterial({\n uniforms: this.combineUniforms,\n vertexShader: CombineShader.vertexShader,\n fragmentShader: CombineShader.fragmentShader,\n blending: AdditiveBlending,\n transparent: true,\n }) // convolution material\n\n if (ConvolutionShader === undefined) console.error('BloomPass relies on ConvolutionShader')\n const convolutionShader = ConvolutionShader\n this.convolutionUniforms = UniformsUtils.clone(convolutionShader.uniforms)\n this.convolutionUniforms['uImageIncrement'].value = this.blurX\n this.convolutionUniforms['cKernel'].value = ConvolutionShader.buildKernel(sigma)\n this.materialConvolution = new ShaderMaterial({\n uniforms: this.convolutionUniforms,\n vertexShader: convolutionShader.vertexShader,\n fragmentShader: convolutionShader.fragmentShader,\n defines: {\n KERNEL_SIZE_FLOAT: kernelSize.toFixed(1),\n KERNEL_SIZE_INT: kernelSize.toFixed(0),\n },\n })\n this.needsSwap = false\n this.fsQuad = new FullScreenQuad(this.materialConvolution)\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n deltaTime: number,\n maskActive: boolean,\n ): void {\n if (maskActive) renderer.state.buffers.stencil.setTest(false) // Render quad with blured scene into texture (convolution pass 1)\n\n this.fsQuad.material = this.materialConvolution\n this.convolutionUniforms['tDiffuse'].value = readBuffer.texture\n this.convolutionUniforms['uImageIncrement'].value = this.blurX\n renderer.setRenderTarget(this.renderTargetX)\n renderer.clear()\n this.fsQuad.render(renderer) // Render quad with blured scene into texture (convolution pass 2)\n\n this.convolutionUniforms['tDiffuse'].value = this.renderTargetX.texture\n this.convolutionUniforms['uImageIncrement'].value = this.blurY\n renderer.setRenderTarget(this.renderTargetY)\n renderer.clear()\n this.fsQuad.render(renderer) // Render original scene with superimposed blur to texture\n\n this.fsQuad.material = this.materialCombine\n this.combineUniforms['tDiffuse'].value = this.renderTargetY.texture\n if (maskActive) renderer.state.buffers.stencil.setTest(true)\n renderer.setRenderTarget(readBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n}\n\nconst CombineShader = {\n uniforms: {\n tDiffuse: {\n value: null,\n },\n strength: {\n value: 1.0,\n },\n },\n vertexShader:\n /* glsl */\n `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }`,\n fragmentShader:\n /* glsl */\n `\n uniform float strength;\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() {\n vec4 texel = texture2D( tDiffuse, vUv );\n gl_FragColor = strength * texel;\n }`,\n}\n\nexport { BloomPass }\n"],"names":["Pass","Vector2","WebGLRenderTarget","UniformsUtils","ShaderMaterial","AdditiveBlending","ConvolutionShader","FullScreenQuad"],"mappings":";;;;;;;;;;;AAYA,MAAM,kBAAkBA,KAAAA,KAAK;AAAA,EAY3B,YAAY,WAAW,GAAG,aAAa,IAAI,QAAQ,GAAG,aAAa,KAAK;AAChE;AAZD;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,iCAAQ,IAAIC,MAAAA,QAAQ,YAAa,CAAG;AACpC,iCAAQ,IAAIA,MAAAA,QAAQ,GAAK,UAAW;AAKzC,SAAK,gBAAgB,IAAIC,MAAkB,kBAAA,YAAY,UAAU;AAC5D,SAAA,cAAc,QAAQ,OAAO;AAClC,SAAK,gBAAgB,IAAIA,MAAkB,kBAAA,YAAY,UAAU;AAC5D,SAAA,cAAc,QAAQ,OAAO;AAElC,SAAK,kBAAkBC,MAAA,cAAc,MAAM,cAAc,QAAQ;AAC5D,SAAA,gBAAgB,UAAU,EAAE,QAAQ;AACpC,SAAA,kBAAkB,IAAIC,qBAAe;AAAA,MACxC,UAAU,KAAK;AAAA,MACf,cAAc,cAAc;AAAA,MAC5B,gBAAgB,cAAc;AAAA,MAC9B,UAAUC,MAAA;AAAA,MACV,aAAa;AAAA,IAAA,CACd;AAED,QAAIC,kBAAAA,sBAAsB;AAAW,cAAQ,MAAM,uCAAuC;AAC1F,UAAM,oBAAoBA,kBAAAA;AAC1B,SAAK,sBAAsBH,MAAA,cAAc,MAAM,kBAAkB,QAAQ;AACzE,SAAK,oBAAoB,iBAAiB,EAAE,QAAQ,KAAK;AACzD,SAAK,oBAAoB,SAAS,EAAE,QAAQG,oCAAkB,YAAY,KAAK;AAC1E,SAAA,sBAAsB,IAAIF,qBAAe;AAAA,MAC5C,UAAU,KAAK;AAAA,MACf,cAAc,kBAAkB;AAAA,MAChC,gBAAgB,kBAAkB;AAAA,MAClC,SAAS;AAAA,QACP,mBAAmB,WAAW,QAAQ,CAAC;AAAA,QACvC,iBAAiB,WAAW,QAAQ,CAAC;AAAA,MACvC;AAAA,IAAA,CACD;AACD,SAAK,YAAY;AACjB,SAAK,SAAS,IAAIG,KAAe,eAAA,KAAK,mBAAmB;AAAA,EAC3D;AAAA,EAEO,OACL,UACA,aACA,YACA,WACA,YACM;AACF,QAAA;AAAY,eAAS,MAAM,QAAQ,QAAQ,QAAQ,KAAK;AAEvD,SAAA,OAAO,WAAW,KAAK;AAC5B,SAAK,oBAAoB,UAAU,EAAE,QAAQ,WAAW;AACxD,SAAK,oBAAoB,iBAAiB,EAAE,QAAQ,KAAK;AAChD,aAAA,gBAAgB,KAAK,aAAa;AAC3C,aAAS,MAAM;AACV,SAAA,OAAO,OAAO,QAAQ;AAE3B,SAAK,oBAAoB,UAAU,EAAE,QAAQ,KAAK,cAAc;AAChE,SAAK,oBAAoB,iBAAiB,EAAE,QAAQ,KAAK;AAChD,aAAA,gBAAgB,KAAK,aAAa;AAC3C,aAAS,MAAM;AACV,SAAA,OAAO,OAAO,QAAQ;AAEtB,SAAA,OAAO,WAAW,KAAK;AAC5B,SAAK,gBAAgB,UAAU,EAAE,QAAQ,KAAK,cAAc;AACxD,QAAA;AAAY,eAAS,MAAM,QAAQ,QAAQ,QAAQ,IAAI;AAC3D,aAAS,gBAAgB,UAAU;AACnC,QAAI,KAAK;AAAO,eAAS,MAAM;AAC1B,SAAA,OAAO,OAAO,QAAQ;AAAA,EAC7B;AACF;AAEA,MAAM,gBAAgB;AAAA,EACpB,UAAU;AAAA,IACR,UAAU;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA;AAAA,IAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AAAA;AAAA,IAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQJ;;"}
|
@@ -1,16 +1,29 @@
|
|
1
1
|
import { Pass, FullScreenQuad } from './Pass';
|
2
|
-
import { ShaderMaterial, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three';
|
2
|
+
import { IUniform, ShaderMaterial, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three';
|
3
|
+
import { ConvolutionShader } from '../shaders/ConvolutionShader';
|
3
4
|
declare class BloomPass extends Pass {
|
4
5
|
renderTargetX: WebGLRenderTarget;
|
5
6
|
renderTargetY: WebGLRenderTarget;
|
6
7
|
materialCombine: ShaderMaterial;
|
7
8
|
materialConvolution: ShaderMaterial;
|
8
9
|
fsQuad: FullScreenQuad;
|
9
|
-
combineUniforms: any
|
10
|
-
convolutionUniforms: any
|
10
|
+
combineUniforms: Record<keyof typeof CombineShader['uniforms'], IUniform<any>>;
|
11
|
+
convolutionUniforms: Record<keyof typeof ConvolutionShader['uniforms'], IUniform<any>>;
|
11
12
|
blurX: Vector2;
|
12
13
|
blurY: Vector2;
|
13
14
|
constructor(strength?: number, kernelSize?: number, sigma?: number, resolution?: number);
|
14
15
|
render(renderer: WebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, deltaTime: number, maskActive: boolean): void;
|
15
16
|
}
|
17
|
+
declare const CombineShader: {
|
18
|
+
uniforms: {
|
19
|
+
tDiffuse: {
|
20
|
+
value: null;
|
21
|
+
};
|
22
|
+
strength: {
|
23
|
+
value: number;
|
24
|
+
};
|
25
|
+
};
|
26
|
+
vertexShader: string;
|
27
|
+
fragmentShader: string;
|
28
|
+
};
|
16
29
|
export { BloomPass };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"BloomPass.js","sources":["../../src/postprocessing/BloomPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {
|
1
|
+
{"version":3,"file":"BloomPass.js","sources":["../../src/postprocessing/BloomPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n AdditiveBlending,\n IUniform,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n WebGLRenderer,\n WebGLRenderTarget,\n} from 'three'\nimport { ConvolutionShader } from '../shaders/ConvolutionShader'\n\nclass BloomPass extends Pass {\n public renderTargetX: WebGLRenderTarget\n public renderTargetY: WebGLRenderTarget\n public materialCombine: ShaderMaterial\n public materialConvolution: ShaderMaterial\n public fsQuad: FullScreenQuad\n public combineUniforms: Record<keyof typeof CombineShader['uniforms'], IUniform<any>>\n public convolutionUniforms: Record<keyof typeof ConvolutionShader['uniforms'], IUniform<any>>\n\n public blurX = new Vector2(0.001953125, 0.0)\n public blurY = new Vector2(0.0, 0.001953125)\n\n constructor(strength = 1, kernelSize = 25, sigma = 4, resolution = 256) {\n super() // render targets\n\n this.renderTargetX = new WebGLRenderTarget(resolution, resolution)\n this.renderTargetX.texture.name = 'BloomPass.x'\n this.renderTargetY = new WebGLRenderTarget(resolution, resolution)\n this.renderTargetY.texture.name = 'BloomPass.y' // combine material\n\n this.combineUniforms = UniformsUtils.clone(CombineShader.uniforms)\n this.combineUniforms['strength'].value = strength\n this.materialCombine = new ShaderMaterial({\n uniforms: this.combineUniforms,\n vertexShader: CombineShader.vertexShader,\n fragmentShader: CombineShader.fragmentShader,\n blending: AdditiveBlending,\n transparent: true,\n }) // convolution material\n\n if (ConvolutionShader === undefined) console.error('BloomPass relies on ConvolutionShader')\n const convolutionShader = ConvolutionShader\n this.convolutionUniforms = UniformsUtils.clone(convolutionShader.uniforms)\n this.convolutionUniforms['uImageIncrement'].value = this.blurX\n this.convolutionUniforms['cKernel'].value = ConvolutionShader.buildKernel(sigma)\n this.materialConvolution = new ShaderMaterial({\n uniforms: this.convolutionUniforms,\n vertexShader: convolutionShader.vertexShader,\n fragmentShader: convolutionShader.fragmentShader,\n defines: {\n KERNEL_SIZE_FLOAT: kernelSize.toFixed(1),\n KERNEL_SIZE_INT: kernelSize.toFixed(0),\n },\n })\n this.needsSwap = false\n this.fsQuad = new FullScreenQuad(this.materialConvolution)\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n deltaTime: number,\n maskActive: boolean,\n ): void {\n if (maskActive) renderer.state.buffers.stencil.setTest(false) // Render quad with blured scene into texture (convolution pass 1)\n\n this.fsQuad.material = this.materialConvolution\n this.convolutionUniforms['tDiffuse'].value = readBuffer.texture\n this.convolutionUniforms['uImageIncrement'].value = this.blurX\n renderer.setRenderTarget(this.renderTargetX)\n renderer.clear()\n this.fsQuad.render(renderer) // Render quad with blured scene into texture (convolution pass 2)\n\n this.convolutionUniforms['tDiffuse'].value = this.renderTargetX.texture\n this.convolutionUniforms['uImageIncrement'].value = this.blurY\n renderer.setRenderTarget(this.renderTargetY)\n renderer.clear()\n this.fsQuad.render(renderer) // Render original scene with superimposed blur to texture\n\n this.fsQuad.material = this.materialCombine\n this.combineUniforms['tDiffuse'].value = this.renderTargetY.texture\n if (maskActive) renderer.state.buffers.stencil.setTest(true)\n renderer.setRenderTarget(readBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n}\n\nconst CombineShader = {\n uniforms: {\n tDiffuse: {\n value: null,\n },\n strength: {\n value: 1.0,\n },\n },\n vertexShader:\n /* glsl */\n `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }`,\n fragmentShader:\n /* glsl */\n `\n uniform float strength;\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() {\n vec4 texel = texture2D( tDiffuse, vUv );\n gl_FragColor = strength * texel;\n }`,\n}\n\nexport { BloomPass }\n"],"names":[],"mappings":";;;;;;;;;AAYA,MAAM,kBAAkB,KAAK;AAAA,EAY3B,YAAY,WAAW,GAAG,aAAa,IAAI,QAAQ,GAAG,aAAa,KAAK;AAChE;AAZD;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,iCAAQ,IAAI,QAAQ,YAAa,CAAG;AACpC,iCAAQ,IAAI,QAAQ,GAAK,UAAW;AAKzC,SAAK,gBAAgB,IAAI,kBAAkB,YAAY,UAAU;AAC5D,SAAA,cAAc,QAAQ,OAAO;AAClC,SAAK,gBAAgB,IAAI,kBAAkB,YAAY,UAAU;AAC5D,SAAA,cAAc,QAAQ,OAAO;AAElC,SAAK,kBAAkB,cAAc,MAAM,cAAc,QAAQ;AAC5D,SAAA,gBAAgB,UAAU,EAAE,QAAQ;AACpC,SAAA,kBAAkB,IAAI,eAAe;AAAA,MACxC,UAAU,KAAK;AAAA,MACf,cAAc,cAAc;AAAA,MAC5B,gBAAgB,cAAc;AAAA,MAC9B,UAAU;AAAA,MACV,aAAa;AAAA,IAAA,CACd;AAED,QAAI,sBAAsB;AAAW,cAAQ,MAAM,uCAAuC;AAC1F,UAAM,oBAAoB;AAC1B,SAAK,sBAAsB,cAAc,MAAM,kBAAkB,QAAQ;AACzE,SAAK,oBAAoB,iBAAiB,EAAE,QAAQ,KAAK;AACzD,SAAK,oBAAoB,SAAS,EAAE,QAAQ,kBAAkB,YAAY,KAAK;AAC1E,SAAA,sBAAsB,IAAI,eAAe;AAAA,MAC5C,UAAU,KAAK;AAAA,MACf,cAAc,kBAAkB;AAAA,MAChC,gBAAgB,kBAAkB;AAAA,MAClC,SAAS;AAAA,QACP,mBAAmB,WAAW,QAAQ,CAAC;AAAA,QACvC,iBAAiB,WAAW,QAAQ,CAAC;AAAA,MACvC;AAAA,IAAA,CACD;AACD,SAAK,YAAY;AACjB,SAAK,SAAS,IAAI,eAAe,KAAK,mBAAmB;AAAA,EAC3D;AAAA,EAEO,OACL,UACA,aACA,YACA,WACA,YACM;AACF,QAAA;AAAY,eAAS,MAAM,QAAQ,QAAQ,QAAQ,KAAK;AAEvD,SAAA,OAAO,WAAW,KAAK;AAC5B,SAAK,oBAAoB,UAAU,EAAE,QAAQ,WAAW;AACxD,SAAK,oBAAoB,iBAAiB,EAAE,QAAQ,KAAK;AAChD,aAAA,gBAAgB,KAAK,aAAa;AAC3C,aAAS,MAAM;AACV,SAAA,OAAO,OAAO,QAAQ;AAE3B,SAAK,oBAAoB,UAAU,EAAE,QAAQ,KAAK,cAAc;AAChE,SAAK,oBAAoB,iBAAiB,EAAE,QAAQ,KAAK;AAChD,aAAA,gBAAgB,KAAK,aAAa;AAC3C,aAAS,MAAM;AACV,SAAA,OAAO,OAAO,QAAQ;AAEtB,SAAA,OAAO,WAAW,KAAK;AAC5B,SAAK,gBAAgB,UAAU,EAAE,QAAQ,KAAK,cAAc;AACxD,QAAA;AAAY,eAAS,MAAM,QAAQ,QAAQ,QAAQ,IAAI;AAC3D,aAAS,gBAAgB,UAAU;AACnC,QAAI,KAAK;AAAO,eAAS,MAAM;AAC1B,SAAA,OAAO,OAAO,QAAQ;AAAA,EAC7B;AACF;AAEA,MAAM,gBAAgB;AAAA,EACpB,UAAU;AAAA,IACR,UAAU;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA;AAAA,IAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AAAA;AAAA,IAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQJ;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DotScreenPass.cjs","sources":["../../src/postprocessing/DotScreenPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { ShaderMaterial, UniformsUtils, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { DotScreenShader } from '../shaders/DotScreenShader'\n\nclass DotScreenPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms
|
1
|
+
{"version":3,"file":"DotScreenPass.cjs","sources":["../../src/postprocessing/DotScreenPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { IUniform, ShaderMaterial, UniformsUtils, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { DotScreenShader } from '../shaders/DotScreenShader'\n\nclass DotScreenPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms: Record<keyof typeof DotScreenShader['uniforms'], IUniform<any>>\n\n constructor(center?: Vector2, angle?: number, scale?: number) {\n super()\n if (DotScreenShader === undefined) console.error('THREE.DotScreenPass relies on THREE.DotScreenShader')\n const shader = DotScreenShader\n this.uniforms = UniformsUtils.clone(shader.uniforms)\n if (center !== undefined) this.uniforms['center'].value.copy(center)\n if (angle !== undefined) this.uniforms['angle'].value = angle\n if (scale !== undefined) this.uniforms['scale'].value = scale\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n })\n this.fsQuad = new FullScreenQuad(this.material)\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n /*, deltaTime, maskActive */\n ): void {\n this.uniforms['tDiffuse'].value = readBuffer.texture\n this.uniforms['tSize'].value.set(readBuffer.width, readBuffer.height)\n\n if (this.renderToScreen) {\n renderer.setRenderTarget(null)\n this.fsQuad.render(renderer)\n } else {\n renderer.setRenderTarget(writeBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n }\n}\n\nexport { DotScreenPass }\n"],"names":["Pass","DotScreenShader","UniformsUtils","ShaderMaterial","FullScreenQuad"],"mappings":";;;;;;;;;;;AAIA,MAAM,sBAAsBA,KAAAA,KAAK;AAAA,EAM/B,YAAY,QAAkB,OAAgB,OAAgB;AACtD;AAND;AACA;AAEA;AAIL,QAAIC,gBAAAA,oBAAoB;AAAW,cAAQ,MAAM,qDAAqD;AACtG,UAAM,SAASA,gBAAAA;AACf,SAAK,WAAWC,MAAA,cAAc,MAAM,OAAO,QAAQ;AACnD,QAAI,WAAW;AAAW,WAAK,SAAS,QAAQ,EAAE,MAAM,KAAK,MAAM;AACnE,QAAI,UAAU;AAAgB,WAAA,SAAS,OAAO,EAAE,QAAQ;AACxD,QAAI,UAAU;AAAgB,WAAA,SAAS,OAAO,EAAE,QAAQ;AACnD,SAAA,WAAW,IAAIC,qBAAe;AAAA,MACjC,UAAU,KAAK;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,IAAA,CACxB;AACD,SAAK,SAAS,IAAIC,KAAe,eAAA,KAAK,QAAQ;AAAA,EAChD;AAAA,EAEO,OACL,UACA,aACA,YAEM;AACN,SAAK,SAAS,UAAU,EAAE,QAAQ,WAAW;AACxC,SAAA,SAAS,OAAO,EAAE,MAAM,IAAI,WAAW,OAAO,WAAW,MAAM;AAEpE,QAAI,KAAK,gBAAgB;AACvB,eAAS,gBAAgB,IAAI;AACxB,WAAA,OAAO,OAAO,QAAQ;AAAA,IAAA,OACtB;AACL,eAAS,gBAAgB,WAAW;AACpC,UAAI,KAAK;AAAO,iBAAS,MAAM;AAC1B,WAAA,OAAO,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;;"}
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import { Pass, FullScreenQuad } from './Pass';
|
2
|
-
import { ShaderMaterial, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three';
|
2
|
+
import { IUniform, ShaderMaterial, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three';
|
3
|
+
import { DotScreenShader } from '../shaders/DotScreenShader';
|
3
4
|
declare class DotScreenPass extends Pass {
|
4
5
|
material: ShaderMaterial;
|
5
6
|
fsQuad: FullScreenQuad;
|
6
|
-
uniforms: any
|
7
|
+
uniforms: Record<keyof typeof DotScreenShader['uniforms'], IUniform<any>>;
|
7
8
|
constructor(center?: Vector2, angle?: number, scale?: number);
|
8
9
|
render(renderer: WebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget): void;
|
9
10
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DotScreenPass.js","sources":["../../src/postprocessing/DotScreenPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { ShaderMaterial, UniformsUtils, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { DotScreenShader } from '../shaders/DotScreenShader'\n\nclass DotScreenPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms
|
1
|
+
{"version":3,"file":"DotScreenPass.js","sources":["../../src/postprocessing/DotScreenPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { IUniform, ShaderMaterial, UniformsUtils, Vector2, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { DotScreenShader } from '../shaders/DotScreenShader'\n\nclass DotScreenPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms: Record<keyof typeof DotScreenShader['uniforms'], IUniform<any>>\n\n constructor(center?: Vector2, angle?: number, scale?: number) {\n super()\n if (DotScreenShader === undefined) console.error('THREE.DotScreenPass relies on THREE.DotScreenShader')\n const shader = DotScreenShader\n this.uniforms = UniformsUtils.clone(shader.uniforms)\n if (center !== undefined) this.uniforms['center'].value.copy(center)\n if (angle !== undefined) this.uniforms['angle'].value = angle\n if (scale !== undefined) this.uniforms['scale'].value = scale\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n })\n this.fsQuad = new FullScreenQuad(this.material)\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n /*, deltaTime, maskActive */\n ): void {\n this.uniforms['tDiffuse'].value = readBuffer.texture\n this.uniforms['tSize'].value.set(readBuffer.width, readBuffer.height)\n\n if (this.renderToScreen) {\n renderer.setRenderTarget(null)\n this.fsQuad.render(renderer)\n } else {\n renderer.setRenderTarget(writeBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n }\n}\n\nexport { DotScreenPass }\n"],"names":[],"mappings":";;;;;;;;;AAIA,MAAM,sBAAsB,KAAK;AAAA,EAM/B,YAAY,QAAkB,OAAgB,OAAgB;AACtD;AAND;AACA;AAEA;AAIL,QAAI,oBAAoB;AAAW,cAAQ,MAAM,qDAAqD;AACtG,UAAM,SAAS;AACf,SAAK,WAAW,cAAc,MAAM,OAAO,QAAQ;AACnD,QAAI,WAAW;AAAW,WAAK,SAAS,QAAQ,EAAE,MAAM,KAAK,MAAM;AACnE,QAAI,UAAU;AAAgB,WAAA,SAAS,OAAO,EAAE,QAAQ;AACxD,QAAI,UAAU;AAAgB,WAAA,SAAS,OAAO,EAAE,QAAQ;AACnD,SAAA,WAAW,IAAI,eAAe;AAAA,MACjC,UAAU,KAAK;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,IAAA,CACxB;AACD,SAAK,SAAS,IAAI,eAAe,KAAK,QAAQ;AAAA,EAChD;AAAA,EAEO,OACL,UACA,aACA,YAEM;AACN,SAAK,SAAS,UAAU,EAAE,QAAQ,WAAW;AACxC,SAAA,SAAS,OAAO,EAAE,MAAM,IAAI,WAAW,OAAO,WAAW,MAAM;AAEpE,QAAI,KAAK,gBAAgB;AACvB,eAAS,gBAAgB,IAAI;AACxB,WAAA,OAAO,OAAO,QAAQ;AAAA,IAAA,OACtB;AACL,eAAS,gBAAgB,WAAW;AACpC,UAAI,KAAK;AAAO,iBAAS,MAAM;AAC1B,WAAA,OAAO,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FilmPass.cjs","sources":["../../src/postprocessing/FilmPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { ShaderMaterial, UniformsUtils, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { FilmShader } from '../shaders/FilmShader'\n\nclass FilmPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms
|
1
|
+
{"version":3,"file":"FilmPass.cjs","sources":["../../src/postprocessing/FilmPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { IUniform, ShaderMaterial, UniformsUtils, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { FilmShader } from '../shaders/FilmShader'\n\nclass FilmPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms: Record<keyof typeof FilmShader['uniforms'], IUniform<any>>\n\n constructor(noiseIntensity?: number, scanlinesIntensity?: number, scanlinesCount?: number, grayscale?: boolean) {\n super()\n\n if (FilmShader === undefined) console.error('THREE.FilmPass relies on FilmShader')\n\n const shader = FilmShader\n\n this.uniforms = UniformsUtils.clone(shader.uniforms)\n\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n })\n\n if (grayscale !== undefined) this.uniforms.grayscale.value = grayscale\n if (noiseIntensity !== undefined) this.uniforms.nIntensity.value = noiseIntensity\n if (scanlinesIntensity !== undefined) this.uniforms.sIntensity.value = scanlinesIntensity\n if (scanlinesCount !== undefined) this.uniforms.sCount.value = scanlinesCount\n\n this.fsQuad = new FullScreenQuad(this.material)\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n deltaTime: number,\n ): void {\n this.uniforms['tDiffuse'].value = readBuffer.texture\n this.uniforms['time'].value += deltaTime\n\n if (this.renderToScreen) {\n renderer.setRenderTarget(null)\n this.fsQuad.render(renderer)\n } else {\n renderer.setRenderTarget(writeBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n }\n}\n\nexport { FilmPass }\n"],"names":["Pass","FilmShader","UniformsUtils","ShaderMaterial","FullScreenQuad"],"mappings":";;;;;;;;;;;AAIA,MAAM,iBAAiBA,KAAAA,KAAK;AAAA,EAM1B,YAAY,gBAAyB,oBAA6B,gBAAyB,WAAqB;AACxG;AAND;AACA;AAEA;AAKL,QAAIC,WAAAA,eAAe;AAAW,cAAQ,MAAM,qCAAqC;AAEjF,UAAM,SAASA,WAAAA;AAEf,SAAK,WAAWC,MAAA,cAAc,MAAM,OAAO,QAAQ;AAE9C,SAAA,WAAW,IAAIC,qBAAe;AAAA,MACjC,UAAU,KAAK;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,IAAA,CACxB;AAED,QAAI,cAAc;AAAgB,WAAA,SAAS,UAAU,QAAQ;AAC7D,QAAI,mBAAmB;AAAgB,WAAA,SAAS,WAAW,QAAQ;AACnE,QAAI,uBAAuB;AAAgB,WAAA,SAAS,WAAW,QAAQ;AACvE,QAAI,mBAAmB;AAAgB,WAAA,SAAS,OAAO,QAAQ;AAE/D,SAAK,SAAS,IAAIC,KAAe,eAAA,KAAK,QAAQ;AAAA,EAChD;AAAA,EAEO,OACL,UACA,aACA,YACA,WACM;AACN,SAAK,SAAS,UAAU,EAAE,QAAQ,WAAW;AACxC,SAAA,SAAS,MAAM,EAAE,SAAS;AAE/B,QAAI,KAAK,gBAAgB;AACvB,eAAS,gBAAgB,IAAI;AACxB,WAAA,OAAO,OAAO,QAAQ;AAAA,IAAA,OACtB;AACL,eAAS,gBAAgB,WAAW;AACpC,UAAI,KAAK;AAAO,iBAAS,MAAM;AAC1B,WAAA,OAAO,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;;"}
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import { Pass, FullScreenQuad } from './Pass';
|
2
|
-
import { ShaderMaterial, WebGLRenderer, WebGLRenderTarget } from 'three';
|
2
|
+
import { IUniform, ShaderMaterial, WebGLRenderer, WebGLRenderTarget } from 'three';
|
3
|
+
import { FilmShader } from '../shaders/FilmShader';
|
3
4
|
declare class FilmPass extends Pass {
|
4
5
|
material: ShaderMaterial;
|
5
6
|
fsQuad: FullScreenQuad;
|
6
|
-
uniforms: any
|
7
|
+
uniforms: Record<keyof typeof FilmShader['uniforms'], IUniform<any>>;
|
7
8
|
constructor(noiseIntensity?: number, scanlinesIntensity?: number, scanlinesCount?: number, grayscale?: boolean);
|
8
9
|
render(renderer: WebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, deltaTime: number): void;
|
9
10
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FilmPass.js","sources":["../../src/postprocessing/FilmPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { ShaderMaterial, UniformsUtils, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { FilmShader } from '../shaders/FilmShader'\n\nclass FilmPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms
|
1
|
+
{"version":3,"file":"FilmPass.js","sources":["../../src/postprocessing/FilmPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport { IUniform, ShaderMaterial, UniformsUtils, WebGLRenderer, WebGLRenderTarget } from 'three'\nimport { FilmShader } from '../shaders/FilmShader'\n\nclass FilmPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n\n public uniforms: Record<keyof typeof FilmShader['uniforms'], IUniform<any>>\n\n constructor(noiseIntensity?: number, scanlinesIntensity?: number, scanlinesCount?: number, grayscale?: boolean) {\n super()\n\n if (FilmShader === undefined) console.error('THREE.FilmPass relies on FilmShader')\n\n const shader = FilmShader\n\n this.uniforms = UniformsUtils.clone(shader.uniforms)\n\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n })\n\n if (grayscale !== undefined) this.uniforms.grayscale.value = grayscale\n if (noiseIntensity !== undefined) this.uniforms.nIntensity.value = noiseIntensity\n if (scanlinesIntensity !== undefined) this.uniforms.sIntensity.value = scanlinesIntensity\n if (scanlinesCount !== undefined) this.uniforms.sCount.value = scanlinesCount\n\n this.fsQuad = new FullScreenQuad(this.material)\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n deltaTime: number,\n ): void {\n this.uniforms['tDiffuse'].value = readBuffer.texture\n this.uniforms['time'].value += deltaTime\n\n if (this.renderToScreen) {\n renderer.setRenderTarget(null)\n this.fsQuad.render(renderer)\n } else {\n renderer.setRenderTarget(writeBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n }\n}\n\nexport { FilmPass }\n"],"names":[],"mappings":";;;;;;;;;AAIA,MAAM,iBAAiB,KAAK;AAAA,EAM1B,YAAY,gBAAyB,oBAA6B,gBAAyB,WAAqB;AACxG;AAND;AACA;AAEA;AAKL,QAAI,eAAe;AAAW,cAAQ,MAAM,qCAAqC;AAEjF,UAAM,SAAS;AAEf,SAAK,WAAW,cAAc,MAAM,OAAO,QAAQ;AAE9C,SAAA,WAAW,IAAI,eAAe;AAAA,MACjC,UAAU,KAAK;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,IAAA,CACxB;AAED,QAAI,cAAc;AAAgB,WAAA,SAAS,UAAU,QAAQ;AAC7D,QAAI,mBAAmB;AAAgB,WAAA,SAAS,WAAW,QAAQ;AACnE,QAAI,uBAAuB;AAAgB,WAAA,SAAS,WAAW,QAAQ;AACvE,QAAI,mBAAmB;AAAgB,WAAA,SAAS,OAAO,QAAQ;AAE/D,SAAK,SAAS,IAAI,eAAe,KAAK,QAAQ;AAAA,EAChD;AAAA,EAEO,OACL,UACA,aACA,YACA,WACM;AACN,SAAK,SAAS,UAAU,EAAE,QAAQ,WAAW;AACxC,SAAA,SAAS,MAAM,EAAE,SAAS;AAE/B,QAAI,KAAK,gBAAgB;AACvB,eAAS,gBAAgB,IAAI;AACxB,WAAA,OAAO,OAAO,QAAQ;AAAA,IAAA,OACtB;AACL,eAAS,gBAAgB,WAAW;AACpC,UAAI,KAAK;AAAO,iBAAS,MAAM;AAC1B,WAAA,OAAO,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"GlitchPass.cjs","sources":["../../src/postprocessing/GlitchPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n DataTexture,\n FloatType,\n MathUtils,\n RedFormat,\n LuminanceFormat,\n ShaderMaterial,\n UniformsUtils,\n WebGLRenderTarget,\n WebGLRenderer,\n} from 'three'\nimport { DigitalGlitch } from '../shaders/DigitalGlitch'\n\nclass GlitchPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n public goWild: boolean\n public curF: number\n public randX!: number\n\n public uniforms
|
1
|
+
{"version":3,"file":"GlitchPass.cjs","sources":["../../src/postprocessing/GlitchPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n DataTexture,\n FloatType,\n MathUtils,\n RedFormat,\n LuminanceFormat,\n ShaderMaterial,\n UniformsUtils,\n WebGLRenderTarget,\n WebGLRenderer,\n IUniform,\n} from 'three'\nimport { DigitalGlitch } from '../shaders/DigitalGlitch'\n\nclass GlitchPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n public goWild: boolean\n public curF: number\n public randX!: number\n\n public uniforms: Record<keyof typeof DigitalGlitch['uniforms'], IUniform<any>>\n\n constructor(dt_size = 64) {\n super()\n this.uniforms = UniformsUtils.clone(DigitalGlitch.uniforms)\n this.uniforms['tDisp'].value = this.generateHeightmap(dt_size)\n\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: DigitalGlitch.vertexShader,\n fragmentShader: DigitalGlitch.fragmentShader,\n })\n\n this.fsQuad = new FullScreenQuad(this.material)\n this.goWild = false\n this.curF = 0\n this.generateTrigger()\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n /*, deltaTime, maskActive */\n ): void {\n if (renderer.capabilities.isWebGL2 === false) this.uniforms['tDisp'].value.format = LuminanceFormat\n\n this.uniforms['tDiffuse'].value = readBuffer.texture\n this.uniforms['seed'].value = Math.random() //default seeding\n this.uniforms['byp'].value = 0\n\n if (this.curF % this.randX == 0 || this.goWild == true) {\n this.uniforms['amount'].value = Math.random() / 30\n this.uniforms['angle'].value = MathUtils.randFloat(-Math.PI, Math.PI)\n this.uniforms['seed_x'].value = MathUtils.randFloat(-1, 1)\n this.uniforms['seed_y'].value = MathUtils.randFloat(-1, 1)\n this.uniforms['distortion_x'].value = MathUtils.randFloat(0, 1)\n this.uniforms['distortion_y'].value = MathUtils.randFloat(0, 1)\n this.curF = 0\n this.generateTrigger()\n } else if (this.curF % this.randX < this.randX / 5) {\n this.uniforms['amount'].value = Math.random() / 90\n this.uniforms['angle'].value = MathUtils.randFloat(-Math.PI, Math.PI)\n this.uniforms['distortion_x'].value = MathUtils.randFloat(0, 1)\n this.uniforms['distortion_y'].value = MathUtils.randFloat(0, 1)\n this.uniforms['seed_x'].value = MathUtils.randFloat(-0.3, 0.3)\n this.uniforms['seed_y'].value = MathUtils.randFloat(-0.3, 0.3)\n } else if (this.goWild == false) {\n this.uniforms['byp'].value = 1\n }\n\n this.curF++\n\n if (this.renderToScreen) {\n renderer.setRenderTarget(null)\n this.fsQuad.render(renderer)\n } else {\n renderer.setRenderTarget(writeBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n }\n\n generateTrigger(): void {\n this.randX = MathUtils.randInt(120, 240)\n }\n\n generateHeightmap(dt_size: number): DataTexture {\n const data_arr = new Float32Array(dt_size * dt_size)\n const length = dt_size * dt_size\n\n for (let i = 0; i < length; i++) {\n const val = MathUtils.randFloat(0, 1)\n data_arr[i] = val\n }\n\n const texture = new DataTexture(data_arr, dt_size, dt_size, RedFormat, FloatType)\n texture.needsUpdate = true\n return texture\n }\n}\n\nexport { GlitchPass }\n"],"names":["Pass","UniformsUtils","DigitalGlitch","ShaderMaterial","FullScreenQuad","LuminanceFormat","MathUtils","DataTexture","RedFormat","FloatType"],"mappings":"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"}
|
@@ -1,12 +1,13 @@
|
|
1
1
|
import { Pass, FullScreenQuad } from './Pass';
|
2
|
-
import { DataTexture, ShaderMaterial, WebGLRenderTarget, WebGLRenderer } from 'three';
|
2
|
+
import { DataTexture, ShaderMaterial, WebGLRenderTarget, WebGLRenderer, IUniform } from 'three';
|
3
|
+
import { DigitalGlitch } from '../shaders/DigitalGlitch';
|
3
4
|
declare class GlitchPass extends Pass {
|
4
5
|
material: ShaderMaterial;
|
5
6
|
fsQuad: FullScreenQuad;
|
6
7
|
goWild: boolean;
|
7
8
|
curF: number;
|
8
9
|
randX: number;
|
9
|
-
uniforms: any
|
10
|
+
uniforms: Record<keyof typeof DigitalGlitch['uniforms'], IUniform<any>>;
|
10
11
|
constructor(dt_size?: number);
|
11
12
|
render(renderer: WebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget): void;
|
12
13
|
generateTrigger(): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"GlitchPass.js","sources":["../../src/postprocessing/GlitchPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n DataTexture,\n FloatType,\n MathUtils,\n RedFormat,\n LuminanceFormat,\n ShaderMaterial,\n UniformsUtils,\n WebGLRenderTarget,\n WebGLRenderer,\n} from 'three'\nimport { DigitalGlitch } from '../shaders/DigitalGlitch'\n\nclass GlitchPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n public goWild: boolean\n public curF: number\n public randX!: number\n\n public uniforms
|
1
|
+
{"version":3,"file":"GlitchPass.js","sources":["../../src/postprocessing/GlitchPass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n DataTexture,\n FloatType,\n MathUtils,\n RedFormat,\n LuminanceFormat,\n ShaderMaterial,\n UniformsUtils,\n WebGLRenderTarget,\n WebGLRenderer,\n IUniform,\n} from 'three'\nimport { DigitalGlitch } from '../shaders/DigitalGlitch'\n\nclass GlitchPass extends Pass {\n public material: ShaderMaterial\n public fsQuad: FullScreenQuad\n public goWild: boolean\n public curF: number\n public randX!: number\n\n public uniforms: Record<keyof typeof DigitalGlitch['uniforms'], IUniform<any>>\n\n constructor(dt_size = 64) {\n super()\n this.uniforms = UniformsUtils.clone(DigitalGlitch.uniforms)\n this.uniforms['tDisp'].value = this.generateHeightmap(dt_size)\n\n this.material = new ShaderMaterial({\n uniforms: this.uniforms,\n vertexShader: DigitalGlitch.vertexShader,\n fragmentShader: DigitalGlitch.fragmentShader,\n })\n\n this.fsQuad = new FullScreenQuad(this.material)\n this.goWild = false\n this.curF = 0\n this.generateTrigger()\n }\n\n public render(\n renderer: WebGLRenderer,\n writeBuffer: WebGLRenderTarget,\n readBuffer: WebGLRenderTarget,\n /*, deltaTime, maskActive */\n ): void {\n if (renderer.capabilities.isWebGL2 === false) this.uniforms['tDisp'].value.format = LuminanceFormat\n\n this.uniforms['tDiffuse'].value = readBuffer.texture\n this.uniforms['seed'].value = Math.random() //default seeding\n this.uniforms['byp'].value = 0\n\n if (this.curF % this.randX == 0 || this.goWild == true) {\n this.uniforms['amount'].value = Math.random() / 30\n this.uniforms['angle'].value = MathUtils.randFloat(-Math.PI, Math.PI)\n this.uniforms['seed_x'].value = MathUtils.randFloat(-1, 1)\n this.uniforms['seed_y'].value = MathUtils.randFloat(-1, 1)\n this.uniforms['distortion_x'].value = MathUtils.randFloat(0, 1)\n this.uniforms['distortion_y'].value = MathUtils.randFloat(0, 1)\n this.curF = 0\n this.generateTrigger()\n } else if (this.curF % this.randX < this.randX / 5) {\n this.uniforms['amount'].value = Math.random() / 90\n this.uniforms['angle'].value = MathUtils.randFloat(-Math.PI, Math.PI)\n this.uniforms['distortion_x'].value = MathUtils.randFloat(0, 1)\n this.uniforms['distortion_y'].value = MathUtils.randFloat(0, 1)\n this.uniforms['seed_x'].value = MathUtils.randFloat(-0.3, 0.3)\n this.uniforms['seed_y'].value = MathUtils.randFloat(-0.3, 0.3)\n } else if (this.goWild == false) {\n this.uniforms['byp'].value = 1\n }\n\n this.curF++\n\n if (this.renderToScreen) {\n renderer.setRenderTarget(null)\n this.fsQuad.render(renderer)\n } else {\n renderer.setRenderTarget(writeBuffer)\n if (this.clear) renderer.clear()\n this.fsQuad.render(renderer)\n }\n }\n\n generateTrigger(): void {\n this.randX = MathUtils.randInt(120, 240)\n }\n\n generateHeightmap(dt_size: number): DataTexture {\n const data_arr = new Float32Array(dt_size * dt_size)\n const length = dt_size * dt_size\n\n for (let i = 0; i < length; i++) {\n const val = MathUtils.randFloat(0, 1)\n data_arr[i] = val\n }\n\n const texture = new DataTexture(data_arr, dt_size, dt_size, RedFormat, FloatType)\n texture.needsUpdate = true\n return texture\n }\n}\n\nexport { GlitchPass }\n"],"names":[],"mappings":";;;;;;;;;AAeA,MAAM,mBAAmB,KAAK;AAAA,EAS5B,YAAY,UAAU,IAAI;AAClB;AATD;AACA;AACA;AACA;AACA;AAEA;AAIL,SAAK,WAAW,cAAc,MAAM,cAAc,QAAQ;AAC1D,SAAK,SAAS,OAAO,EAAE,QAAQ,KAAK,kBAAkB,OAAO;AAExD,SAAA,WAAW,IAAI,eAAe;AAAA,MACjC,UAAU,KAAK;AAAA,MACf,cAAc,cAAc;AAAA,MAC5B,gBAAgB,cAAc;AAAA,IAAA,CAC/B;AAED,SAAK,SAAS,IAAI,eAAe,KAAK,QAAQ;AAC9C,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEO,OACL,UACA,aACA,YAEM;AACF,QAAA,SAAS,aAAa,aAAa;AAAO,WAAK,SAAS,OAAO,EAAE,MAAM,SAAS;AAEpF,SAAK,SAAS,UAAU,EAAE,QAAQ,WAAW;AAC7C,SAAK,SAAS,MAAM,EAAE,QAAQ,KAAK;AAC9B,SAAA,SAAS,KAAK,EAAE,QAAQ;AAE7B,QAAI,KAAK,OAAO,KAAK,SAAS,KAAK,KAAK,UAAU,MAAM;AACtD,WAAK,SAAS,QAAQ,EAAE,QAAQ,KAAK,OAAW,IAAA;AAC3C,WAAA,SAAS,OAAO,EAAE,QAAQ,UAAU,UAAU,CAAC,KAAK,IAAI,KAAK,EAAE;AACpE,WAAK,SAAS,QAAQ,EAAE,QAAQ,UAAU,UAAU,IAAI,CAAC;AACzD,WAAK,SAAS,QAAQ,EAAE,QAAQ,UAAU,UAAU,IAAI,CAAC;AACzD,WAAK,SAAS,cAAc,EAAE,QAAQ,UAAU,UAAU,GAAG,CAAC;AAC9D,WAAK,SAAS,cAAc,EAAE,QAAQ,UAAU,UAAU,GAAG,CAAC;AAC9D,WAAK,OAAO;AACZ,WAAK,gBAAgB;AAAA,IAAA,WACZ,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAClD,WAAK,SAAS,QAAQ,EAAE,QAAQ,KAAK,OAAW,IAAA;AAC3C,WAAA,SAAS,OAAO,EAAE,QAAQ,UAAU,UAAU,CAAC,KAAK,IAAI,KAAK,EAAE;AACpE,WAAK,SAAS,cAAc,EAAE,QAAQ,UAAU,UAAU,GAAG,CAAC;AAC9D,WAAK,SAAS,cAAc,EAAE,QAAQ,UAAU,UAAU,GAAG,CAAC;AAC9D,WAAK,SAAS,QAAQ,EAAE,QAAQ,UAAU,UAAU,MAAM,GAAG;AAC7D,WAAK,SAAS,QAAQ,EAAE,QAAQ,UAAU,UAAU,MAAM,GAAG;AAAA,IAAA,WACpD,KAAK,UAAU,OAAO;AAC1B,WAAA,SAAS,KAAK,EAAE,QAAQ;AAAA,IAC/B;AAEK,SAAA;AAEL,QAAI,KAAK,gBAAgB;AACvB,eAAS,gBAAgB,IAAI;AACxB,WAAA,OAAO,OAAO,QAAQ;AAAA,IAAA,OACtB;AACL,eAAS,gBAAgB,WAAW;AACpC,UAAI,KAAK;AAAO,iBAAS,MAAM;AAC1B,WAAA,OAAO,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,kBAAwB;AACtB,SAAK,QAAQ,UAAU,QAAQ,KAAK,GAAG;AAAA,EACzC;AAAA,EAEA,kBAAkB,SAA8B;AAC9C,UAAM,WAAW,IAAI,aAAa,UAAU,OAAO;AACnD,UAAM,SAAS,UAAU;AAEzB,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,YAAM,MAAM,UAAU,UAAU,GAAG,CAAC;AACpC,eAAS,CAAC,IAAI;AAAA,IAChB;AAEA,UAAM,UAAU,IAAI,YAAY,UAAU,SAAS,SAAS,WAAW,SAAS;AAChF,YAAQ,cAAc;AACf,WAAA;AAAA,EACT;AACF;"}
|