mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-06 20:02:16 +00:00
dc38349cbf
* Kernel: the B-rep record and the native body file come from solidcore-record SolidCraft's portable B-rep record (`solidcraft_geom::brep`: brep.rs, topology, history, envelope, part, curve2) and the native body file (`solidcraft_kernel::native`: the tagged binary codec and the container) move to solidcore's `solidcore-record` crate: geometry as data, with structural validation and no maths (solidcore's docs/layers.md, stage 1). Every caller uses `solidcore_record::brep` and `solidcore_record::native`; the old copies are deleted. What computes from coordinates stays with the kernel, in geom's `brep`: - `brep::check`: the record's geometric checks (orthonormal frames, non-degenerate planes, unit revolution axes, non-singular placements). `check::validate` and `check::validate_built` are the record's validation and these together, and every caller of `Brep::validate` uses them, so what is accepted is unchanged; - `brep::label`: a surface's natural ranges (a cone's apex), `curve_interval`, `edge_curve_interval` and `form_turns`; - `brep::pcurve::eval`: a pcurve's point; - `geometry::check`, `placement::moved` and `split_edges` become functions on the record. The kernel's native module keeps the conversion between a body and its saved record (metadata.rs) and checks the decoded record's geometry. `native/analytic.rs`, which no module declared, is deleted. solidcore-record is pinned to its rev on solidcore's `layer-record` branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NvoxKMbMFSQU8tzRtoJhtT * Geometry: Vec2, Vec3, Plane and the profile types come from solidcore-record The plain data of vectors and points, sketch planes and planar profiles (`Seg2`, `Loop2`, `Region2`) moves to `solidcore-record`, with its constants and component-wise operators only (owner decision, solidcore layer split). Their geometry stays in geom as traits: `Vec2Geom`, `Vec3Geom`, `PlaneGeom`, `Seg2Geom`, `Loop2Geom`, `Region2Geom`, `Seg2ArcFit`, `Loop2ArcFit` and `Region2ArcFit`, in scope with `use solidcraft_geom::prelude::*`. Every caller names the types from `solidcore_record`; geom no longer defines or re-exports them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NvoxKMbMFSQU8tzRtoJhtT * Kernel: pin solidcore-record to solidcore main f5e8e9a29 solidcore-record is merged on solidcore main (tangency-labs/solidcore#2519); its crate there is identical to the rev pinned before but for its clippy configuration. The lock is regenerated against the merged rev. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NvoxKMbMFSQU8tzRtoJhtT --------- Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
57 lines
2.1 KiB
Rust
57 lines
2.1 KiB
Rust
//! Surface analysis as a view draws it: the shading mode and the colours it uses.
|
|
|
|
use solidcore_record::Vec3;
|
|
|
|
/// Surface analysis colours, straight sRGB 0..1 as the shader takes them.
|
|
#[derive(Clone, Copy, Debug, PartialEq)]
|
|
pub struct AnalysisColors {
|
|
/// Draft Analysis: at least the draft angle, between, at most minus the angle.
|
|
pub draft: [[f32; 3]; 3],
|
|
/// Accessibility Analysis: reachable, blocked.
|
|
pub access: [[f32; 3]; 2],
|
|
/// Curvature Map: flat, the middle of the scale, at or below the analysis radius. Dark blue
|
|
/// to light yellow in one straight blend, so the lightness rises the whole way and the scale
|
|
/// reads with hue lost too (#975).
|
|
pub curvature: [[f32; 3]; 3],
|
|
/// Stripe the negative draft and blocked faces too, so colour is not the only cue.
|
|
pub hatch: bool,
|
|
}
|
|
|
|
impl AnalysisColors {
|
|
/// The light theme's colours (no colour vision mode): what headless pictures use.
|
|
pub const DEFAULT: AnalysisColors = AnalysisColors {
|
|
draft: [[0.20, 0.75, 0.30], [0.95, 0.80, 0.15], [0.85, 0.22, 0.20]],
|
|
access: [[0.20, 0.75, 0.30], [0.85, 0.22, 0.20]],
|
|
curvature: [[0.08, 0.12, 0.45], [0.53, 0.51, 0.425], [0.98, 0.90, 0.40]],
|
|
hatch: false,
|
|
};
|
|
}
|
|
|
|
impl Default for AnalysisColors {
|
|
fn default() -> Self {
|
|
AnalysisColors::DEFAULT
|
|
}
|
|
}
|
|
|
|
/// A way of shading the model's faces to judge their shape.
|
|
#[derive(Clone, Copy, Debug, PartialEq)]
|
|
pub enum AnalysisMode {
|
|
/// Reflected stripes: `stripes` across the view.
|
|
Zebra { stripes: f64 },
|
|
/// Faces by draft angle (degrees) to `pull`.
|
|
Draft { pull: Vec3, angle: f64 },
|
|
/// Colour by curvature, reaching the tight end at 1 / `radius`.
|
|
Curvature { radius: f64 },
|
|
/// Mirror finish reflecting a studio.
|
|
Environment,
|
|
/// Reachable along `dir` (facing it, nothing above) or blocked.
|
|
Access { dir: Vec3 },
|
|
}
|
|
|
|
/// A surface analysis shading a picture: the mode and its colours.
|
|
#[derive(Clone, Copy, Debug, PartialEq)]
|
|
pub struct SceneAnalysis {
|
|
pub mode: AnalysisMode,
|
|
pub colors: AnalysisColors,
|
|
}
|