Skip to main content

viewport_lib/
lib.rs

1#![warn(missing_docs)]
2//! `viewport-lib` — a 3D viewport library for `wgpu` applications.
3//!
4//! Built on `wgpu` and `glam`, with no required UI toolkit. The crate provides
5//! the renderer, camera, picking, and interaction pieces; host applications keep
6//! control of their own windowing and event loop.
7//!
8//! # Quick start
9//!
10//! 1. Create a [`ViewportRenderer`] from a `wgpu::Device` and target format.
11//! 2. Upload meshes or volumes through [`ViewportGpuResources`].
12//! 3. Build a [`FrameData`] each frame (camera via [`CameraFrame`] and
13//!    [`RenderCamera`], scene content via [`SceneFrame`], viewport chrome via
14//!    [`ViewportFrame`], etc.).
15//! 4. Call [`ViewportRenderer::prepare`] and then [`ViewportRenderer::paint_to`].
16
17/// Error types for the viewport library.
18pub mod error;
19
20/// Arcball camera, frustum, view presets, and animator.
21pub mod camera;
22/// BVH picking, marching cubes, isolines, and cap geometry.
23pub mod geometry;
24/// Gizmo, snap, selection, annotation, picking, and input.
25pub mod interaction;
26/// Main viewport renderer wrapping all GPU resources.
27pub mod renderer;
28/// GPU resource container (pipelines, buffers, bind groups).
29pub mod resources;
30/// Scene graph, material, traits, and AABB.
31pub mod scene;
32/// Axes orientation indicator.
33pub mod widgets;
34
35// ---------------------------------------------------------------------------
36// Module re-exports — preserve old `viewport_lib::foo::Bar` paths.
37// ---------------------------------------------------------------------------
38
39pub use geometry::bvh;
40pub use geometry::primitives;
41pub use interaction::annotation;
42pub use interaction::gizmo;
43pub use interaction::input;
44pub use interaction::manipulation;
45pub use interaction::picking;
46pub use interaction::selection;
47pub use interaction::snap;
48pub use scene::aabb;
49pub use scene::material;
50pub use scene::traits;
51pub use widgets::axes_indicator;
52
53// ---------------------------------------------------------------------------
54// Flat re-exports — these form the public crate API.
55// ---------------------------------------------------------------------------
56
57pub use error::{ViewportError, ViewportResult};
58
59pub use camera::animator::{CameraAnimator, CameraDamping, Easing};
60pub use camera::camera::{Camera, CameraTarget, Projection};
61pub use camera::frustum::{CullStats, Frustum};
62pub use camera::view_preset::ViewPreset;
63
64pub use scene::aabb::Aabb;
65pub use scene::material::Material;
66pub use scene::scene::{Group, GroupId, Layer, LayerId, Scene, SceneNode};
67pub use scene::traits::{RenderMode, ViewportObject};
68
69pub use geometry::bvh::PickAccelerator;
70pub use geometry::isoline::{IsolineItem, extract_isolines};
71pub use geometry::marching_cubes::{VolumeData, extract_isosurface};
72
73pub use interaction::annotation::AnnotationLabel;
74#[cfg(feature = "egui")]
75pub use interaction::annotation::draw_annotation_labels;
76pub use interaction::annotation::{world_to_screen, world_to_screen_from_frame};
77pub use interaction::gizmo::{
78    Gizmo, GizmoAxis, GizmoMode, GizmoSpace, PivotMode, gizmo_center_for_pivot,
79};
80pub use interaction::input::{
81    Action, ActionState, Binding, FrameInput, InputMode, InputSystem, KeyCode, Modifiers,
82    MouseButton,
83};
84// New input pipeline — re-exported at crate root for convenience.
85pub use interaction::input::{
86    ActionFrame, BindingPreset, ButtonState, ModifiersMatch, NavigationActions,
87    OrbitCameraController, ResolvedActionState, ScrollUnits, ViewportBinding, ViewportContext,
88    ViewportEvent, ViewportGesture, ViewportInput, viewport_all_bindings,
89};
90pub use interaction::manipulation::{
91    GizmoInfo, ManipResult, ManipulationContext, ManipulationController, ManipulationKind,
92    ManipulationState, TransformDelta,
93};
94pub use interaction::manipulation::solvers::{
95    angular_rotation_from_cursor, constrained_scale, constrained_translation,
96};
97
98pub use interaction::picking::{
99    GpuPickHit, PickHit, ProbeBinding, RectPickResult, pick_rect,
100    pick_scene_accelerated_with_probe, pick_scene_nodes_with_probe, pick_scene_with_probe,
101};
102pub use interaction::selection::{NodeId, Selection};
103pub use interaction::snap::{ConstraintOverlay, SnapConfig};
104
105pub use widgets::axes_indicator::AxisView;
106
107pub use renderer::shader_hashes::ShaderValidation;
108pub use renderer::stats::FrameStats;
109pub use renderer::{
110    CameraFrame, ClipPlane, ClipVolume, ComputeFilterItem, ComputeFilterKind, EffectsFrame,
111    FilterMode, FrameData, GlyphItem, GlyphType, InteractionFrame, LightKind, LightSource,
112    LightingSettings, PointCloudItem, PointRenderMode, PolylineItem, PostProcessSettings,
113    RenderCamera, SceneFrame, SceneRenderItem, ShadowFilter, StreamtubeItem, SurfaceSubmission,
114    ToneMapping, ViewportFrame, ViewportRenderer, VolumeItem,
115};
116pub use renderer::{ScalarBar, ScalarBarAnchor, ScalarBarOrientation};
117
118pub use resources::colormap_data::{
119    export_paraview_xml_colormap, lerp_colormap_lut, parse_paraview_xml_colormap,
120};
121pub use resources::mesh_store::MeshId;
122pub use resources::{
123    AttributeData, AttributeKind, AttributeRef, BuiltinColormap, CameraUniform, ClipVolumeUniform,
124    ColormapId, ComputeFilterResult, LightUniform, LightsUniform, MeshData, SingleLightUniform,
125    ViewportGpuResources, VolumeId, lerp_attributes,
126};