@hellpig/anarchy-engine 22.0.0 → 22.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Actor/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Actor/Adapters/ConfigToParams.js +1 -1
- package/dist/Actor/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Actor/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Actor/Adapters/EntityToConfig.js +1 -1
- package/dist/Actor/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Actor/Entities/Actor/Actor.js +1 -1
- package/dist/Actor/Entities/Actor/Actor.js.map +1 -1
- package/dist/Actor/Factories/ActorFactory.js +1 -1
- package/dist/Actor/Factories/ActorFactory.js.map +1 -1
- package/dist/Actor/index.d.ts +1 -0
- package/dist/Audio/Adapters/AudioConfigToParams.d.ts +2 -0
- package/dist/Audio/Adapters/AudioConfigToParams.js +2 -0
- package/dist/Audio/Adapters/AudioConfigToParams.js.map +1 -0
- package/dist/Audio/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Audio/Adapters/EntityToConfig.js +1 -1
- package/dist/Audio/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Audio/Adapters/index.d.ts +1 -1
- package/dist/Audio/Factories/AudioFactory.js +1 -1
- package/dist/Audio/Factories/AudioFactory.js.map +1 -1
- package/dist/Audio/Wrappers/AbstractAudioWrapper.js +1 -1
- package/dist/Audio/Wrappers/AbstractAudioWrapper.js.map +1 -1
- package/dist/Camera/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Camera/Adapters/ConfigToParams.js +1 -1
- package/dist/Camera/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Camera/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Camera/Adapters/EntityToConfig.js +1 -1
- package/dist/Camera/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Camera/Adapters/index.d.ts +1 -1
- package/dist/Camera/Factories/CameraFactory.js +1 -1
- package/dist/Camera/Factories/CameraFactory.js.map +1 -1
- package/dist/Camera/Wrappers/OrthographicCameraWrapper.js +1 -1
- package/dist/Camera/Wrappers/OrthographicCameraWrapper.js.map +1 -1
- package/dist/Camera/Wrappers/PerspectiveCameraWrapper.js +1 -1
- package/dist/Camera/Wrappers/PerspectiveCameraWrapper.js.map +1 -1
- package/dist/Color/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Color/Adapters/EntityToConfig.js +1 -1
- package/dist/Color/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Color/Wrappers/ColorWrapper.js +1 -1
- package/dist/Color/Wrappers/ColorWrapper.js.map +1 -1
- package/dist/Controls/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Controls/Adapters/ConfigToParams.js +1 -1
- package/dist/Controls/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Controls/Factories/ControlsFactory.js +1 -1
- package/dist/Controls/Factories/ControlsFactory.js.map +1 -1
- package/dist/Controls/Wrappers/FpsControls/FpsControlsWrapper.js +1 -1
- package/dist/Controls/Wrappers/OrbitControls/OrbitControlsWrapper.js +1 -1
- package/dist/Controls/index.d.ts +1 -0
- package/dist/EnvMap/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/EnvMap/Adapters/ConfigToParams.js +1 -1
- package/dist/EnvMap/Adapters/ConfigToParams.js.map +1 -1
- package/dist/EnvMap/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/EnvMap/Adapters/EntityToConfig.js +1 -1
- package/dist/EnvMap/Adapters/EntityToConfig.js.map +1 -1
- package/dist/EnvMap/Factories/EnvMapFactory.js +1 -1
- package/dist/EnvMap/Factories/EnvMapFactory.js.map +1 -1
- package/dist/EnvMap/Wrappers/EnvMapWrapper.js +1 -1
- package/dist/EnvMap/Wrappers/EnvMapWrapper.js.map +1 -1
- package/dist/EnvMap/index.d.ts +1 -1
- package/dist/Fog/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Fog/Adapters/ConfigToParams.js +1 -1
- package/dist/Fog/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Fog/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Fog/Adapters/EntityToConfig.js +1 -1
- package/dist/Fog/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Fog/Factories/FogFactory.js +1 -1
- package/dist/Fog/Factories/FogFactory.js.map +1 -1
- package/dist/Fog/Wrappers/FogWrapper.js +1 -1
- package/dist/Fog/Wrappers/FogWrapper.js.map +1 -1
- package/dist/Fog/index.d.ts +1 -0
- package/dist/Fsm/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Fsm/Adapters/ConfigToParams.js +1 -1
- package/dist/Fsm/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Fsm/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Fsm/Adapters/EntityToConfig.js +1 -1
- package/dist/Fsm/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Fsm/Factories/FsmInstanceFactory.js +1 -1
- package/dist/Fsm/Factories/FsmInstanceFactory.js.map +1 -1
- package/dist/Fsm/Factories/FsmSourceFactory.js +1 -1
- package/dist/Fsm/Factories/FsmSourceFactory.js.map +1 -1
- package/dist/Fsm/Wrappers/FsmWrapper.js +1 -1
- package/dist/Fsm/Wrappers/FsmWrapper.js.map +1 -1
- package/dist/Intersections/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Intersections/Adapters/ConfigToParams.js +1 -1
- package/dist/Intersections/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Intersections/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Intersections/Adapters/EntityToConfig.js +1 -1
- package/dist/Intersections/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Intersections/Factories/IntersectionsWatcherFactory.js +1 -1
- package/dist/Intersections/Factories/IntersectionsWatcherFactory.js.map +1 -1
- package/dist/Intersections/Watchers/AbstractIntersectionsWatcher.js +1 -1
- package/dist/Intersections/Watchers/AbstractIntersectionsWatcher.js.map +1 -1
- package/dist/Intersections/index.d.ts +1 -1
- package/dist/Kinematic/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Kinematic/Adapters/ConfigToParams.js +1 -1
- package/dist/Kinematic/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Kinematic/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Kinematic/Adapters/EntityToConfig.js +1 -1
- package/dist/Kinematic/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Kinematic/Adapters/index.d.ts +1 -1
- package/dist/Light/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Light/Adapters/ConfigToParams.js +1 -1
- package/dist/Light/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Light/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Light/Adapters/EntityToConfig.js +1 -1
- package/dist/Light/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Light/Factories/LightFactory.js +1 -1
- package/dist/Light/Factories/LightFactory.js.map +1 -1
- package/dist/Light/Wrappers/AbstractLightWrapper.js +1 -1
- package/dist/Light/Wrappers/AbstractLightWrapper.js.map +1 -1
- package/dist/Light/index.d.ts +1 -0
- package/dist/Material/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Material/Adapters/ConfigToParams.js +1 -1
- package/dist/Material/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Material/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Material/Adapters/EntityToConfig.js +1 -1
- package/dist/Material/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Material/Factories/MaterialFactory.js +1 -1
- package/dist/Material/Factories/MaterialFactory.js.map +1 -1
- package/dist/Material/Wrappers/MaterialWrapper.js +1 -1
- package/dist/Material/Wrappers/MaterialWrapper.js.map +1 -1
- package/dist/Material/index.d.ts +1 -0
- package/dist/Models3d/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Models3d/Adapters/ConfigToParams.js +1 -1
- package/dist/Models3d/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Models3d/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Models3d/Adapters/EntityToConfig.js +1 -1
- package/dist/Models3d/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Models3d/Entities/Model3d.js +1 -1
- package/dist/Models3d/Entities/Model3d.js.map +1 -1
- package/dist/Models3d/Factories/Models3dFactory.js +1 -1
- package/dist/Models3d/Factories/Models3dFactory.js.map +1 -1
- package/dist/Models3d/index.d.ts +1 -1
- package/dist/Particles/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Particles/Adapters/ConfigToParams.js +1 -1
- package/dist/Particles/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Particles/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Particles/Adapters/EntityToConfig.js +1 -1
- package/dist/Particles/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Particles/Factories/ParticlesFactory.js +1 -1
- package/dist/Particles/Factories/ParticlesFactory.js.map +1 -1
- package/dist/Particles/Wrappers/ParticlesWrapper.js +1 -1
- package/dist/Particles/Wrappers/ParticlesWrapper.js.map +1 -1
- package/dist/Particles/index.d.ts +1 -1
- package/dist/Physics/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Physics/Adapters/EntityToConfig.js +1 -1
- package/dist/Physics/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Physics/Adapters/PhysicsBodyConfigToParams.d.ts +1 -1
- package/dist/Physics/Adapters/PhysicsBodyConfigToParams.js +1 -1
- package/dist/Physics/Adapters/PhysicsBodyConfigToParams.js.map +1 -1
- package/dist/Physics/Adapters/PhysicsWorldConfigToParams.d.ts +1 -1
- package/dist/Physics/Adapters/PhysicsWorldConfigToParams.js +1 -1
- package/dist/Physics/Adapters/PhysicsWorldConfigToParams.js.map +1 -1
- package/dist/Physics/Entities/PhysicsBody.js +1 -1
- package/dist/Physics/Entities/PhysicsBody.js.map +1 -1
- package/dist/Physics/Factories/PhysicsBodyFactory.js +1 -1
- package/dist/Physics/Factories/PhysicsBodyFactory.js.map +1 -1
- package/dist/Renderer/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Renderer/Adapters/ConfigToParams.js +1 -1
- package/dist/Renderer/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Renderer/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Renderer/Adapters/EntityToConfig.js +1 -1
- package/dist/Renderer/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Renderer/Factories/RendererFactory.js +1 -1
- package/dist/Renderer/Factories/RendererFactory.js.map +1 -1
- package/dist/Renderer/Wrappers/RendererWrapper.js +1 -1
- package/dist/Renderer/Wrappers/RendererWrapper.js.map +1 -1
- package/dist/Renderer/index.d.ts +1 -1
- package/dist/Scene/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Scene/Adapters/ConfigToParams.js +1 -1
- package/dist/Scene/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Scene/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Scene/Adapters/EntityToConfig.js +1 -1
- package/dist/Scene/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Scene/Factories/SceneFactory.js +1 -1
- package/dist/Scene/Factories/SceneFactory.js.map +1 -1
- package/dist/Scene/Wrappers/SceneWrapper.js +1 -1
- package/dist/Scene/Wrappers/SceneWrapper.js.map +1 -1
- package/dist/Scene/index.d.ts +1 -0
- package/dist/Space/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Space/Adapters/ConfigToParams.js +1 -1
- package/dist/Space/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Space/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Space/Adapters/EntityToConfig.js +1 -1
- package/dist/Space/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Space/Entities/Space.js +1 -1
- package/dist/Space/Entities/Space.js.map +1 -1
- package/dist/Space/Factories/SpaceFactory.js +1 -1
- package/dist/Space/Factories/SpaceFactory.js.map +1 -1
- package/dist/Space/index.d.ts +1 -1
- package/dist/Spatial/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Spatial/Adapters/ConfigToParams.js +1 -1
- package/dist/Spatial/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Spatial/Adapters/ConfigToParamsSpatialData.d.ts +1 -1
- package/dist/Spatial/Adapters/ConfigToParamsSpatialData.js +1 -1
- package/dist/Spatial/Adapters/ConfigToParamsSpatialData.js.map +1 -1
- package/dist/Spatial/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Spatial/Adapters/EntityToConfig.js +1 -1
- package/dist/Spatial/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Spatial/Factories/SpatialGridFactory.js +1 -1
- package/dist/Spatial/Factories/SpatialGridFactory.js.map +1 -1
- package/dist/Spatial/Wrappers/SpatialGridWrapper.js +1 -1
- package/dist/Spatial/Wrappers/SpatialGridWrapper.js.map +1 -1
- package/dist/Text/Adapters/ConfigToParams.d.ts +1 -1
- package/dist/Text/Adapters/ConfigToParams.js +1 -1
- package/dist/Text/Adapters/ConfigToParams.js.map +1 -1
- package/dist/Text/Adapters/EntityToConfig.d.ts +1 -1
- package/dist/Text/Adapters/EntityToConfig.js +1 -1
- package/dist/Text/Adapters/EntityToConfig.js.map +1 -1
- package/dist/Text/Factories/TextFactory.js +1 -1
- package/dist/Text/Factories/TextFactory.js.map +1 -1
- package/dist/Text/Wrappers/TextTextureWrapper.js +1 -1
- package/dist/Text/Wrappers/TextTextureWrapper.js.map +1 -1
- package/dist/Text/Wrappers/TextWrapper.js +1 -1
- package/dist/Text/Wrappers/TextWrapper.js.map +1 -1
- package/dist/Text/index.d.ts +1 -0
- package/dist/ThreeLib/Utils/Object3dUtils.d.ts +1 -1
- package/dist/ThreeLib/Utils/Object3dUtils.js +1 -1
- package/dist/ThreeLib/Utils/Object3dUtils.js.map +1 -1
- package/dist/TransformDrive/Entities/Agents/KinematicTransformAgent.js +1 -1
- package/dist/TransformDrive/Entities/Agents/KinematicTransformAgent.js.map +1 -1
- package/dist/index.js +1 -1
- package/legal/NOTICE.md +1 -1
- package/legal/THIRD_PARTY_LICENSES.md +1 -1
- package/package.json +2 -1
- package/dist/Audio/Adapters/ConfigToParams.d.ts +0 -2
- package/dist/Audio/Adapters/ConfigToParams.js +0 -2
- package/dist/Audio/Adapters/ConfigToParams.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{textConfigToParams}from"../Adapters/ConfigToParams.js";import{buildTextWrapper}from"../Wrappers/TextWrapperBuilder.js";import{ReactiveFactory}from"../../Abstract/Factories/ReactiveFactory.js";import{FactoryType}from"../../Abstract/Constants/FactoryType.js";function TextFactory(){const factory=ReactiveFactory(FactoryType.Text,buildTextWrapper);return Object.assign(factory,{configToParams:textConfigToParams})}export{TextFactory};
|
|
2
2
|
//# sourceMappingURL=TextFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextFactory.js","sources":["../../../src/Text/Factories/TextFactory.ts"],"sourcesContent":["import type { TReactiveFactory } from '@Anarchy/Engine/Abstract';\nimport { FactoryType, ReactiveFactory } from '@Anarchy/Engine/Abstract';\nimport {
|
|
1
|
+
{"version":3,"file":"TextFactory.js","sources":["../../../src/Text/Factories/TextFactory.ts"],"sourcesContent":["import type { TReactiveFactory } from '@Anarchy/Engine/Abstract';\nimport { FactoryType, ReactiveFactory } from '@Anarchy/Engine/Abstract';\nimport { textConfigToParams } from '@Anarchy/Engine/Text/Adapters';\nimport type { TTextAnyWrapper, TTextFactory, TTextParams, TTextServiceDependencies } from '@Anarchy/Engine/Text/Models';\nimport { buildTextWrapper } from '@Anarchy/Engine/Text/Wrappers';\n\nexport function TextFactory(): TTextFactory {\n const factory: TReactiveFactory<TTextAnyWrapper, TTextParams, TTextServiceDependencies> = ReactiveFactory(FactoryType.Text, buildTextWrapper);\n // eslint-disable-next-line functional/immutable-data\n return Object.assign(factory, { configToParams: textConfigToParams });\n}\n"],"names":["TextFactory","factory","ReactiveFactory","FactoryType","Text","buildTextWrapper","Object","assign","configToParams","textConfigToParams"],"mappings":"wQAMO,SAASA,cACd,MAAMC,QAAoFC,gBAAgBC,YAAYC,KAAMC,kBAE5H,OAAOC,OAAOC,OAAON,QAAS,CAAEO,eAAgBC,oBAClD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getWrapperTypeByTextType}from"./TextWrapperHelper.js";import{FallBackFonts}from"../../packages/anarchy-shared/src/Constants/FallBackFonts.js";import{isNotDefined,isDefined}from"../../packages/anarchy-shared/src/Utils/CheckUtils.js";import{toRem,toPx,stripUnits}from"../../packages/anarchy-shared/src/Utils/CssUtils.js";import{filterOutEmptyFields}from"../../packages/anarchy-shared/src/Utils/ObjectUtils.js";import{CanvasTexture,LinearFilter,SRGBColorSpace,MeshBasicMaterial,PlaneGeometry,Mesh}from"three";import{distinctUntilChanged}from"../../node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js";import{AbstractWrapper}from"../../Abstract/Wrappers/AbstractWrapper.js";import{TextTransformDrive}from"../TransformDrive/TextTransformDrive.js";import{DriveToTargetConnector}from"../../TransformDrive/Entities/Connectors/DriveToTargetConnector.js";import{textEntityToConfig}from"../Adapters/EntityToConfig.js";import{withObject3d}from"../../Mixins/GameObjects/Mixins/WithObject3D.js";import{applyObject3dParams}from"../../Utils/WrapperHelpers.js";function createTextTextureWrapper(params,type,dependencies){let textTranslationService,canvas=document.createElement("canvas"),context=canvas.getContext("2d"),text=params.text??"",textKey=params.textKey;const texture=new CanvasTexture(canvas);texture.minFilter=LinearFilter,texture.magFilter=LinearFilter,texture.generateMipmaps=!1,texture.colorSpace=SRGBColorSpace,texture.needsUpdate=!0;const material=new MeshBasicMaterial({map:texture,transparent:!0}),geometry=new PlaneGeometry,entity=new Mesh(geometry,material);let keyChangeSub$;function subscribeKeyChange(textKey2){if(isNotDefined(textTranslationService))throw new Error(`[TextWrapper]: Translation service is not defined. Wrapper Id: ${wrapper.id}, name: "${wrapper.name}".`);return textTranslationService.translate$(textKey2).pipe(distinctUntilChanged()).subscribe(setTextInternal)}async function setTextInternal(newText){text=newText;const fontSize=toPx(params.cssProps?.fontSize),fontSizeNoUnits=stripUnits(fontSize),fontFamily=params.cssProps?.fontFamily||textTranslationService?.getCurrentLocale()?.font,bg=params.cssProps?.backgroundColor,fg=params.cssProps?.color??"#000000",fontStr=`${fontSize} ${fontFamily??FallBackFonts}`;await document.fonts.ready,await document.fonts.load(fontStr,text),context.font=fontStr;const textMetrics=context.measureText(text),ascent=Math.ceil(textMetrics.actualBoundingBoxAscent??.8*fontSizeNoUnits),descent=Math.ceil(textMetrics.actualBoundingBoxDescent??.25*fontSizeNoUnits),padding=Math.ceil(.2*fontSizeNoUnits),textWidth=Math.ceil(textMetrics.width+2*padding),textHeight=Math.ceil(ascent+descent+2*padding);context.font=fontStr;const prevW=canvas.width,prevH=canvas.height;if(canvas.width=Math.max(1,textWidth),canvas.height=Math.max(1,textHeight),context.font=fontStr,context.textAlign="center",context.textBaseline="middle",bg&&"rgba(0, 0, 0, 0)"!==bg&&"transparent"!==bg?(context.fillStyle=bg,context.fillRect(0,0,canvas.width,canvas.height)):context.clearRect(0,0,canvas.width,canvas.height),context.fillStyle=fg,context.fillText(text,canvas.width/2,canvas.height/2),texture.needsUpdate=!0,canvas.width!==prevW||canvas.height!==prevH){const oldMap=material.map,newMap=new CanvasTexture(canvas);newMap.minFilter=LinearFilter,newMap.magFilter=LinearFilter,newMap.generateMipmaps=!1,newMap.colorSpace=SRGBColorSpace,newMap.needsUpdate=!0,material.map=newMap,material.needsUpdate=!0,oldMap?.dispose();const newGeometryWidth=canvas.width/256,newGeometryHeight=canvas.height/256;entity.geometry.dispose(),entity.geometry=new PlaneGeometry(newGeometryWidth,newGeometryHeight)}else texture.needsUpdate=!0;if(canvas.width!==prevW||canvas.height!==prevH){const newGeometryWidth=canvas.width/256,newGeometryHeight=canvas.height/256;entity.geometry.dispose(),entity.geometry=new PlaneGeometry(newGeometryWidth,newGeometryHeight)}}async function setText(newText){return isDefined(keyChangeSub$)&&keyChangeSub$?.unsubscribe(),isDefined(textKey)&&(textKey=void 0,console.warn(`[TextWrapper]: Text updated, translation disabled. Wrapper Id: ${wrapper.id}, name: "${wrapper.name}".`)),setTextInternal(newText)}const wrapper=AbstractWrapper(entity,getWrapperTypeByTextType(type),params),drive=TextTransformDrive(params,dependencies,wrapper.id),driveToTargetConnector=DriveToTargetConnector(drive,entity),result=Object.assign(wrapper,{type:type,drive:drive,driveToTargetConnector:driveToTargetConnector,setTranslationService:function(translationService){textTranslationService=translationService,isNotDefined(textKey)||""===textKey||(keyChangeSub$=subscribeKeyChange(textKey))},...withObject3d(entity),getElement:()=>canvas,setText:setText,getText:()=>text,setTextKey:function(newTextKey){isDefined(keyChangeSub$)&&keyChangeSub$?.unsubscribe(),textKey=newTextKey,keyChangeSub$=subscribeKeyChange(textKey)},getTextKey:()=>textKey,getPropsAsCss:function(){const match=context.font.match(/(\d+(?:\.\d+)?)(px|pt|em|rem|%)\s+(.+)/)??[];let fontSize=match?.[1]+match?.[2];fontSize=toRem(fontSize);const fontFamily=match?.[3];let color=context.fillStyle.toString();"#000000"===color&&(color=void 0);const[r,g,b,a]=context.getImageData(0,0,1,1).data;let backgroundColor=`rgba(${r}, ${g}, ${b}, ${(a/255).toFixed(3)})`;return 0===r&&0===g&&0===b&&0===a&&(backgroundColor=void 0),filterOutEmptyFields({fontSize:fontSize,fontFamily:fontFamily,color:color,backgroundColor:backgroundColor})},serialize:()=>textEntityToConfig(result)});params.text&&isNotDefined(params.textKey)&&setText(params.text),applyObject3dParams(result,params);const destroySub$=result.destroy$.subscribe(()=>{destroySub$.unsubscribe(),keyChangeSub$?.unsubscribe(),texture.dispose(),context?.clearRect(0,0,canvas.width,canvas.height),canvas?.parentNode&&canvas.parentNode?.removeChild(canvas),canvas=null,context=null});return result}export{createTextTextureWrapper};
|
|
2
2
|
//# sourceMappingURL=TextTextureWrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextTextureWrapper.js","sources":["../../../src/Text/Wrappers/TextTextureWrapper.ts"],"sourcesContent":["import type { TAbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { AbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { withObject3d } from '@Anarchy/Engine/Mixins';\nimport { textToConfig } from '@Anarchy/Engine/Text/Adapters';\nimport type { TextType } from '@Anarchy/Engine/Text/Constants';\nimport type { TTextConfig, TTextCssProps, TTextParams, TTextServiceDependencies, TTextTextureWrapper, TTextTransformDrive, TTextTranslationService } from '@Anarchy/Engine/Text/Models';\nimport { TextTransformDrive } from '@Anarchy/Engine/Text/TransformDrive';\nimport { getWrapperTypeByTextType } from '@Anarchy/Engine/Text/Wrappers/TextWrapperHelper';\nimport type { TDriveToTargetConnector } from '@Anarchy/Engine/TransformDrive';\nimport { DriveToTargetConnector } from '@Anarchy/Engine/TransformDrive';\nimport { applyObject3dParams } from '@Anarchy/Engine/Utils';\nimport { FallBackFonts } from '@Anarchy/Shared/Constants';\nimport { filterOutEmptyFields, isDefined, isNotDefined, stripUnits, toPx, toRem } from '@Anarchy/Shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs';\nimport { CanvasTexture, LinearFilter, Mesh, MeshBasicMaterial, PlaneGeometry, SRGBColorSpace } from 'three';\n\nexport function createTextTextureWrapper(params: TTextParams, type: TextType, dependencies: TTextServiceDependencies): TTextTextureWrapper<Mesh> {\n let canvas: HTMLCanvasElement = document.createElement('canvas');\n let context: CanvasRenderingContext2D = canvas.getContext('2d')!;\n let text: string = params.text ?? '';\n let textKey: string | undefined = params.textKey;\n let textTranslationService: TTextTranslationService | undefined;\n\n const texture: CanvasTexture = new CanvasTexture(canvas);\n // eslint-disable-next-line functional/immutable-data\n texture.minFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n texture.magFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n texture.generateMipmaps = false; // важно для NPOT\n // eslint-disable-next-line functional/immutable-data\n texture.colorSpace = SRGBColorSpace; // если твой UI в sRGB\n // eslint-disable-next-line functional/immutable-data\n texture.needsUpdate = true;\n\n const material: MeshBasicMaterial = new MeshBasicMaterial({\n map: texture,\n transparent: true\n });\n\n const geometry: PlaneGeometry = new PlaneGeometry();\n const entity: Mesh = new Mesh(geometry, material);\n\n let keyChangeSub$: Subscription | undefined;\n\n function subscribeKeyChange(textKey: string): Subscription {\n if (isNotDefined(textTranslationService)) throw new Error(`[TextWrapper]: Translation service is not defined. Wrapper Id: ${wrapper.id}, name: \"${wrapper.name}\".`);\n return textTranslationService.translate$(textKey).pipe(distinctUntilChanged()).subscribe(setTextInternal);\n }\n\n function setTranslationService(translationService: TTextTranslationService): void {\n textTranslationService = translationService;\n if (isNotDefined(textKey) || textKey === '') return;\n keyChangeSub$ = subscribeKeyChange(textKey);\n }\n\n async function setTextInternal(newText: string): Promise<void> {\n text = newText;\n const fontSize: string = toPx(params.cssProps?.fontSize);\n\n const fontSizeNoUnits: number = stripUnits(fontSize);\n const fontFamily: string | undefined = params.cssProps?.fontFamily || textTranslationService?.getCurrentLocale()?.font;\n const bg: string | undefined = params.cssProps?.backgroundColor;\n const fg: string = params.cssProps?.color ?? '#000000';\n\n const fontStr: string = `${fontSize} ${fontFamily ?? FallBackFonts}`;\n\n await document.fonts.ready;\n await document.fonts.load(fontStr, text);\n\n // eslint-disable-next-line functional/immutable-data\n context.font = fontStr;\n\n const textMetrics: TextMetrics = context.measureText(text);\n const ascent: number = Math.ceil(textMetrics.actualBoundingBoxAscent ?? fontSizeNoUnits * 0.8);\n const descent: number = Math.ceil(textMetrics.actualBoundingBoxDescent ?? fontSizeNoUnits * 0.25);\n const padding: number = Math.ceil(fontSizeNoUnits * 0.2);\n const textWidth: number = Math.ceil(textMetrics.width + padding * 2);\n const textHeight: number = Math.ceil(ascent + descent + padding * 2);\n\n // eslint-disable-next-line functional/immutable-data\n context.font = fontStr;\n\n const prevW: number = canvas.width;\n const prevH: number = canvas.height;\n\n // eslint-disable-next-line functional/immutable-data\n canvas.width = Math.max(1, textWidth);\n // eslint-disable-next-line functional/immutable-data\n canvas.height = Math.max(1, textHeight);\n\n // eslint-disable-next-line functional/immutable-data\n context.font = fontStr;\n\n // eslint-disable-next-line functional/immutable-data\n context.textAlign = 'center';\n // eslint-disable-next-line functional/immutable-data\n context.textBaseline = 'middle';\n\n if (bg && bg !== 'rgba(0, 0, 0, 0)' && bg !== 'transparent') {\n // eslint-disable-next-line functional/immutable-data\n context.fillStyle = bg;\n context.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n // eslint-disable-next-line functional/immutable-data\n context.fillStyle = fg;\n context.fillText(text, canvas.width / 2, canvas.height / 2);\n // eslint-disable-next-line functional/immutable-data\n texture.needsUpdate = true;\n\n if (canvas.width !== prevW || canvas.height !== prevH) {\n const oldMap = material.map as CanvasTexture | null;\n const newMap = new CanvasTexture(canvas);\n // eslint-disable-next-line functional/immutable-data\n newMap.minFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n newMap.magFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n newMap.generateMipmaps = false;\n // eslint-disable-next-line functional/immutable-data\n newMap.colorSpace = SRGBColorSpace;\n // eslint-disable-next-line functional/immutable-data\n newMap.needsUpdate = true;\n\n // eslint-disable-next-line functional/immutable-data\n material.map = newMap;\n // eslint-disable-next-line functional/immutable-data\n material.needsUpdate = true;\n oldMap?.dispose();\n\n const newGeometryWidth: number = canvas.width / 256;\n const newGeometryHeight: number = canvas.height / 256;\n\n entity.geometry.dispose();\n // eslint-disable-next-line functional/immutable-data\n entity.geometry = new PlaneGeometry(newGeometryWidth, newGeometryHeight);\n } else {\n // eslint-disable-next-line functional/immutable-data\n texture.needsUpdate = true;\n }\n\n if (canvas.width !== prevW || canvas.height !== prevH) {\n const newGeometryWidth: number = canvas.width / 256;\n const newGeometryHeight: number = canvas.height / 256;\n\n entity.geometry.dispose();\n // eslint-disable-next-line functional/immutable-data\n entity.geometry = new PlaneGeometry(newGeometryWidth, newGeometryHeight);\n }\n }\n\n async function setText(newText: string): Promise<void> {\n if (isDefined(keyChangeSub$)) keyChangeSub$?.unsubscribe();\n if (isDefined(textKey)) {\n textKey = undefined;\n console.warn(`[TextWrapper]: Text updated, translation disabled. Wrapper Id: ${wrapper.id}, name: \"${wrapper.name}\".`);\n }\n\n return setTextInternal(newText);\n }\n\n function setTextKey(newTextKey: string): void {\n if (isDefined(keyChangeSub$)) keyChangeSub$?.unsubscribe();\n textKey = newTextKey;\n keyChangeSub$ = subscribeKeyChange(textKey);\n }\n\n function getPropsAsCss(): Pick<TTextCssProps, 'fontSize' | 'fontFamily' | 'backgroundColor' | 'color'> {\n const font: string = context.font;\n const match = font.match(/(\\d+(?:\\.\\d+)?)(px|pt|em|rem|%)\\s+(.+)/) ?? [];\n let fontSize: string = match?.[1] + match?.[2];\n fontSize = toRem(fontSize);\n const fontFamily: string = match?.[3];\n\n let color: string | undefined = context.fillStyle.toString();\n if (color === '#000000') color = undefined;\n\n const [r, g, b, a] = context.getImageData(0, 0, 1, 1).data;\n let backgroundColor: string | undefined = `rgba(${r}, ${g}, ${b}, ${(a / 255).toFixed(3)})`;\n if (r === 0 && g === 0 && b === 0 && a === 0) backgroundColor = undefined;\n\n return filterOutEmptyFields({\n fontSize,\n fontFamily,\n color,\n backgroundColor\n });\n }\n\n const wrapper: TAbstractWrapper<Mesh> = AbstractWrapper(entity, getWrapperTypeByTextType(type), params);\n const drive: TTextTransformDrive = TextTransformDrive(params, dependencies, wrapper.id);\n const driveToTargetConnector: TDriveToTargetConnector = DriveToTargetConnector(drive, entity);\n\n // eslint-disable-next-line functional/immutable-data\n const result: TTextTextureWrapper<Mesh> = Object.assign(wrapper, {\n type,\n drive,\n driveToTargetConnector,\n setTranslationService,\n ...withObject3d(entity),\n getElement: () => canvas,\n setText,\n getText: (): string => text,\n setTextKey,\n getTextKey: (): string | undefined => textKey,\n getPropsAsCss,\n serialize: (): TTextConfig => textToConfig(result)\n });\n\n if (params.text && isNotDefined(params.textKey)) setText(params.text);\n applyObject3dParams(result, params);\n\n const destroySub$: Subscription = result.destroy$.subscribe((): void => {\n destroySub$.unsubscribe();\n keyChangeSub$?.unsubscribe();\n\n texture.dispose();\n context?.clearRect(0, 0, canvas.width, canvas.height);\n if (canvas?.parentNode) canvas.parentNode?.removeChild(canvas);\n canvas = null as any;\n context = null as any;\n });\n\n return result;\n}\n"],"names":["createTextTextureWrapper","params","type","dependencies","textTranslationService","canvas","document","createElement","context","getContext","text","textKey","texture","CanvasTexture","minFilter","LinearFilter","magFilter","generateMipmaps","colorSpace","SRGBColorSpace","needsUpdate","material","MeshBasicMaterial","map","transparent","geometry","PlaneGeometry","entity","Mesh","keyChangeSub$","subscribeKeyChange","isNotDefined","Error","wrapper","id","name","translate$","pipe","distinctUntilChanged","subscribe","setTextInternal","async","newText","fontSize","toPx","cssProps","fontSizeNoUnits","stripUnits","fontFamily","getCurrentLocale","font","bg","backgroundColor","fg","color","fontStr","FallBackFonts","fonts","ready","load","textMetrics","measureText","ascent","Math","ceil","actualBoundingBoxAscent","descent","actualBoundingBoxDescent","padding","textWidth","width","textHeight","prevW","prevH","height","max","textAlign","textBaseline","fillStyle","fillRect","clearRect","fillText","oldMap","newMap","dispose","newGeometryWidth","newGeometryHeight","setText","isDefined","unsubscribe","console","warn","AbstractWrapper","getWrapperTypeByTextType","drive","TextTransformDrive","driveToTargetConnector","DriveToTargetConnector","result","Object","assign","setTranslationService","translationService","withObject3d","getElement","getText","setTextKey","newTextKey","getTextKey","getPropsAsCss","match","toRem","toString","r","g","b","a","getImageData","data","toFixed","filterOutEmptyFields","serialize","textToConfig","applyObject3dParams","destroySub$","destroy$","parentNode","removeChild"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextTextureWrapper.js","sources":["../../../src/Text/Wrappers/TextTextureWrapper.ts"],"sourcesContent":["import type { TAbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { AbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { withObject3d } from '@Anarchy/Engine/Mixins';\nimport { textEntityToConfig } from '@Anarchy/Engine/Text/Adapters';\nimport type { TextType } from '@Anarchy/Engine/Text/Constants';\nimport type { TTextConfig, TTextCssProps, TTextParams, TTextServiceDependencies, TTextTextureWrapper, TTextTransformDrive, TTextTranslationService } from '@Anarchy/Engine/Text/Models';\nimport { TextTransformDrive } from '@Anarchy/Engine/Text/TransformDrive';\nimport { getWrapperTypeByTextType } from '@Anarchy/Engine/Text/Wrappers/TextWrapperHelper';\nimport type { TDriveToTargetConnector } from '@Anarchy/Engine/TransformDrive';\nimport { DriveToTargetConnector } from '@Anarchy/Engine/TransformDrive';\nimport { applyObject3dParams } from '@Anarchy/Engine/Utils';\nimport { FallBackFonts } from '@Anarchy/Shared/Constants';\nimport { filterOutEmptyFields, isDefined, isNotDefined, stripUnits, toPx, toRem } from '@Anarchy/Shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs';\nimport { CanvasTexture, LinearFilter, Mesh, MeshBasicMaterial, PlaneGeometry, SRGBColorSpace } from 'three';\n\nexport function createTextTextureWrapper(params: TTextParams, type: TextType, dependencies: TTextServiceDependencies): TTextTextureWrapper<Mesh> {\n let canvas: HTMLCanvasElement = document.createElement('canvas');\n let context: CanvasRenderingContext2D = canvas.getContext('2d')!;\n let text: string = params.text ?? '';\n let textKey: string | undefined = params.textKey;\n let textTranslationService: TTextTranslationService | undefined;\n\n const texture: CanvasTexture = new CanvasTexture(canvas);\n // eslint-disable-next-line functional/immutable-data\n texture.minFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n texture.magFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n texture.generateMipmaps = false; // важно для NPOT\n // eslint-disable-next-line functional/immutable-data\n texture.colorSpace = SRGBColorSpace; // если твой UI в sRGB\n // eslint-disable-next-line functional/immutable-data\n texture.needsUpdate = true;\n\n const material: MeshBasicMaterial = new MeshBasicMaterial({\n map: texture,\n transparent: true\n });\n\n const geometry: PlaneGeometry = new PlaneGeometry();\n const entity: Mesh = new Mesh(geometry, material);\n\n let keyChangeSub$: Subscription | undefined;\n\n function subscribeKeyChange(textKey: string): Subscription {\n if (isNotDefined(textTranslationService)) throw new Error(`[TextWrapper]: Translation service is not defined. Wrapper Id: ${wrapper.id}, name: \"${wrapper.name}\".`);\n return textTranslationService.translate$(textKey).pipe(distinctUntilChanged()).subscribe(setTextInternal);\n }\n\n function setTranslationService(translationService: TTextTranslationService): void {\n textTranslationService = translationService;\n if (isNotDefined(textKey) || textKey === '') return;\n keyChangeSub$ = subscribeKeyChange(textKey);\n }\n\n async function setTextInternal(newText: string): Promise<void> {\n text = newText;\n const fontSize: string = toPx(params.cssProps?.fontSize);\n\n const fontSizeNoUnits: number = stripUnits(fontSize);\n const fontFamily: string | undefined = params.cssProps?.fontFamily || textTranslationService?.getCurrentLocale()?.font;\n const bg: string | undefined = params.cssProps?.backgroundColor;\n const fg: string = params.cssProps?.color ?? '#000000';\n\n const fontStr: string = `${fontSize} ${fontFamily ?? FallBackFonts}`;\n\n await document.fonts.ready;\n await document.fonts.load(fontStr, text);\n\n // eslint-disable-next-line functional/immutable-data\n context.font = fontStr;\n\n const textMetrics: TextMetrics = context.measureText(text);\n const ascent: number = Math.ceil(textMetrics.actualBoundingBoxAscent ?? fontSizeNoUnits * 0.8);\n const descent: number = Math.ceil(textMetrics.actualBoundingBoxDescent ?? fontSizeNoUnits * 0.25);\n const padding: number = Math.ceil(fontSizeNoUnits * 0.2);\n const textWidth: number = Math.ceil(textMetrics.width + padding * 2);\n const textHeight: number = Math.ceil(ascent + descent + padding * 2);\n\n // eslint-disable-next-line functional/immutable-data\n context.font = fontStr;\n\n const prevW: number = canvas.width;\n const prevH: number = canvas.height;\n\n // eslint-disable-next-line functional/immutable-data\n canvas.width = Math.max(1, textWidth);\n // eslint-disable-next-line functional/immutable-data\n canvas.height = Math.max(1, textHeight);\n\n // eslint-disable-next-line functional/immutable-data\n context.font = fontStr;\n\n // eslint-disable-next-line functional/immutable-data\n context.textAlign = 'center';\n // eslint-disable-next-line functional/immutable-data\n context.textBaseline = 'middle';\n\n if (bg && bg !== 'rgba(0, 0, 0, 0)' && bg !== 'transparent') {\n // eslint-disable-next-line functional/immutable-data\n context.fillStyle = bg;\n context.fillRect(0, 0, canvas.width, canvas.height);\n } else {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n // eslint-disable-next-line functional/immutable-data\n context.fillStyle = fg;\n context.fillText(text, canvas.width / 2, canvas.height / 2);\n // eslint-disable-next-line functional/immutable-data\n texture.needsUpdate = true;\n\n if (canvas.width !== prevW || canvas.height !== prevH) {\n const oldMap = material.map as CanvasTexture | null;\n const newMap = new CanvasTexture(canvas);\n // eslint-disable-next-line functional/immutable-data\n newMap.minFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n newMap.magFilter = LinearFilter;\n // eslint-disable-next-line functional/immutable-data\n newMap.generateMipmaps = false;\n // eslint-disable-next-line functional/immutable-data\n newMap.colorSpace = SRGBColorSpace;\n // eslint-disable-next-line functional/immutable-data\n newMap.needsUpdate = true;\n\n // eslint-disable-next-line functional/immutable-data\n material.map = newMap;\n // eslint-disable-next-line functional/immutable-data\n material.needsUpdate = true;\n oldMap?.dispose();\n\n const newGeometryWidth: number = canvas.width / 256;\n const newGeometryHeight: number = canvas.height / 256;\n\n entity.geometry.dispose();\n // eslint-disable-next-line functional/immutable-data\n entity.geometry = new PlaneGeometry(newGeometryWidth, newGeometryHeight);\n } else {\n // eslint-disable-next-line functional/immutable-data\n texture.needsUpdate = true;\n }\n\n if (canvas.width !== prevW || canvas.height !== prevH) {\n const newGeometryWidth: number = canvas.width / 256;\n const newGeometryHeight: number = canvas.height / 256;\n\n entity.geometry.dispose();\n // eslint-disable-next-line functional/immutable-data\n entity.geometry = new PlaneGeometry(newGeometryWidth, newGeometryHeight);\n }\n }\n\n async function setText(newText: string): Promise<void> {\n if (isDefined(keyChangeSub$)) keyChangeSub$?.unsubscribe();\n if (isDefined(textKey)) {\n textKey = undefined;\n console.warn(`[TextWrapper]: Text updated, translation disabled. Wrapper Id: ${wrapper.id}, name: \"${wrapper.name}\".`);\n }\n\n return setTextInternal(newText);\n }\n\n function setTextKey(newTextKey: string): void {\n if (isDefined(keyChangeSub$)) keyChangeSub$?.unsubscribe();\n textKey = newTextKey;\n keyChangeSub$ = subscribeKeyChange(textKey);\n }\n\n function getPropsAsCss(): Pick<TTextCssProps, 'fontSize' | 'fontFamily' | 'backgroundColor' | 'color'> {\n const font: string = context.font;\n const match = font.match(/(\\d+(?:\\.\\d+)?)(px|pt|em|rem|%)\\s+(.+)/) ?? [];\n let fontSize: string = match?.[1] + match?.[2];\n fontSize = toRem(fontSize);\n const fontFamily: string = match?.[3];\n\n let color: string | undefined = context.fillStyle.toString();\n if (color === '#000000') color = undefined;\n\n const [r, g, b, a] = context.getImageData(0, 0, 1, 1).data;\n let backgroundColor: string | undefined = `rgba(${r}, ${g}, ${b}, ${(a / 255).toFixed(3)})`;\n if (r === 0 && g === 0 && b === 0 && a === 0) backgroundColor = undefined;\n\n return filterOutEmptyFields({\n fontSize,\n fontFamily,\n color,\n backgroundColor\n });\n }\n\n const wrapper: TAbstractWrapper<Mesh> = AbstractWrapper(entity, getWrapperTypeByTextType(type), params);\n const drive: TTextTransformDrive = TextTransformDrive(params, dependencies, wrapper.id);\n const driveToTargetConnector: TDriveToTargetConnector = DriveToTargetConnector(drive, entity);\n\n // eslint-disable-next-line functional/immutable-data\n const result: TTextTextureWrapper<Mesh> = Object.assign(wrapper, {\n type,\n drive,\n driveToTargetConnector,\n setTranslationService,\n ...withObject3d(entity),\n getElement: () => canvas,\n setText,\n getText: (): string => text,\n setTextKey,\n getTextKey: (): string | undefined => textKey,\n getPropsAsCss,\n serialize: (): TTextConfig => textEntityToConfig(result)\n });\n\n if (params.text && isNotDefined(params.textKey)) setText(params.text);\n applyObject3dParams(result, params);\n\n const destroySub$: Subscription = result.destroy$.subscribe((): void => {\n destroySub$.unsubscribe();\n keyChangeSub$?.unsubscribe();\n\n texture.dispose();\n context?.clearRect(0, 0, canvas.width, canvas.height);\n if (canvas?.parentNode) canvas.parentNode?.removeChild(canvas);\n canvas = null as any;\n context = null as any;\n });\n\n return result;\n}\n"],"names":["createTextTextureWrapper","params","type","dependencies","textTranslationService","canvas","document","createElement","context","getContext","text","textKey","texture","CanvasTexture","minFilter","LinearFilter","magFilter","generateMipmaps","colorSpace","SRGBColorSpace","needsUpdate","material","MeshBasicMaterial","map","transparent","geometry","PlaneGeometry","entity","Mesh","keyChangeSub$","subscribeKeyChange","isNotDefined","Error","wrapper","id","name","translate$","pipe","distinctUntilChanged","subscribe","setTextInternal","async","newText","fontSize","toPx","cssProps","fontSizeNoUnits","stripUnits","fontFamily","getCurrentLocale","font","bg","backgroundColor","fg","color","fontStr","FallBackFonts","fonts","ready","load","textMetrics","measureText","ascent","Math","ceil","actualBoundingBoxAscent","descent","actualBoundingBoxDescent","padding","textWidth","width","textHeight","prevW","prevH","height","max","textAlign","textBaseline","fillStyle","fillRect","clearRect","fillText","oldMap","newMap","dispose","newGeometryWidth","newGeometryHeight","setText","isDefined","unsubscribe","console","warn","AbstractWrapper","getWrapperTypeByTextType","drive","TextTransformDrive","driveToTargetConnector","DriveToTargetConnector","result","Object","assign","setTranslationService","translationService","withObject3d","getElement","getText","setTextKey","newTextKey","getTextKey","getPropsAsCss","match","toRem","toString","r","g","b","a","getImageData","data","toFixed","filterOutEmptyFields","serialize","textEntityToConfig","applyObject3dParams","destroySub$","destroy$","parentNode","removeChild"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCssAccessors}from"./Accessors.js";import{getWrapperTypeByTextType,applyHtmlElementParams}from"./TextWrapperHelper.js";import{isNotDefined,isDefined}from"../../packages/anarchy-shared/src/Utils/CheckUtils.js";import{CSS2DObject}from"three/examples/jsm/renderers/CSS2DRenderer";import{CSS3DObject}from"three/examples/jsm/renderers/CSS3DRenderer";import{TextTransformDrive}from"../TransformDrive/TextTransformDrive.js";import{textEntityToConfig}from"../Adapters/EntityToConfig.js";import{RelatedEntityAttribute}from"../Constants/RelatedEntityAttribute.js";import{applyObject3dParams,applyCenter}from"../../Utils/WrapperHelpers.js";import{distinctUntilChanged}from"../../node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js";import{AbstractWrapper}from"../../Abstract/Wrappers/AbstractWrapper.js";import{DriveToTargetConnector}from"../../TransformDrive/Entities/Connectors/DriveToTargetConnector.js";import{withObject3d}from"../../Mixins/GameObjects/Mixins/WithObject3D.js";import{TextType}from"../Constants/TextType.js";import{TextCssClass}from"../Constants/TextCssClass.js";function createTextWrapper(params,type,dependencies){let element=document.createElement(params.elementType||"div");element.textContent=params.text??"";let textKey=params.textKey;const entity=function(type,element){switch(type){case TextType.Text2d:return new CSS2DObject(element);case TextType.Text3d:return new CSS3DObject(element);default:throw new Error(`TextWrapper. createText: Unknown text type "${type}"`)}}(type,element);let textTranslationService;const wrapper=AbstractWrapper(entity,getWrapperTypeByTextType(type),params),drive=TextTransformDrive(params,dependencies,wrapper.id),driveToTargetConnector=DriveToTargetConnector(drive,entity);let keyChangeSub$;function subscribeKeyChange(textKey2){if(isNotDefined(textTranslationService))throw new Error(`[TextWrapper]: Translation service is not defined. Wrapper Id: ${wrapper.id}, name: "${wrapper.name}".`);return textTranslationService.translate$(textKey2).pipe(distinctUntilChanged()).subscribe(value=>{element.textContent=value})}const result=Object.assign(wrapper,{type:type,drive:drive,driveToTargetConnector:driveToTargetConnector,...getCssAccessors(element),setText:function(text){isDefined(keyChangeSub$)&&keyChangeSub$?.unsubscribe(),isDefined(textKey)&&(textKey=void 0,console.warn(`[TextWrapper]: Text updated, translation disabled. Wrapper Id: ${wrapper.id}, name: "${wrapper.name}".`)),element.textContent=text},setTextKey:function(newTextKey){isDefined(keyChangeSub$)&&keyChangeSub$?.unsubscribe(),textKey=newTextKey,keyChangeSub$=subscribeKeyChange(textKey)},getTextKey:()=>textKey,...withObject3d(entity),getElement:()=>element,setTranslationService:function(translationService){textTranslationService=translationService,isNotDefined(textKey)||""===textKey||(keyChangeSub$=subscribeKeyChange(textKey))},serialize:()=>textEntityToConfig(result)});element.setAttribute(RelatedEntityAttribute,result.id.toString());const destroySub$=result.destroy$.subscribe(()=>{destroySub$.unsubscribe(),keyChangeSub$?.unsubscribe(),element.className="",element.removeAttribute("style"),element?.parentElement&&element?.parentElement.removeChild(element),element?.remove(),element=null,entity.element?.parentNode&&entity.element.remove(),entity.element=null});return document.body.appendChild(element),params.text&&isNotDefined(params.textKey)&&result.setText(params.text),isDefined(params.cssProps)&&applyHtmlElementParams(result,params.cssProps,type===TextType.Text2d?TextCssClass.Text2d:TextCssClass.Text3d),applyObject3dParams(result,params),type===TextType.Text2d&&applyCenter(entity,params.center),result}export{createTextWrapper};
|
|
2
2
|
//# sourceMappingURL=TextWrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextWrapper.js","sources":["../../../src/Text/Wrappers/TextWrapper.ts"],"sourcesContent":["import type { TAbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { AbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { withObject3d } from '@Anarchy/Engine/Mixins';\nimport {
|
|
1
|
+
{"version":3,"file":"TextWrapper.js","sources":["../../../src/Text/Wrappers/TextWrapper.ts"],"sourcesContent":["import type { TAbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { AbstractWrapper } from '@Anarchy/Engine/Abstract';\nimport { withObject3d } from '@Anarchy/Engine/Mixins';\nimport { textEntityToConfig } from '@Anarchy/Engine/Text/Adapters';\nimport { RelatedEntityAttribute, TextCssClass, TextType } from '@Anarchy/Engine/Text/Constants';\nimport type { TTextConfig, TTextParams, TTextServiceDependencies, TTextTransformDrive, TTextTranslationService, TTextWrapper } from '@Anarchy/Engine/Text/Models';\nimport { TextTransformDrive } from '@Anarchy/Engine/Text/TransformDrive';\nimport { getCssAccessors } from '@Anarchy/Engine/Text/Wrappers/Accessors';\nimport { applyHtmlElementParams, getWrapperTypeByTextType } from '@Anarchy/Engine/Text/Wrappers/TextWrapperHelper';\nimport type { TDriveToTargetConnector } from '@Anarchy/Engine/TransformDrive';\nimport { DriveToTargetConnector } from '@Anarchy/Engine/TransformDrive';\nimport { applyCenter, applyObject3dParams } from '@Anarchy/Engine/Utils';\nimport { isDefined, isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer';\nimport { CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer';\n\nexport function createTextWrapper<T extends CSS2DObject | CSS3DObject>(params: TTextParams, type: TextType, dependencies: TTextServiceDependencies): TTextWrapper<T> {\n let element: HTMLElement = document.createElement(params.elementType || 'div');\n // eslint-disable-next-line functional/immutable-data\n element.textContent = params.text ?? '';\n let textKey: string | undefined = params.textKey;\n const entity: T = createText(type, element) as T;\n let textTranslationService: TTextTranslationService | undefined;\n\n const wrapper: TAbstractWrapper<T> = AbstractWrapper(entity, getWrapperTypeByTextType(type), params);\n const drive: TTextTransformDrive = TextTransformDrive(params, dependencies, wrapper.id);\n const driveToTargetConnector: TDriveToTargetConnector = DriveToTargetConnector(drive, entity);\n\n let keyChangeSub$: Subscription | undefined;\n\n function subscribeKeyChange(textKey: string): Subscription {\n if (isNotDefined(textTranslationService)) throw new Error(`[TextWrapper]: Translation service is not defined. Wrapper Id: ${wrapper.id}, name: \"${wrapper.name}\".`);\n return (\n textTranslationService\n .translate$(textKey)\n .pipe(distinctUntilChanged())\n // eslint-disable-next-line functional/immutable-data\n .subscribe((value: string): void => void (element.textContent = value))\n );\n }\n\n function setTranslationService(translationService: TTextTranslationService): void {\n textTranslationService = translationService;\n if (isNotDefined(textKey) || textKey === '') return;\n keyChangeSub$ = subscribeKeyChange(textKey);\n }\n\n function setText(text: string): void {\n if (isDefined(keyChangeSub$)) keyChangeSub$?.unsubscribe();\n if (isDefined(textKey)) {\n textKey = undefined;\n console.warn(`[TextWrapper]: Text updated, translation disabled. Wrapper Id: ${wrapper.id}, name: \"${wrapper.name}\".`);\n }\n\n // eslint-disable-next-line functional/immutable-data\n element.textContent = text;\n }\n\n function setTextKey(newTextKey: string): void {\n if (isDefined(keyChangeSub$)) keyChangeSub$?.unsubscribe();\n textKey = newTextKey;\n keyChangeSub$ = subscribeKeyChange(textKey);\n }\n\n // eslint-disable-next-line functional/immutable-data\n const result: TTextWrapper<T> = Object.assign(wrapper, {\n type,\n drive,\n driveToTargetConnector,\n ...getCssAccessors(element),\n setText,\n setTextKey,\n getTextKey: (): string | undefined => textKey,\n ...withObject3d(entity),\n getElement: (): HTMLElement => element,\n setTranslationService,\n serialize: (): TTextConfig => textEntityToConfig(result)\n });\n\n element.setAttribute(RelatedEntityAttribute, result.id.toString());\n\n const destroySub$: Subscription = result.destroy$.subscribe((): void => {\n destroySub$.unsubscribe();\n keyChangeSub$?.unsubscribe();\n\n // eslint-disable-next-line functional/immutable-data\n element.className = '';\n element.removeAttribute('style');\n if (element?.parentElement) element?.parentElement.removeChild(element);\n element?.remove();\n element = null as any;\n\n if (entity.element?.parentNode) entity.element.remove();\n // eslint-disable-next-line functional/immutable-data\n entity.element = null as any;\n });\n\n document.body.appendChild(element);\n\n if (params.text && isNotDefined(params.textKey)) result.setText(params.text);\n if (isDefined(params.cssProps)) applyHtmlElementParams(result, params.cssProps, type === TextType.Text2d ? TextCssClass.Text2d : TextCssClass.Text3d);\n applyObject3dParams(result, params);\n if (type === TextType.Text2d) applyCenter(entity as CSS2DObject, params.center);\n\n return result;\n}\n\nfunction createText(type: TextType, element: HTMLElement): CSS2DObject | CSS3DObject | never {\n switch (type) {\n case TextType.Text2d:\n return new CSS2DObject(element);\n case TextType.Text3d:\n return new CSS3DObject(element);\n default:\n throw new Error(`TextWrapper. createText: Unknown text type \"${type}\"`);\n }\n}\n"],"names":["createTextWrapper","params","type","dependencies","element","document","createElement","elementType","textContent","text","textKey","entity","TextType","Text2d","CSS2DObject","Text3d","CSS3DObject","Error","createText","textTranslationService","wrapper","AbstractWrapper","getWrapperTypeByTextType","drive","TextTransformDrive","id","driveToTargetConnector","DriveToTargetConnector","keyChangeSub$","subscribeKeyChange","isNotDefined","name","translate$","pipe","distinctUntilChanged","subscribe","value","result","Object","assign","getCssAccessors","setText","isDefined","unsubscribe","console","warn","setTextKey","newTextKey","getTextKey","withObject3d","getElement","setTranslationService","translationService","serialize","textEntityToConfig","setAttribute","RelatedEntityAttribute","toString","destroySub$","destroy$","className","removeAttribute","parentElement","removeChild","remove","parentNode","body","appendChild","cssProps","TextCssClass","applyObject3dParams","applyCenter","center"],"mappings":"4kCAkBO,SAASA,kBAAuDC,OAAqBC,KAAgBC,cAC1G,IAAIC,QAAuBC,SAASC,cAAcL,OAAOM,aAAe,OAExEH,QAAQI,YAAcP,OAAOQ,MAAQ,GACrC,IAAIC,QAA8BT,OAAOS,QACzC,MAAMC,OAsFR,SAAoBT,KAAgBE,SAClC,OAAQF,MACN,KAAKU,SAASC,OACZ,OAAO,IAAIC,YAAYV,SACzB,KAAKQ,SAASG,OACZ,OAAO,IAAIC,YAAYZ,SACzB,QACE,MAAM,IAAIa,MAAM,+CAA+Cf,SAErE,CA/FoBgB,CAAWhB,KAAME,SACnC,IAAIe,uBAEJ,MAAMC,QAA+BC,gBAAgBV,OAAQW,yBAAyBpB,MAAOD,QACvFsB,MAA6BC,mBAAmBvB,OAAQE,aAAciB,QAAQK,IAC9EC,uBAAkDC,uBAAuBJ,MAAOZ,QAEtF,IAAIiB,cAEJ,SAASC,mBAAmBnB,UAC1B,GAAIoB,aAAaX,wBAAyB,MAAM,IAAIF,MAAM,kEAAkEG,QAAQK,cAAcL,QAAQW,UAC1J,OACEZ,uBACGa,WAAWtB,UACXuB,KAAKC,wBAELC,UAAWC,QAA8BhC,QAAQI,YAAc4B,OAEtE,CA0BA,MAAMC,OAA0BC,OAAOC,OAAOnB,QAAS,CACrDlB,UACAqB,YACAG,iDACGc,gBAAgBpC,SACnBqC,QAvBF,SAAiBhC,MACXiC,UAAUd,gBAAgBA,eAAee,cACzCD,UAAUhC,WACZA,aAAU,EACVkC,QAAQC,KAAK,kEAAkEzB,QAAQK,cAAcL,QAAQW,WAI/G3B,QAAQI,YAAcC,IACxB,EAeEqC,WAbF,SAAoBC,YACdL,UAAUd,gBAAgBA,eAAee,cAC7CjC,QAAUqC,WACVnB,cAAgBC,mBAAmBnB,QACrC,EAUEsC,WAAY,IAA0BtC,WACnCuC,aAAatC,QAChBuC,WAAY,IAAmB9C,QAC/B+C,sBAlCF,SAA+BC,oBAC7BjC,uBAAyBiC,mBACrBtB,aAAapB,UAAwB,KAAZA,UAC7BkB,cAAgBC,mBAAmBnB,SACrC,EA+BE2C,UAAW,IAAmBC,mBAAmBjB,UAGnDjC,QAAQmD,aAAaC,uBAAwBnB,OAAOZ,GAAGgC,YAEvD,MAAMC,YAA4BrB,OAAOsB,SAASxB,UAAU,KAC1DuB,YAAYf,cACZf,eAAee,cAGfvC,QAAQwD,UAAY,GACpBxD,QAAQyD,gBAAgB,SACpBzD,SAAS0D,eAAe1D,SAAS0D,cAAcC,YAAY3D,SAC/DA,SAAS4D,SACT5D,QAAU,KAENO,OAAOP,SAAS6D,YAAYtD,OAAOP,QAAQ4D,SAE/CrD,OAAOP,QAAU,OAUnB,OAPAC,SAAS6D,KAAKC,YAAY/D,SAEtBH,OAAOQ,MAAQqB,aAAa7B,OAAOS,UAAU2B,OAAOI,QAAQxC,OAAOQ,MACnEiC,UAAUzC,OAAOmE,kCAAkC/B,OAAQpC,OAAOmE,SAAUlE,OAASU,SAASC,OAASwD,aAAaxD,OAASwD,aAAatD,QAC9IuD,oBAAoBjC,OAAQpC,QACxBC,OAASU,SAASC,QAAQ0D,YAAY5D,OAAuBV,OAAOuE,QAEjEnC,MACT"}
|
package/dist/Text/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { TObject3DParams, TObject3DPropConfig } from '../Models';
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function object3dConfigToParams(config: Partial<TObject3DPropConfig>): TObject3DParams;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{isDefined}from"../../packages/anarchy-shared/src/Utils/CheckUtils.js";import{Vector3,Euler}from"three";function
|
|
1
|
+
import{isDefined}from"../../packages/anarchy-shared/src/Utils/CheckUtils.js";import{Vector3,Euler}from"three";function object3dConfigToParams(config){const{position:position,rotation:rotation,scale:scale}=config;return{...{...config},position:isDefined(position)?new Vector3(position.x,position.y,position.z):new Vector3,rotation:isDefined(rotation)?new Euler(rotation.x,rotation.y,rotation.z):new Euler,scale:isDefined(scale)?new Vector3(scale.x,scale.y,scale.z):new Vector3(1,1,1)}}export{object3dConfigToParams};
|
|
2
2
|
//# sourceMappingURL=Object3dUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Object3dUtils.js","sources":["../../../src/ThreeLib/Utils/Object3dUtils.ts"],"sourcesContent":["import type { TObject3DParams, TObject3DPropConfig } from '@Anarchy/Engine/ThreeLib/Models';\nimport { isDefined } from '@Anarchy/Shared/Utils';\nimport { Euler, Vector3 } from 'three';\n\nexport function
|
|
1
|
+
{"version":3,"file":"Object3dUtils.js","sources":["../../../src/ThreeLib/Utils/Object3dUtils.ts"],"sourcesContent":["import type { TObject3DParams, TObject3DPropConfig } from '@Anarchy/Engine/ThreeLib/Models';\nimport { isDefined } from '@Anarchy/Shared/Utils';\nimport { Euler, Vector3 } from 'three';\n\nexport function object3dConfigToParams(config: Partial<TObject3DPropConfig>): TObject3DParams {\n const { position, rotation, scale } = config;\n const result = { ...config } as TObject3DParams;\n\n return {\n ...result,\n position: isDefined(position) ? new Vector3(position.x, position.y, position.z) : new Vector3(),\n rotation: isDefined(rotation) ? new Euler(rotation.x, rotation.y, rotation.z) : new Euler(),\n scale: isDefined(scale) ? new Vector3(scale.x, scale.y, scale.z) : new Vector3(1, 1, 1)\n };\n}\n"],"names":["object3dConfigToParams","config","position","rotation","scale","isDefined","Vector3","x","y","z","Euler"],"mappings":"8GAIO,SAASA,uBAAuBC,QACrC,MAAMC,SAAEA,SAAAC,SAAUA,SAAAC,MAAUA,OAAUH,OAGtC,MAAO,IAFQ,IAAKA,QAIlBC,SAAUG,UAAUH,UAAY,IAAII,QAAQJ,SAASK,EAAGL,SAASM,EAAGN,SAASO,GAAK,IAAIH,QACtFH,SAAUE,UAAUF,UAAY,IAAIO,MAAMP,SAASI,EAAGJ,SAASK,EAAGL,SAASM,GAAK,IAAIC,MACpFN,MAAOC,UAAUD,OAAS,IAAIE,QAAQF,MAAMG,EAAGH,MAAMI,EAAGJ,MAAMK,GAAK,IAAIH,QAAQ,EAAG,EAAG,GAEzF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{isInstant,rotateInstantly,moveInstantly,isRotationReached,getStepRotation,isPointReached}from"../../Utils/KinematicAgentUtils.js";import{isDefined,isNotDefined}from"../../../packages/anarchy-shared/src/Utils/CheckUtils.js";import{Object3D,Vector3,Quaternion}from"three";import{AbstractTransformAgent}from"./AbstractTransformAgent.js";import{BehaviorSubject}from"../../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js";import{DefaultIsAutoUpdate,DefaultKinematicTarget,DefaultKinematicState}from"../../../Kinematic/Constants/KinematicConstants.js";import{
|
|
1
|
+
import{isInstant,rotateInstantly,moveInstantly,isRotationReached,getStepRotation,isPointReached}from"../../Utils/KinematicAgentUtils.js";import{isDefined,isNotDefined}from"../../../packages/anarchy-shared/src/Utils/CheckUtils.js";import{Object3D,Vector3,Quaternion}from"three";import{AbstractTransformAgent}from"./AbstractTransformAgent.js";import{BehaviorSubject}from"../../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js";import{DefaultIsAutoUpdate,DefaultKinematicTarget,DefaultKinematicState}from"../../../Kinematic/Constants/KinematicConstants.js";import{kinematicEntityToConfig}from"../../../Kinematic/Adapters/EntityToConfig.js";import{getAzimuthElevationFromVector,getElevationFromDirection}from"../../../Math/Utils/AnglesUtils.js";import{combineLatest}from"../../../node_modules/rxjs/dist/esm5/internal/observable/combineLatest.js";import{switchMap}from"../../../node_modules/rxjs/dist/esm5/internal/operators/switchMap.js";import{EMPTY}from"../../../node_modules/rxjs/dist/esm5/internal/observable/empty.js";import{TransformAgent}from"../../Constants/TransformAgent.js";import{metersPerSecond}from"../../../Distance/Utils/DistanceUtils.js";import{ForwardAxis}from"../../../Kinematic/Constants/ForwardAxis.js";function KinematicTransformAgent(params,{kinematicLoop:kinematicLoop}){const autoUpdate$=new BehaviorSubject(params.isAutoUpdate??DefaultIsAutoUpdate),abstractTransformAgent=AbstractTransformAgent(params,TransformAgent.Kinematic);let kinematicSub$,tempObject=new Object3D,linearDirection=new Vector3,displacement=new Vector3;const destroySub$=abstractTransformAgent.destroy$.subscribe(()=>{destroySub$.unsubscribe(),kinematicSub$?.unsubscribe(),abstractTransformAgent.destroy$.next(),tempObject.parent?.remove(tempObject),tempObject=null,linearDirection=null,displacement=null}),agent=Object.assign(abstractTransformAgent,{data:{state:{linearSpeed:params.state.linearSpeed??DefaultKinematicState.linearSpeed,linearDirection:params.state.linearDirection?.clone()??DefaultKinematicState.linearDirection,angularSpeed:params.state.angularSpeed??DefaultKinematicState.angularSpeed,radius:params.state.radius??DefaultKinematicState.radius,angularDirection:params.state.angularDirection?.clone()??DefaultKinematicState.angularDirection,forwardAxis:params.state.forwardAxis??DefaultKinematicState.forwardAxis,isInfiniteRotation:params.state.isInfiniteRotation??DefaultKinematicState.isInfiniteRotation},target:{positionThreshold:params.target?.positionThreshold??DefaultKinematicTarget.positionThreshold,position:params.target?.position?.clone()??DefaultKinematicTarget.position,rotationThreshold:params.target?.rotationThreshold??DefaultKinematicTarget.rotationThreshold,rotation:params.target?.rotation?.clone()??DefaultKinematicTarget.rotation}},setData({state:state,target:target}){const{linearSpeed:linearSpeed,linearDirection:linearDirection2,angularSpeed:angularSpeed,angularDirection:angularDirection,forwardAxis:forwardAxis,isInfiniteRotation:isInfiniteRotation}=state,{positionThreshold:positionThreshold,position:position,rotationThreshold:rotationThreshold,rotation:rotation}=target??{};agent.data.state.linearSpeed=linearSpeed,agent.data.state.linearDirection.copy(linearDirection2),agent.data.state.angularSpeed=angularSpeed,agent.data.state.angularDirection.copy(angularDirection),agent.data.state.forwardAxis=forwardAxis,agent.data.state.isInfiniteRotation=isInfiniteRotation,isNotDefined(target)||(isDefined(positionThreshold)&&(agent.data.target.positionThreshold=positionThreshold),agent.data.target.position=position,isDefined(rotationThreshold)&&(agent.data.target.rotationThreshold=rotationThreshold),agent.data.target.rotation=rotation)},getData:()=>agent.data,getRadius:()=>agent.data.state.radius,setRadius(radius){agent.data.state.radius=radius},getForwardAxis:()=>agent.data.state.forwardAxis,setForwardAxis(axis){agent.data.state.forwardAxis=axis},moveTo(targetPosition,speed){if(isInstant(speed))return moveInstantly(agent,targetPosition);if(speed<0)throw new Error("[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.");return 0===speed?agent.setLinearSpeed(0):(agent.data.target.position=targetPosition.clone(),targetPosition.equals(abstractTransformAgent.position$.value)?agent.setLinearSpeed(0):(agent.setLinearDirection(targetPosition.clone().sub(abstractTransformAgent.position$.value).normalize()),void agent.setLinearSpeed(speed)))},lookAt(targetPosition,speed){tempObject.position.copy(abstractTransformAgent.position$.value),tempObject.up.set(0,1,0),tempObject.lookAt(targetPosition);const targetRotation=tempObject.quaternion.clone().normalize();return agent.rotateTo(targetRotation,speed)},rotateTo(targetRotation,speed,infinite=!1){if(isInstant(speed))return rotateInstantly(agent,targetRotation);if(speed<0)throw new Error("[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.");if(0===speed)return agent.setAngularSpeed(0);if(0===agent.data.state.radius)throw new Error("[KinematicTransformAgent]: Radius must be greater than 0 to calculate angular speed.");const angularSpeed=speed/agent.data.state.radius;agent.data.target.rotation=targetRotation.clone().normalize(),agent.data.state.isInfiniteRotation=infinite,agent.setAngularSpeed(angularSpeed)},getLinearSpeed:()=>agent.data.state.linearSpeed,setLinearSpeed(speed){agent.data.state.linearSpeed=speed},getLinearDirection:()=>agent.data.state.linearDirection,setLinearDirection(direction){agent.data.state.linearDirection.copy(direction)},getLinearAzimuth:()=>getAzimuthElevationFromVector(agent.data.state.linearDirection,agent.data.state.forwardAxis).azimuth,setLinearAzimuth(azimuthRad){isDefined(agent.data.target?.position)&&(agent.data.target.position=void 0);const{forwardAxis:forwardAxis}=agent.data.state,currentDir=agent.data.state.linearDirection.clone(),{elevation:elevation}=getAzimuthElevationFromVector(currentDir,forwardAxis),totalLength=currentDir.length()||1;let newX,newZ;const horizontalScale=Math.cos(elevation)*totalLength;if(forwardAxis===ForwardAxis.Z)newX=Math.sin(azimuthRad)*horizontalScale,newZ=Math.cos(azimuthRad)*horizontalScale;else{if(forwardAxis!==ForwardAxis.X)throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);newX=Math.cos(azimuthRad)*horizontalScale,newZ=Math.sin(azimuthRad)*horizontalScale}const newY=Math.sin(elevation)*totalLength;agent.data.state.linearDirection.set(newX,newY,newZ).normalize()},getLinearElevation:()=>getElevationFromDirection(agent.data.state.linearDirection),setLinearElevation(elevationRad){isDefined(agent.data.target?.position)&&(agent.data.target.position=void 0);const{forwardAxis:forwardAxis}=agent.data.state,currentDir=agent.data.state.linearDirection.clone(),{azimuth:azimuth}=getAzimuthElevationFromVector(currentDir,forwardAxis),totalLength=currentDir.length()||1,horizontalScale=Math.cos(elevationRad)*totalLength;let newX,newZ;if(forwardAxis===ForwardAxis.Z)newX=Math.sin(azimuth)*horizontalScale,newZ=Math.cos(azimuth)*horizontalScale;else{if(!ForwardAxis.X)throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);newX=Math.cos(azimuth)*horizontalScale,newZ=Math.sin(azimuth)*horizontalScale}const newY=Math.sin(elevationRad)*totalLength;agent.data.state.linearDirection.set(newX,newY,newZ).normalize()},resetLinear(resetSpeed,resetDirection){resetSpeed&&agent.setLinearSpeed(0),resetDirection&&agent.setLinearDirection(new Vector3)},getAngularSpeed:()=>agent.data.state.angularSpeed,getAngularSpeedMps(){if(agent.data.state.radius<=0)throw new Error("Radius must be set and be greater than 0 to calculate angular speed.");return metersPerSecond(agent.data.state.angularSpeed*agent.data.state.radius)},setAngularSpeed(speed){agent.data.state.angularSpeed=speed},setAngularSpeedMps(speed){if(agent.data.state.radius<=0)throw new Error("Radius must be set and be greater than 0 to calculate angular speed.");agent.setAngularSpeed(speed/agent.data.state.radius)},getAngularDirection:()=>agent.data.state.angularDirection.clone(),setAngularDirection(direction){agent.data.state.angularDirection.copy(direction)},resetAngular(resetSpeed,resetDirection){resetSpeed&&agent.setAngularSpeed(0),resetDirection&&agent.setAngularDirection(new Quaternion)},serialize:()=>kinematicEntityToConfig(agent),autoUpdate$:autoUpdate$});return kinematicSub$=combineLatest([agent.enabled$,agent.autoUpdate$]).pipe(switchMap(([isEnabled,isAutoUpdate])=>isEnabled&&isAutoUpdate?kinematicLoop.tick$:EMPTY)).subscribe(delta=>{!function(delta){if(agent.data.state.angularSpeed<=0)return;const rotationStep=agent.data.state.angularSpeed*(delta>0?delta:1);if(!agent.data.state.isInfiniteRotation&&isRotationReached(agent.data.target,agent.rotation$.value,agent.data.state))return;const stepRotation=getStepRotation(agent,rotationStep,agent.data.state.isInfiniteRotation);isNotDefined(stepRotation)||(agent.data.state.angularDirection.multiply(stepRotation).normalize(),agent.rotation$.next(agent.data.state.angularDirection))}(delta),function(delta){if(agent.data.state.linearSpeed<=0)return;if(isPointReached(agent.data.target,abstractTransformAgent.position$.value,agent.data.state))return;const safeDelta=delta>0?delta:1;linearDirection.copy(agent.data.state.linearDirection).normalize(),displacement.copy(linearDirection).multiplyScalar(agent.data.state.linearSpeed*safeDelta),abstractTransformAgent.position$.next(abstractTransformAgent.position$.value.clone().add(displacement))}(delta)}),agent}export{KinematicTransformAgent};
|
|
2
2
|
//# sourceMappingURL=KinematicTransformAgent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KinematicTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/KinematicTransformAgent.ts"],"sourcesContent":["import { metersPerSecond } from '@Anarchy/Engine/Distance';\nimport { DefaultIsAutoUpdate, DefaultKinematicState, DefaultKinematicTarget, kinematicToConfig } from '@Anarchy/Engine/Kinematic';\nimport { ForwardAxis } from '@Anarchy/Engine/Kinematic/Constants';\nimport type { TKinematicConfig, TKinematicData, TKinematicWritableData } from '@Anarchy/Engine/Kinematic/Models';\nimport type { TMeters, TMetersPerSecond, TMilliseconds, TRadians, TRadiansPerSecond } from '@Anarchy/Engine/Math';\nimport { getAzimuthElevationFromVector, getElevationFromDirection } from '@Anarchy/Engine/Math';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent, TKinematicAgentDependencies, TKinematicSpeed, TKinematicTransformAgent, TKinematicTransformAgentParams } from '@Anarchy/Engine/TransformDrive/Models';\nimport { getStepRotation, isInstant, isPointReached, isRotationReached, moveInstantly, rotateInstantly } from '@Anarchy/Engine/TransformDrive/Utils/KinematicAgentUtils';\nimport { isDefined, isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, combineLatest, EMPTY, switchMap } from 'rxjs';\nimport type { QuaternionLike, Vector3Like } from 'three';\nimport { Object3D, Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\nexport function KinematicTransformAgent(params: TKinematicTransformAgentParams, { kinematicLoop }: TKinematicAgentDependencies): TKinematicTransformAgent {\n const autoUpdate$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(params.isAutoUpdate ?? DefaultIsAutoUpdate);\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Kinematic);\n\n let kinematicSub$: Subscription | undefined = undefined;\n\n let tempObject: Object3D = new Object3D();\n let linearDirection: Vector3 = new Vector3();\n let displacement: Vector3 = new Vector3();\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n kinematicSub$?.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n\n tempObject.parent?.remove(tempObject);\n tempObject = null as any;\n linearDirection = null as any;\n displacement = null as any;\n });\n\n // eslint-disable-next-line functional/immutable-data\n const agent: Omit<TKinematicTransformAgent, 'data'> & Readonly<{ data: TKinematicWritableData }> = Object.assign(abstractTransformAgent, {\n data: {\n state: {\n linearSpeed: params.state.linearSpeed ?? DefaultKinematicState.linearSpeed,\n linearDirection: params.state.linearDirection?.clone() ?? DefaultKinematicState.linearDirection,\n angularSpeed: params.state.angularSpeed ?? DefaultKinematicState.angularSpeed,\n radius: params.state.radius ?? DefaultKinematicState.radius,\n angularDirection: params.state.angularDirection?.clone() ?? DefaultKinematicState.angularDirection,\n forwardAxis: params.state.forwardAxis ?? DefaultKinematicState.forwardAxis,\n isInfiniteRotation: params.state.isInfiniteRotation ?? DefaultKinematicState.isInfiniteRotation\n },\n target: {\n positionThreshold: params.target?.positionThreshold ?? DefaultKinematicTarget.positionThreshold,\n position: params.target?.position?.clone() ?? DefaultKinematicTarget.position,\n rotationThreshold: params.target?.rotationThreshold ?? DefaultKinematicTarget.rotationThreshold,\n rotation: params.target?.rotation?.clone() ?? DefaultKinematicTarget.rotation\n }\n },\n setData({ state, target }: TKinematicData): void {\n const { linearSpeed, linearDirection, angularSpeed, angularDirection, forwardAxis, isInfiniteRotation } = state;\n const { positionThreshold, position, rotationThreshold, rotation } = target ?? {};\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = linearSpeed;\n\n agent.data.state.linearDirection.copy(linearDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = angularSpeed;\n\n agent.data.state.angularDirection.copy(angularDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = forwardAxis;\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = isInfiniteRotation;\n\n if (isNotDefined(target)) return;\n\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(positionThreshold)) agent.data.target.positionThreshold = positionThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = position;\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(rotationThreshold)) agent.data.target.rotationThreshold = rotationThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = rotation;\n },\n getData(): TKinematicData {\n return agent.data;\n },\n getRadius(): TMeters {\n return agent.data.state.radius;\n },\n setRadius(radius: TMeters): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.radius = radius;\n },\n getForwardAxis(): ForwardAxis {\n return agent.data.state.forwardAxis;\n },\n setForwardAxis(axis: ForwardAxis): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = axis;\n },\n moveTo(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n if (isInstant(speed)) return moveInstantly(agent, targetPosition);\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setLinearSpeed(0);\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = targetPosition.clone();\n\n // If the agent is already at the target, do not move\n if (targetPosition.equals(abstractTransformAgent.position$.value)) return agent.setLinearSpeed(0);\n\n agent.setLinearDirection(targetPosition.clone().sub(abstractTransformAgent.position$.value).normalize());\n agent.setLinearSpeed(speed);\n return undefined;\n },\n // Rotates agent to \"look\" at the target position (e.g., mouse click position or any other actor, etc.)\n lookAt(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n tempObject.position.copy(abstractTransformAgent.position$.value);\n tempObject.up.set(0, 1, 0);\n tempObject.lookAt(targetPosition as Vector3);\n const targetRotation: Quaternion = tempObject.quaternion.clone().normalize();\n\n return agent.rotateTo(targetRotation, speed);\n },\n // Rotates agent as provided Quaternion (useful when you want to rotate as someone else already rotated)\n rotateTo(targetRotation: TReadonlyQuaternion, speed: TKinematicSpeed, infinite: boolean = false): void | never {\n if (isInstant(speed)) return rotateInstantly(agent, targetRotation);\n\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setAngularSpeed(0);\n if (agent.data.state.radius === 0) throw new Error('[KinematicTransformAgent]: Radius must be greater than 0 to calculate angular speed.');\n const angularSpeed: TRadiansPerSecond = (speed / agent.data.state.radius) as TRadiansPerSecond;\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = targetRotation.clone().normalize();\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = infinite;\n\n agent.setAngularSpeed(angularSpeed);\n return undefined;\n },\n getLinearSpeed(): TMetersPerSecond {\n return agent.data.state.linearSpeed;\n },\n setLinearSpeed(speed: TMetersPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = speed;\n },\n getLinearDirection(): Vector3 {\n return agent.data.state.linearDirection;\n },\n setLinearDirection(direction: Vector3Like): void {\n agent.data.state.linearDirection.copy(direction);\n },\n getLinearAzimuth(): TRadians {\n return getAzimuthElevationFromVector(agent.data.state.linearDirection, agent.data.state.forwardAxis).azimuth;\n },\n setLinearAzimuth(azimuthRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir: Vector3 = agent.data.state.linearDirection.clone();\n\n const { elevation } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n let newX: number, newZ: number;\n const horizontalScale: number = Math.cos(elevation) * totalLength;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuthRad) * horizontalScale;\n newZ = Math.cos(azimuthRad) * horizontalScale;\n } else if (forwardAxis === ForwardAxis.X) {\n newX = Math.cos(azimuthRad) * horizontalScale;\n newZ = Math.sin(azimuthRad) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevation) * totalLength;\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const currentY = current.y;\n // const horizontalMag = Math.sqrt(current.x * current.x + current.z * current.z);\n // let newX: number, newZ: number;\n // if (agent.data.state.forwardAxis === 'Z') {\n // newX = Math.sin(azimuthRad) * horizontalMag;\n // newZ = Math.cos(azimuthRad) * horizontalMag;\n // } else {\n // // forwardAxis === 'X'\n // newX = Math.cos(azimuthRad) * horizontalMag;\n // newZ = Math.sin(azimuthRad) * horizontalMag;\n // }\n // agent.data.state.linearDirection.set(newX, currentY, newZ);\n // // agent.data.state.linearDirection.normalize();\n },\n getLinearElevation(): TRadians {\n return getElevationFromDirection(agent.data.state.linearDirection);\n },\n setLinearElevation(elevationRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir = agent.data.state.linearDirection.clone();\n\n const { azimuth } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n const horizontalScale: number = Math.cos(elevationRad) * totalLength;\n let newX: number, newZ: number;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuth) * horizontalScale;\n newZ = Math.cos(azimuth) * horizontalScale;\n } else if (ForwardAxis.X) {\n newX = Math.cos(azimuth) * horizontalScale;\n newZ = Math.sin(azimuth) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevationRad) * totalLength;\n\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const horizontal = new Vector3(current.x, 0, current.z);\n // const h = horizontal.length();\n //\n // let horizontalDir: Vector3;\n // if (h > 1e-6) {\n // horizontalDir = horizontal.clone().normalize();\n // } else {\n // horizontalDir = agent.data.state.forwardAxis === 'Z' ? new Vector3(0, 0, 1) : new Vector3(1, 0, 0);\n // }\n //\n // // Approach 1 (absolute): Set the vector as in spherical coordinates with the given elevation.\n // // horizontal component will be cos(elevation), and vertical sin(elevation).\n // const newHorizontalMag = Math.cos(elevationRad);\n // const newHorizontal = horizontalDir.multiplyScalar(newHorizontalMag);\n // const newY = Math.sin(elevationRad);\n // agent.data.state.linearDirection.set(newHorizontal.x, newY, newHorizontal.z);\n //\n // // Approach 2 (additive): If you want to \"add\" vertical movement\n // // const newY = current.y + Math.tan(elevationRad) * h;\n // // agent.data.state.linearDirection.set(current.x, newY, current.z);\n // // agent.data.state.linearDirection.normalize();\n },\n resetLinear(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setLinearSpeed(0);\n if (resetDirection) agent.setLinearDirection(new Vector3());\n },\n getAngularSpeed(): TRadiansPerSecond {\n return agent.data.state.angularSpeed;\n },\n getAngularSpeedMps(): TMetersPerSecond | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n return metersPerSecond(agent.data.state.angularSpeed * agent.data.state.radius);\n },\n setAngularSpeed(speed: TRadiansPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = speed;\n },\n setAngularSpeedMps(speed: TMetersPerSecond): void | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n agent.setAngularSpeed((speed / agent.data.state.radius) as TRadiansPerSecond);\n },\n getAngularDirection(): Quaternion {\n return agent.data.state.angularDirection.clone();\n },\n setAngularDirection(direction: QuaternionLike): void {\n agent.data.state.angularDirection.copy(direction);\n },\n resetAngular(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setAngularSpeed(0);\n if (resetDirection) agent.setAngularDirection(new Quaternion());\n },\n serialize(): TKinematicConfig {\n return kinematicToConfig(agent);\n },\n autoUpdate$\n });\n\n function doKinematicMove(delta: TMilliseconds): void {\n if (agent.data.state.linearSpeed <= 0) return;\n\n if (isPointReached(agent.data.target, abstractTransformAgent.position$.value, agent.data.state)) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n linearDirection.copy(agent.data.state.linearDirection).normalize();\n displacement.copy(linearDirection).multiplyScalar(agent.data.state.linearSpeed * safeDelta);\n\n abstractTransformAgent.position$.next(abstractTransformAgent.position$.value.clone().add(displacement));\n }\n\n function doKinematicRotation(delta: TMilliseconds): void {\n if (agent.data.state.angularSpeed <= 0) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n const rotationStep: TRadians = (agent.data.state.angularSpeed * safeDelta) as TRadians;\n\n if (!agent.data.state.isInfiniteRotation && isRotationReached(agent.data.target, agent.rotation$.value, agent.data.state)) return;\n const stepRotation: Quaternion | undefined = getStepRotation(agent, rotationStep, agent.data.state.isInfiniteRotation);\n\n if (isNotDefined(stepRotation)) return;\n\n agent.data.state.angularDirection.multiply(stepRotation).normalize();\n agent.rotation$.next(agent.data.state.angularDirection);\n }\n\n kinematicSub$ = combineLatest([agent.enabled$, agent.autoUpdate$])\n .pipe(\n //Do not update if agent is disabled or autoUpdate is turned off\n switchMap(([isEnabled, isAutoUpdate]: ReadonlyArray<boolean>): Observable<TMilliseconds> => (isEnabled && isAutoUpdate ? kinematicLoop.tick$ : EMPTY))\n )\n .subscribe((delta: TMilliseconds): void => {\n doKinematicRotation(delta);\n doKinematicMove(delta);\n });\n\n return agent;\n}\n"],"names":["KinematicTransformAgent","params","kinematicLoop","autoUpdate$","BehaviorSubject","isAutoUpdate","DefaultIsAutoUpdate","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Kinematic","kinematicSub$","tempObject","Object3D","linearDirection","Vector3","displacement","destroySub$","destroy$","subscribe","unsubscribe","next","parent","remove","agent","Object","assign","data","state","linearSpeed","DefaultKinematicState","clone","angularSpeed","radius","angularDirection","forwardAxis","isInfiniteRotation","target","positionThreshold","DefaultKinematicTarget","position","rotationThreshold","rotation","setData","copy","isNotDefined","isDefined","getData","getRadius","setRadius","getForwardAxis","setForwardAxis","axis","moveTo","targetPosition","speed","isInstant","moveInstantly","Error","setLinearSpeed","equals","position$","value","setLinearDirection","sub","normalize","lookAt","up","set","targetRotation","quaternion","rotateTo","infinite","rotateInstantly","setAngularSpeed","getLinearSpeed","getLinearDirection","direction","getLinearAzimuth","getAzimuthElevationFromVector","azimuth","setLinearAzimuth","azimuthRad","currentDir","elevation","totalLength","length","newX","newZ","horizontalScale","Math","cos","ForwardAxis","Z","sin","X","newY","getLinearElevation","getElevationFromDirection","setLinearElevation","elevationRad","resetLinear","resetSpeed","resetDirection","getAngularSpeed","getAngularSpeedMps","metersPerSecond","setAngularSpeedMps","getAngularDirection","setAngularDirection","resetAngular","Quaternion","serialize","kinematicToConfig","combineLatest","enabled$","pipe","switchMap","isEnabled","tick$","EMPTY","delta","rotationStep","isRotationReached","rotation$","stepRotation","getStepRotation","multiply","doKinematicRotation","isPointReached","safeDelta","multiplyScalar","add","doKinematicMove"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KinematicTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/KinematicTransformAgent.ts"],"sourcesContent":["import { metersPerSecond } from '@Anarchy/Engine/Distance';\nimport { DefaultIsAutoUpdate, DefaultKinematicState, DefaultKinematicTarget, kinematicEntityToConfig } from '@Anarchy/Engine/Kinematic';\nimport { ForwardAxis } from '@Anarchy/Engine/Kinematic/Constants';\nimport type { TKinematicConfig, TKinematicData, TKinematicWritableData } from '@Anarchy/Engine/Kinematic/Models';\nimport type { TMeters, TMetersPerSecond, TMilliseconds, TRadians, TRadiansPerSecond } from '@Anarchy/Engine/Math';\nimport { getAzimuthElevationFromVector, getElevationFromDirection } from '@Anarchy/Engine/Math';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent, TKinematicAgentDependencies, TKinematicSpeed, TKinematicTransformAgent, TKinematicTransformAgentParams } from '@Anarchy/Engine/TransformDrive/Models';\nimport { getStepRotation, isInstant, isPointReached, isRotationReached, moveInstantly, rotateInstantly } from '@Anarchy/Engine/TransformDrive/Utils/KinematicAgentUtils';\nimport { isDefined, isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, combineLatest, EMPTY, switchMap } from 'rxjs';\nimport type { QuaternionLike, Vector3Like } from 'three';\nimport { Object3D, Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\nexport function KinematicTransformAgent(params: TKinematicTransformAgentParams, { kinematicLoop }: TKinematicAgentDependencies): TKinematicTransformAgent {\n const autoUpdate$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(params.isAutoUpdate ?? DefaultIsAutoUpdate);\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Kinematic);\n\n let kinematicSub$: Subscription | undefined = undefined;\n\n let tempObject: Object3D = new Object3D();\n let linearDirection: Vector3 = new Vector3();\n let displacement: Vector3 = new Vector3();\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n kinematicSub$?.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n\n tempObject.parent?.remove(tempObject);\n tempObject = null as any;\n linearDirection = null as any;\n displacement = null as any;\n });\n\n // eslint-disable-next-line functional/immutable-data\n const agent: Omit<TKinematicTransformAgent, 'data'> & Readonly<{ data: TKinematicWritableData }> = Object.assign(abstractTransformAgent, {\n data: {\n state: {\n linearSpeed: params.state.linearSpeed ?? DefaultKinematicState.linearSpeed,\n linearDirection: params.state.linearDirection?.clone() ?? DefaultKinematicState.linearDirection,\n angularSpeed: params.state.angularSpeed ?? DefaultKinematicState.angularSpeed,\n radius: params.state.radius ?? DefaultKinematicState.radius,\n angularDirection: params.state.angularDirection?.clone() ?? DefaultKinematicState.angularDirection,\n forwardAxis: params.state.forwardAxis ?? DefaultKinematicState.forwardAxis,\n isInfiniteRotation: params.state.isInfiniteRotation ?? DefaultKinematicState.isInfiniteRotation\n },\n target: {\n positionThreshold: params.target?.positionThreshold ?? DefaultKinematicTarget.positionThreshold,\n position: params.target?.position?.clone() ?? DefaultKinematicTarget.position,\n rotationThreshold: params.target?.rotationThreshold ?? DefaultKinematicTarget.rotationThreshold,\n rotation: params.target?.rotation?.clone() ?? DefaultKinematicTarget.rotation\n }\n },\n setData({ state, target }: TKinematicData): void {\n const { linearSpeed, linearDirection, angularSpeed, angularDirection, forwardAxis, isInfiniteRotation } = state;\n const { positionThreshold, position, rotationThreshold, rotation } = target ?? {};\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = linearSpeed;\n\n agent.data.state.linearDirection.copy(linearDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = angularSpeed;\n\n agent.data.state.angularDirection.copy(angularDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = forwardAxis;\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = isInfiniteRotation;\n\n if (isNotDefined(target)) return;\n\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(positionThreshold)) agent.data.target.positionThreshold = positionThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = position;\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(rotationThreshold)) agent.data.target.rotationThreshold = rotationThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = rotation;\n },\n getData(): TKinematicData {\n return agent.data;\n },\n getRadius(): TMeters {\n return agent.data.state.radius;\n },\n setRadius(radius: TMeters): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.radius = radius;\n },\n getForwardAxis(): ForwardAxis {\n return agent.data.state.forwardAxis;\n },\n setForwardAxis(axis: ForwardAxis): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = axis;\n },\n moveTo(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n if (isInstant(speed)) return moveInstantly(agent, targetPosition);\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setLinearSpeed(0);\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = targetPosition.clone();\n\n // If the agent is already at the target, do not move\n if (targetPosition.equals(abstractTransformAgent.position$.value)) return agent.setLinearSpeed(0);\n\n agent.setLinearDirection(targetPosition.clone().sub(abstractTransformAgent.position$.value).normalize());\n agent.setLinearSpeed(speed);\n return undefined;\n },\n // Rotates agent to \"look\" at the target position (e.g., mouse click position or any other actor, etc.)\n lookAt(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n tempObject.position.copy(abstractTransformAgent.position$.value);\n tempObject.up.set(0, 1, 0);\n tempObject.lookAt(targetPosition as Vector3);\n const targetRotation: Quaternion = tempObject.quaternion.clone().normalize();\n\n return agent.rotateTo(targetRotation, speed);\n },\n // Rotates agent as provided Quaternion (useful when you want to rotate as someone else already rotated)\n rotateTo(targetRotation: TReadonlyQuaternion, speed: TKinematicSpeed, infinite: boolean = false): void | never {\n if (isInstant(speed)) return rotateInstantly(agent, targetRotation);\n\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setAngularSpeed(0);\n if (agent.data.state.radius === 0) throw new Error('[KinematicTransformAgent]: Radius must be greater than 0 to calculate angular speed.');\n const angularSpeed: TRadiansPerSecond = (speed / agent.data.state.radius) as TRadiansPerSecond;\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = targetRotation.clone().normalize();\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = infinite;\n\n agent.setAngularSpeed(angularSpeed);\n return undefined;\n },\n getLinearSpeed(): TMetersPerSecond {\n return agent.data.state.linearSpeed;\n },\n setLinearSpeed(speed: TMetersPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = speed;\n },\n getLinearDirection(): Vector3 {\n return agent.data.state.linearDirection;\n },\n setLinearDirection(direction: Vector3Like): void {\n agent.data.state.linearDirection.copy(direction);\n },\n getLinearAzimuth(): TRadians {\n return getAzimuthElevationFromVector(agent.data.state.linearDirection, agent.data.state.forwardAxis).azimuth;\n },\n setLinearAzimuth(azimuthRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir: Vector3 = agent.data.state.linearDirection.clone();\n\n const { elevation } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n let newX: number, newZ: number;\n const horizontalScale: number = Math.cos(elevation) * totalLength;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuthRad) * horizontalScale;\n newZ = Math.cos(azimuthRad) * horizontalScale;\n } else if (forwardAxis === ForwardAxis.X) {\n newX = Math.cos(azimuthRad) * horizontalScale;\n newZ = Math.sin(azimuthRad) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevation) * totalLength;\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const currentY = current.y;\n // const horizontalMag = Math.sqrt(current.x * current.x + current.z * current.z);\n // let newX: number, newZ: number;\n // if (agent.data.state.forwardAxis === 'Z') {\n // newX = Math.sin(azimuthRad) * horizontalMag;\n // newZ = Math.cos(azimuthRad) * horizontalMag;\n // } else {\n // // forwardAxis === 'X'\n // newX = Math.cos(azimuthRad) * horizontalMag;\n // newZ = Math.sin(azimuthRad) * horizontalMag;\n // }\n // agent.data.state.linearDirection.set(newX, currentY, newZ);\n // // agent.data.state.linearDirection.normalize();\n },\n getLinearElevation(): TRadians {\n return getElevationFromDirection(agent.data.state.linearDirection);\n },\n setLinearElevation(elevationRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir = agent.data.state.linearDirection.clone();\n\n const { azimuth } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n const horizontalScale: number = Math.cos(elevationRad) * totalLength;\n let newX: number, newZ: number;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuth) * horizontalScale;\n newZ = Math.cos(azimuth) * horizontalScale;\n } else if (ForwardAxis.X) {\n newX = Math.cos(azimuth) * horizontalScale;\n newZ = Math.sin(azimuth) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevationRad) * totalLength;\n\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const horizontal = new Vector3(current.x, 0, current.z);\n // const h = horizontal.length();\n //\n // let horizontalDir: Vector3;\n // if (h > 1e-6) {\n // horizontalDir = horizontal.clone().normalize();\n // } else {\n // horizontalDir = agent.data.state.forwardAxis === 'Z' ? new Vector3(0, 0, 1) : new Vector3(1, 0, 0);\n // }\n //\n // // Approach 1 (absolute): Set the vector as in spherical coordinates with the given elevation.\n // // horizontal component will be cos(elevation), and vertical sin(elevation).\n // const newHorizontalMag = Math.cos(elevationRad);\n // const newHorizontal = horizontalDir.multiplyScalar(newHorizontalMag);\n // const newY = Math.sin(elevationRad);\n // agent.data.state.linearDirection.set(newHorizontal.x, newY, newHorizontal.z);\n //\n // // Approach 2 (additive): If you want to \"add\" vertical movement\n // // const newY = current.y + Math.tan(elevationRad) * h;\n // // agent.data.state.linearDirection.set(current.x, newY, current.z);\n // // agent.data.state.linearDirection.normalize();\n },\n resetLinear(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setLinearSpeed(0);\n if (resetDirection) agent.setLinearDirection(new Vector3());\n },\n getAngularSpeed(): TRadiansPerSecond {\n return agent.data.state.angularSpeed;\n },\n getAngularSpeedMps(): TMetersPerSecond | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n return metersPerSecond(agent.data.state.angularSpeed * agent.data.state.radius);\n },\n setAngularSpeed(speed: TRadiansPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = speed;\n },\n setAngularSpeedMps(speed: TMetersPerSecond): void | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n agent.setAngularSpeed((speed / agent.data.state.radius) as TRadiansPerSecond);\n },\n getAngularDirection(): Quaternion {\n return agent.data.state.angularDirection.clone();\n },\n setAngularDirection(direction: QuaternionLike): void {\n agent.data.state.angularDirection.copy(direction);\n },\n resetAngular(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setAngularSpeed(0);\n if (resetDirection) agent.setAngularDirection(new Quaternion());\n },\n serialize(): TKinematicConfig {\n return kinematicEntityToConfig(agent);\n },\n autoUpdate$\n });\n\n function doKinematicMove(delta: TMilliseconds): void {\n if (agent.data.state.linearSpeed <= 0) return;\n\n if (isPointReached(agent.data.target, abstractTransformAgent.position$.value, agent.data.state)) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n linearDirection.copy(agent.data.state.linearDirection).normalize();\n displacement.copy(linearDirection).multiplyScalar(agent.data.state.linearSpeed * safeDelta);\n\n abstractTransformAgent.position$.next(abstractTransformAgent.position$.value.clone().add(displacement));\n }\n\n function doKinematicRotation(delta: TMilliseconds): void {\n if (agent.data.state.angularSpeed <= 0) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n const rotationStep: TRadians = (agent.data.state.angularSpeed * safeDelta) as TRadians;\n\n if (!agent.data.state.isInfiniteRotation && isRotationReached(agent.data.target, agent.rotation$.value, agent.data.state)) return;\n const stepRotation: Quaternion | undefined = getStepRotation(agent, rotationStep, agent.data.state.isInfiniteRotation);\n\n if (isNotDefined(stepRotation)) return;\n\n agent.data.state.angularDirection.multiply(stepRotation).normalize();\n agent.rotation$.next(agent.data.state.angularDirection);\n }\n\n kinematicSub$ = combineLatest([agent.enabled$, agent.autoUpdate$])\n .pipe(\n //Do not update if agent is disabled or autoUpdate is turned off\n switchMap(([isEnabled, isAutoUpdate]: ReadonlyArray<boolean>): Observable<TMilliseconds> => (isEnabled && isAutoUpdate ? kinematicLoop.tick$ : EMPTY))\n )\n .subscribe((delta: TMilliseconds): void => {\n doKinematicRotation(delta);\n doKinematicMove(delta);\n });\n\n return agent;\n}\n"],"names":["KinematicTransformAgent","params","kinematicLoop","autoUpdate$","BehaviorSubject","isAutoUpdate","DefaultIsAutoUpdate","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Kinematic","kinematicSub$","tempObject","Object3D","linearDirection","Vector3","displacement","destroySub$","destroy$","subscribe","unsubscribe","next","parent","remove","agent","Object","assign","data","state","linearSpeed","DefaultKinematicState","clone","angularSpeed","radius","angularDirection","forwardAxis","isInfiniteRotation","target","positionThreshold","DefaultKinematicTarget","position","rotationThreshold","rotation","setData","copy","isNotDefined","isDefined","getData","getRadius","setRadius","getForwardAxis","setForwardAxis","axis","moveTo","targetPosition","speed","isInstant","moveInstantly","Error","setLinearSpeed","equals","position$","value","setLinearDirection","sub","normalize","lookAt","up","set","targetRotation","quaternion","rotateTo","infinite","rotateInstantly","setAngularSpeed","getLinearSpeed","getLinearDirection","direction","getLinearAzimuth","getAzimuthElevationFromVector","azimuth","setLinearAzimuth","azimuthRad","currentDir","elevation","totalLength","length","newX","newZ","horizontalScale","Math","cos","ForwardAxis","Z","sin","X","newY","getLinearElevation","getElevationFromDirection","setLinearElevation","elevationRad","resetLinear","resetSpeed","resetDirection","getAngularSpeed","getAngularSpeedMps","metersPerSecond","setAngularSpeedMps","getAngularDirection","setAngularDirection","resetAngular","Quaternion","serialize","kinematicEntityToConfig","combineLatest","enabled$","pipe","switchMap","isEnabled","tick$","EMPTY","delta","rotationStep","isRotationReached","rotation$","stepRotation","getStepRotation","multiply","doKinematicRotation","isPointReached","safeDelta","multiplyScalar","add","doKinematicMove"],"mappings":"8sCAkBO,SAASA,wBAAwBC,QAAwCC,cAAEA,gBAChF,MAAMC,YAAwC,IAAIC,gBAAyBH,OAAOI,cAAgBC,qBAC5FC,uBAAkDC,uBAAuBP,OAAQQ,eAAeC,WAEtG,IAAIC,cAEAC,WAAuB,IAAIC,SAC3BC,gBAA2B,IAAIC,QAC/BC,aAAwB,IAAID,QAEhC,MAAME,YAA4BV,uBAAuBW,SAASC,UAAU,KAE1EF,YAAYG,cACZT,eAAeS,cAEfb,uBAAuBW,SAASG,OAEhCT,WAAWU,QAAQC,OAAOX,YAC1BA,WAAa,KACbE,gBAAkB,KAClBE,aAAe,OAIXQ,MAA6FC,OAAOC,OAAOnB,uBAAwB,CACvIoB,KAAM,CACJC,MAAO,CACLC,YAAa5B,OAAO2B,MAAMC,aAAeC,sBAAsBD,YAC/Df,gBAAiBb,OAAO2B,MAAMd,iBAAiBiB,SAAWD,sBAAsBhB,gBAChFkB,aAAc/B,OAAO2B,MAAMI,cAAgBF,sBAAsBE,aACjEC,OAAQhC,OAAO2B,MAAMK,QAAUH,sBAAsBG,OACrDC,iBAAkBjC,OAAO2B,MAAMM,kBAAkBH,SAAWD,sBAAsBI,iBAClFC,YAAalC,OAAO2B,MAAMO,aAAeL,sBAAsBK,YAC/DC,mBAAoBnC,OAAO2B,MAAMQ,oBAAsBN,sBAAsBM,oBAE/EC,OAAQ,CACNC,kBAAmBrC,OAAOoC,QAAQC,mBAAqBC,uBAAuBD,kBAC9EE,SAAUvC,OAAOoC,QAAQG,UAAUT,SAAWQ,uBAAuBC,SACrEC,kBAAmBxC,OAAOoC,QAAQI,mBAAqBF,uBAAuBE,kBAC9EC,SAAUzC,OAAOoC,QAAQK,UAAUX,SAAWQ,uBAAuBG,WAGzE,OAAAC,EAAQf,MAAEA,MAAAS,OAAOA,SACf,MAAMR,YAAEA,YAAaf,gBAAAA,iBAAAA,aAAiBkB,8BAAcE,iBAAAC,YAAkBA,YAAAC,mBAAaA,oBAAuBR,OACpGU,kBAAEA,kBAAAE,SAAmBA,SAAAC,kBAAUA,2BAAmBC,UAAaL,QAAU,CAAA,EAG/Eb,MAAMG,KAAKC,MAAMC,YAAcA,YAE/BL,MAAMG,KAAKC,MAAMd,gBAAgB8B,KAAK9B,kBAEtCU,MAAMG,KAAKC,MAAMI,aAAeA,aAEhCR,MAAMG,KAAKC,MAAMM,iBAAiBU,KAAKV,kBAEvCV,MAAMG,KAAKC,MAAMO,YAAcA,YAE/BX,MAAMG,KAAKC,MAAMQ,mBAAqBA,mBAElCS,aAAaR,UAGbS,UAAUR,qBAAoBd,MAAMG,KAAKU,OAAOC,kBAAoBA,mBAExEd,MAAMG,KAAKU,OAAOG,SAAWA,SAEzBM,UAAUL,qBAAoBjB,MAAMG,KAAKU,OAAOI,kBAAoBA,mBAExEjB,MAAMG,KAAKU,OAAOK,SAAWA,SAC/B,EACAK,QAAA,IACSvB,MAAMG,KAEfqB,UAAA,IACSxB,MAAMG,KAAKC,MAAMK,OAE1B,SAAAgB,CAAUhB,QAERT,MAAMG,KAAKC,MAAMK,OAASA,MAC5B,EACAiB,eAAA,IACS1B,MAAMG,KAAKC,MAAMO,YAE1B,cAAAgB,CAAeC,MAEb5B,MAAMG,KAAKC,MAAMO,YAAciB,IACjC,EACA,MAAAC,CAAOC,eAAkCC,OACvC,GAAIC,UAAUD,OAAQ,OAAOE,cAAcjC,MAAO8B,gBAClD,GAAIC,MAAQ,EAAG,MAAM,IAAIG,MAAM,uFAC/B,OAAc,IAAVH,MAAoB/B,MAAMmC,eAAe,IAG7CnC,MAAMG,KAAKU,OAAOG,SAAWc,eAAevB,QAGxCuB,eAAeM,OAAOrD,uBAAuBsD,UAAUC,OAAetC,MAAMmC,eAAe,IAE/FnC,MAAMuC,mBAAmBT,eAAevB,QAAQiC,IAAIzD,uBAAuBsD,UAAUC,OAAOG,kBAC5FzC,MAAMmC,eAAeJ,QAEvB,EAEA,MAAAW,CAAOZ,eAAkCC,OACvC3C,WAAW4B,SAASI,KAAKrC,uBAAuBsD,UAAUC,OAC1DlD,WAAWuD,GAAGC,IAAI,EAAG,EAAG,GACxBxD,WAAWsD,OAAOZ,gBAClB,MAAMe,eAA6BzD,WAAW0D,WAAWvC,QAAQkC,YAEjE,OAAOzC,MAAM+C,SAASF,eAAgBd,MACxC,EAEA,QAAAgB,CAASF,eAAqCd,MAAwBiB,UAAoB,GACxF,GAAIhB,UAAUD,OAAQ,OAAOkB,gBAAgBjD,MAAO6C,gBAEpD,GAAId,MAAQ,EAAG,MAAM,IAAIG,MAAM,uFAC/B,GAAc,IAAVH,MAAa,OAAO/B,MAAMkD,gBAAgB,GAC9C,GAAgC,IAA5BlD,MAAMG,KAAKC,MAAMK,OAAc,MAAM,IAAIyB,MAAM,wFACnD,MAAM1B,aAAmCuB,MAAQ/B,MAAMG,KAAKC,MAAMK,OAGlET,MAAMG,KAAKU,OAAOK,SAAW2B,eAAetC,QAAQkC,YAEpDzC,MAAMG,KAAKC,MAAMQ,mBAAqBoC,SAEtChD,MAAMkD,gBAAgB1C,aAExB,EACA2C,eAAA,IACSnD,MAAMG,KAAKC,MAAMC,YAE1B,cAAA8B,CAAeJ,OAEb/B,MAAMG,KAAKC,MAAMC,YAAc0B,KACjC,EACAqB,mBAAA,IACSpD,MAAMG,KAAKC,MAAMd,gBAE1B,kBAAAiD,CAAmBc,WACjBrD,MAAMG,KAAKC,MAAMd,gBAAgB8B,KAAKiC,UACxC,EACAC,iBAAA,IACSC,8BAA8BvD,MAAMG,KAAKC,MAAMd,gBAAiBU,MAAMG,KAAKC,MAAMO,aAAa6C,QAEvG,gBAAAC,CAAiBC,YAEXpC,UAAUtB,MAAMG,KAAKU,QAAQG,YAAWhB,MAAMG,KAAKU,OAAOG,cAAW,GAEzE,MAAML,YAAEA,aAAgBX,MAAMG,KAAKC,MAC7BuD,WAAsB3D,MAAMG,KAAKC,MAAMd,gBAAgBiB,SAEvDqD,UAAEA,WAAcL,8BAA8BI,WAAYhD,aAC1DkD,YAAsBF,WAAWG,UAAY,EAEnD,IAAIC,KAAcC,KAClB,MAAMC,gBAA0BC,KAAKC,IAAIP,WAAaC,YAEtD,GAAIlD,cAAgByD,YAAYC,EAC9BN,KAAOG,KAAKI,IAAIZ,YAAcO,gBAC9BD,KAAOE,KAAKC,IAAIT,YAAcO,oBAChC,IAAWtD,cAAgByD,YAAYG,EAIrC,MAAM,IAAIrC,MAAM,mEAAmEkC,YAAYC,QAAQD,YAAYG,KAHnHR,KAAOG,KAAKC,IAAIT,YAAcO,gBAC9BD,KAAOE,KAAKI,IAAIZ,YAAcO,eAGhC,CAEA,MAAMO,KAAON,KAAKI,IAAIV,WAAaC,YACnC7D,MAAMG,KAAKC,MAAMd,gBAAgBsD,IAAImB,KAAMS,KAAMR,MAAMvB,WAiBzD,EACAgC,mBAAA,IACSC,0BAA0B1E,MAAMG,KAAKC,MAAMd,iBAEpD,kBAAAqF,CAAmBC,cAEbtD,UAAUtB,MAAMG,KAAKU,QAAQG,YAAWhB,MAAMG,KAAKU,OAAOG,cAAW,GAEzE,MAAML,YAAEA,aAAgBX,MAAMG,KAAKC,MAC7BuD,WAAa3D,MAAMG,KAAKC,MAAMd,gBAAgBiB,SAE9CiD,QAAEA,SAAYD,8BAA8BI,WAAYhD,aACxDkD,YAAsBF,WAAWG,UAAY,EAE7CG,gBAA0BC,KAAKC,IAAIS,cAAgBf,YACzD,IAAIE,KAAcC,KAElB,GAAIrD,cAAgByD,YAAYC,EAC9BN,KAAOG,KAAKI,IAAId,SAAWS,gBAC3BD,KAAOE,KAAKC,IAAIX,SAAWS,oBAC7B,KAAWG,YAAYG,EAIrB,MAAM,IAAIrC,MAAM,mEAAmEkC,YAAYC,QAAQD,YAAYG,KAHnHR,KAAOG,KAAKC,IAAIX,SAAWS,gBAC3BD,KAAOE,KAAKI,IAAId,SAAWS,eAG7B,CAEA,MAAMO,KAAON,KAAKI,IAAIM,cAAgBf,YAEtC7D,MAAMG,KAAKC,MAAMd,gBAAgBsD,IAAImB,KAAMS,KAAMR,MAAMvB,WAyBzD,EACA,WAAAoC,CAAYC,WAAqBC,gBAC3BD,YAAY9E,MAAMmC,eAAe,GACjC4C,gBAAgB/E,MAAMuC,mBAAmB,IAAIhD,QACnD,EACAyF,gBAAA,IACShF,MAAMG,KAAKC,MAAMI,aAE1B,kBAAAyE,GACE,GAAIjF,MAAMG,KAAKC,MAAMK,QAAU,EAAG,MAAM,IAAIyB,MAAM,wEAClD,OAAOgD,gBAAgBlF,MAAMG,KAAKC,MAAMI,aAAeR,MAAMG,KAAKC,MAAMK,OAC1E,EACA,eAAAyC,CAAgBnB,OAEd/B,MAAMG,KAAKC,MAAMI,aAAeuB,KAClC,EACA,kBAAAoD,CAAmBpD,OACjB,GAAI/B,MAAMG,KAAKC,MAAMK,QAAU,EAAG,MAAM,IAAIyB,MAAM,wEAClDlC,MAAMkD,gBAAiBnB,MAAQ/B,MAAMG,KAAKC,MAAMK,OAClD,EACA2E,oBAAA,IACSpF,MAAMG,KAAKC,MAAMM,iBAAiBH,QAE3C,mBAAA8E,CAAoBhC,WAClBrD,MAAMG,KAAKC,MAAMM,iBAAiBU,KAAKiC,UACzC,EACA,YAAAiC,CAAaR,WAAqBC,gBAC5BD,YAAY9E,MAAMkD,gBAAgB,GAClC6B,gBAAgB/E,MAAMqF,oBAAoB,IAAIE,WACpD,EACAC,UAAA,IACSC,wBAAwBzF,OAEjCrB,0BAwCF,OAVAQ,cAAgBuG,cAAc,CAAC1F,MAAM2F,SAAU3F,MAAMrB,cAClDiH,KAECC,UAAU,EAAEC,UAAWjH,gBAAsEiH,WAAajH,aAAeH,cAAcqH,MAAQC,QAEhJrG,UAAWsG,SApBd,SAA6BA,OAC3B,GAAIjG,MAAMG,KAAKC,MAAMI,cAAgB,EAAG,OAExC,MACM0F,aAA0BlG,MAAMG,KAAKC,MAAMI,cADhByF,MAAQ,EAAIA,MAAS,GAGtD,IAAKjG,MAAMG,KAAKC,MAAMQ,oBAAsBuF,kBAAkBnG,MAAMG,KAAKU,OAAQb,MAAMoG,UAAU9D,MAAOtC,MAAMG,KAAKC,OAAQ,OAC3H,MAAMiG,aAAuCC,gBAAgBtG,MAAOkG,aAAclG,MAAMG,KAAKC,MAAMQ,oBAE/FS,aAAagF,gBAEjBrG,MAAMG,KAAKC,MAAMM,iBAAiB6F,SAASF,cAAc5D,YACzDzC,MAAMoG,UAAUvG,KAAKG,MAAMG,KAAKC,MAAMM,kBACxC,CAQI8F,CAAoBP,OAjCxB,SAAyBA,OACvB,GAAIjG,MAAMG,KAAKC,MAAMC,aAAe,EAAG,OAEvC,GAAIoG,eAAezG,MAAMG,KAAKU,OAAQ9B,uBAAuBsD,UAAUC,MAAOtC,MAAMG,KAAKC,OAAQ,OAEjG,MAAMsG,UAA2BT,MAAQ,EAAIA,MAAS,EACtD3G,gBAAgB8B,KAAKpB,MAAMG,KAAKC,MAAMd,iBAAiBmD,YACvDjD,aAAa4B,KAAK9B,iBAAiBqH,eAAe3G,MAAMG,KAAKC,MAAMC,YAAcqG,WAEjF3H,uBAAuBsD,UAAUxC,KAAKd,uBAAuBsD,UAAUC,MAAM/B,QAAQqG,IAAIpH,cAC3F,CAwBIqH,CAAgBZ,SAGbjG,KACT"}
|