Skip to main content

Crate viewport_lib

Crate viewport_lib 

Source
Expand description

viewport-lib : a 3D viewport library for wgpu applications.

Built on wgpu and glam, with no required UI toolkit. The crate provides the renderer, camera, picking, and interaction code; host applications keep their own windowing and event loop.

§Quick start (single viewport, pass-based)

  1. Create a ViewportRenderer from a wgpu::Device and target format.
  2. Upload meshes or volumes through DeviceResources.
  3. Build a FrameData each frame (camera via CameraFrame and RenderCamera, scene content via SceneFrame, viewport chrome via ViewportFrame, etc.).
  4. Call PassPath::prepare then PassPath::paint via renderer.pass().

§Quick start (single viewport, owned-encoder)

Use renderer.owned().render(device, queue, &output_view, &frame) when you own the wgpu encoder (winit, raw wgpu). The call handles prepare and draw internally and returns a wgpu::CommandBuffer to submit.

§Rendering paths

ViewportRenderer::pass returns a PassPath for framework callbacks that hand you a render pass (eframe, iced). ViewportRenderer::owned returns an OwnedPath for setups where you own the encoder (winit, raw wgpu).

§Multi-viewport rendering

To render the same scene from multiple independent cameras (e.g. a CAD quad-view layout):

// --- Setup (once at startup) ---
let vp_persp = renderer.create_viewport(&device);   // ViewportId(0)
let vp_top   = renderer.create_viewport(&device);   // ViewportId(1)
let vp_front = renderer.create_viewport(&device);   // ViewportId(2)

// --- Each frame ---
// 1. Build per-viewport FrameData (shared scene, independent cameras).
let frame_persp = FrameData {
    camera: CameraFrame::from_camera(&cam_persp, vp_size).with_viewport_index(vp_persp.0),
    scene: shared_scene.clone(),
    ..FrameData::default()
};
// ... similarly for vp_top, vp_front ...

// 2. Prepare scene data once (lighting, shadows, batching).
let (scene_fx, _) = frame_persp.effects.split();
renderer.pass().prepare_scene(&device, &queue, &frame_persp, &scene_fx);

// 3. Prepare per-viewport state (camera uniforms, clip planes, overlays).
renderer.pass().prepare_viewport(&device, &queue, vp_persp, &frame_persp);
renderer.pass().prepare_viewport(&device, &queue, vp_top,   &frame_top);
renderer.pass().prepare_viewport(&device, &queue, vp_front, &frame_front);

// 4a. LDR path : single render pass with viewport/scissor rects.
let mut rp = encoder.begin_render_pass(...);
rp.set_viewport(0.0, 0.0, half_w, half_h, 0.0, 1.0);
renderer.pass().paint_viewport(&mut rp, vp_persp, &frame_persp);
rp.set_viewport(half_w, 0.0, half_w, half_h, 0.0, 1.0);
renderer.pass().paint_viewport(&mut rp, vp_top, &frame_top);
// ...

// 4b. HDR path : one command buffer per viewport, each into its own texture.
let cmd0 = renderer.owned().render_viewport(&device, &queue, &view0, vp_persp, &frame_persp);
let cmd1 = renderer.owned().render_viewport(&device, &queue, &view1, vp_top,   &frame_top);
queue.submit([cmd0, cmd1]);

Re-exports§

