Continuing on the quest to fix bugs. Never again

This commit is contained in:
pingu 2026-01-23 20:30:55 +00:00
parent b6b17a8c7e
commit 64a139d108
39 changed files with 174 additions and 230 deletions

View file

@ -1,6 +1,6 @@
use shared::core::{ use shared::core::{
light::Light, light::Light,
material::{self, Material}, material::Material,
medium::MediumInterface, medium::MediumInterface,
primitive::{GeometricPrimitive, SimplePrimitive}, primitive::{GeometricPrimitive, SimplePrimitive},
shape::Shape, shape::Shape,
@ -8,8 +8,6 @@ use shared::core::{
use shared::utils::Ptr; use shared::utils::Ptr;
use crate::core::texture::FloatTexture;
pub trait CreateSimplePrimitive { pub trait CreateSimplePrimitive {
fn new(shape: Ptr<Shape>, material: Ptr<Material>) -> SimplePrimitive { fn new(shape: Ptr<Shape>, material: Ptr<Material>) -> SimplePrimitive {
SimplePrimitive { shape, material } SimplePrimitive { shape, material }
@ -37,4 +35,3 @@ pub trait CreateGeometricPrimitive {
} }
impl CreateGeometricPrimitive for GeometricPrimitive {} impl CreateGeometricPrimitive for GeometricPrimitive {}

View file

@ -3,7 +3,7 @@ use crate::utils::{FileLoc, ParameterDictionary};
use anyhow::{Result, anyhow}; use anyhow::{Result, anyhow};
use shared::core::geometry::Point2i; use shared::core::geometry::Point2i;
use shared::core::sampler::{ use shared::core::sampler::{
HaltonSampler, IndependentSampler, PaddedSobolSampler, Sampler, SamplerTrait, SobolSampler, HaltonSampler, IndependentSampler, PaddedSobolSampler, Sampler, SobolSampler,
StratifiedSampler, ZSobolSampler, StratifiedSampler, ZSobolSampler,
}; };

View file

@ -17,7 +17,6 @@ use crate::utils::{Upload, resolve_filename};
use parking_lot::Mutex; use parking_lot::Mutex;
use rayon::prelude::*; use rayon::prelude::*;
use shared::core::camera::Camera; use shared::core::camera::Camera;
use shared::core::color::ColorEncoding;
use shared::core::color::LINEAR; use shared::core::color::LINEAR;
use shared::core::film::Film; use shared::core::film::Film;
use shared::core::filter::Filter; use shared::core::filter::Filter;
@ -29,7 +28,6 @@ use shared::core::sampler::Sampler;
use shared::core::shape::Shape; use shared::core::shape::Shape;
use shared::core::texture::SpectrumType; use shared::core::texture::SpectrumType;
use shared::spectra::RGBColorSpace; use shared::spectra::RGBColorSpace;
use shared::textures::FloatConstantTexture;
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::Arc; use std::sync::Arc;
@ -161,7 +159,7 @@ impl BasicScene {
&camera.base.name, &camera.base.name,
&camera.base.parameters, &camera.base.parameters,
&camera.camera_transform, &camera.camera_transform,
medium, medium.unwrap(),
camera_film, camera_film,
&camera.base.loc, &camera.base.loc,
arena, arena,
@ -291,7 +289,7 @@ impl BasicScene {
TextureParameterDictionary::new(texture_clone.base.parameters.into(), None); TextureParameterDictionary::new(texture_clone.base.parameters.into(), None);
let texture = SpectrumTexture::create( let texture = SpectrumTexture::create(
&texture_clone.base.name, &texture_clone.base.name,
&render_from_texture, render_from_texture,
tex_dict, tex_dict,
SpectrumType::Albedo, SpectrumType::Albedo,
texture_clone.base.loc, texture_clone.base.loc,

View file

@ -1,13 +1,13 @@
use super::{SceneEntity, TextureSceneEntity}; use super::{SceneEntity, TextureSceneEntity};
use crate::core::image::Image; use crate::core::image::Image;
use crate::core::light::Light;
use crate::core::medium::Medium; use crate::core::medium::Medium;
use crate::core::texture::{FloatTexture, SpectrumTexture}; use crate::core::texture::{FloatTexture, SpectrumTexture};
use crate::utils::parallel::AsyncJob; use crate::utils::parallel::AsyncJob;
use shared::core::light::Light;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::sync::Arc; use std::sync::Arc;
#[derive(Default)] #[derive(Debug)]
pub struct TextureState { pub struct TextureState {
pub serial_float_textures: Vec<(String, TextureSceneEntity)>, pub serial_float_textures: Vec<(String, TextureSceneEntity)>,
pub serial_spectrum_textures: Vec<(String, TextureSceneEntity)>, pub serial_spectrum_textures: Vec<(String, TextureSceneEntity)>,
@ -18,7 +18,7 @@ pub struct TextureState {
pub n_missing_textures: i32, pub n_missing_textures: i32,
} }
#[derive(Default)] #[derive(Debug)]
pub struct MaterialState { pub struct MaterialState {
pub named_materials: Vec<(String, SceneEntity)>, pub named_materials: Vec<(String, SceneEntity)>,
pub materials: Vec<SceneEntity>, pub materials: Vec<SceneEntity>,
@ -26,19 +26,19 @@ pub struct MaterialState {
pub normal_maps: HashMap<String, Arc<Image>>, pub normal_maps: HashMap<String, Arc<Image>>,
} }
#[derive(Default)] #[derive(Debug)]
pub struct LightState { pub struct LightState {
pub light_jobs: Vec<AsyncJob<Light>>, pub light_jobs: Vec<AsyncJob<Light>>,
pub area_lights: Vec<SceneEntity>, pub area_lights: Vec<SceneEntity>,
} }
#[derive(Default)] #[derive(Debug)]
pub struct MediaState { pub struct MediaState {
pub jobs: HashMap<String, AsyncJob<Medium>>, pub jobs: HashMap<String, AsyncJob<Medium>>,
pub map: HashMap<String, Arc<Medium>>, pub map: HashMap<String, Arc<Medium>>,
} }
#[derive(Default)] #[derive(Debug)]
pub struct SingletonState<T> { pub struct SingletonState<T> {
pub result: Option<Arc<T>>, pub result: Option<Arc<T>>,
pub job: Option<AsyncJob<T>>, pub job: Option<AsyncJob<T>>,

View file

@ -1,7 +1,6 @@
use crate::core::texture::FloatTexture; use crate::core::texture::FloatTexture;
use crate::shapes::{BilinearPatchMesh, TriQuadMesh, TriangleMesh}; use crate::shapes::{BilinearPatchMesh, TriangleMesh};
use crate::utils::{Arena, FileLoc, ParameterDictionary, resolve_filename}; use crate::utils::{Arena, FileLoc, ParameterDictionary};
use shared::core::options::get_options;
use shared::core::shape::*; use shared::core::shape::*;
use shared::shapes::*; use shared::shapes::*;
// use shared::spectra::*; // use shared::spectra::*;

View file

@ -1,19 +1,18 @@
use crate::spectra::cie_y; use crate::spectra::{DenselySampledSpectrumBuffer, cie_y};
use crate::utils::containers::InternCache; use crate::utils::containers::InternCache;
use parking_lot::Mutex; use parking_lot::Mutex;
use shared::Float; use shared::Float;
use shared::core::spectrum::Spectrum; use shared::core::spectrum::Spectrum;
use shared::spectra::DenselySampledSpectrum;
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::LazyLock; use std::sync::LazyLock;
pub static SPECTRUM_CACHE: LazyLock<InternCache<DenselySampledSpectrum>> = pub static SPECTRUM_CACHE: LazyLock<InternCache<DenselySampledSpectrumBuffer>> =
LazyLock::new(InternCache::new); LazyLock::new(InternCache::new);
pub static SPECTRUM_FILE_CACHE: LazyLock<Mutex<HashMap<String, Spectrum>>> = pub static SPECTRUM_FILE_CACHE: LazyLock<Mutex<HashMap<String, Spectrum>>> =
LazyLock::new(|| Mutex::new(HashMap::new())); LazyLock::new(|| Mutex::new(HashMap::new()));
pub fn get_spectrum_cache() -> &'static InternCache<DenselySampledSpectrum> { pub fn get_spectrum_cache() -> &'static InternCache<DenselySampledSpectrumBuffer> {
&SPECTRUM_CACHE &SPECTRUM_CACHE
} }

View file

@ -45,18 +45,21 @@ pub enum FloatTexture {
Wrinkled(WrinkledTexture), Wrinkled(WrinkledTexture),
} }
impl FloatTextureTrait for FloatDotsTexture {
fn evaluate(&self, _ctx: &shared::core::texture::TextureEvalContext) -> shared::Float {
todo!()
}
}
impl FloatTextureTrait for Arc<FloatTexture> { impl FloatTextureTrait for Arc<FloatTexture> {
fn evaluate(&self, ctx: &TextureEvalContext) -> Float { fn evaluate(&self, ctx: &TextureEvalContext) -> Float {
self.as_ref().evaluate(ctx) self.as_ref().evaluate(ctx)
} }
} }
pub trait CreateFloatTexture {
fn create(
render_from_texture: Transform,
params: TextureParameterDictionary,
loc: FileLoc,
arena: &mut Arena,
) -> Result<FloatTexture>;
}
impl FloatTexture { impl FloatTexture {
pub fn create( pub fn create(
name: &str, name: &str,
@ -155,16 +158,6 @@ impl SpectrumTextureTrait for Arc<SpectrumTexture> {
} }
} }
impl SpectrumTextureTrait for SpectrumDotsTexture {
fn evaluate(
&self,
_ctx: &shared::core::texture::TextureEvalContext,
_lambda: &shared::spectra::SampledWavelengths,
) -> shared::spectra::SampledSpectrum {
todo!()
}
}
pub trait CreateTextureMapping { pub trait CreateTextureMapping {
fn create( fn create(
params: &TextureParameterDictionary, params: &TextureParameterDictionary,

View file

@ -1,7 +1,7 @@
use super::state::PathState; use super::state::PathState;
use crate::core::light::Light;
use shared::core::geometry::Ray; use shared::core::geometry::Ray;
use shared::core::interaction::{Interaction, InteractionTrait}; use shared::core::interaction::{Interaction, InteractionTrait};
use shared::core::light::Light;
use shared::core::primitive::{Primitive, PrimitiveTrait}; use shared::core::primitive::{Primitive, PrimitiveTrait};
use shared::core::shape::ShapeIntersection; use shared::core::shape::ShapeIntersection;
use shared::lights::LightSampler; use shared::lights::LightSampler;

View file

@ -6,6 +6,12 @@ mod state;
pub use path::PathIntegrator; pub use path::PathIntegrator;
use crate::Arena;
use shared::core::film::VisibleSurface;
use shared::core::geometry::{Point2i, Ray};
use shared::core::sampler::Sampler;
use shared::spectra::{SampledSpectrum, SampledWavelengths};
pub trait IntegratorTrait { pub trait IntegratorTrait {
fn render(&self); fn render(&self);
} }

View file

@ -6,7 +6,7 @@ use crate::core::film::FilmTrait;
use crate::core::image::{Image, ImageIO, ImageMetadata}; use crate::core::image::{Image, ImageIO, ImageMetadata};
use crate::spectra::get_spectra_context; use crate::spectra::get_spectra_context;
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
use rayon::iter::{IntoParallelIterator, IntoParallelRefIterator, ParallelIterator}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
use shared::Float; use shared::Float;
use shared::core::camera::{Camera, CameraTrait}; use shared::core::camera::{Camera, CameraTrait};
use shared::core::geometry::{Bounds2i, Point2i, VectorLike}; use shared::core::geometry::{Bounds2i, Point2i, VectorLike};

View file

@ -97,7 +97,7 @@ impl CreateDiffuseLight for DiffuseAreaLight {
colorspace, colorspace,
shape, shape,
alpha: stored_alpha.expect("Could not retrieve texture"), alpha: stored_alpha.expect("Could not retrieve texture"),
lemit: Ptr::from(&*lemit), lemit: Ptr::from(lemit.device()),
two_sided, two_sided,
scale, scale,
} }

View file

@ -28,7 +28,7 @@ impl CreateDistantLight for DistantLight {
let lemit = lookup_spectrum(&le); let lemit = lookup_spectrum(&le);
Self { Self {
base, base,
lemit: Ptr::from(&*lemit), lemit: Ptr::from(lemit.device()),
scale, scale,
scene_center: Point3f::default(), scene_center: Point3f::default(),
scene_radius: 0., scene_radius: 0.,

View file

@ -43,11 +43,10 @@ impl CreateGoniometricLight for GoniometricLight {
); );
let iemit = lookup_spectrum(&le); let iemit = lookup_spectrum(&le);
// let d = image.get_sampling_distribution_uniform();
let distrib = PiecewiseConstant2D::from_image(&image); let distrib = PiecewiseConstant2D::from_image(&image);
Self { Self {
base, base,
iemit: *iemit, iemit: Ptr::from(iemit.device()),
scale, scale,
image: Ptr::from(image.device_image()), image: Ptr::from(image.device_image()),
distrib: Ptr::from(&distrib.device), distrib: Ptr::from(&distrib.device),

View file

@ -9,7 +9,7 @@ use anyhow::{Result, anyhow};
use rayon::prelude::*; use rayon::prelude::*;
use shared::core::camera::CameraTransform; use shared::core::camera::CameraTransform;
use shared::core::geometry::{Bounds2f, Frame, Point2f, Point2i, Point3f, VectorLike, cos_theta}; use shared::core::geometry::{Bounds2f, Frame, Point2f, Point2i, Point3f, VectorLike, cos_theta};
use shared::core::image::{PixelFormat, WrapMode}; use shared::core::image::{DeviceImage, WrapMode};
use shared::core::light::{Light, LightBase, LightType}; use shared::core::light::{Light, LightBase, LightType};
use shared::core::medium::MediumInterface; use shared::core::medium::MediumInterface;
use shared::core::spectrum::Spectrum; use shared::core::spectrum::Spectrum;
@ -20,6 +20,7 @@ use shared::utils::math::{equal_area_sphere_to_square, equal_area_square_to_sphe
use shared::utils::sampling::{DevicePiecewiseConstant2D, DeviceWindowedPiecewiseConstant2D}; use shared::utils::sampling::{DevicePiecewiseConstant2D, DeviceWindowedPiecewiseConstant2D};
use shared::utils::{Ptr, Transform}; use shared::utils::{Ptr, Transform};
use shared::{Float, PI}; use shared::{Float, PI};
use shareed::spectra::DenselySampledSpectrum;
use std::path::Path; use std::path::Path;
pub trait CreateImageInfiniteLight { pub trait CreateImageInfiniteLight {
@ -206,10 +207,12 @@ fn create_image_light(
let (n_u, n_v) = (res.x() as usize, res.y() as usize); let (n_u, n_v) = (res.x() as usize, res.y() as usize);
// Extract luminance data // Extract luminance data
let image_ptr = image.upload(arena);
let value = image.clone();
let mut data: Vec<Float> = (0..n_v) let mut data: Vec<Float> = (0..n_v)
.flat_map(|v| { .flat_map(|v| {
(0..n_u).map(move |u| { (0..n_u).map(move |u| {
image &value
.get_channels(Point2i::new(u as i32, v as i32)) .get_channels(Point2i::new(u as i32, v as i32))
.average() .average()
}) })
@ -233,7 +236,7 @@ fn create_image_light(
let light = ImageInfiniteLight::new( let light = ImageInfiniteLight::new(
render_from_light, render_from_light,
scale, scale,
image.upload(arena), image_ptr,
image_cs.upload(arena), image_cs.upload(arena),
distrib.upload(arena), distrib.upload(arena),
compensated_distrib.upload(arena), compensated_distrib.upload(arena),

View file

@ -35,7 +35,8 @@ impl CreatePointLight for PointLight {
render_from_light, render_from_light,
medium_interface, medium_interface,
); );
let i = Ptr::from(&*lookup_spectrum(&le)); let iemit = lookup_spectrum(&le);
let i = Ptr::from(iemit.device());
Self { base, scale, i } Self { base, scale, i }
} }

View file

@ -17,6 +17,7 @@ use shared::core::spectrum::Spectrum;
use shared::lights::ProjectionLight; use shared::lights::ProjectionLight;
use shared::spectra::RGBColorSpace; use shared::spectra::RGBColorSpace;
use shared::utils::math::{radians, square}; use shared::utils::math::{radians, square};
use shared::utils::sampling::DeviceWindowedPiecewiseConstant2D;
use shared::utils::{Ptr, Transform}; use shared::utils::{Ptr, Transform};
use std::path::Path; use std::path::Path;
@ -48,21 +49,11 @@ impl CreateProjectionLight for ProjectionLight {
medium_interface, medium_interface,
); );
let res = image.resolution();
let aspect = res.x() as Float / res.y() as Float;
let screen_bounds = if aspect > 1.0 {
Bounds2f::from_points(Point2f::new(-aspect, -1.0), Point2f::new(aspect, 1.0))
} else {
Bounds2f::from_points(
Point2f::new(-1.0, -1.0 / aspect),
Point2f::new(1.0, 1.0 / aspect),
)
};
let hither = 1e-3;
let screen_from_light = Transform::perspective(fov, hither, 1e30).unwrap(); let screen_from_light = Transform::perspective(fov, hither, 1e30).unwrap();
let light_from_screen = screen_from_light.inverse(); let light_from_screen = screen_from_light.inverse();
let hither = 1e-3;
let res = image.resolution();
let aspect = res.x() as Float / res.y() as Float;
let opposite = (radians(fov) / 2.0).tan(); let opposite = (radians(fov) / 2.0).tan();
let aspect_ratio = if aspect > 1.0 { aspect } else { 1.0 / aspect }; let aspect_ratio = if aspect > 1.0 { aspect } else { 1.0 / aspect };
let a = 4.0 * square(opposite) * aspect_ratio; let a = 4.0 * square(opposite) * aspect_ratio;
@ -140,12 +131,27 @@ impl CreateLight for ProjectionLight {
let flip = Transform::scale(1., -1., 1.); let flip = Transform::scale(1., -1., 1.);
let render_from_light_flip = render_from_light * flip; let render_from_light_flip = render_from_light * flip;
let hither = 1e-3;
let screen_from_light = Transform::perspective(fov, hither, 1e30).unwrap();
let light_from_screen = screen_from_light.inverse();
let dwda = |p: Point2f| { let dwda = |p: Point2f| {
let w = let w =
Vector3f::from(light_from_screen.apply_to_point(Point3f::new(p.x(), p.y(), 0.0))); Vector3f::from(light_from_screen.apply_to_point(Point3f::new(p.x(), p.y(), 0.0)));
cos_theta(w.normalize()).powi(3) cos_theta(w.normalize()).powi(3)
}; };
let res = image.resolution();
let aspect = res.x() as Float / res.y() as Float;
let screen_bounds = if aspect > 1.0 {
Bounds2f::from_points(Point2f::new(-aspect, -1.0), Point2f::new(aspect, 1.0))
} else {
Bounds2f::from_points(
Point2f::new(-1.0, -1.0 / aspect),
Point2f::new(1.0, 1.0 / aspect),
)
};
let d = image.get_sampling_distribution(dwda, screen_bounds); let d = image.get_sampling_distribution(dwda, screen_bounds);
let distrib = let distrib =
PiecewiseConstant2D::new(d.as_slice(), d.x_size() as usize, d.y_size() as usize); PiecewiseConstant2D::new(d.as_slice(), d.x_size() as usize, d.y_size() as usize);

View file

@ -42,7 +42,8 @@ impl CreateSpotLight for SpotLight {
MediumInterface::empty(), MediumInterface::empty(),
); );
let iemit = Ptr::from(&*lookup_spectrum(&le)); let i = lookup_spectrum(&le);
let iemit = Ptr::from(&i.device());
Self { Self {
base, base,
iemit, iemit,

View file

@ -1,13 +1,12 @@
use crate::core::image::Image; use crate::core::image::Image;
use crate::core::material::CreateMaterial; use crate::core::material::CreateMaterial;
use crate::spectra::{get_colorspace_context, get_colorspace_device}; use crate::spectra::get_colorspace_device;
use crate::utils::{Arena, FileLoc, TextureParameterDictionary, Upload}; use crate::utils::{Arena, FileLoc, TextureParameterDictionary, Upload};
use shared::bxdfs::HairBxDF; use shared::bxdfs::HairBxDF;
use shared::core::material::Material; use shared::core::material::Material;
use shared::core::spectrum::Spectrum; use shared::core::spectrum::Spectrum;
use shared::core::texture::{SpectrumTexture, SpectrumType}; use shared::core::texture::{SpectrumTexture, SpectrumType};
use shared::materials::complex::*; use shared::materials::complex::*;
use shared::spectra::RGBUnboundedSpectrum;
// use shared::spectra::SampledWavelengths; // use shared::spectra::SampledWavelengths;
use shared::textures::SpectrumConstantTexture; use shared::textures::SpectrumConstantTexture;
// use shared::utils::Ptr; // use shared::utils::Ptr;

View file

@ -1,11 +1,12 @@
use crate::Arena; use crate::Arena;
use crate::core::sampler::CreateSampler; use crate::core::sampler::CreateSampler;
use crate::utils::math::{DigitPermutation, compute_radical_inverse_permutations}; use crate::utils::math::compute_radical_inverse_permutations;
use crate::utils::{FileLoc, ParameterDictionary}; use crate::utils::{FileLoc, ParameterDictionary};
use anyhow::{Result, anyhow}; use anyhow::{Result, anyhow};
use shared::core::geometry::Point2i; use shared::core::geometry::Point2i;
use shared::core::options::get_options; use shared::core::options::get_options;
use shared::core::sampler::{HaltonSampler, MAX_HALTON_RESOLUTION, RandomizeStrategy}; use shared::core::sampler::{HaltonSampler, MAX_HALTON_RESOLUTION, RandomizeStrategy};
use shared::utils::Ptr;
pub trait CreateHaltonSampler { pub trait CreateHaltonSampler {
fn new( fn new(
@ -23,7 +24,7 @@ impl CreateHaltonSampler for HaltonSampler {
randomize: RandomizeStrategy, randomize: RandomizeStrategy,
seed: u64, seed: u64,
) -> Self { ) -> Self {
let (_, _digit_permutations) = compute_radical_inverse_permutations(seed); let (_, digit_permutations) = compute_radical_inverse_permutations(seed);
let mut base_scales = [0u64; 2]; let mut base_scales = [0u64; 2];
let mut base_exponents = [0u64; 2]; let mut base_exponents = [0u64; 2];
let bases = [2, 3]; let bases = [2, 3];
@ -55,7 +56,7 @@ impl CreateHaltonSampler for HaltonSampler {
Self { Self {
samples_per_pixel, samples_per_pixel,
randomize, randomize,
digit_permutations: Ptr::from(&digit_permutations), digit_permutations: digit_permutations.as_ptr().into(),
base_scales, base_scales,
base_exponents, base_exponents,
mult_inverse, mult_inverse,

View file

@ -2,8 +2,3 @@ pub mod halton;
pub mod independent; pub mod independent;
pub mod sobol; pub mod sobol;
pub mod stratified; pub mod stratified;
pub use halton::*;
pub use independent::*;
pub use sobol::*;
pub use stratified::*;

View file

@ -6,13 +6,8 @@ pub mod mesh;
pub mod sphere; pub mod sphere;
pub mod triangle; pub mod triangle;
pub use bilinear::*;
pub use curves::*; pub use curves::*;
pub use cylinder::*;
pub use disk::*;
pub use mesh::*; pub use mesh::*;
pub use sphere::*;
pub use triangle::*;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};

View file

@ -2,7 +2,7 @@ use crate::spectra::get_spectra_context;
use super::DenselySampledSpectrumBuffer; use super::DenselySampledSpectrumBuffer;
use shared::core::color::{RGB, RGBToSpectrumTable, XYZ}; use shared::core::color::{RGB, RGBToSpectrumTable, XYZ};
use shared::core::geometry::{Point2f, Vector3f}; use shared::core::geometry::Point2f;
use shared::core::spectrum::Spectrum; use shared::core::spectrum::Spectrum;
use shared::spectra::RGBColorSpace; use shared::spectra::RGBColorSpace;
use shared::utils::math::SquareMatrix; use shared::utils::math::SquareMatrix;
@ -30,7 +30,7 @@ impl RGBColorSpaceData {
rgb_to_spectrum_table: Ptr<RGBToSpectrumTable>, rgb_to_spectrum_table: Ptr<RGBToSpectrumTable>,
) -> Self { ) -> Self {
let stdspec = get_spectra_context(); let stdspec = get_spectra_context();
let w_xyz: XYZ = Spectrum::Dense(*illuminant).to_xyz(&stdspec); let w_xyz: XYZ = Spectrum::Dense(illuminant.device()).to_xyz(&stdspec);
let w = w_xyz.xy(); let w = w_xyz.xy();
let r_xyz = XYZ::from_xyy(r, Some(1.0)); let r_xyz = XYZ::from_xyy(r, Some(1.0));
let g_xyz = XYZ::from_xyy(g, Some(1.0)); let g_xyz = XYZ::from_xyy(g, Some(1.0));
@ -51,7 +51,7 @@ impl RGBColorSpaceData {
g, g,
b, b,
w, w,
illuminant: *illuminant, illuminant: illuminant.device(),
xyz_from_rgb, xyz_from_rgb,
rgb_from_xyz, rgb_from_xyz,
rgb_to_spectrum_table, rgb_to_spectrum_table,

View file

@ -5,30 +5,31 @@ use shared::spectra::{
BlackbodySpectrum, DenselySampledSpectrum, LAMBDA_MAX, LAMBDA_MIN, PiecewiseLinearSpectrum, BlackbodySpectrum, DenselySampledSpectrum, LAMBDA_MAX, LAMBDA_MIN, PiecewiseLinearSpectrum,
}; };
use shared::utils::math::square; use shared::utils::math::square;
use std::hash::{Hash, Hasher};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct DenselySampledSpectrumBuffer { pub struct DenselySampledSpectrumBuffer {
pub device: DenselySampledSpectrum, pub lambda_min: i32,
pub _storage: Vec<Float>, pub lambda_max: i32,
pub values: Vec<Float>,
} }
impl std::ops::Deref for DenselySampledSpectrumBuffer { impl Hash for DenselySampledSpectrumBuffer {
type Target = DenselySampledSpectrum; fn hash<H: Hasher>(&self, state: &mut H) {
fn deref(&self) -> &Self::Target { self.lambda_min.hash(state);
&self.device self.lambda_max.hash(state);
for &val in &self.values {
val.to_bits().hash(state);
}
} }
} }
impl DenselySampledSpectrumBuffer { impl DenselySampledSpectrumBuffer {
pub fn new(lambda_min: i32, lambda_max: i32, values: Vec<Float>) -> Self { pub fn new(lambda_min: i32, lambda_max: i32, values: Vec<Float>) -> Self {
let view = DenselySampledSpectrum { Self {
lambda_min, lambda_min,
lambda_max, lambda_max,
values: values.as_ptr().into(), values,
};
Self {
device: view,
_storage: values,
} }
} }
@ -98,16 +99,16 @@ impl DenselySampledSpectrumBuffer {
Self::from_function(|lambda| temp_pls.evaluate(lambda), LAMBDA_MIN, LAMBDA_MAX) Self::from_function(|lambda| temp_pls.evaluate(lambda), LAMBDA_MIN, LAMBDA_MAX)
} }
pub fn as_view(&self) -> DenselySampledSpectrum { pub fn device(&self) -> DenselySampledSpectrum {
DenselySampledSpectrum { DenselySampledSpectrum {
lambda_min: self.device.lambda_min, lambda_min: self.lambda_min,
lambda_max: self.device.lambda_max, lambda_max: self.lambda_max,
values: self._storage.as_ptr().into(), values: self.values.as_ptr().into(),
} }
} }
pub fn scale(&mut self, s: Float) { pub fn scale(&mut self, s: Float) {
for v in &mut self._storage { for v in &mut self.values {
*v *= s; *v *= s;
} }
} }

View file

@ -16,12 +16,8 @@ pub mod piecewise;
pub use dense::DenselySampledSpectrumBuffer; pub use dense::DenselySampledSpectrumBuffer;
fn get_d65_illuminant_buffer() -> DenselySampledSpectrumBuffer { fn get_d65_illuminant_buffer() -> &DenselySampledSpectrumBuffer {
DenselySampledSpectrumBuffer::new( &CIE_D65_DATA
CIE_D65_DATA.device.lambda_min,
CIE_D65_DATA.device.lambda_max,
CIE_D65_DATA._storage.clone(),
)
} }
static CIE_X_DATA: LazyLock<DenselySampledSpectrumBuffer> = static CIE_X_DATA: LazyLock<DenselySampledSpectrumBuffer> =
@ -34,27 +30,27 @@ static CIE_D65_DATA: LazyLock<DenselySampledSpectrumBuffer> =
LazyLock::new(|| data::create_cie_buffer(&CIE_D65)); LazyLock::new(|| data::create_cie_buffer(&CIE_D65));
pub fn cie_x() -> Spectrum { pub fn cie_x() -> Spectrum {
Spectrum::Dense(CIE_X_DATA.device) Spectrum::Dense(CIE_X_DATA.device())
} }
pub fn cie_y() -> Spectrum { pub fn cie_y() -> Spectrum {
Spectrum::Dense(CIE_Y_DATA.device) Spectrum::Dense(CIE_Y_DATA.device())
} }
pub fn cie_z() -> Spectrum { pub fn cie_z() -> Spectrum {
Spectrum::Dense(CIE_Z_DATA.device) Spectrum::Dense(CIE_Z_DATA.device())
} }
pub fn cie_d65() -> Spectrum { pub fn cie_d65() -> Spectrum {
Spectrum::Dense(CIE_D65_DATA.device) Spectrum::Dense(CIE_D65_DATA.device())
} }
pub fn get_spectra_context() -> StandardSpectra { pub fn get_spectra_context() -> StandardSpectra {
StandardSpectra { StandardSpectra {
x: CIE_X_DATA.device, x: CIE_X_DATA.device(),
y: CIE_Y_DATA.device, y: CIE_Y_DATA.device(),
z: CIE_Z_DATA.device, z: CIE_Z_DATA.device(),
d65: CIE_D65_DATA.device, d65: CIE_D65_DATA.device(),
} }
} }

View file

@ -1,4 +1,8 @@
use crate::core::texture::{CreateSpectrumTexture, FloatTextureTrait, SpectrumTextureTrait}; use crate::Arena;
use crate::core::texture::{
CreateFloatTexture, CreateSpectrumTexture, FloatTextureTrait, SpectrumTexture,
SpectrumTextureTrait,
};
use anyhow::Result; use anyhow::Result;
use shared::core::texture::SpectrumType; use shared::core::texture::SpectrumType;
use shared::{ use shared::{
@ -11,19 +15,12 @@ use crate::{
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateFloatBilerpTexture { impl CreateFloatTexture for FloatBilerpTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateFloatBilerpTexture for FloatBilerpTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -1,4 +1,5 @@
use anyhow::Result; use anyhow::Result;
use crate::Arena;
use shared::{ use shared::{
core::texture::SpectrumType, core::texture::SpectrumType,
textures::{FloatCheckerboardTexture, SpectrumCheckerboardTexture}, textures::{FloatCheckerboardTexture, SpectrumCheckerboardTexture},
@ -7,25 +8,18 @@ use shared::{
use crate::{ use crate::{
core::texture::{ core::texture::{
CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTexture, CreateFloatTexture, CreateSpectrumTexture, FloatTexture, FloatTextureTrait,
SpectrumTextureTrait, SpectrumTexture, SpectrumTextureTrait,
}, },
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateFloatCheckerboardTexture { impl CreateFloatTexture for FloatCheckerboardTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateFloatCheckerboardTexture for FloatCheckerboardTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -1,4 +1,5 @@
use anyhow::Result; use anyhow::Result;
use crate::Arena;
use shared::{ use shared::{
core::texture::{SpectrumType, TextureEvalContext}, core::texture::{SpectrumType, TextureEvalContext},
textures::{FloatConstantTexture, SpectrumConstantTexture}, textures::{FloatConstantTexture, SpectrumConstantTexture},
@ -7,25 +8,18 @@ use shared::{
use crate::{ use crate::{
core::texture::{ core::texture::{
CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTextureTrait, CreateFloatTexture, CreateSpectrumTexture, FloatTexture, FloatTextureTrait,
SpectrumTextureTrait, SpectrumTextureTrait, SpectrumTextureTrait, SpectrumTexture
}, },
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateFloatConstantTexture { impl CreateFloatTexture for FloatConstantTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateFloatConstantTexture for FloatConstantTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -1,39 +1,37 @@
use crate::Arena;
use anyhow::Result; use anyhow::Result;
use shared::{ use shared::{
core::texture::SpectrumType,
textures::{FloatDotsTexture, SpectrumDotsTexture}, textures::{FloatDotsTexture, SpectrumDotsTexture},
utils::Transform, utils::Transform,
}; };
use crate::{ use crate::{
core::texture::{CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTextureTrait}, core::texture::{
CreateFloatTexture, CreateSpectrumTexture, FloatTexture, FloatTextureTrait,
SpectrumTexture, SpectrumTextureTrait,
},
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateFloatDotsTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl FloatTextureTrait for FloatDotsTexture { impl FloatTextureTrait for FloatDotsTexture {
fn evaluate(&self, ctx: &shared::core::texture::TextureEvalContext) -> shared::Float { fn evaluate(&self, _ctx: &shared::core::texture::TextureEvalContext) -> shared::Float {
todo!() todo!()
} }
} }
impl CreateFloatDotsTexture for FloatDotsTexture { impl CreateFloatTexture for FloatDotsTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }
} }
impl SpectrumTextureTrait for SpectrumScaledTexture { impl SpectrumTextureTrait for SpectrumDotsTexture {
fn evaluate( fn evaluate(
&self, &self,
_ctx: &shared::core::texture::TextureEvalContext, _ctx: &shared::core::texture::TextureEvalContext,

View file

@ -1,25 +1,19 @@
use anyhow::Result; use anyhow::Result;
use crate::Arena;
use shared::core::texture::TextureEvalContext; use shared::core::texture::TextureEvalContext;
use shared::{textures::FBmTexture, utils::Transform}; use shared::{textures::FBmTexture, utils::Transform};
use crate::{ use crate::{
core::texture::{FloatTexture, FloatTextureTrait}, core::texture::{CreateFloatTexture, FloatTexture, FloatTextureTrait},
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateFBmTexture { impl CreateFloatTexture for FBmTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateFBmTexture for FBmTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -1,9 +1,11 @@
use crate::Arena;
use crate::core::texture::{ use crate::core::texture::{
CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTexture, SpectrumTextureTrait, CreateFloatTexture, CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTexture,
SpectrumTextureTrait,
}; };
use crate::core::texture::{TexInfo, get_texture_cache}; use crate::core::texture::{TexInfo, get_texture_cache};
use crate::utils::TextureParameterDictionary;
use crate::utils::mipmap::{MIPMap, MIPMapFilterOptions}; use crate::utils::mipmap::{MIPMap, MIPMapFilterOptions};
use crate::utils::{FileLoc, TextureParameterDictionary};
use anyhow::Result; use anyhow::Result;
use shared::Float; use shared::Float;
use shared::core::color::ColorEncoding; use shared::core::color::ColorEncoding;
@ -16,6 +18,7 @@ use shared::spectra::{
RGBAlbedoSpectrum, RGBIlluminantSpectrum, RGBUnboundedSpectrum, SampledSpectrum, RGBAlbedoSpectrum, RGBIlluminantSpectrum, RGBUnboundedSpectrum, SampledSpectrum,
SampledWavelengths, SampledWavelengths,
}; };
use shared::utils::Transform;
use std::path::Path; use std::path::Path;
use std::sync::Arc; use std::sync::Arc;
// use crate::utils::{FileLoc, TextureParameterDictionary}; // use crate::utils::{FileLoc, TextureParameterDictionary};
@ -197,19 +200,12 @@ impl FloatTextureTrait for FloatImageTexture {
} }
} }
pub trait CreateFloatImageTexture { impl CreateFloatTexture for FloatImageTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateFloatImageTexture for FloatImageTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -1,4 +1,5 @@
use crate::core::texture::{CreateSpectrumTexture, SpectrumTexture, SpectrumTextureTrait}; use crate::core::texture::{CreateSpectrumTexture, SpectrumTexture, SpectrumTextureTrait};
use shared::core::texture::SpectrumType;
use shared::textures::MarbleTexture; use shared::textures::MarbleTexture;
impl SpectrumTextureTrait for MarbleTexture { impl SpectrumTextureTrait for MarbleTexture {
@ -13,10 +14,10 @@ impl SpectrumTextureTrait for MarbleTexture {
impl CreateSpectrumTexture for MarbleTexture { impl CreateSpectrumTexture for MarbleTexture {
fn create( fn create(
render_from_texture: shared::utils::Transform, _render_from_texture: shared::utils::Transform,
parameters: crate::utils::TextureParameterDictionary, _parameters: crate::utils::TextureParameterDictionary,
spectrum_type: SpectrumType, _spectrum_type: SpectrumType,
loc: crate::utils::FileLoc, _loc: crate::utils::FileLoc,
) -> anyhow::Result<SpectrumTexture> { ) -> anyhow::Result<SpectrumTexture> {
todo!() todo!()
} }

View file

@ -1,11 +1,12 @@
use crate::Arena;
use crate::core::texture::{ use crate::core::texture::{
CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTexture, SpectrumTextureTrait, CreateSpectrumTexture, FloatTexture, FloatTextureTrait, SpectrumTexture, SpectrumTextureTrait,
}; };
use crate::utils::{Arena, FileLoc, TextureParameterDictionary}; use crate::utils::{FileLoc, TextureParameterDictionary};
use anyhow::Result; use anyhow::Result;
use shared::Float; use shared::Float;
use shared::core::geometry::{Vector3f, VectorLike}; use shared::core::geometry::{Vector3f, VectorLike};
use shared::core::texture::TextureEvalContext; use shared::core::texture::{SpectrumType, TextureEvalContext};
use shared::spectra::{SampledSpectrum, SampledWavelengths}; use shared::spectra::{SampledSpectrum, SampledWavelengths};
use shared::utils::Transform; use shared::utils::Transform;
use std::sync::Arc; use std::sync::Arc;
@ -97,11 +98,11 @@ pub struct SpectrumMixTexture {
impl CreateSpectrumTexture for SpectrumMixTexture { impl CreateSpectrumTexture for SpectrumMixTexture {
fn create( fn create(
render_from_texture: Transform, _render_from_texture: Transform,
parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
spectrum_type: SpectrumType, _spectrum_type: SpectrumType,
loc: FileLoc, _loc: FileLoc,
) -> Result<FloatTexture> { ) -> Result<SpectrumTexture> {
todo!() todo!()
} }
} }
@ -121,10 +122,10 @@ pub struct SpectrumDirectionMixTexture {
impl CreateSpectrumTexture for SpectrumDirectionMixTexture { impl CreateSpectrumTexture for SpectrumDirectionMixTexture {
fn create( fn create(
render_from_texture: Transform, _render_from_texture: Transform,
parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
spectrum_type: SpectrumType, _spectrum_type: SpectrumType,
loc: FileLoc, _loc: FileLoc,
) -> Result<SpectrumTexture> { ) -> Result<SpectrumTexture> {
todo!() todo!()
} }

View file

@ -11,15 +11,6 @@ mod scaled;
mod windy; mod windy;
mod wrinkled; mod wrinkled;
pub use bilerp::*;
pub use checkerboard::*;
pub use constant::*;
pub use dots::*;
pub use fbm::*;
pub use image::*; pub use image::*;
pub use marble::*;
pub use mix::*; pub use mix::*;
pub use ptex::*;
pub use scaled::*; pub use scaled::*;
pub use windy::*;
pub use wrinkled::*;

View file

@ -1,9 +1,10 @@
use crate::Arena;
use crate::core::texture::{CreateSpectrumTexture, FloatTexture, SpectrumTexture}; use crate::core::texture::{CreateSpectrumTexture, FloatTexture, SpectrumTexture};
use crate::core::texture::{FloatTextureTrait, SpectrumTextureTrait}; use crate::core::texture::{FloatTextureTrait, SpectrumTextureTrait};
use crate::utils::{Arena, FileLoc, TextureParameterDictionary}; use crate::utils::{FileLoc, TextureParameterDictionary};
use anyhow::Result; use anyhow::Result;
use shared::Float; use shared::Float;
use shared::core::texture::TextureEvalContext; use shared::core::texture::{SpectrumType, TextureEvalContext};
use shared::spectra::{SampledSpectrum, SampledWavelengths}; use shared::spectra::{SampledSpectrum, SampledWavelengths};
use shared::utils::Transform; use shared::utils::Transform;
use std::sync::Arc; use std::sync::Arc;
@ -69,11 +70,11 @@ pub struct SpectrumScaledTexture {
impl CreateSpectrumTexture for SpectrumScaledTexture { impl CreateSpectrumTexture for SpectrumScaledTexture {
fn create( fn create(
render_from_texture: Transform, _render_from_texture: Transform,
parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
spectrum_type: SpectrumType, _spectrum_type: SpectrumType,
loc: FileLoc, _loc: FileLoc,
) -> Result<FloatTexture> { ) -> Result<SpectrumTexture> {
todo!() todo!()
} }
} }

View file

@ -1,24 +1,18 @@
use anyhow::Result; use anyhow::Result;
use crate::Arena;
use shared::{textures::WindyTexture, utils::Transform}; use shared::{textures::WindyTexture, utils::Transform};
use crate::{ use crate::{
core::texture::{FloatTexture, FloatTextureTrait}, core::texture::{CreateFloatTexture, FloatTexture, FloatTextureTrait},
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateWindyTexture { impl CreateFloatTexture for WindyTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateWindyTexture for WindyTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -1,24 +1,18 @@
use crate::Arena;
use anyhow::Result; use anyhow::Result;
use shared::{textures::WrinkledTexture, utils::Transform}; use shared::{textures::WrinkledTexture, utils::Transform};
use crate::{ use crate::{
core::texture::{FloatTexture, FloatTextureTrait}, core::texture::{CreateFloatTexture, FloatTexture, FloatTextureTrait},
utils::{FileLoc, TextureParameterDictionary}, utils::{FileLoc, TextureParameterDictionary},
}; };
pub trait CreateWrinkledTexture { impl CreateFloatTexture for WrinkledTexture {
fn create(
render_from_texture: Transform,
parameters: TextureParameterDictionary,
loc: FileLoc,
) -> Result<FloatTexture>;
}
impl CreateWrinkledTexture for WrinkledTexture {
fn create( fn create(
_render_from_texture: Transform, _render_from_texture: Transform,
_parameters: TextureParameterDictionary, _parameters: TextureParameterDictionary,
_loc: FileLoc, _loc: FileLoc,
_arena: &mut Arena,
) -> Result<FloatTexture> { ) -> Result<FloatTexture> {
todo!() todo!()
} }

View file

@ -172,7 +172,7 @@ impl Upload for Spectrum {
impl Upload for DenselySampledSpectrumBuffer { impl Upload for DenselySampledSpectrumBuffer {
type Target = DenselySampledSpectrum; type Target = DenselySampledSpectrum;
fn upload(&self, arena: &mut Arena) -> Ptr<Self::Target> { fn upload(&self, arena: &mut Arena) -> Ptr<Self::Target> {
arena.alloc(self.device) arena.alloc(self.device())
} }
} }

View file

@ -61,7 +61,7 @@ impl<T> Array2D<T> {
let width = extent.p_max.x() - extent.p_min.x(); let width = extent.p_max.x() - extent.p_min.x();
let device = DeviceArray2D { let device = DeviceArray2D {
extent, extent,
values: storage.as_mut_ptr(), values: values.as_mut_ptr().into(),
stride: width, stride: width,
}; };
Self { device, values } Self { device, values }

View file

@ -1,4 +1,4 @@
use crate::core::spectrum::{SPECTRUM_CACHE, get_spectrum_cache}; use crate::core::spectrum::SPECTRUM_FILE_CACHE;
use crate::core::texture::{FloatTexture, SpectrumTexture}; use crate::core::texture::{FloatTexture, SpectrumTexture};
use crate::spectra::data::get_named_spectrum; use crate::spectra::data::get_named_spectrum;
use crate::spectra::piecewise::PiecewiseLinearSpectrumBuffer; use crate::spectra::piecewise::PiecewiseLinearSpectrumBuffer;