Add unlit rendering for M2 glow/additive batches

Batches with the M2 unlit material flag (0x01) or additive blend modes
(3+) now skip lighting, shadows, and fog, emitting texture color directly.
Fixes lantern glow quads appearing as dull transparent circles.
This commit is contained in:
Kelsi 2026-02-06 03:28:21 -08:00
parent fbeb14fc98
commit e01d80f4eb
2 changed files with 14 additions and 1 deletions

View file

@ -261,6 +261,7 @@ bool M2Renderer::initialize(pipeline::AssetManager* assets) {
uniform sampler2D uTexture;
uniform bool uHasTexture;
uniform bool uAlphaTest;
uniform bool uUnlit;
uniform float uFadeAlpha;
uniform vec3 uFogColor;
@ -293,6 +294,12 @@ bool M2Renderer::initialize(pipeline::AssetManager* assets) {
discard;
}
// Unlit path: emit texture color directly (glow effects, emissive surfaces)
if (uUnlit) {
FragColor = vec4(texColor.rgb, finalAlpha);
return;
}
vec3 normal = normalize(Normal);
vec3 lightDir = normalize(uLightDir);
@ -729,9 +736,10 @@ bool M2Renderer::loadModel(const pipeline::M2Model& model, uint32_t modelId) {
gpuModel.hasTextureAnimation = true;
}
// Store blend mode from material
// Store blend mode and flags from material
if (batch.materialIndex < model.materials.size()) {
bgpu.blendMode = model.materials[batch.materialIndex].blendMode;
bgpu.materialFlags = model.materials[batch.materialIndex].flags;
}
// Resolve texture: batch.textureIndex → textureLookup → allTextures
@ -1298,6 +1306,10 @@ void M2Renderer::render(const Camera& camera, const glm::mat4& view, const glm::
glDepthMask(GL_FALSE);
}
// Unlit: material flag 0x01 or additive/mod blend modes
bool unlit = (batch.materialFlags & 0x01) != 0 || batch.blendMode >= 3;
shader->setUniform("uUnlit", unlit);
bool hasTexture = (batch.texture != 0);
shader->setUniform("uHasTexture", hasTexture);
shader->setUniform("uAlphaTest", batch.blendMode == 1);