molgfx-render 0.3.2

The render graph, passes and the engine that drives a frame.
Documentation
use super::*;
use crate::{RenderProfile, ToneMapping};
use molgfx_core::Scene;
use molgfx_math::{Camera, Projection, Vec3};

fn camera() -> Camera {
    Camera {
        eye: Vec3::new(0.0, 0.0, 8.0),
        target: Vec3::ZERO,
        up: Vec3::Y,
        projection: Projection::Perspective {
            fov_y: 0.8,
            aspect: 1.0,
            near: 0.1,
            far: 100.0,
        },
    }
}

#[test]
fn session_json_round_trips_camera_and_ordered_profile() {
    let mut profile = RenderProfile::cinematic();
    profile = profile.with_effect(crate::PresentationEffect::Display(
        crate::DisplayTransform {
            tone_mapping: ToneMapping::Reinhard,
            ..crate::DisplayTransform::default()
        },
    ));
    let session = RenderSession::new(&Scene::new(), camera(), profile);
    let json = match session.to_json() {
        Ok(json) => json,
        Err(error) => panic!("session serializes: {error}"),
    };
    let decoded = match RenderSession::from_json(&json) {
        Ok(session) => session,
        Err(error) => panic!("session deserializes: {error}"),
    };
    assert_eq!(decoded, session);
}

#[test]
fn session_rejects_a_different_schema() {
    let mut session = RenderSession::new(&Scene::new(), camera(), RenderProfile::inspection());
    session.schema += 1;
    let json = match serde_json::to_string(&session) {
        Ok(json) => json,
        Err(error) => panic!("test session serializes: {error}"),
    };
    assert!(RenderSession::from_json(&json).is_err());
}