Scalar Engines
基本信息
ScalarBlockEngine / ScalarSkyEngine —— 单通道(无彩)光照的两个
可执行引擎实现,对应 Supernova Config 的
lightingMode = SCALAR。
| 类 | 文件 | 行 | 继承 | super(isSky, …) |
|---|---|---|---|---|
ScalarBlockEngine |
light/engine/ScalarBlockEngine.java |
434 | SupernovaEngine |
super(false, world)(:27) |
ScalarSkyEngine |
light/engine/ScalarSkyEngine.java |
643 | SupernovaEngine |
super(true, world)(:20) |
二者直接继承抽象基类
SupernovaEngine, 不经过中间层SupernovaRGBEngine(对比 RGB Engines)。
实例化点
两者的构造都在 World Light Manager 的
工厂 lambda 里,由 SupernovaConfig.isScalarMode() 三元选择:
| 位置 | 代码 |
|---|---|
:74 |
hasSkyLight ? (isScalarMode() ? () -> new ScalarSkyEngine(world) : () -> new SupernovaSkyEngine(world, loadedChunkMap)) : null |
:75 |
hasBlockLight ? (isScalarMode() ? () -> new ScalarBlockEngine(world, dynamicEmission) : () -> new SupernovaBlockEngine(world, loadedChunkMap, dynamicEmission)) : null |
null 工厂 = 该维度不需要这条 lane(纯维度 hasSkyLight=false 时天光引擎为空)。
队列容量差异
两个引擎的 BFS 队列长度不同:
| 引擎 | 队列 | 依据 |
|---|---|---|
ScalarSkyEngine |
1 << 18(256K)× 2 |
源码注释:sky BFS covers far more blocks than block light |
ScalarBlockEngine |
走基类默认 | 同上 |
ScalarSkyEngine 另有 nullPropagationCheckCache(boolean[],
长度 WorldUtil.getTotalLightSections())用于空传播检查缓存;
ScalarBlockEngine 无此字段。
动态发光:降维处理
ScalarBlockEngine.emissionAt(...) 拿到的是 0x0R0G0B 打包色,
但单通道引擎只能用一个亮度值。源码取各通道最大值:
if (dynamicEmission != null && LightColorRegistry.isPositional(blockId)) {
final Integer sampled = this.dynamicEmission.get(x, y, z);
if (sampled != null) return PackedColorLight.maxComponent(sampled);
}
return block.getLightValue() & 0xF;
即位置相关方块读动态快照并压成单值;其余走原版 getLightValue() & 0xF。
静态注册色在此路径未被使用 —— 详见
Chunk Light Helper。
相关条目
- Supernova Engine — 抽象基类
- RGB Engines — 另一组实现
- Engine Internals
- World Light Manager — 工厂与 lane 调度
源码
src/main/java/com/mitchej123/supernova/light/engine/ScalarBlockEngine.javasrc/main/java/com/mitchej123/supernova/light/engine/ScalarSkyEngine.java- 实例化:
src/main/java/com/mitchej123/supernova/light/WorldLightManager.java:74-75