@onerjs/core 8.35.9 → 8.36.2
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/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +1 -1
- package/Engines/constants.js +1 -1
- package/Engines/constants.js.map +1 -1
- package/Lights/areaLight.d.ts +1 -1
- package/Lights/areaLight.js +1 -1
- package/Lights/areaLight.js.map +1 -1
- package/Lights/rectAreaLight.d.ts +20 -0
- package/Lights/rectAreaLight.js +45 -0
- package/Lights/rectAreaLight.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +6 -3
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/material.d.ts +1 -1
- package/Materials/material.js +1 -1
- package/Materials/material.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +2 -1
- package/Materials/materialHelper.functions.js +6 -2
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/materialPluginManager.js +2 -2
- package/Materials/materialPluginManager.js.map +1 -1
- package/Maths/math.path.js +9 -3
- package/Maths/math.path.js.map +1 -1
- package/Meshes/Builders/greasedLineBuilder.d.ts +4 -0
- package/Meshes/Builders/greasedLineBuilder.js +37 -23
- package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +3 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -5
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/areaLightsTextureTools.d.ts +52 -0
- package/Misc/areaLightsTextureTools.js +227 -0
- package/Misc/areaLightsTextureTools.js.map +1 -0
- package/Misc/decorators.serialization.js +6 -1
- package/Misc/decorators.serialization.js.map +1 -1
- package/Misc/index.d.ts +3 -0
- package/Misc/index.js +4 -0
- package/Misc/index.js.map +1 -1
- package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +4 -0
- package/Particles/Node/Blocks/particleSourceTextureBlock.js +9 -3
- package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.d.ts +2 -0
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +1 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +10 -0
- package/Physics/v2/Plugins/havokPlugin.js +13 -0
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/physicsBody.d.ts +10 -0
- package/Physics/v2/physicsBody.js +12 -0
- package/Physics/v2/physicsBody.js.map +1 -1
- package/Physics/v2/physicsEngineComponent.d.ts +5 -0
- package/Physics/v2/physicsEngineComponent.js +13 -0
- package/Physics/v2/physicsEngineComponent.js.map +1 -1
- package/Rendering/utilityLayerRenderer.d.ts +6 -0
- package/Rendering/utilityLayerRenderer.js +14 -5
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +13 -0
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragmentDeclaration.js +3 -0
- package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/lightUboDeclaration.js +3 -0
- package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js +6 -0
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/ltcHelperFunctions.js +17 -1
- package/Shaders/ShadersInclude/ltcHelperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +6 -0
- package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
- package/Shaders/areaLightTextureProcessing.fragment.d.ts +5 -0
- package/Shaders/areaLightTextureProcessing.fragment.js +13 -0
- package/Shaders/areaLightTextureProcessing.fragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.js +14 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +6 -0
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js +19 -1
- package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +5 -0
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
- package/ShadersWGSL/areaLightTextureProcessing.fragment.d.ts +5 -0
- package/ShadersWGSL/areaLightTextureProcessing.fragment.js +12 -0
- package/ShadersWGSL/areaLightTextureProcessing.fragment.js.map +1 -0
- package/ShadersWGSL/iblVoxelGrid.vertex.js +2 -2
- package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -1
- package/States/alphaCullingState.js +0 -1
- package/States/alphaCullingState.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +2 -1
- package/XR/features/WebXRHandTracking.js +59 -35
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/package.json +1 -1
|
@@ -27,7 +27,25 @@ var mInvEmpty:mat3x3<f32>=mat3x3<f32>(
|
|
|
27
27
|
vec3f( 1,0,0 ),
|
|
28
28
|
vec3f( 0,1,0 ),
|
|
29
29
|
vec3f( 0,0,1 )
|
|
30
|
-
);result.Diffuse+=LTCEvaluate( normal,viewDir,position,mInvEmpty,rectCoords0,rectCoords1,rectCoords2,rectCoords3 );return result;}
|
|
30
|
+
);result.Diffuse+=LTCEvaluate( normal,viewDir,position,mInvEmpty,rectCoords0,rectCoords1,rectCoords2,rectCoords3 );return result;}
|
|
31
|
+
fn FetchDiffuseFilteredTexture(texLightFiltered: texture_2d<f32>,texLightFilteredSampler: sampler,p1_: vec3f,p2_: vec3f,p3_: vec3f,p4_: vec3f)->vec3f {var V1: vec3f=p2_-p1_;var V2: vec3f=p4_-p1_;var planeOrtho: vec3f=cross(V1,V2);var planeAreaSquared: f32=dot(planeOrtho,planeOrtho);var planeDistxPlaneArea: f32=dot(planeOrtho,p1_);var P: vec3f=planeDistxPlaneArea*planeOrtho/planeAreaSquared-p1_;var dot_V1_V2: f32=dot(V1,V2);var inv_dot_V1_V1: f32=1.0/dot(V1,V1);var V2_: vec3f=V2-V1*dot_V1_V2*inv_dot_V1_V1;var Puv: vec2f;Puv.y=dot(V2_,P)/dot(V2_,V2_);Puv.x=dot(V1,P)*inv_dot_V1_V1-dot_V1_V2*inv_dot_V1_V1*Puv.y;var d: f32=abs(planeDistxPlaneArea)/pow(planeAreaSquared,0.75);var sampleLOD: f32=log(2048.0*d)/log(3.0);var sampleUV: vec2f=vec2f(0.125,0.125)+(vec2f(0.75)*Puv);sampleUV.x=1.0-sampleUV.x;return textureSampleLevel(texLightFiltered,texLightFilteredSampler,sampleUV,sampleLOD).rgb;}
|
|
32
|
+
fn LTCEvaluateWithEmission(N: vec3f,V: vec3f,P: vec3f,mInv: mat3x3<f32>,rectCoords0: vec3f,rectCoords1: vec3f,rectCoords2: vec3f,rectCoords3: vec3f,texFilteredMap: texture_2d<f32>,texFilteredMapSampler: sampler)->vec3f {var v1: vec3f=rectCoords1-rectCoords0;var v2: vec3f=rectCoords3-rectCoords0;var lightNormal: vec3f=cross(v1,v2);if (dot(lightNormal,P-rectCoords0)<0.0) {return vec3f(0.0);}
|
|
33
|
+
var T1: vec3f=normalize(V-N*dot(V,N));var T2: vec3f=-cross(N,T1);var mat: mat3x3<f32>=mInv*transposeMat3(mat3x3<f32>(T1,T2,N));var coords0: vec3f=mat*(rectCoords0-P);var coords1: vec3f=mat*(rectCoords1-P);var coords2: vec3f=mat*(rectCoords2-P);var coords3: vec3f=mat*(rectCoords3-P);var textureLight: vec3f=FetchDiffuseFilteredTexture(texFilteredMap,texFilteredMapSampler,coords0,coords1,coords2,coords3);coords0=normalize(coords0);coords1=normalize(coords1);coords2=normalize(coords2);coords3=normalize(coords3);var vectorFormFactor: vec3f=vec3f(0.0);vectorFormFactor+=LTCEdgeVectorFormFactor(coords0,coords1);vectorFormFactor+=LTCEdgeVectorFormFactor(coords1,coords2);vectorFormFactor+=LTCEdgeVectorFormFactor(coords2,coords3);vectorFormFactor+=LTCEdgeVectorFormFactor(coords3,coords0);var result: f32=LTCClippedSphereFormFactor(vectorFormFactor);return vec3f(result)*textureLight;}
|
|
34
|
+
fn computeAreaLightSpecularDiffuseFresnelWithEmission(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,emissionTexture: texture_2d<f32>,emissionTextureSampler:sampler,viewDir: vec3f,normal:vec3f,position:vec3f,lightPos:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->areaLightData {var result: areaLightData;var rectCoords0: vec3f=lightPos+halfWidth-halfHeight;
|
|
35
|
+
var rectCoords1: vec3f=lightPos-halfWidth-halfHeight;var rectCoords2: vec3f=lightPos-halfWidth+halfHeight;var rectCoords3: vec3f=lightPos+halfWidth+halfHeight;
|
|
36
|
+
#ifdef SPECULARTERM
|
|
37
|
+
var uv: vec2f=LTCUv(normal,viewDir,roughness);var t1: vec4f=textureSample(ltc1,ltc1Sampler,uv);var t2: vec4f=textureSample(ltc2,ltc2Sampler,uv);var mInv: mat3x3<f32>=mat3x3<f32>(
|
|
38
|
+
vec3f(t1.x,0,t1.y),
|
|
39
|
+
vec3f(0,1,0),
|
|
40
|
+
vec3f(t1.z,0,t1.w)
|
|
41
|
+
);result.Specular=LTCEvaluateWithEmission(normal,viewDir,position,mInv,rectCoords0,rectCoords1,rectCoords2,rectCoords3,emissionTexture,emissionTextureSampler);result.Fresnel=t2;
|
|
42
|
+
#endif
|
|
43
|
+
var mInvEmpty: mat3x3<f32>=mat3x3<f32>(
|
|
44
|
+
vec3f(1,0,0),
|
|
45
|
+
vec3f(0,1,0),
|
|
46
|
+
vec3f(0,0,1)
|
|
47
|
+
);result.Diffuse=LTCEvaluateWithEmission(normal,viewDir,position,mInvEmpty,rectCoords0,rectCoords1,rectCoords2,rectCoords3,emissionTexture,emissionTextureSampler);return result;}
|
|
48
|
+
`;
|
|
31
49
|
// Sideeffect
|
|
32
50
|
if (!ShaderStore.IncludesShadersStoreWGSL[name]) {
|
|
33
51
|
ShaderStore.IncludesShadersStoreWGSL[name] = shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ltcHelperFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/ltcHelperFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAClC,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"ltcHelperFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/ltcHelperFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAClC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Cd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"ltcHelperFunctions\";\nconst shader = `fn LTCUv(N: vec3f,V: vec3f,roughness: f32)->vec2f {var LUTSIZE: f32=64.0;var LUTSCALE: f32=( LUTSIZE-1.0 )/LUTSIZE;var LUTBIAS:f32=0.5/LUTSIZE;var dotNV:f32=saturate( dot( N,V ) );var uv:vec2f=vec2f( roughness,sqrt( 1.0-dotNV ) );uv=uv*LUTSCALE+LUTBIAS;return uv;}\nfn LTCClippedSphereFormFactor( f:vec3f )->f32 {var l: f32=length( f );return max( ( l*l+f.z )/( l+1.0 ),0.0 );}\nfn LTCEdgeVectorFormFactor( v1:vec3f,v2:vec3f )->vec3f {var x:f32=dot( v1,v2 );var y:f32=abs( x );var a:f32=0.8543985+( 0.4965155+0.0145206*y )*y;var b:f32=3.4175940+( 4.1616724+y )*y;var v:f32=a/b;var thetaSintheta:f32=0.0;if( x>0.0 )\n{thetaSintheta=v;}\nelse\n{thetaSintheta=0.5*inverseSqrt( max( 1.0-x*x,0.00000001 ) )-v;}\nreturn cross( v1,v2 )*thetaSintheta;}\nfn LTCEvaluate( N:vec3f,V:vec3f,P:vec3f,mInv: mat3x3<f32>,rectCoords0:vec3f,rectCoords1:vec3f,rectCoords2:vec3f,rectCoords3:vec3f )->vec3f {var v1:vec3f=rectCoords1-rectCoords0;var v2:vec3f=rectCoords3-rectCoords0;var lightNormal:vec3f=cross( v1,v2 );if( dot( lightNormal,P-rectCoords0 )<0.0 ){return vec3f( 0.0 );}\nvar T1:vec3f=normalize( V-N*dot( V,N ) );var T2:vec3f=- cross( N,T1 ); \nvar mat: mat3x3<f32>=mInv*transposeMat3( mat3x3<f32>( T1,T2,N ) );var coords0: vec3f=mat*( rectCoords0-P );var coords1: vec3f=mat*( rectCoords1-P );var coords2: vec3f=mat*( rectCoords2-P );var coords3: vec3f=mat*( rectCoords3-P );coords0=normalize( coords0 );coords1=normalize( coords1 );coords2=normalize( coords2 );coords3=normalize( coords3 );var vectorFormFactor:vec3f=vec3( 0.0 );vectorFormFactor+=LTCEdgeVectorFormFactor( coords0,coords1 );vectorFormFactor+=LTCEdgeVectorFormFactor( coords1,coords2 );vectorFormFactor+=LTCEdgeVectorFormFactor( coords2,coords3 );vectorFormFactor+=LTCEdgeVectorFormFactor( coords3,coords0 );var result:f32=LTCClippedSphereFormFactor( vectorFormFactor );return vec3f( result );}\nstruct areaLightData\n{Diffuse: vec3f,\nSpecular: vec3f,\nFresnel: vec4f};fn computeAreaLightSpecularDiffuseFresnel(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,viewDir: vec3f,normal:vec3f,position:vec3f,lightPos:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->areaLightData {var result: areaLightData;var rectCoords0:vec3f=lightPos+halfWidth-halfHeight; \nvar rectCoords1:vec3f=lightPos-halfWidth-halfHeight;var rectCoords2:vec3f=lightPos-halfWidth+halfHeight;var rectCoords3:vec3f=lightPos+halfWidth+halfHeight;\n#ifdef SPECULARTERM\nvar uv:vec2f=LTCUv( normal,viewDir,roughness );var t1:vec4f=textureSample( ltc1,ltc1Sampler,uv );var t2:vec4f=textureSample( ltc2,ltc2Sampler,uv );var mInv:mat3x3<f32>=mat3x3<f32>(\nvec3f( t1.x,0,t1.y ),\nvec3f( 0,1, 0 ),\nvec3f( t1.z,0,t1.w )\n);result.Fresnel=t2;result.Specular=LTCEvaluate( normal,viewDir,position,mInv,rectCoords0,rectCoords1,rectCoords2,rectCoords3 );\n#endif\nvar mInvEmpty:mat3x3<f32>=mat3x3<f32>(\nvec3f( 1,0,0 ),\nvec3f( 0,1,0 ),\nvec3f( 0,0,1 )\n);result.Diffuse+=LTCEvaluate( normal,viewDir,position,mInvEmpty,rectCoords0,rectCoords1,rectCoords2,rectCoords3 );return result;}\nfn FetchDiffuseFilteredTexture(texLightFiltered: texture_2d<f32>,texLightFilteredSampler: sampler,p1_: vec3f,p2_: vec3f,p3_: vec3f,p4_: vec3f)->vec3f {var V1: vec3f=p2_-p1_;var V2: vec3f=p4_-p1_;var planeOrtho: vec3f=cross(V1,V2);var planeAreaSquared: f32=dot(planeOrtho,planeOrtho);var planeDistxPlaneArea: f32=dot(planeOrtho,p1_);var P: vec3f=planeDistxPlaneArea*planeOrtho/planeAreaSquared-p1_;var dot_V1_V2: f32=dot(V1,V2);var inv_dot_V1_V1: f32=1.0/dot(V1,V1);var V2_: vec3f=V2-V1*dot_V1_V2*inv_dot_V1_V1;var Puv: vec2f;Puv.y=dot(V2_,P)/dot(V2_,V2_);Puv.x=dot(V1,P)*inv_dot_V1_V1-dot_V1_V2*inv_dot_V1_V1*Puv.y;var d: f32=abs(planeDistxPlaneArea)/pow(planeAreaSquared,0.75);var sampleLOD: f32=log(2048.0*d)/log(3.0);var sampleUV: vec2f=vec2f(0.125,0.125)+(vec2f(0.75)*Puv);sampleUV.x=1.0-sampleUV.x;return textureSampleLevel(texLightFiltered,texLightFilteredSampler,sampleUV,sampleLOD).rgb;}\nfn LTCEvaluateWithEmission(N: vec3f,V: vec3f,P: vec3f,mInv: mat3x3<f32>,rectCoords0: vec3f,rectCoords1: vec3f,rectCoords2: vec3f,rectCoords3: vec3f,texFilteredMap: texture_2d<f32>,texFilteredMapSampler: sampler)->vec3f {var v1: vec3f=rectCoords1-rectCoords0;var v2: vec3f=rectCoords3-rectCoords0;var lightNormal: vec3f=cross(v1,v2);if (dot(lightNormal,P-rectCoords0)<0.0) {return vec3f(0.0);}\nvar T1: vec3f=normalize(V-N*dot(V,N));var T2: vec3f=-cross(N,T1);var mat: mat3x3<f32>=mInv*transposeMat3(mat3x3<f32>(T1,T2,N));var coords0: vec3f=mat*(rectCoords0-P);var coords1: vec3f=mat*(rectCoords1-P);var coords2: vec3f=mat*(rectCoords2-P);var coords3: vec3f=mat*(rectCoords3-P);var textureLight: vec3f=FetchDiffuseFilteredTexture(texFilteredMap,texFilteredMapSampler,coords0,coords1,coords2,coords3);coords0=normalize(coords0);coords1=normalize(coords1);coords2=normalize(coords2);coords3=normalize(coords3);var vectorFormFactor: vec3f=vec3f(0.0);vectorFormFactor+=LTCEdgeVectorFormFactor(coords0,coords1);vectorFormFactor+=LTCEdgeVectorFormFactor(coords1,coords2);vectorFormFactor+=LTCEdgeVectorFormFactor(coords2,coords3);vectorFormFactor+=LTCEdgeVectorFormFactor(coords3,coords0);var result: f32=LTCClippedSphereFormFactor(vectorFormFactor);return vec3f(result)*textureLight;}\nfn computeAreaLightSpecularDiffuseFresnelWithEmission(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,emissionTexture: texture_2d<f32>,emissionTextureSampler:sampler,viewDir: vec3f,normal:vec3f,position:vec3f,lightPos:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->areaLightData {var result: areaLightData;var rectCoords0: vec3f=lightPos+halfWidth-halfHeight; \nvar rectCoords1: vec3f=lightPos-halfWidth-halfHeight;var rectCoords2: vec3f=lightPos-halfWidth+halfHeight;var rectCoords3: vec3f=lightPos+halfWidth+halfHeight;\n#ifdef SPECULARTERM\nvar uv: vec2f=LTCUv(normal,viewDir,roughness);var t1: vec4f=textureSample(ltc1,ltc1Sampler,uv);var t2: vec4f=textureSample(ltc2,ltc2Sampler,uv);var mInv: mat3x3<f32>=mat3x3<f32>(\nvec3f(t1.x,0,t1.y),\nvec3f(0,1,0),\nvec3f(t1.z,0,t1.w)\n);result.Specular=LTCEvaluateWithEmission(normal,viewDir,position,mInv,rectCoords0,rectCoords1,rectCoords2,rectCoords3,emissionTexture,emissionTextureSampler);result.Fresnel=t2;\n#endif\nvar mInvEmpty: mat3x3<f32>=mat3x3<f32>(\nvec3f(1,0,0),\nvec3f(0,1,0),\nvec3f(0,0,1)\n);result.Diffuse=LTCEvaluateWithEmission(normal,viewDir,position,mInvEmpty,rectCoords0,rectCoords1,rectCoords2,rectCoords3,emissionTexture,emissionTextureSampler);return result;}\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStoreWGSL[name]) {\n ShaderStore.IncludesShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const ltcHelperFunctionsWGSL = { name, shader };\n"]}
|
|
@@ -41,6 +41,11 @@ var areaLightsLTC1SamplerSampler: sampler;var areaLightsLTC1Sampler: texture_2d<
|
|
|
41
41
|
result.areaLightFresnel=data.Fresnel;result.areaLightSpecular=data.Specular;
|
|
42
42
|
#endif
|
|
43
43
|
result.areaLightDiffuse+=data.Diffuse;return result;}
|
|
44
|
+
fn computeAreaPreLightingInfoWithTexture(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,emissionTexture:texture_2d<f32>,emissionTextureSampler:sampler,viewDirectionW: vec3f,vNormal:vec3f,vPosition:vec3f,lightCenter:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->preLightingInfo {var result: preLightingInfo;result.lightOffset=lightCenter-vPosition;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);var data: areaLightData=computeAreaLightSpecularDiffuseFresnelWithEmission(ltc1,ltc1Sampler,ltc2,ltc2Sampler,emissionTexture,emissionTextureSampler,viewDirectionW,vNormal,vPosition,lightCenter,halfWidth,halfHeight,roughness);
|
|
45
|
+
#ifdef SPECULARTERM
|
|
46
|
+
result.areaLightFresnel=data.Fresnel;result.areaLightSpecular=data.Specular;
|
|
47
|
+
#endif
|
|
48
|
+
result.areaLightDiffuse=data.Diffuse;result.LdotV=0.;result.roughness=0.;result.diffuseRoughness=0.;result.surfaceAlbedo=vec3f(0.);return result;}
|
|
44
49
|
#endif
|
|
45
50
|
`;
|
|
46
51
|
// Sideeffect
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbrDirectLightingSetupFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,sBAAsB,CAAC;AAE9B,MAAM,IAAI,GAAG,iCAAiC,CAAC;AAC/C,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"pbrDirectLightingSetupFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,sBAAsB,CAAC;AAE9B,MAAM,IAAI,GAAG,iCAAiC,CAAC;AAC/C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Cd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mCAAmC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./ltcHelperFunctions\";\n\nconst name = \"pbrDirectLightingSetupFunctions\";\nconst shader = `struct preLightingInfo\n{lightOffset: vec3f,\nlightDistanceSquared: f32,\nlightDistance: f32,\nattenuation: f32,\nL: vec3f,\nH: vec3f,\nNdotV: f32,\nNdotLUnclamped: f32,\nNdotL: f32,\nVdotH: f32,\nLdotV: f32,\nroughness: f32,\ndiffuseRoughness: f32,\nsurfaceAlbedo: vec3f,\n#ifdef IRIDESCENCE\niridescenceIntensity: f32\n#endif\n#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nareaLightDiffuse: vec3f,\n#ifdef SPECULARTERM\nareaLightSpecular: vec3f,\nareaLightFresnel: vec4f\n#endif\n#endif\n};fn computePointAndSpotPreLightingInfo(lightData: vec4f,V: vec3f,N: vec3f,posW: vec3f)->preLightingInfo {var result: preLightingInfo;result.lightOffset=lightData.xyz-posW;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);result.L=normalize(result.lightOffset);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);return result;}\nfn computeDirectionalPreLightingInfo(lightData: vec4f,V: vec3f,N: vec3f)->preLightingInfo {var result: preLightingInfo;result.lightDistance=length(-lightData.xyz);result.L=normalize(-lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));result.NdotLUnclamped=dot(N,result.L);result.NdotL=saturateEps(result.NdotLUnclamped);result.LdotV=dot(result.L,V);return result;}\nfn computeHemisphericPreLightingInfo(lightData: vec4f,V: vec3f,N: vec3f)->preLightingInfo {var result: preLightingInfo;result.NdotL=dot(N,lightData.xyz)*0.5+0.5;result.NdotL=saturateEps(result.NdotL);result.NdotLUnclamped=result.NdotL;\n#ifdef SPECULARTERM\nresult.L=normalize(lightData.xyz);result.H=normalize(V+result.L);result.VdotH=saturate(dot(V,result.H));\n#endif\nreturn result;}\n#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\n#include<ltcHelperFunctions>\nvar areaLightsLTC1SamplerSampler: sampler;var areaLightsLTC1Sampler: texture_2d<f32>;var areaLightsLTC2SamplerSampler: sampler;var areaLightsLTC2Sampler: texture_2d<f32>;fn computeAreaPreLightingInfo(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,viewDirectionW: vec3f,vNormal:vec3f,vPosition:vec3f,lightCenter:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->preLightingInfo {var result: preLightingInfo;var data: areaLightData=computeAreaLightSpecularDiffuseFresnel(ltc1,ltc1Sampler,ltc2,ltc2Sampler,viewDirectionW,vNormal,vPosition,lightCenter,halfWidth,halfHeight,roughness);\n#ifdef SPECULARTERM\nresult.areaLightFresnel=data.Fresnel;result.areaLightSpecular=data.Specular;\n#endif\nresult.areaLightDiffuse+=data.Diffuse;return result;}\nfn computeAreaPreLightingInfoWithTexture(ltc1: texture_2d<f32>,ltc1Sampler:sampler,ltc2:texture_2d<f32>,ltc2Sampler:sampler,emissionTexture:texture_2d<f32>,emissionTextureSampler:sampler,viewDirectionW: vec3f,vNormal:vec3f,vPosition:vec3f,lightCenter:vec3f,halfWidth:vec3f, halfHeight:vec3f,roughness:f32)->preLightingInfo {var result: preLightingInfo;result.lightOffset=lightCenter-vPosition;result.lightDistanceSquared=dot(result.lightOffset,result.lightOffset);result.lightDistance=sqrt(result.lightDistanceSquared);var data: areaLightData=computeAreaLightSpecularDiffuseFresnelWithEmission(ltc1,ltc1Sampler,ltc2,ltc2Sampler,emissionTexture,emissionTextureSampler,viewDirectionW,vNormal,vPosition,lightCenter,halfWidth,halfHeight,roughness);\n#ifdef SPECULARTERM\nresult.areaLightFresnel=data.Fresnel;result.areaLightSpecular=data.Specular;\n#endif\nresult.areaLightDiffuse=data.Diffuse;result.LdotV=0.;result.roughness=0.;result.diffuseRoughness=0.;result.surfaceAlbedo=vec3f(0.);return result;}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStoreWGSL[name]) {\n ShaderStore.IncludesShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const pbrDirectLightingSetupFunctionsWGSL = { name, shader };\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Do not edit.
|
|
2
|
+
import { ShaderStore } from "../Engines/shaderStore.js";
|
|
3
|
+
const name = "areaLightTextureProcessingPixelShader";
|
|
4
|
+
const shader = `varying vUV: vec2f;var textureSamplerSampler: sampler;var textureSampler: texture_2d<f32>;uniform scalingRange: vec2f;@fragment
|
|
5
|
+
fn main(input: FragmentInputs)->FragmentOutputs {let x: f32=(input.vUV.x-uniforms.scalingRange.x)/(uniforms.scalingRange.y-uniforms.scalingRange.x);let y: f32=(input.vUV.y-uniforms.scalingRange.x)/(uniforms.scalingRange.y-uniforms.scalingRange.x);let scaledUV: vec2f=vec2f(x,y);fragmentOutputs.color=textureSample(textureSampler,textureSamplerSampler,scaledUV);}`;
|
|
6
|
+
// Sideeffect
|
|
7
|
+
if (!ShaderStore.ShadersStoreWGSL[name]) {
|
|
8
|
+
ShaderStore.ShadersStoreWGSL[name] = shader;
|
|
9
|
+
}
|
|
10
|
+
/** @internal */
|
|
11
|
+
export const areaLightTextureProcessingPixelShaderWGSL = { name, shader };
|
|
12
|
+
//# sourceMappingURL=areaLightTextureProcessing.fragment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"areaLightTextureProcessing.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/areaLightTextureProcessing.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,uCAAuC,CAAC;AACrD,MAAM,MAAM,GAAG;2WAC4V,CAAC;AAC5W,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,yCAAyC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"areaLightTextureProcessingPixelShader\";\nconst shader = `varying vUV: vec2f;var textureSamplerSampler: sampler;var textureSampler: texture_2d<f32>;uniform scalingRange: vec2f;@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {let x: f32=(input.vUV.x-uniforms.scalingRange.x)/(uniforms.scalingRange.y-uniforms.scalingRange.x);let y: f32=(input.vUV.y-uniforms.scalingRange.x)/(uniforms.scalingRange.y-uniforms.scalingRange.x);let scaledUV: vec2f=vec2f(x,y);fragmentOutputs.color=textureSample(textureSampler,textureSamplerSampler,scaledUV);}`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const areaLightTextureProcessingPixelShaderWGSL = { name, shader };\n"]}
|
|
@@ -57,7 +57,7 @@ readMatrixWeightValue(offset+componentSize*2u,dataType),
|
|
|
57
57
|
readMatrixWeightValue(offset+componentSize*3u,dataType)
|
|
58
58
|
);}
|
|
59
59
|
#if NUM_BONE_INFLUENCERS>4
|
|
60
|
-
fn readMatrixIndexExtraValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=
|
|
60
|
+
fn readMatrixIndexExtraValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word : u32=matricesIndicesExtra[wordOffset];return convertToFloat(word,byteInWord,dataType);}
|
|
61
61
|
fn readMatrixIndicesExtra(info: vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(
|
|
62
62
|
readMatrixIndexExtraValue(offset,dataType),
|
|
63
63
|
readMatrixIndexExtraValue(offset+componentSize,dataType),
|
|
@@ -65,7 +65,7 @@ readMatrixIndexExtraValue(offset+componentSize*2u,dataType),
|
|
|
65
65
|
readMatrixIndexExtraValue(offset+componentSize*3u,dataType)
|
|
66
66
|
);}
|
|
67
67
|
fn readMatrixWeightExtraValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=bitcast<u32>(matricesWeightsExtra[wordOffset]);return convertToFloat(word,byteInWord,dataType);}
|
|
68
|
-
fn
|
|
68
|
+
fn readMatrixWeightsExtra(info : vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(
|
|
69
69
|
readMatrixWeightExtraValue(offset,dataType),
|
|
70
70
|
readMatrixWeightExtraValue(offset+componentSize,dataType),
|
|
71
71
|
readMatrixWeightExtraValue(offset+componentSize*2u,dataType),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iblVoxelGrid.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/iblVoxelGrid.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,sDAAsD,CAAC;AAC9D,OAAO,gDAAgD,CAAC;AACxD,OAAO,8BAA8B,CAAC;AACtC,OAAO,uCAAuC,CAAC;AAE/C,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/morphTargetsVertexGlobalDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexDeclaration\";\nimport \"./ShadersInclude/bonesVertex\";\nimport \"./ShadersInclude/bakedVertexAnimation\";\n\nconst name = \"iblVoxelGridVertexShader\";\nconst shader = `#include <bakedVertexAnimationDeclaration>\n#include <bonesDeclaration>(attribute matricesIndices : vec4f;,,attribute matricesWeights : vec4f;,,attribute matricesIndicesExtra : vec4f;,,attribute matricesWeightsExtra : vec4f;,)\n#include <helperFunctions>\n#include <instancesDeclaration>\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\n#ifdef VERTEX_PULLING_USE_INDEX_BUFFER\nvar<storage,read> indices : array<u32>;\n#endif\nvar<storage,read> position : array<f32>;\n#if NUM_BONE_INFLUENCERS>0\nvar<storage,read> matricesIndices : array<u32>;var<storage,read> matricesWeights : array<f32>;uniform vp_matricesIndices_info: vec3f;uniform vp_matricesWeights_info: vec3f;\n#if NUM_BONE_INFLUENCERS>4\nvar<storage,read> matricesIndicesExtra : array<u32>;var<storage,read> matricesWeightsExtra : array<f32>;uniform vp_matricesIndicesExtra_info: vec3f;uniform vp_matricesWeightsExtra_info: vec3f;\n#endif\n#endif\nuniform world : mat4x4f;uniform invWorldScale: mat4x4f;varying vNormalizedPosition : vec3f;flat varying f_swizzle: i32;uniform vp_position_info: vec3f; \nfn convertToFloat(word: u32,byteInWord: u32,dataType: u32)->f32 {switch (dataType) {case 5120u: { \nlet shift=byteInWord*8u;let value=(word>>shift) & 0xFFu;return f32(i32(value<<24u)>>24u)/127.0; }\ncase 5121u: { \nlet shift=byteInWord*8u;let value=(word>>shift) & 0xFFu;return f32(value)/255.0;}\ncase 5122u: { \nlet shift=(byteInWord & 0xFFFFFFFEu)*8u; \nlet value=(word>>shift) & 0xFFFFu;return f32(i32(value<<16u)>>16u);}\ncase 5123u: { \nlet shift=(byteInWord & 0xFFFFFFFEu)*8u; \nlet value=(word>>shift) & 0xFFFFu;return f32(value);}\ncase 5126u: { \nreturn bitcast<f32>(word);}\ndefault: {return 0.0;}}}\nfn readPositionValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=bitcast<u32>(position[wordOffset]);return convertToFloat(word,byteInWord,dataType);}\nfn readVertexPosition(info: vec3f,vertexIndex: u32)->vec3f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec3f(\nreadPositionValue(offset,dataType),\nreadPositionValue(offset+componentSize,dataType),\nreadPositionValue(offset+componentSize*2u,dataType)\n);}\n#if NUM_BONE_INFLUENCERS>0\nfn readMatrixIndexValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=matricesIndices[wordOffset];return convertToFloat(word,byteInWord,dataType);}\nfn readMatrixIndices(info: vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(\nreadMatrixIndexValue(offset,dataType),\nreadMatrixIndexValue(offset+componentSize,dataType),\nreadMatrixIndexValue(offset+componentSize*2u,dataType),\nreadMatrixIndexValue(offset+componentSize*3u,dataType)\n);}\nfn readMatrixWeightValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=bitcast<u32>(matricesWeights[wordOffset]);return convertToFloat(word,byteInWord,dataType);}\nfn readMatrixWeights(info: vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(\nreadMatrixWeightValue(offset,dataType),\nreadMatrixWeightValue(offset+componentSize,dataType),\nreadMatrixWeightValue(offset+componentSize*2u,dataType),\nreadMatrixWeightValue(offset+componentSize*3u,dataType)\n);}\n#if NUM_BONE_INFLUENCERS>4\nfn readMatrixIndexExtraValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=
|
|
1
|
+
{"version":3,"file":"iblVoxelGrid.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/iblVoxelGrid.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,sDAAsD,CAAC;AAC9D,OAAO,gDAAgD,CAAC;AACxD,OAAO,8BAA8B,CAAC;AACtC,OAAO,uCAAuC,CAAC;AAE/C,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/morphTargetsVertexGlobalDeclaration\";\nimport \"./ShadersInclude/morphTargetsVertexDeclaration\";\nimport \"./ShadersInclude/bonesVertex\";\nimport \"./ShadersInclude/bakedVertexAnimation\";\n\nconst name = \"iblVoxelGridVertexShader\";\nconst shader = `#include <bakedVertexAnimationDeclaration>\n#include <bonesDeclaration>(attribute matricesIndices : vec4f;,,attribute matricesWeights : vec4f;,,attribute matricesIndicesExtra : vec4f;,,attribute matricesWeightsExtra : vec4f;,)\n#include <helperFunctions>\n#include <instancesDeclaration>\n#include<morphTargetsVertexGlobalDeclaration>\n#include<morphTargetsVertexDeclaration>[0..maxSimultaneousMorphTargets]\n#ifdef VERTEX_PULLING_USE_INDEX_BUFFER\nvar<storage,read> indices : array<u32>;\n#endif\nvar<storage,read> position : array<f32>;\n#if NUM_BONE_INFLUENCERS>0\nvar<storage,read> matricesIndices : array<u32>;var<storage,read> matricesWeights : array<f32>;uniform vp_matricesIndices_info: vec3f;uniform vp_matricesWeights_info: vec3f;\n#if NUM_BONE_INFLUENCERS>4\nvar<storage,read> matricesIndicesExtra : array<u32>;var<storage,read> matricesWeightsExtra : array<f32>;uniform vp_matricesIndicesExtra_info: vec3f;uniform vp_matricesWeightsExtra_info: vec3f;\n#endif\n#endif\nuniform world : mat4x4f;uniform invWorldScale: mat4x4f;varying vNormalizedPosition : vec3f;flat varying f_swizzle: i32;uniform vp_position_info: vec3f; \nfn convertToFloat(word: u32,byteInWord: u32,dataType: u32)->f32 {switch (dataType) {case 5120u: { \nlet shift=byteInWord*8u;let value=(word>>shift) & 0xFFu;return f32(i32(value<<24u)>>24u)/127.0; }\ncase 5121u: { \nlet shift=byteInWord*8u;let value=(word>>shift) & 0xFFu;return f32(value)/255.0;}\ncase 5122u: { \nlet shift=(byteInWord & 0xFFFFFFFEu)*8u; \nlet value=(word>>shift) & 0xFFFFu;return f32(i32(value<<16u)>>16u);}\ncase 5123u: { \nlet shift=(byteInWord & 0xFFFFFFFEu)*8u; \nlet value=(word>>shift) & 0xFFFFu;return f32(value);}\ncase 5126u: { \nreturn bitcast<f32>(word);}\ndefault: {return 0.0;}}}\nfn readPositionValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=bitcast<u32>(position[wordOffset]);return convertToFloat(word,byteInWord,dataType);}\nfn readVertexPosition(info: vec3f,vertexIndex: u32)->vec3f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec3f(\nreadPositionValue(offset,dataType),\nreadPositionValue(offset+componentSize,dataType),\nreadPositionValue(offset+componentSize*2u,dataType)\n);}\n#if NUM_BONE_INFLUENCERS>0\nfn readMatrixIndexValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=matricesIndices[wordOffset];return convertToFloat(word,byteInWord,dataType);}\nfn readMatrixIndices(info: vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(\nreadMatrixIndexValue(offset,dataType),\nreadMatrixIndexValue(offset+componentSize,dataType),\nreadMatrixIndexValue(offset+componentSize*2u,dataType),\nreadMatrixIndexValue(offset+componentSize*3u,dataType)\n);}\nfn readMatrixWeightValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=bitcast<u32>(matricesWeights[wordOffset]);return convertToFloat(word,byteInWord,dataType);}\nfn readMatrixWeights(info: vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(\nreadMatrixWeightValue(offset,dataType),\nreadMatrixWeightValue(offset+componentSize,dataType),\nreadMatrixWeightValue(offset+componentSize*2u,dataType),\nreadMatrixWeightValue(offset+componentSize*3u,dataType)\n);}\n#if NUM_BONE_INFLUENCERS>4\nfn readMatrixIndexExtraValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word : u32=matricesIndicesExtra[wordOffset];return convertToFloat(word,byteInWord,dataType);}\nfn readMatrixIndicesExtra(info: vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(\nreadMatrixIndexExtraValue(offset,dataType),\nreadMatrixIndexExtraValue(offset+componentSize,dataType),\nreadMatrixIndexExtraValue(offset+componentSize*2u,dataType),\nreadMatrixIndexExtraValue(offset+componentSize*3u,dataType)\n);}\nfn readMatrixWeightExtraValue(byteOffset: u32,dataType: u32)->f32 {let wordOffset=byteOffset/4u;let byteInWord=byteOffset % 4u;let word: u32=bitcast<u32>(matricesWeightsExtra[wordOffset]);return convertToFloat(word,byteInWord,dataType);}\nfn readMatrixWeightsExtra(info : vec3f,vertexIndex : u32)->vec4f {let baseOffset=u32(info.x);let stride=u32(info.y);let dataType=u32(info.z);let offset=baseOffset+vertexIndex*stride;let componentSize=select(select(2u,1u,dataType==5120u || dataType==5121u),4u,dataType==5126u);return vec4f(\nreadMatrixWeightExtraValue(offset,dataType),\nreadMatrixWeightExtraValue(offset+componentSize,dataType),\nreadMatrixWeightExtraValue(offset+componentSize*2u,dataType),\nreadMatrixWeightExtraValue(offset+componentSize*3u,dataType)\n);}\n#endif\n#endif\nfn readVertexIndex(index : u32)->u32 {\n#ifndef VERTEX_PULLING_USE_INDEX_BUFFER\nreturn index;\n#else\n#ifdef VERTEX_PULLING_INDEX_BUFFER_32BITS\nreturn indices[index];\n#else\nlet u32_index=index/2u;let bit_offset=(index & 1u)*16u;return (indices[u32_index]>>bit_offset) & 0xFFFFu;\n#endif\n#endif\n}\nfn calculateTriangleNormal(v0\n: vec3<f32>,v1\n: vec3<f32>,v2\n: vec3<f32>)\n->vec3<f32> {let edge1=v1-v0;let edge2=v2-v0;let triangleNormal=cross(edge1,edge2);let normalizedTriangleNormal=normalize(triangleNormal);return normalizedTriangleNormal;}\n@vertex\nfn main(input : VertexInputs)->FragmentInputs {\n#include <morphTargetsVertexGlobal>\nvar triPositions: array<vec3f,3>;var thisTriIndex : u32=input.vertexIndex; \nfor (var i: u32=0u; i<3u; i=i+1u) {var provokingVertNum : u32=input.vertexIndex/3*3;let vertIdx=readVertexIndex(provokingVertNum+i);if (provokingVertNum+i==input.vertexIndex) {thisTriIndex=i;}\nvar positionUpdated=readVertexPosition(uniforms.vp_position_info,vertIdx);\n#include <instancesVertex>\nlet inputPosition: vec3f=positionUpdated;\n#include <morphTargetsVertex>(vertexInputs.position\\\\),inputPosition),vertexInputs.vertexIndex,vertIdx)[0..maxSimultaneousMorphTargets]\n#if NUM_BONE_INFLUENCERS>0\nlet matrixIndex=readMatrixIndices(uniforms.vp_matricesIndices_info,vertIdx);let matrixWeight=readMatrixWeights(uniforms.vp_matricesWeights_info,vertIdx);\n#if NUM_BONE_INFLUENCERS>4\nlet matrixIndexExtra=readMatrixIndicesExtra(uniforms.vp_matricesIndicesExtra_info,vertIdx);let matrixWeightExtra=readMatrixWeightsExtra(uniforms.vp_matricesWeightsExtra_info,vertIdx);\n#endif\n#endif\n#include<bonesVertex>(vertexInputs.matricesIndices,matrixIndex,vertexInputs.matricesWeights,matrixWeight,vertexInputs.matricesIndicesExtra,matrixIndexExtra,vertexInputs.matricesWeightsExtra,matrixWeightExtra)\n#include<bakedVertexAnimation>(vertexInputs.matricesIndices,matrixIndex,vertexInputs.matricesWeights,matrixWeight,vertexInputs.matricesIndicesExtra,matrixIndexExtra,vertexInputs.matricesWeightsExtra,matrixWeightExtra)\ntriPositions[i]=(finalWorld*vec4(positionUpdated,1.0)).xyz;}\nvar N : vec3<f32>=calculateTriangleNormal(triPositions[0],triPositions[1],triPositions[2]);let worldPos=triPositions[thisTriIndex];vertexOutputs.position=uniforms.invWorldScale*vec4(worldPos,1.0);N=abs(N);if (N.x>N.y && N.x>N.z) {vertexOutputs.f_swizzle=0;vertexOutputs.position=vec4f(vertexOutputs.position.yzx,1.0);} else if (N.y>N.z) {vertexOutputs.f_swizzle=1;vertexOutputs.position=vec4f(vertexOutputs.position.zxy,1.0);} else {vertexOutputs.f_swizzle=2;vertexOutputs.position=vec4f(vertexOutputs.position.xyz,1.0);}\nvertexOutputs.vNormalizedPosition=vertexOutputs.position.xyz*0.5+0.5;vertexOutputs.position.z =\nvertexOutputs.vNormalizedPosition.z; }\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n/** @internal */\nexport const iblVoxelGridVertexShaderWGSL = { name, shader };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alphaCullingState.js","sourceRoot":"","sources":["../../../../dev/core/src/States/alphaCullingState.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class AlphaState {\r\n public _blendFunctionParameters = new Array<Nullable<number>>(4 * 8);\r\n public _blendEquationParameters = new Array<Nullable<number>>(2 * 8);\r\n public _blendConstants = new Array<Nullable<number>>(4);\r\n public _isBlendConstantsDirty = false;\r\n\r\n public _alphaBlend = Array(8).fill(false);\r\n public _numTargetEnabled = 0;\r\n\r\n private _isAlphaBlendDirty = false;\r\n private _isBlendFunctionParametersDirty = false;\r\n private _isBlendEquationParametersDirty = false;\r\n\r\n /**\r\n * Initializes the state.\r\n * @param _supportBlendParametersPerTarget - Whether blend parameters per target is supported\r\n */\r\n public constructor(private _supportBlendParametersPerTarget: boolean) {\r\n this.reset();\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\r\n }\r\n\r\n public get alphaBlend(): boolean {\r\n return this._numTargetEnabled > 0;\r\n }\r\n\r\n public set alphaBlend(value: boolean) {\r\n this.setAlphaBlend(value);\r\n }\r\n\r\n public setAlphaBlend(value: boolean, targetIndex: number = 0): void {\r\n if (this._alphaBlend[targetIndex] === value) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._numTargetEnabled++;\r\n } else {\r\n this._numTargetEnabled--;\r\n }\r\n\r\n this._alphaBlend[targetIndex] = value;\r\n this._isAlphaBlendDirty = true;\r\n }\r\n\r\n public setAlphaBlendConstants(r: number, g: number, b: number, a: number): void {\r\n if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) {\r\n return;\r\n }\r\n\r\n this._blendConstants[0] = r;\r\n this._blendConstants[1] = g;\r\n this._blendConstants[2] = b;\r\n this._blendConstants[3] = a;\r\n\r\n this._isBlendConstantsDirty = true;\r\n }\r\n\r\n public setAlphaBlendFunctionParameters(srcRGBFactor: number, dstRGBFactor: number, srcAlphaFactor: number, dstAlphaFactor: number, targetIndex: number = 0): void {\r\n const offset = targetIndex * 4;\r\n\r\n if (\r\n this._blendFunctionParameters[offset + 0] === srcRGBFactor &&\r\n this._blendFunctionParameters[offset + 1] === dstRGBFactor &&\r\n this._blendFunctionParameters[offset + 2] === srcAlphaFactor &&\r\n this._blendFunctionParameters[offset + 3] === dstAlphaFactor\r\n ) {\r\n return;\r\n }\r\n\r\n this._blendFunctionParameters[offset + 0] = srcRGBFactor;\r\n this._blendFunctionParameters[offset + 1] = dstRGBFactor;\r\n this._blendFunctionParameters[offset + 2] = srcAlphaFactor;\r\n this._blendFunctionParameters[offset + 3] = dstAlphaFactor;\r\n\r\n this._isBlendFunctionParametersDirty = true;\r\n }\r\n\r\n public setAlphaEquationParameters(rgbEquation: number, alphaEquation: number, targetIndex: number = 0): void {\r\n const offset = targetIndex * 2;\r\n\r\n if (this._blendEquationParameters[offset + 0] === rgbEquation && this._blendEquationParameters[offset + 1] === alphaEquation) {\r\n return;\r\n }\r\n\r\n this._blendEquationParameters[offset + 0] = rgbEquation;\r\n this._blendEquationParameters[offset + 1] = alphaEquation;\r\n\r\n this._isBlendEquationParametersDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._alphaBlend.fill(false);\r\n this._numTargetEnabled = 0;\r\n this._blendFunctionParameters.fill(null);\r\n this._blendEquationParameters.fill(null);\r\n\r\n this._blendConstants[0] = null;\r\n this._blendConstants[1] = null;\r\n this._blendConstants[2] = null;\r\n this._blendConstants[3] = null;\r\n\r\n this._isAlphaBlendDirty = true;\r\n this._isBlendFunctionParametersDirty = false;\r\n this._isBlendEquationParametersDirty = false;\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext, numTargets: number = 1): void {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Constants\r\n if (this._isBlendConstantsDirty) {\r\n gl.blendColor(<number>this._blendConstants[0], <number>this._blendConstants[1], <number>this._blendConstants[2], <number>this._blendConstants[3]);\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n if (numTargets === 1 || !this._supportBlendParametersPerTarget) {\r\n // Single target or no support for per-target parameters\r\n if (this._isAlphaBlendDirty) {\r\n if (this._alphaBlend[0]) {\r\n gl.enable(gl.BLEND);\r\n } else {\r\n gl.disable(gl.BLEND);\r\n }\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n if (this._isBlendFunctionParametersDirty) {\r\n gl.blendFuncSeparate(\r\n <number>this._blendFunctionParameters[0],\r\n <number>this._blendFunctionParameters[1],\r\n <number>this._blendFunctionParameters[2],\r\n <number>this._blendFunctionParameters[3]\r\n );\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n if (this._isBlendEquationParametersDirty) {\r\n gl.blendEquationSeparate(<number>this._blendEquationParameters[0], <number>this._blendEquationParameters[1]);\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n return;\r\n }\r\n\r\n // Multi-target\r\n const gl2 = gl as WebGL2RenderingContext;\r\n\r\n // Alpha blend\r\n if (this._isAlphaBlendDirty) {\r\n for (let i = 0; i < numTargets; i++) {\r\n const index = i < this._numTargetEnabled ? i : 0;\r\n if (this._alphaBlend[index]) {\r\n gl2.enableIndexed(gl.BLEND, i);\r\n } else {\r\n gl2.disableIndexed(gl.BLEND, i);\r\n }\r\n }\r\n\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n // Alpha function\r\n if (this._isBlendFunctionParametersDirty) {\r\n for (let i = 0; i < numTargets; i++) {\r\n const offset = i < this._numTargetEnabled ? i * 4 : 0;\r\n gl2.blendFuncSeparateIndexed(\r\n i,\r\n <number>this._blendFunctionParameters[offset + 0],\r\n <number>this._blendFunctionParameters[offset + 1],\r\n <number>this._blendFunctionParameters[offset + 2],\r\n <number>this._blendFunctionParameters[offset + 3]\r\n );\r\n }\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n // Alpha equation\r\n if (this._isBlendEquationParametersDirty) {\r\n for (let i = 0; i < numTargets; i++) {\r\n const offset = i < this._numTargetEnabled ? i * 2 : 0;\r\n gl2.blendEquationSeparateIndexed(i, <number>this._blendEquationParameters[offset + 0], <number>this._blendEquationParameters[offset + 1]);\r\n }\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n }\r\n\r\n public setAlphaMode(mode: number, targetIndex: number) {\r\n let equation = Constants.GL_ALPHA_EQUATION_ADD;\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this.setAlphaBlendFunctionParameters(1, 1, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, 1, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this.setAlphaBlendFunctionParameters(0, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_SUBTRACT;\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_COLOR, 0, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_CONSTANT_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_CONSTANT_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA,\r\n targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_ALPHA, 1, 0, 0, targetIndex);\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 0, targetIndex);\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_LAYER_ACCUMULATE:\r\n // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency\r\n this.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_SRC_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n 1,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_MIN:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_MIN;\r\n break;\r\n case Constants.ALPHA_MAX:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_MAX;\r\n break;\r\n case Constants.ALPHA_DUAL_SRC0_ADD_SRC1xDST:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_SRC1_COLOR, 0, 1, targetIndex);\r\n break;\r\n }\r\n\r\n this.setAlphaEquationParameters(equation, equation, targetIndex);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"alphaCullingState.js","sourceRoot":"","sources":["../../../../dev/core/src/States/alphaCullingState.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"core/Engines/constants\";\r\nimport type { Nullable } from \"../types\";\r\n\r\n/**\r\n * @internal\r\n **/\r\nexport class AlphaState {\r\n public _blendFunctionParameters = new Array<Nullable<number>>(4 * 8);\r\n public _blendEquationParameters = new Array<Nullable<number>>(2 * 8);\r\n public _blendConstants = new Array<Nullable<number>>(4);\r\n public _isBlendConstantsDirty = false;\r\n\r\n public _alphaBlend = Array(8).fill(false);\r\n public _numTargetEnabled = 0;\r\n\r\n private _isAlphaBlendDirty = false;\r\n private _isBlendFunctionParametersDirty = false;\r\n private _isBlendEquationParametersDirty = false;\r\n\r\n /**\r\n * Initializes the state.\r\n * @param _supportBlendParametersPerTarget - Whether blend parameters per target is supported\r\n */\r\n public constructor(private _supportBlendParametersPerTarget: boolean) {\r\n this.reset();\r\n }\r\n\r\n public get isDirty(): boolean {\r\n return this._isAlphaBlendDirty || this._isBlendFunctionParametersDirty || this._isBlendEquationParametersDirty;\r\n }\r\n\r\n public get alphaBlend(): boolean {\r\n return this._numTargetEnabled > 0;\r\n }\r\n\r\n public set alphaBlend(value: boolean) {\r\n this.setAlphaBlend(value);\r\n }\r\n\r\n public setAlphaBlend(value: boolean, targetIndex: number = 0): void {\r\n if (this._alphaBlend[targetIndex] === value) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._numTargetEnabled++;\r\n } else {\r\n this._numTargetEnabled--;\r\n }\r\n\r\n this._alphaBlend[targetIndex] = value;\r\n this._isAlphaBlendDirty = true;\r\n }\r\n\r\n public setAlphaBlendConstants(r: number, g: number, b: number, a: number): void {\r\n if (this._blendConstants[0] === r && this._blendConstants[1] === g && this._blendConstants[2] === b && this._blendConstants[3] === a) {\r\n return;\r\n }\r\n\r\n this._blendConstants[0] = r;\r\n this._blendConstants[1] = g;\r\n this._blendConstants[2] = b;\r\n this._blendConstants[3] = a;\r\n\r\n this._isBlendConstantsDirty = true;\r\n }\r\n\r\n public setAlphaBlendFunctionParameters(srcRGBFactor: number, dstRGBFactor: number, srcAlphaFactor: number, dstAlphaFactor: number, targetIndex: number = 0): void {\r\n const offset = targetIndex * 4;\r\n\r\n if (\r\n this._blendFunctionParameters[offset + 0] === srcRGBFactor &&\r\n this._blendFunctionParameters[offset + 1] === dstRGBFactor &&\r\n this._blendFunctionParameters[offset + 2] === srcAlphaFactor &&\r\n this._blendFunctionParameters[offset + 3] === dstAlphaFactor\r\n ) {\r\n return;\r\n }\r\n\r\n this._blendFunctionParameters[offset + 0] = srcRGBFactor;\r\n this._blendFunctionParameters[offset + 1] = dstRGBFactor;\r\n this._blendFunctionParameters[offset + 2] = srcAlphaFactor;\r\n this._blendFunctionParameters[offset + 3] = dstAlphaFactor;\r\n\r\n this._isBlendFunctionParametersDirty = true;\r\n }\r\n\r\n public setAlphaEquationParameters(rgbEquation: number, alphaEquation: number, targetIndex: number = 0): void {\r\n const offset = targetIndex * 2;\r\n\r\n if (this._blendEquationParameters[offset + 0] === rgbEquation && this._blendEquationParameters[offset + 1] === alphaEquation) {\r\n return;\r\n }\r\n\r\n this._blendEquationParameters[offset + 0] = rgbEquation;\r\n this._blendEquationParameters[offset + 1] = alphaEquation;\r\n\r\n this._isBlendEquationParametersDirty = true;\r\n }\r\n\r\n public reset() {\r\n this._alphaBlend.fill(false);\r\n this._numTargetEnabled = 0;\r\n this._blendFunctionParameters.fill(null);\r\n this._blendEquationParameters.fill(null);\r\n\r\n this._blendConstants[0] = null;\r\n this._blendConstants[1] = null;\r\n this._blendConstants[2] = null;\r\n this._blendConstants[3] = null;\r\n\r\n this._isAlphaBlendDirty = true;\r\n this._isBlendFunctionParametersDirty = false;\r\n this._isBlendEquationParametersDirty = false;\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n public apply(gl: WebGLRenderingContext, numTargets: number = 1): void {\r\n if (!this.isDirty) {\r\n return;\r\n }\r\n\r\n // Constants\r\n if (this._isBlendConstantsDirty) {\r\n gl.blendColor(<number>this._blendConstants[0], <number>this._blendConstants[1], <number>this._blendConstants[2], <number>this._blendConstants[3]);\r\n this._isBlendConstantsDirty = false;\r\n }\r\n\r\n if (numTargets === 1 || !this._supportBlendParametersPerTarget) {\r\n // Single target or no support for per-target parameters\r\n if (this._isAlphaBlendDirty) {\r\n if (this._alphaBlend[0]) {\r\n gl.enable(gl.BLEND);\r\n } else {\r\n gl.disable(gl.BLEND);\r\n }\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n if (this._isBlendFunctionParametersDirty) {\r\n gl.blendFuncSeparate(\r\n <number>this._blendFunctionParameters[0],\r\n <number>this._blendFunctionParameters[1],\r\n <number>this._blendFunctionParameters[2],\r\n <number>this._blendFunctionParameters[3]\r\n );\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n if (this._isBlendEquationParametersDirty) {\r\n gl.blendEquationSeparate(<number>this._blendEquationParameters[0], <number>this._blendEquationParameters[1]);\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n return;\r\n }\r\n\r\n // Multi-target\r\n const gl2 = gl as WebGL2RenderingContext;\r\n\r\n // Alpha blend\r\n if (this._isAlphaBlendDirty) {\r\n for (let i = 0; i < numTargets; i++) {\r\n const index = i < this._numTargetEnabled ? i : 0;\r\n if (this._alphaBlend[index]) {\r\n gl2.enableIndexed(gl.BLEND, i);\r\n } else {\r\n gl2.disableIndexed(gl.BLEND, i);\r\n }\r\n }\r\n\r\n this._isAlphaBlendDirty = false;\r\n }\r\n\r\n // Alpha function\r\n if (this._isBlendFunctionParametersDirty) {\r\n for (let i = 0; i < numTargets; i++) {\r\n const offset = i < this._numTargetEnabled ? i * 4 : 0;\r\n gl2.blendFuncSeparateIndexed(\r\n i,\r\n <number>this._blendFunctionParameters[offset + 0],\r\n <number>this._blendFunctionParameters[offset + 1],\r\n <number>this._blendFunctionParameters[offset + 2],\r\n <number>this._blendFunctionParameters[offset + 3]\r\n );\r\n }\r\n this._isBlendFunctionParametersDirty = false;\r\n }\r\n\r\n // Alpha equation\r\n if (this._isBlendEquationParametersDirty) {\r\n for (let i = 0; i < numTargets; i++) {\r\n const offset = i < this._numTargetEnabled ? i * 2 : 0;\r\n gl2.blendEquationSeparateIndexed(i, <number>this._blendEquationParameters[offset + 0], <number>this._blendEquationParameters[offset + 1]);\r\n }\r\n this._isBlendEquationParametersDirty = false;\r\n }\r\n }\r\n\r\n public setAlphaMode(mode: number, targetIndex: number) {\r\n let equation = Constants.GL_ALPHA_EQUATION_ADD;\r\n\r\n switch (mode) {\r\n case Constants.ALPHA_DISABLE:\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_PREMULTIPLIED_PORTERDUFF:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_COMBINE:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE:\r\n this.setAlphaBlendFunctionParameters(1, 1, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ADD:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, 1, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_SUBTRACT:\r\n this.setAlphaBlendFunctionParameters(0, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_MULTIPLY:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_COLOR, 0, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_MAXIMIZED:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_SRC_ALPHA, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_INTERPOLATE:\r\n this.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_CONSTANT_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_CONSTANT_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_CONSTANT_ALPHA,\r\n targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_SCREENMODE:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEONE:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_ALPHATOCOLOR:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_DST_ALPHA, 1, 0, 0, targetIndex);\r\n break;\r\n case Constants.ALPHA_REVERSEONEMINUS:\r\n this.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, 1, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA, targetIndex);\r\n break;\r\n case Constants.ALPHA_ONEONE_ONEZERO:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 0, targetIndex);\r\n break;\r\n case Constants.ALPHA_EXCLUSION:\r\n this.setAlphaBlendFunctionParameters(Constants.GL_ALPHA_FUNCTION_ONE_MINUS_DST_COLOR, Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_COLOR, 0, 1, targetIndex);\r\n break;\r\n case Constants.ALPHA_LAYER_ACCUMULATE:\r\n // Same as ALPHA_COMBINE but accumulates (1 - alpha) values in the alpha channel for a later readout in order independant transparency\r\n this.setAlphaBlendFunctionParameters(\r\n Constants.GL_ALPHA_FUNCTION_SRC_ALPHA,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n 1,\r\n Constants.GL_ALPHA_FUNCTION_ONE_MINUS_SRC_ALPHA,\r\n targetIndex\r\n );\r\n break;\r\n case Constants.ALPHA_MIN:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_MIN;\r\n break;\r\n case Constants.ALPHA_MAX:\r\n this.setAlphaBlendFunctionParameters(1, 1, 1, 1, targetIndex);\r\n equation = Constants.GL_ALPHA_EQUATION_MAX;\r\n break;\r\n case Constants.ALPHA_DUAL_SRC0_ADD_SRC1xDST:\r\n this.setAlphaBlendFunctionParameters(1, Constants.GL_ALPHA_FUNCTION_SRC1_COLOR, 0, 1, targetIndex);\r\n break;\r\n }\r\n\r\n this.setAlphaEquationParameters(equation, equation, targetIndex);\r\n }\r\n}\r\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
|
|
2
2
|
import type { WebXRSessionManager } from "../webXRSessionManager.js";
|
|
3
3
|
import type { AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
4
|
-
import
|
|
4
|
+
import { Mesh } from "../../Meshes/mesh.js";
|
|
5
5
|
import type { WebXRInput } from "../webXRInput.js";
|
|
6
6
|
import type { WebXRInputSource } from "../webXRInputSource.js";
|
|
7
7
|
import type { Nullable } from "../../types.js";
|
|
@@ -225,6 +225,7 @@ export declare class WebXRHand implements IDisposable {
|
|
|
225
225
|
* The float array that will directly receive the transform matrix data from WebXR.
|
|
226
226
|
*/
|
|
227
227
|
private _jointTransformMatrices;
|
|
228
|
+
private _jointSpaces;
|
|
228
229
|
private _tempJointMatrix;
|
|
229
230
|
/**
|
|
230
231
|
* The float array that will directly receive the joint radii from WebXR.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
|
|
2
2
|
import { WebXRFeatureName, WebXRFeaturesManager } from "../webXRFeaturesManager.js";
|
|
3
|
+
import { Mesh } from "../../Meshes/mesh.js";
|
|
3
4
|
import { Matrix, Quaternion } from "../../Maths/math.vector.js";
|
|
4
5
|
import { PhysicsImpostor } from "../../Physics/v1/physicsImpostor.js";
|
|
5
6
|
import { PhysicsAggregate } from "../../Physics/v2/physicsAggregate.js";
|
|
@@ -225,6 +226,7 @@ export class WebXRHand {
|
|
|
225
226
|
* The float array that will directly receive the transform matrix data from WebXR.
|
|
226
227
|
*/
|
|
227
228
|
this._jointTransformMatrices = new Float32Array(HandJointReferenceArray.length * 16);
|
|
229
|
+
this._jointSpaces = new Array(HandJointReferenceArray.length);
|
|
228
230
|
this._tempJointMatrix = new Matrix();
|
|
229
231
|
/**
|
|
230
232
|
* The float array that will directly receive the joint radii from WebXR.
|
|
@@ -305,16 +307,18 @@ export class WebXRHand {
|
|
|
305
307
|
}
|
|
306
308
|
// TODO: Modify webxr.d.ts to better match WebXR IDL so we don't need this any cast.
|
|
307
309
|
const anyHand = hand;
|
|
308
|
-
|
|
310
|
+
for (let i = 0; i < HandJointReferenceArray.length; ++i) {
|
|
311
|
+
this._jointSpaces[i] = anyHand[HandJointReferenceArray[i]] || hand.get(HandJointReferenceArray[i]);
|
|
312
|
+
}
|
|
309
313
|
let trackingSuccessful = false;
|
|
310
314
|
if (xrFrame.fillPoses && xrFrame.fillJointRadii) {
|
|
311
|
-
trackingSuccessful = xrFrame.fillPoses(
|
|
315
|
+
trackingSuccessful = xrFrame.fillPoses(this._jointSpaces, referenceSpace, this._jointTransformMatrices) && xrFrame.fillJointRadii(this._jointSpaces, this._jointRadii);
|
|
312
316
|
}
|
|
313
317
|
else if (xrFrame.getJointPose) {
|
|
314
318
|
trackingSuccessful = true;
|
|
315
319
|
// Warning: This codepath is slow by comparison, only here for compat.
|
|
316
|
-
for (let jointIdx = 0; jointIdx <
|
|
317
|
-
const jointPose = xrFrame.getJointPose(
|
|
320
|
+
for (let jointIdx = 0; jointIdx < this._jointSpaces.length; jointIdx++) {
|
|
321
|
+
const jointPose = xrFrame.getJointPose(this._jointSpaces[jointIdx], referenceSpace);
|
|
318
322
|
if (jointPose) {
|
|
319
323
|
this._jointTransformMatrices.set(jointPose.transform.matrix, jointIdx * 16);
|
|
320
324
|
this._jointRadii[jointIdx] = jointPose.radius || 0.008;
|
|
@@ -328,6 +332,18 @@ export class WebXRHand {
|
|
|
328
332
|
if (!trackingSuccessful) {
|
|
329
333
|
return;
|
|
330
334
|
}
|
|
335
|
+
// L1 Cache Optimization: Invert to LHS in valid Babylon systems IN PLACE
|
|
336
|
+
// This linear loop is much faster than doing it per-object and avoids cache thrashing
|
|
337
|
+
if (!this._scene.useRightHandedSystem) {
|
|
338
|
+
for (let i = 0; i < HandJointReferenceArray.length; ++i) {
|
|
339
|
+
const offset = i * 16;
|
|
340
|
+
this._jointTransformMatrices[offset + 2] *= -1;
|
|
341
|
+
this._jointTransformMatrices[offset + 6] *= -1;
|
|
342
|
+
this._jointTransformMatrices[offset + 8] *= -1;
|
|
343
|
+
this._jointTransformMatrices[offset + 9] *= -1;
|
|
344
|
+
this._jointTransformMatrices[offset + 14] *= -1;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
331
347
|
for (let jointIdx = 0; jointIdx < HandJointReferenceArray.length; jointIdx++) {
|
|
332
348
|
const jointTransform = this._jointTransforms[jointIdx];
|
|
333
349
|
Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);
|
|
@@ -340,16 +356,12 @@ export class WebXRHand {
|
|
|
340
356
|
jointMesh.rotationQuaternion.copyFrom(jointTransform.rotationQuaternion);
|
|
341
357
|
jointMesh.scaling.setAll(scaledJointRadius);
|
|
342
358
|
jointMesh.parent = xrCamera.parent;
|
|
343
|
-
//
|
|
344
|
-
if
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
jointTransform.position.z *= -1;
|
|
350
|
-
jointTransform.rotationQuaternion.z *= -1;
|
|
351
|
-
jointTransform.rotationQuaternion.w *= -1;
|
|
352
|
-
}
|
|
359
|
+
// Restore correct transform for meshes that are NOT left-handed (e.g. default GLTF)
|
|
360
|
+
// The buffer is now LHS, so if the mesh expects RHS, we must un-flip.
|
|
361
|
+
if (!this._leftHandedMeshes && !this._scene.useRightHandedSystem && this._handMesh) {
|
|
362
|
+
jointTransform.position.z *= -1;
|
|
363
|
+
jointTransform.rotationQuaternion.z *= -1;
|
|
364
|
+
jointTransform.rotationQuaternion.w *= -1;
|
|
353
365
|
}
|
|
354
366
|
}
|
|
355
367
|
if (this._handMesh) {
|
|
@@ -385,15 +397,21 @@ export class WebXRHand {
|
|
|
385
397
|
* WebXR Hand Joint tracking feature, available for selected browsers and devices
|
|
386
398
|
*/
|
|
387
399
|
export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
388
|
-
static _GenerateTrackedJointMeshes(
|
|
389
|
-
const meshes = {};
|
|
390
|
-
["left", "right"]
|
|
400
|
+
static _GenerateTrackedJointMeshes(options, originalMesh) {
|
|
401
|
+
const meshes = { left: [], right: [] };
|
|
402
|
+
for (const handedness of ["left", "right"]) {
|
|
403
|
+
const h = handedness;
|
|
391
404
|
const trackedMeshes = [];
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
405
|
+
for (let i = 0; i < HandJointReferenceArray.length; i++) {
|
|
406
|
+
let newInstance;
|
|
407
|
+
if (originalMesh instanceof Mesh) {
|
|
408
|
+
newInstance = originalMesh.createInstance(`${handedness}-handJoint-${i}`);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
newInstance = originalMesh.clone(`${handedness}-handJoint-${i}`, null);
|
|
412
|
+
}
|
|
413
|
+
if (options.jointMeshes?.onHandJointMeshGenerated) {
|
|
414
|
+
const returnedMesh = options.jointMeshes.onHandJointMeshGenerated(newInstance, i, h);
|
|
397
415
|
if (returnedMesh) {
|
|
398
416
|
if (returnedMesh !== newInstance) {
|
|
399
417
|
newInstance.dispose();
|
|
@@ -402,8 +420,8 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
402
420
|
}
|
|
403
421
|
}
|
|
404
422
|
newInstance.isPickable = false;
|
|
405
|
-
if (
|
|
406
|
-
const props =
|
|
423
|
+
if (options.jointMeshes?.enablePhysics) {
|
|
424
|
+
const props = options.jointMeshes?.physicsProps;
|
|
407
425
|
// downscale the instances so that physics will be initialized correctly
|
|
408
426
|
newInstance.scaling.setAll(0.02);
|
|
409
427
|
// Detect physics version
|
|
@@ -412,7 +430,7 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
412
430
|
const physicsVersion = physicsEngine?.getPluginVersion() || 1;
|
|
413
431
|
if (physicsVersion === 2) {
|
|
414
432
|
// V2 physics
|
|
415
|
-
const impostorType = props
|
|
433
|
+
const impostorType = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;
|
|
416
434
|
let shapeType = 0 /* PhysicsShapeType.SPHERE */;
|
|
417
435
|
// Map v1 impostor types to v2 shape types
|
|
418
436
|
switch (impostorType) {
|
|
@@ -430,28 +448,30 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
430
448
|
}
|
|
431
449
|
const aggregate = new PhysicsAggregate(newInstance, shapeType, {
|
|
432
450
|
mass: 0,
|
|
433
|
-
friction: props
|
|
434
|
-
restitution: props
|
|
451
|
+
friction: props?.friction ?? 0.2,
|
|
452
|
+
restitution: props?.restitution ?? 0.2,
|
|
435
453
|
}, scene);
|
|
436
454
|
aggregate.body.setMotionType(1 /* PhysicsMotionType.ANIMATED */);
|
|
437
455
|
aggregate.body.disableSync = true;
|
|
438
456
|
}
|
|
439
457
|
else {
|
|
440
458
|
// V1 physics
|
|
441
|
-
const type = props
|
|
442
|
-
newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, { mass: 0, ...props });
|
|
459
|
+
const type = props?.impostorType !== undefined ? props.impostorType : PhysicsImpostor.SphereImpostor;
|
|
460
|
+
newInstance.physicsImpostor = new PhysicsImpostor(newInstance, type, props ? { mass: 0, ...props } : { mass: 0 });
|
|
443
461
|
}
|
|
444
462
|
}
|
|
463
|
+
if (options.jointMeshes?.invisible) {
|
|
464
|
+
newInstance.isVisible = false;
|
|
465
|
+
}
|
|
445
466
|
newInstance.rotationQuaternion = new Quaternion();
|
|
446
|
-
newInstance.isVisible = false;
|
|
447
467
|
trackedMeshes.push(newInstance);
|
|
448
468
|
}
|
|
449
|
-
meshes[
|
|
450
|
-
}
|
|
451
|
-
return
|
|
469
|
+
meshes[h] = trackedMeshes;
|
|
470
|
+
}
|
|
471
|
+
return meshes;
|
|
452
472
|
}
|
|
453
473
|
static async _GenerateDefaultHandMeshesAsync(scene, xrSessionManager, options) {
|
|
454
|
-
// eslint-disable-next-line no-async-promise-executor
|
|
474
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
455
475
|
return await new Promise(async (resolve) => {
|
|
456
476
|
const riggedMeshes = {};
|
|
457
477
|
// check the cache, defensive
|
|
@@ -508,9 +528,13 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
508
528
|
}
|
|
509
529
|
const handMesh = handGLB.meshes[1];
|
|
510
530
|
handMesh._internalAbstractMeshDataInfo._computeBonesUsingShaders = true;
|
|
531
|
+
if (handMesh.skeleton) {
|
|
532
|
+
handMesh.skeleton.useTextureToStoreBoneMatrices = false;
|
|
533
|
+
}
|
|
511
534
|
// if in multiview do not use the material
|
|
512
535
|
if (!isMultiview && !options?.handMeshes?.disableHandShader) {
|
|
513
536
|
handMesh.material = handShader.clone(`${handedness}HandShaderClone`, true);
|
|
537
|
+
handMesh.material.freeze();
|
|
514
538
|
}
|
|
515
539
|
handMesh.isVisible = false;
|
|
516
540
|
riggedMeshes[handedness] = handMesh;
|
|
@@ -612,7 +636,7 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
612
636
|
return;
|
|
613
637
|
}
|
|
614
638
|
const handedness = xrController.inputSource.handedness;
|
|
615
|
-
const webxrHand = new WebXRHand(xrController, this._handResources.jointMeshes[handedness], this._handResources.handMeshes && this._handResources.handMeshes[handedness], this._handResources.rigMappings && this._handResources.rigMappings[handedness], this.options.handMeshes?.meshesUseLeftHandedCoordinates, this.options.jointMeshes?.invisible, this.options.jointMeshes?.scaleFactor);
|
|
639
|
+
const webxrHand = new WebXRHand(xrController, this._handResources.jointMeshes && this._handResources.jointMeshes[handedness], this._handResources.handMeshes && this._handResources.handMeshes[handedness], this._handResources.rigMappings && this._handResources.rigMappings[handedness], this.options.handMeshes?.meshesUseLeftHandedCoordinates, this.options.jointMeshes?.invisible, this.options.jointMeshes?.scaleFactor);
|
|
616
640
|
this._attachedHands[xrController.uniqueId] = webxrHand;
|
|
617
641
|
this._trackingHands[handedness] = webxrHand;
|
|
618
642
|
this.onHandAddedObservable.notifyObservers(webxrHand);
|