From 5c47ad5aaeb8a51bdb9089d4ea7264b34fa0fdfa Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 7 Jun 2026 08:06:01 +0900 Subject: [PATCH] SealEngine: Implement ZWrite .opr attribute --- src/3d/3d_internal.h | 1 + src/3d/parser.c | 9 +++++++++ src/3d/renderer.c | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/src/3d/3d_internal.h b/src/3d/3d_internal.h index 131f199..cddaedd 100644 --- a/src/3d/3d_internal.h +++ b/src/3d/3d_internal.h @@ -664,6 +664,7 @@ enum mesh_flags { MESH_NO_HEIGHT_DETECTION = 1 << 7, MESH_ALPHA = 1 << 8, MESH_HAS_LIGHT_UV = 1 << 9, + MESH_NO_ZWRITE = 1 << 10, }; struct pol_mesh { diff --git a/src/3d/parser.c b/src/3d/parser.c index 08eba45..7cce082 100644 --- a/src/3d/parser.c +++ b/src/3d/parser.c @@ -620,6 +620,15 @@ void opr_load(uint8_t *data, size_t size, struct pol *pol) } else { WARNING("invalid HeightDetection: %s", s); } + } else if (sscanf(line, "ZWrite = %s", s) == 1) { + if (!strcmp(s, "false")) { + for (int i = 0; i < pol->nr_meshes; i++) { + if (!selected[i]) continue; + pol->meshes[i]->flags |= MESH_NO_ZWRITE; + } + } else if (strcmp(s, "true")) { + WARNING("invalid ZWrite: %s", s); + } } else if (sscanf(line, "UVScroll = ( %f , %f )", &f1, &f2) == 2) { for (int i = 0; i < pol->nr_meshes; i++) { if (!selected[i]) continue; diff --git a/src/3d/renderer.c b/src/3d/renderer.c index 2948fa5..4077a5f 100644 --- a/src/3d/renderer.c +++ b/src/3d/renderer.c @@ -506,12 +506,16 @@ static void render_model(struct RE_instance *inst, struct RE_renderer *r, enum d if (mesh->flags & MESH_BOTH) glDisable(GL_CULL_FACE); + if (mesh->flags & MESH_NO_ZWRITE) + glDepthMask(GL_FALSE); if (mesh->nr_indices) glDrawElements(GL_TRIANGLES, mesh->nr_indices, GL_UNSIGNED_SHORT, NULL); else glDrawArrays(GL_TRIANGLES, 0, mesh->nr_vertices); + if (mesh->flags & MESH_NO_ZWRITE) + glDepthMask(GL_TRUE); if (mesh->flags & MESH_BOTH) glEnable(GL_CULL_FACE); glBindVertexArray(0);