# BP_DataPoint 基类蓝图详细规格

## 蓝图信息

| 属性 | 值 |
|------|-----|
| 蓝图类型 | Actor |
| 父类 | `Actor` |
| 路径 | `Content/Blueprints/BP_DataPoint.uasset` |

## 组件列表

```
BP_DataPoint
├── SceneRoot (场景根)
│   ├── StaticMesh (基础网格 - 球体)
│   │   └── Material: M_DataPoint_Base
│   ├── NiagaraComponent (粒子光晕)
│   │   └── Niagara System: NS_DataPoint_Glow
│   ├── WidgetComponent (3D 标签)
│   │   └── User Widget: W_DataLabel
│   └── SpringArm (弹簧臂 - 用于相机聚焦)
│       └── CameraComponent
```

## 变量列表

| 变量名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `DataId` | String | `""` | 唯一标识 |
| `Name` | String | `"Unknown"` | 显示名称 |
| `Source` | String | `"unknown"` | 数据源 |
| `DataType` | String | `"point"` | 数据类型 |
| `Latitude` | Float | `0.0` | 纬度 |
| `Longitude` | Float | `0.0` | 经度 |
| `Altitude` | Float | `100000.0` | 高度 (厘米) |
| `Country` | String | `""` | 国家 |
| `City` | String | `""` | 城市 |
| `Performance` | Float | `0.0` | 性能值 |
| `Metadata` | JsonObject | `{}` | 元数据 |
| `IsSelected` | Boolean | `false` | 是否选中 |
| `IsHovered` | Boolean | `false` | 是否悬停 |
| `BaseColor` | LinearColor | (1,1,1,1) | 基础颜色 |
| `HighlightColor` | LinearColor | (0,1,1,1) | 高亮颜色 |

## 材质参数

### M_DataPoint_Base

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `BaseColor` | Vector3 | (1,0,0) | 基础颜色 |
| `EmissiveStrength` | Float | `5.0` | 自发光强度 |
| `PulseSpeed` | Float | `1.0` | 脉冲速度 |
| `PulseIntensity` | Float | `0.5` | 脉冲强度 |
| `FresnelPower` | Float | `2.0` | 菲涅尔边缘强度 |

### NS_DataPoint_Glow (Niagara 参数)

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `User.Color` | LinearColor | (1,0,0,1) | 粒子颜色 |
| `User.Size` | Float | `1.0` | 粒子大小 |
| `User.Lifetime` | Float | `1.5` | 粒子寿命 |

## 函数

### Initialize (String InId, String InName, Float InLat, Float InLon)

```
1. [设置] DataId = InId
2. [设置] Name = InName
3. [设置] Latitude = InLat
4. [设置] Longitude = InLon
5. [调用] UpdatePosition()
6. [调用] UpdateLabel()
```

### UpdatePosition

```
1. [创建] FGeographicPoint (Latitude, Longitude, Altitude)
2. [调用] GeoUtils.LatLonToUEPosition(Point)
   └─ 返回: UELocation (Vector3)
3. [设置] StaticMesh.SetRelativeLocation(UELocation)
4. [设置] NiagaraComponent.SetRelativeLocation(UELocation)
5. [设置] WidgetComponent.SetRelativeLocation(UELocation + (0,0,200))
```

### UpdateData (Struct NewData)

```
1. [解析] NewData
2. [设置] DataId = NewData["id"]
3. [设置] Name = NewData["name"]
4. [设置] Latitude = NewData["location"]["latitude"]
5. [设置] Longitude = NewData["location"]["longitude"]
6. [可选] [设置] Performance = NewData["performance"]
7. [可选] [设置] Country = NewData["country"]
8. [调用] UpdatePosition()
9. [调用] UpdateLabel()
10. [调用] UpdateMaterial()
```

### UpdateLabel

```
1. [获取] W_DataLabel Widget Reference
2. [设置] NameText = Name
3. [设置] CountryText = Country
4. [设置] PerformanceText = FormatPerformance(Performance)
```

### UpdateMaterial

```
1. [获取] StaticMesh.Material
2. [分支] Source
   ├─ "top500":
   │   └─ [设置] BaseColor = (1, 0.2, 0.2, 1)  红色
   ├─ "epoch_ai_gpu":
   │   └─ [设置] BaseColor = (1, 0.5, 0, 1)     橙色
   ├─ "huggingface_models":
   │   └─ [设置] BaseColor = (0.2, 0.5, 1, 1)   蓝色
   ├─ "peeringdb_ixp":
   │   └─ [设置] BaseColor = (0, 1, 0.5, 1)     青色
   ├─ "peeringdb_network":
   │   └─ [设置] BaseColor = (0.5, 0, 1, 1)     紫色
   └─ [默认]:
       └─ [设置] BaseColor = (1, 1, 1, 1)        白色
```

### FormatPerformance (Float Value) → String

