@needle-tools/three 0.146.5 → 0.146.7
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 +29 -11
- package/build/three.js +29 -11
- package/build/three.min.js +1 -2
- package/build/three.module.js +42 -13
- package/examples/jsm/exporters/USDZExporter.js +17 -8
- package/package.json +1 -1
- package/src/renderers/webxr/WebXRManager.js +43 -12
package/build/three.module.js
CHANGED
|
@@ -25571,6 +25571,7 @@ class WebXRManager extends EventDispatcher {
|
|
|
25571
25571
|
const bottom2 = bottomFov * far / far2 * near2;
|
|
25572
25572
|
|
|
25573
25573
|
camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );
|
|
25574
|
+
camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();
|
|
25574
25575
|
|
|
25575
25576
|
}
|
|
25576
25577
|
|
|
@@ -25622,12 +25623,42 @@ class WebXRManager extends EventDispatcher {
|
|
|
25622
25623
|
|
|
25623
25624
|
}
|
|
25624
25625
|
|
|
25625
|
-
|
|
25626
|
+
// update projection matrix for proper view frustum culling
|
|
25627
|
+
|
|
25628
|
+
if ( cameras.length === 2 ) {
|
|
25629
|
+
|
|
25630
|
+
setProjectionFromUnion( cameraVR, cameraL, cameraR );
|
|
25631
|
+
|
|
25632
|
+
} else {
|
|
25633
|
+
|
|
25634
|
+
// assume single camera setup (AR)
|
|
25635
|
+
|
|
25636
|
+
cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
|
|
25637
|
+
|
|
25638
|
+
}
|
|
25626
25639
|
|
|
25627
25640
|
// update user camera and its children
|
|
25628
25641
|
|
|
25629
|
-
|
|
25642
|
+
updateUserCamera( camera, cameraVR, parent );
|
|
25643
|
+
|
|
25644
|
+
};
|
|
25645
|
+
|
|
25646
|
+
function updateUserCamera( camera, cameraVR, parent ) {
|
|
25647
|
+
|
|
25648
|
+
if ( parent === null ) {
|
|
25649
|
+
|
|
25650
|
+
camera.matrix.copy( cameraVR.matrixWorld );
|
|
25651
|
+
|
|
25652
|
+
} else {
|
|
25653
|
+
|
|
25654
|
+
camera.matrix.copy( parent.matrixWorld );
|
|
25655
|
+
camera.matrix.invert();
|
|
25656
|
+
camera.matrix.multiply( cameraVR.matrixWorld );
|
|
25657
|
+
|
|
25658
|
+
}
|
|
25659
|
+
|
|
25630
25660
|
camera.matrix.decompose( camera.position, camera.quaternion, camera.scale );
|
|
25661
|
+
camera.updateMatrixWorld( true );
|
|
25631
25662
|
|
|
25632
25663
|
const children = camera.children;
|
|
25633
25664
|
|
|
@@ -25637,21 +25668,17 @@ class WebXRManager extends EventDispatcher {
|
|
|
25637
25668
|
|
|
25638
25669
|
}
|
|
25639
25670
|
|
|
25640
|
-
|
|
25641
|
-
|
|
25642
|
-
if ( cameras.length === 2 ) {
|
|
25671
|
+
camera.projectionMatrix.copy( cameraVR.projectionMatrix );
|
|
25672
|
+
camera.projectionMatrixInverse.copy( cameraVR.projectionMatrixInverse );
|
|
25643
25673
|
|
|
25644
|
-
|
|
25674
|
+
if ( camera.isPerspectiveCamera ) {
|
|
25645
25675
|
|
|
25646
|
-
|
|
25647
|
-
|
|
25648
|
-
// assume single camera setup (AR)
|
|
25649
|
-
|
|
25650
|
-
cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
|
|
25676
|
+
camera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );
|
|
25677
|
+
camera.zoom = 1;
|
|
25651
25678
|
|
|
25652
25679
|
}
|
|
25653
25680
|
|
|
25654
|
-
}
|
|
25681
|
+
}
|
|
25655
25682
|
|
|
25656
25683
|
this.getCamera = function () {
|
|
25657
25684
|
|
|
@@ -25774,12 +25801,15 @@ class WebXRManager extends EventDispatcher {
|
|
|
25774
25801
|
}
|
|
25775
25802
|
|
|
25776
25803
|
camera.matrix.fromArray( view.transform.matrix );
|
|
25804
|
+
camera.matrix.decompose( camera.position, camera.quaternion, camera.scale );
|
|
25777
25805
|
camera.projectionMatrix.fromArray( view.projectionMatrix );
|
|
25806
|
+
camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();
|
|
25778
25807
|
camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
25779
25808
|
|
|
25780
25809
|
if ( i === 0 ) {
|
|
25781
25810
|
|
|
25782
25811
|
cameraVR.matrix.copy( camera.matrix );
|
|
25812
|
+
cameraVR.matrix.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );
|
|
25783
25813
|
|
|
25784
25814
|
}
|
|
25785
25815
|
|
|
@@ -50164,4 +50194,3 @@ if ( typeof window !== 'undefined' ) {
|
|
|
50164
50194
|
}
|
|
50165
50195
|
|
|
50166
50196
|
export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleBufferGeometry, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedTexture, CompressedTextureLoader, ConeBufferGeometry, ConeGeometry, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderBufferGeometry, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeBufferGeometry, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Float64BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheBufferGeometry, LatheGeometry, Layers, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, Path, PerspectiveCamera, Plane, PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingBufferGeometry, RingGeometry, SRGBColorSpace, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronBufferGeometry, TetrahedronGeometry, Texture, TextureLoader, TorusBufferGeometry, TorusGeometry, TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeBufferGeometry, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, sRGBEncoding };
|
|
50167
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUubW9kdWxlLmpzIiwic291cmNlcyI6W10sInNvdXJjZXNDb250ZW50IjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -375,8 +375,6 @@ class USDZExporter {
|
|
|
375
375
|
|
|
376
376
|
context.output += buildMaterials( materials, textures );
|
|
377
377
|
|
|
378
|
-
invokeAll( context, 'onAfterHierarchy' );
|
|
379
|
-
|
|
380
378
|
const header = context.document.buildHeader();
|
|
381
379
|
const final = header + '\n' + context.output;
|
|
382
380
|
|
|
@@ -393,7 +391,6 @@ class USDZExporter {
|
|
|
393
391
|
for ( const id in textures ) {
|
|
394
392
|
|
|
395
393
|
let texture = textures[ id ];
|
|
396
|
-
const color = id.split( '_' )[ 1 ];
|
|
397
394
|
const isRGBA = texture.format === 1023;
|
|
398
395
|
if ( texture.isCompressedTexture ) {
|
|
399
396
|
|
|
@@ -401,10 +398,20 @@ class USDZExporter {
|
|
|
401
398
|
|
|
402
399
|
}
|
|
403
400
|
|
|
401
|
+
// TODO add readback options for textures that don't have texture.image
|
|
404
402
|
const canvas = await imageToCanvas( texture.image );
|
|
405
|
-
const blob = await new Promise( resolve => canvas.toBlob( resolve, isRGBA ? 'image/png' : 'image/jpeg', 1 ) );
|
|
406
403
|
|
|
407
|
-
|
|
404
|
+
if ( canvas ) {
|
|
405
|
+
|
|
406
|
+
const blob = await new Promise( resolve => canvas.toBlob( resolve, isRGBA ? 'image/png' : 'image/jpeg', 1 ) );
|
|
407
|
+
files[ `textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}` ] = new Uint8Array( await blob.arrayBuffer() );
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
|
|
412
|
+
console.warn( 'Can`t export texture: ', texture );
|
|
413
|
+
|
|
414
|
+
}
|
|
408
415
|
|
|
409
416
|
}
|
|
410
417
|
|
|
@@ -542,6 +549,8 @@ function parseDocument( context ) {
|
|
|
542
549
|
|
|
543
550
|
}
|
|
544
551
|
|
|
552
|
+
invokeAll( context, 'onAfterHierarchy', writer );
|
|
553
|
+
|
|
545
554
|
writer.closeBlock();
|
|
546
555
|
writer.closeBlock();
|
|
547
556
|
writer.closeBlock();
|
|
@@ -590,14 +599,14 @@ function addResources( object, context ) {
|
|
|
590
599
|
|
|
591
600
|
}
|
|
592
601
|
|
|
593
|
-
function invokeAll( context, name ) {
|
|
602
|
+
function invokeAll( context, name, writer = null ) {
|
|
594
603
|
|
|
595
604
|
if ( context.extensions ) {
|
|
596
605
|
|
|
597
606
|
for ( const ext of context.extensions ) {
|
|
598
607
|
|
|
599
608
|
if ( typeof ext[ name ] === 'function' )
|
|
600
|
-
ext[ name ]( context );
|
|
609
|
+
ext[ name ]( context, writer );
|
|
601
610
|
|
|
602
611
|
}
|
|
603
612
|
|
|
@@ -737,7 +746,7 @@ export function buildXform( model, writer, context ) {
|
|
|
737
746
|
|
|
738
747
|
if ( matrix.determinant() < 0 ) {
|
|
739
748
|
|
|
740
|
-
console.warn( 'THREE.USDZExporter: USDZ does not support negative scales',
|
|
749
|
+
console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', name );
|
|
741
750
|
|
|
742
751
|
}
|
|
743
752
|
|
package/package.json
CHANGED
|
@@ -3,6 +3,7 @@ import { EventDispatcher } from '../../core/EventDispatcher.js';
|
|
|
3
3
|
import { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js';
|
|
4
4
|
import { Vector3 } from '../../math/Vector3.js';
|
|
5
5
|
import { Vector4 } from '../../math/Vector4.js';
|
|
6
|
+
import { RAD2DEG } from '../../math/MathUtils.js';
|
|
6
7
|
import { WebGLAnimation } from '../webgl/WebGLAnimation.js';
|
|
7
8
|
import { WebGLRenderTarget } from '../WebGLRenderTarget.js';
|
|
8
9
|
import { WebXRController } from './WebXRController.js';
|
|
@@ -492,6 +493,7 @@ class WebXRManager extends EventDispatcher {
|
|
|
492
493
|
const bottom2 = bottomFov * far / far2 * near2;
|
|
493
494
|
|
|
494
495
|
camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );
|
|
496
|
+
camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();
|
|
495
497
|
|
|
496
498
|
}
|
|
497
499
|
|
|
@@ -543,12 +545,42 @@ class WebXRManager extends EventDispatcher {
|
|
|
543
545
|
|
|
544
546
|
}
|
|
545
547
|
|
|
546
|
-
|
|
548
|
+
// update projection matrix for proper view frustum culling
|
|
549
|
+
|
|
550
|
+
if ( cameras.length === 2 ) {
|
|
551
|
+
|
|
552
|
+
setProjectionFromUnion( cameraVR, cameraL, cameraR );
|
|
553
|
+
|
|
554
|
+
} else {
|
|
555
|
+
|
|
556
|
+
// assume single camera setup (AR)
|
|
557
|
+
|
|
558
|
+
cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
|
|
559
|
+
|
|
560
|
+
}
|
|
547
561
|
|
|
548
562
|
// update user camera and its children
|
|
549
563
|
|
|
550
|
-
|
|
564
|
+
updateUserCamera( camera, cameraVR, parent );
|
|
565
|
+
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
function updateUserCamera( camera, cameraVR, parent ) {
|
|
569
|
+
|
|
570
|
+
if ( parent === null ) {
|
|
571
|
+
|
|
572
|
+
camera.matrix.copy( cameraVR.matrixWorld );
|
|
573
|
+
|
|
574
|
+
} else {
|
|
575
|
+
|
|
576
|
+
camera.matrix.copy( parent.matrixWorld );
|
|
577
|
+
camera.matrix.invert();
|
|
578
|
+
camera.matrix.multiply( cameraVR.matrixWorld );
|
|
579
|
+
|
|
580
|
+
}
|
|
581
|
+
|
|
551
582
|
camera.matrix.decompose( camera.position, camera.quaternion, camera.scale );
|
|
583
|
+
camera.updateMatrixWorld( true );
|
|
552
584
|
|
|
553
585
|
const children = camera.children;
|
|
554
586
|
|
|
@@ -558,21 +590,17 @@ class WebXRManager extends EventDispatcher {
|
|
|
558
590
|
|
|
559
591
|
}
|
|
560
592
|
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
if ( cameras.length === 2 ) {
|
|
593
|
+
camera.projectionMatrix.copy( cameraVR.projectionMatrix );
|
|
594
|
+
camera.projectionMatrixInverse.copy( cameraVR.projectionMatrixInverse );
|
|
564
595
|
|
|
565
|
-
|
|
596
|
+
if ( camera.isPerspectiveCamera ) {
|
|
566
597
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
// assume single camera setup (AR)
|
|
570
|
-
|
|
571
|
-
cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
|
|
598
|
+
camera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );
|
|
599
|
+
camera.zoom = 1;
|
|
572
600
|
|
|
573
601
|
}
|
|
574
602
|
|
|
575
|
-
}
|
|
603
|
+
}
|
|
576
604
|
|
|
577
605
|
this.getCamera = function () {
|
|
578
606
|
|
|
@@ -695,12 +723,15 @@ class WebXRManager extends EventDispatcher {
|
|
|
695
723
|
}
|
|
696
724
|
|
|
697
725
|
camera.matrix.fromArray( view.transform.matrix );
|
|
726
|
+
camera.matrix.decompose( camera.position, camera.quaternion, camera.scale );
|
|
698
727
|
camera.projectionMatrix.fromArray( view.projectionMatrix );
|
|
728
|
+
camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();
|
|
699
729
|
camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
700
730
|
|
|
701
731
|
if ( i === 0 ) {
|
|
702
732
|
|
|
703
733
|
cameraVR.matrix.copy( camera.matrix );
|
|
734
|
+
cameraVR.matrix.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );
|
|
704
735
|
|
|
705
736
|
}
|
|
706
737
|
|