1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
#![cfg_attr(doc, feature(doc_cfg))]
//! *Crystal Ball* is a path tracing library written in Rust.
//!
//! It uses [rayon](https://github.com/rayon-rs/rayon) for parallelization
//! and can save the rendered image in various formats thanks to the [image](https://github.com/image-rs/image) crate.
//!
//! Note that Crystal Ball is a hobby project
//! and will most likely see a lot of API changes in future versions.
//!
//! ## Features
//!
//! - Multithreaded CPU rendering
//! - Save rendered images in [various formats](https://github.com/image-rs/image#supported-image-formats)
//! - Environment textures
//! - General purpose PBR material
//! - Shapes: spheres and triangle meshes
//! - Easily create your own textures, materials, and shapes
//! - Load [glTF](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html) files
//! - Depth of field
//! - Bounding Volume Hierarchies
//! - Optional denoising using [Open Image Denoise](https://www.openimagedenoise.org/)
//!
//! ## Usage
//!
//! ### Basic Example
//!
//! A basic example rendering two spheres.
//!
//! ```
//! use std::default::Default;
//! use std::sync::Arc;
//!
//! use crystal_ball::prelude::*;
//!
//! fn main() -> Result<(), Error> {
//! let objects = vec![
//! Object::new(
//! Arc::new(Sphere::new()),
//! Arc::new(PbrMaterial {
//! base_color: Color::new(1.0, 0.45, 0.31),
//! ..Default::default()
//! }),
//! ),
//! Object::new(
//! Arc::new(
//! Sphere::new()
//! .translate(Vec3::new(0.0, -101.0, 0.0))
//! .scale_xyz(Vec3::splat(100.0)),
//! ),
//! Arc::new(PbrMaterial::default()),
//! ),
//! ];
//!
//! let scene = Scene {
//! objects,
//! camera: Camera::default().translate(Vec3::new(0.0, 0.0, 5.0)),
//! ..Default::default()
//! };
//!
//! let engine = RenderEngine::default();
//! let image = engine.render(&scene);
//!
//! image.write("basic.png")?;
//!
//! Ok(())
//! }
//! ```
//!
//! Take a look at the examples to see how to use Crystal Ball's different features.
//!
//! ### Coordinate System
//!
//! Crystal Ball uses a right-handed coordinate system where
//! - +X points right
//! - +Y points up
//! - +Z points to the screen
//!
//! ## Feature Flags
//!
//! ### Optional Features
//!
//! | Name | description |
//! |--------|-----------------------------------------------------------------------------|
//! | `oidn` | Image denoising using [Open Image Denoise](https://www.openimagedenoise.org/) |
pub use crystal_ball_derive::Transformable;
pub mod color;
pub mod materials;
pub mod math;
pub mod prelude;
pub mod rendering;
pub mod shapes;
pub mod util;