```
1. [分支] Value >= 1000000
   ├─ [是]: 返回 = FString::Printf(TEXT("%.1f EFLOPS"), Value / 1000000)
   └─ [否]: [分支] Value >= 1000
       ├─ [是]: 返回 = FString::Printf(TEXT("%.1f PFLOPS"), Value / 1000)
       └─ [否]: 返回 = FString::Printf(TEXT("%.1f TFLOPS"), Value)
```

## 事件

### OnBeginCursorOver

```
1. [设置] IsHovered = true
2. [调用] SetHighlight(true)
3. [调用] PlayHoverEffect()
```

### OnEndCursorOver

```
1. [设置] IsHovered = false
2. [分支] IsSelected == false
   └─ [调用] SetHighlight(false)
```

### OnClicked

```
1. [调用] SetSelected(true)
2. [调用] BP_GlobeController.OnDataPointSelected(Self)
3. [调用] PlayClickEffect()
```

### SetHighlight (Boolean bHighlight)

```
1. [获取] NiagaraComponent
2. [分支] bHighlight == true
   ├─ [设置] User.Color = HighlightColor
   └─ [否则]:
       ├─ [设置] User.Color = BaseColor
3. [调用] NiagaraComponent.Activate(bHighlight)
```

### SetSelected (Boolean bSelected)

```
1. [设置] IsSelected = bSelected
2. [分支] bSelected == true
   ├─ [设置] StaticMesh.Scale = (1.5, 1.5, 1.5)
   ├─ [调用] SetHighlight(true)
   └─ [设置] SelectedRing.Visible = true
└─ [否则]:
    ├─ [设置] StaticMesh.Scale = (1.0, 1.0, 1.0)
    ├─ [分支] IsHovered == true
    │   └─ [调用] SetHighlight(true)
    └─ [设置] SelectedRing.Visible = false
```

### PlayHoverEffect

```
1. [播放] Niagara Particle Burst
   └─ 粒子数量: 20
```

### PlayClickEffect

```
1. [播放] Sound Effect "DataPoint_Click"
2. [播放] Timeline "PulseEffect"
   └─ 持续时间: 0.5秒
```

## 事件调度器

| 事件调度器 | 参数 | 说明 |
|------------|------|------|
| `OnPointSelected` | BP_DataPoint | 点被选中 |
| `OnPointHovered` | BP_DataPoint | 鼠标悬停 |
| `OnPointClicked` | BP_DataPoint | 点击 |

## 数据格式

### 输入数据结构

```json
{
  "id": "top500_1",
  "name": "Frontier",
  "source": "top500",
  "data_type": "supercomputer",
  "location": {
    "latitude": 33.7756,
    "longitude": -84.3962,
    "altitude": 0
  },
  "country": "US",
  "city": "Atlanta",
  "performance": 1682.65,
  "metadata": {
    "cores": 8730112,
    "memory": "5.67 PB",
    "power": "29.0 MW"
  }
}
```

## 颜色编码

| 数据源 | 颜色 | RGB | 说明 |
|--------|------|-----|------|
| top500 | 🔴 红色 | (1.0, 0.2, 0.2) | TOP500 超算 |
| epoch_ai_gpu | 🟠 橙色 | (1.0, 0.5, 0.0) | GPU 集群 |
| huggingface_models | 🔵 蓝色 | (0.2, 0.5, 1.0) | HuggingFace 模型 |
| peeringdb_ixp | 🩵 青色 | (0.0, 1.0, 0.8) | IXP 互联网交换中心 |
| peeringdb_network | 🟣 紫色 | (0.6, 0.0, 1.0) | 网络运营商 |
| peeringdb_facility | 🟤 棕色 | (0.6, 0.4, 0.2) | 数据中心 |
| teleegeography_cables | 🟡 黄色 | (1.0, 0.8, 0.0) | 海底光缆 |

## 缩放比例

| 性能范围 | 缩放 | 说明 |
|----------|------|------|
| < 1 PFLOPS | 0.5x | 小型系统 |
| 1-100 PFLOPS | 1.0x | 中型系统 |
| 100-1000 PFLOPS | 1.5x | 大型系统 |
| > 1 EFLOPS | 2.0x | 超大规模 |

## 粒子效果 (Niagara)

### NS_DataPoint_Glow

```
发射器设置:
├─ 发射器类型: 粒子系统
├─ 发射模式: 循环
├─ 发射速率: 30 粒子/秒
├─ 粒子寿命: 1.5 秒
└─ 粒子大小: 渐变 (小 → 大)

渲染设置:
├─ 渲染组件: Niagara 粒子
├─ 材质: M_Particle_Glow
├─ 混合模式: Additive
└─ 排序: 无

颜色渐变:
├─ 0%: (1, 1, 1, 1)
├─ 50%: (1, 1, 1, 0.8)
└─ 100%: (1, 1, 1, 0)
```
