87 lines
2.3 KiB
Markdown
87 lines
2.3 KiB
Markdown
# MeshRendererComponent::Deserialize
|
||
|
||
反序列化材质槽和渲染标志。
|
||
|
||
```cpp
|
||
void Deserialize(std::istream& is) override;
|
||
```
|
||
|
||
## 当前实现行为
|
||
|
||
当前实现会先:
|
||
|
||
1. 调用 `ClearMaterials()`
|
||
2. 把默认值重置为:
|
||
- `castShadows = true`
|
||
- `receiveShadows = true`
|
||
- `renderLayer = 0`
|
||
|
||
然后只解析:
|
||
|
||
- `materialPaths=<path0|path1|...>`
|
||
- `materialRefs=<guid,localId,resourceType|...>`
|
||
- `castShadows`
|
||
- `receiveShadows`
|
||
- `renderLayer`
|
||
|
||
## 恢复顺序
|
||
|
||
### 1. 某槽位 `materialRef` 有效
|
||
|
||
这是当前项目材质恢复的主路径。
|
||
|
||
当前会先保存 `m_materialRefs[i] = pendingMaterialRefs[i]`,然后分两种情况:
|
||
|
||
- 若 `ResourceManager::IsDeferredSceneLoadEnabled()` 为真
|
||
- 先尝试 `TryResolveAssetPath(materialRef, resolvedPath)`
|
||
- 成功时只恢复 `m_materialPaths[i] = resolvedPath`
|
||
- 不立即同步加载材质
|
||
- 若不在 deferred 模式,或 deferred 下未成功解析路径
|
||
- 直接 `Load<Material>(pendingMaterialRef)`
|
||
- 成功时从句柄反写 `m_materialPaths[i]`
|
||
|
||
### 2. 某槽位 `materialRef` 无效
|
||
|
||
这时只剩路径回退分支:
|
||
|
||
- 若 `m_materialPaths[i]` 不是 virtual scheme,当前会直接清空该路径
|
||
- 若是 virtual scheme 且处于 deferred 模式,则只保留路径
|
||
- 若是 virtual scheme 且不在 deferred 模式,则调用 [SetMaterialPath](SetMaterialPath.md) 走同步加载
|
||
|
||
## 已删除的旧心智
|
||
|
||
这页当前必须明确:
|
||
|
||
- 不再读取历史 `materials=` 键
|
||
- 不再把“没有 `AssetRef` 的普通项目路径”当作正式项目材质恢复协议
|
||
|
||
因此像下面这种旧式数据:
|
||
|
||
```text
|
||
materialPaths=Assets/runtime.material;materialRefs=;
|
||
```
|
||
|
||
当前恢复后,这个普通路径会被清掉,而不是继续被保留。
|
||
|
||
## 与 deferred scene load 的关系
|
||
|
||
在 deferred 模式下,反序列化阶段通常只恢复:
|
||
|
||
- `m_materialRefs`
|
||
- `m_materialPaths`
|
||
|
||
真正材质句柄的兑现,往往留到后续:
|
||
|
||
- [GetMaterial](GetMaterial.md)
|
||
- [GetMaterialHandle](GetMaterialHandle.md)
|
||
|
||
这些访问器第一次被调用时,内部才会启动或收口异步材质加载。
|
||
|
||
## 相关文档
|
||
|
||
- [返回类型总览](MeshRendererComponent.md)
|
||
- [Serialize](Serialize.md)
|
||
- [GetMaterial](GetMaterial.md)
|
||
- [GetMaterialHandle](GetMaterialHandle.md)
|
||
- [GetMaterialAssetRefs](GetMaterialAssetRefs.md)
|