feat(render): phase 0 — render-mode pick_list + 3-flag pipeline plumbing

Replaces the binary Wireframe/Solid toggle with a 7-mode dropdown
that maps onto acadrust's `ViewportRenderMode` enum: Wireframe 2D /
Wireframe 3D / Hidden Line / Flat Shaded / Gouraud Shaded / Flat
Shaded + Edges / Gouraud Shaded + Edges. Per-tab state lives on
`DocumentTab::render_mode`; the old `SetWireframe` message forwards
to `SetRenderMode` so the ribbon + WIREFRAME / SOLID command line
keep working.

`scene::render::render_mode_flags()` translates the mode into three
pipeline-facing booleans (`face3d_fill`, `mesh_fill`,
`show_3d_edges`); `mesh_fill` / `show_3d_edges` are stubs that the
upcoming phases will consume. `Primitive` carries the derived
`view_wireframe` plus the two new fields through to `prepare()`.

`Pipeline::upload_face3d` takes a `wireframe_only` flag that drops
3DFACE quad fills (built from `key_vertices`) while keeping the
`all_wires.fill_tris` channel — that channel carries text-LOD greek
rectangles and PolyfaceMesh face triangles which must stay visible
in wireframe mode. 3DFACE edges stay on regardless of mode.

Solid3D mesh wireframe rendering, Hidden Line z-prepass, and Flat /
Gouraud shader uniforms come in phases 1–4.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Hakan SevenandClaude Opus 4.7 committed 2026-05-27 00:08:37 +03:00
1 parent 5ea996d5fe
commit 2145ab8a66
8 files changed
+273 -90

No files matched your search

+37 -12
View File
@@ -20,14 +20,20 @@ pub struct ViewportPane<'a> {
pub scene: &'a Scene,
pub mode: ViewportPaneMode,
pub show_viewcube: bool,
pub render_mode: acadrust::entities::ViewportRenderMode,
}
impl<'a> ViewportPane<'a> {
pub fn model(scene: &'a Scene, show_viewcube: bool) -> Self {
pub fn model(
scene: &'a Scene,
show_viewcube: bool,
render_mode: acadrust::entities::ViewportRenderMode,
) -> Self {
Self {
scene,
mode: ViewportPaneMode::Model,
show_viewcube,
render_mode,
}
}
@@ -39,6 +45,7 @@ impl<'a> ViewportPane<'a> {
scene,
mode: ViewportPaneMode::Paper { handle },
show_viewcube: false,
render_mode: acadrust::entities::ViewportRenderMode::Wireframe2D,
}
}
}
@@ -52,11 +59,20 @@ impl<'a> ViewportPane<'a> {
pub struct PaperViewportPane<'a> {
pub scene: &'a Scene,
pub handle: Handle,
pub render_mode: acadrust::entities::ViewportRenderMode,
}
impl<'a> PaperViewportPane<'a> {
pub fn new(scene: &'a Scene, handle: Handle) -> Self {
Self { scene, handle }
pub fn new(
scene: &'a Scene,
handle: Handle,
render_mode: acadrust::entities::ViewportRenderMode,
) -> Self {
Self {
scene,
handle,
render_mode,
}
}
}
@@ -71,7 +87,12 @@ impl<'a, Msg: std::fmt::Debug + Clone> shader::Program<Msg> for PaperViewportPan
bounds: Rectangle,
) -> Self::Primitive {
self.scene
.build_active_viewport_primitive(self.handle, state.hover_region, bounds)
.build_active_viewport_primitive(
self.handle,
state.hover_region,
bounds,
self.render_mode,
)
}
fn update(
@@ -109,14 +130,18 @@ impl<'a, Msg: std::fmt::Debug + Clone> shader::Program<Msg> for ViewportPane<'a>
bounds: Rectangle,
) -> Self::Primitive {
match &self.mode {
ViewportPaneMode::Model => {
self.scene
.build_primitive(state.hover_region, bounds, self.show_viewcube)
}
ViewportPaneMode::Paper { handle } => {
self.scene
.build_viewport_primitive(*handle, state.hover_region, bounds)
}
ViewportPaneMode::Model => self.scene.build_primitive(
state.hover_region,
bounds,
self.show_viewcube,
self.render_mode,
),
ViewportPaneMode::Paper { handle } => self.scene.build_viewport_primitive(
*handle,
state.hover_region,
bounds,
self.render_mode,
),
}
}