@anov/3d-ability 0.0.140 → 0.0.142
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/business/Animation/motion/index.js +35 -56
- package/dist/business/Animation/motion/index.js.map +1 -1
- package/dist/business/Animation/type.js +2 -2
- package/dist/business/Area/Fence/FenceBase.js +146 -187
- package/dist/business/Area/Fence/FenceBase.js.map +1 -1
- package/dist/business/Area/Fence/fence_base_01.js +120 -112
- package/dist/business/Area/Fence/fence_base_01.js.map +1 -1
- package/dist/business/Area/Fence/fence_feeting_01.js +218 -130
- package/dist/business/Area/Fence/fence_feeting_01.js.map +1 -1
- package/dist/business/Area/Fence/fence_roll_01.js +140 -130
- package/dist/business/Area/Fence/fence_roll_01.js.map +1 -1
- package/dist/business/Area/FillArea/FillAreaBase.js +87 -126
- package/dist/business/Area/FillArea/FillAreaBase.js.map +1 -1
- package/dist/business/Area/FillArea/fillArea_face_01.js +72 -98
- package/dist/business/Area/FillArea/fillArea_face_01.js.map +1 -1
- package/dist/business/Area/FillArea/fillArea_line_01.js +66 -94
- package/dist/business/Area/FillArea/fillArea_line_01.js.map +1 -1
- package/dist/business/Area/index.js +267 -483
- package/dist/business/Area/index.js.map +1 -1
- package/dist/business/Area/tool.js +14 -26
- package/dist/business/Area/tool.js.map +1 -1
- package/dist/business/Base/ObjectLayer.js +21 -46
- package/dist/business/Base/ObjectLayer.js.map +1 -1
- package/dist/business/Batch/index.js +189 -234
- package/dist/business/Batch/index.js.map +1 -1
- package/dist/business/Box/index.js +52 -81
- package/dist/business/Box/index.js.map +1 -1
- package/dist/business/Cylinder/index.js +51 -79
- package/dist/business/Cylinder/index.js.map +1 -1
- package/dist/business/Flyline/bubble/CircleBubble.js +1 -9
- package/dist/business/Flyline/bubble/CircleBubble.js.map +1 -1
- package/dist/business/Flyline/bubble/index.js +7 -21
- package/dist/business/Flyline/bubble/index.js.map +1 -1
- package/dist/business/Flyline/index.js +96 -162
- package/dist/business/Flyline/index.js.map +1 -1
- package/dist/business/Flyline/line/ArcLine.js +208 -291
- package/dist/business/Flyline/line/ArcLine.js.map +1 -1
- package/dist/business/Flyline/line/index.js +8 -22
- package/dist/business/Flyline/line/index.js.map +1 -1
- package/dist/business/HeatMap/HeatMap.js +380 -467
- package/dist/business/HeatMap/HeatMap.js.map +1 -1
- package/dist/business/HeatMap/core.js +405 -525
- package/dist/business/HeatMap/core.js.map +1 -1
- package/dist/business/HeatMap/shader.js +69 -3
- package/dist/business/HeatMap/shader.js.map +1 -1
- package/dist/business/InfoPanel/index.js +201 -242
- package/dist/business/InfoPanel/index.js.map +1 -1
- package/dist/business/Line/index.js +55 -88
- package/dist/business/Line/index.js.map +1 -1
- package/dist/business/Mark/KeyframeAnimation.js +145 -176
- package/dist/business/Mark/KeyframeAnimation.js.map +1 -1
- package/dist/business/Mark/index.js +196 -294
- package/dist/business/Mark/index.js.map +1 -1
- package/dist/business/Mark/shader/tanhao.js +36 -3
- package/dist/business/Mark/shader/tanhao.js.map +1 -1
- package/dist/business/Mark/type.js +1 -1
- package/dist/business/MaterialSwitch/MaterialSwitchSystem.js +377 -551
- package/dist/business/MaterialSwitch/MaterialSwitchSystem.js.map +1 -1
- package/dist/business/MaterialSwitch/inject.js +92 -58
- package/dist/business/MaterialSwitch/inject.js.map +1 -1
- package/dist/business/MaterialSwitch/shader/finalFade.js +74 -2
- package/dist/business/MaterialSwitch/shader/finalFade.js.map +1 -1
- package/dist/business/MaterialSwitch/shader/ground.js +95 -16
- package/dist/business/MaterialSwitch/shader/ground.js.map +1 -1
- package/dist/business/MaterialSwitch/shader/groundBase64.js +9 -3
- package/dist/business/MaterialSwitch/shader/groundBase64.js.map +1 -1
- package/dist/business/MaterialSwitch/shader/realFade.js +48 -9
- package/dist/business/MaterialSwitch/shader/realFade.js.map +1 -1
- package/dist/business/Plane/index.js +51 -78
- package/dist/business/Plane/index.js.map +1 -1
- package/dist/business/Poi/index.d.ts +5 -0
- package/dist/business/Poi/index.js +256 -295
- package/dist/business/Poi/index.js.map +1 -1
- package/dist/business/Poi/link/Cylinder.js +56 -89
- package/dist/business/Poi/link/Cylinder.js.map +1 -1
- package/dist/business/Poi/link/Pyramid.js +104 -165
- package/dist/business/Poi/link/Pyramid.js.map +1 -1
- package/dist/business/Poi/link/index.d.ts +1 -1
- package/dist/business/Poi/link/index.js +54 -114
- package/dist/business/Poi/link/index.js.map +1 -1
- package/dist/business/Poi/panel/index.d.ts +124 -0
- package/dist/business/Poi/panel/index.js +474 -0
- package/dist/business/Poi/panel/index.js.map +1 -0
- package/dist/business/Poi/panel/interfaces.d.ts +67 -0
- package/dist/business/Poi/panel/interfaces.js +2 -0
- package/dist/business/Poi/panel/interfaces.js.map +1 -0
- package/dist/business/Poi/panel/utils.d.ts +72 -0
- package/dist/business/Poi/panel/utils.js +126 -0
- package/dist/business/Poi/panel/utils.js.map +1 -0
- package/dist/business/Poi/particle/DoubleCircle.js +71 -107
- package/dist/business/Poi/particle/DoubleCircle.js.map +1 -1
- package/dist/business/Poi/particle/DynamicCircle.js +75 -111
- package/dist/business/Poi/particle/DynamicCircle.js.map +1 -1
- package/dist/business/Poi/particle/SingleCircle.js +62 -98
- package/dist/business/Poi/particle/SingleCircle.js.map +1 -1
- package/dist/business/Poi/particle/index.js +49 -117
- package/dist/business/Poi/particle/index.js.map +1 -1
- package/dist/business/Poi/shader/circle.js +31 -3
- package/dist/business/Poi/shader/circle.js.map +1 -1
- package/dist/business/Poi/shader/cylinder.js +37 -3
- package/dist/business/Poi/shader/cylinder.js.map +1 -1
- package/dist/business/Poi/shader/doubleCircle.js +55 -3
- package/dist/business/Poi/shader/doubleCircle.js.map +1 -1
- package/dist/business/Poi/shader/dynamicCircle.js +67 -3
- package/dist/business/Poi/shader/dynamicCircle.js.map +1 -1
- package/dist/business/Poi/title/Border.js +7 -27
- package/dist/business/Poi/title/Border.js.map +1 -1
- package/dist/business/Poi/title/Ellipse.js +7 -27
- package/dist/business/Poi/title/Ellipse.js.map +1 -1
- package/dist/business/Poi/title/index.js +208 -292
- package/dist/business/Poi/title/index.js.map +1 -1
- package/dist/business/Poi/tools.js +22 -19
- package/dist/business/Poi/tools.js.map +1 -1
- package/dist/business/Poi/types.d.ts +3 -0
- package/dist/business/Poi/types.js.map +1 -1
- package/dist/business/Sphere/index.js +47 -72
- package/dist/business/Sphere/index.js.map +1 -1
- package/dist/business/Spline/index.js +190 -245
- package/dist/business/Spline/index.js.map +1 -1
- package/dist/business/SplitBuilding/index.js +327 -536
- package/dist/business/SplitBuilding/index.js.map +1 -1
- package/dist/business/SplitBuilding/type.js +2 -2
- package/dist/business/TrafficComponents/RealismTraffic/RealismTraffic.js +218 -275
- package/dist/business/TrafficComponents/RealismTraffic/RealismTraffic.js.map +1 -1
- package/dist/business/TrafficComponents/StreamerTraffic/StreamerTraffic.js +132 -177
- package/dist/business/TrafficComponents/StreamerTraffic/StreamerTraffic.js.map +1 -1
- package/dist/business/TrafficComponents/StreamerTraffic/fragmentShader.js +51 -1
- package/dist/business/TrafficComponents/StreamerTraffic/fragmentShader.js.map +1 -1
- package/dist/business/TrafficComponents/StreamerTraffic/vertexShader.js +6 -1
- package/dist/business/TrafficComponents/StreamerTraffic/vertexShader.js.map +1 -1
- package/dist/business/TrafficComponents/base.js +32 -55
- package/dist/business/TrafficComponents/base.js.map +1 -1
- package/dist/business/TrafficComponents/utils.d.ts +1 -1
- package/dist/business/TrafficComponents/utils.js +26 -25
- package/dist/business/TrafficComponents/utils.js.map +1 -1
- package/dist/business/Utils/Curve.js +40 -56
- package/dist/business/Utils/Curve.js.map +1 -1
- package/dist/business/Utils/constant.js +1 -1
- package/dist/business/Utils/constant.js.map +1 -1
- package/dist/business/Utils/defineProps.js +13 -14
- package/dist/business/Utils/defineProps.js.map +1 -1
- package/dist/business/Utils/round-curve.js +127 -153
- package/dist/business/Utils/round-curve.js.map +1 -1
- package/dist/business/VideoPanel/index.js +258 -319
- package/dist/business/VideoPanel/index.js.map +1 -1
- package/dist/business/Water/index.js +78 -108
- package/dist/business/Water/index.js.map +1 -1
- package/dist/business/Water/types.js +1 -1
- package/dist/business/Water/types.js.map +1 -1
- package/dist/core/Camera/PerspectiveCamera/CameraExpand.js +383 -449
- package/dist/core/Camera/PerspectiveCamera/CameraExpand.js.map +1 -1
- package/dist/core/Camera/PerspectiveCamera/FollowOrbitControls.js +107 -142
- package/dist/core/Camera/PerspectiveCamera/FollowOrbitControls.js.map +1 -1
- package/dist/core/Controls/FirstViewControl/index.js +84 -96
- package/dist/core/Controls/FirstViewControl/index.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/action/input.js +77 -98
- package/dist/core/Controls/ThirdViewControl/action/input.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/config/constants.js +1 -1
- package/dist/core/Controls/ThirdViewControl/config/constants.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/index.js +19 -28
- package/dist/core/Controls/ThirdViewControl/index.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/player/animation.js +126 -155
- package/dist/core/Controls/ThirdViewControl/player/animation.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/player/camera.js +47 -63
- package/dist/core/Controls/ThirdViewControl/player/camera.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/player/control.js +39 -49
- package/dist/core/Controls/ThirdViewControl/player/control.js.map +1 -1
- package/dist/core/Controls/ThirdViewControl/player.js +66 -91
- package/dist/core/Controls/ThirdViewControl/player.js.map +1 -1
- package/dist/core/Controls/base.js +14 -30
- package/dist/core/Controls/base.js.map +1 -1
- package/dist/core/Curve/RoundedCornersCurve/RoundedCornersCurve.js +92 -131
- package/dist/core/Curve/RoundedCornersCurve/RoundedCornersCurve.js.map +1 -1
- package/dist/core/Debug/PerformanceInfo/Performance.js +22 -47
- package/dist/core/Debug/PerformanceInfo/Performance.js.map +1 -1
- package/dist/core/Light/PointLight/PointLightExt.js +4 -21
- package/dist/core/Light/PointLight/PointLightExt.js.map +1 -1
- package/dist/core/Material/FinirMaterial/FinirMaterial.js +37 -57
- package/dist/core/Material/FinirMaterial/FinirMaterial.js.map +1 -1
- package/dist/core/Material/PristineGridMaterial/PristineGridMaterial.js +116 -153
- package/dist/core/Material/PristineGridMaterial/PristineGridMaterial.js.map +1 -1
- package/dist/core/Material/PristineGridMaterial/shader/fragment.js +95 -1
- package/dist/core/Material/PristineGridMaterial/shader/fragment.js.map +1 -1
- package/dist/core/Material/PristineGridMaterial/shader/vertex.js +26 -1
- package/dist/core/Material/PristineGridMaterial/shader/vertex.js.map +1 -1
- package/dist/core/Material/SurfaceMaterial/index.js +76 -172
- package/dist/core/Material/SurfaceMaterial/index.js.map +1 -1
- package/dist/core/Material/decorators.js +6 -11
- package/dist/core/Material/decorators.js.map +1 -1
- package/dist/core/PostEffects/addACESFilmicToneMappingPass.js +16 -12
- package/dist/core/PostEffects/addACESFilmicToneMappingPass.js.map +1 -1
- package/dist/core/PostEffects/addBrightnessContrastPass.js +17 -13
- package/dist/core/PostEffects/addBrightnessContrastPass.js.map +1 -1
- package/dist/core/PostEffects/bloomPass.js +17 -10
- package/dist/core/PostEffects/bloomPass.js.map +1 -1
- package/dist/core/PostEffects/bloomSelect.js +60 -43
- package/dist/core/PostEffects/bloomSelect.js.map +1 -1
- package/dist/core/PostEffects/colorifyPass.js +17 -13
- package/dist/core/PostEffects/colorifyPass.js.map +1 -1
- package/dist/core/PostEffects/index.js +28 -22
- package/dist/core/PostEffects/index.js.map +1 -1
- package/dist/core/PostEffects/outlinePass.js +37 -50
- package/dist/core/PostEffects/outlinePass.js.map +1 -1
- package/dist/core/PostEffects/postprocessing.js +14 -12
- package/dist/core/PostEffects/postprocessing.js.map +1 -1
- package/dist/core/PostEffects/saoPass.js +15 -10
- package/dist/core/PostEffects/saoPass.js.map +1 -1
- package/dist/core/PostEffects/shader/colorify.js +22 -3
- package/dist/core/PostEffects/shader/colorify.js.map +1 -1
- package/dist/core/PostEffects/shader/gammaCorrectionShader.js +27 -3
- package/dist/core/PostEffects/shader/gammaCorrectionShader.js.map +1 -1
- package/dist/core/PostEffects/shader/mapping.js +66 -3
- package/dist/core/PostEffects/shader/mapping.js.map +1 -1
- package/dist/core/PostEffects/shader/thermalMaging.js +28 -3
- package/dist/core/PostEffects/shader/thermalMaging.js.map +1 -1
- package/dist/core/SceneEffect/grow/grow.js +85 -101
- package/dist/core/SceneEffect/grow/grow.js.map +1 -1
- package/dist/core/SceneEffect/grow/style_down.js +60 -77
- package/dist/core/SceneEffect/grow/style_down.js.map +1 -1
- package/dist/core/SceneEffect/grow/style_up.js +64 -81
- package/dist/core/SceneEffect/grow/style_up.js.map +1 -1
- package/dist/core/SceneEffect/grow/type.js +2 -2
- package/dist/core/SceneEffect/grow/type.js.map +1 -1
- package/dist/core/WeatherSystem/DynamicWeatherSystem.js +51 -76
- package/dist/core/WeatherSystem/DynamicWeatherSystem.js.map +1 -1
- package/dist/core/WeatherSystem/hdr/index.js +69 -105
- package/dist/core/WeatherSystem/hdr/index.js.map +1 -1
- package/dist/core/WeatherSystem/index.js +77 -124
- package/dist/core/WeatherSystem/index.js.map +1 -1
- package/dist/core/WeatherSystem/objects/fog/index.js +52 -80
- package/dist/core/WeatherSystem/objects/fog/index.js.map +1 -1
- package/dist/core/WeatherSystem/objects/rain/index.js +72 -84
- package/dist/core/WeatherSystem/objects/rain/index.js.map +1 -1
- package/dist/core/WeatherSystem/objects/rain/lineRain.js +88 -118
- package/dist/core/WeatherSystem/objects/rain/lineRain.js.map +1 -1
- package/dist/core/WeatherSystem/objects/rain/plane.js +116 -146
- package/dist/core/WeatherSystem/objects/rain/plane.js.map +1 -1
- package/dist/core/WeatherSystem/objects/rain/point.js +100 -148
- package/dist/core/WeatherSystem/objects/rain/point.js.map +1 -1
- package/dist/core/WeatherSystem/objects/sky/cloud.js +71 -104
- package/dist/core/WeatherSystem/objects/sky/cloud.js.map +1 -1
- package/dist/core/WeatherSystem/objects/sky/index.js +66 -84
- package/dist/core/WeatherSystem/objects/sky/index.js.map +1 -1
- package/dist/core/WeatherSystem/objects/sky/outline.js +25 -45
- package/dist/core/WeatherSystem/objects/sky/outline.js.map +1 -1
- package/dist/core/WeatherSystem/shaders/cloud.js +74 -3
- package/dist/core/WeatherSystem/shaders/cloud.js.map +1 -1
- package/dist/core/WeatherSystem/shaders/fog.js +103 -3
- package/dist/core/WeatherSystem/shaders/fog.js.map +1 -1
- package/dist/core/WeatherSystem/shaders/rain.js +206 -7
- package/dist/core/WeatherSystem/shaders/rain.js.map +1 -1
- package/dist/core/WeatherSystem/shaders/sky.js +87 -3
- package/dist/core/WeatherSystem/shaders/sky.js.map +1 -1
- package/dist/core/WeatherSystem/sky/index.js +104 -135
- package/dist/core/WeatherSystem/sky/index.js.map +1 -1
- package/dist/core/WeatherSystem/utils/constant.js +44 -38
- package/dist/core/WeatherSystem/utils/constant.js.map +1 -1
- package/dist/core/WeatherSystem/utils/math.js +18 -25
- package/dist/core/WeatherSystem/utils/math.js.map +1 -1
- package/dist/core/WeatherSystem/utils/type.js +1 -1
- package/dist/core/WeatherSystem/utils/type.js.map +1 -1
- package/dist/core/WeatherSystem/weather/index.js +96 -141
- package/dist/core/WeatherSystem/weather/index.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","catch","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","ObjectLayer","StrategyManage","pyramid","_pyramid","_callee","_callee$","_context","default","cylinder","_cylinder","_callee2","_callee2$","_context2","LinkMesh","_ObjectLayer","_inherits","_super","_createSuper","_this","_classCallCheck","_defineProperty","_assertThisInitialized","Set","_createClass","get","_readyPromise","_vspace","set","newValue","_hspace","_mesh","setupAnimation","addReloadListener","callback","_listeners","add","removeReloadListener","delete","destroy","remove","removeFromParent","clear"],"sources":["../../../../src/business/Poi/link/index.ts"],"sourcesContent":["import type { Group, Mesh } from '@anov/3d-core'\nimport ObjectLayer from '../../Base/ObjectLayer'\n\nexport const StrategyManage = {\n pyramid: async () => (await import('./Pyramid')).default,\n cylinder: async () => (await import('./Cylinder')).default,\n}\n\nexport default class LinkMesh extends ObjectLayer {\n _readyPromise: Promise<boolean>\n _vspace: [number, number] = [0, 0] // 垂直间距\n _hspace: [number, number] = [0, 0] // 水平间距\n _mesh: Group | Mesh\n _listeners = new Set()\n\n constructor() {\n super()\n }\n\n public get ready() {\n return this._readyPromise\n }\n\n public get vspace() {\n return this._vspace\n }\n\n public set vspace(newValue) {\n this._vspace = newValue\n }\n\n public get hspace() {\n return this._hspace\n }\n\n public get mesh() {\n return this._mesh\n }\n\n public setupAnimation() {}\n\n // 注册监听\n public addReloadListener(callback) {\n this._listeners.add(callback)\n }\n\n // 移除监听\n public removeReloadListener(callback) {\n this._listeners.delete(callback)\n }\n\n // 销毁\n public destroy() {\n this._mesh.remove()\n this._mesh.removeFromParent()\n this._listeners.clear()\n }\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["ObjectLayer","StrategyManage","pyramid","_ref","_asyncToGenerator","default","apply","arguments","cylinder","_ref2","LinkMesh","constructor","_defineProperty","Set","ready","_readyPromise","vspace","_vspace","newValue","hspace","_hspace","mesh","_mesh","setupAnimation","addReloadListener","callback","_listeners","add","removeReloadListener","delete","destroy","remove","removeFromParent","clear"],"sources":["../../../../src/business/Poi/link/index.ts"],"sourcesContent":["import type { Group, Mesh } from '@anov/3d-core'\nimport ObjectLayer from '../../Base/ObjectLayer'\n\nexport const StrategyManage = {\n pyramid: async () => (await import('./Pyramid')).default,\n cylinder: async () => (await import('./Cylinder')).default,\n}\n\nexport default class LinkMesh extends ObjectLayer {\n _readyPromise: Promise<boolean>\n _vspace: [number, number] = [0, 0] // 垂直间距\n _hspace: [number, number] = [0, 0] // 水平间距\n _mesh: Group | Mesh\n _listeners = new Set()\n\n constructor() {\n super()\n }\n\n public get ready() {\n return this._readyPromise\n }\n\n public get vspace() {\n return this._vspace\n }\n\n public set vspace(newValue) {\n this._vspace = newValue\n }\n\n public get hspace() {\n return this._hspace\n }\n\n public get mesh() {\n return this._mesh\n }\n\n public setupAnimation() {}\n\n // 注册监听\n public addReloadListener(callback) {\n this._listeners.add(callback)\n }\n\n // 移除监听\n public removeReloadListener(callback) {\n this._listeners.delete(callback)\n }\n\n // 销毁\n public destroy() {\n this._mesh.remove()\n this._mesh.removeFromParent()\n this._listeners.clear()\n }\n}"],"mappings":";;;;;AACA,OAAOA,WAAW;AAElB,OAAO,MAAMC,cAAc,GAAG;EAC5BC,OAAO;IAAA,IAAAC,IAAA,GAAAC,iBAAA,CAAE;MAAA,OAAY,OAAO,MAAM,YAAY,CAAC,EAAEC,OAAO;IAAA;IAAA,gBAAAH,QAAA;MAAA,OAAAC,IAAA,CAAAG,KAAA,OAAAC,SAAA;IAAA;EAAA;EACxDC,QAAQ;IAAA,IAAAC,KAAA,GAAAL,iBAAA,CAAE;MAAA,OAAY,OAAO,MAAM,aAAa,CAAC,EAAEC,OAAO;IAAA;IAAA,gBAAAG,SAAA;MAAA,OAAAC,KAAA,CAAAH,KAAA,OAAAC,SAAA;IAAA;EAAA;AAC5D,CAAC;AAED,eAAe,MAAMG,QAAQ,SAASV,WAAW,CAAC;EAOhDW,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,CAAC;IAAAC,eAAA;IAAAA,eAAA,kBANmB,CAAC,CAAC,EAAE,CAAC,CAAC;IAAC;IAAAA,eAAA,kBACP,CAAC,CAAC,EAAE,CAAC,CAAC;IAAC;IAAAA,eAAA;IAAAA,eAAA,qBAEtB,IAAIC,GAAG,CAAC,CAAC;EAItB;EAEA,IAAWC,KAAKA,CAAA,EAAG;IACjB,OAAO,IAAI,CAACC,aAAa;EAC3B;EAEA,IAAWC,MAAMA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACC,OAAO;EACrB;EAEA,IAAWD,MAAMA,CAACE,QAAQ,EAAE;IAC1B,IAAI,CAACD,OAAO,GAAGC,QAAQ;EACzB;EAEA,IAAWC,MAAMA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACC,OAAO;EACrB;EAEA,IAAWC,IAAIA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACC,KAAK;EACnB;EAEOC,cAAcA,CAAA,EAAG,CAAC;;EAEzB;EACOC,iBAAiBA,CAACC,QAAQ,EAAE;IACjC,IAAI,CAACC,UAAU,CAACC,GAAG,CAACF,QAAQ,CAAC;EAC/B;;EAEA;EACOG,oBAAoBA,CAACH,QAAQ,EAAE;IACpC,IAAI,CAACC,UAAU,CAACG,MAAM,CAACJ,QAAQ,CAAC;EAClC;;EAEA;EACOK,OAAOA,CAAA,EAAG;IACf,IAAI,CAACR,KAAK,CAACS,MAAM,CAAC,CAAC;IACnB,IAAI,CAACT,KAAK,CAACU,gBAAgB,CAAC,CAAC;IAC7B,IAAI,CAACN,UAAU,CAACO,KAAK,CAAC,CAAC;EACzB;AACF"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { type PerspectiveCamera } from '@anov/3d-core';
|
|
2
|
+
import ObjectLayer from '../../Base/ObjectLayer';
|
|
3
|
+
import { InfoPanelUpdateConfig } from './interfaces';
|
|
4
|
+
/**
|
|
5
|
+
* InfoPanel
|
|
6
|
+
* 一个基于 CSS3DObject 的三维信息面板。面板的排版以像素为单位,
|
|
7
|
+
* 并可根据相机参数在 3D 世界中动态映射为适当的世界尺寸。
|
|
8
|
+
*
|
|
9
|
+
* 关键特性:
|
|
10
|
+
* - 像素锁定(`pixelLock`):保证屏幕像素尺寸恒定的看板效果。
|
|
11
|
+
* - 动态缩放(`updateDynamicScale`):实时根据相机 FOV、距离、视口宽高计算世界尺度。
|
|
12
|
+
* - 看板模式(`billboard`):支持水平(yaw)和全方位(full)朝向相机。
|
|
13
|
+
* - 自定义缩放(`scale` 与 `userScale3`):统一与非均匀缩放相乘得到最终缩放。
|
|
14
|
+
*
|
|
15
|
+
* 用法概览:
|
|
16
|
+
* const panel = new InfoPanel({
|
|
17
|
+
* text: { value: 'POI A', fontSize: 18 },
|
|
18
|
+
* size: [320, 180],
|
|
19
|
+
* scale: 1,
|
|
20
|
+
* pixelLock: true,
|
|
21
|
+
* billboard: 'yaw',
|
|
22
|
+
* anchor: 'top'
|
|
23
|
+
* });
|
|
24
|
+
* panel.updateDynamicScale(camera);
|
|
25
|
+
*/
|
|
26
|
+
export default class InfoPanel extends ObjectLayer {
|
|
27
|
+
/**
|
|
28
|
+
* 内部状态与元素引用
|
|
29
|
+
* - config: 当前配置(已合并 defaults 与外部传入)
|
|
30
|
+
* - container: 面板根容器(用于 CSS3DObject 承载)
|
|
31
|
+
* - titleEl: 标题元素
|
|
32
|
+
* - contentEl: 内容元素(可选)
|
|
33
|
+
* - innerWrap: 内部包裹,用于实现锚点与偏移
|
|
34
|
+
* - _cssObject: three.js CSS3DObject(加入到 scene graph)
|
|
35
|
+
*/
|
|
36
|
+
private config;
|
|
37
|
+
private container;
|
|
38
|
+
private titleEl;
|
|
39
|
+
private contentEl;
|
|
40
|
+
private innerWrap;
|
|
41
|
+
private _cssObject;
|
|
42
|
+
private _tmpObjPos;
|
|
43
|
+
private _tmpCamPos;
|
|
44
|
+
private _tmpCamDir;
|
|
45
|
+
/**
|
|
46
|
+
* 构造函数
|
|
47
|
+
* @param cfg 外部配置对象;仅识别本组件支持的字段,其他字段会忽略
|
|
48
|
+
*/
|
|
49
|
+
constructor(cfg?: InfoPanelUpdateConfig);
|
|
50
|
+
/**
|
|
51
|
+
* 将传入的配置与默认值合并并规范化。
|
|
52
|
+
* - 自动处理文本样式、九宫格背景、可见性、对齐与偏移。
|
|
53
|
+
* - `scale`: 支持数值(统一缩放)或长度为 3 的数组(非均匀缩放)。
|
|
54
|
+
* - `pixelLock`: 是否锁定屏幕像素尺寸。
|
|
55
|
+
* - `anchor`: 面板锚点。
|
|
56
|
+
* @param cfg 配置对象
|
|
57
|
+
*/
|
|
58
|
+
updateConfig(cfg?: InfoPanelUpdateConfig): void;
|
|
59
|
+
/**
|
|
60
|
+
* 设置面板世界坐标(应用到 CSS3DObject)。
|
|
61
|
+
*/
|
|
62
|
+
setPosition(x: number, y: number, z: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* 设置面板世界旋转(欧拉角,单位:弧度)。
|
|
65
|
+
*/
|
|
66
|
+
setRotation(x: number, y: number, z: number): void;
|
|
67
|
+
/**
|
|
68
|
+
* 设置统一缩放因子(立即应用到 CSS3DObject)。
|
|
69
|
+
* 注意:若使用 `updateDynamicScale`,每帧会覆盖此值。
|
|
70
|
+
*/
|
|
71
|
+
setScale(s: number): void;
|
|
72
|
+
/**
|
|
73
|
+
* 设置看板模式。
|
|
74
|
+
* @param mode 'none' | 'yaw' | 'full'
|
|
75
|
+
*/
|
|
76
|
+
setBillboard(mode: 'none' | 'yaw' | 'full'): void;
|
|
77
|
+
/**
|
|
78
|
+
* 设置可见性。
|
|
79
|
+
* @param v 是否可见
|
|
80
|
+
*/
|
|
81
|
+
setVisible(v: boolean): void;
|
|
82
|
+
/**
|
|
83
|
+
* 应用所有样式与文本到 DOM。
|
|
84
|
+
* 仅影响面板的排版与外观,不涉及 3D 变换。
|
|
85
|
+
*/
|
|
86
|
+
applyStyle(): void;
|
|
87
|
+
/**
|
|
88
|
+
* 更新配置并立即重新应用到 DOM。
|
|
89
|
+
* @param cfg 新配置
|
|
90
|
+
*/
|
|
91
|
+
update(cfg?: InfoPanelUpdateConfig): void;
|
|
92
|
+
/**
|
|
93
|
+
* 根据看板模式使面板朝向相机。
|
|
94
|
+
* - 'full':使用 `lookAt` 全方位朝向相机。
|
|
95
|
+
* - 'yaw':仅绕 Y 轴旋转,保持水平面朝向相机。
|
|
96
|
+
* - 'none':不处理朝向。
|
|
97
|
+
* @param camera three.js 相机
|
|
98
|
+
*/
|
|
99
|
+
updateFacing(camera: PerspectiveCamera): void;
|
|
100
|
+
/**
|
|
101
|
+
* 动态缩放:根据相机 FOV、沿相机前向的距离 d、视口尺寸,
|
|
102
|
+
* 计算“每像素对应的世界单位”,并结合用户缩放得到最终缩放。
|
|
103
|
+
* - pixelLock: s = worldPerPixelX * userScale
|
|
104
|
+
* - 非锁定: s = userScale
|
|
105
|
+
* - 最终各轴缩放: [sx, sy, sz] = s * userScale3
|
|
106
|
+
*/
|
|
107
|
+
updateDynamicScale(camera: PerspectiveCamera, viewportWidth?: number, viewportHeight?: number): void;
|
|
108
|
+
/**
|
|
109
|
+
* 释放面板:从场景移除 CSS3DObject,并清理 DOM。
|
|
110
|
+
*/
|
|
111
|
+
dispose(): void;
|
|
112
|
+
/**
|
|
113
|
+
* 获取当前面板在世界坐标中的宽高(单位:世界单位)。
|
|
114
|
+
* 注意:结果受相机参数、面板到相机的距离以及当前 `_cssObject.scale` 影响。
|
|
115
|
+
* @param camera three.js 相机
|
|
116
|
+
* @param viewportWidth 视口宽度(像素)
|
|
117
|
+
* @param viewportHeight 视口高度(像素)
|
|
118
|
+
* @returns `{ width, height }` 世界单位
|
|
119
|
+
*/
|
|
120
|
+
getWorldSize(camera: PerspectiveCamera, viewportWidth?: number, viewportHeight?: number): {
|
|
121
|
+
width: number;
|
|
122
|
+
height: number;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
|
3
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
4
|
+
/*
|
|
5
|
+
* @Descripttion:
|
|
6
|
+
* @version:
|
|
7
|
+
* @Author: 周志国
|
|
8
|
+
* @Date: 2025-11-27 15:14:21
|
|
9
|
+
* @LastEditors: 周志国
|
|
10
|
+
* @LastEditTime: 2025-12-01 15:44:33
|
|
11
|
+
* @changeLog:
|
|
12
|
+
* @FilePath: /anov-3d-webgl/packages/anov-3d-ability/src/business/Poi/panel/index.ts
|
|
13
|
+
*/
|
|
14
|
+
import { CSS3DObject, Vector3, MathUtils } from '@anov/3d-core';
|
|
15
|
+
import ObjectLayer from "../../Base/ObjectLayer";
|
|
16
|
+
import { clampAlign, parseWeight, parseStyle, num, color, sanitizeUrl, arr2, arr3, rep, setStyles, arr4 } from "./utils";
|
|
17
|
+
/**
|
|
18
|
+
* 文件概览
|
|
19
|
+
* InfoPanel 是一个基于 CSS3DObject 的信息面板组件,用于在三维场景中以“屏幕像素”为基础进行排版和渲染。
|
|
20
|
+
* - 最小像素尺寸通过 `size` 指定(默认 320x180),容器会随内容自适应增大。
|
|
21
|
+
* - `pixelLock` 为 true 时,面板会随相机距离自动缩放以保持屏幕像素大小恒定。
|
|
22
|
+
* - `scale`/`userScale3` 提供统一或非均匀的用户缩放,参与最终缩放计算。
|
|
23
|
+
* - `billboard` 支持朝向相机(`yaw` 或 `full`),用于看板效果。
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 组件默认配置。
|
|
28
|
+
* - text: 标题(主文本)相关样式与背景设置
|
|
29
|
+
* - content: 副文本显示与样式
|
|
30
|
+
* - size: 面板最小像素尺寸 `[width, height]`
|
|
31
|
+
* - scale: 统一用户缩放系数(>0)
|
|
32
|
+
* - userScale3: 非均匀用户缩放 `[sx, sy, sz]`,与 `scale` 相乘
|
|
33
|
+
* - pixelLock: 是否锁定屏幕像素尺寸
|
|
34
|
+
* - billboard: 看板模式('none'|'yaw'|'full')
|
|
35
|
+
* - anchor: 面板锚点('top'|'center'|'bottom')
|
|
36
|
+
*/
|
|
37
|
+
const defaults = {
|
|
38
|
+
text: {
|
|
39
|
+
value: '',
|
|
40
|
+
fontSize: 16,
|
|
41
|
+
color: '#ffffff',
|
|
42
|
+
fontWeight: 'normal',
|
|
43
|
+
fontStyle: 'normal',
|
|
44
|
+
offset: [0, 0],
|
|
45
|
+
align: 'left',
|
|
46
|
+
spacing: 0,
|
|
47
|
+
bgUrl: '',
|
|
48
|
+
hsl: [200, 120, 80],
|
|
49
|
+
bgNineSlice: {
|
|
50
|
+
enabled: true,
|
|
51
|
+
slice: [65, 92, 27, 17],
|
|
52
|
+
width: [65, 92, 27, 17],
|
|
53
|
+
repeat: 'stretch',
|
|
54
|
+
fill: true,
|
|
55
|
+
radius: 0
|
|
56
|
+
},
|
|
57
|
+
bgSlice: [65, 92, 27, 17]
|
|
58
|
+
},
|
|
59
|
+
content: {
|
|
60
|
+
visible: false,
|
|
61
|
+
value: '',
|
|
62
|
+
fontSize: 16,
|
|
63
|
+
color: '#ffffff',
|
|
64
|
+
fontWeight: 'normal',
|
|
65
|
+
fontStyle: 'normal',
|
|
66
|
+
align: 'left',
|
|
67
|
+
offset: [0, 0],
|
|
68
|
+
spacing: 0
|
|
69
|
+
},
|
|
70
|
+
// 默认面板像素尺寸(宽度,高度)
|
|
71
|
+
size: [320, 180],
|
|
72
|
+
scale: 1,
|
|
73
|
+
// 非均匀用户缩放(来自外部 scale: [x,y,z])
|
|
74
|
+
userScale3: [1, 1, 1],
|
|
75
|
+
// 屏幕像素锁定:保持屏幕像素尺寸恒定
|
|
76
|
+
pixelLock: true,
|
|
77
|
+
billboard: 'none',
|
|
78
|
+
anchor: 'top'
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* InfoPanel
|
|
83
|
+
* 一个基于 CSS3DObject 的三维信息面板。面板的排版以像素为单位,
|
|
84
|
+
* 并可根据相机参数在 3D 世界中动态映射为适当的世界尺寸。
|
|
85
|
+
*
|
|
86
|
+
* 关键特性:
|
|
87
|
+
* - 像素锁定(`pixelLock`):保证屏幕像素尺寸恒定的看板效果。
|
|
88
|
+
* - 动态缩放(`updateDynamicScale`):实时根据相机 FOV、距离、视口宽高计算世界尺度。
|
|
89
|
+
* - 看板模式(`billboard`):支持水平(yaw)和全方位(full)朝向相机。
|
|
90
|
+
* - 自定义缩放(`scale` 与 `userScale3`):统一与非均匀缩放相乘得到最终缩放。
|
|
91
|
+
*
|
|
92
|
+
* 用法概览:
|
|
93
|
+
* const panel = new InfoPanel({
|
|
94
|
+
* text: { value: 'POI A', fontSize: 18 },
|
|
95
|
+
* size: [320, 180],
|
|
96
|
+
* scale: 1,
|
|
97
|
+
* pixelLock: true,
|
|
98
|
+
* billboard: 'yaw',
|
|
99
|
+
* anchor: 'top'
|
|
100
|
+
* });
|
|
101
|
+
* panel.updateDynamicScale(camera);
|
|
102
|
+
*/
|
|
103
|
+
export default class InfoPanel extends ObjectLayer {
|
|
104
|
+
/**
|
|
105
|
+
* 构造函数
|
|
106
|
+
* @param cfg 外部配置对象;仅识别本组件支持的字段,其他字段会忽略
|
|
107
|
+
*/
|
|
108
|
+
constructor(cfg = {}) {
|
|
109
|
+
super();
|
|
110
|
+
// 新增字段声明,修复类型报错
|
|
111
|
+
/**
|
|
112
|
+
* 内部状态与元素引用
|
|
113
|
+
* - config: 当前配置(已合并 defaults 与外部传入)
|
|
114
|
+
* - container: 面板根容器(用于 CSS3DObject 承载)
|
|
115
|
+
* - titleEl: 标题元素
|
|
116
|
+
* - contentEl: 内容元素(可选)
|
|
117
|
+
* - innerWrap: 内部包裹,用于实现锚点与偏移
|
|
118
|
+
* - _cssObject: three.js CSS3DObject(加入到 scene graph)
|
|
119
|
+
*/
|
|
120
|
+
_defineProperty(this, "config", void 0);
|
|
121
|
+
_defineProperty(this, "container", void 0);
|
|
122
|
+
_defineProperty(this, "titleEl", void 0);
|
|
123
|
+
_defineProperty(this, "contentEl", void 0);
|
|
124
|
+
_defineProperty(this, "innerWrap", void 0);
|
|
125
|
+
_defineProperty(this, "_cssObject", void 0);
|
|
126
|
+
// 复用的临时向量,避免频繁创建对象
|
|
127
|
+
_defineProperty(this, "_tmpObjPos", new Vector3());
|
|
128
|
+
_defineProperty(this, "_tmpCamPos", new Vector3());
|
|
129
|
+
_defineProperty(this, "_tmpCamDir", new Vector3());
|
|
130
|
+
this.config = JSON.parse(JSON.stringify(defaults));
|
|
131
|
+
this.updateConfig(cfg);
|
|
132
|
+
this.container = document.createElement('div');
|
|
133
|
+
this.titleEl = document.createElement('div');
|
|
134
|
+
this.contentEl = document.createElement('div');
|
|
135
|
+
this.innerWrap = document.createElement('div');
|
|
136
|
+
// 内层包裹用于布局,默认采用容器左上角为参考点
|
|
137
|
+
setStyles(this.innerWrap, {
|
|
138
|
+
position: 'relative',
|
|
139
|
+
left: '0',
|
|
140
|
+
top: '0',
|
|
141
|
+
transform: 'none',
|
|
142
|
+
pointerEvents: 'auto'
|
|
143
|
+
});
|
|
144
|
+
this.innerWrap.appendChild(this.titleEl);
|
|
145
|
+
this.innerWrap.appendChild(this.contentEl);
|
|
146
|
+
this.container.appendChild(this.innerWrap);
|
|
147
|
+
// 将 CSS3DObject 作为子节点添加,而非赋值到 this.object3D
|
|
148
|
+
this._cssObject = new CSS3DObject(this.container);
|
|
149
|
+
this.add(this._cssObject);
|
|
150
|
+
this.applyStyle();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 将传入的配置与默认值合并并规范化。
|
|
155
|
+
* - 自动处理文本样式、九宫格背景、可见性、对齐与偏移。
|
|
156
|
+
* - `scale`: 支持数值(统一缩放)或长度为 3 的数组(非均匀缩放)。
|
|
157
|
+
* - `pixelLock`: 是否锁定屏幕像素尺寸。
|
|
158
|
+
* - `anchor`: 面板锚点。
|
|
159
|
+
* @param cfg 配置对象
|
|
160
|
+
*/
|
|
161
|
+
updateConfig(cfg = {}) {
|
|
162
|
+
const t = cfg.text || {};
|
|
163
|
+
const c = cfg.content || {};
|
|
164
|
+
this.config.text.value = typeof t.value === 'string' ? t.value : this.config.text.value;
|
|
165
|
+
this.config.text.fontSize = num(t.fontSize, this.config.text.fontSize);
|
|
166
|
+
this.config.text.color = color(t.color, this.config.text.color);
|
|
167
|
+
this.config.text.fontWeight = parseWeight(t.fontWeight || this.config.text.fontWeight);
|
|
168
|
+
this.config.text.fontStyle = parseStyle(t.fontStyle || this.config.text.fontStyle);
|
|
169
|
+
this.config.text.offset = arr2(t.offset, this.config.text.offset);
|
|
170
|
+
this.config.text.align = clampAlign(t.align || this.config.text.align);
|
|
171
|
+
this.config.text.spacing = num(t.spacing, this.config.text.spacing);
|
|
172
|
+
this.config.text.bgUrl = typeof t.bgUrl === 'string' ? sanitizeUrl(t.bgUrl) : this.config.text.bgUrl;
|
|
173
|
+
this.config.text.hsl = arr3(t.hsl, this.config.text.hsl).slice(0, 3);
|
|
174
|
+
const ns = t.bgNineSlice || {};
|
|
175
|
+
this.config.text.bgNineSlice.enabled = typeof ns.enabled === 'boolean' ? ns.enabled : this.config.text.bgNineSlice.enabled;
|
|
176
|
+
this.config.text.bgNineSlice.slice = arr4(ns.slice || t.bgSlice, this.config.text.bgNineSlice.slice);
|
|
177
|
+
this.config.text.bgNineSlice.width = arr4(ns.width || t.bgSlice, this.config.text.bgNineSlice.width);
|
|
178
|
+
this.config.text.bgNineSlice.repeat = rep(ns.repeat || this.config.text.bgNineSlice.repeat);
|
|
179
|
+
this.config.text.bgNineSlice.fill = typeof ns.fill === 'boolean' ? ns.fill : this.config.text.bgNineSlice.fill;
|
|
180
|
+
this.config.text.bgNineSlice.radius = num(ns.radius, this.config.text.bgNineSlice.radius);
|
|
181
|
+
this.config.content.visible = typeof c.visible === 'boolean' ? c.visible : this.config.content.visible;
|
|
182
|
+
this.config.content.value = typeof c.value === 'string' ? c.value : this.config.content.value;
|
|
183
|
+
this.config.content.fontSize = num(c.fontSize, this.config.content.fontSize);
|
|
184
|
+
this.config.content.color = color(c.color, this.config.content.color);
|
|
185
|
+
this.config.content.fontWeight = parseWeight(c.fontWeight || this.config.content.fontWeight);
|
|
186
|
+
this.config.content.fontStyle = parseStyle(c.fontStyle || this.config.content.fontStyle);
|
|
187
|
+
this.config.content.align = clampAlign(c.align || this.config.content.align);
|
|
188
|
+
this.config.content.offset = arr2(c.offset, this.config.content.offset);
|
|
189
|
+
this.config.content.spacing = num(c.spacing, this.config.content.spacing);
|
|
190
|
+
// 支持数值或数组。数值作为统一倍数,数组作为非均匀倍数
|
|
191
|
+
if (Array.isArray(cfg.scale) && cfg.scale.length === 3) {
|
|
192
|
+
const sx = num(cfg.scale[0], this.config.userScale3[0]);
|
|
193
|
+
const sy = num(cfg.scale[1], this.config.userScale3[1]);
|
|
194
|
+
const sz = num(cfg.scale[2], this.config.userScale3[2]);
|
|
195
|
+
this.config.userScale3 = [sx, sy, sz];
|
|
196
|
+
} else {
|
|
197
|
+
const s = num(cfg.scale, this.config.scale);
|
|
198
|
+
// 用户缩放因子:仅作为乘数,不参与单位换算
|
|
199
|
+
this.config.scale = s > 0 ? s : this.config.scale;
|
|
200
|
+
}
|
|
201
|
+
const bb = cfg.billboard || this.config.billboard;
|
|
202
|
+
this.config.billboard = bb === 'yaw' || bb === 'full' ? bb : 'none';
|
|
203
|
+
// 面板尺寸可通过 cfg.size 指定,否则使用默认尺寸
|
|
204
|
+
this.config.size = arr2(cfg.size, this.config.size);
|
|
205
|
+
// 屏幕像素锁定
|
|
206
|
+
this.config.pixelLock = !!(typeof cfg.pixelLock === 'boolean' ? cfg.pixelLock : this.config.pixelLock);
|
|
207
|
+
// 面板锚点
|
|
208
|
+
const ac = cfg.anchor || this.config.anchor;
|
|
209
|
+
this.config.anchor = ac === 'top' || ac === 'center' || ac === 'bottom' ? ac : 'bottom';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* 设置面板世界坐标(应用到 CSS3DObject)。
|
|
214
|
+
*/
|
|
215
|
+
setPosition(x, y, z) {
|
|
216
|
+
this._cssObject.position.set(x, y, z);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* 设置面板世界旋转(欧拉角,单位:弧度)。
|
|
221
|
+
*/
|
|
222
|
+
setRotation(x, y, z) {
|
|
223
|
+
this._cssObject.rotation.set(x, y, z);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* 设置统一缩放因子(立即应用到 CSS3DObject)。
|
|
228
|
+
* 注意:若使用 `updateDynamicScale`,每帧会覆盖此值。
|
|
229
|
+
*/
|
|
230
|
+
setScale(s) {
|
|
231
|
+
this._cssObject.scale.setScalar(s);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* 设置看板模式。
|
|
236
|
+
* @param mode 'none' | 'yaw' | 'full'
|
|
237
|
+
*/
|
|
238
|
+
setBillboard(mode) {
|
|
239
|
+
const m = mode === 'yaw' || mode === 'full' ? mode : 'none';
|
|
240
|
+
this.config.billboard = m;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* 设置可见性。
|
|
245
|
+
* @param v 是否可见
|
|
246
|
+
*/
|
|
247
|
+
setVisible(v) {
|
|
248
|
+
this._cssObject.visible = !!v;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* 应用所有样式与文本到 DOM。
|
|
253
|
+
* 仅影响面板的排版与外观,不涉及 3D 变换。
|
|
254
|
+
*/
|
|
255
|
+
applyStyle() {
|
|
256
|
+
const t = this.config.text;
|
|
257
|
+
const c = this.config.content;
|
|
258
|
+
// 基础容器样式,确保可见尺寸与居中锚点
|
|
259
|
+
setStyles(this.container, {
|
|
260
|
+
display: 'inline-block',
|
|
261
|
+
boxSizing: 'border-box',
|
|
262
|
+
transformOrigin: 'center center',
|
|
263
|
+
backgroundRepeat: 'no-repeat',
|
|
264
|
+
backgroundPosition: 'center',
|
|
265
|
+
backfaceVisibility: 'hidden',
|
|
266
|
+
padding: '8px'
|
|
267
|
+
});
|
|
268
|
+
// 最小像素尺寸(默认 320x180,可通过 cfg.size 覆盖),容器尺寸随内容自适应
|
|
269
|
+
const [pxW, pxH] = this.config.size;
|
|
270
|
+
setStyles(this.container, {
|
|
271
|
+
width: '',
|
|
272
|
+
height: '',
|
|
273
|
+
minWidth: `${pxW}px`,
|
|
274
|
+
minHeight: `${pxH}px`
|
|
275
|
+
});
|
|
276
|
+
// 根据锚点设置内部包裹的定位与偏移(默认 top:以左上角为参考)
|
|
277
|
+
if (this.config.anchor === 'top') {
|
|
278
|
+
this.innerWrap.style.left = '0';
|
|
279
|
+
this.innerWrap.style.top = '0';
|
|
280
|
+
this.innerWrap.style.bottom = 'auto';
|
|
281
|
+
this.innerWrap.style.transform = 'none';
|
|
282
|
+
} else if (this.config.anchor === 'center') {
|
|
283
|
+
this.innerWrap.style.left = '50%';
|
|
284
|
+
this.innerWrap.style.top = '50%';
|
|
285
|
+
this.innerWrap.style.bottom = 'auto';
|
|
286
|
+
this.innerWrap.style.transform = 'translate(-50%, -50%)';
|
|
287
|
+
} else {
|
|
288
|
+
// bottom
|
|
289
|
+
this.innerWrap.style.left = '0';
|
|
290
|
+
this.innerWrap.style.top = 'auto';
|
|
291
|
+
this.innerWrap.style.bottom = '0';
|
|
292
|
+
this.innerWrap.style.transform = 'none';
|
|
293
|
+
}
|
|
294
|
+
this.titleEl.textContent = t.value || '';
|
|
295
|
+
setStyles(this.titleEl, {
|
|
296
|
+
fontSize: `${t.fontSize}px`,
|
|
297
|
+
color: t.color,
|
|
298
|
+
fontWeight: t.fontWeight,
|
|
299
|
+
fontStyle: t.fontStyle,
|
|
300
|
+
textAlign: t.align,
|
|
301
|
+
letterSpacing: `${num(t.spacing)}px`,
|
|
302
|
+
whiteSpace: 'nowrap',
|
|
303
|
+
overflow: 'hidden',
|
|
304
|
+
textOverflow: 'ellipsis',
|
|
305
|
+
marginLeft: `${num(t.offset[0])}px`,
|
|
306
|
+
marginTop: `${num(t.offset[1])}px`
|
|
307
|
+
});
|
|
308
|
+
this.contentEl.style.display = c.visible ? 'block' : 'none';
|
|
309
|
+
this.contentEl.textContent = c.value || '';
|
|
310
|
+
setStyles(this.contentEl, {
|
|
311
|
+
fontSize: `${c.fontSize}px`,
|
|
312
|
+
color: c.color,
|
|
313
|
+
fontWeight: c.fontWeight,
|
|
314
|
+
fontStyle: c.fontStyle,
|
|
315
|
+
textAlign: c.align,
|
|
316
|
+
letterSpacing: `${num(c.spacing)}px`,
|
|
317
|
+
whiteSpace: 'pre-wrap',
|
|
318
|
+
wordBreak: 'break-word',
|
|
319
|
+
overflow: 'visible',
|
|
320
|
+
textOverflow: 'clip',
|
|
321
|
+
marginLeft: `${num(c.offset[0])}px`,
|
|
322
|
+
marginTop: `${num(c.offset[1])}px`
|
|
323
|
+
});
|
|
324
|
+
const hasBgUrl = typeof t.bgUrl === 'string' && t.bgUrl.length > 0;
|
|
325
|
+
if (hasBgUrl) {
|
|
326
|
+
if (t.bgNineSlice && t.bgNineSlice.enabled) {
|
|
327
|
+
const s = t.bgNineSlice.slice;
|
|
328
|
+
const w = t.bgNineSlice.width;
|
|
329
|
+
// 厚度限制,避免边框厚度超过容器尺寸导致异常视觉放大
|
|
330
|
+
const wClamped = [Math.min(w[0], pxH * 0.5), Math.min(w[1], pxW * 0.5), Math.min(w[2], pxH * 0.5), Math.min(w[3], pxW * 0.5)];
|
|
331
|
+
setStyles(this.container, {
|
|
332
|
+
borderStyle: 'solid',
|
|
333
|
+
borderWidth: `${wClamped[0]}px ${wClamped[1]}px ${wClamped[2]}px ${wClamped[3]}px`,
|
|
334
|
+
borderImageSource: `url(${t.bgUrl})`,
|
|
335
|
+
borderImageSlice: `${s[0]} ${s[1]} ${s[2]} ${s[3]}${t.bgNineSlice.fill ? ' fill' : ''}`,
|
|
336
|
+
borderImageRepeat: t.bgNineSlice.repeat,
|
|
337
|
+
backgroundImage: 'none',
|
|
338
|
+
borderRadius: `${num(t.bgNineSlice.radius, 0)}px`
|
|
339
|
+
});
|
|
340
|
+
} else {
|
|
341
|
+
setStyles(this.container, {
|
|
342
|
+
backgroundImage: `url(${t.bgUrl})`,
|
|
343
|
+
borderImageSource: 'none',
|
|
344
|
+
borderImageSlice: '',
|
|
345
|
+
borderImageRepeat: '',
|
|
346
|
+
borderStyle: 'none',
|
|
347
|
+
borderWidth: '0px'
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
} else {
|
|
351
|
+
setStyles(this.container, {
|
|
352
|
+
backgroundImage: 'none',
|
|
353
|
+
borderImageSource: 'none',
|
|
354
|
+
borderImageSlice: '',
|
|
355
|
+
borderImageRepeat: '',
|
|
356
|
+
borderStyle: 'none',
|
|
357
|
+
borderWidth: '0px'
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
// 背景填充整个容器尺寸
|
|
361
|
+
setStyles(this.container, {
|
|
362
|
+
backgroundSize: '100% 100%',
|
|
363
|
+
textAlign: t.align,
|
|
364
|
+
pointerEvents: 'auto',
|
|
365
|
+
filter: `hue-rotate(${num(t.hsl[0], 0)}deg) saturate(${num(t.hsl[1], 0)}%) brightness(${num(t.hsl[2], 0)}%)`
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* 更新配置并立即重新应用到 DOM。
|
|
371
|
+
* @param cfg 新配置
|
|
372
|
+
*/
|
|
373
|
+
update(cfg = {}) {
|
|
374
|
+
this.updateConfig(cfg);
|
|
375
|
+
this.applyStyle();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* 根据看板模式使面板朝向相机。
|
|
380
|
+
* - 'full':使用 `lookAt` 全方位朝向相机。
|
|
381
|
+
* - 'yaw':仅绕 Y 轴旋转,保持水平面朝向相机。
|
|
382
|
+
* - 'none':不处理朝向。
|
|
383
|
+
* @param camera three.js 相机
|
|
384
|
+
*/
|
|
385
|
+
updateFacing(camera) {
|
|
386
|
+
const mode = this.config.billboard;
|
|
387
|
+
if (mode === 'none') return;
|
|
388
|
+
const objPos = this._tmpObjPos;
|
|
389
|
+
const camPos = this._tmpCamPos;
|
|
390
|
+
this._cssObject.getWorldPosition(objPos);
|
|
391
|
+
camera.getWorldPosition(camPos);
|
|
392
|
+
if (mode === 'full') {
|
|
393
|
+
this._cssObject.lookAt(camPos);
|
|
394
|
+
} else if (mode === 'yaw') {
|
|
395
|
+
const dx = camPos.x - objPos.x;
|
|
396
|
+
const dz = camPos.z - objPos.z;
|
|
397
|
+
const yaw = Math.atan2(dx, dz);
|
|
398
|
+
this._cssObject.rotation.set(0, yaw, 0);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* 动态缩放:根据相机 FOV、沿相机前向的距离 d、视口尺寸,
|
|
404
|
+
* 计算“每像素对应的世界单位”,并结合用户缩放得到最终缩放。
|
|
405
|
+
* - pixelLock: s = worldPerPixelX * userScale
|
|
406
|
+
* - 非锁定: s = userScale
|
|
407
|
+
* - 最终各轴缩放: [sx, sy, sz] = s * userScale3
|
|
408
|
+
*/
|
|
409
|
+
updateDynamicScale(camera, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight) {
|
|
410
|
+
if (!camera) return;
|
|
411
|
+
const objPos = this._tmpObjPos;
|
|
412
|
+
const camPos = this._tmpCamPos;
|
|
413
|
+
const camDir = this._tmpCamDir;
|
|
414
|
+
this._cssObject.getWorldPosition(objPos);
|
|
415
|
+
camera.getWorldPosition(camPos);
|
|
416
|
+
camera.getWorldDirection(camDir);
|
|
417
|
+
const d = objPos.clone().sub(camPos).dot(camDir);
|
|
418
|
+
const fovRad = MathUtils.degToRad(camera.fov);
|
|
419
|
+
const worldPerPixelY = 2 * d * Math.tan(fovRad / 2) / viewportHeight;
|
|
420
|
+
const worldPerPixelX = worldPerPixelY * camera.aspect;
|
|
421
|
+
const userScale = this.config.scale;
|
|
422
|
+
const userScale3 = this.config.userScale3 || [1, 1, 1];
|
|
423
|
+
// pixel-lock:保持屏幕像素尺寸恒定;非锁定:使用统一用户系数
|
|
424
|
+
let s = this.config.pixelLock ? worldPerPixelX * (userScale > 0 ? userScale : 1) : userScale > 0 ? userScale : 1;
|
|
425
|
+
if (!Number.isFinite(s) || s <= 0) return;
|
|
426
|
+
// 简单限幅,避免极端相机参数造成缩放异常
|
|
427
|
+
const MAX_S = 1e3;
|
|
428
|
+
const MIN_S = 1e-6;
|
|
429
|
+
s = Math.max(Math.min(s, MAX_S), MIN_S);
|
|
430
|
+
const sx = s * (userScale3[0] || 1);
|
|
431
|
+
const sy = s * (userScale3[1] || 1);
|
|
432
|
+
const sz = s * (userScale3[2] || 1);
|
|
433
|
+
this._cssObject.scale.set(sx, sy, sz);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// 移除父级缩放抵消,面板可响应外部实体缩放(含非均匀)
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* 释放面板:从场景移除 CSS3DObject,并清理 DOM。
|
|
440
|
+
*/
|
|
441
|
+
dispose() {
|
|
442
|
+
if (this._cssObject.parent) this._cssObject.parent.remove(this._cssObject);
|
|
443
|
+
this.container.remove();
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* 获取当前面板在世界坐标中的宽高(单位:世界单位)。
|
|
448
|
+
* 注意:结果受相机参数、面板到相机的距离以及当前 `_cssObject.scale` 影响。
|
|
449
|
+
* @param camera three.js 相机
|
|
450
|
+
* @param viewportWidth 视口宽度(像素)
|
|
451
|
+
* @param viewportHeight 视口高度(像素)
|
|
452
|
+
* @returns `{ width, height }` 世界单位
|
|
453
|
+
*/
|
|
454
|
+
getWorldSize(camera, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight) {
|
|
455
|
+
const objPos = this._tmpObjPos;
|
|
456
|
+
const camPos = this._tmpCamPos;
|
|
457
|
+
const camDir = this._tmpCamDir;
|
|
458
|
+
this._cssObject.getWorldPosition(objPos);
|
|
459
|
+
camera.getWorldPosition(camPos);
|
|
460
|
+
camera.getWorldDirection(camDir);
|
|
461
|
+
const d = objPos.clone().sub(camPos).dot(camDir);
|
|
462
|
+
const fovRad = MathUtils.degToRad(camera.fov);
|
|
463
|
+
const worldPerPixelY = 2 * d * Math.tan(fovRad / 2) / viewportHeight;
|
|
464
|
+
const worldPerPixelX = worldPerPixelY * camera.aspect;
|
|
465
|
+
const wpx = this.container.offsetWidth || 0;
|
|
466
|
+
const hpx = this.container.offsetHeight || 0;
|
|
467
|
+
const s = this._cssObject.scale.x;
|
|
468
|
+
return {
|
|
469
|
+
width: wpx * worldPerPixelX * s,
|
|
470
|
+
height: hpx * worldPerPixelY * s
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=index.js.map
|