super-three 0.161.0 → 0.163.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +822 -1332
- package/build/three.module.js +820 -1328
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/DragControls.js +91 -30
- package/examples/jsm/controls/OrbitControls.js +32 -6
- package/examples/jsm/controls/TransformControls.js +9 -9
- package/examples/jsm/exporters/GLTFExporter.js +30 -3
- package/examples/jsm/exporters/USDZExporter.js +15 -0
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/interactive/InteractiveGroup.js +15 -25
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/libs/tween.module.js +32 -14
- package/examples/jsm/lines/LineMaterial.js +0 -2
- package/examples/jsm/loaders/3DMLoader.js +13 -21
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/EXRLoader.js +89 -19
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +6 -0
- package/examples/jsm/loaders/KTX2Loader.js +2 -6
- package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
- package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
- package/examples/jsm/loaders/LUTImageLoader.js +0 -14
- package/examples/jsm/loaders/RGBMLoader.js +16 -0
- package/examples/jsm/loaders/VOXLoader.js +9 -2
- package/examples/jsm/loaders/VRMLLoader.js +6 -2
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
- package/examples/jsm/nodes/Nodes.js +15 -8
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
- package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
- package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
- package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
- package/examples/jsm/nodes/accessors/MorphNode.js +20 -10
- package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
- package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
- package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
- package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
- package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
- package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
- package/examples/jsm/nodes/code/CodeNode.js +6 -0
- package/examples/jsm/nodes/core/AssignNode.js +68 -12
- package/examples/jsm/nodes/core/Node.js +67 -6
- package/examples/jsm/nodes/core/NodeBuilder.js +23 -24
- package/examples/jsm/nodes/core/NodeFrame.js +8 -8
- package/examples/jsm/nodes/core/NodeUtils.js +2 -2
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/UniformNode.js +20 -0
- package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
- package/examples/jsm/nodes/display/PassNode.js +17 -1
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
- package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
- package/examples/jsm/nodes/fog/FogNode.js +13 -3
- package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
- package/examples/jsm/nodes/materials/NodeMaterial.js +70 -17
- package/examples/jsm/nodes/math/CondNode.js +42 -7
- package/examples/jsm/nodes/math/MathNode.js +20 -0
- package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
- package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
- package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
- package/examples/jsm/nodes/utils/LoopNode.js +2 -0
- package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
- package/examples/jsm/objects/QuadMesh.js +7 -23
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/GlitchPass.js +0 -3
- package/examples/jsm/postprocessing/LUTPass.js +5 -71
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SSAOPass.js +0 -3
- package/examples/jsm/renderers/common/Animation.js +3 -0
- package/examples/jsm/renderers/common/Background.js +3 -3
- package/examples/jsm/renderers/common/ClippingContext.js +165 -0
- package/examples/jsm/renderers/common/Info.js +11 -19
- package/examples/jsm/renderers/common/PostProcessing.js +12 -4
- package/examples/jsm/renderers/common/RenderContext.js +3 -1
- package/examples/jsm/renderers/common/RenderContexts.js +2 -13
- package/examples/jsm/renderers/common/RenderObject.js +46 -3
- package/examples/jsm/renderers/common/RenderObjects.js +2 -0
- package/examples/jsm/renderers/common/Renderer.js +113 -39
- package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
- package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +3 -13
- package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
- package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +6 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +174 -30
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +136 -11
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +8 -2
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +90 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +67 -37
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +20 -43
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +32 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +94 -20
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/utils/GPUStatsPanel.js +10 -45
- package/examples/jsm/utils/SkeletonUtils.js +14 -3
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/examples/jsm/webxr/VRButton.js +13 -5
- package/examples/jsm/webxr/XRButton.js +0 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
- package/package.json +4 -3
- package/src/Three.Legacy.js +20 -0
- package/src/Three.js +0 -2
- package/src/animation/AnimationClip.js +1 -1
- package/src/constants.js +4 -7
- package/src/core/BufferAttribute.js +0 -11
- package/src/core/BufferGeometry.js +23 -29
- package/src/core/Object3D.js +21 -7
- package/src/core/Raycaster.js +18 -4
- package/src/core/RenderTarget.js +44 -21
- package/src/extras/PMREMGenerator.js +11 -0
- package/src/extras/curves/EllipseCurve.js +2 -2
- package/src/helpers/SpotLightHelper.js +18 -1
- package/src/loaders/DataTextureLoader.js +0 -4
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +4 -1
- package/src/materials/Material.js +2 -1
- package/src/materials/MeshBasicMaterial.js +3 -0
- package/src/materials/MeshLambertMaterial.js +3 -0
- package/src/materials/MeshPhongMaterial.js +3 -0
- package/src/materials/MeshStandardMaterial.js +3 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/math/Quaternion.js +13 -12
- package/src/math/Spherical.js +4 -5
- package/src/math/Vector3.js +7 -7
- package/src/objects/BatchedMesh.js +4 -3
- package/src/objects/InstancedMesh.js +63 -0
- package/src/objects/Mesh.js +0 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -10
- package/src/renderers/WebGLRenderer.js +70 -136
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
- package/src/renderers/shaders/ShaderChunk.js +2 -0
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib.js +3 -2
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +6 -33
- package/src/renderers/webgl/WebGLBackground.js +18 -0
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLCapabilities.js +2 -12
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +4 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLLights.js +6 -32
- package/src/renderers/webgl/WebGLMaterials.js +26 -4
- package/src/renderers/webgl/WebGLMorphtargets.js +79 -210
- package/src/renderers/webgl/WebGLProgram.js +30 -48
- package/src/renderers/webgl/WebGLPrograms.js +5 -14
- package/src/renderers/webgl/WebGLRenderStates.js +8 -6
- package/src/renderers/webgl/WebGLState.js +21 -75
- package/src/renderers/webgl/WebGLTextures.js +143 -275
- package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
- package/src/renderers/webgl/WebGLUtils.js +6 -57
- package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/scenes/Scene.js +14 -0
- package/src/textures/Texture.js +6 -24
- package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- package/src/renderers/WebGL1Renderer.js +0 -7
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
|
Binary file
|
|
@@ -413,18 +413,21 @@ var Tween = /** @class */ (function () {
|
|
|
413
413
|
Tween.prototype.isPaused = function () {
|
|
414
414
|
return this._isPaused;
|
|
415
415
|
};
|
|
416
|
+
Tween.prototype.getDuration = function () {
|
|
417
|
+
return this._duration;
|
|
418
|
+
};
|
|
416
419
|
Tween.prototype.to = function (target, duration) {
|
|
417
420
|
if (duration === void 0) { duration = 1000; }
|
|
418
421
|
if (this._isPlaying)
|
|
419
422
|
throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.');
|
|
420
423
|
this._valuesEnd = target;
|
|
421
424
|
this._propertiesAreSetUp = false;
|
|
422
|
-
this._duration = duration;
|
|
425
|
+
this._duration = duration < 0 ? 0 : duration;
|
|
423
426
|
return this;
|
|
424
427
|
};
|
|
425
428
|
Tween.prototype.duration = function (duration) {
|
|
426
429
|
if (duration === void 0) { duration = 1000; }
|
|
427
|
-
this._duration = duration;
|
|
430
|
+
this._duration = duration < 0 ? 0 : duration;
|
|
428
431
|
return this;
|
|
429
432
|
};
|
|
430
433
|
Tween.prototype.dynamic = function (dynamic) {
|
|
@@ -673,12 +676,13 @@ var Tween = /** @class */ (function () {
|
|
|
673
676
|
* it is still playing, just paused).
|
|
674
677
|
*/
|
|
675
678
|
Tween.prototype.update = function (time, autoStart) {
|
|
679
|
+
var _this = this;
|
|
680
|
+
var _a;
|
|
676
681
|
if (time === void 0) { time = now(); }
|
|
677
682
|
if (autoStart === void 0) { autoStart = true; }
|
|
678
683
|
if (this._isPaused)
|
|
679
684
|
return true;
|
|
680
685
|
var property;
|
|
681
|
-
var elapsed;
|
|
682
686
|
var endTime = this._startTime + this._duration;
|
|
683
687
|
if (!this._goToEnd && !this._isPlaying) {
|
|
684
688
|
if (time > endTime)
|
|
@@ -702,18 +706,37 @@ var Tween = /** @class */ (function () {
|
|
|
702
706
|
}
|
|
703
707
|
this._onEveryStartCallbackFired = true;
|
|
704
708
|
}
|
|
705
|
-
|
|
706
|
-
|
|
709
|
+
var elapsedTime = time - this._startTime;
|
|
710
|
+
var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);
|
|
711
|
+
var totalTime = this._duration + this._repeat * durationAndDelay;
|
|
712
|
+
var calculateElapsedPortion = function () {
|
|
713
|
+
if (_this._duration === 0)
|
|
714
|
+
return 1;
|
|
715
|
+
if (elapsedTime > totalTime) {
|
|
716
|
+
return 1;
|
|
717
|
+
}
|
|
718
|
+
var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);
|
|
719
|
+
var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;
|
|
720
|
+
// TODO use %?
|
|
721
|
+
// const timeIntoCurrentRepeat = elapsedTime % durationAndDelay
|
|
722
|
+
var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);
|
|
723
|
+
if (portion === 0 && elapsedTime === _this._duration) {
|
|
724
|
+
return 1;
|
|
725
|
+
}
|
|
726
|
+
return portion;
|
|
727
|
+
};
|
|
728
|
+
var elapsed = calculateElapsedPortion();
|
|
707
729
|
var value = this._easingFunction(elapsed);
|
|
708
730
|
// properties transformations
|
|
709
731
|
this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);
|
|
710
732
|
if (this._onUpdateCallback) {
|
|
711
733
|
this._onUpdateCallback(this._object, elapsed);
|
|
712
734
|
}
|
|
713
|
-
if (
|
|
735
|
+
if (this._duration === 0 || elapsedTime >= this._duration) {
|
|
714
736
|
if (this._repeat > 0) {
|
|
737
|
+
var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);
|
|
715
738
|
if (isFinite(this._repeat)) {
|
|
716
|
-
this._repeat
|
|
739
|
+
this._repeat -= completeCount;
|
|
717
740
|
}
|
|
718
741
|
// Reassign starting values, restart by making startTime = now
|
|
719
742
|
for (property in this._valuesStartRepeat) {
|
|
@@ -731,12 +754,7 @@ var Tween = /** @class */ (function () {
|
|
|
731
754
|
if (this._yoyo) {
|
|
732
755
|
this._reversed = !this._reversed;
|
|
733
756
|
}
|
|
734
|
-
|
|
735
|
-
this._startTime = time + this._repeatDelayTime;
|
|
736
|
-
}
|
|
737
|
-
else {
|
|
738
|
-
this._startTime = time + this._delayTime;
|
|
739
|
-
}
|
|
757
|
+
this._startTime += durationAndDelay * completeCount;
|
|
740
758
|
if (this._onRepeatCallback) {
|
|
741
759
|
this._onRepeatCallback(this._object);
|
|
742
760
|
}
|
|
@@ -812,7 +830,7 @@ var Tween = /** @class */ (function () {
|
|
|
812
830
|
return Tween;
|
|
813
831
|
}());
|
|
814
832
|
|
|
815
|
-
var VERSION = '
|
|
833
|
+
var VERSION = '23.1.1';
|
|
816
834
|
|
|
817
835
|
/**
|
|
818
836
|
* Tween.js - Licensed under the MIT license
|
|
@@ -603,12 +603,10 @@ class LineMaterial extends ShaderMaterial {
|
|
|
603
603
|
if ( value === true ) {
|
|
604
604
|
|
|
605
605
|
this.defines.USE_ALPHA_TO_COVERAGE = '';
|
|
606
|
-
this.extensions.derivatives = true;
|
|
607
606
|
|
|
608
607
|
} else {
|
|
609
608
|
|
|
610
609
|
delete this.defines.USE_ALPHA_TO_COVERAGE;
|
|
611
|
-
this.extensions.derivatives = false;
|
|
612
610
|
|
|
613
611
|
}
|
|
614
612
|
|
|
@@ -192,6 +192,7 @@ class Rhino3dmLoader extends Loader {
|
|
|
192
192
|
mat.color.g = material.color.g;
|
|
193
193
|
mat.color.b = material.color.b;
|
|
194
194
|
mat.type = material.type;
|
|
195
|
+
mat.vertexColors = material.vertexColors;
|
|
195
196
|
|
|
196
197
|
const json = JSON.stringify( mat );
|
|
197
198
|
|
|
@@ -205,6 +206,7 @@ class Rhino3dmLoader extends Loader {
|
|
|
205
206
|
_mat.color.g = m.color.g;
|
|
206
207
|
_mat.color.b = m.color.b;
|
|
207
208
|
_mat.type = m.type;
|
|
209
|
+
_mat.vertexColors = m.vertexColors;
|
|
208
210
|
|
|
209
211
|
if ( JSON.stringify( _mat ) === json ) {
|
|
210
212
|
|
|
@@ -488,7 +490,7 @@ class Rhino3dmLoader extends Loader {
|
|
|
488
490
|
|
|
489
491
|
default:
|
|
490
492
|
|
|
491
|
-
let matId;
|
|
493
|
+
let matId = null;
|
|
492
494
|
|
|
493
495
|
switch ( attributes.materialSource.name ) {
|
|
494
496
|
|
|
@@ -498,10 +500,6 @@ class Rhino3dmLoader extends Loader {
|
|
|
498
500
|
|
|
499
501
|
matId = data.layers[ attributes.layerIndex ].renderMaterialIndex;
|
|
500
502
|
|
|
501
|
-
} else {
|
|
502
|
-
|
|
503
|
-
matId = null;
|
|
504
|
-
|
|
505
503
|
}
|
|
506
504
|
|
|
507
505
|
break;
|
|
@@ -512,17 +510,13 @@ class Rhino3dmLoader extends Loader {
|
|
|
512
510
|
|
|
513
511
|
matId = attributes.materialIndex;
|
|
514
512
|
|
|
515
|
-
} else {
|
|
516
|
-
|
|
517
|
-
matId = null;
|
|
518
|
-
|
|
519
513
|
}
|
|
520
514
|
|
|
521
515
|
break;
|
|
522
516
|
|
|
523
517
|
}
|
|
524
518
|
|
|
525
|
-
let material;
|
|
519
|
+
let material = null;
|
|
526
520
|
|
|
527
521
|
if ( matId >= 0 ) {
|
|
528
522
|
|
|
@@ -530,13 +524,8 @@ class Rhino3dmLoader extends Loader {
|
|
|
530
524
|
material = this._createMaterial( rMaterial, data.renderEnvironment );
|
|
531
525
|
|
|
532
526
|
|
|
533
|
-
} else {
|
|
534
|
-
|
|
535
|
-
material = this._createMaterial();
|
|
536
|
-
|
|
537
527
|
}
|
|
538
528
|
|
|
539
|
-
material = this._compareMaterials( material );
|
|
540
529
|
const _object = this._createObject( obj, material );
|
|
541
530
|
|
|
542
531
|
if ( _object === undefined ) {
|
|
@@ -675,19 +664,22 @@ class Rhino3dmLoader extends Loader {
|
|
|
675
664
|
|
|
676
665
|
geometry = loader.parse( obj.geometry );
|
|
677
666
|
|
|
678
|
-
if ( geometry.attributes.hasOwnProperty( 'color' ) ) {
|
|
679
667
|
|
|
680
|
-
|
|
668
|
+
if ( mat === null ) {
|
|
669
|
+
|
|
670
|
+
mat = this._createMaterial();
|
|
681
671
|
|
|
682
672
|
}
|
|
683
673
|
|
|
684
|
-
if ( mat === null ) {
|
|
685
674
|
|
|
686
|
-
|
|
687
|
-
|
|
675
|
+
if ( geometry.attributes.hasOwnProperty( 'color' ) ) {
|
|
676
|
+
|
|
677
|
+
mat.vertexColors = true;
|
|
688
678
|
|
|
689
679
|
}
|
|
690
680
|
|
|
681
|
+
mat = this._compareMaterials( mat );
|
|
682
|
+
|
|
691
683
|
const mesh = new Mesh( geometry, mat );
|
|
692
684
|
mesh.castShadow = attributes.castsShadows;
|
|
693
685
|
mesh.receiveShadow = attributes.receivesShadows;
|
|
@@ -1529,7 +1521,7 @@ function Rhino3dmWorker() {
|
|
|
1529
1521
|
|
|
1530
1522
|
// TODO: precalculate resulting vertices and faces and warn on excessive results
|
|
1531
1523
|
_geometry.subdivide( 3 );
|
|
1532
|
-
mesh = rhino.Mesh.createFromSubDControlNet( _geometry );
|
|
1524
|
+
mesh = rhino.Mesh.createFromSubDControlNet( _geometry, false );
|
|
1533
1525
|
if ( mesh ) {
|
|
1534
1526
|
|
|
1535
1527
|
geometry = mesh.toThreejsJSON();
|
|
@@ -1886,10 +1886,10 @@ class EXRLoader extends DataTextureLoader {
|
|
|
1886
1886
|
|
|
1887
1887
|
function parseBox2i( dataView, offset ) {
|
|
1888
1888
|
|
|
1889
|
-
const xMin =
|
|
1890
|
-
const yMin =
|
|
1891
|
-
const xMax =
|
|
1892
|
-
const yMax =
|
|
1889
|
+
const xMin = parseInt32( dataView, offset );
|
|
1890
|
+
const yMin = parseInt32( dataView, offset );
|
|
1891
|
+
const xMax = parseInt32( dataView, offset );
|
|
1892
|
+
const yMax = parseInt32( dataView, offset );
|
|
1893
1893
|
|
|
1894
1894
|
return { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };
|
|
1895
1895
|
|
|
@@ -1898,7 +1898,8 @@ class EXRLoader extends DataTextureLoader {
|
|
|
1898
1898
|
function parseLineOrder( dataView, offset ) {
|
|
1899
1899
|
|
|
1900
1900
|
const lineOrders = [
|
|
1901
|
-
'INCREASING_Y'
|
|
1901
|
+
'INCREASING_Y',
|
|
1902
|
+
'DECREASING_Y'
|
|
1902
1903
|
];
|
|
1903
1904
|
|
|
1904
1905
|
const lineOrder = parseUint8( dataView, offset );
|
|
@@ -2066,10 +2067,12 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2066
2067
|
width: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,
|
|
2067
2068
|
height: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,
|
|
2068
2069
|
channels: EXRHeader.channels.length,
|
|
2070
|
+
channelLineOffsets: {},
|
|
2071
|
+
scanOrder: null,
|
|
2069
2072
|
bytesPerLine: null,
|
|
2070
2073
|
lines: null,
|
|
2071
2074
|
inputSize: null,
|
|
2072
|
-
type:
|
|
2075
|
+
type: null,
|
|
2073
2076
|
uncompress: null,
|
|
2074
2077
|
getter: null,
|
|
2075
2078
|
format: null,
|
|
@@ -2125,6 +2128,43 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2125
2128
|
|
|
2126
2129
|
EXRDecoder.scanlineBlockSize = EXRDecoder.lines;
|
|
2127
2130
|
|
|
2131
|
+
const channels = {};
|
|
2132
|
+
for ( const channel of EXRHeader.channels ) {
|
|
2133
|
+
|
|
2134
|
+
switch ( channel.name ) {
|
|
2135
|
+
|
|
2136
|
+
case 'Y':
|
|
2137
|
+
case 'R':
|
|
2138
|
+
case 'G':
|
|
2139
|
+
case 'B':
|
|
2140
|
+
case 'A':
|
|
2141
|
+
channels[ channel.name ] = true;
|
|
2142
|
+
EXRDecoder.type = channel.pixelType;
|
|
2143
|
+
|
|
2144
|
+
}
|
|
2145
|
+
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
// RGB images will be converted to RGBA format, preventing software emulation in select devices.
|
|
2149
|
+
let fillAlpha = false;
|
|
2150
|
+
|
|
2151
|
+
if ( channels.R && channels.G && channels.B ) {
|
|
2152
|
+
|
|
2153
|
+
fillAlpha = ! channels.A;
|
|
2154
|
+
EXRDecoder.outputChannels = 4;
|
|
2155
|
+
EXRDecoder.decodeChannels = { R: 0, G: 1, B: 2, A: 3 };
|
|
2156
|
+
|
|
2157
|
+
} else if ( channels.Y ) {
|
|
2158
|
+
|
|
2159
|
+
EXRDecoder.outputChannels = 1;
|
|
2160
|
+
EXRDecoder.decodeChannels = { Y: 0 };
|
|
2161
|
+
|
|
2162
|
+
} else {
|
|
2163
|
+
|
|
2164
|
+
throw new Error( 'EXRLoader.parse: file contains unsupported data channels.' );
|
|
2165
|
+
|
|
2166
|
+
}
|
|
2167
|
+
|
|
2128
2168
|
if ( EXRDecoder.type == 1 ) {
|
|
2129
2169
|
|
|
2130
2170
|
// half
|
|
@@ -2164,15 +2204,13 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2164
2204
|
|
|
2165
2205
|
}
|
|
2166
2206
|
|
|
2167
|
-
EXRDecoder.blockCount =
|
|
2207
|
+
EXRDecoder.blockCount = EXRDecoder.height / EXRDecoder.scanlineBlockSize;
|
|
2168
2208
|
|
|
2169
2209
|
for ( let i = 0; i < EXRDecoder.blockCount; i ++ )
|
|
2170
2210
|
parseInt64( dataView, offset ); // scanlineOffset
|
|
2171
2211
|
|
|
2172
2212
|
// we should be passed the scanline offset table, ready to start reading pixel data.
|
|
2173
2213
|
|
|
2174
|
-
// RGB images will be converted to RGBA format, preventing software emulation in select devices.
|
|
2175
|
-
EXRDecoder.outputChannels = ( ( EXRDecoder.channels == 3 ) ? 4 : EXRDecoder.channels );
|
|
2176
2214
|
const size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;
|
|
2177
2215
|
|
|
2178
2216
|
switch ( outputType ) {
|
|
@@ -2181,7 +2219,7 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2181
2219
|
EXRDecoder.byteArray = new Float32Array( size );
|
|
2182
2220
|
|
|
2183
2221
|
// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten
|
|
2184
|
-
if (
|
|
2222
|
+
if ( fillAlpha )
|
|
2185
2223
|
EXRDecoder.byteArray.fill( 1, 0, size );
|
|
2186
2224
|
|
|
2187
2225
|
break;
|
|
@@ -2189,7 +2227,7 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2189
2227
|
case HalfFloatType:
|
|
2190
2228
|
EXRDecoder.byteArray = new Uint16Array( size );
|
|
2191
2229
|
|
|
2192
|
-
if (
|
|
2230
|
+
if ( fillAlpha )
|
|
2193
2231
|
EXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1
|
|
2194
2232
|
|
|
2195
2233
|
break;
|
|
@@ -2200,7 +2238,31 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2200
2238
|
|
|
2201
2239
|
}
|
|
2202
2240
|
|
|
2203
|
-
|
|
2241
|
+
let byteOffset = 0;
|
|
2242
|
+
for ( const channel of EXRHeader.channels ) {
|
|
2243
|
+
|
|
2244
|
+
if ( EXRDecoder.decodeChannels[ channel.name ] !== undefined ) {
|
|
2245
|
+
|
|
2246
|
+
EXRDecoder.channelLineOffsets[ channel.name ] = byteOffset * EXRDecoder.width;
|
|
2247
|
+
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
byteOffset += channel.pixelType * 2;
|
|
2251
|
+
|
|
2252
|
+
}
|
|
2253
|
+
|
|
2254
|
+
EXRDecoder.bytesPerLine = EXRDecoder.width * byteOffset;
|
|
2255
|
+
EXRDecoder.outLineWidth = EXRDecoder.width * EXRDecoder.outputChannels;
|
|
2256
|
+
|
|
2257
|
+
if ( EXRHeader.lineOrder === 'INCREASING_Y' ) {
|
|
2258
|
+
|
|
2259
|
+
EXRDecoder.scanOrder = ( y ) => y;
|
|
2260
|
+
|
|
2261
|
+
} else {
|
|
2262
|
+
|
|
2263
|
+
EXRDecoder.scanOrder = ( y ) => EXRDecoder.height - 1 - y;
|
|
2264
|
+
|
|
2265
|
+
}
|
|
2204
2266
|
|
|
2205
2267
|
if ( EXRDecoder.outputChannels == 4 ) {
|
|
2206
2268
|
|
|
@@ -2231,11 +2293,10 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2231
2293
|
const EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );
|
|
2232
2294
|
|
|
2233
2295
|
const tmpOffset = { value: 0 };
|
|
2234
|
-
const channelOffsets = { R: 0, G: 1, B: 2, A: 3, Y: 0 };
|
|
2235
2296
|
|
|
2236
2297
|
for ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx ++ ) {
|
|
2237
2298
|
|
|
2238
|
-
const line =
|
|
2299
|
+
const line = parseInt32( bufferDataView, offset ) - EXRHeader.dataWindow.yMin; // line_no
|
|
2239
2300
|
EXRDecoder.size = parseUint32( bufferDataView, offset ); // data_len
|
|
2240
2301
|
EXRDecoder.lines = ( ( line + EXRDecoder.scanlineBlockSize > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.scanlineBlockSize );
|
|
2241
2302
|
|
|
@@ -2246,17 +2307,26 @@ class EXRLoader extends DataTextureLoader {
|
|
|
2246
2307
|
|
|
2247
2308
|
for ( let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y ++ ) {
|
|
2248
2309
|
|
|
2249
|
-
const
|
|
2250
|
-
|
|
2310
|
+
const scan_y = scanlineBlockIdx * EXRDecoder.scanlineBlockSize;
|
|
2311
|
+
const true_y = line_y + EXRDecoder.scanOrder( scan_y );
|
|
2312
|
+
if ( true_y >= EXRDecoder.height ) continue;
|
|
2313
|
+
|
|
2314
|
+
const lineOffset = line_y * EXRDecoder.bytesPerLine;
|
|
2315
|
+
const outLineOffset = ( EXRDecoder.height - 1 - true_y ) * EXRDecoder.outLineWidth;
|
|
2251
2316
|
|
|
2252
2317
|
for ( let channelID = 0; channelID < EXRDecoder.channels; channelID ++ ) {
|
|
2253
2318
|
|
|
2254
|
-
const
|
|
2319
|
+
const name = EXRHeader.channels[ channelID ].name;
|
|
2320
|
+
const lOff = EXRDecoder.channelLineOffsets[ name ];
|
|
2321
|
+
const cOff = EXRDecoder.decodeChannels[ name ];
|
|
2322
|
+
|
|
2323
|
+
if ( cOff === undefined ) continue;
|
|
2324
|
+
|
|
2325
|
+
tmpOffset.value = lineOffset + lOff;
|
|
2255
2326
|
|
|
2256
2327
|
for ( let x = 0; x < EXRDecoder.width; x ++ ) {
|
|
2257
2328
|
|
|
2258
|
-
|
|
2259
|
-
const outIndex = ( EXRDecoder.height - 1 - true_y ) * ( EXRDecoder.width * EXRDecoder.outputChannels ) + x * EXRDecoder.outputChannels + cOff;
|
|
2329
|
+
const outIndex = outLineOffset + x * EXRDecoder.outputChannels + cOff;
|
|
2260
2330
|
EXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );
|
|
2261
2331
|
|
|
2262
2332
|
}
|
|
@@ -2845,7 +2845,7 @@ class AnimationParser {
|
|
|
2845
2845
|
|
|
2846
2846
|
const quaternionValues = [];
|
|
2847
2847
|
|
|
2848
|
-
if ( ! values || ! times ) return new QuaternionKeyframeTrack( modelName + '.quaternion', [], [] );
|
|
2848
|
+
if ( ! values || ! times ) return new QuaternionKeyframeTrack( modelName + '.quaternion', [ 0 ], [ 0 ] );
|
|
2849
2849
|
|
|
2850
2850
|
for ( let i = 0; i < values.length; i += 3 ) {
|
|
2851
2851
|
|
|
@@ -160,12 +160,8 @@ class KTX2Loader extends Loader {
|
|
|
160
160
|
|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )
|
|
161
161
|
};
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
// https://github.com/mrdoob/three.js/pull/22928
|
|
166
|
-
this.workerConfig.etc1Supported = false;
|
|
167
|
-
|
|
168
|
-
}
|
|
163
|
+
// https://github.com/mrdoob/three.js/pull/22928
|
|
164
|
+
this.workerConfig.etc1Supported = false;
|
|
169
165
|
|
|
170
166
|
}
|
|
171
167
|
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
ClampToEdgeWrapping,
|
|
6
|
-
DataTexture,
|
|
7
6
|
Data3DTexture,
|
|
8
7
|
FileLoader,
|
|
9
8
|
FloatType,
|
|
@@ -144,19 +143,6 @@ export class LUT3dlLoader extends Loader {
|
|
|
144
143
|
|
|
145
144
|
}
|
|
146
145
|
|
|
147
|
-
const texture = new DataTexture();
|
|
148
|
-
texture.image.data = data;
|
|
149
|
-
texture.image.width = size;
|
|
150
|
-
texture.image.height = size * size;
|
|
151
|
-
texture.format = RGBAFormat;
|
|
152
|
-
texture.type = this.type;
|
|
153
|
-
texture.magFilter = LinearFilter;
|
|
154
|
-
texture.minFilter = LinearFilter;
|
|
155
|
-
texture.wrapS = ClampToEdgeWrapping;
|
|
156
|
-
texture.wrapT = ClampToEdgeWrapping;
|
|
157
|
-
texture.generateMipmaps = false;
|
|
158
|
-
texture.needsUpdate = true;
|
|
159
|
-
|
|
160
146
|
const texture3D = new Data3DTexture();
|
|
161
147
|
texture3D.image.data = data;
|
|
162
148
|
texture3D.image.width = size;
|
|
@@ -174,7 +160,6 @@ export class LUT3dlLoader extends Loader {
|
|
|
174
160
|
|
|
175
161
|
return {
|
|
176
162
|
size,
|
|
177
|
-
texture,
|
|
178
163
|
texture3D,
|
|
179
164
|
};
|
|
180
165
|
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
ClampToEdgeWrapping,
|
|
5
|
-
DataTexture,
|
|
6
5
|
Data3DTexture,
|
|
7
6
|
FileLoader,
|
|
8
7
|
FloatType,
|
|
@@ -127,18 +126,6 @@ export class LUTCubeLoader extends Loader {
|
|
|
127
126
|
|
|
128
127
|
}
|
|
129
128
|
|
|
130
|
-
const texture = new DataTexture();
|
|
131
|
-
texture.image.data = data;
|
|
132
|
-
texture.image.width = size;
|
|
133
|
-
texture.image.height = size * size;
|
|
134
|
-
texture.type = this.type;
|
|
135
|
-
texture.magFilter = LinearFilter;
|
|
136
|
-
texture.minFilter = LinearFilter;
|
|
137
|
-
texture.wrapS = ClampToEdgeWrapping;
|
|
138
|
-
texture.wrapT = ClampToEdgeWrapping;
|
|
139
|
-
texture.generateMipmaps = false;
|
|
140
|
-
texture.needsUpdate = true;
|
|
141
|
-
|
|
142
129
|
const texture3D = new Data3DTexture();
|
|
143
130
|
texture3D.image.data = data;
|
|
144
131
|
texture3D.image.width = size;
|
|
@@ -158,7 +145,6 @@ export class LUTCubeLoader extends Loader {
|
|
|
158
145
|
size,
|
|
159
146
|
domainMin,
|
|
160
147
|
domainMax,
|
|
161
|
-
texture,
|
|
162
148
|
texture3D,
|
|
163
149
|
};
|
|
164
150
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Loader,
|
|
3
3
|
TextureLoader,
|
|
4
|
-
DataTexture,
|
|
5
4
|
Data3DTexture,
|
|
6
5
|
RGBAFormat,
|
|
7
6
|
UnsignedByteType,
|
|
@@ -124,18 +123,6 @@ export class LUTImageLoader extends Loader {
|
|
|
124
123
|
parse( dataArray, size ) {
|
|
125
124
|
|
|
126
125
|
const data = new Uint8Array( dataArray );
|
|
127
|
-
const texture = new DataTexture();
|
|
128
|
-
texture.image.data = data;
|
|
129
|
-
texture.image.width = size;
|
|
130
|
-
texture.image.height = size * size;
|
|
131
|
-
texture.format = RGBAFormat;
|
|
132
|
-
texture.type = UnsignedByteType;
|
|
133
|
-
texture.magFilter = LinearFilter;
|
|
134
|
-
texture.minFilter = LinearFilter;
|
|
135
|
-
texture.wrapS = ClampToEdgeWrapping;
|
|
136
|
-
texture.wrapT = ClampToEdgeWrapping;
|
|
137
|
-
texture.generateMipmaps = false;
|
|
138
|
-
texture.needsUpdate = true;
|
|
139
126
|
|
|
140
127
|
const texture3D = new Data3DTexture();
|
|
141
128
|
texture3D.image.data = data;
|
|
@@ -154,7 +141,6 @@ export class LUTImageLoader extends Loader {
|
|
|
154
141
|
|
|
155
142
|
return {
|
|
156
143
|
size,
|
|
157
|
-
texture,
|
|
158
144
|
texture3D,
|
|
159
145
|
};
|
|
160
146
|
|
|
@@ -36,6 +36,12 @@ class RGBMLoader extends DataTextureLoader {
|
|
|
36
36
|
|
|
37
37
|
const texture = new CubeTexture();
|
|
38
38
|
|
|
39
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
40
|
+
|
|
41
|
+
texture.images[ i ] = undefined;
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
39
45
|
let loaded = 0;
|
|
40
46
|
|
|
41
47
|
const scope = this;
|
|
@@ -75,6 +81,16 @@ class RGBMLoader extends DataTextureLoader {
|
|
|
75
81
|
|
|
76
82
|
}
|
|
77
83
|
|
|
84
|
+
loadCubemapAsync( urls, onProgress ) {
|
|
85
|
+
|
|
86
|
+
return new Promise( ( resolve, reject ) => {
|
|
87
|
+
|
|
88
|
+
this.loadCubemap( urls, resolve, onProgress, reject );
|
|
89
|
+
|
|
90
|
+
} );
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
78
94
|
parse( buffer ) {
|
|
79
95
|
|
|
80
96
|
const img = UPNG.decode( buffer );
|
|
@@ -56,9 +56,16 @@ class VOXLoader extends Loader {
|
|
|
56
56
|
const id = data.getUint32( 0, true );
|
|
57
57
|
const version = data.getUint32( 4, true );
|
|
58
58
|
|
|
59
|
-
if ( id !== 542658390
|
|
59
|
+
if ( id !== 542658390 ) {
|
|
60
60
|
|
|
61
|
-
console.error( '
|
|
61
|
+
console.error( 'THREE.VOXLoader: Invalid VOX file.' );
|
|
62
|
+
return;
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if ( version !== 150 ) {
|
|
67
|
+
|
|
68
|
+
console.error( 'THREE.VOXLoader: Invalid VOX file. Unsupported version:', version );
|
|
62
69
|
return;
|
|
63
70
|
|
|
64
71
|
}
|
|
@@ -1012,7 +1012,9 @@ class VRMLLoader extends Loader {
|
|
|
1012
1012
|
|
|
1013
1013
|
const pointsMaterial = new PointsMaterial( {
|
|
1014
1014
|
name: Loader.DEFAULT_MATERIAL_NAME,
|
|
1015
|
-
color: 0xffffff
|
|
1015
|
+
color: 0xffffff,
|
|
1016
|
+
opacity: material.opacity,
|
|
1017
|
+
transparent: material.transparent
|
|
1016
1018
|
} );
|
|
1017
1019
|
|
|
1018
1020
|
if ( geometry.attributes.color !== undefined ) {
|
|
@@ -1037,7 +1039,9 @@ class VRMLLoader extends Loader {
|
|
|
1037
1039
|
|
|
1038
1040
|
const lineMaterial = new LineBasicMaterial( {
|
|
1039
1041
|
name: Loader.DEFAULT_MATERIAL_NAME,
|
|
1040
|
-
color: 0xffffff
|
|
1042
|
+
color: 0xffffff,
|
|
1043
|
+
opacity: material.opacity,
|
|
1044
|
+
transparent: material.transparent
|
|
1041
1045
|
} );
|
|
1042
1046
|
|
|
1043
1047
|
if ( geometry.attributes.color !== undefined ) {
|
|
@@ -171,12 +171,6 @@ class GPUComputationRenderer {
|
|
|
171
171
|
|
|
172
172
|
this.init = function () {
|
|
173
173
|
|
|
174
|
-
if ( renderer.capabilities.isWebGL2 === false && renderer.extensions.has( 'OES_texture_float' ) === false ) {
|
|
175
|
-
|
|
176
|
-
return 'No OES_texture_float support for float textures.';
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
|
|
180
174
|
if ( renderer.capabilities.maxVertexTextures === 0 ) {
|
|
181
175
|
|
|
182
176
|
return 'No support for vertex shader textures.';
|