three-stdlib 2.29.12 → 2.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/loaders/GLTFLoader.cjs +189 -71
- package/loaders/GLTFLoader.cjs.map +1 -1
- package/loaders/GLTFLoader.js +190 -72
- package/loaders/GLTFLoader.js.map +1 -1
- package/math/Lut.cjs +4 -4
- package/math/Lut.cjs.map +1 -1
- package/math/Lut.js +4 -4
- package/math/Lut.js.map +1 -1
- package/objects/Reflector.cjs +1 -1
- package/objects/Reflector.cjs.map +1 -1
- package/objects/Reflector.js +1 -1
- package/objects/Reflector.js.map +1 -1
- package/objects/Refractor.cjs +1 -1
- package/objects/Refractor.cjs.map +1 -1
- package/objects/Refractor.js +1 -1
- package/objects/Refractor.js.map +1 -1
- package/package.json +1 -1
package/math/Lut.cjs
CHANGED
@@ -39,8 +39,8 @@ class Lut {
|
|
39
39
|
if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {
|
40
40
|
const min = this.map[j][0];
|
41
41
|
const max = this.map[j + 1][0];
|
42
|
-
minColor.setHex(this.map[j][1], "linear
|
43
|
-
maxColor.setHex(this.map[j + 1][1], "linear
|
42
|
+
minColor.setHex(this.map[j][1], "srgb-linear");
|
43
|
+
maxColor.setHex(this.map[j + 1][1], "srgb-linear");
|
44
44
|
const color = new THREE.Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min));
|
45
45
|
this.lut.push(color);
|
46
46
|
}
|
@@ -88,8 +88,8 @@ class Lut {
|
|
88
88
|
if (i < this.map[j][0] && i >= this.map[j - 1][0]) {
|
89
89
|
const min = this.map[j - 1][0];
|
90
90
|
const max = this.map[j][0];
|
91
|
-
minColor.setHex(this.map[j - 1][1], "linear
|
92
|
-
maxColor.setHex(this.map[j][1], "linear
|
91
|
+
minColor.setHex(this.map[j - 1][1], "srgb-linear");
|
92
|
+
maxColor.setHex(this.map[j][1], "srgb-linear");
|
93
93
|
finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min));
|
94
94
|
data[k * 4] = Math.round(finalColor.r * 255);
|
95
95
|
data[k * 4 + 1] = Math.round(finalColor.g * 255);
|
package/math/Lut.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Lut.cjs","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'linear
|
1
|
+
{"version":3,"file":"Lut.cjs","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'srgb-linear')\n maxColor.setHex(this.map[j + 1][1], 'srgb-linear')\n\n const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min))\n\n this.lut.push(color)\n }\n }\n }\n\n // sample at 1\n\n this.lut.push(new Color(this.map[this.map.length - 1][1]))\n\n return this\n }\n\n copy(lut) {\n this.lut = lut.lut\n this.map = lut.map\n this.n = lut.n\n this.minV = lut.minV\n this.maxV = lut.maxV\n\n return this\n }\n\n getColor(alpha) {\n alpha = MathUtils.clamp(alpha, this.minV, this.maxV)\n\n alpha = (alpha - this.minV) / (this.maxV - this.minV)\n\n const colorPosition = Math.round(alpha * this.n)\n\n return this.lut[colorPosition]\n }\n\n addColorMap(name, arrayOfColors) {\n ColorMapKeywords[name] = arrayOfColors\n\n return this\n }\n\n createCanvas() {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = this.n\n\n this.updateCanvas(canvas)\n\n return canvas\n }\n\n updateCanvas(canvas) {\n const ctx = canvas.getContext('2d', { alpha: false })\n\n const imageData = ctx.getImageData(0, 0, 1, this.n)\n\n const data = imageData.data\n\n let k = 0\n\n const step = 1.0 / this.n\n\n const minColor = new Color()\n const maxColor = new Color()\n const finalColor = new Color()\n\n for (let i = 1; i >= 0; i -= step) {\n for (let j = this.map.length - 1; j >= 0; j--) {\n if (i < this.map[j][0] && i >= this.map[j - 1][0]) {\n const min = this.map[j - 1][0]\n const max = this.map[j][0]\n\n minColor.setHex(this.map[j - 1][1], 'srgb-linear')\n maxColor.setHex(this.map[j][1], 'srgb-linear')\n\n finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min))\n\n data[k * 4] = Math.round(finalColor.r * 255)\n data[k * 4 + 1] = Math.round(finalColor.g * 255)\n data[k * 4 + 2] = Math.round(finalColor.b * 255)\n data[k * 4 + 3] = 255\n\n k += 1\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n return canvas\n }\n}\n\nconst ColorMapKeywords = {\n rainbow: [\n [0.0, 0x0000ff],\n [0.2, 0x00ffff],\n [0.5, 0x00ff00],\n [0.8, 0xffff00],\n [1.0, 0xff0000],\n ],\n cooltowarm: [\n [0.0, 0x3c4ec2],\n [0.2, 0x9bbcff],\n [0.5, 0xdcdcdc],\n [0.8, 0xf6a385],\n [1.0, 0xb40426],\n ],\n blackbody: [\n [0.0, 0x000000],\n [0.2, 0x780000],\n [0.5, 0xe63200],\n [0.8, 0xffff00],\n [1.0, 0xffffff],\n ],\n grayscale: [\n [0.0, 0x000000],\n [0.2, 0x404040],\n [0.5, 0x7f7f80],\n [0.8, 0xbfbfbf],\n [1.0, 0xffffff],\n ],\n}\n\nexport { Lut, ColorMapKeywords }\n"],"names":["Color","MathUtils"],"mappings":"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"}
|
package/math/Lut.js
CHANGED
@@ -37,8 +37,8 @@ class Lut {
|
|
37
37
|
if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {
|
38
38
|
const min = this.map[j][0];
|
39
39
|
const max = this.map[j + 1][0];
|
40
|
-
minColor.setHex(this.map[j][1], "linear
|
41
|
-
maxColor.setHex(this.map[j + 1][1], "linear
|
40
|
+
minColor.setHex(this.map[j][1], "srgb-linear");
|
41
|
+
maxColor.setHex(this.map[j + 1][1], "srgb-linear");
|
42
42
|
const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min));
|
43
43
|
this.lut.push(color);
|
44
44
|
}
|
@@ -86,8 +86,8 @@ class Lut {
|
|
86
86
|
if (i < this.map[j][0] && i >= this.map[j - 1][0]) {
|
87
87
|
const min = this.map[j - 1][0];
|
88
88
|
const max = this.map[j][0];
|
89
|
-
minColor.setHex(this.map[j - 1][1], "linear
|
90
|
-
maxColor.setHex(this.map[j][1], "linear
|
89
|
+
minColor.setHex(this.map[j - 1][1], "srgb-linear");
|
90
|
+
maxColor.setHex(this.map[j][1], "srgb-linear");
|
91
91
|
finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min));
|
92
92
|
data[k * 4] = Math.round(finalColor.r * 255);
|
93
93
|
data[k * 4 + 1] = Math.round(finalColor.g * 255);
|
package/math/Lut.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Lut.js","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'linear
|
1
|
+
{"version":3,"file":"Lut.js","sources":["../../src/math/Lut.js"],"sourcesContent":["import { Color, MathUtils } from 'three'\n\nclass Lut {\n constructor(colormap, count = 32) {\n this.isLut = true\n\n this.lut = []\n this.map = []\n this.n = 0\n this.minV = 0\n this.maxV = 1\n\n this.setColorMap(colormap, count)\n }\n\n set(value) {\n if (value.isLut === true) {\n this.copy(value)\n }\n\n return this\n }\n\n setMin(min) {\n this.minV = min\n\n return this\n }\n\n setMax(max) {\n this.maxV = max\n\n return this\n }\n\n setColorMap(colormap, count = 32) {\n this.map = ColorMapKeywords[colormap] || ColorMapKeywords.rainbow\n this.n = count\n\n const step = 1.0 / this.n\n const minColor = new Color()\n const maxColor = new Color()\n\n this.lut.length = 0\n\n // sample at 0\n\n this.lut.push(new Color(this.map[0][1]))\n\n // sample at 1/n, ..., (n-1)/n\n\n for (let i = 1; i < count; i++) {\n const alpha = i * step\n\n for (let j = 0; j < this.map.length - 1; j++) {\n if (alpha > this.map[j][0] && alpha <= this.map[j + 1][0]) {\n const min = this.map[j][0]\n const max = this.map[j + 1][0]\n\n minColor.setHex(this.map[j][1], 'srgb-linear')\n maxColor.setHex(this.map[j + 1][1], 'srgb-linear')\n\n const color = new Color().lerpColors(minColor, maxColor, (alpha - min) / (max - min))\n\n this.lut.push(color)\n }\n }\n }\n\n // sample at 1\n\n this.lut.push(new Color(this.map[this.map.length - 1][1]))\n\n return this\n }\n\n copy(lut) {\n this.lut = lut.lut\n this.map = lut.map\n this.n = lut.n\n this.minV = lut.minV\n this.maxV = lut.maxV\n\n return this\n }\n\n getColor(alpha) {\n alpha = MathUtils.clamp(alpha, this.minV, this.maxV)\n\n alpha = (alpha - this.minV) / (this.maxV - this.minV)\n\n const colorPosition = Math.round(alpha * this.n)\n\n return this.lut[colorPosition]\n }\n\n addColorMap(name, arrayOfColors) {\n ColorMapKeywords[name] = arrayOfColors\n\n return this\n }\n\n createCanvas() {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = this.n\n\n this.updateCanvas(canvas)\n\n return canvas\n }\n\n updateCanvas(canvas) {\n const ctx = canvas.getContext('2d', { alpha: false })\n\n const imageData = ctx.getImageData(0, 0, 1, this.n)\n\n const data = imageData.data\n\n let k = 0\n\n const step = 1.0 / this.n\n\n const minColor = new Color()\n const maxColor = new Color()\n const finalColor = new Color()\n\n for (let i = 1; i >= 0; i -= step) {\n for (let j = this.map.length - 1; j >= 0; j--) {\n if (i < this.map[j][0] && i >= this.map[j - 1][0]) {\n const min = this.map[j - 1][0]\n const max = this.map[j][0]\n\n minColor.setHex(this.map[j - 1][1], 'srgb-linear')\n maxColor.setHex(this.map[j][1], 'srgb-linear')\n\n finalColor.lerpColors(minColor, maxColor, (i - min) / (max - min))\n\n data[k * 4] = Math.round(finalColor.r * 255)\n data[k * 4 + 1] = Math.round(finalColor.g * 255)\n data[k * 4 + 2] = Math.round(finalColor.b * 255)\n data[k * 4 + 3] = 255\n\n k += 1\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n\n return canvas\n }\n}\n\nconst ColorMapKeywords = {\n rainbow: [\n [0.0, 0x0000ff],\n [0.2, 0x00ffff],\n [0.5, 0x00ff00],\n [0.8, 0xffff00],\n [1.0, 0xff0000],\n ],\n cooltowarm: [\n [0.0, 0x3c4ec2],\n [0.2, 0x9bbcff],\n [0.5, 0xdcdcdc],\n [0.8, 0xf6a385],\n [1.0, 0xb40426],\n ],\n blackbody: [\n [0.0, 0x000000],\n [0.2, 0x780000],\n [0.5, 0xe63200],\n [0.8, 0xffff00],\n [1.0, 0xffffff],\n ],\n grayscale: [\n [0.0, 0x000000],\n [0.2, 0x404040],\n [0.5, 0x7f7f80],\n [0.8, 0xbfbfbf],\n [1.0, 0xffffff],\n ],\n}\n\nexport { Lut, ColorMapKeywords }\n"],"names":[],"mappings":";AAEA,MAAM,IAAI;AAAA,EACR,YAAY,UAAU,QAAQ,IAAI;AAChC,SAAK,QAAQ;AAEb,SAAK,MAAM,CAAE;AACb,SAAK,MAAM,CAAE;AACb,SAAK,IAAI;AACT,SAAK,OAAO;AACZ,SAAK,OAAO;AAEZ,SAAK,YAAY,UAAU,KAAK;AAAA,EACjC;AAAA,EAED,IAAI,OAAO;AACT,QAAI,MAAM,UAAU,MAAM;AACxB,WAAK,KAAK,KAAK;AAAA,IAChB;AAED,WAAO;AAAA,EACR;AAAA,EAED,OAAO,KAAK;AACV,SAAK,OAAO;AAEZ,WAAO;AAAA,EACR;AAAA,EAED,OAAO,KAAK;AACV,SAAK,OAAO;AAEZ,WAAO;AAAA,EACR;AAAA,EAED,YAAY,UAAU,QAAQ,IAAI;AAChC,SAAK,MAAM,iBAAiB,QAAQ,KAAK,iBAAiB;AAC1D,SAAK,IAAI;AAET,UAAM,OAAO,IAAM,KAAK;AACxB,UAAM,WAAW,IAAI,MAAO;AAC5B,UAAM,WAAW,IAAI,MAAO;AAE5B,SAAK,IAAI,SAAS;AAIlB,SAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAIvC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,QAAQ,IAAI;AAElB,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK;AAC5C,YAAI,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG;AACzD,gBAAM,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACzB,gBAAM,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAE7B,mBAAS,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AAC7C,mBAAS,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AAEjD,gBAAM,QAAQ,IAAI,MAAO,EAAC,WAAW,UAAU,WAAW,QAAQ,QAAQ,MAAM,IAAI;AAEpF,eAAK,IAAI,KAAK,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAID,SAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzD,WAAO;AAAA,EACR;AAAA,EAED,KAAK,KAAK;AACR,SAAK,MAAM,IAAI;AACf,SAAK,MAAM,IAAI;AACf,SAAK,IAAI,IAAI;AACb,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAEhB,WAAO;AAAA,EACR;AAAA,EAED,SAAS,OAAO;AACd,YAAQ,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI;AAEnD,aAAS,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAK;AAEhD,UAAM,gBAAgB,KAAK,MAAM,QAAQ,KAAK,CAAC;AAE/C,WAAO,KAAK,IAAI,aAAa;AAAA,EAC9B;AAAA,EAED,YAAY,MAAM,eAAe;AAC/B,qBAAiB,IAAI,IAAI;AAEzB,WAAO;AAAA,EACR;AAAA,EAED,eAAe;AACb,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS,KAAK;AAErB,SAAK,aAAa,MAAM;AAExB,WAAO;AAAA,EACR;AAAA,EAED,aAAa,QAAQ;AACnB,UAAM,MAAM,OAAO,WAAW,MAAM,EAAE,OAAO,OAAO;AAEpD,UAAM,YAAY,IAAI,aAAa,GAAG,GAAG,GAAG,KAAK,CAAC;AAElD,UAAM,OAAO,UAAU;AAEvB,QAAI,IAAI;AAER,UAAM,OAAO,IAAM,KAAK;AAExB,UAAM,WAAW,IAAI,MAAO;AAC5B,UAAM,WAAW,IAAI,MAAO;AAC5B,UAAM,aAAa,IAAI,MAAO;AAE9B,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK,MAAM;AACjC,eAAS,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG;AACjD,gBAAM,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAC7B,gBAAM,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AAEzB,mBAAS,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AACjD,mBAAS,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,aAAa;AAE7C,qBAAW,WAAW,UAAU,WAAW,IAAI,QAAQ,MAAM,IAAI;AAEjE,eAAK,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,IAAI,GAAG;AAC3C,eAAK,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,IAAI,GAAG;AAC/C,eAAK,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,IAAI,GAAG;AAC/C,eAAK,IAAI,IAAI,CAAC,IAAI;AAElB,eAAK;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAED,QAAI,aAAa,WAAW,GAAG,CAAC;AAEhC,WAAO;AAAA,EACR;AACH;AAEK,MAAC,mBAAmB;AAAA,EACvB,SAAS;AAAA,IACP,CAAC,GAAK,GAAQ;AAAA,IACd,CAAC,KAAK,KAAQ;AAAA,IACd,CAAC,KAAK,KAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AAAA,EACD,YAAY;AAAA,IACV,CAAC,GAAK,OAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AAAA,EACD,WAAW;AAAA,IACT,CAAC,GAAK,CAAQ;AAAA,IACd,CAAC,KAAK,OAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AAAA,EACD,WAAW;AAAA,IACT,CAAC,GAAK,CAAQ;AAAA,IACd,CAAC,KAAK,OAAQ;AAAA,IACd,CAAC,KAAK,OAAQ;AAAA,IACd,CAAC,KAAK,QAAQ;AAAA,IACd,CAAC,GAAK,QAAQ;AAAA,EACf;AACH;"}
|
package/objects/Reflector.cjs
CHANGED
@@ -102,7 +102,7 @@ const _Reflector = class extends THREE.Mesh {
|
|
102
102
|
renderer.xr.enabled = false;
|
103
103
|
renderer.shadowMap.autoUpdate = false;
|
104
104
|
if ("outputColorSpace" in renderer)
|
105
|
-
renderer.outputColorSpace = "linear
|
105
|
+
renderer.outputColorSpace = "srgb-linear";
|
106
106
|
else
|
107
107
|
renderer.outputEncoding = 3e3;
|
108
108
|
renderer.toneMapping = THREE.NoToneMapping;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Reflector.cjs","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'linear-srgb'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":["Mesh","PerspectiveCamera","Color","Plane","Vector3","Matrix4","Vector4","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","NoToneMapping","version"],"mappings":";;;;;;;;;;AAgBA,MAAM,aAAN,cAAwBA,MAAAA,KAAK;AAAA,EAiE3B,YAAY,UAAU,UAAU,IAAI;AAClC,UAAM,QAAQ;AAEd,SAAK,cAAc;AAEnB,SAAK,OAAO;AACZ,SAAK,SAAS,IAAIC,wBAAmB;AAErC,UAAM,QAAQ;AAEd,UAAM,QAAQ,QAAQ,UAAU,SAAY,IAAIC,YAAM,QAAQ,KAAK,IAAI,IAAIA,MAAAA,MAAM,OAAQ;AACzF,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,SAAS,QAAQ,UAAU,WAAU;AAC3C,UAAM,cAAc,QAAQ,gBAAgB,SAAY,QAAQ,cAAc;AAI9E,UAAM,iBAAiB,IAAIC,YAAO;AAClC,UAAM,SAAS,IAAIC,cAAS;AAC5B,UAAM,yBAAyB,IAAIA,cAAS;AAC5C,UAAM,sBAAsB,IAAIA,cAAS;AACzC,UAAM,iBAAiB,IAAIC,cAAS;AACpC,UAAM,iBAAiB,IAAID,MAAO,QAAC,GAAG,GAAG,EAAE;AAC3C,UAAM,YAAY,IAAIE,cAAS;AAE/B,UAAM,OAAO,IAAIF,cAAS;AAC1B,UAAM,SAAS,IAAIA,cAAS;AAC5B,UAAM,IAAI,IAAIE,cAAS;AAEvB,UAAM,gBAAgB,IAAID,cAAS;AACnC,UAAM,gBAAgB,KAAK;AAE3B,UAAM,eAAe,IAAIE,wBAAkB,cAAc,eAAe;AAAA,MACtE,SAAS;AAAA,MACT,MAAMC,MAAa;AAAA,IACzB,CAAK;AAED,UAAM,WAAW,IAAIC,qBAAe;AAAA,MAClC,UAAUC,MAAa,cAAC,MAAM,OAAO,QAAQ;AAAA,MAC7C,gBAAgB,OAAO;AAAA,MACvB,cAAc,OAAO;AAAA,IAC3B,CAAK;AAED,aAAS,SAAS,UAAU,EAAE,QAAQ,aAAa;AACnD,aAAS,SAAS,OAAO,EAAE,QAAQ;AACnC,aAAS,SAAS,eAAe,EAAE,QAAQ;AAE3C,SAAK,WAAW;AAEhB,SAAK,iBAAiB,SAAU,UAAU,OAAO,QAAQ;AACvD,6BAAuB,sBAAsB,MAAM,WAAW;AAC9D,0BAAoB,sBAAsB,OAAO,WAAW;AAE5D,qBAAe,gBAAgB,MAAM,WAAW;AAEhD,aAAO,IAAI,GAAG,GAAG,CAAC;AAClB,aAAO,aAAa,cAAc;AAElC,WAAK,WAAW,wBAAwB,mBAAmB;AAI3D,UAAI,KAAK,IAAI,MAAM,IAAI;AAAG;AAE1B,WAAK,QAAQ,MAAM,EAAE,OAAQ;AAC7B,WAAK,IAAI,sBAAsB;AAE/B,qBAAe,gBAAgB,OAAO,WAAW;AAEjD,qBAAe,IAAI,GAAG,GAAG,EAAE;AAC3B,qBAAe,aAAa,cAAc;AAC1C,qBAAe,IAAI,mBAAmB;AAEtC,aAAO,WAAW,wBAAwB,cAAc;AACxD,aAAO,QAAQ,MAAM,EAAE,OAAQ;AAC/B,aAAO,IAAI,sBAAsB;AAEjC,oBAAc,SAAS,KAAK,IAAI;AAChC,oBAAc,GAAG,IAAI,GAAG,GAAG,CAAC;AAC5B,oBAAc,GAAG,aAAa,cAAc;AAC5C,oBAAc,GAAG,QAAQ,MAAM;AAC/B,oBAAc,OAAO,MAAM;AAE3B,oBAAc,MAAM,OAAO;AAE3B,oBAAc,kBAAmB;AACjC,oBAAc,iBAAiB,KAAK,OAAO,gBAAgB;AAG3D,oBAAc,IAAI,KAAK,GAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,GAAK,KAAK,KAAK,GAAK,GAAK,GAAK,CAAG;AAChG,oBAAc,SAAS,cAAc,gBAAgB;AACrD,oBAAc,SAAS,cAAc,kBAAkB;AACvD,oBAAc,SAAS,MAAM,WAAW;AAIxC,qBAAe,8BAA8B,QAAQ,sBAAsB;AAC3E,qBAAe,aAAa,cAAc,kBAAkB;AAE5D,gBAAU,IAAI,eAAe,OAAO,GAAG,eAAe,OAAO,GAAG,eAAe,OAAO,GAAG,eAAe,QAAQ;AAEhH,YAAM,mBAAmB,cAAc;AAEvC,QAAE,KAAK,KAAK,KAAK,UAAU,CAAC,IAAI,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC;AAC3F,QAAE,KAAK,KAAK,KAAK,UAAU,CAAC,IAAI,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC;AAC3F,QAAE,IAAI;AACN,QAAE,KAAK,IAAM,iBAAiB,SAAS,EAAE,KAAK,iBAAiB,SAAS,EAAE;AAG1E,gBAAU,eAAe,IAAM,UAAU,IAAI,CAAC,CAAC;AAG/C,uBAAiB,SAAS,CAAC,IAAI,UAAU;AACzC,uBAAiB,SAAS,CAAC,IAAI,UAAU;AACzC,uBAAiB,SAAS,EAAE,IAAI,UAAU,IAAI,IAAM;AACpD,uBAAiB,SAAS,EAAE,IAAI,UAAU;AAG1C,YAAM,UAAU;AAEhB,YAAM,sBAAsB,SAAS,gBAAiB;AAEtD,YAAM,mBAAmB,SAAS,GAAG;AACrC,YAAM,0BAA0B,SAAS,UAAU;AACnD,YAAM,qBAAqB,SAAS;AAEpC,UAAI,SAAS;AACb,UAAI,sBAAsB;AAAU,iBAAS,SAAS,qBAAqB;AAAA;AACtE,iBAAS,SAAS,mBAAmB;AAE1C,eAAS,GAAG,UAAU;AACtB,eAAS,UAAU,aAAa;AAChC,UAAI,sBAAsB;AAAU,iBAAS,mBAAmB;AAAA;AAC3D,iBAAS,iBAAiB;AAC/B,eAAS,cAAcC,MAAa;AAEpC,eAAS,gBAAgB,YAAY;AAErC,eAAS,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAEzC,UAAI,SAAS,cAAc;AAAO,iBAAS,MAAO;AAClD,eAAS,OAAO,OAAO,aAAa;AAEpC,eAAS,GAAG,UAAU;AACtB,eAAS,UAAU,aAAa;AAChC,eAAS,cAAc;AAEvB,UAAI,sBAAsB;AAAU,iBAAS,mBAAmB,SAAS,SAAS;AAAA;AAC7E,iBAAS,iBAAiB,SAAS,OAAO;AAE/C,eAAS,gBAAgB,mBAAmB;AAI5C,YAAM,WAAW,OAAO;AAExB,UAAI,aAAa,QAAW;AAC1B,iBAAS,MAAM,SAAS,QAAQ;AAAA,MACjC;AAED,YAAM,UAAU;AAAA,IACjB;AAED,SAAK,kBAAkB,WAAY;AACjC,aAAO;AAAA,IACR;AAED,SAAK,UAAU,WAAY;AACzB,mBAAa,QAAS;AACtB,YAAM,SAAS,QAAS;AAAA,IACzB;AAAA,EACF;AACH;AA/OA,IAAM,YAAN;AACE,cADI,WACG,mBAAkB;AAAA,EACvB,UAAU;AAAA,IACR,OAAO;AAAA,MACL,OAAO;AAAA,IACR;AAAA,IAED,UAAU;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IAED,eAAe;AAAA,MACb,OAAO;AAAA,IACR;AAAA,EACF;AAAA,EAED;AAAA;AAAA,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBzB;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eA2BhBC,qBAAW,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAGrD;;"}
|
1
|
+
{"version":3,"file":"Reflector.cjs","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'srgb-linear'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":["Mesh","PerspectiveCamera","Color","Plane","Vector3","Matrix4","Vector4","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","NoToneMapping","version"],"mappings":"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"}
|
package/objects/Reflector.js
CHANGED
@@ -100,7 +100,7 @@ const _Reflector = class extends Mesh {
|
|
100
100
|
renderer.xr.enabled = false;
|
101
101
|
renderer.shadowMap.autoUpdate = false;
|
102
102
|
if ("outputColorSpace" in renderer)
|
103
|
-
renderer.outputColorSpace = "linear
|
103
|
+
renderer.outputColorSpace = "srgb-linear";
|
104
104
|
else
|
105
105
|
renderer.outputEncoding = 3e3;
|
106
106
|
renderer.toneMapping = NoToneMapping;
|
package/objects/Reflector.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Reflector.js","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'linear-srgb'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"Reflector.js","sources":["../../src/objects/Reflector.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n HalfFloatType,\n NoToneMapping,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Reflector extends Mesh {\n static ReflectorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isReflector = true\n\n this.type = 'Reflector'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Reflector.ReflectorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const reflectorPlane = new Plane()\n const normal = new Vector3()\n const reflectorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n const lookAtPosition = new Vector3(0, 0, -1)\n const clipPlane = new Vector4()\n\n const view = new Vector3()\n const target = new Vector3()\n const q = new Vector4()\n\n const textureMatrix = new Matrix4()\n const virtualCamera = this.camera\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n const material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n fragmentShader: shader.fragmentShader,\n vertexShader: shader.vertexShader,\n })\n\n material.uniforms['tDiffuse'].value = renderTarget.texture\n material.uniforms['color'].value = color\n material.uniforms['textureMatrix'].value = textureMatrix\n\n this.material = material\n\n this.onBeforeRender = function (renderer, scene, camera) {\n reflectorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n view.subVectors(reflectorWorldPosition, cameraWorldPosition)\n\n // Avoid rendering when reflector is facing away\n\n if (view.dot(normal) > 0) return\n\n view.reflect(normal).negate()\n view.add(reflectorWorldPosition)\n\n rotationMatrix.extractRotation(camera.matrixWorld)\n\n lookAtPosition.set(0, 0, -1)\n lookAtPosition.applyMatrix4(rotationMatrix)\n lookAtPosition.add(cameraWorldPosition)\n\n target.subVectors(reflectorWorldPosition, lookAtPosition)\n target.reflect(normal).negate()\n target.add(reflectorWorldPosition)\n\n virtualCamera.position.copy(view)\n virtualCamera.up.set(0, 1, 0)\n virtualCamera.up.applyMatrix4(rotationMatrix)\n virtualCamera.up.reflect(normal)\n virtualCamera.lookAt(target)\n\n virtualCamera.far = camera.far // Used in WebGLBackground\n\n virtualCamera.updateMatrixWorld()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n\n // Update the texture matrix\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n textureMatrix.multiply(virtualCamera.projectionMatrix)\n textureMatrix.multiply(virtualCamera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n\n // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n reflectorPlane.setFromNormalAndCoplanarPoint(normal, reflectorWorldPosition)\n reflectorPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipPlane.set(reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant)\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // Calculate the scaled plane vector\n clipPlane.multiplyScalar(2.0 / clipPlane.dot(q))\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = clipPlane.x\n projectionMatrix.elements[6] = clipPlane.y\n projectionMatrix.elements[10] = clipPlane.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipPlane.w\n\n // Render\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // Avoid camera modification\n renderer.shadowMap.autoUpdate = false // Avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'srgb-linear'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n\n renderer.state.buffers.depth.setMask(true) // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n renderer.setRenderTarget(currentRenderTarget)\n\n // Restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Reflector }\n"],"names":[],"mappings":"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"}
|
package/objects/Refractor.cjs
CHANGED
@@ -112,7 +112,7 @@ const _Refractor = class extends THREE.Mesh {
|
|
112
112
|
renderer.xr.enabled = false;
|
113
113
|
renderer.shadowMap.autoUpdate = false;
|
114
114
|
if ("outputColorSpace" in renderer)
|
115
|
-
renderer.outputColorSpace = "linear
|
115
|
+
renderer.outputColorSpace = "srgb-linear";
|
116
116
|
else
|
117
117
|
renderer.outputEncoding = 3e3;
|
118
118
|
renderer.toneMapping = THREE.NoToneMapping;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Refractor.cjs","sources":["../../src/objects/Refractor.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n Quaternion,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n NoToneMapping,\n HalfFloatType,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Refractor extends Mesh {\n static RefractorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\n\t\tuniform mat4 textureMatrix;\n\n\t\tvarying vec4 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec4 vUv;\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isRefractor = true\n\n this.type = 'Refractor'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Refractor.RefractorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const virtualCamera = this.camera\n virtualCamera.matrixAutoUpdate = false\n virtualCamera.userData.refractor = true\n\n //\n\n const refractorPlane = new Plane()\n const textureMatrix = new Matrix4()\n\n // render target\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n // material\n\n this.material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n transparent: true, // ensures, refractors are drawn from farthest to closest\n })\n\n this.material.uniforms['color'].value = color\n this.material.uniforms['tDiffuse'].value = renderTarget.texture\n this.material.uniforms['textureMatrix'].value = textureMatrix\n\n // functions\n\n const visible = (function () {\n const refractorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n\n const view = new Vector3()\n const normal = new Vector3()\n\n return function visible(camera) {\n refractorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n view.subVectors(refractorWorldPosition, cameraWorldPosition)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n return view.dot(normal) < 0\n }\n })()\n\n const updateRefractorPlane = (function () {\n const normal = new Vector3()\n const position = new Vector3()\n const quaternion = new Quaternion()\n const scale = new Vector3()\n\n return function updateRefractorPlane() {\n scope.matrixWorld.decompose(position, quaternion, scale)\n normal.set(0, 0, 1).applyQuaternion(quaternion).normalize()\n\n // flip the normal because we want to cull everything above the plane\n\n normal.negate()\n\n refractorPlane.setFromNormalAndCoplanarPoint(normal, position)\n }\n })()\n\n const updateVirtualCamera = (function () {\n const clipPlane = new Plane()\n const clipVector = new Vector4()\n const q = new Vector4()\n\n return function updateVirtualCamera(camera) {\n virtualCamera.matrixWorld.copy(camera.matrixWorld)\n virtualCamera.matrixWorldInverse.copy(virtualCamera.matrixWorld).invert()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n virtualCamera.far = camera.far // used in WebGLBackground\n\n // The following code creates an oblique view frustum for clipping.\n // see: Lengyel, Eric. “Oblique View Frustum Depth Projection and Clipping”.\n // Journal of Game Development, Vol. 1, No. 2 (2005), Charles River Media, pp. 5–16\n\n clipPlane.copy(refractorPlane)\n clipPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipVector.set(clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.constant)\n\n // calculate the clip-space corner point opposite the clipping plane and\n // transform it into camera space by multiplying it by the inverse of the projection matrix\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipVector.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipVector.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // calculate the scaled plane vector\n\n clipVector.multiplyScalar(2.0 / clipVector.dot(q))\n\n // replacing the third row of the projection matrix\n\n projectionMatrix.elements[2] = clipVector.x\n projectionMatrix.elements[6] = clipVector.y\n projectionMatrix.elements[10] = clipVector.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipVector.w\n }\n })()\n\n // This will update the texture matrix that is used for projective texture mapping in the shader.\n // see: http://developer.download.nvidia.com/assets/gamedev/docs/projective_texture_mapping.pdf\n\n function updateTextureMatrix(camera) {\n // this matrix does range mapping to [ 0, 1 ]\n\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n\n // we use \"Object Linear Texgen\", so we need to multiply the texture matrix T\n // (matrix above) with the projection and view matrix of the virtual camera\n // and the model matrix of the refractor\n\n textureMatrix.multiply(camera.projectionMatrix)\n textureMatrix.multiply(camera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n }\n\n //\n\n function render(renderer, scene, camera) {\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // avoid camera modification\n renderer.shadowMap.autoUpdate = false // avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'linear-srgb'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n renderer.setRenderTarget(currentRenderTarget)\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n // restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n //\n\n this.onBeforeRender = function (renderer, scene, camera) {\n // ensure refractors are rendered only once per frame\n\n if (camera.userData.refractor === true) return\n\n // avoid rendering when the refractor is viewed from behind\n\n if (!visible(camera) === true) return\n\n // update\n\n updateRefractorPlane()\n\n updateTextureMatrix(camera)\n\n updateVirtualCamera(camera)\n\n render(renderer, scene, camera)\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Refractor }\n"],"names":["Mesh","PerspectiveCamera","Color","Plane","Matrix4","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","Vector3","visible","Quaternion","updateRefractorPlane","Vector4","updateVirtualCamera","NoToneMapping","version"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"Refractor.cjs","sources":["../../src/objects/Refractor.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n Quaternion,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n NoToneMapping,\n HalfFloatType,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Refractor extends Mesh {\n static RefractorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\n\t\tuniform mat4 textureMatrix;\n\n\t\tvarying vec4 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec4 vUv;\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isRefractor = true\n\n this.type = 'Refractor'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Refractor.RefractorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const virtualCamera = this.camera\n virtualCamera.matrixAutoUpdate = false\n virtualCamera.userData.refractor = true\n\n //\n\n const refractorPlane = new Plane()\n const textureMatrix = new Matrix4()\n\n // render target\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n // material\n\n this.material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n transparent: true, // ensures, refractors are drawn from farthest to closest\n })\n\n this.material.uniforms['color'].value = color\n this.material.uniforms['tDiffuse'].value = renderTarget.texture\n this.material.uniforms['textureMatrix'].value = textureMatrix\n\n // functions\n\n const visible = (function () {\n const refractorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n\n const view = new Vector3()\n const normal = new Vector3()\n\n return function visible(camera) {\n refractorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n view.subVectors(refractorWorldPosition, cameraWorldPosition)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n return view.dot(normal) < 0\n }\n })()\n\n const updateRefractorPlane = (function () {\n const normal = new Vector3()\n const position = new Vector3()\n const quaternion = new Quaternion()\n const scale = new Vector3()\n\n return function updateRefractorPlane() {\n scope.matrixWorld.decompose(position, quaternion, scale)\n normal.set(0, 0, 1).applyQuaternion(quaternion).normalize()\n\n // flip the normal because we want to cull everything above the plane\n\n normal.negate()\n\n refractorPlane.setFromNormalAndCoplanarPoint(normal, position)\n }\n })()\n\n const updateVirtualCamera = (function () {\n const clipPlane = new Plane()\n const clipVector = new Vector4()\n const q = new Vector4()\n\n return function updateVirtualCamera(camera) {\n virtualCamera.matrixWorld.copy(camera.matrixWorld)\n virtualCamera.matrixWorldInverse.copy(virtualCamera.matrixWorld).invert()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n virtualCamera.far = camera.far // used in WebGLBackground\n\n // The following code creates an oblique view frustum for clipping.\n // see: Lengyel, Eric. “Oblique View Frustum Depth Projection and Clipping”.\n // Journal of Game Development, Vol. 1, No. 2 (2005), Charles River Media, pp. 5–16\n\n clipPlane.copy(refractorPlane)\n clipPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipVector.set(clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.constant)\n\n // calculate the clip-space corner point opposite the clipping plane and\n // transform it into camera space by multiplying it by the inverse of the projection matrix\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipVector.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipVector.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // calculate the scaled plane vector\n\n clipVector.multiplyScalar(2.0 / clipVector.dot(q))\n\n // replacing the third row of the projection matrix\n\n projectionMatrix.elements[2] = clipVector.x\n projectionMatrix.elements[6] = clipVector.y\n projectionMatrix.elements[10] = clipVector.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipVector.w\n }\n })()\n\n // This will update the texture matrix that is used for projective texture mapping in the shader.\n // see: http://developer.download.nvidia.com/assets/gamedev/docs/projective_texture_mapping.pdf\n\n function updateTextureMatrix(camera) {\n // this matrix does range mapping to [ 0, 1 ]\n\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n\n // we use \"Object Linear Texgen\", so we need to multiply the texture matrix T\n // (matrix above) with the projection and view matrix of the virtual camera\n // and the model matrix of the refractor\n\n textureMatrix.multiply(camera.projectionMatrix)\n textureMatrix.multiply(camera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n }\n\n //\n\n function render(renderer, scene, camera) {\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // avoid camera modification\n renderer.shadowMap.autoUpdate = false // avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'srgb-linear'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n renderer.setRenderTarget(currentRenderTarget)\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n // restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n //\n\n this.onBeforeRender = function (renderer, scene, camera) {\n // ensure refractors are rendered only once per frame\n\n if (camera.userData.refractor === true) return\n\n // avoid rendering when the refractor is viewed from behind\n\n if (!visible(camera) === true) return\n\n // update\n\n updateRefractorPlane()\n\n updateTextureMatrix(camera)\n\n updateVirtualCamera(camera)\n\n render(renderer, scene, camera)\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Refractor }\n"],"names":["Mesh","PerspectiveCamera","Color","Plane","Matrix4","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","Vector3","visible","Quaternion","updateRefractorPlane","Vector4","updateVirtualCamera","NoToneMapping","version"],"mappings":"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"}
|
package/objects/Refractor.js
CHANGED
@@ -110,7 +110,7 @@ const _Refractor = class extends Mesh {
|
|
110
110
|
renderer.xr.enabled = false;
|
111
111
|
renderer.shadowMap.autoUpdate = false;
|
112
112
|
if ("outputColorSpace" in renderer)
|
113
|
-
renderer.outputColorSpace = "linear
|
113
|
+
renderer.outputColorSpace = "srgb-linear";
|
114
114
|
else
|
115
115
|
renderer.outputEncoding = 3e3;
|
116
116
|
renderer.toneMapping = NoToneMapping;
|
package/objects/Refractor.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Refractor.js","sources":["../../src/objects/Refractor.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n Quaternion,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n NoToneMapping,\n HalfFloatType,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Refractor extends Mesh {\n static RefractorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\n\t\tuniform mat4 textureMatrix;\n\n\t\tvarying vec4 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec4 vUv;\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isRefractor = true\n\n this.type = 'Refractor'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Refractor.RefractorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const virtualCamera = this.camera\n virtualCamera.matrixAutoUpdate = false\n virtualCamera.userData.refractor = true\n\n //\n\n const refractorPlane = new Plane()\n const textureMatrix = new Matrix4()\n\n // render target\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n // material\n\n this.material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n transparent: true, // ensures, refractors are drawn from farthest to closest\n })\n\n this.material.uniforms['color'].value = color\n this.material.uniforms['tDiffuse'].value = renderTarget.texture\n this.material.uniforms['textureMatrix'].value = textureMatrix\n\n // functions\n\n const visible = (function () {\n const refractorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n\n const view = new Vector3()\n const normal = new Vector3()\n\n return function visible(camera) {\n refractorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n view.subVectors(refractorWorldPosition, cameraWorldPosition)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n return view.dot(normal) < 0\n }\n })()\n\n const updateRefractorPlane = (function () {\n const normal = new Vector3()\n const position = new Vector3()\n const quaternion = new Quaternion()\n const scale = new Vector3()\n\n return function updateRefractorPlane() {\n scope.matrixWorld.decompose(position, quaternion, scale)\n normal.set(0, 0, 1).applyQuaternion(quaternion).normalize()\n\n // flip the normal because we want to cull everything above the plane\n\n normal.negate()\n\n refractorPlane.setFromNormalAndCoplanarPoint(normal, position)\n }\n })()\n\n const updateVirtualCamera = (function () {\n const clipPlane = new Plane()\n const clipVector = new Vector4()\n const q = new Vector4()\n\n return function updateVirtualCamera(camera) {\n virtualCamera.matrixWorld.copy(camera.matrixWorld)\n virtualCamera.matrixWorldInverse.copy(virtualCamera.matrixWorld).invert()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n virtualCamera.far = camera.far // used in WebGLBackground\n\n // The following code creates an oblique view frustum for clipping.\n // see: Lengyel, Eric. “Oblique View Frustum Depth Projection and Clipping”.\n // Journal of Game Development, Vol. 1, No. 2 (2005), Charles River Media, pp. 5–16\n\n clipPlane.copy(refractorPlane)\n clipPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipVector.set(clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.constant)\n\n // calculate the clip-space corner point opposite the clipping plane and\n // transform it into camera space by multiplying it by the inverse of the projection matrix\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipVector.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipVector.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // calculate the scaled plane vector\n\n clipVector.multiplyScalar(2.0 / clipVector.dot(q))\n\n // replacing the third row of the projection matrix\n\n projectionMatrix.elements[2] = clipVector.x\n projectionMatrix.elements[6] = clipVector.y\n projectionMatrix.elements[10] = clipVector.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipVector.w\n }\n })()\n\n // This will update the texture matrix that is used for projective texture mapping in the shader.\n // see: http://developer.download.nvidia.com/assets/gamedev/docs/projective_texture_mapping.pdf\n\n function updateTextureMatrix(camera) {\n // this matrix does range mapping to [ 0, 1 ]\n\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n\n // we use \"Object Linear Texgen\", so we need to multiply the texture matrix T\n // (matrix above) with the projection and view matrix of the virtual camera\n // and the model matrix of the refractor\n\n textureMatrix.multiply(camera.projectionMatrix)\n textureMatrix.multiply(camera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n }\n\n //\n\n function render(renderer, scene, camera) {\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // avoid camera modification\n renderer.shadowMap.autoUpdate = false // avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'linear-srgb'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n renderer.setRenderTarget(currentRenderTarget)\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n // restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n //\n\n this.onBeforeRender = function (renderer, scene, camera) {\n // ensure refractors are rendered only once per frame\n\n if (camera.userData.refractor === true) return\n\n // avoid rendering when the refractor is viewed from behind\n\n if (!visible(camera) === true) return\n\n // update\n\n updateRefractorPlane()\n\n updateTextureMatrix(camera)\n\n updateVirtualCamera(camera)\n\n render(renderer, scene, camera)\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Refractor }\n"],"names":["visible","updateRefractorPlane","updateVirtualCamera"],"mappings":";;;;;;;;AAiBA,MAAM,aAAN,cAAwB,KAAK;AAAA,EA2D3B,YAAY,UAAU,UAAU,IAAI;AAClC,UAAM,QAAQ;AAEd,SAAK,cAAc;AAEnB,SAAK,OAAO;AACZ,SAAK,SAAS,IAAI,kBAAmB;AAErC,UAAM,QAAQ;AAEd,UAAM,QAAQ,QAAQ,UAAU,SAAY,IAAI,MAAM,QAAQ,KAAK,IAAI,IAAI,MAAM,OAAQ;AACzF,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,SAAS,QAAQ,UAAU,WAAU;AAC3C,UAAM,cAAc,QAAQ,gBAAgB,SAAY,QAAQ,cAAc;AAI9E,UAAM,gBAAgB,KAAK;AAC3B,kBAAc,mBAAmB;AACjC,kBAAc,SAAS,YAAY;AAInC,UAAM,iBAAiB,IAAI,MAAO;AAClC,UAAM,gBAAgB,IAAI,QAAS;AAInC,UAAM,eAAe,IAAI,kBAAkB,cAAc,eAAe;AAAA,MACtE,SAAS;AAAA,MACT,MAAM;AAAA,IACZ,CAAK;AAID,SAAK,WAAW,IAAI,eAAe;AAAA,MACjC,UAAU,cAAc,MAAM,OAAO,QAAQ;AAAA,MAC7C,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,MACvB,aAAa;AAAA;AAAA,IACnB,CAAK;AAED,SAAK,SAAS,SAAS,OAAO,EAAE,QAAQ;AACxC,SAAK,SAAS,SAAS,UAAU,EAAE,QAAQ,aAAa;AACxD,SAAK,SAAS,SAAS,eAAe,EAAE,QAAQ;AAIhD,UAAM,UAAW,WAAY;AAC3B,YAAM,yBAAyB,IAAI,QAAS;AAC5C,YAAM,sBAAsB,IAAI,QAAS;AACzC,YAAM,iBAAiB,IAAI,QAAS;AAEpC,YAAM,OAAO,IAAI,QAAS;AAC1B,YAAM,SAAS,IAAI,QAAS;AAE5B,aAAO,SAASA,SAAQ,QAAQ;AAC9B,+BAAuB,sBAAsB,MAAM,WAAW;AAC9D,4BAAoB,sBAAsB,OAAO,WAAW;AAE5D,aAAK,WAAW,wBAAwB,mBAAmB;AAE3D,uBAAe,gBAAgB,MAAM,WAAW;AAEhD,eAAO,IAAI,GAAG,GAAG,CAAC;AAClB,eAAO,aAAa,cAAc;AAElC,eAAO,KAAK,IAAI,MAAM,IAAI;AAAA,MAC3B;AAAA,IACP,EAAQ;AAEJ,UAAM,uBAAwB,WAAY;AACxC,YAAM,SAAS,IAAI,QAAS;AAC5B,YAAM,WAAW,IAAI,QAAS;AAC9B,YAAM,aAAa,IAAI,WAAY;AACnC,YAAM,QAAQ,IAAI,QAAS;AAE3B,aAAO,SAASC,wBAAuB;AACrC,cAAM,YAAY,UAAU,UAAU,YAAY,KAAK;AACvD,eAAO,IAAI,GAAG,GAAG,CAAC,EAAE,gBAAgB,UAAU,EAAE,UAAW;AAI3D,eAAO,OAAQ;AAEf,uBAAe,8BAA8B,QAAQ,QAAQ;AAAA,MAC9D;AAAA,IACP,EAAQ;AAEJ,UAAM,sBAAuB,WAAY;AACvC,YAAM,YAAY,IAAI,MAAO;AAC7B,YAAM,aAAa,IAAI,QAAS;AAChC,YAAM,IAAI,IAAI,QAAS;AAEvB,aAAO,SAASC,qBAAoB,QAAQ;AAC1C,sBAAc,YAAY,KAAK,OAAO,WAAW;AACjD,sBAAc,mBAAmB,KAAK,cAAc,WAAW,EAAE,OAAQ;AACzE,sBAAc,iBAAiB,KAAK,OAAO,gBAAgB;AAC3D,sBAAc,MAAM,OAAO;AAM3B,kBAAU,KAAK,cAAc;AAC7B,kBAAU,aAAa,cAAc,kBAAkB;AAEvD,mBAAW,IAAI,UAAU,OAAO,GAAG,UAAU,OAAO,GAAG,UAAU,OAAO,GAAG,UAAU,QAAQ;AAK7F,cAAM,mBAAmB,cAAc;AAEvC,UAAE,KAAK,KAAK,KAAK,WAAW,CAAC,IAAI,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC;AAC5F,UAAE,KAAK,KAAK,KAAK,WAAW,CAAC,IAAI,iBAAiB,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC;AAC5F,UAAE,IAAI;AACN,UAAE,KAAK,IAAM,iBAAiB,SAAS,EAAE,KAAK,iBAAiB,SAAS,EAAE;AAI1E,mBAAW,eAAe,IAAM,WAAW,IAAI,CAAC,CAAC;AAIjD,yBAAiB,SAAS,CAAC,IAAI,WAAW;AAC1C,yBAAiB,SAAS,CAAC,IAAI,WAAW;AAC1C,yBAAiB,SAAS,EAAE,IAAI,WAAW,IAAI,IAAM;AACrD,yBAAiB,SAAS,EAAE,IAAI,WAAW;AAAA,MAC5C;AAAA,IACP,EAAQ;AAKJ,aAAS,oBAAoB,QAAQ;AAGnC,oBAAc,IAAI,KAAK,GAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,GAAK,KAAK,KAAK,GAAK,GAAK,GAAK,CAAG;AAMhG,oBAAc,SAAS,OAAO,gBAAgB;AAC9C,oBAAc,SAAS,OAAO,kBAAkB;AAChD,oBAAc,SAAS,MAAM,WAAW;AAAA,IACzC;AAID,aAAS,OAAO,UAAU,OAAO,QAAQ;AACvC,YAAM,UAAU;AAEhB,YAAM,sBAAsB,SAAS,gBAAiB;AACtD,YAAM,mBAAmB,SAAS,GAAG;AACrC,YAAM,0BAA0B,SAAS,UAAU;AACnD,YAAM,qBAAqB,SAAS;AAEpC,UAAI,SAAS;AACb,UAAI,sBAAsB;AAAU,iBAAS,SAAS,qBAAqB;AAAA;AACtE,iBAAS,SAAS,mBAAmB;AAE1C,eAAS,GAAG,UAAU;AACtB,eAAS,UAAU,aAAa;AAChC,UAAI,sBAAsB;AAAU,iBAAS,mBAAmB;AAAA;AAC3D,iBAAS,iBAAiB;AAC/B,eAAS,cAAc;AAEvB,eAAS,gBAAgB,YAAY;AACrC,UAAI,SAAS,cAAc;AAAO,iBAAS,MAAO;AAClD,eAAS,OAAO,OAAO,aAAa;AAEpC,eAAS,GAAG,UAAU;AACtB,eAAS,UAAU,aAAa;AAChC,eAAS,cAAc;AACvB,eAAS,gBAAgB,mBAAmB;AAE5C,UAAI,sBAAsB;AAAU,iBAAS,mBAAmB,SAAS,SAAS;AAAA;AAC7E,iBAAS,iBAAiB,SAAS,OAAO;AAI/C,YAAM,WAAW,OAAO;AAExB,UAAI,aAAa,QAAW;AAC1B,iBAAS,MAAM,SAAS,QAAQ;AAAA,MACjC;AAED,YAAM,UAAU;AAAA,IACjB;AAID,SAAK,iBAAiB,SAAU,UAAU,OAAO,QAAQ;AAGvD,UAAI,OAAO,SAAS,cAAc;AAAM;AAIxC,UAAI,CAAC,QAAQ,MAAM,MAAM;AAAM;AAI/B,2BAAsB;AAEtB,0BAAoB,MAAM;AAE1B,0BAAoB,MAAM;AAE1B,aAAO,UAAU,OAAO,MAAM;AAAA,IAC/B;AAED,SAAK,kBAAkB,WAAY;AACjC,aAAO;AAAA,IACR;AAED,SAAK,UAAU,WAAY;AACzB,mBAAa,QAAS;AACtB,YAAM,SAAS,QAAS;AAAA,IACzB;AAAA,EACF;AACH;AA5RA,IAAM,YAAN;AACE,cADI,WACG,mBAAkB;AAAA,EACvB,UAAU;AAAA,IACR,OAAO;AAAA,MACL,OAAO;AAAA,IACR;AAAA,IAED,UAAU;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IAED,eAAe;AAAA,MACb,OAAO;AAAA,IACR;AAAA,EACF;AAAA,EAED;AAAA;AAAA,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAazB;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAyBhB,WAAW,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAGrD;"}
|
1
|
+
{"version":3,"file":"Refractor.js","sources":["../../src/objects/Refractor.js"],"sourcesContent":["import {\n Color,\n Matrix4,\n Mesh,\n PerspectiveCamera,\n Plane,\n Quaternion,\n ShaderMaterial,\n UniformsUtils,\n Vector3,\n Vector4,\n WebGLRenderTarget,\n NoToneMapping,\n HalfFloatType,\n} from 'three'\nimport { version } from '../_polyfill/constants'\n\nclass Refractor extends Mesh {\n static RefractorShader = {\n uniforms: {\n color: {\n value: null,\n },\n\n tDiffuse: {\n value: null,\n },\n\n textureMatrix: {\n value: null,\n },\n },\n\n vertexShader: /* glsl */ `\n\n\t\tuniform mat4 textureMatrix;\n\n\t\tvarying vec4 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec4 vUv;\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n\t\t}`,\n }\n\n constructor(geometry, options = {}) {\n super(geometry)\n\n this.isRefractor = true\n\n this.type = 'Refractor'\n this.camera = new PerspectiveCamera()\n\n const scope = this\n\n const color = options.color !== undefined ? new Color(options.color) : new Color(0x7f7f7f)\n const textureWidth = options.textureWidth || 512\n const textureHeight = options.textureHeight || 512\n const clipBias = options.clipBias || 0\n const shader = options.shader || Refractor.RefractorShader\n const multisample = options.multisample !== undefined ? options.multisample : 4\n\n //\n\n const virtualCamera = this.camera\n virtualCamera.matrixAutoUpdate = false\n virtualCamera.userData.refractor = true\n\n //\n\n const refractorPlane = new Plane()\n const textureMatrix = new Matrix4()\n\n // render target\n\n const renderTarget = new WebGLRenderTarget(textureWidth, textureHeight, {\n samples: multisample,\n type: HalfFloatType,\n })\n\n // material\n\n this.material = new ShaderMaterial({\n uniforms: UniformsUtils.clone(shader.uniforms),\n vertexShader: shader.vertexShader,\n fragmentShader: shader.fragmentShader,\n transparent: true, // ensures, refractors are drawn from farthest to closest\n })\n\n this.material.uniforms['color'].value = color\n this.material.uniforms['tDiffuse'].value = renderTarget.texture\n this.material.uniforms['textureMatrix'].value = textureMatrix\n\n // functions\n\n const visible = (function () {\n const refractorWorldPosition = new Vector3()\n const cameraWorldPosition = new Vector3()\n const rotationMatrix = new Matrix4()\n\n const view = new Vector3()\n const normal = new Vector3()\n\n return function visible(camera) {\n refractorWorldPosition.setFromMatrixPosition(scope.matrixWorld)\n cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld)\n\n view.subVectors(refractorWorldPosition, cameraWorldPosition)\n\n rotationMatrix.extractRotation(scope.matrixWorld)\n\n normal.set(0, 0, 1)\n normal.applyMatrix4(rotationMatrix)\n\n return view.dot(normal) < 0\n }\n })()\n\n const updateRefractorPlane = (function () {\n const normal = new Vector3()\n const position = new Vector3()\n const quaternion = new Quaternion()\n const scale = new Vector3()\n\n return function updateRefractorPlane() {\n scope.matrixWorld.decompose(position, quaternion, scale)\n normal.set(0, 0, 1).applyQuaternion(quaternion).normalize()\n\n // flip the normal because we want to cull everything above the plane\n\n normal.negate()\n\n refractorPlane.setFromNormalAndCoplanarPoint(normal, position)\n }\n })()\n\n const updateVirtualCamera = (function () {\n const clipPlane = new Plane()\n const clipVector = new Vector4()\n const q = new Vector4()\n\n return function updateVirtualCamera(camera) {\n virtualCamera.matrixWorld.copy(camera.matrixWorld)\n virtualCamera.matrixWorldInverse.copy(virtualCamera.matrixWorld).invert()\n virtualCamera.projectionMatrix.copy(camera.projectionMatrix)\n virtualCamera.far = camera.far // used in WebGLBackground\n\n // The following code creates an oblique view frustum for clipping.\n // see: Lengyel, Eric. “Oblique View Frustum Depth Projection and Clipping”.\n // Journal of Game Development, Vol. 1, No. 2 (2005), Charles River Media, pp. 5–16\n\n clipPlane.copy(refractorPlane)\n clipPlane.applyMatrix4(virtualCamera.matrixWorldInverse)\n\n clipVector.set(clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.constant)\n\n // calculate the clip-space corner point opposite the clipping plane and\n // transform it into camera space by multiplying it by the inverse of the projection matrix\n\n const projectionMatrix = virtualCamera.projectionMatrix\n\n q.x = (Math.sign(clipVector.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]\n q.y = (Math.sign(clipVector.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]\n q.z = -1.0\n q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]\n\n // calculate the scaled plane vector\n\n clipVector.multiplyScalar(2.0 / clipVector.dot(q))\n\n // replacing the third row of the projection matrix\n\n projectionMatrix.elements[2] = clipVector.x\n projectionMatrix.elements[6] = clipVector.y\n projectionMatrix.elements[10] = clipVector.z + 1.0 - clipBias\n projectionMatrix.elements[14] = clipVector.w\n }\n })()\n\n // This will update the texture matrix that is used for projective texture mapping in the shader.\n // see: http://developer.download.nvidia.com/assets/gamedev/docs/projective_texture_mapping.pdf\n\n function updateTextureMatrix(camera) {\n // this matrix does range mapping to [ 0, 1 ]\n\n textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n\n // we use \"Object Linear Texgen\", so we need to multiply the texture matrix T\n // (matrix above) with the projection and view matrix of the virtual camera\n // and the model matrix of the refractor\n\n textureMatrix.multiply(camera.projectionMatrix)\n textureMatrix.multiply(camera.matrixWorldInverse)\n textureMatrix.multiply(scope.matrixWorld)\n }\n\n //\n\n function render(renderer, scene, camera) {\n scope.visible = false\n\n const currentRenderTarget = renderer.getRenderTarget()\n const currentXrEnabled = renderer.xr.enabled\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate\n const currentToneMapping = renderer.toneMapping\n\n let isSRGB = false\n if ('outputColorSpace' in renderer) isSRGB = renderer.outputColorSpace === 'srgb'\n else isSRGB = renderer.outputEncoding === 3001 // sRGBEncoding\n\n renderer.xr.enabled = false // avoid camera modification\n renderer.shadowMap.autoUpdate = false // avoid re-computing shadows\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = 'srgb-linear'\n else renderer.outputEncoding = 3000 // LinearEncoding\n renderer.toneMapping = NoToneMapping\n\n renderer.setRenderTarget(renderTarget)\n if (renderer.autoClear === false) renderer.clear()\n renderer.render(scene, virtualCamera)\n\n renderer.xr.enabled = currentXrEnabled\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate\n renderer.toneMapping = currentToneMapping\n renderer.setRenderTarget(currentRenderTarget)\n\n if ('outputColorSpace' in renderer) renderer.outputColorSpace = isSRGB ? 'srgb' : 'srgb-linear'\n else renderer.outputEncoding = isSRGB ? 3001 : 3000\n\n // restore viewport\n\n const viewport = camera.viewport\n\n if (viewport !== undefined) {\n renderer.state.viewport(viewport)\n }\n\n scope.visible = true\n }\n\n //\n\n this.onBeforeRender = function (renderer, scene, camera) {\n // ensure refractors are rendered only once per frame\n\n if (camera.userData.refractor === true) return\n\n // avoid rendering when the refractor is viewed from behind\n\n if (!visible(camera) === true) return\n\n // update\n\n updateRefractorPlane()\n\n updateTextureMatrix(camera)\n\n updateVirtualCamera(camera)\n\n render(renderer, scene, camera)\n }\n\n this.getRenderTarget = function () {\n return renderTarget\n }\n\n this.dispose = function () {\n renderTarget.dispose()\n scope.material.dispose()\n }\n }\n}\n\nexport { Refractor }\n"],"names":["visible","updateRefractorPlane","updateVirtualCamera"],"mappings":"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"}
|