@onerjs/addons 8.42.6 → 8.42.8
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/atmosphere/atmosphere.d.ts +6 -0
- package/atmosphere/atmosphere.js +42 -0
- package/atmosphere/atmosphere.js.map +1 -1
- package/atmosphere/atmospherePBRMaterialPlugin.js +15 -5
- package/atmosphere/atmospherePBRMaterialPlugin.js.map +1 -1
- package/msdfText/textRenderer.js +2 -2
- package/msdfText/textRenderer.js.map +1 -1
- package/navigation/common/config.d.ts +5 -5
- package/navigation/common/config.js +5 -5
- package/navigation/common/config.js.map +1 -1
- package/navigation/common/smooth-path.js +1 -1
- package/navigation/common/smooth-path.js.map +1 -1
- package/navigation/plugin/RecastJSCrowd.d.ts +2 -2
- package/navigation/plugin/RecastJSCrowd.js.map +1 -1
- package/navigation/plugin/RecastNavigationJSPlugin.d.ts +7 -6
- package/navigation/plugin/RecastNavigationJSPlugin.js +7 -6
- package/navigation/plugin/RecastNavigationJSPlugin.js.map +1 -1
- package/navigation/types.d.ts +1 -1
- package/navigation/types.js.map +1 -1
- package/navigation/worker/navmesh-worker.js +1 -1
- package/navigation/worker/navmesh-worker.js.map +1 -1
- package/package.json +2 -2
|
@@ -89,15 +89,17 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
89
89
|
* @override
|
|
90
90
|
*/
|
|
91
91
|
isReadyForSubMesh() {
|
|
92
|
-
let isReady = true;
|
|
93
92
|
const atmosphere = this._atmosphere;
|
|
93
|
+
if (!atmosphere.transmittanceLut?.hasLutData || (atmosphere.diffuseSkyIrradianceLut && !atmosphere.diffuseSkyIrradianceLut.hasLutData)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
94
96
|
if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {
|
|
95
97
|
const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;
|
|
96
|
-
|
|
98
|
+
if (!aerialPerspectiveLutRenderTarget?.isReady()) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
97
101
|
}
|
|
98
|
-
|
|
99
|
-
isReady = isReady && !!transmittanceLutRenderTarget?.isReady();
|
|
100
|
-
return isReady;
|
|
102
|
+
return true;
|
|
101
103
|
}
|
|
102
104
|
/**
|
|
103
105
|
* @override
|
|
@@ -187,6 +189,7 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
187
189
|
CUSTOM_FRAGMENT_DEFINITIONS: this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled
|
|
188
190
|
? `uniform sampler2D transmittanceLut;\r\nprecision highp sampler2DArray;\r\nuniform sampler2DArray aerialPerspectiveLut;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`
|
|
189
191
|
: `uniform sampler2D transmittanceLut;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`,
|
|
192
|
+
// Provides the direct light contribution, accounting for transmittance.
|
|
190
193
|
CUSTOM_LIGHT0_COLOR: `
|
|
191
194
|
{
|
|
192
195
|
vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};
|
|
@@ -197,6 +200,9 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
197
200
|
diffuse0 = lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);
|
|
198
201
|
}
|
|
199
202
|
`,
|
|
203
|
+
// Approximates the environment contribution from the atmosphere.
|
|
204
|
+
// Note there are some tuned constants used below to modify the environment intensity.
|
|
205
|
+
// A more physically accurate approach could be considered, and/or uniforms added to customize.
|
|
200
206
|
CUSTOM_REFLECTION: `
|
|
201
207
|
{
|
|
202
208
|
vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};
|
|
@@ -253,6 +259,7 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
253
259
|
CUSTOM_FRAGMENT_DEFINITIONS: this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled
|
|
254
260
|
? `var transmittanceLutSampler: sampler;\r\nvar transmittanceLut: texture_2d<f32>;\r\nvar aerialPerspectiveLutSampler: sampler;\r\nvar aerialPerspectiveLut: texture_2d_array<f32>;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`
|
|
255
261
|
: `var transmittanceLutSampler: sampler;\r\nvar transmittanceLut: texture_2d<f32>;\r\n${atmosphereImportSnippet}\r\n#include<atmosphereFunctions>`,
|
|
262
|
+
// Provides the direct light contribution, accounting for transmittance.
|
|
256
263
|
CUSTOM_LIGHT0_COLOR: `
|
|
257
264
|
{
|
|
258
265
|
var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};
|
|
@@ -263,6 +270,9 @@ export class AtmospherePBRMaterialPlugin extends MaterialPluginBase {
|
|
|
263
270
|
diffuse0 = atmosphere.lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);
|
|
264
271
|
}
|
|
265
272
|
`,
|
|
273
|
+
// Approximates the environment contribution from the atmosphere.
|
|
274
|
+
// Note there are some tuned constants used below to modify the environment intensity.
|
|
275
|
+
// A more physically accurate approach could be considered, and/or uniforms added to customize.
|
|
266
276
|
CUSTOM_REFLECTION: `
|
|
267
277
|
{
|
|
268
278
|
var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atmospherePBRMaterialPlugin.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePBRMaterialPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { Atmosphere } from \"./atmosphere\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3FromFloatsToRef, Vector3ScaleToRef } from \"core/Maths/math.vector.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereFunctions\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereUboDeclaration\";\r\n\r\nclass AtmospherePBRMaterialDefines extends MaterialDefines {\r\n public USE_AERIAL_PERSPECTIVE_LUT: boolean;\r\n public APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;\r\n public APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;\r\n public SAMPLE_TRANSMITTANCE_LUT = true;\r\n public EXCLUDE_RAY_MARCHING_FUNCTIONS = true;\r\n\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialDefines}.\r\n * @param useAerialPerspectiveLut - Whether to use the aerial perspective LUT.\r\n */\r\n constructor(useAerialPerspectiveLut: boolean) {\r\n super();\r\n this.USE_AERIAL_PERSPECTIVE_LUT = useAerialPerspectiveLut;\r\n }\r\n}\r\n\r\nconst OriginOffsetUniformName = \"originOffsetKm\";\r\nconst InverseViewportSizeUniformName = \"inverseViewportSize\";\r\n\r\nconst UboArray = [\r\n { name: OriginOffsetUniformName, size: 3, type: \"vec3\" },\r\n { name: \"_atmoPbrPadding1\", size: 1, type: \"float\" },\r\n { name: InverseViewportSizeUniformName, size: 2, type: \"vec2\" },\r\n];\r\nconst MakeUniforms = (atmosphere: Atmosphere) => ({\r\n ubo: UboArray,\r\n fragment: `uniform vec2 ${InverseViewportSizeUniformName};\\nuniform vec3 ${OriginOffsetUniformName};\\n`,\r\n externalUniforms: atmosphere.uniformBuffer.getUniformNames(),\r\n});\r\n\r\nconst PluginName = \"AtmospherePBRMaterialPlugin\";\r\nconst PluginPriority = 600;\r\nconst OriginOffsetKm = { x: 0, y: 0, z: 0 };\r\n\r\n/**\r\n * Adds shading logic to a PBRMaterial that provides radiance, diffuse sky irradiance, and aerial perspective from the atmosphere.\r\n */\r\nexport class AtmospherePBRMaterialPlugin extends MaterialPluginBase {\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialPlugin}.\r\n * @param material - The material to apply the plugin to.\r\n * @param _atmosphere - The atmosphere to use for shading.\r\n * @param _isAerialPerspectiveEnabled - Whether to apply aerial perspective.\r\n */\r\n constructor(\r\n material: Material,\r\n private readonly _atmosphere: Atmosphere,\r\n private readonly _isAerialPerspectiveEnabled = false\r\n ) {\r\n super(\r\n material,\r\n PluginName,\r\n PluginPriority,\r\n {\r\n USE_CUSTOM_REFLECTION: _atmosphere.diffuseSkyIrradianceLut !== null,\r\n CUSTOM_FRAGMENT_BEFORE_FOG: _isAerialPerspectiveEnabled,\r\n USE_AERIAL_PERSPECTIVE_LUT: _isAerialPerspectiveEnabled && _atmosphere.isAerialPerspectiveLutEnabled,\r\n APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,\r\n APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,\r\n SAMPLE_TRANSMITTANCE_LUT: true,\r\n EXCLUDE_RAY_MARCHING_FUNCTIONS: true,\r\n },\r\n false, // addPluginToList -- false because we need to control when this is added to the list\r\n true, // enable\r\n true // resolveIncludes\r\n );\r\n\r\n this.doNotSerialize = true;\r\n\r\n // This calls `getCode` so we need to do this after having initialized the class fields.\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniformBuffersNames(_ubos: string[]): void {\r\n const uniformBuffer = this._atmosphere.uniformBuffer;\r\n if (uniformBuffer.useUbo) {\r\n const uboName = this._material.shaderLanguage === ShaderLanguage.WGSL ? \"atmosphere\" : uniformBuffer.name;\r\n _ubos.push(uboName);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniforms() {\r\n return MakeUniforms(this._atmosphere);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isReadyForSubMesh(): boolean {\r\n let isReady = true;\r\n const atmosphere = this._atmosphere;\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n isReady = isReady && !!aerialPerspectiveLutRenderTarget?.isReady();\r\n }\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n isReady = isReady && !!transmittanceLutRenderTarget?.isReady();\r\n return isReady;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getActiveTextures(_activeTextures: BaseTexture[]): void {\r\n const atmosphere = this._atmosphere;\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n if (aerialPerspectiveLutRenderTarget) {\r\n _activeTextures.push(aerialPerspectiveLutRenderTarget);\r\n }\r\n }\r\n\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n if (transmittanceLutRenderTarget) {\r\n _activeTextures.push(transmittanceLutRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer): void {\r\n const atmosphere = this._atmosphere;\r\n const scene = atmosphere.scene;\r\n const engine = scene.getEngine();\r\n\r\n // Bind the atmosphere's uniform buffer to the effect.\r\n const effect = uniformBuffer.currentEffect;\r\n if (effect) {\r\n this._atmosphere.bindUniformBufferToEffect(effect);\r\n }\r\n\r\n // Need the offset to apply which will take a world space position and convert it to a global space position in the atmosphere.\r\n // If floating origin mode is enabled, that offset is the floating origin offset.\r\n // If not, it's an offset up the Y-axis by the planet radius.\r\n uniformBuffer.updateVector3(\r\n OriginOffsetUniformName,\r\n scene.floatingOriginMode\r\n ? Vector3ScaleToRef(scene.floatingOriginOffset, 0.001, OriginOffsetKm) // Convert to kilometers\r\n : Vector3FromFloatsToRef(0, atmosphere.physicalProperties.planetRadius, 0, OriginOffsetKm) // planetRadius is already in kilometers\r\n );\r\n\r\n const width = engine.getRenderWidth();\r\n const height = engine.getRenderHeight();\r\n uniformBuffer.updateFloat2(InverseViewportSizeUniformName, 1.0 / width, 1.0 / height);\r\n\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n uniformBuffer.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLutRenderTarget);\r\n }\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n uniformBuffer.setTexture(\"transmittanceLut\", transmittanceLutRenderTarget);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override prepareDefines(defines: AtmospherePBRMaterialDefines): void {\r\n const lastUseAerialPerspectiveLut = defines.USE_AERIAL_PERSPECTIVE_LUT;\r\n const lastApplyAerialPerspectiveIntensity = defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY;\r\n const lastApplyAerialPerspectiveRadianceBias = defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS;\r\n defines.USE_AERIAL_PERSPECTIVE_LUT = this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled;\r\n defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveIntensity !== 1.0;\r\n defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveRadianceBias !== 0.0;\r\n if (\r\n lastUseAerialPerspectiveLut !== defines.USE_AERIAL_PERSPECTIVE_LUT ||\r\n lastApplyAerialPerspectiveIntensity !== defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY ||\r\n lastApplyAerialPerspectiveRadianceBias !== defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\r\n ) {\r\n defines.markAllAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"transmittanceLut\");\r\n if (this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): Nullable<Record<string, string>> {\r\n // Assumed inputs are light0, vPositionW, normalW.\r\n // Only works for directional lights.\r\n if (shaderType !== \"fragment\") {\r\n return null;\r\n }\r\n\r\n const useUbo = this._atmosphere.scene.getEngine().supportsUniformBuffers;\r\n const directionToLightSnippet = useUbo ? \"-light0.vLightData.xyz\" : \"-vLightData0.xyz\";\r\n\r\n const useAtmosphereUbo = shaderLanguage === ShaderLanguage.WGSL || this._atmosphere.uniformBuffer.useUbo;\r\n const atmosphereImportSnippet = useAtmosphereUbo ? \"#include<atmosphereUboDeclaration>\" : \"#include<atmosphereFragmentDeclaration>\";\r\n\r\n if (shaderLanguage === ShaderLanguage.GLSL) {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `uniform sampler2D transmittanceLut;\\r\\nprecision highp sampler2DArray;\\r\\nuniform sampler2DArray aerialPerspectiveLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `uniform sampler2D transmittanceLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n CUSTOM_REFLECTION: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n vec2 uv = vec2(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - planetRadius) / atmosphereThickness);\r\n float irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n float irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n vec3 environmentIrradiance = lightIntensity * sampleReflection(irradianceSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const float r = 0.2;\r\n float indirect = getLuminance(environmentIrradiance) / max(0.00001, 1. - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += additionalDiffuseSkyIrradiance;\r\n\r\n const float diffuseBrdf = 1. / PI;\r\n environmentIrradiance *= diffuseBrdf * diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance.rgb = reflectionOut.environmentIrradiance;\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n float distanceFromCameraKm = 0.001 * distance(vEyePosition.xyz, vPositionW);\r\n vec4 aerialPerspective = vec4(0.);\r\n if (sampleAerialPerspectiveLut(\r\n gl_FragCoord.xy * ${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n } else {\r\n // WGSL\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\nvar aerialPerspectiveLutSampler: sampler;\\r\\nvar aerialPerspectiveLut: texture_2d_array<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = atmosphere.lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n CUSTOM_REFLECTION: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n var uv = vec2f(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - atmosphere.planetRadius) / atmosphere.atmosphereThickness);\r\n var irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n var irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n var environmentIrradiance = atmosphere.lightIntensity * textureSample(irradianceSampler, irradianceSamplerSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const r = 0.2;\r\n var indirect = getLuminance(environmentIrradiance) / max(0.00001, 1.0 - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += atmosphere.additionalDiffuseSkyIrradiance;\r\n\r\n const diffuseBrdf = 1.0 / PI;\r\n environmentIrradiance *= diffuseBrdf * atmosphere.diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance = vec4f(reflectionOut.environmentIrradiance, reflectionOut.environmentRadiance.a);\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n var distanceFromCameraKm = 0.001 * distance(scene.vEyePosition.xyz, fragmentInputs.vPositionW);\r\n var aerialPerspective = vec4f(0.);\r\n if (sampleAerialPerspectiveLut(\r\n fragmentInputs.position.xy * uniforms.${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n &aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"atmospherePBRMaterialPlugin.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmospherePBRMaterialPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// Licensed under the MIT License.\r\n\r\nimport type { Atmosphere } from \"./atmosphere\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3FromFloatsToRef, Vector3ScaleToRef } from \"core/Maths/math.vector.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereFunctions\";\r\nimport \"./ShadersWGSL/ShadersInclude/atmosphereUboDeclaration\";\r\n\r\nclass AtmospherePBRMaterialDefines extends MaterialDefines {\r\n public USE_AERIAL_PERSPECTIVE_LUT: boolean;\r\n public APPLY_AERIAL_PERSPECTIVE_INTENSITY = false;\r\n public APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = false;\r\n public SAMPLE_TRANSMITTANCE_LUT = true;\r\n public EXCLUDE_RAY_MARCHING_FUNCTIONS = true;\r\n\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialDefines}.\r\n * @param useAerialPerspectiveLut - Whether to use the aerial perspective LUT.\r\n */\r\n constructor(useAerialPerspectiveLut: boolean) {\r\n super();\r\n this.USE_AERIAL_PERSPECTIVE_LUT = useAerialPerspectiveLut;\r\n }\r\n}\r\n\r\nconst OriginOffsetUniformName = \"originOffsetKm\";\r\nconst InverseViewportSizeUniformName = \"inverseViewportSize\";\r\n\r\nconst UboArray = [\r\n { name: OriginOffsetUniformName, size: 3, type: \"vec3\" },\r\n { name: \"_atmoPbrPadding1\", size: 1, type: \"float\" },\r\n { name: InverseViewportSizeUniformName, size: 2, type: \"vec2\" },\r\n];\r\nconst MakeUniforms = (atmosphere: Atmosphere) => ({\r\n ubo: UboArray,\r\n fragment: `uniform vec2 ${InverseViewportSizeUniformName};\\nuniform vec3 ${OriginOffsetUniformName};\\n`,\r\n externalUniforms: atmosphere.uniformBuffer.getUniformNames(),\r\n});\r\n\r\nconst PluginName = \"AtmospherePBRMaterialPlugin\";\r\nconst PluginPriority = 600;\r\nconst OriginOffsetKm = { x: 0, y: 0, z: 0 };\r\n\r\n/**\r\n * Adds shading logic to a PBRMaterial that provides radiance, diffuse sky irradiance, and aerial perspective from the atmosphere.\r\n */\r\nexport class AtmospherePBRMaterialPlugin extends MaterialPluginBase {\r\n /**\r\n * Constructs the {@link AtmospherePBRMaterialPlugin}.\r\n * @param material - The material to apply the plugin to.\r\n * @param _atmosphere - The atmosphere to use for shading.\r\n * @param _isAerialPerspectiveEnabled - Whether to apply aerial perspective.\r\n */\r\n constructor(\r\n material: Material,\r\n private readonly _atmosphere: Atmosphere,\r\n private readonly _isAerialPerspectiveEnabled = false\r\n ) {\r\n super(\r\n material,\r\n PluginName,\r\n PluginPriority,\r\n {\r\n USE_CUSTOM_REFLECTION: _atmosphere.diffuseSkyIrradianceLut !== null,\r\n CUSTOM_FRAGMENT_BEFORE_FOG: _isAerialPerspectiveEnabled,\r\n USE_AERIAL_PERSPECTIVE_LUT: _isAerialPerspectiveEnabled && _atmosphere.isAerialPerspectiveLutEnabled,\r\n APPLY_AERIAL_PERSPECTIVE_INTENSITY: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveIntensity !== 1.0,\r\n APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS: _isAerialPerspectiveEnabled && _atmosphere.aerialPerspectiveRadianceBias !== 0.0,\r\n SAMPLE_TRANSMITTANCE_LUT: true,\r\n EXCLUDE_RAY_MARCHING_FUNCTIONS: true,\r\n },\r\n false, // addPluginToList -- false because we need to control when this is added to the list\r\n true, // enable\r\n true // resolveIncludes\r\n );\r\n\r\n this.doNotSerialize = true;\r\n\r\n // This calls `getCode` so we need to do this after having initialized the class fields.\r\n this._pluginManager._addPlugin(this);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniformBuffersNames(_ubos: string[]): void {\r\n const uniformBuffer = this._atmosphere.uniformBuffer;\r\n if (uniformBuffer.useUbo) {\r\n const uboName = this._material.shaderLanguage === ShaderLanguage.WGSL ? \"atmosphere\" : uniformBuffer.name;\r\n _ubos.push(uboName);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getUniforms() {\r\n return MakeUniforms(this._atmosphere);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override isReadyForSubMesh(): boolean {\r\n const atmosphere = this._atmosphere;\r\n\r\n if (!atmosphere.transmittanceLut?.hasLutData || (atmosphere.diffuseSkyIrradianceLut && !atmosphere.diffuseSkyIrradianceLut.hasLutData)) {\r\n return false;\r\n }\r\n\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n if (!aerialPerspectiveLutRenderTarget?.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getActiveTextures(_activeTextures: BaseTexture[]): void {\r\n const atmosphere = this._atmosphere;\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n if (aerialPerspectiveLutRenderTarget) {\r\n _activeTextures.push(aerialPerspectiveLutRenderTarget);\r\n }\r\n }\r\n\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n if (transmittanceLutRenderTarget) {\r\n _activeTextures.push(transmittanceLutRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer): void {\r\n const atmosphere = this._atmosphere;\r\n const scene = atmosphere.scene;\r\n const engine = scene.getEngine();\r\n\r\n // Bind the atmosphere's uniform buffer to the effect.\r\n const effect = uniformBuffer.currentEffect;\r\n if (effect) {\r\n this._atmosphere.bindUniformBufferToEffect(effect);\r\n }\r\n\r\n // Need the offset to apply which will take a world space position and convert it to a global space position in the atmosphere.\r\n // If floating origin mode is enabled, that offset is the floating origin offset.\r\n // If not, it's an offset up the Y-axis by the planet radius.\r\n uniformBuffer.updateVector3(\r\n OriginOffsetUniformName,\r\n scene.floatingOriginMode\r\n ? Vector3ScaleToRef(scene.floatingOriginOffset, 0.001, OriginOffsetKm) // Convert to kilometers\r\n : Vector3FromFloatsToRef(0, atmosphere.physicalProperties.planetRadius, 0, OriginOffsetKm) // planetRadius is already in kilometers\r\n );\r\n\r\n const width = engine.getRenderWidth();\r\n const height = engine.getRenderHeight();\r\n uniformBuffer.updateFloat2(InverseViewportSizeUniformName, 1.0 / width, 1.0 / height);\r\n\r\n if (this._isAerialPerspectiveEnabled && atmosphere.isAerialPerspectiveLutEnabled) {\r\n const aerialPerspectiveLutRenderTarget = atmosphere.aerialPerspectiveLutRenderTarget;\r\n uniformBuffer.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLutRenderTarget);\r\n }\r\n const transmittanceLutRenderTarget = atmosphere.transmittanceLut?.renderTarget ?? null;\r\n uniformBuffer.setTexture(\"transmittanceLut\", transmittanceLutRenderTarget);\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override prepareDefines(defines: AtmospherePBRMaterialDefines): void {\r\n const lastUseAerialPerspectiveLut = defines.USE_AERIAL_PERSPECTIVE_LUT;\r\n const lastApplyAerialPerspectiveIntensity = defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY;\r\n const lastApplyAerialPerspectiveRadianceBias = defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS;\r\n defines.USE_AERIAL_PERSPECTIVE_LUT = this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled;\r\n defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveIntensity !== 1.0;\r\n defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS = this._isAerialPerspectiveEnabled && this._atmosphere.aerialPerspectiveRadianceBias !== 0.0;\r\n if (\r\n lastUseAerialPerspectiveLut !== defines.USE_AERIAL_PERSPECTIVE_LUT ||\r\n lastApplyAerialPerspectiveIntensity !== defines.APPLY_AERIAL_PERSPECTIVE_INTENSITY ||\r\n lastApplyAerialPerspectiveRadianceBias !== defines.APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\r\n ) {\r\n defines.markAllAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"transmittanceLut\");\r\n if (this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): Nullable<Record<string, string>> {\r\n // Assumed inputs are light0, vPositionW, normalW.\r\n // Only works for directional lights.\r\n if (shaderType !== \"fragment\") {\r\n return null;\r\n }\r\n\r\n const useUbo = this._atmosphere.scene.getEngine().supportsUniformBuffers;\r\n const directionToLightSnippet = useUbo ? \"-light0.vLightData.xyz\" : \"-vLightData0.xyz\";\r\n\r\n const useAtmosphereUbo = shaderLanguage === ShaderLanguage.WGSL || this._atmosphere.uniformBuffer.useUbo;\r\n const atmosphereImportSnippet = useAtmosphereUbo ? \"#include<atmosphereUboDeclaration>\" : \"#include<atmosphereFragmentDeclaration>\";\r\n\r\n if (shaderLanguage === ShaderLanguage.GLSL) {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `uniform sampler2D transmittanceLut;\\r\\nprecision highp sampler2DArray;\\r\\nuniform sampler2DArray aerialPerspectiveLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `uniform sampler2D transmittanceLut;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n\r\n // Provides the direct light contribution, accounting for transmittance.\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n\r\n // Approximates the environment contribution from the atmosphere.\r\n // Note there are some tuned constants used below to modify the environment intensity.\r\n // A more physically accurate approach could be considered, and/or uniforms added to customize.\r\n CUSTOM_REFLECTION: `\r\n {\r\n vec3 positionGlobal = 0.001 * vPositionW + ${OriginOffsetUniformName};\r\n float positionRadius = length(positionGlobal);\r\n vec3 geocentricNormal = positionGlobal / positionRadius;\r\n\r\n vec3 directionToLight = ${directionToLightSnippet};\r\n float cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n vec2 uv = vec2(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - planetRadius) / atmosphereThickness);\r\n float irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n float irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n vec3 environmentIrradiance = lightIntensity * sampleReflection(irradianceSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const float r = 0.2;\r\n float indirect = getLuminance(environmentIrradiance) / max(0.00001, 1. - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += additionalDiffuseSkyIrradiance;\r\n\r\n const float diffuseBrdf = 1. / PI;\r\n environmentIrradiance *= diffuseBrdf * diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance.rgb = reflectionOut.environmentIrradiance;\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n float distanceFromCameraKm = 0.001 * distance(vEyePosition.xyz, vPositionW);\r\n vec4 aerialPerspective = vec4(0.);\r\n if (sampleAerialPerspectiveLut(\r\n gl_FragCoord.xy * ${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n } else {\r\n // WGSL\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS:\r\n this._isAerialPerspectiveEnabled && this._atmosphere.isAerialPerspectiveLutEnabled\r\n ? `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\nvar aerialPerspectiveLutSampler: sampler;\\r\\nvar aerialPerspectiveLut: texture_2d_array<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`\r\n : `var transmittanceLutSampler: sampler;\\r\\nvar transmittanceLut: texture_2d<f32>;\\r\\n${atmosphereImportSnippet}\\r\\n#include<atmosphereFunctions>`,\r\n\r\n // Provides the direct light contribution, accounting for transmittance.\r\n CUSTOM_LIGHT0_COLOR: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n diffuse0 = atmosphere.lightIntensity * sampleTransmittanceLut(transmittanceLut, positionRadius, cosAngleLightToZenith);\r\n }\r\n`,\r\n\r\n // Approximates the environment contribution from the atmosphere.\r\n // Note there are some tuned constants used below to modify the environment intensity.\r\n // A more physically accurate approach could be considered, and/or uniforms added to customize.\r\n CUSTOM_REFLECTION: `\r\n {\r\n var positionGlobal = 0.001 * fragmentInputs.vPositionW + uniforms.${OriginOffsetUniformName};\r\n var positionRadius = length(positionGlobal);\r\n var geocentricNormal = positionGlobal / positionRadius;\r\n\r\n var directionToLight = ${directionToLightSnippet};\r\n var cosAngleLightToZenith = dot(directionToLight, geocentricNormal);\r\n\r\n var uv = vec2f(0.5 + 0.5 * cosAngleLightToZenith, (positionRadius - atmosphere.planetRadius) / atmosphere.atmosphereThickness);\r\n var irradianceScaleT = 0.5 * dot(normalW, geocentricNormal) + 0.5;\r\n var irradianceScale = ((-0.6652 * irradianceScaleT) + 1.5927) * irradianceScaleT + 0.1023;\r\n var environmentIrradiance = atmosphere.lightIntensity * textureSample(irradianceSampler, irradianceSamplerSampler, uv).rgb;\r\n\r\n // Add a contribution here to estimate indirect lighting.\r\n const r = 0.2;\r\n var indirect = getLuminance(environmentIrradiance) / max(0.00001, 1.0 - r);\r\n environmentIrradiance *= irradianceScale;\r\n environmentIrradiance += indirect;\r\n\r\n environmentIrradiance += atmosphere.additionalDiffuseSkyIrradiance;\r\n\r\n const diffuseBrdf = 1.0 / PI;\r\n environmentIrradiance *= diffuseBrdf * atmosphere.diffuseSkyIrradianceIntensity;\r\n\r\n reflectionOut.environmentIrradiance = environmentIrradiance;\r\n reflectionOut.environmentRadiance = vec4f(reflectionOut.environmentIrradiance, reflectionOut.environmentRadiance.a);\r\n }\r\n`,\r\n // TODO: Support full ray marching if USE_AERIAL_PERSPECTIVE_LUT is disabled.\r\n CUSTOM_FRAGMENT_BEFORE_FOG: `\r\n #if USE_AERIAL_PERSPECTIVE_LUT\r\n {\r\n var distanceFromCameraKm = 0.001 * distance(scene.vEyePosition.xyz, fragmentInputs.vPositionW);\r\n var aerialPerspective = vec4f(0.);\r\n if (sampleAerialPerspectiveLut(\r\n fragmentInputs.position.xy * uniforms.${InverseViewportSizeUniformName},\r\n true,\r\n distanceFromCameraKm,\r\n NumAerialPerspectiveLutLayers,\r\n AerialPerspectiveLutKMPerSlice,\r\n AerialPerspectiveLutRangeKM,\r\n &aerialPerspective)) {\r\n finalColor = aerialPerspective + (1. - aerialPerspective.a) * finalColor;\r\n }\r\n }\r\n #endif\r\n`,\r\n };\r\n }\r\n }\r\n}\r\n"]}
|
package/msdfText/textRenderer.js
CHANGED
|
@@ -275,8 +275,8 @@ export class TextRenderer {
|
|
|
275
275
|
throw new Error("Instanced arrays are required for MSDF text rendering.");
|
|
276
276
|
}
|
|
277
277
|
let shaderLanguage = 0 /* ShaderLanguage.GLSL */;
|
|
278
|
-
let vertex
|
|
279
|
-
let fragment
|
|
278
|
+
let vertex;
|
|
279
|
+
let fragment;
|
|
280
280
|
if (engine.isWebGPU) {
|
|
281
281
|
shaderLanguage = 1 /* ShaderLanguage.WGSL */;
|
|
282
282
|
vertex = (await import("./shadersWGSL/msdf.vertex.js")).msdfVertexShaderWGSL.shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textRenderer.js","sourceRoot":"","sources":["../../../../dev/addons/src/msdfText/textRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Buffer } from \"core/Buffers/buffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { DrawWrapper } from \"core/Materials/drawWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { IDisposable } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { SdfTextParagraph } from \"./sdf/paragraph\";\r\nimport type { FontAsset } from \"./fontAsset\";\r\nimport type { ParagraphOptions } from \"./paragraphOptions\";\r\nimport { ThinMatrix } from \"core/Maths/ThinMaths/thinMath.matrix\";\r\nimport {\r\n CopyMatrixToArray,\r\n CopyMatrixToRef,\r\n IdentityMatrixToRef,\r\n MultiplyMatricesToRef,\r\n ScalingMatrixToRef,\r\n TranslationMatrixToRef,\r\n} from \"core/Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { IColor4Like, IMatrixLike } from \"core/Maths/math.like\";\r\n\r\n/**\r\n * Abstract Node class from Babylon.js\r\n */\r\nexport interface INodeLike {\r\n getWorldMatrix(): IMatrixLike;\r\n}\r\n\r\n/**\r\n * Class used to render text using MSDF (Multi-channel Signed Distance Field) technique\r\n * Thanks a lot to the work of Bhushan_Wagh and zb_sj for their amazing work on MSDF for Babylon.js\r\n * #6RLCWP#16\r\n * Star wars scroller: #6RLCWP#29\r\n * With metrics: #6RLCWP#35\r\n * Thickness: #IABMEZ#3\r\n * Solar system: #9YCDYC#9\r\n * Stroke: #6RLCWP#37\r\n */\r\nexport class TextRenderer implements IDisposable {\r\n private readonly _useVAO: boolean = false;\r\n private _engine: AbstractEngine;\r\n private _shaderLanguage: ShaderLanguage;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _worldBuffer: Nullable<Buffer>;\r\n private _uvBuffer: Nullable<Buffer>;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n private _font: FontAsset;\r\n private _charMatrices = new Array<number>();\r\n private _charUvs = new Array<number>();\r\n private _isDirty = true;\r\n private _baseLine = 0;\r\n\r\n // Cache\r\n private _scalingMatrix = new ThinMatrix();\r\n private _fontScaleMatrix = new ThinMatrix();\r\n private _offsetMatrix = new ThinMatrix();\r\n private _translationMatrix = new ThinMatrix();\r\n private _baseMatrix = new ThinMatrix();\r\n private _scaledMatrix = new ThinMatrix();\r\n private _localMatrix = new ThinMatrix();\r\n private _finalMatrix = new ThinMatrix();\r\n private _lineMatrix = new ThinMatrix();\r\n private _parentWorldMatrix = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the color of the text\r\n */\r\n public color: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the color of the stroke around the text\r\n */\r\n public strokeColor: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (inset)\r\n */\r\n public strokeInsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (outset)\r\n */\r\n public strokeOutsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the thickness of the text (0 means as defined in the font)\r\n * Value must be between -0.5 and 0.5\r\n */\r\n public thicknessControl = 0;\r\n\r\n private _parent: Nullable<INodeLike> = null;\r\n\r\n /**\r\n * Gets or sets the parent of the text renderer\r\n */\r\n public get parent(): Nullable<INodeLike> {\r\n return this._parent;\r\n }\r\n\r\n public set parent(value: Nullable<INodeLike>) {\r\n this._parent = value;\r\n }\r\n\r\n private _transformMatrix: IMatrixLike = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the transform matrix of the text renderer\r\n * It will be applied in that order:\r\n * parent x transform x paragraph world\r\n */\r\n public get transformMatrix(): IMatrixLike {\r\n return this._transformMatrix;\r\n }\r\n\r\n public set transformMatrix(value: IMatrixLike) {\r\n this._transformMatrix = value;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text is billboarded\r\n */\r\n public isBillboard = false;\r\n\r\n /**\r\n * Gets or sets if the text is screen projected\r\n * This will work only if the text is billboarded\r\n */\r\n public isBillboardScreenProjected = false;\r\n\r\n /**\r\n * Gets the number of characters in the text renderer\r\n */\r\n public get characterCount(): number {\r\n return this._charMatrices.length / 16;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text renderer should ignore the depth buffer\r\n * Default is false\r\n */\r\n public ignoreDepthBuffer = false;\r\n\r\n private constructor(engine: AbstractEngine, shaderLanguage: ShaderLanguage = ShaderLanguage.GLSL, font: FontAsset) {\r\n this._engine = engine;\r\n this._shaderLanguage = shaderLanguage;\r\n this._font = font;\r\n this._baseLine = font._font.common.lineHeight * font.scale;\r\n\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n\r\n // Main vertex buffer\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n this._vertexBuffers[\"offsets\"] = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n\r\n // Instances\r\n this._resizeBuffers(128);\r\n }\r\n\r\n private _resizeBuffers(capacity: number) {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n this._worldBuffer = new Buffer(this._engine, new Float32Array(capacity * 16), true, 16);\r\n this._vertexBuffers[\"world0\"] = this._worldBuffer.createVertexBuffer(\"world0\", 0, 4, 16, true);\r\n this._vertexBuffers[\"world1\"] = this._worldBuffer.createVertexBuffer(\"world1\", 4, 4, 16, true);\r\n this._vertexBuffers[\"world2\"] = this._worldBuffer.createVertexBuffer(\"world2\", 8, 4, 16, true);\r\n this._vertexBuffers[\"world3\"] = this._worldBuffer.createVertexBuffer(\"world3\", 12, 4, 16, true);\r\n\r\n this._uvBuffer = new Buffer(this._engine, new Float32Array(capacity * 4), true, 4);\r\n this._vertexBuffers[\"uvs\"] = this._uvBuffer.createVertexBuffer(\"uvs\", 0, 4, 4, true);\r\n }\r\n\r\n private _setShaders(vertex: string, fragment: string) {\r\n this._drawWrapperBase?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = true;\r\n }\r\n\r\n const defines = \"\";\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n {\r\n vertexSource: vertex,\r\n fragmentSource: fragment,\r\n },\r\n [\"offsets\", \"world0\", \"world1\", \"world2\", \"world3\", \"uvs\"],\r\n [\"parentWorld\", \"view\", \"projection\", \"uColor\", \"thickness\", \"uStrokeColor\", \"uStrokeInsetWidth\", \"uStrokeOutsetWidth\", \"mode\", \"transform\"],\r\n [\"fontAtlas\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n );\r\n\r\n this._drawWrapperBase.effect._refCount++;\r\n }\r\n\r\n /**\r\n * Add a paragraph of text to the renderer\r\n * @param text define the text to add\r\n * @param options define the options to use for the paragraph (optional)\r\n * @param worldMatrix define the world matrix to use for the paragraph (optional)\r\n */\r\n public addParagraph(text: string, options?: Partial<ParagraphOptions>, worldMatrix?: IMatrixLike) {\r\n const paragraph = new SdfTextParagraph(text, this._font, options);\r\n\r\n const fontScale = this._font.scale;\r\n\r\n const texWidth = this._font._font.common.scaleW;\r\n const texHeight = this._font._font.common.scaleH;\r\n const glyphs = paragraph.glyphs.filter((g) => g.char.page >= 0);\r\n\r\n let worldMatrixToUse = worldMatrix;\r\n\r\n if (!worldMatrixToUse) {\r\n const lineHeight = paragraph.lineHeight * fontScale;\r\n const lineOffset = (paragraph.lines.length * lineHeight) / 2;\r\n TranslationMatrixToRef(0, this._baseLine - lineOffset, 0, this._lineMatrix);\r\n worldMatrixToUse = this._lineMatrix;\r\n }\r\n\r\n ScalingMatrixToRef(fontScale, fontScale, 1.0, this._fontScaleMatrix);\r\n TranslationMatrixToRef(0.5, -0.5, 0, this._offsetMatrix);\r\n\r\n const charsUvsBase = this._charUvs.length;\r\n const matricesBase = this._charMatrices.length;\r\n glyphs.forEach((g, i) => {\r\n this._charUvs[charsUvsBase + i * 4 + 0] = g.char.x / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;\r\n this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;\r\n\r\n const x = g.x + g.char.xoffset;\r\n const y = 1.0 - (g.y + g.char.yoffset);\r\n\r\n ScalingMatrixToRef(g.char.width, g.char.height, 1.0, this._scalingMatrix);\r\n MultiplyMatricesToRef(this._offsetMatrix, this._scalingMatrix, this._baseMatrix);\r\n\r\n TranslationMatrixToRef(x * fontScale, y * fontScale, 0.0, this._translationMatrix);\r\n MultiplyMatricesToRef(this._baseMatrix, this._fontScaleMatrix, this._scaledMatrix);\r\n MultiplyMatricesToRef(this._scaledMatrix, this._translationMatrix, this._localMatrix);\r\n\r\n MultiplyMatricesToRef(this._localMatrix, worldMatrixToUse, this._finalMatrix);\r\n CopyMatrixToArray(this._finalMatrix, this._charMatrices, matricesBase + i * 16);\r\n });\r\n\r\n this._isDirty = true;\r\n\r\n this._baseLine -= paragraph.lineHeight * fontScale * paragraph.lines.length;\r\n }\r\n\r\n /**\r\n * Render the text using the provided view and projection matrices\r\n * @param viewMatrix define the view matrix to use\r\n * @param projectionMatrix define the projection matrix to use\r\n */\r\n public render(viewMatrix: IMatrixLike, projectionMatrix: IMatrixLike): void {\r\n const drawWrapper = this._drawWrapperBase;\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n const engine = this._engine;\r\n\r\n engine.setState(false);\r\n engine.enableEffect(drawWrapper);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(false);\r\n }\r\n\r\n if (this._parent) {\r\n CopyMatrixToRef(this._parent.getWorldMatrix(), this._parentWorldMatrix);\r\n } else {\r\n IdentityMatrixToRef(this._parentWorldMatrix);\r\n }\r\n\r\n effect.setInt(\"mode\", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);\r\n effect.setMatrix(\"parentWorld\", this._parentWorldMatrix);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n effect.setMatrix(\"transform\", this.transformMatrix);\r\n\r\n // Texture\r\n effect.setTexture(\"fontAtlas\", this._font.textures[0]);\r\n effect.setDirectColor4(\"uColor\", this.color);\r\n effect.setDirectColor4(\"uStrokeColor\", this.strokeColor);\r\n effect.setFloat(\"thickness\", this.thicknessControl * 0.9);\r\n effect.setFloat(\"uStrokeInsetWidth\", this.strokeInsetWidth);\r\n effect.setFloat(\"uStrokeOutsetWidth\", this.strokeOutsetWidth);\r\n\r\n const instanceCount = this._charMatrices.length / 16;\r\n\r\n // Need update?\r\n if (this._isDirty) {\r\n this._isDirty = false;\r\n\r\n if (this._worldBuffer!.getBuffer()!.capacity / 4 < instanceCount * 16) {\r\n this._resizeBuffers(instanceCount);\r\n }\r\n\r\n this._worldBuffer!.update(this._charMatrices);\r\n this._uvBuffer!.update(this._charUvs);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, null, effect);\r\n }\r\n (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, null);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, null, effect);\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);\r\n engine.unbindInstanceAttributes();\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(true);\r\n }\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new TextRenderer instance asynchronously\r\n * @param font define the font asset to use\r\n * @param engine define the engine to use\r\n * @returns a promise that resolves to the created TextRenderer instance\r\n */\r\n public static async CreateTextRendererAsync(font: FontAsset, engine: AbstractEngine) {\r\n if (!engine.getCaps().instancedArrays || !engine._features.supportSpriteInstancing) {\r\n throw new Error(\"Instanced arrays are required for MSDF text rendering.\");\r\n }\r\n\r\n let shaderLanguage = ShaderLanguage.GLSL;\r\n let vertex: string = \"\";\r\n let fragment: string = \"\";\r\n if (engine.isWebGPU) {\r\n shaderLanguage = ShaderLanguage.WGSL;\r\n vertex = (await import(\"./shadersWGSL/msdf.vertex\")).msdfVertexShaderWGSL.shader;\r\n fragment = (await import(\"./shadersWGSL/msdf.fragment\")).msdfPixelShaderWGSL.shader;\r\n } else {\r\n vertex = (await import(\"./shaders/msdf.vertex\")).msdfVertexShader.shader;\r\n fragment = (await import(\"./shaders/msdf.fragment\")).msdfPixelShader.shader;\r\n }\r\n\r\n const textRenderer = new TextRenderer(engine, shaderLanguage, font);\r\n textRenderer._setShaders(vertex, fragment);\r\n\r\n return textRenderer;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"textRenderer.js","sourceRoot":"","sources":["../../../../dev/addons/src/msdfText/textRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Buffer } from \"core/Buffers/buffer\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { ThinEngine } from \"core/Engines/thinEngine\";\r\nimport { DrawWrapper } from \"core/Materials/drawWrapper\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { IDisposable } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { SdfTextParagraph } from \"./sdf/paragraph\";\r\nimport type { FontAsset } from \"./fontAsset\";\r\nimport type { ParagraphOptions } from \"./paragraphOptions\";\r\nimport { ThinMatrix } from \"core/Maths/ThinMaths/thinMath.matrix\";\r\nimport {\r\n CopyMatrixToArray,\r\n CopyMatrixToRef,\r\n IdentityMatrixToRef,\r\n MultiplyMatricesToRef,\r\n ScalingMatrixToRef,\r\n TranslationMatrixToRef,\r\n} from \"core/Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { IColor4Like, IMatrixLike } from \"core/Maths/math.like\";\r\n\r\n/**\r\n * Abstract Node class from Babylon.js\r\n */\r\nexport interface INodeLike {\r\n getWorldMatrix(): IMatrixLike;\r\n}\r\n\r\n/**\r\n * Class used to render text using MSDF (Multi-channel Signed Distance Field) technique\r\n * Thanks a lot to the work of Bhushan_Wagh and zb_sj for their amazing work on MSDF for Babylon.js\r\n * #6RLCWP#16\r\n * Star wars scroller: #6RLCWP#29\r\n * With metrics: #6RLCWP#35\r\n * Thickness: #IABMEZ#3\r\n * Solar system: #9YCDYC#9\r\n * Stroke: #6RLCWP#37\r\n */\r\nexport class TextRenderer implements IDisposable {\r\n private readonly _useVAO: boolean = false;\r\n private _engine: AbstractEngine;\r\n private _shaderLanguage: ShaderLanguage;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _worldBuffer: Nullable<Buffer>;\r\n private _uvBuffer: Nullable<Buffer>;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n private _font: FontAsset;\r\n private _charMatrices = new Array<number>();\r\n private _charUvs = new Array<number>();\r\n private _isDirty = true;\r\n private _baseLine = 0;\r\n\r\n // Cache\r\n private _scalingMatrix = new ThinMatrix();\r\n private _fontScaleMatrix = new ThinMatrix();\r\n private _offsetMatrix = new ThinMatrix();\r\n private _translationMatrix = new ThinMatrix();\r\n private _baseMatrix = new ThinMatrix();\r\n private _scaledMatrix = new ThinMatrix();\r\n private _localMatrix = new ThinMatrix();\r\n private _finalMatrix = new ThinMatrix();\r\n private _lineMatrix = new ThinMatrix();\r\n private _parentWorldMatrix = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the color of the text\r\n */\r\n public color: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the color of the stroke around the text\r\n */\r\n public strokeColor: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (inset)\r\n */\r\n public strokeInsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the width of the stroke around the text (outset)\r\n */\r\n public strokeOutsetWidth = 0;\r\n\r\n /**\r\n * Gets or sets the thickness of the text (0 means as defined in the font)\r\n * Value must be between -0.5 and 0.5\r\n */\r\n public thicknessControl = 0;\r\n\r\n private _parent: Nullable<INodeLike> = null;\r\n\r\n /**\r\n * Gets or sets the parent of the text renderer\r\n */\r\n public get parent(): Nullable<INodeLike> {\r\n return this._parent;\r\n }\r\n\r\n public set parent(value: Nullable<INodeLike>) {\r\n this._parent = value;\r\n }\r\n\r\n private _transformMatrix: IMatrixLike = new ThinMatrix();\r\n\r\n /**\r\n * Gets or sets the transform matrix of the text renderer\r\n * It will be applied in that order:\r\n * parent x transform x paragraph world\r\n */\r\n public get transformMatrix(): IMatrixLike {\r\n return this._transformMatrix;\r\n }\r\n\r\n public set transformMatrix(value: IMatrixLike) {\r\n this._transformMatrix = value;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text is billboarded\r\n */\r\n public isBillboard = false;\r\n\r\n /**\r\n * Gets or sets if the text is screen projected\r\n * This will work only if the text is billboarded\r\n */\r\n public isBillboardScreenProjected = false;\r\n\r\n /**\r\n * Gets the number of characters in the text renderer\r\n */\r\n public get characterCount(): number {\r\n return this._charMatrices.length / 16;\r\n }\r\n\r\n /**\r\n * Gets or sets if the text renderer should ignore the depth buffer\r\n * Default is false\r\n */\r\n public ignoreDepthBuffer = false;\r\n\r\n private constructor(engine: AbstractEngine, shaderLanguage: ShaderLanguage = ShaderLanguage.GLSL, font: FontAsset) {\r\n this._engine = engine;\r\n this._shaderLanguage = shaderLanguage;\r\n this._font = font;\r\n this._baseLine = font._font.common.lineHeight * font.scale;\r\n\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n\r\n // Main vertex buffer\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n this._vertexBuffers[\"offsets\"] = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n\r\n // Instances\r\n this._resizeBuffers(128);\r\n }\r\n\r\n private _resizeBuffers(capacity: number) {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n this._worldBuffer = new Buffer(this._engine, new Float32Array(capacity * 16), true, 16);\r\n this._vertexBuffers[\"world0\"] = this._worldBuffer.createVertexBuffer(\"world0\", 0, 4, 16, true);\r\n this._vertexBuffers[\"world1\"] = this._worldBuffer.createVertexBuffer(\"world1\", 4, 4, 16, true);\r\n this._vertexBuffers[\"world2\"] = this._worldBuffer.createVertexBuffer(\"world2\", 8, 4, 16, true);\r\n this._vertexBuffers[\"world3\"] = this._worldBuffer.createVertexBuffer(\"world3\", 12, 4, 16, true);\r\n\r\n this._uvBuffer = new Buffer(this._engine, new Float32Array(capacity * 4), true, 4);\r\n this._vertexBuffers[\"uvs\"] = this._uvBuffer.createVertexBuffer(\"uvs\", 0, 4, 4, true);\r\n }\r\n\r\n private _setShaders(vertex: string, fragment: string) {\r\n this._drawWrapperBase?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = true;\r\n }\r\n\r\n const defines = \"\";\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n {\r\n vertexSource: vertex,\r\n fragmentSource: fragment,\r\n },\r\n [\"offsets\", \"world0\", \"world1\", \"world2\", \"world3\", \"uvs\"],\r\n [\"parentWorld\", \"view\", \"projection\", \"uColor\", \"thickness\", \"uStrokeColor\", \"uStrokeInsetWidth\", \"uStrokeOutsetWidth\", \"mode\", \"transform\"],\r\n [\"fontAtlas\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n );\r\n\r\n this._drawWrapperBase.effect._refCount++;\r\n }\r\n\r\n /**\r\n * Add a paragraph of text to the renderer\r\n * @param text define the text to add\r\n * @param options define the options to use for the paragraph (optional)\r\n * @param worldMatrix define the world matrix to use for the paragraph (optional)\r\n */\r\n public addParagraph(text: string, options?: Partial<ParagraphOptions>, worldMatrix?: IMatrixLike) {\r\n const paragraph = new SdfTextParagraph(text, this._font, options);\r\n\r\n const fontScale = this._font.scale;\r\n\r\n const texWidth = this._font._font.common.scaleW;\r\n const texHeight = this._font._font.common.scaleH;\r\n const glyphs = paragraph.glyphs.filter((g) => g.char.page >= 0);\r\n\r\n let worldMatrixToUse = worldMatrix;\r\n\r\n if (!worldMatrixToUse) {\r\n const lineHeight = paragraph.lineHeight * fontScale;\r\n const lineOffset = (paragraph.lines.length * lineHeight) / 2;\r\n TranslationMatrixToRef(0, this._baseLine - lineOffset, 0, this._lineMatrix);\r\n worldMatrixToUse = this._lineMatrix;\r\n }\r\n\r\n ScalingMatrixToRef(fontScale, fontScale, 1.0, this._fontScaleMatrix);\r\n TranslationMatrixToRef(0.5, -0.5, 0, this._offsetMatrix);\r\n\r\n const charsUvsBase = this._charUvs.length;\r\n const matricesBase = this._charMatrices.length;\r\n glyphs.forEach((g, i) => {\r\n this._charUvs[charsUvsBase + i * 4 + 0] = g.char.x / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight;\r\n this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth;\r\n this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight;\r\n\r\n const x = g.x + g.char.xoffset;\r\n const y = 1.0 - (g.y + g.char.yoffset);\r\n\r\n ScalingMatrixToRef(g.char.width, g.char.height, 1.0, this._scalingMatrix);\r\n MultiplyMatricesToRef(this._offsetMatrix, this._scalingMatrix, this._baseMatrix);\r\n\r\n TranslationMatrixToRef(x * fontScale, y * fontScale, 0.0, this._translationMatrix);\r\n MultiplyMatricesToRef(this._baseMatrix, this._fontScaleMatrix, this._scaledMatrix);\r\n MultiplyMatricesToRef(this._scaledMatrix, this._translationMatrix, this._localMatrix);\r\n\r\n MultiplyMatricesToRef(this._localMatrix, worldMatrixToUse, this._finalMatrix);\r\n CopyMatrixToArray(this._finalMatrix, this._charMatrices, matricesBase + i * 16);\r\n });\r\n\r\n this._isDirty = true;\r\n\r\n this._baseLine -= paragraph.lineHeight * fontScale * paragraph.lines.length;\r\n }\r\n\r\n /**\r\n * Render the text using the provided view and projection matrices\r\n * @param viewMatrix define the view matrix to use\r\n * @param projectionMatrix define the projection matrix to use\r\n */\r\n public render(viewMatrix: IMatrixLike, projectionMatrix: IMatrixLike): void {\r\n const drawWrapper = this._drawWrapperBase;\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n const engine = this._engine;\r\n\r\n engine.setState(false);\r\n engine.enableEffect(drawWrapper);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(false);\r\n }\r\n\r\n if (this._parent) {\r\n CopyMatrixToRef(this._parent.getWorldMatrix(), this._parentWorldMatrix);\r\n } else {\r\n IdentityMatrixToRef(this._parentWorldMatrix);\r\n }\r\n\r\n effect.setInt(\"mode\", this.isBillboard ? (this.isBillboardScreenProjected ? 2 : 1) : 0);\r\n effect.setMatrix(\"parentWorld\", this._parentWorldMatrix);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n effect.setMatrix(\"transform\", this.transformMatrix);\r\n\r\n // Texture\r\n effect.setTexture(\"fontAtlas\", this._font.textures[0]);\r\n effect.setDirectColor4(\"uColor\", this.color);\r\n effect.setDirectColor4(\"uStrokeColor\", this.strokeColor);\r\n effect.setFloat(\"thickness\", this.thicknessControl * 0.9);\r\n effect.setFloat(\"uStrokeInsetWidth\", this.strokeInsetWidth);\r\n effect.setFloat(\"uStrokeOutsetWidth\", this.strokeOutsetWidth);\r\n\r\n const instanceCount = this._charMatrices.length / 16;\r\n\r\n // Need update?\r\n if (this._isDirty) {\r\n this._isDirty = false;\r\n\r\n if (this._worldBuffer!.getBuffer()!.capacity / 4 < instanceCount * 16) {\r\n this._resizeBuffers(instanceCount);\r\n }\r\n\r\n this._worldBuffer!.update(this._charMatrices);\r\n this._uvBuffer!.update(this._charUvs);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, null, effect);\r\n }\r\n (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, null);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, null, effect);\r\n }\r\n\r\n engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount);\r\n engine.unbindInstanceAttributes();\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n if (this.ignoreDepthBuffer) {\r\n engine.setDepthBuffer(true);\r\n }\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._worldBuffer) {\r\n this._worldBuffer.dispose();\r\n this._worldBuffer = null;\r\n }\r\n\r\n if (this._uvBuffer) {\r\n this._uvBuffer.dispose();\r\n this._uvBuffer = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n this._spriteBuffer = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new TextRenderer instance asynchronously\r\n * @param font define the font asset to use\r\n * @param engine define the engine to use\r\n * @returns a promise that resolves to the created TextRenderer instance\r\n */\r\n public static async CreateTextRendererAsync(font: FontAsset, engine: AbstractEngine) {\r\n if (!engine.getCaps().instancedArrays || !engine._features.supportSpriteInstancing) {\r\n throw new Error(\"Instanced arrays are required for MSDF text rendering.\");\r\n }\r\n\r\n let shaderLanguage = ShaderLanguage.GLSL;\r\n let vertex: string;\r\n let fragment: string;\r\n if (engine.isWebGPU) {\r\n shaderLanguage = ShaderLanguage.WGSL;\r\n vertex = (await import(\"./shadersWGSL/msdf.vertex\")).msdfVertexShaderWGSL.shader;\r\n fragment = (await import(\"./shadersWGSL/msdf.fragment\")).msdfPixelShaderWGSL.shader;\r\n } else {\r\n vertex = (await import(\"./shaders/msdf.vertex\")).msdfVertexShader.shader;\r\n fragment = (await import(\"./shaders/msdf.fragment\")).msdfPixelShader.shader;\r\n }\r\n\r\n const textRenderer = new TextRenderer(engine, shaderLanguage, font);\r\n textRenderer._setShaders(vertex, fragment);\r\n\r\n return textRenderer;\r\n }\r\n}\r\n"]}
|
|
@@ -22,14 +22,14 @@ export declare function CreateTiledNavMeshConfig(parameters: INavMeshParametersV
|
|
|
22
22
|
*/
|
|
23
23
|
export declare function CreateTileCacheNavMeshConfig(parameters: INavMeshParametersV2): Partial<TileCacheGeneratorConfig>;
|
|
24
24
|
/**
|
|
25
|
-
* Convert
|
|
26
|
-
* @param config
|
|
27
|
-
* @returns Recast
|
|
25
|
+
* Convert INavMeshParametersV2 to SoloNavMeshGeneratorConfig by filtering out undefined values.
|
|
26
|
+
* @param config NavMesh parameters
|
|
27
|
+
* @returns Recast solo nav mesh generator config
|
|
28
28
|
*/
|
|
29
29
|
export declare function ToSoloNavMeshGeneratorConfig(config: INavMeshParametersV2): Partial<SoloNavMeshGeneratorConfig>;
|
|
30
30
|
/**
|
|
31
|
-
* Convert
|
|
31
|
+
* Convert IAgentParametersV2 to Recast CrowdAgentParams by filtering out undefined values.
|
|
32
32
|
* @param agentParams Agent parameters
|
|
33
|
-
* @returns Recast crowd agent
|
|
33
|
+
* @returns Recast crowd agent parameters
|
|
34
34
|
*/
|
|
35
35
|
export declare function ToCrowdAgentParams(agentParams: IAgentParametersV2): Partial<CrowdAgentParams>;
|
|
@@ -43,17 +43,17 @@ export function CreateTileCacheNavMeshConfig(parameters) {
|
|
|
43
43
|
return cfg;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
* Convert
|
|
47
|
-
* @param config
|
|
48
|
-
* @returns Recast
|
|
46
|
+
* Convert INavMeshParametersV2 to SoloNavMeshGeneratorConfig by filtering out undefined values.
|
|
47
|
+
* @param config NavMesh parameters
|
|
48
|
+
* @returns Recast solo nav mesh generator config
|
|
49
49
|
*/
|
|
50
50
|
export function ToSoloNavMeshGeneratorConfig(config) {
|
|
51
51
|
return Object.fromEntries(Object.entries(config).filter(([_, v]) => v !== undefined));
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
|
-
* Convert
|
|
54
|
+
* Convert IAgentParametersV2 to Recast CrowdAgentParams by filtering out undefined values.
|
|
55
55
|
* @param agentParams Agent parameters
|
|
56
|
-
* @returns Recast crowd agent
|
|
56
|
+
* @returns Recast crowd agent parameters
|
|
57
57
|
*/
|
|
58
58
|
export function ToCrowdAgentParams(agentParams) {
|
|
59
59
|
return Object.fromEntries(Object.entries(agentParams).filter(([_, v]) => v !== undefined));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../dev/addons/src/navigation/common/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,oCAAyB;AAG1C,OAAO,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAgC;IACpE,OAAO,4BAA4B,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAgC;IACrE,MAAM,GAAG,GAAyC;QAC9C,GAAG,uBAAuB,CAAC,UAAU,CAAC;QACtC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,EAAE;KACtC,CAAC;IACF,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAgC;IACzE,MAAM,GAAG,GAAsC;QAC3C,GAAG,wBAAwB,CAAC,UAAU,CAAC;QACvC,qBAAqB,EAAE,UAAU,CAAC,qBAAqB,IAAI,CAAC;QAC5D,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,mBAAmB;KAC/D,CAAC;IAEF,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAClC,GAAG,CAAC,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAC/D,CAAC;SAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,iHAAiH,CAAC,CAAC;QAC/H,GAAG,CAAC,oBAAoB,GAAG,iCAAiC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAChG,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAA4B;IACrE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAA+B;IAC9D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;AAC/F,CAAC","sourcesContent":["import type { SoloNavMeshGeneratorConfig, TileCacheGeneratorConfig, TiledNavMeshGeneratorConfig } from \"@recast-navigation/generators\";\nimport type { CrowdAgentParams } from \"@recast-navigation/core\";\n\nimport { Logger } from \"core/Misc/logger\";\n\nimport type { IAgentParametersV2, INavMeshParametersV2 } from \"../types\";\nimport { CreateDefaultTileCacheMeshProcess } from \"./tile-cache\";\n\nexport const DefaultMaxObstacles = 128;\n\n/**\n * Creates a SoloNavMesh configuration based on the provided parameters.\n * @param parameters The parameters used to configure the SoloNavMesh generation.\n * @returns A configuration object for generating a SoloNavMesh.\n * @see https://docs.recast-navigation-js.isaacmason.com/types/index.RecastConfig.html\n */\nexport function CreateSoloNavMeshConfig(parameters: INavMeshParametersV2): Partial<SoloNavMeshGeneratorConfig> {\n return ToSoloNavMeshGeneratorConfig(parameters);\n}\n\n/**\n * Creates a TiledNavMesh configuration based on the provided parameters.\n * @param parameters The parameters used to configure the TiledNavMesh generation.\n * @returns A configuration object for generating a TiledNavMesh.\n */\nexport function CreateTiledNavMeshConfig(parameters: INavMeshParametersV2): Partial<TiledNavMeshGeneratorConfig> {\n const cfg: Partial<TiledNavMeshGeneratorConfig> = {\n ...CreateSoloNavMeshConfig(parameters),\n tileSize: parameters.tileSize ?? 32,\n };\n return cfg;\n}\n\n/**\n * Creates a TileCacheNavMesh configuration based on the provided parameters.\n * @param parameters The parameters used to configure the TileCacheNavMesh generation.\n * @returns A configuration object for generating a TileCacheNavMesh.\n */\nexport function CreateTileCacheNavMeshConfig(parameters: INavMeshParametersV2): Partial<TileCacheGeneratorConfig> {\n const cfg: Partial<TileCacheGeneratorConfig> = {\n ...CreateTiledNavMeshConfig(parameters),\n expectedLayersPerTile: parameters.expectedLayersPerTile ?? 1,\n maxObstacles: parameters.maxObstacles ?? DefaultMaxObstacles,\n };\n\n if (parameters.tileCacheMeshProcess) {\n cfg.tileCacheMeshProcess = parameters.tileCacheMeshProcess;\n } else if (parameters.offMeshConnections) {\n Logger.Warn(\"offMeshConnections are required but no tileCacheMeshProcess is set. Using fallback DefaultTileCacheMeshProcess.\");\n cfg.tileCacheMeshProcess = CreateDefaultTileCacheMeshProcess(parameters.offMeshConnections);\n }\n\n return cfg;\n}\n\n/**\n * Convert
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../dev/addons/src/navigation/common/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,oCAAyB;AAG1C,OAAO,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAgC;IACpE,OAAO,4BAA4B,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAgC;IACrE,MAAM,GAAG,GAAyC;QAC9C,GAAG,uBAAuB,CAAC,UAAU,CAAC;QACtC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,EAAE;KACtC,CAAC;IACF,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAgC;IACzE,MAAM,GAAG,GAAsC;QAC3C,GAAG,wBAAwB,CAAC,UAAU,CAAC;QACvC,qBAAqB,EAAE,UAAU,CAAC,qBAAqB,IAAI,CAAC;QAC5D,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,mBAAmB;KAC/D,CAAC;IAEF,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAClC,GAAG,CAAC,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAC/D,CAAC;SAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,iHAAiH,CAAC,CAAC;QAC/H,GAAG,CAAC,oBAAoB,GAAG,iCAAiC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAChG,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAA4B;IACrE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAA+B;IAC9D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;AAC/F,CAAC","sourcesContent":["import type { SoloNavMeshGeneratorConfig, TileCacheGeneratorConfig, TiledNavMeshGeneratorConfig } from \"@recast-navigation/generators\";\nimport type { CrowdAgentParams } from \"@recast-navigation/core\";\n\nimport { Logger } from \"core/Misc/logger\";\n\nimport type { IAgentParametersV2, INavMeshParametersV2 } from \"../types\";\nimport { CreateDefaultTileCacheMeshProcess } from \"./tile-cache\";\n\nexport const DefaultMaxObstacles = 128;\n\n/**\n * Creates a SoloNavMesh configuration based on the provided parameters.\n * @param parameters The parameters used to configure the SoloNavMesh generation.\n * @returns A configuration object for generating a SoloNavMesh.\n * @see https://docs.recast-navigation-js.isaacmason.com/types/index.RecastConfig.html\n */\nexport function CreateSoloNavMeshConfig(parameters: INavMeshParametersV2): Partial<SoloNavMeshGeneratorConfig> {\n return ToSoloNavMeshGeneratorConfig(parameters);\n}\n\n/**\n * Creates a TiledNavMesh configuration based on the provided parameters.\n * @param parameters The parameters used to configure the TiledNavMesh generation.\n * @returns A configuration object for generating a TiledNavMesh.\n */\nexport function CreateTiledNavMeshConfig(parameters: INavMeshParametersV2): Partial<TiledNavMeshGeneratorConfig> {\n const cfg: Partial<TiledNavMeshGeneratorConfig> = {\n ...CreateSoloNavMeshConfig(parameters),\n tileSize: parameters.tileSize ?? 32,\n };\n return cfg;\n}\n\n/**\n * Creates a TileCacheNavMesh configuration based on the provided parameters.\n * @param parameters The parameters used to configure the TileCacheNavMesh generation.\n * @returns A configuration object for generating a TileCacheNavMesh.\n */\nexport function CreateTileCacheNavMeshConfig(parameters: INavMeshParametersV2): Partial<TileCacheGeneratorConfig> {\n const cfg: Partial<TileCacheGeneratorConfig> = {\n ...CreateTiledNavMeshConfig(parameters),\n expectedLayersPerTile: parameters.expectedLayersPerTile ?? 1,\n maxObstacles: parameters.maxObstacles ?? DefaultMaxObstacles,\n };\n\n if (parameters.tileCacheMeshProcess) {\n cfg.tileCacheMeshProcess = parameters.tileCacheMeshProcess;\n } else if (parameters.offMeshConnections) {\n Logger.Warn(\"offMeshConnections are required but no tileCacheMeshProcess is set. Using fallback DefaultTileCacheMeshProcess.\");\n cfg.tileCacheMeshProcess = CreateDefaultTileCacheMeshProcess(parameters.offMeshConnections);\n }\n\n return cfg;\n}\n\n/**\n * Convert INavMeshParametersV2 to SoloNavMeshGeneratorConfig by filtering out undefined values.\n * @param config NavMesh parameters\n * @returns Recast solo nav mesh generator config\n */\nexport function ToSoloNavMeshGeneratorConfig(config: INavMeshParametersV2): Partial<SoloNavMeshGeneratorConfig> {\n return Object.fromEntries(Object.entries(config).filter(([_, v]) => v !== undefined));\n}\n\n/**\n * Convert IAgentParametersV2 to Recast CrowdAgentParams by filtering out undefined values.\n * @param agentParams Agent parameters\n * @returns Recast crowd agent parameters\n */\nexport function ToCrowdAgentParams(agentParams: IAgentParametersV2): Partial<CrowdAgentParams> {\n return Object.fromEntries(Object.entries(agentParams).filter(([_, v]) => v !== undefined));\n}\n"]}
|
|
@@ -240,7 +240,7 @@ function inRange(a, b, r, h) {
|
|
|
240
240
|
const dx = b.x - a.x;
|
|
241
241
|
const dy = b.y - a.y;
|
|
242
242
|
const dz = b.z - a.z;
|
|
243
|
-
return dx * dx + dz * dz < r && Math.abs(dy) < h;
|
|
243
|
+
return dx * dx + dz * dz < r * r && Math.abs(dy) < h;
|
|
244
244
|
}
|
|
245
245
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
246
246
|
function fixupCorridor(pathPolys, maxPath, visitedPolyRefs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smooth-path.js","sourceRoot":"","sources":["../../../../../dev/addons/src/navigation/common/smooth-path.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NavMeshQuery, NavMesh, QueryFilter } from \"@recast-navigation/core\";\n\nimport type { IVector3Like } from \"core/Maths/math.like\";\nimport { Vector3 } from \"core/Maths/math.vector\";\n\nimport { ConvertNavPathPoints } from \"./convert\";\nimport type { RecastInjection, SteerTargetResult } from \"../types\";\nimport { ComputePathError, type ComputePathResult } from \"../types\";\nimport { GetRecast } from \"../factory/common\";\n\nconst _DELTA = new Vector3();\nconst _MOVE_TARGET = new Vector3();\n\n/**\n * Compute a smooth navigation path from start to end. Returns an empty array if no path can be computed\n * @param navMesh the navigation mesh to use\n * @param navmeshQuery the navigation mesh query to use\n * @param start world position\n * @param end world position\n * @param options options object\n * @returns array containing world position composing the path\n */\nexport function ComputeSmoothPath(\n navMesh: NavMesh,\n navmeshQuery: NavMeshQuery,\n start: IVector3Like,\n end: IVector3Like,\n options?: {\n filter?: QueryFilter;\n halfExtents?: IVector3Like;\n\n /**\n * @default 256\n */\n maxPathPolys?: number;\n\n /**\n * @default 2048\n */\n maxSmoothPathPoints?: number;\n\n /**\n * @default 0.5\n */\n stepSize?: number;\n\n /**\n * @default 0.01\n */\n slop?: number;\n }\n): Vector3[] {\n return ConvertNavPathPoints(ComputeSmoothPathImpl(navMesh, navmeshQuery, start, end, options));\n}\n\nfunction ComputeSmoothPathImpl(\n navMesh: NavMesh,\n navMeshQuery: NavMeshQuery,\n start: IVector3Like,\n end: IVector3Like,\n options?: {\n filter?: QueryFilter;\n halfExtents?: IVector3Like;\n maxPathPolys?: number;\n maxSmoothPathPoints?: number;\n stepSize?: number;\n slop?: number;\n }\n): ComputePathResult {\n const recast = GetRecast();\n const filter = options?.filter ?? navMeshQuery.defaultFilter;\n const halfExtents = options?.halfExtents ?? navMeshQuery.defaultQueryHalfExtents;\n const maxSmoothPathPoints = options?.maxSmoothPathPoints ?? 2048;\n const maxPathPolys = options?.maxPathPolys ?? 256;\n const stepSize = options?.stepSize ?? 0.5;\n const slop = options?.slop ?? 0.01;\n\n // find nearest polygons for start and end positions\n const startNearestPolyResult = navMeshQuery.findNearestPoly(start, {\n filter,\n halfExtents,\n });\n\n if (!startNearestPolyResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.START_NEAREST_POLY_FAILED,\n status: startNearestPolyResult.status,\n },\n path: [],\n };\n }\n\n const endNearestPolyResult = navMeshQuery.findNearestPoly(end, {\n filter,\n halfExtents,\n });\n\n if (!endNearestPolyResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.END_NEAREST_POLY_FAILED,\n status: endNearestPolyResult.status,\n },\n path: [],\n };\n }\n\n const startRef = startNearestPolyResult.nearestRef;\n const endRef = endNearestPolyResult.nearestRef;\n\n // find polygon path\n const findPathResult = navMeshQuery.findPath(startRef, endRef, start, end, {\n filter,\n maxPathPolys,\n });\n\n if (!findPathResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.FIND_PATH_FAILED,\n status: findPathResult.status,\n },\n path: [],\n };\n }\n\n if (findPathResult.polys.size <= 0) {\n return {\n success: false,\n error: {\n type: ComputePathError.NO_POLYGON_PATH_FOUND,\n },\n path: [],\n };\n }\n\n const lastPoly = findPathResult.polys.get(findPathResult.polys.size - 1);\n\n let closestEnd = end;\n\n if (lastPoly !== endRef) {\n const lastPolyClosestPointResult = navMeshQuery.closestPointOnPoly(lastPoly, end);\n\n if (!lastPolyClosestPointResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.NO_CLOSEST_POINT_ON_LAST_POLYGON_FOUND,\n status: lastPolyClosestPointResult.status,\n },\n path: [],\n };\n }\n\n closestEnd = lastPolyClosestPointResult.closestPoint;\n }\n\n // Iterate over the path to find a smooth path on the detail mesh\n const iterPos = new Vector3(start.x, start.y, start.z);\n const targetPos = new Vector3(closestEnd.x, closestEnd.y, closestEnd.z);\n\n const polys = Array.from(findPathResult.polys.getHeapView());\n const smoothPath: Vector3[] = [];\n\n smoothPath.push(iterPos.clone());\n\n while (polys.length > 0 && smoothPath.length < maxSmoothPathPoints) {\n // Find location to steer towards\n const steerTarget = getSteerTarget(navMeshQuery, iterPos, targetPos, slop, polys, recast);\n\n if (!steerTarget.success) {\n break;\n }\n\n const isEndOfPath = steerTarget.steerPosFlag & recast.Detour.DT_STRAIGHTPATH_END;\n const isOffMeshConnection = steerTarget.steerPosFlag & recast.Detour.DT_STRAIGHTPATH_OFFMESH_CONNECTION;\n\n // Find movement delta.\n const steerPos = steerTarget.steerPos;\n const delta = _DELTA.copyFrom(steerPos).subtract(iterPos);\n let len = Math.sqrt(delta.dot(delta));\n\n // If the steer target is the end of the path or an off-mesh connection, do not move past the location.\n if ((isEndOfPath || isOffMeshConnection) && len < stepSize) {\n len = 1;\n } else {\n len = stepSize / len;\n }\n\n const moveTarget = _MOVE_TARGET.copyFrom(iterPos).addInPlace(delta.scale(len));\n\n // Move\n const moveAlongSurface = navMeshQuery.moveAlongSurface(polys[0], iterPos, moveTarget, { filter, maxVisitedSize: 16 });\n\n if (!moveAlongSurface.success) {\n break;\n }\n\n const result = moveAlongSurface.resultPosition;\n\n fixupCorridor(polys, maxPathPolys, moveAlongSurface.visited);\n fixupShortcuts(polys, navMesh, recast);\n\n const polyHeightResult = navMeshQuery.getPolyHeight(polys[0], result);\n\n if (polyHeightResult.success) {\n result.y = polyHeightResult.height;\n }\n\n iterPos.copyFromFloats(result.x, result.y, result.z);\n\n // Handle end of path and off-mesh links when close enough\n if (isEndOfPath && inRange(iterPos, steerTarget.steerPos, slop, 1.0)) {\n // Reached end of path\n iterPos.copyFrom(targetPos);\n\n if (smoothPath.length < maxSmoothPathPoints) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n }\n\n break;\n } else if (isOffMeshConnection && inRange(iterPos, steerTarget.steerPos, slop, 1.0)) {\n // Reached off-mesh connection.\n\n // Advance the path up to and over the off-mesh connection.\n const offMeshConRef = steerTarget.steerPosRef;\n\n // Advance the path up to and over the off-mesh connection.\n let prevPolyRef = 0;\n let polyRef = polys[0];\n let npos = 0;\n while (npos < polys.length && polyRef !== offMeshConRef) {\n prevPolyRef = polyRef;\n polyRef = polys[npos];\n npos++;\n }\n\n for (let i = npos; i < polys.length; i++) {\n polys[i - npos] = polys[i];\n }\n polys.splice(npos, polys.length - npos);\n\n // Handle the connection\n const offMeshConnectionPolyEndPoints = navMesh.getOffMeshConnectionPolyEndPoints(prevPolyRef, polyRef);\n\n if (offMeshConnectionPolyEndPoints.success) {\n if (smoothPath.length < maxSmoothPathPoints) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n\n // Hack to make the dotted path not visible during off-mesh connection.\n if (smoothPath.length & 1) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n }\n\n // Move position at the other side of the off-mesh link.\n iterPos.copyFromFloats(offMeshConnectionPolyEndPoints.end.x, offMeshConnectionPolyEndPoints.end.y, offMeshConnectionPolyEndPoints.end.z);\n\n const endPositionPolyHeight = navMeshQuery.getPolyHeight(polys[0], iterPos);\n\n if (endPositionPolyHeight.success) {\n iterPos.y = endPositionPolyHeight.height;\n }\n }\n }\n }\n\n // Store results.\n if (smoothPath.length < maxSmoothPathPoints) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n }\n }\n\n return {\n success: true,\n path: smoothPath,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction getSteerTarget(navMeshQuery: NavMeshQuery, start: Vector3, end: Vector3, minTargetDist: number, pathPolys: number[], recast: RecastInjection): SteerTargetResult {\n const maxSteerPoints = 3;\n const straightPath = navMeshQuery.findStraightPath(start, end, pathPolys, {\n maxStraightPathPoints: maxSteerPoints,\n });\n\n if (!straightPath.success) {\n return {\n success: false,\n };\n }\n\n const outPoints: Vector3[] = [];\n for (let i = 0; i < straightPath.straightPathCount; i++) {\n const point = new Vector3(straightPath.straightPath.get(i * 3), straightPath.straightPath.get(i * 3 + 1), straightPath.straightPath.get(i * 3 + 2));\n\n outPoints.push(point);\n }\n\n // Find vertex far enough to steer to\n let ns = 0;\n while (ns < outPoints.length) {\n // Stop at Off-Mesh link or when point is further than slop away\n if (straightPath.straightPathFlags.get(ns) & recast.Detour.DT_STRAIGHTPATH_OFFMESH_CONNECTION) {\n break;\n }\n\n const posA = outPoints[ns];\n const posB = start;\n\n if (!inRange(posA, posB, minTargetDist, 1000.0)) {\n break;\n }\n\n ns++;\n }\n\n // Failed to find good point to steer to\n if (ns >= straightPath.straightPathCount) {\n return {\n success: false,\n };\n }\n\n const steerPos = outPoints[ns];\n const steerPosFlag = straightPath.straightPathFlags.get(ns);\n const steerPosRef = straightPath.straightPathRefs.get(ns);\n\n return {\n success: true,\n steerPos,\n steerPosFlag,\n steerPosRef,\n points: outPoints,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction inRange(a: Vector3, b: Vector3, r: number, h: number) {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dz = b.z - a.z;\n return dx * dx + dz * dz < r && Math.abs(dy) < h;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction fixupCorridor(pathPolys: number[], maxPath: number, visitedPolyRefs: number[]) {\n let furthestPath = -1;\n let furthestVisited = -1;\n\n // Find furthest common polygon.\n for (let i = pathPolys.length - 1; i >= 0; i--) {\n let found = false;\n for (let j = visitedPolyRefs.length - 1; j >= 0; j--) {\n if (pathPolys[i] === visitedPolyRefs[j]) {\n furthestPath = i;\n furthestVisited = j;\n found = true;\n }\n }\n if (found) {\n break;\n }\n }\n\n // If no intersection found just return current path.\n if (furthestPath === -1 || furthestVisited === -1) {\n return pathPolys;\n }\n\n // Concatenate paths.\n\n // Adjust beginning of the buffer to include the visited.\n const req = visitedPolyRefs.length - furthestVisited;\n const orig = Math.min(furthestPath + 1, pathPolys.length);\n\n let size = Math.max(0, pathPolys.length - orig);\n\n if (req + size > maxPath) {\n size = maxPath - req;\n }\n if (size) {\n pathPolys.splice(req, size, ...pathPolys.slice(orig, orig + size));\n }\n\n // Store visited\n for (let i = 0; i < req; i++) {\n pathPolys[i] = visitedPolyRefs[visitedPolyRefs.length - (1 + i)];\n }\n\n return pathPolys;\n}\n\n/**\n * This function checks if the path has a small U-turn, that is,\n * a polygon further in the path is adjacent to the first polygon\n * in the path. If that happens, a shortcut is taken.\n * This can happen if the target (T) location is at tile boundary,\n * and we're (S) approaching it parallel to the tile edge.\n * The choice at the vertex can be arbitrary,\n * +---+---+\n * |:::|:::|\n * +-S-+-T-+\n * |:::| | -- the step can end up in here, resulting U-turn path.\n * +---+---+\n * @param pathPolys The path polygons to check for U-turns.\n * @param navMesh The navigation mesh used to check adjacency.\n * @param recast The recast injection to use.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction fixupShortcuts(pathPolys: number[], navMesh: NavMesh, recast: RecastInjection) {\n if (pathPolys.length < 3) {\n return;\n }\n\n // Get connected polygons\n const maxNeis = 16;\n let nneis = 0;\n const neis: number[] = [];\n\n const tileAndPoly = navMesh.getTileAndPolyByRef(pathPolys[0]);\n\n if (!tileAndPoly.success) {\n return;\n }\n\n const poly = tileAndPoly.poly;\n const tile = tileAndPoly.tile;\n for (let k = poly.firstLink(); k !== recast.Detour.DT_NULL_LINK; k = tile.links(k).next()) {\n const link = tile.links(k);\n\n if (link.ref() !== 0) {\n if (nneis < maxNeis) {\n neis.push(link.ref());\n nneis++;\n }\n }\n }\n\n // If any of the neighbour polygons is within the next few polygons\n // in the path, short cut to that polygon directly.\n const maxLookAhead = 6;\n let cut = 0;\n for (let i = Math.min(maxLookAhead, pathPolys.length) - 1; i > 1 && cut === 0; i--) {\n for (let j = 0; j < nneis; j++) {\n if (pathPolys[i] === neis[j]) {\n cut = i;\n break;\n }\n }\n }\n\n if (cut > 1) {\n pathPolys.splice(1, cut - 1);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"smooth-path.js","sourceRoot":"","sources":["../../../../../dev/addons/src/navigation/common/smooth-path.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NavMeshQuery, NavMesh, QueryFilter } from \"@recast-navigation/core\";\n\nimport type { IVector3Like } from \"core/Maths/math.like\";\nimport { Vector3 } from \"core/Maths/math.vector\";\n\nimport { ConvertNavPathPoints } from \"./convert\";\nimport type { RecastInjection, SteerTargetResult } from \"../types\";\nimport { ComputePathError, type ComputePathResult } from \"../types\";\nimport { GetRecast } from \"../factory/common\";\n\nconst _DELTA = new Vector3();\nconst _MOVE_TARGET = new Vector3();\n\n/**\n * Compute a smooth navigation path from start to end. Returns an empty array if no path can be computed\n * @param navMesh the navigation mesh to use\n * @param navmeshQuery the navigation mesh query to use\n * @param start world position\n * @param end world position\n * @param options options object\n * @returns array containing world position composing the path\n */\nexport function ComputeSmoothPath(\n navMesh: NavMesh,\n navmeshQuery: NavMeshQuery,\n start: IVector3Like,\n end: IVector3Like,\n options?: {\n filter?: QueryFilter;\n halfExtents?: IVector3Like;\n\n /**\n * @default 256\n */\n maxPathPolys?: number;\n\n /**\n * @default 2048\n */\n maxSmoothPathPoints?: number;\n\n /**\n * @default 0.5\n */\n stepSize?: number;\n\n /**\n * @default 0.01\n */\n slop?: number;\n }\n): Vector3[] {\n return ConvertNavPathPoints(ComputeSmoothPathImpl(navMesh, navmeshQuery, start, end, options));\n}\n\nfunction ComputeSmoothPathImpl(\n navMesh: NavMesh,\n navMeshQuery: NavMeshQuery,\n start: IVector3Like,\n end: IVector3Like,\n options?: {\n filter?: QueryFilter;\n halfExtents?: IVector3Like;\n maxPathPolys?: number;\n maxSmoothPathPoints?: number;\n stepSize?: number;\n slop?: number;\n }\n): ComputePathResult {\n const recast = GetRecast();\n const filter = options?.filter ?? navMeshQuery.defaultFilter;\n const halfExtents = options?.halfExtents ?? navMeshQuery.defaultQueryHalfExtents;\n const maxSmoothPathPoints = options?.maxSmoothPathPoints ?? 2048;\n const maxPathPolys = options?.maxPathPolys ?? 256;\n const stepSize = options?.stepSize ?? 0.5;\n const slop = options?.slop ?? 0.01;\n\n // find nearest polygons for start and end positions\n const startNearestPolyResult = navMeshQuery.findNearestPoly(start, {\n filter,\n halfExtents,\n });\n\n if (!startNearestPolyResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.START_NEAREST_POLY_FAILED,\n status: startNearestPolyResult.status,\n },\n path: [],\n };\n }\n\n const endNearestPolyResult = navMeshQuery.findNearestPoly(end, {\n filter,\n halfExtents,\n });\n\n if (!endNearestPolyResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.END_NEAREST_POLY_FAILED,\n status: endNearestPolyResult.status,\n },\n path: [],\n };\n }\n\n const startRef = startNearestPolyResult.nearestRef;\n const endRef = endNearestPolyResult.nearestRef;\n\n // find polygon path\n const findPathResult = navMeshQuery.findPath(startRef, endRef, start, end, {\n filter,\n maxPathPolys,\n });\n\n if (!findPathResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.FIND_PATH_FAILED,\n status: findPathResult.status,\n },\n path: [],\n };\n }\n\n if (findPathResult.polys.size <= 0) {\n return {\n success: false,\n error: {\n type: ComputePathError.NO_POLYGON_PATH_FOUND,\n },\n path: [],\n };\n }\n\n const lastPoly = findPathResult.polys.get(findPathResult.polys.size - 1);\n\n let closestEnd = end;\n\n if (lastPoly !== endRef) {\n const lastPolyClosestPointResult = navMeshQuery.closestPointOnPoly(lastPoly, end);\n\n if (!lastPolyClosestPointResult.success) {\n return {\n success: false,\n error: {\n type: ComputePathError.NO_CLOSEST_POINT_ON_LAST_POLYGON_FOUND,\n status: lastPolyClosestPointResult.status,\n },\n path: [],\n };\n }\n\n closestEnd = lastPolyClosestPointResult.closestPoint;\n }\n\n // Iterate over the path to find a smooth path on the detail mesh\n const iterPos = new Vector3(start.x, start.y, start.z);\n const targetPos = new Vector3(closestEnd.x, closestEnd.y, closestEnd.z);\n\n const polys = Array.from(findPathResult.polys.getHeapView());\n const smoothPath: Vector3[] = [];\n\n smoothPath.push(iterPos.clone());\n\n while (polys.length > 0 && smoothPath.length < maxSmoothPathPoints) {\n // Find location to steer towards\n const steerTarget = getSteerTarget(navMeshQuery, iterPos, targetPos, slop, polys, recast);\n\n if (!steerTarget.success) {\n break;\n }\n\n const isEndOfPath = steerTarget.steerPosFlag & recast.Detour.DT_STRAIGHTPATH_END;\n const isOffMeshConnection = steerTarget.steerPosFlag & recast.Detour.DT_STRAIGHTPATH_OFFMESH_CONNECTION;\n\n // Find movement delta.\n const steerPos = steerTarget.steerPos;\n const delta = _DELTA.copyFrom(steerPos).subtract(iterPos);\n let len = Math.sqrt(delta.dot(delta));\n\n // If the steer target is the end of the path or an off-mesh connection, do not move past the location.\n if ((isEndOfPath || isOffMeshConnection) && len < stepSize) {\n len = 1;\n } else {\n len = stepSize / len;\n }\n\n const moveTarget = _MOVE_TARGET.copyFrom(iterPos).addInPlace(delta.scale(len));\n\n // Move\n const moveAlongSurface = navMeshQuery.moveAlongSurface(polys[0], iterPos, moveTarget, { filter, maxVisitedSize: 16 });\n\n if (!moveAlongSurface.success) {\n break;\n }\n\n const result = moveAlongSurface.resultPosition;\n\n fixupCorridor(polys, maxPathPolys, moveAlongSurface.visited);\n fixupShortcuts(polys, navMesh, recast);\n\n const polyHeightResult = navMeshQuery.getPolyHeight(polys[0], result);\n\n if (polyHeightResult.success) {\n result.y = polyHeightResult.height;\n }\n\n iterPos.copyFromFloats(result.x, result.y, result.z);\n\n // Handle end of path and off-mesh links when close enough\n if (isEndOfPath && inRange(iterPos, steerTarget.steerPos, slop, 1.0)) {\n // Reached end of path\n iterPos.copyFrom(targetPos);\n\n if (smoothPath.length < maxSmoothPathPoints) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n }\n\n break;\n } else if (isOffMeshConnection && inRange(iterPos, steerTarget.steerPos, slop, 1.0)) {\n // Reached off-mesh connection.\n\n // Advance the path up to and over the off-mesh connection.\n const offMeshConRef = steerTarget.steerPosRef;\n\n // Advance the path up to and over the off-mesh connection.\n let prevPolyRef = 0;\n let polyRef = polys[0];\n let npos = 0;\n while (npos < polys.length && polyRef !== offMeshConRef) {\n prevPolyRef = polyRef;\n polyRef = polys[npos];\n npos++;\n }\n\n for (let i = npos; i < polys.length; i++) {\n polys[i - npos] = polys[i];\n }\n polys.splice(npos, polys.length - npos);\n\n // Handle the connection\n const offMeshConnectionPolyEndPoints = navMesh.getOffMeshConnectionPolyEndPoints(prevPolyRef, polyRef);\n\n if (offMeshConnectionPolyEndPoints.success) {\n if (smoothPath.length < maxSmoothPathPoints) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n\n // Hack to make the dotted path not visible during off-mesh connection.\n if (smoothPath.length & 1) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n }\n\n // Move position at the other side of the off-mesh link.\n iterPos.copyFromFloats(offMeshConnectionPolyEndPoints.end.x, offMeshConnectionPolyEndPoints.end.y, offMeshConnectionPolyEndPoints.end.z);\n\n const endPositionPolyHeight = navMeshQuery.getPolyHeight(polys[0], iterPos);\n\n if (endPositionPolyHeight.success) {\n iterPos.y = endPositionPolyHeight.height;\n }\n }\n }\n }\n\n // Store results.\n if (smoothPath.length < maxSmoothPathPoints) {\n smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z));\n }\n }\n\n return {\n success: true,\n path: smoothPath,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction getSteerTarget(navMeshQuery: NavMeshQuery, start: Vector3, end: Vector3, minTargetDist: number, pathPolys: number[], recast: RecastInjection): SteerTargetResult {\n const maxSteerPoints = 3;\n const straightPath = navMeshQuery.findStraightPath(start, end, pathPolys, {\n maxStraightPathPoints: maxSteerPoints,\n });\n\n if (!straightPath.success) {\n return {\n success: false,\n };\n }\n\n const outPoints: Vector3[] = [];\n for (let i = 0; i < straightPath.straightPathCount; i++) {\n const point = new Vector3(straightPath.straightPath.get(i * 3), straightPath.straightPath.get(i * 3 + 1), straightPath.straightPath.get(i * 3 + 2));\n\n outPoints.push(point);\n }\n\n // Find vertex far enough to steer to\n let ns = 0;\n while (ns < outPoints.length) {\n // Stop at Off-Mesh link or when point is further than slop away\n if (straightPath.straightPathFlags.get(ns) & recast.Detour.DT_STRAIGHTPATH_OFFMESH_CONNECTION) {\n break;\n }\n\n const posA = outPoints[ns];\n const posB = start;\n\n if (!inRange(posA, posB, minTargetDist, 1000.0)) {\n break;\n }\n\n ns++;\n }\n\n // Failed to find good point to steer to\n if (ns >= straightPath.straightPathCount) {\n return {\n success: false,\n };\n }\n\n const steerPos = outPoints[ns];\n const steerPosFlag = straightPath.straightPathFlags.get(ns);\n const steerPosRef = straightPath.straightPathRefs.get(ns);\n\n return {\n success: true,\n steerPos,\n steerPosFlag,\n steerPosRef,\n points: outPoints,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction inRange(a: Vector3, b: Vector3, r: number, h: number) {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dz = b.z - a.z;\n return dx * dx + dz * dz < r * r && Math.abs(dy) < h;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction fixupCorridor(pathPolys: number[], maxPath: number, visitedPolyRefs: number[]) {\n let furthestPath = -1;\n let furthestVisited = -1;\n\n // Find furthest common polygon.\n for (let i = pathPolys.length - 1; i >= 0; i--) {\n let found = false;\n for (let j = visitedPolyRefs.length - 1; j >= 0; j--) {\n if (pathPolys[i] === visitedPolyRefs[j]) {\n furthestPath = i;\n furthestVisited = j;\n found = true;\n }\n }\n if (found) {\n break;\n }\n }\n\n // If no intersection found just return current path.\n if (furthestPath === -1 || furthestVisited === -1) {\n return pathPolys;\n }\n\n // Concatenate paths.\n\n // Adjust beginning of the buffer to include the visited.\n const req = visitedPolyRefs.length - furthestVisited;\n const orig = Math.min(furthestPath + 1, pathPolys.length);\n\n let size = Math.max(0, pathPolys.length - orig);\n\n if (req + size > maxPath) {\n size = maxPath - req;\n }\n if (size) {\n pathPolys.splice(req, size, ...pathPolys.slice(orig, orig + size));\n }\n\n // Store visited\n for (let i = 0; i < req; i++) {\n pathPolys[i] = visitedPolyRefs[visitedPolyRefs.length - (1 + i)];\n }\n\n return pathPolys;\n}\n\n/**\n * This function checks if the path has a small U-turn, that is,\n * a polygon further in the path is adjacent to the first polygon\n * in the path. If that happens, a shortcut is taken.\n * This can happen if the target (T) location is at tile boundary,\n * and we're (S) approaching it parallel to the tile edge.\n * The choice at the vertex can be arbitrary,\n * +---+---+\n * |:::|:::|\n * +-S-+-T-+\n * |:::| | -- the step can end up in here, resulting U-turn path.\n * +---+---+\n * @param pathPolys The path polygons to check for U-turns.\n * @param navMesh The navigation mesh used to check adjacency.\n * @param recast The recast injection to use.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction fixupShortcuts(pathPolys: number[], navMesh: NavMesh, recast: RecastInjection) {\n if (pathPolys.length < 3) {\n return;\n }\n\n // Get connected polygons\n const maxNeis = 16;\n let nneis = 0;\n const neis: number[] = [];\n\n const tileAndPoly = navMesh.getTileAndPolyByRef(pathPolys[0]);\n\n if (!tileAndPoly.success) {\n return;\n }\n\n const poly = tileAndPoly.poly;\n const tile = tileAndPoly.tile;\n for (let k = poly.firstLink(); k !== recast.Detour.DT_NULL_LINK; k = tile.links(k).next()) {\n const link = tile.links(k);\n\n if (link.ref() !== 0) {\n if (nneis < maxNeis) {\n neis.push(link.ref());\n nneis++;\n }\n }\n }\n\n // If any of the neighbour polygons is within the next few polygons\n // in the path, short cut to that polygon directly.\n const maxLookAhead = 6;\n let cut = 0;\n for (let i = Math.min(maxLookAhead, pathPolys.length) - 1; i > 1 && cut === 0; i--) {\n for (let j = 0; j < nneis; j++) {\n if (pathPolys[i] === neis[j]) {\n cut = i;\n break;\n }\n }\n }\n\n if (cut > 1) {\n pathPolys.splice(1, cut - 1);\n }\n}\n"]}
|
|
@@ -61,11 +61,11 @@ export declare class RecastJSCrowd implements ICrowd {
|
|
|
61
61
|
*/
|
|
62
62
|
onReachTargetObservable: Observable<{
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
64
|
+
* The index of the agent that reached its target
|
|
65
65
|
*/
|
|
66
66
|
agentIndex: number;
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
68
|
+
* The destination that the agent reached
|
|
69
69
|
*/
|
|
70
70
|
destination: Vector3;
|
|
71
71
|
}>;
|