@unikia/upe-renderer 0.186.110 → 0.187.11
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/README.md +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, FloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, NoColorSpace, LinearTransfer, SRGBTransfer } from '../../../constants.js';
|
|
1
|
+
import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, FloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, NoColorSpace, LinearTransfer, SRGBTransfer, DepthStencilFormat } from '../../../constants.js';
|
|
2
2
|
import { ColorManagement } from '../../../math/ColorManagement.js';
|
|
3
3
|
import { getByteLength } from '../../../extras/TextureUtils.js';
|
|
4
4
|
import { warn } from '../../../utils.js';
|
|
@@ -300,6 +300,7 @@ class WebGLTextureUtils {
|
|
|
300
300
|
if ( glFormat === gl.DEPTH_STENCIL ) {
|
|
301
301
|
|
|
302
302
|
if ( glType === gl.UNSIGNED_INT_24_8 ) internalFormat = gl.DEPTH24_STENCIL8;
|
|
303
|
+
if ( glType === gl.FLOAT ) internalFormat = gl.DEPTH32F_STENCIL8;
|
|
303
304
|
|
|
304
305
|
}
|
|
305
306
|
|
|
@@ -352,7 +353,7 @@ class WebGLTextureUtils {
|
|
|
352
353
|
gl.texParameteri( textureType, gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );
|
|
353
354
|
|
|
354
355
|
|
|
355
|
-
const hasMipmaps = texture.mipmaps
|
|
356
|
+
const hasMipmaps = texture.mipmaps.length > 0;
|
|
356
357
|
|
|
357
358
|
// follow WebGPU backend mapping for texture filtering
|
|
358
359
|
const minFilter = texture.minFilter === LinearFilter && hasMipmaps ? LinearMipmapLinearFilter : texture.minFilter;
|
|
@@ -539,10 +540,39 @@ class WebGLTextureUtils {
|
|
|
539
540
|
|
|
540
541
|
this.setTextureParameters( glTextureType, texture );
|
|
541
542
|
|
|
542
|
-
if ( texture.
|
|
543
|
+
if ( texture.isCompressedCubeTexture ) {
|
|
544
|
+
|
|
545
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
546
|
+
|
|
547
|
+
const mipmaps = texture.image[ i ].mipmaps;
|
|
548
|
+
|
|
549
|
+
for ( let j = 0; j < mipmaps.length; j ++ ) {
|
|
550
|
+
|
|
551
|
+
const mipmap = mipmaps[ j ];
|
|
552
|
+
|
|
553
|
+
if ( glFormat === gl.RGBA ) {
|
|
554
|
+
|
|
555
|
+
gl.texSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
|
|
556
|
+
|
|
557
|
+
} else if ( glFormat !== null ) {
|
|
558
|
+
|
|
559
|
+
gl.compressedTexSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
|
|
560
|
+
|
|
561
|
+
} else {
|
|
562
|
+
|
|
563
|
+
warn( 'WebGLBackend: Unsupported compressed texture format' );
|
|
564
|
+
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
} else if ( texture.isCompressedTexture ) {
|
|
543
572
|
|
|
544
573
|
const mipmaps = texture.mipmaps;
|
|
545
574
|
const image = options.image;
|
|
575
|
+
const isCompressedFormat = ( glFormat !== null && glFormat !== gl.RGBA );
|
|
546
576
|
|
|
547
577
|
for ( let i = 0; i < mipmaps.length; i ++ ) {
|
|
548
578
|
|
|
@@ -550,51 +580,51 @@ class WebGLTextureUtils {
|
|
|
550
580
|
|
|
551
581
|
if ( texture.isCompressedArrayTexture ) {
|
|
552
582
|
|
|
553
|
-
if (
|
|
554
|
-
|
|
555
|
-
if ( glFormat !== null ) {
|
|
583
|
+
if ( isCompressedFormat ) {
|
|
556
584
|
|
|
557
|
-
|
|
585
|
+
if ( texture.layerUpdates.size > 0 ) {
|
|
558
586
|
|
|
559
|
-
|
|
587
|
+
const layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );
|
|
560
588
|
|
|
561
|
-
|
|
589
|
+
for ( const layerIndex of texture.layerUpdates ) {
|
|
562
590
|
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
} else {
|
|
572
|
-
|
|
573
|
-
gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );
|
|
591
|
+
const layerData = mipmap.data.subarray(
|
|
592
|
+
layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,
|
|
593
|
+
( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT
|
|
594
|
+
);
|
|
595
|
+
gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );
|
|
574
596
|
|
|
575
597
|
}
|
|
576
598
|
|
|
577
599
|
} else {
|
|
578
600
|
|
|
579
|
-
|
|
601
|
+
gl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );
|
|
580
602
|
|
|
581
603
|
}
|
|
582
604
|
|
|
583
|
-
} else {
|
|
605
|
+
} else if ( glFormat === gl.RGBA ) {
|
|
584
606
|
|
|
585
607
|
gl.texSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );
|
|
586
608
|
|
|
609
|
+
} else {
|
|
610
|
+
|
|
611
|
+
warn( 'WebGLBackend: Unsupported compressed texture format.' );
|
|
612
|
+
|
|
587
613
|
}
|
|
588
614
|
|
|
589
615
|
} else {
|
|
590
616
|
|
|
591
|
-
if (
|
|
617
|
+
if ( isCompressedFormat ) {
|
|
592
618
|
|
|
593
619
|
gl.compressedTexSubImage2D( gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
|
|
594
620
|
|
|
621
|
+
} else if ( glFormat === gl.RGBA ) {
|
|
622
|
+
|
|
623
|
+
gl.texSubImage2D( gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
|
|
624
|
+
|
|
595
625
|
} else {
|
|
596
626
|
|
|
597
|
-
warn( 'WebGLBackend: Unsupported compressed texture format' );
|
|
627
|
+
warn( 'WebGLBackend: Unsupported compressed texture format.' );
|
|
598
628
|
|
|
599
629
|
}
|
|
600
630
|
|
|
@@ -905,40 +935,61 @@ class WebGLTextureUtils {
|
|
|
905
935
|
state.pixelStorei( gl.UNPACK_SKIP_IMAGES, minZ );
|
|
906
936
|
|
|
907
937
|
// set up the src texture
|
|
908
|
-
const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture ||
|
|
938
|
+
const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture || srcTexture.isArrayTexture;
|
|
909
939
|
const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture || dstTexture.isArrayTexture;
|
|
910
940
|
|
|
911
941
|
if ( srcTexture.isDepthTexture ) {
|
|
912
942
|
|
|
913
943
|
const srcTextureData = backend.get( srcTexture );
|
|
914
|
-
const dstTextureData = backend.get( dstTexture );
|
|
915
944
|
|
|
916
|
-
|
|
917
|
-
|
|
945
|
+
if ( this._srcFramebuffer === null ) this._srcFramebuffer = gl.createFramebuffer();
|
|
946
|
+
if ( this._dstFramebuffer === null ) this._dstFramebuffer = gl.createFramebuffer();
|
|
918
947
|
|
|
919
|
-
const
|
|
920
|
-
const dstFramebuffer = dstRenderContextData.framebuffers[ dstTextureData.cacheKey ];
|
|
948
|
+
const attachment = srcTexture.format === DepthStencilFormat ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
921
949
|
|
|
922
950
|
const prevReadFramebuffer = state.currentBoundFramebuffers[ gl.READ_FRAMEBUFFER ] ?? null;
|
|
923
951
|
const prevDrawFramebuffer = state.currentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] ?? null;
|
|
924
952
|
|
|
925
|
-
state.bindFramebuffer( gl.READ_FRAMEBUFFER,
|
|
926
|
-
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER,
|
|
953
|
+
state.bindFramebuffer( gl.READ_FRAMEBUFFER, this._srcFramebuffer );
|
|
954
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, this._dstFramebuffer );
|
|
955
|
+
|
|
956
|
+
// color attachments of previous copies would make the framebuffers incomplete
|
|
957
|
+
|
|
958
|
+
gl.framebufferTexture2D( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0 );
|
|
959
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0 );
|
|
927
960
|
|
|
928
961
|
for ( let i = 0; i < depth; i ++ ) {
|
|
929
962
|
|
|
930
963
|
// if the source or destination are a 3d target then a layer needs to be bound
|
|
931
964
|
if ( isSrc3D ) {
|
|
932
965
|
|
|
933
|
-
gl.framebufferTextureLayer( gl.READ_FRAMEBUFFER,
|
|
934
|
-
|
|
966
|
+
gl.framebufferTextureLayer( gl.READ_FRAMEBUFFER, attachment, srcTextureData.textureGPU, srcLevel, minZ + i );
|
|
967
|
+
|
|
968
|
+
} else {
|
|
969
|
+
|
|
970
|
+
gl.framebufferTexture2D( gl.READ_FRAMEBUFFER, attachment, gl.TEXTURE_2D, srcTextureData.textureGPU, srcLevel );
|
|
971
|
+
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
if ( isDst3D ) {
|
|
975
|
+
|
|
976
|
+
gl.framebufferTextureLayer( gl.DRAW_FRAMEBUFFER, attachment, dstTextureGPU, dstLevel, dstZ + i );
|
|
977
|
+
|
|
978
|
+
} else {
|
|
979
|
+
|
|
980
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, dstTextureGPU, dstLevel );
|
|
935
981
|
|
|
936
982
|
}
|
|
937
983
|
|
|
938
|
-
gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
|
|
984
|
+
gl.blitFramebuffer( minX, minY, minX + width, minY + height, dstX, dstY, dstX + width, dstY + height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
|
|
939
985
|
|
|
940
986
|
}
|
|
941
987
|
|
|
988
|
+
// detach the depth textures so subsequent color copies can reuse the framebuffers
|
|
989
|
+
|
|
990
|
+
gl.framebufferTexture2D( gl.READ_FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0 );
|
|
991
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0 );
|
|
992
|
+
|
|
942
993
|
state.bindFramebuffer( gl.READ_FRAMEBUFFER, prevReadFramebuffer );
|
|
943
994
|
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, prevDrawFramebuffer );
|
|
944
995
|
|
|
@@ -983,7 +1034,7 @@ class WebGLTextureUtils {
|
|
|
983
1034
|
// copy the data using the fastest function that can achieve the copy
|
|
984
1035
|
if ( srcLevel !== 0 ) {
|
|
985
1036
|
|
|
986
|
-
gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, gl.COLOR_BUFFER_BIT, gl.NEAREST );
|
|
1037
|
+
gl.blitFramebuffer( minX, minY, minX + width, minY + height, dstX, dstY, dstX + width, dstY + height, gl.COLOR_BUFFER_BIT, gl.NEAREST );
|
|
987
1038
|
|
|
988
1039
|
} else if ( isDst3D ) {
|
|
989
1040
|
|
|
@@ -1049,7 +1100,7 @@ class WebGLTextureUtils {
|
|
|
1049
1100
|
state.pixelStorei( gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );
|
|
1050
1101
|
|
|
1051
1102
|
// Generate mipmaps only when copying level 0
|
|
1052
|
-
if ( dstLevel === 0 && dstTexture.generateMipmaps ) {
|
|
1103
|
+
if ( dstLevel === 0 && dstTexture.generateMipmaps === true && dstTexture.mipmapsAutoUpdate === true ) {
|
|
1053
1104
|
|
|
1054
1105
|
gl.generateMipmap( glTextureType );
|
|
1055
1106
|
|
|
@@ -1148,7 +1199,7 @@ class WebGLTextureUtils {
|
|
|
1148
1199
|
|
|
1149
1200
|
}
|
|
1150
1201
|
|
|
1151
|
-
if ( texture.generateMipmaps ) this.generateMipmaps( texture );
|
|
1202
|
+
if ( texture.generateMipmaps === true && texture.mipmapsAutoUpdate === true ) this.generateMipmaps( texture );
|
|
1152
1203
|
|
|
1153
1204
|
this.backend._setFramebuffer( renderContext );
|
|
1154
1205
|
|
|
@@ -1165,9 +1216,9 @@ class WebGLTextureUtils {
|
|
|
1165
1216
|
setupRenderBufferStorage( renderbuffer, renderContext, samples, useMultisampledRTT = false ) {
|
|
1166
1217
|
|
|
1167
1218
|
const { gl } = this;
|
|
1168
|
-
const renderTarget = renderContext
|
|
1219
|
+
const { depthTexture, renderTarget } = renderContext;
|
|
1169
1220
|
|
|
1170
|
-
const {
|
|
1221
|
+
const { depthBuffer, stencilBuffer, width, height } = renderTarget;
|
|
1171
1222
|
|
|
1172
1223
|
gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
|
|
1173
1224
|
|
|
@@ -1185,7 +1236,7 @@ class WebGLTextureUtils {
|
|
|
1185
1236
|
|
|
1186
1237
|
if ( depthTexture && depthTexture.isDepthTexture ) {
|
|
1187
1238
|
|
|
1188
|
-
if ( depthTexture.type ===
|
|
1239
|
+
if ( depthTexture.type === FloatType ) {
|
|
1189
1240
|
|
|
1190
1241
|
glInternalFormat = gl.DEPTH_COMPONENT32F;
|
|
1191
1242
|
|
|
@@ -1207,7 +1258,19 @@ class WebGLTextureUtils {
|
|
|
1207
1258
|
|
|
1208
1259
|
if ( samples > 0 ) {
|
|
1209
1260
|
|
|
1210
|
-
|
|
1261
|
+
let glInternalFormat = gl.DEPTH24_STENCIL8;
|
|
1262
|
+
|
|
1263
|
+
if ( depthTexture && depthTexture.isDepthTexture ) {
|
|
1264
|
+
|
|
1265
|
+
if ( depthTexture.type === FloatType ) {
|
|
1266
|
+
|
|
1267
|
+
glInternalFormat = gl.DEPTH32F_STENCIL8;
|
|
1268
|
+
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, glInternalFormat, width, height );
|
|
1211
1274
|
|
|
1212
1275
|
} else {
|
|
1213
1276
|
|
|
@@ -1266,6 +1329,8 @@ class WebGLTextureUtils {
|
|
|
1266
1329
|
|
|
1267
1330
|
const buffer = gl.createBuffer();
|
|
1268
1331
|
|
|
1332
|
+
backend.state.pixelStorei( gl.PACK_ALIGNMENT, 1 );
|
|
1333
|
+
|
|
1269
1334
|
gl.bindBuffer( gl.PIXEL_PACK_BUFFER, buffer );
|
|
1270
1335
|
gl.bufferData( gl.PIXEL_PACK_BUFFER, byteLength, gl.STREAM_READ );
|
|
1271
1336
|
gl.readPixels( x, y, width, height, glFormat, glType, 0 );
|
|
@@ -1300,12 +1365,17 @@ class WebGLTextureUtils {
|
|
|
1300
1365
|
const { gl } = this;
|
|
1301
1366
|
|
|
1302
1367
|
if ( glType === gl.UNSIGNED_BYTE ) return Uint8Array;
|
|
1368
|
+
if ( glType === gl.BYTE ) return Int8Array;
|
|
1303
1369
|
|
|
1304
1370
|
if ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ) return Uint16Array;
|
|
1305
1371
|
if ( glType === gl.UNSIGNED_SHORT_5_5_5_1 ) return Uint16Array;
|
|
1306
1372
|
if ( glType === gl.UNSIGNED_SHORT_5_6_5 ) return Uint16Array;
|
|
1307
1373
|
if ( glType === gl.UNSIGNED_SHORT ) return Uint16Array;
|
|
1374
|
+
if ( glType === gl.SHORT ) return Int16Array;
|
|
1308
1375
|
if ( glType === gl.UNSIGNED_INT ) return Uint32Array;
|
|
1376
|
+
if ( glType === gl.INT ) return Int32Array;
|
|
1377
|
+
if ( glType === gl.UNSIGNED_INT_5_9_9_9_REV ) return Uint32Array;
|
|
1378
|
+
if ( glType === gl.UNSIGNED_INT_10F_11F_11F_REV ) return Uint32Array;
|
|
1309
1379
|
|
|
1310
1380
|
if ( glType === gl.HALF_FLOAT ) return Uint16Array;
|
|
1311
1381
|
if ( glType === gl.FLOAT ) return Float32Array;
|
|
@@ -1326,22 +1396,32 @@ class WebGLTextureUtils {
|
|
|
1326
1396
|
|
|
1327
1397
|
const { gl } = this;
|
|
1328
1398
|
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
if ( glType === gl.UNSIGNED_BYTE ) bytesPerComponent = 1;
|
|
1399
|
+
// packed types store all components of a texel in a single value
|
|
1332
1400
|
|
|
1333
1401
|
if ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ||
|
|
1334
1402
|
glType === gl.UNSIGNED_SHORT_5_5_5_1 ||
|
|
1335
|
-
glType === gl.UNSIGNED_SHORT_5_6_5
|
|
1336
|
-
|
|
1403
|
+
glType === gl.UNSIGNED_SHORT_5_6_5 ) return 2;
|
|
1404
|
+
|
|
1405
|
+
if ( glType === gl.UNSIGNED_INT_5_9_9_9_REV ||
|
|
1406
|
+
glType === gl.UNSIGNED_INT_10F_11F_11F_REV ) return 4;
|
|
1407
|
+
|
|
1408
|
+
let bytesPerComponent = 0;
|
|
1409
|
+
|
|
1410
|
+
if ( glType === gl.UNSIGNED_BYTE ||
|
|
1411
|
+
glType === gl.BYTE ) bytesPerComponent = 1;
|
|
1412
|
+
|
|
1413
|
+
if ( glType === gl.UNSIGNED_SHORT ||
|
|
1414
|
+
glType === gl.SHORT ||
|
|
1337
1415
|
glType === gl.HALF_FLOAT ) bytesPerComponent = 2;
|
|
1338
1416
|
|
|
1339
1417
|
if ( glType === gl.UNSIGNED_INT ||
|
|
1418
|
+
glType === gl.INT ||
|
|
1340
1419
|
glType === gl.FLOAT ) bytesPerComponent = 4;
|
|
1341
1420
|
|
|
1342
|
-
if ( glFormat === gl.RGBA ) return bytesPerComponent * 4;
|
|
1421
|
+
if ( glFormat === gl.RGBA || glFormat === gl.RGBA_INTEGER ) return bytesPerComponent * 4;
|
|
1343
1422
|
if ( glFormat === gl.RGB ) return bytesPerComponent * 3;
|
|
1344
|
-
if ( glFormat === gl.
|
|
1423
|
+
if ( glFormat === gl.RG || glFormat === gl.RG_INTEGER ) return bytesPerComponent * 2;
|
|
1424
|
+
if ( glFormat === gl.RED || glFormat === gl.RED_INTEGER || glFormat === gl.ALPHA ) return bytesPerComponent;
|
|
1345
1425
|
|
|
1346
1426
|
}
|
|
1347
1427
|
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A WebGL 2 backend utility module for managing vertex array objects (VAOs).
|
|
3
|
+
*
|
|
4
|
+
* VAOs are shared between all owners (render objects and compute pipelines)
|
|
5
|
+
* that use the same GPU buffers and deleted when the last owner releases them
|
|
6
|
+
* or when one of their buffers is destroyed.
|
|
7
|
+
*
|
|
8
|
+
* @private
|
|
9
|
+
*/
|
|
10
|
+
class WebGLVertexArrayUtils {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Constructs a new utility object.
|
|
14
|
+
*
|
|
15
|
+
* @param {WebGLBackend} backend - The WebGL 2 backend.
|
|
16
|
+
*/
|
|
17
|
+
constructor( backend ) {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A reference to the WebGL 2 backend.
|
|
21
|
+
*
|
|
22
|
+
* @type {WebGLBackend}
|
|
23
|
+
*/
|
|
24
|
+
this.backend = backend;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The VAO cache. Entries are keyed by the IDs of the attribute buffers
|
|
28
|
+
* and hold one VAO per combination of active storage buffers as well
|
|
29
|
+
* as a usage counter.
|
|
30
|
+
*
|
|
31
|
+
* @type {Map<string,Object>}
|
|
32
|
+
*/
|
|
33
|
+
this.cache = new Map();
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returns a VAO for the given attributes.
|
|
39
|
+
*
|
|
40
|
+
* @param {RenderObject|ComputePipeline} owner - The render object or compute pipeline using the VAO.
|
|
41
|
+
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
42
|
+
* @param {?BufferAttribute} [index=null] - The index attribute.
|
|
43
|
+
* @return {WebGLVertexArrayObject} The VAO.
|
|
44
|
+
*/
|
|
45
|
+
getVAO( owner, attributes, index = null ) {
|
|
46
|
+
|
|
47
|
+
const backend = this.backend;
|
|
48
|
+
const ownerData = backend.get( owner );
|
|
49
|
+
|
|
50
|
+
const indexData = ( index !== null ) ? backend.get( index ) : null;
|
|
51
|
+
const indexGPU = ( indexData !== null ) ? indexData.bufferGPU : null;
|
|
52
|
+
|
|
53
|
+
if ( this._needsUpdate( ownerData, attributes, indexGPU ) === false ) return ownerData.vaoGPU;
|
|
54
|
+
|
|
55
|
+
// determine key, variant and attribute buffers
|
|
56
|
+
|
|
57
|
+
let key = '';
|
|
58
|
+
let variant = '';
|
|
59
|
+
|
|
60
|
+
const buffers = [];
|
|
61
|
+
const buffersData = [];
|
|
62
|
+
|
|
63
|
+
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
64
|
+
|
|
65
|
+
const attribute = attributes[ i ];
|
|
66
|
+
const attributeData = backend.get( backend.getBufferAttribute( attribute ) );
|
|
67
|
+
|
|
68
|
+
key += ':' + attributeData.id;
|
|
69
|
+
|
|
70
|
+
if ( attribute.isInterleavedBufferAttribute ) key += '.' + attribute.offset;
|
|
71
|
+
|
|
72
|
+
variant += ':' + ( attributeData.activeBufferIndex || 0 );
|
|
73
|
+
|
|
74
|
+
buffers.push( attributeData.bufferGPU );
|
|
75
|
+
buffersData.push( attributeData );
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// the element buffer binding is part of the VAO state
|
|
80
|
+
|
|
81
|
+
if ( indexData !== null ) {
|
|
82
|
+
|
|
83
|
+
key += '|' + indexData.id;
|
|
84
|
+
|
|
85
|
+
buffersData.push( indexData );
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// get cache entry
|
|
90
|
+
|
|
91
|
+
let entry = this.cache.get( key );
|
|
92
|
+
|
|
93
|
+
if ( key !== ownerData.vaoKey ) {
|
|
94
|
+
|
|
95
|
+
if ( ownerData.vaoKey !== undefined ) this._releaseEntry( ownerData.vaoKey ); // release old VAO
|
|
96
|
+
|
|
97
|
+
if ( entry === undefined ) {
|
|
98
|
+
|
|
99
|
+
entry = { vaos: new Map(), buffersData, usedTimes: 0 };
|
|
100
|
+
|
|
101
|
+
this.cache.set( key, entry );
|
|
102
|
+
|
|
103
|
+
// each buffer knows its VAOs so they can be deleted with the buffer
|
|
104
|
+
|
|
105
|
+
for ( const bufferData of buffersData ) {
|
|
106
|
+
|
|
107
|
+
if ( bufferData.vaoKeys === undefined ) bufferData.vaoKeys = new Set();
|
|
108
|
+
|
|
109
|
+
bufferData.vaoKeys.add( key );
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
entry.usedTimes ++;
|
|
116
|
+
|
|
117
|
+
ownerData.vaoKey = key;
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// get correct VAO variant (variants are needed for dual buffer attributes)
|
|
122
|
+
|
|
123
|
+
let vaoGPU = entry.vaos.get( variant );
|
|
124
|
+
|
|
125
|
+
if ( vaoGPU === undefined ) {
|
|
126
|
+
|
|
127
|
+
vaoGPU = this._createVAO( attributes, indexGPU );
|
|
128
|
+
|
|
129
|
+
entry.vaos.set( variant, vaoGPU );
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
ownerData.vaoGPU = vaoGPU;
|
|
134
|
+
ownerData.vertexBuffers = buffers;
|
|
135
|
+
ownerData.indexBuffer = indexGPU;
|
|
136
|
+
|
|
137
|
+
return vaoGPU;
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Releases the VAO used by the given owner.
|
|
143
|
+
*
|
|
144
|
+
* @param {RenderObject|ComputePipeline} owner - The render object or compute pipeline.
|
|
145
|
+
*/
|
|
146
|
+
releaseVAO( owner ) {
|
|
147
|
+
|
|
148
|
+
const ownerData = this.backend.get( owner );
|
|
149
|
+
|
|
150
|
+
if ( ownerData.vaoKey === undefined ) return;
|
|
151
|
+
|
|
152
|
+
this._releaseEntry( ownerData.vaoKey );
|
|
153
|
+
|
|
154
|
+
ownerData.vaoKey = undefined;
|
|
155
|
+
ownerData.vaoGPU = undefined;
|
|
156
|
+
ownerData.vertexBuffers = undefined;
|
|
157
|
+
ownerData.indexBuffer = undefined;
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Deletes all VAOs referencing the given attribute buffer. Must be called
|
|
163
|
+
* when the buffer is destroyed since VAOs keep the memory of attached buffers
|
|
164
|
+
* allocated. Owners of deleted VAOs request a new one with their next draw.
|
|
165
|
+
*
|
|
166
|
+
* @param {Object} bufferData - The backend data of the attribute buffer.
|
|
167
|
+
*/
|
|
168
|
+
releaseBuffer( bufferData ) {
|
|
169
|
+
|
|
170
|
+
if ( bufferData.vaoKeys === undefined ) return;
|
|
171
|
+
|
|
172
|
+
for ( const key of bufferData.vaoKeys ) {
|
|
173
|
+
|
|
174
|
+
this._deleteEntry( key );
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Frees internal resources.
|
|
182
|
+
*/
|
|
183
|
+
dispose() {
|
|
184
|
+
|
|
185
|
+
const { gl } = this.backend;
|
|
186
|
+
|
|
187
|
+
for ( const entry of this.cache.values() ) {
|
|
188
|
+
|
|
189
|
+
for ( const vaoGPU of entry.vaos.values() ) {
|
|
190
|
+
|
|
191
|
+
gl.deleteVertexArray( vaoGPU );
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
this.cache.clear();
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Returns `true` if the given attributes refer to other GPU buffers than
|
|
203
|
+
* the VAO of the given owner.
|
|
204
|
+
*
|
|
205
|
+
* @private
|
|
206
|
+
* @param {Object} ownerData - The backend data of the owner.
|
|
207
|
+
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
208
|
+
* @param {?WebGLBuffer} indexGPU - The index buffer.
|
|
209
|
+
* @return {boolean} Whether the owner requires a different VAO or not.
|
|
210
|
+
*/
|
|
211
|
+
_needsUpdate( ownerData, attributes, indexGPU ) {
|
|
212
|
+
|
|
213
|
+
const buffers = ownerData.vertexBuffers;
|
|
214
|
+
|
|
215
|
+
if ( buffers === undefined || buffers.length !== attributes.length || ownerData.indexBuffer !== indexGPU ) return true;
|
|
216
|
+
|
|
217
|
+
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
218
|
+
|
|
219
|
+
const bufferAttribute = this.backend.getBufferAttribute( attributes[ i ] );
|
|
220
|
+
|
|
221
|
+
if ( this.backend.get( bufferAttribute ).bufferGPU !== buffers[ i ] ) return true;
|
|
222
|
+
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return false;
|
|
226
|
+
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Releases the VAO entry. If possible, the all VAO variants are deleted.
|
|
231
|
+
*
|
|
232
|
+
* @private
|
|
233
|
+
* @param {string} key - The cache key.
|
|
234
|
+
*/
|
|
235
|
+
_releaseEntry( key ) {
|
|
236
|
+
|
|
237
|
+
const entry = this.cache.get( key );
|
|
238
|
+
|
|
239
|
+
if ( entry === undefined ) return; // already deleted with one of its buffers
|
|
240
|
+
|
|
241
|
+
entry.usedTimes --;
|
|
242
|
+
|
|
243
|
+
if ( entry.usedTimes === 0 ) this._deleteEntry( key );
|
|
244
|
+
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Deletes all VAO variants of the given cache entry.
|
|
249
|
+
*
|
|
250
|
+
* @private
|
|
251
|
+
* @param {string} key - The cache key.
|
|
252
|
+
*/
|
|
253
|
+
_deleteEntry( key ) {
|
|
254
|
+
|
|
255
|
+
const { gl, state } = this.backend;
|
|
256
|
+
|
|
257
|
+
const entry = this.cache.get( key );
|
|
258
|
+
|
|
259
|
+
for ( const vaoGPU of entry.vaos.values() ) {
|
|
260
|
+
|
|
261
|
+
if ( state.currentVAO === vaoGPU ) state.resetVertexState();
|
|
262
|
+
|
|
263
|
+
gl.deleteVertexArray( vaoGPU );
|
|
264
|
+
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
for ( const bufferData of entry.buffersData ) {
|
|
268
|
+
|
|
269
|
+
bufferData.vaoKeys.delete( key );
|
|
270
|
+
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
this.cache.delete( key );
|
|
274
|
+
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Creates a VAO from the given attributes.
|
|
279
|
+
*
|
|
280
|
+
* @private
|
|
281
|
+
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
282
|
+
* @param {?WebGLBuffer} indexGPU - The index buffer.
|
|
283
|
+
* @return {WebGLVertexArrayObject} The VAO.
|
|
284
|
+
*/
|
|
285
|
+
_createVAO( attributes, indexGPU ) {
|
|
286
|
+
|
|
287
|
+
const { gl, state } = this.backend;
|
|
288
|
+
|
|
289
|
+
const vaoGPU = gl.createVertexArray();
|
|
290
|
+
|
|
291
|
+
state.setVertexState( vaoGPU, indexGPU );
|
|
292
|
+
|
|
293
|
+
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
294
|
+
|
|
295
|
+
const attribute = attributes[ i ];
|
|
296
|
+
const bufferAttribute = this.backend.getBufferAttribute( attribute );
|
|
297
|
+
const attributeData = this.backend.get( bufferAttribute );
|
|
298
|
+
|
|
299
|
+
gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
|
|
300
|
+
gl.enableVertexAttribArray( i );
|
|
301
|
+
|
|
302
|
+
let stride, offset;
|
|
303
|
+
|
|
304
|
+
if ( attribute.isInterleavedBufferAttribute === true ) {
|
|
305
|
+
|
|
306
|
+
// interleaved attributes can also view a buffer attribute
|
|
307
|
+
|
|
308
|
+
const bufferStride = bufferAttribute.isInterleavedBuffer === true ? bufferAttribute.stride : bufferAttribute.itemSize;
|
|
309
|
+
|
|
310
|
+
stride = bufferStride * attributeData.bytesPerElement;
|
|
311
|
+
offset = attribute.offset * attributeData.bytesPerElement;
|
|
312
|
+
|
|
313
|
+
} else {
|
|
314
|
+
|
|
315
|
+
stride = 0;
|
|
316
|
+
offset = 0;
|
|
317
|
+
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if ( attributeData.isInteger ) {
|
|
321
|
+
|
|
322
|
+
gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
|
|
323
|
+
|
|
324
|
+
} else {
|
|
325
|
+
|
|
326
|
+
gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
|
|
327
|
+
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if ( bufferAttribute.isInstancedBufferAttribute === true || bufferAttribute.isInstancedInterleavedBuffer === true ) {
|
|
331
|
+
|
|
332
|
+
gl.vertexAttribDivisor( i, bufferAttribute.meshPerAttribute );
|
|
333
|
+
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
gl.bindBuffer( gl.ARRAY_BUFFER, null );
|
|
339
|
+
|
|
340
|
+
return vaoGPU;
|
|
341
|
+
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export default WebGLVertexArrayUtils;
|