112 lines
2.7 KiB
Markdown
112 lines
2.7 KiB
Markdown
# Earth Renderer / Logic Separation Plan
|
|
|
|
> Source note: this plan absorbs useful ideas from a sisyphus-created draft formerly stored at `.sisyphus/plans/earth-architecture-refactor.md`.
|
|
|
|
## Goal
|
|
|
|
将 Earth 前端继续往“逻辑层 / 状态层 / 渲染层”分离推进,降低后续这几类工作的耦合成本:
|
|
|
|
- Three.js 渲染重构
|
|
- 部分图层替换实现
|
|
- 未来 UE / Cesium 客户端迁移
|
|
- Earth 行为逻辑复用
|
|
|
|
## Why This Matters
|
|
|
|
当前 Earth 已经有一些良好分层,例如:
|
|
|
|
- 图层显隐入口
|
|
- Cable state 枚举与状态 map
|
|
- 交互逻辑与实际视觉效果的部分分离
|
|
|
|
但还没有形成一套更明确的统一规则。现在的风险是:
|
|
|
|
- 同一类对象的 hover / locked / hidden / loading 语义不一致
|
|
- 状态和渲染更新散落在多个模块
|
|
- 后续再加新图层时容易复制旧逻辑
|
|
|
|
## Target Architecture
|
|
|
|
Earth 对每类对象都尽量拆成三层:
|
|
|
|
1. `state layer`
|
|
- 保存对象状态
|
|
- 例如:`normal / hovered / locked / hidden / loading`
|
|
|
|
2. `logic layer`
|
|
- 处理点击、悬停、锁定、过滤、显隐切换
|
|
- 不直接关心 Three.js 具体材质怎么改
|
|
|
|
3. `renderer layer`
|
|
- 根据状态更新 Three.js / HUD 外观
|
|
- 是最容易针对不同渲染引擎替换的一层
|
|
|
|
## Current Good Signals
|
|
|
|
当前已经接近这条方向的地方:
|
|
|
|
- cable 状态管理
|
|
- 部分 landing point 状态同步
|
|
- layer button 的统一状态入口
|
|
- tooltip / legend / info-card 开始朝状态驱动靠拢
|
|
|
|
## Next Steps
|
|
|
|
### 1. Standardize object state enums
|
|
|
|
优先为这些对象建立更稳定的状态语义:
|
|
|
|
- cables
|
|
- satellites
|
|
- landing points
|
|
- BGP markers
|
|
- media / news 面板入口按钮
|
|
|
|
### 2. Unify state-to-visual adapters
|
|
|
|
为各模块建立更清晰的渲染适配函数,例如:
|
|
|
|
- `applyCableVisualState()`
|
|
- `applySatelliteVisualState()`
|
|
- `applyBGPVisualState()`
|
|
|
|
要求:
|
|
|
|
- 逻辑层只改状态
|
|
- 视觉层负责把状态映射到材质、透明度、发光、尺寸、文字
|
|
|
|
### 3. Separate Earth UI state from render state
|
|
|
|
HUD / 面板 / 图层按钮状态也需要和渲染状态分离:
|
|
|
|
- `loading`
|
|
- `active`
|
|
- `locked`
|
|
- `hidden`
|
|
- `error`
|
|
|
|
不要再让 UI 通过“猜渲染结果”推导业务状态。
|
|
|
|
### 4. Prepare migration-safe boundaries
|
|
|
|
后续如果做 UE / Cesium 客户端,尽量保留:
|
|
|
|
- 状态枚举
|
|
- 交互规则
|
|
- 数据层接口
|
|
|
|
只替换:
|
|
|
|
- Three.js 具体渲染实现
|
|
- HUD 展示实现
|
|
|
|
## Practical Rule
|
|
|
|
后续 Earth 新功能开发时,优先问三个问题:
|
|
|
|
1. 这个状态由谁持有?
|
|
2. 这个交互逻辑在哪一层处理?
|
|
3. 这个视觉变化是否能在不改逻辑的情况下单独替换?
|
|
|
|
如果答不上来,就说明还在把状态、逻辑、渲染揉在一起。
|