fix(render): hide PolyfaceMesh outline edges in shaded modes
PolyfaceMesh / PolygonMesh için outline edges WireModel.points üzerinden gpu_wires'a giriyor; bu nedenle FlatShaded / GouraudShaded modlarında shaded yüzeyin üstünde görünmeye devam ediyordu. WireGpu artık kaynak WireModel'da fill_tris doluysa 'is_3d_mesh_edge' bayrağını set ediyor; wire pass'i show_3d_edges=false iken bu instance'ları atlıyor. *WithEdges, Wireframe ve HiddenLine modları show_3d_edges=true ile geliyor — mesh kenarları orada görünür kalır. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
132efe6574
commit
3a64f98755
2 changed files with 18 additions and 0 deletions
|
|
@ -1394,6 +1394,15 @@ impl Pipeline {
|
||||||
if wire.instance_count == 0 {
|
if wire.instance_count == 0 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// PolyfaceMesh / PolygonMesh outline edges live in
|
||||||
|
// `gpu_wires` (their `WireModel` has both `points` and
|
||||||
|
// `fill_tris`). In FlatShaded / GouraudShaded the user
|
||||||
|
// wants a clean shaded surface, so the wire pass skips
|
||||||
|
// these instances; the *WithEdges and pure wireframe
|
||||||
|
// modes leave the flag at true and draw them.
|
||||||
|
if !show_3d_edges && wire.is_3d_mesh_edge {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
match self.wire_pixel_scissors.get(i) {
|
match self.wire_pixel_scissors.get(i) {
|
||||||
Some(Some([x, y, w, h])) => {
|
Some(Some([x, y, w, h])) => {
|
||||||
pass.set_scissor_rect(*x, *y, *w, *h);
|
pass.set_scissor_rect(*x, *y, *w, *h);
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,12 @@ pub struct WireGpu {
|
||||||
/// Paper-space bbox [x0, y0, x1, y1] for GPU scissor clipping.
|
/// Paper-space bbox [x0, y0, x1, y1] for GPU scissor clipping.
|
||||||
/// Set only for viewport-projected wires; None for regular wires.
|
/// Set only for viewport-projected wires; None for regular wires.
|
||||||
pub vp_scissor: Option<[f32; 4]>,
|
pub vp_scissor: Option<[f32; 4]>,
|
||||||
|
/// `true` when the source `WireModel` also carries `fill_tris`
|
||||||
|
/// (i.e. it is a 3D mesh face — PolyfaceMesh / PolygonMesh — whose
|
||||||
|
/// outline lives in `points`). The wire pass skips these instances
|
||||||
|
/// in shaded modes so the surface reads as a clean solid; pure
|
||||||
|
/// wireframe / HiddenLine / *WithEdges modes draw them.
|
||||||
|
pub is_3d_mesh_edge: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Expand one `WireModel` into its per-segment instance stream (1 instance per
|
/// Expand one `WireModel` into its per-segment instance stream (1 instance per
|
||||||
|
|
@ -225,6 +231,7 @@ impl WireGpu {
|
||||||
pub fn new(device: &wgpu::Device, wire: &WireModel) -> Self {
|
pub fn new(device: &wgpu::Device, wire: &WireModel) -> Self {
|
||||||
let mut g = Self::build(device, wire, wire.color);
|
let mut g = Self::build(device, wire, wire.color);
|
||||||
g.vp_scissor = wire.vp_scissor;
|
g.vp_scissor = wire.vp_scissor;
|
||||||
|
g.is_3d_mesh_edge = !wire.fill_tris.is_empty();
|
||||||
g
|
g
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -273,6 +280,7 @@ impl WireGpu {
|
||||||
instance_buffer,
|
instance_buffer,
|
||||||
instance_count: chunk.len() as u32,
|
instance_count: chunk.len() as u32,
|
||||||
vp_scissor: None,
|
vp_scissor: None,
|
||||||
|
is_3d_mesh_edge: false,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
|
@ -287,6 +295,7 @@ impl WireGpu {
|
||||||
instance_buffer,
|
instance_buffer,
|
||||||
instance_count: instances.len() as u32,
|
instance_count: instances.len() as u32,
|
||||||
vp_scissor: None,
|
vp_scissor: None,
|
||||||
|
is_3d_mesh_edge: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue