three-stdlib 2.28.11 → 2.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/lines/LineGeometry.cjs +23 -10
- package/lines/LineGeometry.cjs.map +1 -1
- package/lines/LineGeometry.js +23 -10
- package/lines/LineGeometry.js.map +1 -1
- package/lines/LineMaterial.cjs +29 -11
- package/lines/LineMaterial.cjs.map +1 -1
- package/lines/LineMaterial.js +29 -11
- package/lines/LineMaterial.js.map +1 -1
- package/lines/LineSegmentsGeometry.cjs +4 -4
- package/lines/LineSegmentsGeometry.cjs.map +1 -1
- package/lines/LineSegmentsGeometry.d.ts +1 -1
- package/lines/LineSegmentsGeometry.js +4 -4
- package/lines/LineSegmentsGeometry.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.cjs","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":["Loader","RGBELoader","HalfFloatType","CubeTexture","FloatType","LinearFilter","onLoad","onProgress","onError","FileLoader","DataTexture"],"mappings":";;;;AAGA,MAAM,6BAA6BA,MAAAA,OAAO;AAAA,EACxC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,YAAY,IAAIC,sBAAY;AACjC,SAAK,OAAOC,MAAa;AAAA,EAC1B;AAAA,EAED,KAAK,MAAM,QAAQ,YAAY,SAAS;AACtC,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;
|
|
1
|
+
{"version":3,"file":"HDRCubeTextureLoader.cjs","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":["Loader","RGBELoader","HalfFloatType","CubeTexture","FloatType","LinearFilter","onLoad","onProgress","onError","FileLoader","DataTexture"],"mappings":";;;;AAGA,MAAM,6BAA6BA,MAAAA,OAAO;AAAA,EACxC,YAAY,SAAS;AACnB,UAAM,OAAO;AAEb,SAAK,YAAY,IAAIC,sBAAY;AACjC,SAAK,OAAOC,MAAa;AAAA,EAC1B;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,IAAIC,kBAAa;AAEjC,YAAQ,OAAO,KAAK;AAEpB,YAAQ,QAAQ,MAAI;AAAA,MAClB,KAAKC;MACL,KAAKF,MAAa;AAChB,YAAI,gBAAgB;AAAS,kBAAQ,aAAa;AAAA;AAC7C,kBAAQ,WAAW;AACxB,gBAAQ,YAAYG,MAAY;AAChC,gBAAQ,YAAYA,MAAY;AAChC,gBAAQ,kBAAkB;AAC1B;AAAA,IACH;AAED,UAAM,QAAQ;AAEd,QAAI,SAAS;AAEb,aAAS,YAAY,GAAGC,SAAQC,aAAYC,UAAS;AACnD,UAAIC,MAAU,WAAC,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,IAAIC,MAAAA,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,gBAAIJ;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;;"}
|
|
@@ -8,7 +8,7 @@ export class HDRCubeTextureLoader extends Loader {
|
|
|
8
8
|
type: TextureDataType
|
|
9
9
|
|
|
10
10
|
load(
|
|
11
|
-
urls: string[],
|
|
11
|
+
urls: string | string[],
|
|
12
12
|
onLoad: (texture: CubeTexture) => void,
|
|
13
13
|
onProgress?: (event: ProgressEvent) => void,
|
|
14
14
|
onError?: (event: ErrorEvent) => void,
|
|
@@ -7,7 +7,9 @@ class HDRCubeTextureLoader extends Loader {
|
|
|
7
7
|
this.type = HalfFloatType;
|
|
8
8
|
}
|
|
9
9
|
load(urls, onLoad, onProgress, onError) {
|
|
10
|
-
if (
|
|
10
|
+
if (typeof urls === "string") {
|
|
11
|
+
urls = [urls];
|
|
12
|
+
} else if (!Array.isArray(urls)) {
|
|
11
13
|
console.warn("THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead.");
|
|
12
14
|
this.setDataType(urls);
|
|
13
15
|
urls = onLoad;
|
|
@@ -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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"}
|