梯度渲染

作用

把服务端算出的压强梯度同步到客户端并直接绘制成半透明彩色体积,是 pV=nRT 唯一的可视化输出。

链路

EBSGasTracker.tick()
  └─ GradientTracker.UPDATE_GRADIENTS.sendToPlayer(player, new GradientUpdate(x, y, z, gradients))
       └─ 网络:pvnrt:update-gradients(服务端 → 客户端)
            └─ GradientTracker.onGradientsUpdated()
                 └─ GradientRenderer.instance.onGradientsUpdated(update)

EBSGasTracker.java:107 与 :126 两处发送梯度,取决于是否含梯度缓冲。

唯一的数据包

GradientTracker.UPDATE_GRADIENTS(pvnrt/gradient/GradientTracker.java:8)是全 mod 唯一一个具体的 PVNRTActionWithPayload 实例。它序列化为:

  1. writeInt(ebsX) / writeInt(ebsY) / writeInt(ebsZ) —— 目标 EBS 坐标
  2. buffer().encode(buffer) —— GradientBuffer 本体

渲染实现

GradientRenderer(pvnrt/gradient/GradientRenderer.java)持有单例 instance,内部为每个待渲染的 EBS 维护一个 StreamingVertexBuffer(顶点格式 POSITION_TEXTURE_COLOR,绘制模式 GL_QUADS,GradientRenderer.java:71)。StreamingVertexBuffer 实现 AutoCloseable,直接操作 VBO。

pvnrt.gradient 包的其余类:GradientBuffer(GPU 侧梯度缓冲)、IGradientBuffer、GradientUpdate(EBS 坐标 + 缓冲的记录类型)。

该包整体没有 @SideOnly 标注,客户端类(StreamingVertexBuffer 直接引用 GL11 / DefaultVertexFormat)依赖 pvnrt.mixin.Mixin 枚举里没有客户端专属 mixin 这一事实,实际由 GradientTracker 只在客户端回调来隔离。

相关条目