pub use geometry::bvh;
pub use geometry::primitives;
pub use interaction::input;
pub use interaction::manipulation;
pub use interaction::manipulation::clip_plane;
pub use interaction::manipulation::gizmo;
pub use interaction::query::picking;
pub use interaction::query::snap;
pub use interaction::select::selection;
pub use interaction::widgets::axes_indicator;
pub use scene::aabb;
pub use scene::material;
pub use scene::scatter_volume;
pub use scene::scatter_volume::ColourSource;
pub use scene::scatter_volume::DensityRemap;
pub use scene::scatter_volume::Emission;
pub use scene::scatter_volume::EmissionCurve;
pub use scene::scatter_volume::NoiseDriver;
pub use scene::scatter_volume::RefractionParams;
pub use scene::scatter_volume::ScatterShape;
pub use scene::scatter_volume::ScatterVolume;
pub use scene::traits;
pub use error::ViewportError;
pub use error::ViewportResult;
pub use camera::camera::Camera;
pub use camera::camera::CameraTarget;
pub use camera::camera::Projection;
pub use camera::controllers::TurntableController;
pub use camera::controllers::CameraAnimator;
pub use camera::controllers::CameraDamping;
pub use camera::controllers::Easing;
pub use camera::frustum::CullStats;
pub use camera::frustum::Frustum;
pub use camera::track::CameraTrack;
pub use camera::track::interpolate_camera;
pub use camera::view_preset::ViewPreset;
pub use scene::aabb::Aabb;
pub use scene::material::BackfacePattern;
pub use scene::material::BackfacePolicy;
pub use scene::material::ItemSettings;
pub use scene::material::Material;
pub use scene::material::ParamVis;
pub use scene::material::ParamVisMode;
pub use scene::material::PatternConfig;
pub use scene::material::ShadingModel;
pub use scene::scene::DecalHandle;
pub use scene::scene::Group;
pub use scene::scene::GroupId;
pub use scene::scene::Layer;
pub use scene::scene::LayerId;
pub use scene::scene::LiveDecal;
pub use scene::scene::Scene;
pub use scene::scene::SceneNode;
pub use scene::scene::SceneStats;
pub use scene::traits::RenderMode;
pub use scene::traits::ViewportObject;
pub use geometry::bvh::PickAccelerator;
pub use geometry::implicit::ImplicitRenderOptions;
pub use geometry::implicit::march_implicit_surface;
pub use geometry::implicit::march_implicit_surface_colour;
pub use geometry::isoline::IsolineItem;
pub use geometry::isoline::extract_isolines;
pub use geometry::marching_cubes::VolumeData;
pub use geometry::marching_cubes::extract_isosurface;
pub use interaction::input::Action;
pub use interaction::input::ActionState;
pub use interaction::input::Binding;
pub use interaction::input::FrameInput;
pub use interaction::input::InputMode;
pub use interaction::input::InputSystem;
pub use interaction::input::KeyCode;
pub use interaction::input::Modifiers;
pub use interaction::input::MouseButton;
pub use interaction::input::NavigationMode;
pub use interaction::manipulation::gizmo::Gizmo;
pub use interaction::manipulation::gizmo::GizmoAxis;
pub use interaction::manipulation::gizmo::GizmoMode;
pub use interaction::manipulation::gizmo::GizmoSpace;
pub use interaction::manipulation::gizmo::PivotMode;
pub use interaction::manipulation::gizmo::gizmo_center_for_pivot;
pub use camera::controllers::FirstPersonCameraController;
pub use camera::controllers::OrbitCameraController;
pub use camera::controllers::ThirdPersonCameraController;
pub use camera::controllers::wish_xy_from_actions;
pub use interaction::input::ActionFrame;
pub use interaction::input::BindingPreset;
pub use interaction::input::ButtonState;
pub use interaction::input::ModifiersMatch;
pub use interaction::input::NavigationActions;
pub use interaction::input::ResolvedActionState;
pub use interaction::input::ScrollUnits;
pub use interaction::input::ViewportBinding;
pub use interaction::input::ViewportContext;
pub use interaction::input::ViewportEvent;
pub use interaction::input::ViewportGesture;
pub use interaction::input::ViewportInput;
pub use interaction::input::viewport_all_bindings;
pub use interaction::manipulation::solvers::angular_rotation_from_cursor;
pub use interaction::manipulation::solvers::constrained_scale;
pub use interaction::manipulation::solvers::constrained_translation;
pub use interaction::manipulation::GizmoInfo;
pub use interaction::manipulation::ManipResult;
pub use interaction::manipulation::ManipulationContext;
pub use interaction::manipulation::ManipulationController;
pub use interaction::manipulation::ManipulationKind;
pub use interaction::manipulation::ManipulationState;
pub use interaction::manipulation::TransformDelta;
pub use interaction::widgets::BoxWidget;
pub use interaction::widgets::CylinderWidget;
pub use interaction::widgets::DiskWidget;
pub use interaction::widgets::LineProbeWidget;
pub use interaction::widgets::PlaneWidget;
pub use interaction::widgets::PolylineWidget;
pub use interaction::widgets::SphereWidget;
pub use interaction::widgets::SplineWidget;
pub use interaction::widgets::WidgetContext;
pub use interaction::widgets::WidgetResult;
pub use interaction::manipulation::clip_plane::ClipAxis;
pub use interaction::manipulation::clip_plane::ClipPlaneContext;
pub use interaction::manipulation::clip_plane::ClipPlaneController;
pub use interaction::manipulation::clip_plane::ClipPlaneDelta;
pub use interaction::manipulation::clip_plane::ClipPlaneHit;
pub use interaction::manipulation::clip_plane::ClipPlaneResult;
pub use interaction::manipulation::clip_plane::ClipPlaneSessionKind;
pub use interaction::manipulation::clip_plane::hit_test_normal_handle;
pub use interaction::manipulation::clip_plane::hit_test_plane_quad;
pub use interaction::manipulation::clip_plane::plane_from_axis_preset;
pub use interaction::manipulation::clip_plane::project_drag_onto_normal;
pub use interaction::manipulation::clip_plane::ray_plane_intersection;
pub use interaction::manipulation::clip_plane::snap_plane_distance;
pub use interaction::query::picking::GpuPickHit;
pub use interaction::query::picking::PickHit;
pub use interaction::query::picking::ProbeBinding;
pub use interaction::query::picking::RectPickResult;
pub use interaction::query::picking::nearest_vertex_on_hit;
pub use interaction::query::picking::pick_gaussian_splat_cpu;
pub use interaction::query::picking::pick_gaussian_splat_rect;
pub use interaction::query::picking::pick_point_cloud_cpu;
pub use interaction::query::picking::pick_scene_accelerated_with_probe_cpu;
pub use interaction::query::picking::pick_scene_nodes_with_probe_cpu;
pub use interaction::query::picking::pick_scene_with_probe_cpu;
pub use interaction::query::picking::pick_transparent_volume_mesh_cpu;
pub use interaction::query::picking::pick_transparent_volume_mesh_rect;
pub use interaction::query::picking::pick_volume_cpu;
pub use interaction::query::picking::pick_volume_rect;
pub use interaction::query::picking::voxel_world_aabb;
pub use interaction::query::snap::ConstraintOverlay;
pub use interaction::query::snap::SnapConfig;
pub use interaction::select::pick_mask::PickMask;
pub use interaction::select::selection::NodeId;
pub use interaction::select::selection::Selection;
pub use interaction::select::sub_object;
pub use interaction::select::sub_object::CellSelectionInfo;
pub use interaction::select::sub_object::PolylineSelectionInfo;
pub use interaction::select::sub_object::SubObjectRef;
pub use interaction::select::sub_object::SubSelection;
pub use interaction::select::sub_object::SubSelectionRef;
pub use interaction::select::sub_object::VolumeSelectionInfo;
pub use interaction::widgets::axes_indicator::AxisView;
pub use renderer::ShadowDebugStats;
pub use renderer::shader_hashes::ShaderValidation;
pub use renderer::stats::FrameStats;
pub use renderer::stats::GpuBreakdown;
pub use renderer::stats::PerformancePolicy;
pub use renderer::stats::PrepareBreakdown;
pub use renderer::stats::QualityPreset;
pub use renderer::stats::RuntimeMode;
pub use renderer::AnimTrack;
pub use renderer::AtlasViewerCorner;
pub use renderer::BorderMode;
pub use renderer::CameraFrame;
pub use renderer::ClipObject;
pub use renderer::ClipShape;
pub use renderer::ComputeFilterItem;
pub use renderer::ComputeFilterKind;
pub use renderer::CylindricalFacing;
pub use renderer::DebugOutputMode;
pub use renderer::DebugQuantity;
pub use renderer::DebugVis;
pub use renderer::DecalAnimation;
pub use renderer::DecalBlendMode;
pub use renderer::DecalItem;
pub use renderer::DecalProjection;
pub use renderer::EffectsFrame;
pub use renderer::EmitterConfig;
pub use renderer::EnvironmentMap;
pub use renderer::FilterMode;
pub use renderer::ForceField;
pub use renderer::FrameData;
pub use renderer::GaussianSplatData;
pub use renderer::GaussianSplatId;
pub use renderer::GaussianSplatItem;
pub use renderer::GlyphItem;
pub use renderer::GlyphSetRefItem;
pub use renderer::GlyphType;
pub use renderer::GpuParticleSystemItem;
pub use renderer::GradientStop;
pub use renderer::GroundPlane;
pub use renderer::GroundPlaneMode;
pub use renderer::ImageAnchor;
pub use renderer::ImageSliceItem;
pub use renderer::InteractionFrame;
pub use renderer::LabelAnchor;
pub use renderer::LabelItem;
pub use renderer::LerpAnim;
pub use renderer::LicOverlay;
pub use renderer::LightKind;
pub use renderer::LightSource;
pub use renderer::LightingSettings;
pub use renderer::LineCap;
pub use renderer::LineJoin;
pub use renderer::LoadingBarAnchor;
pub use renderer::LoadingBarItem;
pub use renderer::MeshInstanceItem;
pub use renderer::NineSlice;
pub use renderer::OVERLAY_MAX_GRADIENT_STOPS;
pub use renderer::OverlayAnimation;
pub use renderer::OverlayAnimations;
pub use renderer::OverlayEasing;
pub use renderer::OverlayFill;
pub use renderer::OverlayFrame;
pub use renderer::OverlayImageItem;
pub use renderer::OverlayPolylineItem;
pub use renderer::OverlayRectItem;
pub use renderer::OverlayShape;
pub use renderer::OverlayShapeItem;
pub use renderer::OverlayTextureId;
pub use renderer::OwnedPath;
pub use renderer::ParticleMeshAlign;
pub use renderer::PassPath;
pub use renderer::PassView;
pub use renderer::PathTrack;
pub use renderer::PickId;
pub use renderer::PickRectResult;
pub use renderer::PointCloudItem;
pub use renderer::PointCloudRefItem;
pub use renderer::PointRenderMode;
pub use renderer::PolylineItem;
pub use renderer::PolylineRefItem;
pub use renderer::PostProcessSettings;
pub use renderer::RenderCamera;
pub use renderer::RepeatMode;
pub use renderer::RibbonItem;
pub use renderer::RibbonRefItem;
pub use renderer::RulerItem;
pub use renderer::ScalarBarAnchor;
pub use renderer::ScalarBarItem;
pub use renderer::ScalarBarOrientation;
pub use renderer::ScatterQuality;
pub use renderer::ScatterSettings;
pub use renderer::ScatterVolumeItem;
pub use renderer::SceneEffects;
pub use renderer::SceneFrame;
pub use renderer::SceneRenderItem;
pub use renderer::ScreenImageItem;
pub use renderer::ShDegree;
pub use renderer::ShadowFilter;
pub use renderer::SliceAxis;
pub use renderer::SpawnShape;
pub use renderer::SpriteBlend;
pub use renderer::SpriteInstanceSetRefItem;
pub use renderer::SpriteItem;
pub use renderer::SpriteOrientation;
pub use renderer::SpriteSetRefItem;
pub use renderer::SpriteSizeMode;
pub use renderer::StreamtubeItem;
pub use renderer::StreamtubeRefItem;
pub use renderer::SurfaceLICConfig;
pub use renderer::SurfaceSubmission;
pub use renderer::TensorGlyphItem;
pub use renderer::TensorGlyphSetRefItem;
pub use renderer::TextureTransform;
pub use renderer::TileMode;
pub use renderer::ToneMapping;
pub use renderer::TriangleDirection;
pub use renderer::TubeItem;
pub use renderer::TubeRefItem;
pub use renderer::VelocityDist;
pub use renderer::ViewportEffects;
pub use renderer::ViewportFrame;
pub use renderer::ViewportId;
pub use renderer::ViewportRenderer;
pub use renderer::VolumeItem;
pub use renderer::VolumeMeshItem;
pub use renderer::VolumeSurfaceSliceItem;
pub use renderer::VolumeTransparency;
pub use renderer::aabb_wireframe_polyline;
pub use renderer::sphere_wireframe_polyline;
pub use quantities::edge_one_form_to_glyphs;
pub use quantities::face_intrinsic_to_glyphs;
pub use quantities::polyline_edge_vectors_to_glyphs;
pub use quantities::polyline_node_vectors_to_glyphs;
pub use quantities::vertex_intrinsic_to_glyphs;
pub use quantities::volume_mesh_cell_vectors_to_glyphs;
pub use quantities::volume_mesh_vertex_vectors_to_glyphs;
pub use resources::ViewportGpuResources;Deprecated
pub use resources::material::colourmap_data::export_paraview_xml_colourmap;
pub use resources::material::colourmap_data::lerp_colourmap_lut;
pub use resources::material::colourmap_data::parse_paraview_xml_colourmap;
pub use resources::mesh::lod::LodGroup;
pub use resources::mesh::lod::LodGroupId;
pub use resources::mesh::lod::LodLevel;
pub use resources::mesh::lod::LodTransition;
pub use resources::mesh::lod::projected_screen_size;
pub use resources::mesh::mesh_store::MeshId;
pub use resources::volume::sparse_volume::SparseVolumeGridData;
pub use resources::volume::tetmesh::TetMesh;
pub use resources::volume::tetmesh::TetMeshAttributes;
pub use resources::volume::volume_mesh::CELL_SENTINEL;
pub use resources::volume::volume_mesh::ConversionReport;
pub use resources::volume::volume_mesh::ToTetMeshError;
pub use resources::volume::volume_mesh::VolumeMeshData;
pub use resources::volume::volume_mesh::extract_clipped_volume_faces;
pub use resources::AttributeData;
pub use resources::AttributeKind;
pub use resources::AttributeRef;
pub use resources::BuiltinColourmap;
pub use resources::BuiltinMatcap;
pub use resources::CLIP_VOLUME_MAX;
pub use resources::CameraUniform;
pub use resources::ClipVolumeEntry;
pub use resources::ClipVolumesUniform;
pub use resources::ColourmapId;
pub use resources::CompressedTextureDesc;
pub use resources::ComputeFilterResult;
pub use resources::DeviceResources;
pub use resources::FontError;
pub use resources::FontHandle;
pub use resources::GpuImplicitItem;
pub use resources::GpuImplicitOptions;
pub use resources::GpuMarchingCubesJob;
pub use resources::ImplicitBlendMode;
pub use resources::ImplicitPrimitive;
pub use resources::JobId;
pub use resources::LightUniform;
pub use resources::LightsUniform;
pub use resources::MatcapId;
pub use resources::McVolumeId;
pub use resources::MeshData;
pub use resources::ProgressHandle;
pub use resources::ResidentBytes;
pub use resources::SingleLightUniform;
pub use resources::TextureId;
pub use resources::TextureMemoryStats;
pub use resources::UploadStatus;
pub use resources::VolumeId;
pub use resources::VramBudget;
pub use resources::lerp_attributes;
pub use resources::supports_texture_format;
pub use resources::vram_budget;
pub use resources::DEFORM_PARAMS_PER_SLOT_PUB as DEFORM_PARAMS_PER_SLOT;
pub use resources::DEFORM_SLOT_COUNT_PUB as DEFORM_SLOT_COUNT;
pub use resources::DEFORM_SLOT_PARAMS_BYTES;
pub use resources::DeformSlotHandle;
pub use resources::DeformStage;
pub use resources::DeformerDesc;
pub use resources::DeformerId;
pub use resources::deform_slot_params_byte_offset;
pub use resources::GlyphSetId;
pub use resources::GpuParticleSystemConfig;
pub use resources::GpuParticleSystemId;
pub use resources::ParticleRender;
pub use resources::PointCloudId;
pub use resources::PolylineId;
pub use resources::RibbonId;
pub use resources::SpriteInstanceSetId;
pub use resources::SpriteSetId;
pub use resources::StreamtubeId;
pub use resources::TensorGlyphSetId;
pub use resources::TubeId;
pub use runtime::CameraFollow;
pub use runtime::DebugDraw;
pub use runtime::DebugLayer;
pub use runtime::DebugPrim;
pub use runtime::FixedStepIter;
pub use runtime::FixedTimestep;
pub use runtime::ManipulationSystem;
pub use runtime::NodeTransformOp;
pub use runtime::RuntimeFrameContext;
pub use runtime::RuntimeOutput;
pub use runtime::RuntimePhase;
pub use runtime::RuntimePlugin;
pub use runtime::RuntimeStats;
pub use runtime::RuntimeStepContext;
pub use runtime::SceneRuntimeMode;
pub use runtime::SelectionOp;
pub use runtime::SelectionSystem;
pub use runtime::SimulationStepContext;
pub use runtime::TransformSnapshot;
pub use runtime::TransformSnapshotTable;
pub use runtime::TransformWriteback;
pub use runtime::ViewportRuntime;

Modules§

camera
Arcball camera, frustum, view presets, and animator.
error
Error types for the viewport library. Error types for the viewport library.
geometry
BVH picking, marching cubes, isolines, and cap geometry.
interaction
Gizmo, snap, selection, picking, and input.
plugin_api
Plugin substrate: target descriptors, shared bind layouts, WGSL helpers, pipeline builders. See plugin_api for the published extension surface. Plugin substrate: target descriptors, shared bind layouts, WGSL helpers, and pipeline builders.
plugins
Built-in plugins: skinning, animation, constraints, physics, skeleton. Built-in plugins for viewport-lib.
quantities
On-surface vector quantities (intrinsic vectors, Whitney one-forms). On-surface vector quantity utilities.
renderer
Main viewport renderer wrapping all GPU resources. ViewportRenderer : the main entry point for the viewport library.
resources
GPU resource container (pipelines, buffers, bind groups).
runtime
Scene runtime: per-frame orchestration, plugin system, and physics hooks. Scene runtime: per-frame orchestration layer between Scene and ViewportRenderer.
scene
Scene graph, material, traits, and AABB.