render/(云 / 全景 / 天气 / 选框 / 自发光贴图)

基本信息

属性 值
目录 com.gtnewhorizons.angelica.render
文件数 16(全部单层)
总行数 4424
性质 包可见性混合:4 个 public,11 个包私有 final class

它解决什么问题

Angelica 把原版 1.7.10 的五套渲染路径换成了 GPU 驱动版本:云的体素化网格、全景图的模糊后处理、雨雪的 GPU 实例化、方块选框的着色器描边、以及自发光贴图的自动登记。全部依赖 GLSM 的状态跟踪与 core profile 兼容层。

16 个文件全清单(集合运算)

A. 云渲染(10 个,3247 行)

# 文件 行数 可见性 角色
1 CloudVertexMesh.java 971 包私有 final 云的顶点网格构建与 VAO 维护(本子系统最大)
2 CloudLayerRenderer.java 713 包私有 final 单个云层的绘制。文件头为 Forge 1.12 LGPL 2.1 回移
3 CloudFaceMesh.java 325 包私有 final 面的网格与 GL buffer 维护
4 CloudRenderer.java 220 public 云渲染总控,实现 IResourceManagerReloadListener。同为 Forge 1.12 LGPL 回移
5 CloudShape.java 193 包私有 final 读 clouds.png、判云格、贪心矩形合并为「板」、边缘合并为墙
6 CloudPlateCover.java 179 包私有 final 落入圆盘内的「板」矩形
7 CloudDisc.java 139 包私有 final 圆盘形状、楔形切分、几何构建阈值
8 CloudRenderResources.java 118 包私有 final GL program / shader / 纹理资源
9 CloudUniforms.java 112 包私有 final 两个云 program 共用的 uniform 句柄
10 CloudView.java 77 包私有 final 每帧的相机朝向/偏移/pixelsPerRadian 推导

B. 全景图(1 个)

# 文件 行数 可见性 角色
11 PanoramaRenderer.java 346 public 菜单全景图的模糊着色器后处理

C. 天气(2 个)

# 文件 行数 可见性 角色
12 WeatherRenderer.java 528 public 雨雪的 GPU 实例化渲染
13 WeatherColumns.java 213 public 逐列雨雪数据采样缓存(WeakReference<WorldClient>)

D. 方块选框(1 个)

# 文件 行数 可见性 角色
14 SelectionBoxRenderer.java 157 public final 选框的着色器描边

E. 自发光贴图(2 个)

# 文件 行数 可见性 角色
15 EmissiveTextureAutoloader.java 79 public 监听 TextureStitchEvent 自动登记自发光贴图
16 EmissiveTextureHelper.java 54 public final @SideOnly(CLIENT),自发光判定与缓存

关键常量(源码实值)

常量 值 位置
CloudDisc.CELLS_PER_CHUNK 8 CloudDisc.java:6
CloudDisc.MARGIN_CELLS 16 CloudDisc.java:7
CloudDisc.WEDGE_COUNT 32 CloudDisc.java:8
CloudDisc.WEDGES_PER_RADIAN WEDGE_COUNT / (2.0 * Math.PI) CloudDisc.java:9
CloudUniforms.ALPHA 0.8f CloudUniforms.java:6
CloudShape.OPAQUE 1 << 4 CloudShape.java:6
CloudShape.WEST_EMPTY 1 CloudShape.java:7
CloudShape.EAST_EMPTY 1 << 1 CloudShape.java:8
CloudShape.NORTH_EMPTY 1 << 2 CloudShape.java:9

CloudShape 用位掩码记录每格的 4 面暴露情况:第 0~3 位分别是 WEST/EAST/NORTH/SOUTH_EMPTY,第 4 位(1 << 4)是 OPAQUE。

配置门控

配置字段 默认 影响的文件 行
AngelicaConfig.enableVBOClouds 见配置文件 CloudRenderer、CloudLayerRenderer 等 A 组 AngelicaConfig.java:64
AngelicaConfig.enablePanoramaBlurShader 见配置文件 PanoramaRenderer AngelicaConfig.java:59
AngelicaConfig.enableInstancedWeather 见配置文件 WeatherRenderer、WeatherColumns AngelicaConfig.java:68

