git.lucas.co / cce-gallery
widget gallery and compositor test bench

commitc5f72edec2fa7d8bff3a6cb21621557041054a3d
parenta4e35dd20b
authorLucas Galante <[email protected]>
date2026-07-04 21:56
Implement dynamic bevel shading in push_bevel_slice_corners and straight edge rendering loops based on light_source_position

 src/main.rs | 171 ++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 104 insertions(+), 67 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 16998fd..d140037 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -185,6 +185,11 @@ fn push_bevel_slice_corners(
     }
     let segments = 32;
 
+    let light_angle = cce_ui::layout::light_source_position();
+    let rad = light_angle.to_radians();
+    let lx = rad.cos();
+    let ly = -rad.sin();
+
     let corners = [
         (wx + r, wy + r, std::f32::consts::PI, 1.5 * std::f32::consts::PI), // Top-Left
         (wx + ww - r, wy + r, 1.5 * std::f32::consts::PI, 2.0 * std::f32::consts::PI), // Top-Right
@@ -198,7 +203,7 @@ fn push_bevel_slice_corners(
             let theta2 = start_angle + ((j + 1) as f32) * (end_angle - start_angle) / (segments as f32);
             let theta_mid = 0.5 * (theta1 + theta2);
 
-            let factor = -(theta_mid.cos() + theta_mid.sin()).clamp(-1.0, 1.0);
+            let factor = (theta_mid.cos() * lx + theta_mid.sin() * ly).clamp(-1.0, 1.0);
             let offset = factor * color_offset;
 
             let segment_color = [
@@ -767,24 +772,32 @@ cascades in cce."
                                 let d_h = h_inner - h_outer;
                                 let color_offset = d_h * 0.4;
                                 
-                                let light_color = [
-                                    (border_color[0] + color_offset).clamp(0.0, 1.0),
-                                    (border_color[1] + color_offset).clamp(0.0, 1.0),
-                                    (border_color[2] + color_offset).clamp(0.0, 1.0),
-                                    border_color[3]
-                                ];
-                                let dark_color = [
-                                    (border_color[0] - color_offset).clamp(0.0, 1.0),
-                                    (border_color[1] - color_offset).clamp(0.0, 1.0),
-                                    (border_color[2] - color_offset).clamp(0.0, 1.0),
-                                    border_color[3]
-                                ];
-                                let offset = idx as f32 * slice_w;
-                                let r_offset = (r - offset).max(0.0);
-                                verts.extend(quad_vertices(wx + r_offset, wy + offset, ww - 2.0 * r_offset, slice_w, sw, sh, light_color));
-                                verts.extend(quad_vertices(wx + offset, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, light_color));
-                                verts.extend(quad_vertices(wx + r_offset, wy + wh - offset - slice_w, ww - 2.0 * r_offset, slice_w, sw, sh, dark_color));
-                                verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, dark_color));
+                                 let light_angle = cce_ui::layout::light_source_position();
+                                 let rad = light_angle.to_radians();
+                                 let lx = rad.cos();
+                                 let ly = -rad.sin();
+                                 
+                                 let c_offset = |factor: f32| -> [f32; 4] {
+                                     let o = factor * color_offset;
+                                     [
+                                         (border_color[0] + o).clamp(0.0, 1.0),
+                                         (border_color[1] + o).clamp(0.0, 1.0),
+                                         (border_color[2] + o).clamp(0.0, 1.0),
+                                         border_color[3]
+                                     ]
+                                 };
+                                 
+                                 let top_color = c_offset(-ly);
+                                 let left_color = c_offset(-lx);
+                                 let bottom_color = c_offset(ly);
+                                 let right_color = c_offset(lx);
+
+                                 let offset = idx as f32 * slice_w;
+                                 let r_offset = (r - offset).max(0.0);
+                                 verts.extend(quad_vertices(wx + r_offset, wy + offset, ww - 2.0 * r_offset, slice_w, sw, sh, top_color));
+                                 verts.extend(quad_vertices(wx + offset, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, left_color));
+                                 verts.extend(quad_vertices(wx + r_offset, wy + wh - offset - slice_w, ww - 2.0 * r_offset, slice_w, sw, sh, bottom_color));
+                                 verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, right_color));
 
                                 push_bevel_slice_corners(
                                     wx, wy, ww, wh,
@@ -808,23 +821,31 @@ cascades in cce."
                                 let d_h = h_inner - h_outer;
                                 let color_offset = d_h * 0.4;
                                 
-                                let light_color = [
-                                    (border_color[0] + color_offset).clamp(0.0, 1.0),
-                                    (border_color[1] + color_offset).clamp(0.0, 1.0),
-                                    (border_color[2] + color_offset).clamp(0.0, 1.0),
-                                    border_color[3]
-                                ];
-                                let dark_color = [
-                                    (border_color[0] - color_offset).clamp(0.0, 1.0),
-                                    (border_color[1] - color_offset).clamp(0.0, 1.0),
-                                    (border_color[2] - color_offset).clamp(0.0, 1.0),
-                                    border_color[3]
-                                ];
+                                 let light_angle = cce_ui::layout::light_source_position();
+                                 let rad = light_angle.to_radians();
+                                 let lx = rad.cos();
+                                 let ly = -rad.sin();
+                                 
+                                 let c_offset = |factor: f32| -> [f32; 4] {
+                                     let o = factor * color_offset;
+                                     [
+                                         (border_color[0] + o).clamp(0.0, 1.0),
+                                         (border_color[1] + o).clamp(0.0, 1.0),
+                                         (border_color[2] + o).clamp(0.0, 1.0),
+                                         border_color[3]
+                                     ]
+                                 };
+                                 
+                                 let top_color = c_offset(-ly);
+                                 let left_color = c_offset(-lx);
+                                 let bottom_color = c_offset(ly);
+                                 let right_color = c_offset(lx);
+                                 
                                 let offset = idx as f32 * slice_w;
-                                verts.extend(quad_vertices(wx + offset, wy + offset, ww - 2.0 * offset, slice_w, sw, sh, light_color));
-                                verts.extend(quad_vertices(wx + offset, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, light_color));
-                                verts.extend(quad_vertices(wx + offset, wy + wh - offset - slice_w, ww - 2.0 * offset, slice_w, sw, sh, dark_color));
-                                verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, dark_color));
+                                verts.extend(quad_vertices(wx + offset, wy + offset, ww - 2.0 * offset, slice_w, sw, sh, top_color));
+                                verts.extend(quad_vertices(wx + offset, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, left_color));
+                                verts.extend(quad_vertices(wx + offset, wy + wh - offset - slice_w, ww - 2.0 * offset, slice_w, sw, sh, bottom_color));
+                                verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, right_color));
                             }
                         } else {
                             verts.extend(quad_vertices(wx, wy, ww, t, sw, sh, border_color));
@@ -935,24 +956,32 @@ cascades in cce."
                             let d_h = h_inner - h_outer;
                             let color_offset = d_h * 0.4;
                             
-                            let light_color = [
-                                (border_color[0] + color_offset).clamp(0.0, 1.0),
-                                (border_color[1] + color_offset).clamp(0.0, 1.0),
-                                (border_color[2] + color_offset).clamp(0.0, 1.0),
-                                border_color[3]
-                            ];
-                            let dark_color = [
-                                (border_color[0] - color_offset).clamp(0.0, 1.0),
-                                (border_color[1] - color_offset).clamp(0.0, 1.0),
-                                (border_color[2] - color_offset).clamp(0.0, 1.0),
-                                border_color[3]
-                            ];
+                             let light_angle = cce_ui::layout::light_source_position();
+                             let rad = light_angle.to_radians();
+                             let lx = rad.cos();
+                             let ly = -rad.sin();
+                             
+                             let c_offset = |factor: f32| -> [f32; 4] {
+                                 let o = factor * color_offset;
+                                 [
+                                     (border_color[0] + o).clamp(0.0, 1.0),
+                                     (border_color[1] + o).clamp(0.0, 1.0),
+                                     (border_color[2] + o).clamp(0.0, 1.0),
+                                     border_color[3]
+                                 ]
+                             };
+                             
+                             let top_color = c_offset(-ly);
+                             let left_color = c_offset(-lx);
+                             let bottom_color = c_offset(ly);
+                             let right_color = c_offset(lx);
+                             
                             let offset = i as f32 * slice_w;
                             let r_offset = (r - offset).max(0.0);
-                            verts.extend(quad_vertices(wx + r_offset, wy + offset, ww - 2.0 * r_offset, slice_w, sw, sh, light_color));
-                            verts.extend(quad_vertices(wx + offset, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, light_color));
-                            verts.extend(quad_vertices(wx + r_offset, wy + wh - offset - slice_w, ww - 2.0 * r_offset, slice_w, sw, sh, dark_color));
-                            verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, dark_color));
+                            verts.extend(quad_vertices(wx + r_offset, wy + offset, ww - 2.0 * r_offset, slice_w, sw, sh, top_color));
+                            verts.extend(quad_vertices(wx + offset, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, left_color));
+                            verts.extend(quad_vertices(wx + r_offset, wy + wh - offset - slice_w, ww - 2.0 * r_offset, slice_w, sw, sh, bottom_color));
+                            verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + r_offset, slice_w, wh - 2.0 * r_offset, sw, sh, right_color));
 
                                 push_bevel_slice_corners(
                                     wx, wy, ww, wh,
@@ -976,23 +1005,31 @@ cascades in cce."
                             let d_h = h_inner - h_outer;
                             let color_offset = d_h * 0.4;
                             
-                            let light_color = [
-                                (border_color[0] + color_offset).clamp(0.0, 1.0),
-                                (border_color[1] + color_offset).clamp(0.0, 1.0),
-                                (border_color[2] + color_offset).clamp(0.0, 1.0),
-                                border_color[3]
-                            ];
-                            let dark_color = [
-                                (border_color[0] - color_offset).clamp(0.0, 1.0),
-                                (border_color[1] - color_offset).clamp(0.0, 1.0),
-                                (border_color[2] - color_offset).clamp(0.0, 1.0),
-                                border_color[3]
-                            ];
+                            let light_angle = cce_ui::layout::light_source_position();
+                            let rad = light_angle.to_radians();
+                            let lx = rad.cos();
+                            let ly = -rad.sin();
+                            
+                            let c_offset = |factor: f32| -> [f32; 4] {
+                                let o = factor * color_offset;
+                                [
+                                    (border_color[0] + o).clamp(0.0, 1.0),
+                                    (border_color[1] + o).clamp(0.0, 1.0),
+                                    (border_color[2] + o).clamp(0.0, 1.0),
+                                    border_color[3]
+                                ]
+                            };
+                            
+                            let top_color = c_offset(-ly);
+                            let left_color = c_offset(-lx);
+                            let bottom_color = c_offset(ly);
+                            let right_color = c_offset(lx);
+                            
                             let offset = i as f32 * slice_w;
-                            verts.extend(quad_vertices(wx + offset, wy + offset, ww - 2.0 * offset, slice_w, sw, sh, light_color));
-                            verts.extend(quad_vertices(wx + offset, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, light_color));
-                            verts.extend(quad_vertices(wx + offset, wy + wh - offset - slice_w, ww - 2.0 * offset, slice_w, sw, sh, dark_color));
-                            verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, dark_color));
+                            verts.extend(quad_vertices(wx + offset, wy + offset, ww - 2.0 * offset, slice_w, sw, sh, top_color));
+                            verts.extend(quad_vertices(wx + offset, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, left_color));
+                            verts.extend(quad_vertices(wx + offset, wy + wh - offset - slice_w, ww - 2.0 * offset, slice_w, sw, sh, bottom_color));
+                            verts.extend(quad_vertices(wx + ww - offset - slice_w, wy + offset, slice_w, wh - 2.0 * offset, sw, sh, right_color));
                         }
                     } else {
                         verts.extend(quad_vertices(wx, wy, ww, t, sw, sh, border_color));