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。

相关条目

源码

  • src/main/java/com/mitchej123/supernova/light/engine/ScalarBlockEngine.java
  • src/main/java/com/mitchej123/supernova/light/engine/ScalarSkyEngine.java
  • 实例化:src/main/java/com/mitchej123/supernova/light/WorldLightManager.java:74-75