three-stdlib 2.14.0 → 2.14.3
Sign up to get free protection for your applications and to get access to all the features.
- package/geometries/TextGeometry.cjs.js +1 -1
- package/geometries/TextGeometry.d.ts +2 -0
- package/geometries/TextGeometry.js +6 -1
- package/index.cjs.js +1 -1
- package/lines/Line2.cjs.js +1 -1
- package/lines/Line2.d.ts +7 -5
- package/lines/Line2.js +2 -5
- package/lines/LineGeometry.cjs.js +1 -1
- package/lines/LineGeometry.d.ts +6 -8
- package/lines/LineGeometry.js +28 -39
- package/lines/LineMaterial.cjs.js +1 -1
- package/lines/LineMaterial.d.ts +23 -19
- package/lines/LineMaterial.js +263 -107
- package/lines/LineSegments2.cjs.js +1 -1
- package/lines/LineSegments2.d.ts +12 -20
- package/lines/LineSegments2.js +272 -125
- package/lines/LineSegmentsGeometry.cjs.js +1 -1
- package/lines/LineSegmentsGeometry.d.ts +18 -16
- package/lines/LineSegmentsGeometry.js +30 -40
- package/lines/Wireframe.cjs.js +1 -1
- package/lines/Wireframe.js +39 -39
- package/lines/WireframeGeometry2.cjs.js +1 -1
- package/lines/WireframeGeometry2.js +8 -9
- package/loaders/FontLoader.cjs.js +1 -1
- package/loaders/FontLoader.d.ts +2 -5
- package/loaders/FontLoader.js +9 -16
- package/loaders/RGBELoader.cjs.js +1 -1
- package/loaders/RGBELoader.js +1 -9
- package/package.json +1 -1
package/lines/Wireframe.js
CHANGED
@@ -1,45 +1,45 @@
|
|
1
|
-
import {
|
1
|
+
import { Vector3, Mesh, InstancedInterleavedBuffer, InterleavedBufferAttribute } from 'three';
|
2
2
|
import { LineSegmentsGeometry } from './LineSegmentsGeometry.js';
|
3
3
|
import { LineMaterial } from './LineMaterial.js';
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
const _start = new Vector3();
|
6
|
+
|
7
|
+
const _end = new Vector3();
|
8
|
+
|
9
|
+
class Wireframe extends Mesh {
|
10
|
+
constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({
|
10
11
|
color: Math.random() * 0xffffff
|
11
|
-
})
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
});
|
12
|
+
})) {
|
13
|
+
super(geometry, material);
|
14
|
+
this.isWireframe = true;
|
15
|
+
this.type = 'Wireframe';
|
16
|
+
} // for backwards-compatibility, but could be a method of LineSegmentsGeometry...
|
17
|
+
|
18
|
+
|
19
|
+
computeLineDistances() {
|
20
|
+
const geometry = this.geometry;
|
21
|
+
const instanceStart = geometry.attributes.instanceStart;
|
22
|
+
const instanceEnd = geometry.attributes.instanceEnd;
|
23
|
+
const lineDistances = new Float32Array(2 * instanceStart.count);
|
24
|
+
|
25
|
+
for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {
|
26
|
+
_start.fromBufferAttribute(instanceStart, i);
|
27
|
+
|
28
|
+
_end.fromBufferAttribute(instanceEnd, i);
|
29
|
+
|
30
|
+
lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1];
|
31
|
+
lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end);
|
32
|
+
}
|
33
|
+
|
34
|
+
const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1); // d0, d1
|
35
|
+
|
36
|
+
geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)); // d0
|
37
|
+
|
38
|
+
geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)); // d1
|
39
|
+
|
40
|
+
return this;
|
41
|
+
}
|
42
|
+
|
43
|
+
}
|
44
44
|
|
45
45
|
export { Wireframe };
|
@@ -1 +1 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("./LineSegmentsGeometry.cjs.js");
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("./LineSegmentsGeometry.cjs.js");class t extends r.LineSegmentsGeometry{constructor(r){super(),this.isWireframeGeometry2=!0,this.type="WireframeGeometry2",this.fromWireframeGeometry(new e.WireframeGeometry(r))}}exports.WireframeGeometry2=t;
|
@@ -1,15 +1,14 @@
|
|
1
1
|
import { WireframeGeometry } from 'three';
|
2
2
|
import { LineSegmentsGeometry } from './LineSegmentsGeometry.js';
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
class WireframeGeometry2 extends LineSegmentsGeometry {
|
5
|
+
constructor(geometry) {
|
6
|
+
super();
|
7
|
+
this.isWireframeGeometry2 = true;
|
8
|
+
this.type = 'WireframeGeometry2';
|
9
|
+
this.fromWireframeGeometry(new WireframeGeometry(geometry)); // set colors, maybe
|
10
|
+
}
|
9
11
|
|
10
|
-
|
11
|
-
constructor: WireframeGeometry2,
|
12
|
-
isWireframeGeometry2: true
|
13
|
-
});
|
12
|
+
}
|
14
13
|
|
15
14
|
export { WireframeGeometry2 };
|
@@ -1 +1 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/defineProperty"),t=require("three");function
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/defineProperty"),t=require("three");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=r(e);class n extends t.Loader{constructor(e){super(e)}load(e,r,s,n){const a=new t.FileLoader(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,(e=>{if("string"!=typeof e)throw new Error("unsupported data type");const t=JSON.parse(e),s=this.parse(t);r&&r(s)}),s,n)}parse(e){return new a(e)}}class a{constructor(e){s.default(this,"data",void 0),this.data=e}generateShapes(e,t=100,r){const s=[],n={letterSpacing:0,lineHeight:1,...r},a=function(e,t,r,s){const n=Array.from(e),a=t/r.resolution,i=(r.boundingBox.yMax-r.boundingBox.yMin+r.underlineThickness)*a,p=[];let l=0,u=0;for(let e=0;e<n.length;e++){const t=n[e];if("\n"===t)l=0,u-=i*s.lineHeight;else{const e=o(t,a,l,u,r);e&&(l+=e.offsetX+s.letterSpacing,p.push(e.path))}}return p}(e,t,this.data,n);for(let e=0,t=a.length;e<t;e++)Array.prototype.push.apply(s,a[e].toShapes(!1));return s}}function o(e,r,s,n,a){const o=a.glyphs[e]||a.glyphs["?"];if(!o)return void console.error('THREE.Font: character "'+e+'" does not exists in font family '+a.familyName+".");const i=new t.ShapePath;let p,l,u,c,h,d,f,y;if(o.o){const e=o._cachedOutline||(o._cachedOutline=o.o.split(" "));for(let t=0,a=e.length;t<a;){switch(e[t++]){case"m":p=parseInt(e[t++])*r+s,l=parseInt(e[t++])*r+n,i.moveTo(p,l);break;case"l":p=parseInt(e[t++])*r+s,l=parseInt(e[t++])*r+n,i.lineTo(p,l);break;case"q":u=parseInt(e[t++])*r+s,c=parseInt(e[t++])*r+n,h=parseInt(e[t++])*r+s,d=parseInt(e[t++])*r+n,i.quadraticCurveTo(h,d,u,c);break;case"b":u=parseInt(e[t++])*r+s,c=parseInt(e[t++])*r+n,h=parseInt(e[t++])*r+s,d=parseInt(e[t++])*r+n,f=parseInt(e[t++])*r+s,y=parseInt(e[t++])*r+n,i.bezierCurveTo(h,d,f,y,u,c)}}}return{offsetX:o.ha*r,path:i}}s.default(a,"isFont",void 0),s.default(a,"type",void 0),exports.Font=a,exports.FontLoader=n;
|
package/loaders/FontLoader.d.ts
CHANGED
@@ -5,11 +5,9 @@ declare type Options = {
|
|
5
5
|
letterSpacing: number;
|
6
6
|
};
|
7
7
|
export declare class FontLoader extends Loader {
|
8
|
-
options: Options;
|
9
8
|
constructor(manager?: LoadingManager);
|
10
9
|
load(url: string, onLoad?: (responseFont: Font) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
|
11
10
|
parse(json: FontData): Font;
|
12
|
-
setOptions(options: Partial<Options>): void;
|
13
11
|
}
|
14
12
|
declare type Glyph = {
|
15
13
|
_cachedOutline: string[];
|
@@ -30,10 +28,9 @@ declare type FontData = {
|
|
30
28
|
};
|
31
29
|
export declare class Font {
|
32
30
|
data: FontData;
|
33
|
-
options: Options;
|
34
31
|
static isFont: true;
|
35
32
|
static type: 'Font';
|
36
|
-
constructor(data: FontData
|
37
|
-
generateShapes(text: string, size?: number): Shape[];
|
33
|
+
constructor(data: FontData);
|
34
|
+
generateShapes(text: string, size?: number, _options?: Partial<Options>): Shape[];
|
38
35
|
}
|
39
36
|
export {};
|
package/loaders/FontLoader.js
CHANGED
@@ -4,11 +4,6 @@ import { Loader, FileLoader, ShapePath } from 'three';
|
|
4
4
|
class FontLoader extends Loader {
|
5
5
|
constructor(manager) {
|
6
6
|
super(manager);
|
7
|
-
|
8
|
-
_defineProperty(this, "options", {
|
9
|
-
lineHeight: 1,
|
10
|
-
letterSpacing: 0
|
11
|
-
});
|
12
7
|
}
|
13
8
|
|
14
9
|
load(url, onLoad, onProgress, onError) {
|
@@ -25,27 +20,25 @@ class FontLoader extends Loader {
|
|
25
20
|
}
|
26
21
|
|
27
22
|
parse(json) {
|
28
|
-
return new Font(json
|
29
|
-
}
|
30
|
-
|
31
|
-
setOptions(options) {
|
32
|
-
Object.assign(this.options, options);
|
23
|
+
return new Font(json);
|
33
24
|
}
|
34
25
|
|
35
26
|
}
|
36
27
|
class Font {
|
37
|
-
constructor(data
|
28
|
+
constructor(data) {
|
38
29
|
_defineProperty(this, "data", void 0);
|
39
30
|
|
40
|
-
_defineProperty(this, "options", void 0);
|
41
|
-
|
42
31
|
this.data = data;
|
43
|
-
this.options = options;
|
44
32
|
}
|
45
33
|
|
46
|
-
generateShapes(text, size = 100) {
|
34
|
+
generateShapes(text, size = 100, _options) {
|
47
35
|
const shapes = [];
|
48
|
-
const
|
36
|
+
const options = {
|
37
|
+
letterSpacing: 0,
|
38
|
+
lineHeight: 1,
|
39
|
+
..._options
|
40
|
+
};
|
41
|
+
const paths = createPaths(text, size, this.data, options);
|
49
42
|
|
50
43
|
for (let p = 0, pl = paths.length; p < pl; p++) {
|
51
44
|
Array.prototype.push.apply(shapes, paths[p].toShapes(false));
|
@@ -1 +1 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");class t extends e.DataTextureLoader{constructor(t){super(t),this.type=e.HalfFloatType}parse(t){const r=function(e,t){switch(e){case 1:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(t||""))}return-1},a=function(e,t,r){t=t||1024;let a=e.pos,n=-1,o=0,s="",i=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));for(;0>(n=i.indexOf("\n"))&&o<t&&a<e.byteLength;)s+=i,o+=i.length,a+=128,i+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));return-1<n&&(!1!==r&&(e.pos+=o+n+1),s+i.slice(0,n))},n=function(e,t,r,a){const n=e[t+3],o=Math.pow(2,n-128)/255;r[a+0]=e[t+0]*o,r[a+1]=e[t+1]*o,r[a+2]=e[t+2]*o,r[a+3]=1},o=function(t,r,a,n){const o=t[r+3],s=Math.pow(2,o-128)/255;a[n+0]=e.DataUtils.toHalfFloat(Math.min(t[r+0]*s,65504)),a[n+1]=e.DataUtils.toHalfFloat(Math.min(t[r+1]*s,65504)),a[n+2]=e.DataUtils.toHalfFloat(Math.min(t[r+2]*s,65504)),a[n+3]=e.DataUtils.toHalfFloat(1)},s=new Uint8Array(t);s.pos=0;const i=function(e){const t=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,n=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,o=/^\s*FORMAT=(\S+)\s*$/,s=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,i={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let l,c;if(e.pos>=e.byteLength||!(l=a(e)))return r(1,"no header found");if(!(c=l.match(/^#\?(\S+)/)))return r(3,"bad initial token");for(i.valid|=1,i.programtype=c[1],i.string+=l+"\n";l=a(e),!1!==l;)if(i.string+=l+"\n","#"!==l.charAt(0)){if((c=l.match(t))&&(i.gamma=parseFloat(c[1])),(c=l.match(n))&&(i.exposure=parseFloat(c[1])),(c=l.match(o))&&(i.valid|=2,i.format=c[1]),(c=l.match(s))&&(i.valid|=4,i.height=parseInt(c[1],10),i.width=parseInt(c[2],10)),2&i.valid&&4&i.valid)break}else i.comments+=l+"\n";return 2&i.valid?4&i.valid?i:r(3,"missing image size specifier"):r(3,"missing format specifier")}(s);if(-1!==i){const t=i.width,a=i.height,l=function(e,t,a){const n=t;if(n<8||n>32767||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(n!==(e[2]<<8|e[3]))return r(3,"wrong scanline width");const o=new Uint8Array(4*t*a);if(!o.length)return r(4,"unable to allocate buffer space");let s=0,i=0;const l=4*n,c=new Uint8Array(4),f=new Uint8Array(l);let p=a;for(;p>0&&i<e.byteLength;){if(i+4>e.byteLength)return r(1);if(c[0]=e[i++],c[1]=e[i++],c[2]=e[i++],c[3]=e[i++],2!=c[0]||2!=c[1]||(c[2]<<8|c[3])!=n)return r(3,"bad rgbe scanline format");let t,a=0;for(;a<l&&i<e.byteLength;){t=e[i++];const n=t>128;if(n&&(t-=128),0===t||a+t>l)return r(3,"bad scanline data");if(n){const r=e[i++];for(let e=0;e<t;e++)f[a++]=r}else f.set(e.subarray(i,i+t),a),a+=t,i+=t}const d=n;for(let e=0;e<d;e++){let t=0;o[s]=f[e+t],t+=n,o[s+1]=f[e+t],t+=n,o[s+2]=f[e+t],t+=n,o[s+3]=f[e+t],s+=4}p--}return o}(s.subarray(s.pos),t,a);if(-1!==l){let r,s,c
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");class t extends e.DataTextureLoader{constructor(t){super(t),this.type=e.HalfFloatType}parse(t){const r=function(e,t){switch(e){case 1:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(t||""))}return-1},a=function(e,t,r){t=t||1024;let a=e.pos,n=-1,o=0,s="",i=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));for(;0>(n=i.indexOf("\n"))&&o<t&&a<e.byteLength;)s+=i,o+=i.length,a+=128,i+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(a,a+128)));return-1<n&&(!1!==r&&(e.pos+=o+n+1),s+i.slice(0,n))},n=function(e,t,r,a){const n=e[t+3],o=Math.pow(2,n-128)/255;r[a+0]=e[t+0]*o,r[a+1]=e[t+1]*o,r[a+2]=e[t+2]*o,r[a+3]=1},o=function(t,r,a,n){const o=t[r+3],s=Math.pow(2,o-128)/255;a[n+0]=e.DataUtils.toHalfFloat(Math.min(t[r+0]*s,65504)),a[n+1]=e.DataUtils.toHalfFloat(Math.min(t[r+1]*s,65504)),a[n+2]=e.DataUtils.toHalfFloat(Math.min(t[r+2]*s,65504)),a[n+3]=e.DataUtils.toHalfFloat(1)},s=new Uint8Array(t);s.pos=0;const i=function(e){const t=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,n=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,o=/^\s*FORMAT=(\S+)\s*$/,s=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,i={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let l,c;if(e.pos>=e.byteLength||!(l=a(e)))return r(1,"no header found");if(!(c=l.match(/^#\?(\S+)/)))return r(3,"bad initial token");for(i.valid|=1,i.programtype=c[1],i.string+=l+"\n";l=a(e),!1!==l;)if(i.string+=l+"\n","#"!==l.charAt(0)){if((c=l.match(t))&&(i.gamma=parseFloat(c[1])),(c=l.match(n))&&(i.exposure=parseFloat(c[1])),(c=l.match(o))&&(i.valid|=2,i.format=c[1]),(c=l.match(s))&&(i.valid|=4,i.height=parseInt(c[1],10),i.width=parseInt(c[2],10)),2&i.valid&&4&i.valid)break}else i.comments+=l+"\n";return 2&i.valid?4&i.valid?i:r(3,"missing image size specifier"):r(3,"missing format specifier")}(s);if(-1!==i){const t=i.width,a=i.height,l=function(e,t,a){const n=t;if(n<8||n>32767||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(n!==(e[2]<<8|e[3]))return r(3,"wrong scanline width");const o=new Uint8Array(4*t*a);if(!o.length)return r(4,"unable to allocate buffer space");let s=0,i=0;const l=4*n,c=new Uint8Array(4),f=new Uint8Array(l);let p=a;for(;p>0&&i<e.byteLength;){if(i+4>e.byteLength)return r(1);if(c[0]=e[i++],c[1]=e[i++],c[2]=e[i++],c[3]=e[i++],2!=c[0]||2!=c[1]||(c[2]<<8|c[3])!=n)return r(3,"bad rgbe scanline format");let t,a=0;for(;a<l&&i<e.byteLength;){t=e[i++];const n=t>128;if(n&&(t-=128),0===t||a+t>l)return r(3,"bad scanline data");if(n){const r=e[i++];for(let e=0;e<t;e++)f[a++]=r}else f.set(e.subarray(i,i+t),a),a+=t,i+=t}const d=n;for(let e=0;e<d;e++){let t=0;o[s]=f[e+t],t+=n,o[s+1]=f[e+t],t+=n,o[s+2]=f[e+t],t+=n,o[s+3]=f[e+t],s+=4}p--}return o}(s.subarray(s.pos),t,a);if(-1!==l){let r,s,c;switch(this.type){case e.FloatType:c=l.length/4;const t=new Float32Array(4*c);for(let e=0;e<c;e++)n(l,4*e,t,4*e);r=t,s=e.FloatType;break;case e.HalfFloatType:c=l.length/4;const a=new Uint16Array(4*c);for(let e=0;e<c;e++)o(l,4*e,a,4*e);r=a,s=e.HalfFloatType;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type)}return{width:t,height:a,data:r,header:i.string,gamma:i.gamma,exposure:i.exposure,type:s}}}return null}setDataType(e){return this.type=e,this}load(t,r,a,n){return super.load(t,(function(t,a){switch(t.type){case e.FloatType:case e.HalfFloatType:t.encoding=e.LinearEncoding,t.minFilter=e.LinearFilter,t.magFilter=e.LinearFilter,t.generateMipmaps=!1,t.flipY=!0}r&&r(t,a)}),a,n)}}exports.RGBELoader=t;
|
package/loaders/RGBELoader.js
CHANGED
@@ -304,7 +304,7 @@ class RGBELoader extends DataTextureLoader {
|
|
304
304
|
image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h);
|
305
305
|
|
306
306
|
if (RGBE_RETURN_FAILURE !== image_rgba_data) {
|
307
|
-
let data,
|
307
|
+
let data, type;
|
308
308
|
let numElements;
|
309
309
|
|
310
310
|
switch (this.type) {
|
@@ -344,7 +344,6 @@ class RGBELoader extends DataTextureLoader {
|
|
344
344
|
header: rgbe_header_info.string,
|
345
345
|
gamma: rgbe_header_info.gamma,
|
346
346
|
exposure: rgbe_header_info.exposure,
|
347
|
-
format: format,
|
348
347
|
type: type
|
349
348
|
};
|
350
349
|
}
|
@@ -362,13 +361,6 @@ class RGBELoader extends DataTextureLoader {
|
|
362
361
|
function onLoadCallback(texture, texData) {
|
363
362
|
switch (texture.type) {
|
364
363
|
case FloatType:
|
365
|
-
texture.encoding = LinearEncoding;
|
366
|
-
texture.minFilter = LinearFilter;
|
367
|
-
texture.magFilter = LinearFilter;
|
368
|
-
texture.generateMipmaps = false;
|
369
|
-
texture.flipY = true;
|
370
|
-
break;
|
371
|
-
|
372
364
|
case HalfFloatType:
|
373
365
|
texture.encoding = LinearEncoding;
|
374
366
|
texture.minFilter = LinearFilter;
|