enableDynamicLights 门控 WeatherColumns 之外的部分:Weather 渲染会与动态光源交互(见下)。

入口点(引用点集合运算)

类 引用位置 说明
CloudRenderer ClientProxy.java:66(import) 资源重载监听器注册
EmissiveTextureAutoloader ClientProxy.java:139 MinecraftForge.EVENT_BUS.register(new EmissiveTextureAutoloader()) 唯一确认的显式实例化点
WeatherRenderer CeleritasWorldRenderer.java:55(import) 由世界渲染器驱动
PanoramaRenderer 无实例化点 —
SelectionBoxRenderer 无实例化点 —

PanoramaRenderer 与 SelectionBoxRenderer 在主源码树内找不到 new 调用点,可能由 mixin 直接调用静态方法或在本仓库外被驱动 —— 本仓库不可判定。

上游依赖(关键:并非全是 Angelica 自己的代码)

上游 被哪些文件 import 说明
Forge 1.12(LGPL 2.1 回移) CloudRenderer.java:1-13、CloudLayerRenderer.java:1-13 两个文件头部是完整的 Forge 1.12 LGPL 2.1 版权声明,注明「Backported from Minecraft Forge 1.12」
Sodium / Embeddium 派生(org.embeddedt.embeddium.impl.*) CloudRenderResources、CloudUniforms、PanoramaRenderer、SelectionBoxRenderer GL program/shader/uniform 基础设施
Iris(net.irisshaders.iris.api.v0.IrisApi) SelectionBoxRenderer 着色器存在性判定
NotFine(jss.notfine.core.SettingsManager) WeatherRenderer 天气设置读取
DragonAPI 兼容层 WeatherRenderer compat.dragonapi.DragonAPICompat
GLSM(本 mod 子项目) 几乎全部 GLStateManager、Tracy、FFP instancing/VAO
gtnhlib CloudVertexMesh MemoryUtilities、IVertexArrayObject、DefaultVertexFormat

这是幻觉高发区:本目录 16 个文件里,只有 WeatherColumns、EmissiveTextureHelper、SelectionBoxRenderer 等少数是 Angelica 原创;CloudRenderer 与 CloudLayerRenderer 是 Forge 1.12 的 LGPL 回移代码,不是 Angelica 自己的实现。

已知问题

  1. PanoramaRenderer / SelectionBoxRenderer 入口不可判定(见上):无法从本仓库确认它们的生命周期。
  2. 两个云文件是第三方回移代码:CloudRenderer 与 CloudLayerRenderer 上游是 Forge 1.12 的云渲染器。1.7.10 的 IWorldProvider.getCloudHeight 语义与 1.12 不同,回移时必然有适配改动,但文件内没有标注哪些行是 Angelica 自己加的(只有整体版权头)。审阅时无法区分。
  3. 对外 API 泄漏上游包名:org.embeddedt.embeddium.impl.* 出现在 4 个文件里(见 API 层 同类问题)。
  4. CloudShape 的位掩码只定义了 4 个常量:定义了 WEST/EAST/NORTH_EMPTY 与 OPAQUE,但 CloudShape.java:9 之后(SOUTH_EMPTY)在本轮读取范围内未确认;CloudShape.java:10 起还有更多常量。位掩码布局依赖常量定义顺序,缺一项就会改变语义。
  5. 11/16 是包私有 final class:外部 mod 无法直接复用云/天气/选框的内部实现。若要扩展只能走 api/(目前 api/clouds/ 只有 2 个文件)。
  6. WeatherRenderer 依赖 3 个不同子系统:GLSM FFP(instancing/VAO)、NotFine 设置、DragonAPI 兼容层,外加 AngelicaConfig 与 SystemProperties。是全目录耦合最重的文件。

相关条目