Some more refactoring, more error correction. When will this end?
This commit is contained in:
parent
380b1c9f90
commit
14418472d5
57 changed files with 275 additions and 290 deletions
|
|
@ -1,7 +1,5 @@
|
||||||
use crate::core::bsdf::BSDF;
|
use crate::core::bsdf::{BSDF, BSDFSample};
|
||||||
use crate::core::bxdf::{
|
use crate::core::bxdf::{BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
BSDFSample, BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode,
|
|
||||||
};
|
|
||||||
use crate::core::color::RGB;
|
use crate::core::color::RGB;
|
||||||
use crate::core::geometry::{
|
use crate::core::geometry::{
|
||||||
Normal3f, Point2f, Vector3f, abs_cos_theta, cos_theta, same_hemisphere,
|
Normal3f, Point2f, Vector3f, abs_cos_theta, cos_theta, same_hemisphere,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
use crate::core::bxdf::{
|
use crate::core::bsdf::BSDFSample;
|
||||||
BSDFSample, BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode,
|
use crate::core::bxdf::{BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
};
|
|
||||||
use crate::core::geometry::{
|
use crate::core::geometry::{
|
||||||
Normal3f, Point2f, Vector3f, VectorLike, abs_cos_theta, same_hemisphere,
|
Normal3f, Point2f, Vector3f, VectorLike, abs_cos_theta, same_hemisphere,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
use crate::core::bxdf::{
|
use crate::core::bsdf::BSDFSample;
|
||||||
BSDFSample, BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode,
|
use crate::core::bxdf::{BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
};
|
|
||||||
use crate::core::geometry::{
|
use crate::core::geometry::{
|
||||||
Normal3f, Point2f, Vector3f, VectorLike, abs_cos_theta, cos_theta, same_hemisphere,
|
Normal3f, Point2f, Vector3f, VectorLike, abs_cos_theta, cos_theta, same_hemisphere,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
use crate::core::bxdf::{
|
use crate::core::bsdf::BSDFSample;
|
||||||
BSDFSample, BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode,
|
use crate::core::bxdf::{BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
};
|
|
||||||
use crate::core::geometry::{Point2f, Vector3f, abs_cos_theta, same_hemisphere};
|
use crate::core::geometry::{Point2f, Vector3f, abs_cos_theta, same_hemisphere};
|
||||||
use crate::spectra::SampledSpectrum;
|
use crate::spectra::SampledSpectrum;
|
||||||
use crate::utils::sampling::{cosine_hemisphere_pdf, sample_cosine_hemisphere};
|
use crate::utils::sampling::{cosine_hemisphere_pdf, sample_cosine_hemisphere};
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
use super::ConductorBxDF;
|
use super::ConductorBxDF;
|
||||||
use super::DielectricBxDF;
|
use super::DielectricBxDF;
|
||||||
use super::DiffuseBxDF;
|
use super::DiffuseBxDF;
|
||||||
use crate::core::bxdf::{
|
use crate::core::bsdf::BSDFSample;
|
||||||
BSDFSample, BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode,
|
use crate::core::bxdf::{BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
};
|
|
||||||
use crate::core::color::RGB;
|
use crate::core::color::RGB;
|
||||||
use crate::core::geometry::{
|
use crate::core::geometry::{
|
||||||
Frame, Normal3f, Point2f, Vector3f, VectorLike, abs_cos_theta, cos_theta, same_hemisphere,
|
Frame, Normal3f, Point2f, Vector3f, VectorLike, abs_cos_theta, cos_theta, same_hemisphere,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
use crate::core::bxdf::{
|
use crate::core::bsdf::BSDFSample;
|
||||||
BSDFSample, BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode,
|
use crate::core::bxdf::{BxDFFlags, BxDFReflTransFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
};
|
|
||||||
use crate::core::geometry::{
|
use crate::core::geometry::{
|
||||||
Point2f, Vector3f, VectorLike, abs_cos_theta, cos_theta, same_hemisphere, spherical_direction,
|
Point2f, Vector3f, VectorLike, abs_cos_theta, cos_theta, same_hemisphere, spherical_direction,
|
||||||
spherical_theta,
|
spherical_theta,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::Float;
|
use crate::Float;
|
||||||
use crate::core::bxdf::{BSDFSample, BxDF, BxDFFlags, BxDFTrait, FArgs, TransportMode};
|
use crate::core::bxdf::{BxDF, BxDFFlags, BxDFTrait, FArgs, TransportMode};
|
||||||
use crate::core::geometry::{Frame, Normal3f, Point2f, Vector3f, VectorLike};
|
use crate::core::geometry::{Frame, Normal3f, Point2f, Vector3f, VectorLike};
|
||||||
use crate::spectra::SampledSpectrum;
|
use crate::spectra::SampledSpectrum;
|
||||||
use crate::utils::Ptr;
|
use crate::utils::Ptr;
|
||||||
|
|
@ -124,3 +124,67 @@ impl BSDF {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct BSDFSample {
|
||||||
|
pub f: SampledSpectrum,
|
||||||
|
pub wi: Vector3f,
|
||||||
|
pub pdf: Float,
|
||||||
|
pub flags: BxDFFlags,
|
||||||
|
pub eta: Float,
|
||||||
|
pub pdf_is_proportional: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for BSDFSample {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
f: SampledSpectrum::default(),
|
||||||
|
wi: Vector3f::default(),
|
||||||
|
pdf: 0.0,
|
||||||
|
flags: BxDFFlags::empty(),
|
||||||
|
eta: 1.0,
|
||||||
|
pdf_is_proportional: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BSDFSample {
|
||||||
|
pub fn new(
|
||||||
|
f: SampledSpectrum,
|
||||||
|
wi: Vector3f,
|
||||||
|
pdf: Float,
|
||||||
|
flags: BxDFFlags,
|
||||||
|
eta: Float,
|
||||||
|
pdf_is_proportional: bool,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
f,
|
||||||
|
wi,
|
||||||
|
pdf,
|
||||||
|
flags,
|
||||||
|
eta,
|
||||||
|
pdf_is_proportional,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_reflective(&self) -> bool {
|
||||||
|
self.flags.is_reflective()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn is_transmissive(&self) -> bool {
|
||||||
|
self.flags.is_transmissive()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn is_diffuse(&self) -> bool {
|
||||||
|
self.flags.is_diffuse()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn is_glossy(&self) -> bool {
|
||||||
|
self.flags.is_glossy()
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn is_specular(&self) -> bool {
|
||||||
|
self.flags.is_specular()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::bxdfs::*;
|
use crate::bxdfs::*;
|
||||||
|
use crate::core::bsdf::BSDFSample;
|
||||||
use crate::core::geometry::{Point2f, Vector3f, abs_cos_theta};
|
use crate::core::geometry::{Point2f, Vector3f, abs_cos_theta};
|
||||||
use crate::spectra::SampledSpectrum;
|
use crate::spectra::SampledSpectrum;
|
||||||
use crate::utils::sampling::{sample_uniform_hemisphere, uniform_hemisphere_pdf};
|
use crate::utils::sampling::{sample_uniform_hemisphere, uniform_hemisphere_pdf};
|
||||||
|
|
@ -82,70 +83,6 @@ impl Not for TransportMode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct BSDFSample {
|
|
||||||
pub f: SampledSpectrum,
|
|
||||||
pub wi: Vector3f,
|
|
||||||
pub pdf: Float,
|
|
||||||
pub flags: BxDFFlags,
|
|
||||||
pub eta: Float,
|
|
||||||
pub pdf_is_proportional: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for BSDFSample {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
f: SampledSpectrum::default(),
|
|
||||||
wi: Vector3f::default(),
|
|
||||||
pdf: 0.0,
|
|
||||||
flags: BxDFFlags::empty(),
|
|
||||||
eta: 1.0,
|
|
||||||
pdf_is_proportional: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BSDFSample {
|
|
||||||
pub fn new(
|
|
||||||
f: SampledSpectrum,
|
|
||||||
wi: Vector3f,
|
|
||||||
pdf: Float,
|
|
||||||
flags: BxDFFlags,
|
|
||||||
eta: Float,
|
|
||||||
pdf_is_proportional: bool,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
|
||||||
f,
|
|
||||||
wi,
|
|
||||||
pdf,
|
|
||||||
flags,
|
|
||||||
eta,
|
|
||||||
pdf_is_proportional,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn is_reflective(&self) -> bool {
|
|
||||||
self.flags.is_reflective()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
pub fn is_transmissive(&self) -> bool {
|
|
||||||
self.flags.is_transmissive()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
pub fn is_diffuse(&self) -> bool {
|
|
||||||
self.flags.is_diffuse()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
pub fn is_glossy(&self) -> bool {
|
|
||||||
self.flags.is_glossy()
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
pub fn is_specular(&self) -> bool {
|
|
||||||
self.flags.is_specular()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct FArgs {
|
pub struct FArgs {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ use crate::spectra::{
|
||||||
ConstantSpectrum, DenselySampledSpectrum, LAMBDA_MAX, LAMBDA_MIN, N_SPECTRUM_SAMPLES,
|
ConstantSpectrum, DenselySampledSpectrum, LAMBDA_MAX, LAMBDA_MIN, N_SPECTRUM_SAMPLES,
|
||||||
PiecewiseLinearSpectrum, RGBColorSpace, SampledSpectrum, SampledWavelengths, colorspace,
|
PiecewiseLinearSpectrum, RGBColorSpace, SampledSpectrum, SampledWavelengths, colorspace,
|
||||||
};
|
};
|
||||||
use crate::utils::containers::Array2D;
|
use crate::utils::containers::DeviceArray2D;
|
||||||
use crate::utils::math::linear_least_squares;
|
use crate::utils::math::linear_least_squares;
|
||||||
use crate::utils::math::{SquareMatrix, wrap_equal_area_square};
|
use crate::utils::math::{SquareMatrix, wrap_equal_area_square};
|
||||||
use crate::utils::sampling::VarianceEstimator;
|
use crate::utils::sampling::VarianceEstimator;
|
||||||
|
|
@ -28,7 +28,7 @@ pub struct RGBFilm {
|
||||||
pub write_fp16: bool,
|
pub write_fp16: bool,
|
||||||
pub filter_integral: Float,
|
pub filter_integral: Float,
|
||||||
pub output_rgbf_from_sensor_rgb: SquareMatrix<Float, 3>,
|
pub output_rgbf_from_sensor_rgb: SquareMatrix<Float, 3>,
|
||||||
pub pixels: Array2D<RGBPixel>,
|
pub pixels: DeviceArray2D<RGBPixel>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
|
@ -215,7 +215,7 @@ pub struct GBufferFilm {
|
||||||
pub base: FilmBase,
|
pub base: FilmBase,
|
||||||
output_from_render: AnimatedTransform,
|
output_from_render: AnimatedTransform,
|
||||||
apply_inverse: bool,
|
apply_inverse: bool,
|
||||||
pixels: Array2D<GBufferPixel>,
|
pixels: DeviceArray2D<GBufferPixel>,
|
||||||
colorspace: RGBColorSpace,
|
colorspace: RGBColorSpace,
|
||||||
max_component_value: Float,
|
max_component_value: Float,
|
||||||
write_fp16: bool,
|
write_fp16: bool,
|
||||||
|
|
@ -346,7 +346,7 @@ pub struct SpectralFilm {
|
||||||
pub max_component_value: Float,
|
pub max_component_value: Float,
|
||||||
pub write_fp16: bool,
|
pub write_fp16: bool,
|
||||||
pub filter_integral: Float,
|
pub filter_integral: Float,
|
||||||
pub pixels: Array2D<SpectralPixel>,
|
pub pixels: DeviceArray2D<SpectralPixel>,
|
||||||
pub output_rgbf_from_sensor_rgb: SquareMatrix<Float, 3>,
|
pub output_rgbf_from_sensor_rgb: SquareMatrix<Float, 3>,
|
||||||
pub bucket_sums: *mut f64,
|
pub bucket_sums: *mut f64,
|
||||||
pub weight_sums: *mut f64,
|
pub weight_sums: *mut f64,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::core::geometry::{Bounds2f, Bounds2i, Point2f, Point2i, Vector2f};
|
use crate::core::geometry::{Bounds2f, Bounds2i, Point2f, Point2i, Vector2f};
|
||||||
use crate::core::pbrt::Float;
|
use crate::core::pbrt::Float;
|
||||||
use crate::filters::*;
|
use crate::filters::*;
|
||||||
use crate::utils::containers::Array2D;
|
use crate::utils::containers::DeviceArray2D;
|
||||||
use crate::utils::math::{gaussian, gaussian_integral, lerp, sample_tent, windowed_sinc};
|
use crate::utils::math::{gaussian, gaussian_integral, lerp, sample_tent, windowed_sinc};
|
||||||
use crate::utils::sampling::DevicePiecewiseConstant2D;
|
use crate::utils::sampling::DevicePiecewiseConstant2D;
|
||||||
use enum_dispatch::enum_dispatch;
|
use enum_dispatch::enum_dispatch;
|
||||||
|
|
@ -16,7 +16,7 @@ pub struct FilterSample {
|
||||||
pub struct FilterSampler {
|
pub struct FilterSampler {
|
||||||
pub domain: Bounds2f,
|
pub domain: Bounds2f,
|
||||||
pub distrib: DevicePiecewiseConstant2D,
|
pub distrib: DevicePiecewiseConstant2D,
|
||||||
pub f: Array2D<Float>,
|
pub f: DeviceArray2D<Float>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FilterSampler {
|
impl FilterSampler {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use crate::Float;
|
||||||
use crate::core::color::{ColorEncoding, ColorEncodingTrait, LINEAR};
|
use crate::core::color::{ColorEncoding, ColorEncodingTrait, LINEAR};
|
||||||
use crate::core::geometry::{Bounds2f, Point2f, Point2fi, Point2i};
|
use crate::core::geometry::{Bounds2f, Point2f, Point2fi, Point2i};
|
||||||
use crate::utils::Ptr;
|
use crate::utils::Ptr;
|
||||||
use crate::utils::containers::Array2D;
|
use crate::utils::containers::DeviceArray2D;
|
||||||
use crate::utils::math::{f16_to_f32, lerp, square};
|
use crate::utils::math::{f16_to_f32, lerp, square};
|
||||||
use core::hash;
|
use core::hash;
|
||||||
use half::f16;
|
use half::f16;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ use crate::core::geometry::{Bounds2f, Point2f, Point2i, Vector2f};
|
||||||
use crate::core::options::{PBRTOptions, get_options};
|
use crate::core::options::{PBRTOptions, get_options};
|
||||||
use crate::core::pbrt::{Float, ONE_MINUS_EPSILON, PI, PI_OVER_2, PI_OVER_4};
|
use crate::core::pbrt::{Float, ONE_MINUS_EPSILON, PI, PI_OVER_2, PI_OVER_4};
|
||||||
use crate::utils::Ptr;
|
use crate::utils::Ptr;
|
||||||
use crate::utils::containers::Array2D;
|
use crate::utils::containers::DeviceArray2D;
|
||||||
use crate::utils::math::{
|
use crate::utils::math::{
|
||||||
BinaryPermuteScrambler, DeviceDigitPermutation, FastOwenScrambler, NoRandomizer, OwenScrambler,
|
BinaryPermuteScrambler, DeviceDigitPermutation, FastOwenScrambler, NoRandomizer, OwenScrambler,
|
||||||
PRIME_TABLE_SIZE, Scrambler, clamp, encode_morton_2, inverse_radical_inverse, lerp, log2_int,
|
PRIME_TABLE_SIZE, Scrambler, clamp, encode_morton_2, inverse_radical_inverse, lerp, log2_int,
|
||||||
|
|
@ -80,7 +80,7 @@ impl SamplerTrait for IndependentSampler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const MAX_HALTON_RESOLUTION: i32 = 128;
|
pub const MAX_HALTON_RESOLUTION: i32 = 128;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Default, Clone, PartialEq, Eq, Copy)]
|
#[derive(Debug, Default, Clone, PartialEq, Eq, Copy)]
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ use crate::core::geometry::{
|
||||||
use crate::core::interaction::{Interaction, InteractionTrait, SurfaceInteraction};
|
use crate::core::interaction::{Interaction, InteractionTrait, SurfaceInteraction};
|
||||||
use crate::core::pbrt::{Float, gamma};
|
use crate::core::pbrt::{Float, gamma};
|
||||||
use crate::core::shape::{Shape, ShapeIntersection, ShapeSample, ShapeSampleContext, ShapeTrait};
|
use crate::core::shape::{Shape, ShapeIntersection, ShapeSample, ShapeSampleContext, ShapeTrait};
|
||||||
|
use crate::utils::Ptr;
|
||||||
use crate::utils::Transform;
|
use crate::utils::Transform;
|
||||||
use crate::utils::math::{SquareMatrix, clamp, difference_of_products, lerp, quadratic};
|
use crate::utils::math::{SquareMatrix, clamp, difference_of_products, lerp, quadratic};
|
||||||
use crate::utils::mesh::DeviceBilinearPatchMesh;
|
use crate::utils::mesh::DeviceBilinearPatchMesh;
|
||||||
|
|
@ -46,15 +47,15 @@ impl BilinearIntersection {
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct BilinearPatchShape {
|
pub struct BilinearPatchShape {
|
||||||
pub mesh: DeviceBilinearPatchMesh,
|
pub mesh: Ptr<DeviceBilinearPatchMesh>,
|
||||||
pub blp_index: u32,
|
pub blp_index: i32,
|
||||||
pub area: Float,
|
pub area: Float,
|
||||||
pub rectangle: bool,
|
pub rectangle: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BilinearPatchShape {
|
impl BilinearPatchShape {
|
||||||
pub const MIN_SPHERICAL_SAMPLE_AREA: Float = 1e-4;
|
pub const MIN_SPHERICAL_SAMPLE_AREA: Float = 1e-4;
|
||||||
fn mesh(&self) -> DeviceBilinearPatchMesh {
|
fn mesh(&self) -> Ptr<DeviceBilinearPatchMesh> {
|
||||||
self.mesh
|
self.mesh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -117,7 +118,7 @@ impl BilinearPatchShape {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(target_os = "cuda"))]
|
#[cfg(not(target_os = "cuda"))]
|
||||||
pub fn new(mesh: DeviceBilinearPatchMesh, blp_index: u32) -> Self {
|
pub fn new(mesh: Ptr<DeviceBilinearPatchMesh>, blp_index: i32) -> Self {
|
||||||
let mut bp = BilinearPatchShape {
|
let mut bp = BilinearPatchShape {
|
||||||
mesh,
|
mesh,
|
||||||
blp_index,
|
blp_index,
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ use crate::core::interaction::{
|
||||||
};
|
};
|
||||||
use crate::core::pbrt::gamma;
|
use crate::core::pbrt::gamma;
|
||||||
use crate::core::shape::{ShapeIntersection, ShapeSample, ShapeSampleContext, ShapeTrait};
|
use crate::core::shape::{ShapeIntersection, ShapeSample, ShapeSampleContext, ShapeTrait};
|
||||||
|
use crate::utils::Ptr;
|
||||||
use crate::utils::math::{difference_of_products, square};
|
use crate::utils::math::{difference_of_products, square};
|
||||||
use crate::utils::mesh::DeviceTriangleMesh;
|
use crate::utils::mesh::DeviceTriangleMesh;
|
||||||
use crate::utils::sampling::{
|
use crate::utils::sampling::{
|
||||||
|
|
@ -34,7 +35,7 @@ impl TriangleIntersection {
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct TriangleShape {
|
pub struct TriangleShape {
|
||||||
pub mesh: DeviceTriangleMesh,
|
pub mesh: Ptr<DeviceTriangleMesh>,
|
||||||
pub tri_index: i32,
|
pub tri_index: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -111,11 +112,11 @@ impl TriangleShape {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(mesh: DeviceTriangleMesh, tri_index: i32) -> Self {
|
pub fn new(mesh: Ptr<DeviceTriangleMesh>, tri_index: i32) -> Self {
|
||||||
Self { mesh, tri_index }
|
Self { mesh, tri_index }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_mesh(&self) -> DeviceTriangleMesh {
|
pub fn get_mesh(&self) -> Ptr<DeviceTriangleMesh> {
|
||||||
self.mesh
|
self.mesh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ pub struct GPUFloatImageTexture {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GPUFloatImageTexture {
|
impl GPUFloatImageTexture {
|
||||||
|
#[allow(unused_variables)]
|
||||||
pub fn evaluate(&self, ctx: &TextureEvalContext) -> Float {
|
pub fn evaluate(&self, ctx: &TextureEvalContext) -> Float {
|
||||||
#[cfg(not(feature = "cuda"))]
|
#[cfg(not(feature = "cuda"))]
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -22,16 +22,16 @@ impl<T> Interpolatable for T where
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct Array2D<T> {
|
pub struct DeviceArray2D<T> {
|
||||||
pub values: *mut T,
|
pub values: *mut T,
|
||||||
pub extent: Bounds2i,
|
pub extent: Bounds2i,
|
||||||
pub stride: i32,
|
pub stride: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl<T: Send> Send for Array2D<T> {}
|
unsafe impl<T: Send> Send for DeviceArray2D<T> {}
|
||||||
unsafe impl<T: Sync> Sync for Array2D<T> {}
|
unsafe impl<T: Sync> Sync for DeviceArray2D<T> {}
|
||||||
|
|
||||||
impl<T> Array2D<T> {
|
impl<T> DeviceArray2D<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn x_size(&self) -> u32 {
|
pub fn x_size(&self) -> u32 {
|
||||||
(self.extent.p_max.x() - self.extent.p_min.x()) as u32
|
(self.extent.p_max.x() - self.extent.p_min.x()) as u32
|
||||||
|
|
@ -90,7 +90,7 @@ impl<T> Array2D<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Index<Point2i> for Array2D<T> {
|
impl<T> Index<Point2i> for DeviceArray2D<T> {
|
||||||
type Output = T;
|
type Output = T;
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn index(&self, p: Point2i) -> &Self::Output {
|
fn index(&self, p: Point2i) -> &Self::Output {
|
||||||
|
|
@ -98,20 +98,20 @@ impl<T> Index<Point2i> for Array2D<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> IndexMut<Point2i> for Array2D<T> {
|
impl<T> IndexMut<Point2i> for DeviceArray2D<T> {
|
||||||
fn index_mut(&mut self, p: Point2i) -> &mut Self::Output {
|
fn index_mut(&mut self, p: Point2i) -> &mut Self::Output {
|
||||||
self.get_mut(p)
|
self.get_mut(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Index<(i32, i32)> for Array2D<T> {
|
impl<T> Index<(i32, i32)> for DeviceArray2D<T> {
|
||||||
type Output = T;
|
type Output = T;
|
||||||
fn index(&self, (x, y): (i32, i32)) -> &Self::Output {
|
fn index(&self, (x, y): (i32, i32)) -> &Self::Output {
|
||||||
&self[Point2i::new(x, y)]
|
&self[Point2i::new(x, y)]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> IndexMut<(i32, i32)> for Array2D<T> {
|
impl<T> IndexMut<(i32, i32)> for DeviceArray2D<T> {
|
||||||
fn index_mut(&mut self, (x, y): (i32, i32)) -> &mut Self::Output {
|
fn index_mut(&mut self, (x, y): (i32, i32)) -> &mut Self::Output {
|
||||||
&mut self[Point2i::new(x, y)]
|
&mut self[Point2i::new(x, y)]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ impl<T: ?Sized> Copy for Ptr<T> {}
|
||||||
|
|
||||||
impl<T: ?Sized> PartialEq for Ptr<T> {
|
impl<T: ?Sized> PartialEq for Ptr<T> {
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
self.ptr == other.ptr
|
std::ptr::addr_eq(self.ptr, other.ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ use crate::core::geometry::{
|
||||||
Bounds2f, Frame, Point2f, Point2i, Point3f, Vector2f, Vector2i, Vector3f, VectorLike,
|
Bounds2f, Frame, Point2f, Point2i, Point3f, Vector2f, Vector2i, Vector3f, VectorLike,
|
||||||
};
|
};
|
||||||
use crate::core::pbrt::{RARE_EVENT_CONDITION_MET, RARE_EVENT_TOTAL_CALLS};
|
use crate::core::pbrt::{RARE_EVENT_CONDITION_MET, RARE_EVENT_TOTAL_CALLS};
|
||||||
use crate::utils::containers::Array2D;
|
use crate::utils::containers::DeviceArray2D;
|
||||||
use crate::utils::find_interval;
|
use crate::utils::find_interval;
|
||||||
use crate::utils::math::{
|
use crate::utils::math::{
|
||||||
catmull_rom_weights, clamp, difference_of_products, evaluate_polynomial, lerp, logistic,
|
catmull_rom_weights, clamp, difference_of_products, evaluate_polynomial, lerp, logistic,
|
||||||
|
|
@ -821,38 +821,10 @@ impl DevicePiecewiseConstant2D {
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct DeviceSummedAreaTable {
|
pub struct DeviceSummedAreaTable {
|
||||||
pub sum: Array2D<f64>,
|
pub sum: DeviceArray2D<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DeviceSummedAreaTable {
|
impl DeviceSummedAreaTable {
|
||||||
// pub fn new(values: &Array2D<Float>) -> Self {
|
|
||||||
// let width = values.x_size();
|
|
||||||
// let height = values.y_size();
|
|
||||||
//
|
|
||||||
// let mut sum = Array2D::<f64>::new_with_dims(width, height);
|
|
||||||
// sum[(0, 0)] = values[(0, 0)] as f64;
|
|
||||||
//
|
|
||||||
// for x in 1..width {
|
|
||||||
// sum[(x, 0)] = values[(x as i32, 0)] as f64 + sum[(x - 1, 0)];
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for y in 1..height {
|
|
||||||
// sum[(0, y)] = values[(0, y as i32)] as f64 + sum[(0, y - 1)];
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for y in 1..height {
|
|
||||||
// for x in 1..width {
|
|
||||||
// let term = values[(x as i32, y as i32)] as f64;
|
|
||||||
// let left = sum[(x - 1, y)];
|
|
||||||
// let up = sum[(x, y - 1)];
|
|
||||||
// let diag = sum[(x - 1, y - 1)];
|
|
||||||
//
|
|
||||||
// sum[(x, y)] = term + left + up - diag;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Self { sum }
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
pub fn integral(&self, extent: Bounds2f) -> Float {
|
pub fn integral(&self, extent: Bounds2f) -> Float {
|
||||||
let s = self.lookup(extent.p_max.x(), extent.p_max.y())
|
let s = self.lookup(extent.p_max.x(), extent.p_max.y())
|
||||||
|
|
@ -902,7 +874,7 @@ impl DeviceSummedAreaTable {
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct DeviceWindowedPiecewiseConstant2D {
|
pub struct DeviceWindowedPiecewiseConstant2D {
|
||||||
pub sat: DeviceSummedAreaTable,
|
pub sat: DeviceSummedAreaTable,
|
||||||
pub func: Array2D<Float>,
|
pub func: DeviceArray2D<Float>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DeviceWindowedPiecewiseConstant2D {
|
impl DeviceWindowedPiecewiseConstant2D {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::utils::read_float_file;
|
use crate::utils::read_float_file;
|
||||||
use anyhow::Error;
|
use anyhow::Result;
|
||||||
use shared::Float;
|
use shared::Float;
|
||||||
use shared::core::color::{Coeffs, RES, RGBToSpectrumTable};
|
use shared::core::color::{RES, RGBToSpectrumTable};
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ use shared::spectra::cie::SWATCHES_RAW;
|
||||||
use shared::spectra::{
|
use shared::spectra::{
|
||||||
DenselySampledSpectrum, LAMBDA_MAX, LAMBDA_MIN, PiecewiseLinearSpectrum, RGBColorSpace,
|
DenselySampledSpectrum, LAMBDA_MAX, LAMBDA_MIN, PiecewiseLinearSpectrum, RGBColorSpace,
|
||||||
};
|
};
|
||||||
use shared::utils::containers::Array2D;
|
use shared::utils::containers::DeviceArray2D;
|
||||||
use shared::utils::math::{SquareMatrix, linear_least_squares};
|
use shared::utils::math::{SquareMatrix, linear_least_squares};
|
||||||
use shared::utils::{AnimatedTransform, AtomicFloat};
|
use shared::utils::{AnimatedTransform, AtomicFloat};
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
|
@ -196,7 +196,7 @@ pub trait PixelSensorHost {
|
||||||
impl PixelSensorHost for PixelSensor {}
|
impl PixelSensorHost for PixelSensor {}
|
||||||
|
|
||||||
struct SpectralFilmStorage {
|
struct SpectralFilmStorage {
|
||||||
pixels: Array2D<SpectralPixel>,
|
pixels: DeviceArray2D<SpectralPixel>,
|
||||||
bucket_sums: Vec<f64>,
|
bucket_sums: Vec<f64>,
|
||||||
weight_sums: Vec<f64>,
|
weight_sums: Vec<f64>,
|
||||||
bucket_splats: Vec<AtomicFloat>,
|
bucket_splats: Vec<AtomicFloat>,
|
||||||
|
|
@ -228,7 +228,7 @@ impl SpectralFilmHost {
|
||||||
bucket_splats.push(AtomicFloat::new(0.0));
|
bucket_splats.push(AtomicFloat::new(0.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut pixels = Array2D::<SpectralPixel>::new(base.pixel_bounds);
|
let mut pixels = DeviceArray2D::<SpectralPixel>::new(base.pixel_bounds);
|
||||||
|
|
||||||
let p_sums_base = bucket_sums.as_ptr() as *mut f64;
|
let p_sums_base = bucket_sums.as_ptr() as *mut f64;
|
||||||
let p_weights_base = weight_sums.as_ptr() as *mut f64;
|
let p_weights_base = weight_sums.as_ptr() as *mut f64;
|
||||||
|
|
@ -266,7 +266,7 @@ impl SpectralFilmHost {
|
||||||
filter_integral: base.filter.integral(),
|
filter_integral: base.filter.integral(),
|
||||||
output_rgbf_from_sensor_rgb: SquareMatrix::identity(), // Logic omitted
|
output_rgbf_from_sensor_rgb: SquareMatrix::identity(), // Logic omitted
|
||||||
|
|
||||||
pixels: Array2D {
|
pixels: DeviceArray2D {
|
||||||
values: storage.pixels.as_mut_ptr(),
|
values: storage.pixels.as_mut_ptr(),
|
||||||
extent: base.pixel_bounds,
|
extent: base.pixel_bounds,
|
||||||
stride: base.pixel_bounds.max.x - base.pixel_bounds.min.x,
|
stride: base.pixel_bounds.max.x - base.pixel_bounds.min.x,
|
||||||
|
|
@ -305,7 +305,7 @@ impl GBufferFilmHost {
|
||||||
let sensor = unsafe { &*sensor_ptr };
|
let sensor = unsafe { &*sensor_ptr };
|
||||||
let output_rgbf_from_sensor_rgb = colorspace.rgb_from_xyz * sensor.xyz_from_sensor_rgb;
|
let output_rgbf_from_sensor_rgb = colorspace.rgb_from_xyz * sensor.xyz_from_sensor_rgb;
|
||||||
let filter_integral = base.filter.integral();
|
let filter_integral = base.filter.integral();
|
||||||
let pixels = Array2D::new(base.pixel_bounds);
|
let pixels = DeviceArray2D::new(base.pixel_bounds);
|
||||||
|
|
||||||
let device = GBufferFilm {
|
let device = GBufferFilm {
|
||||||
base: base.clone(),
|
base: base.clone(),
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use shared::Float;
|
||||||
use shared::core::filter::{Filter, FilterSampler};
|
use shared::core::filter::{Filter, FilterSampler};
|
||||||
use shared::core::geometry::{Bounds2f, Point2f, Vector2f};
|
use shared::core::geometry::{Bounds2f, Point2f, Vector2f};
|
||||||
use shared::filters::*;
|
use shared::filters::*;
|
||||||
use shared::utils::containers::Array2D;
|
use shared::utils::containers::DeviceArray2D;
|
||||||
|
|
||||||
pub trait FilterFactory {
|
pub trait FilterFactory {
|
||||||
fn create(name: &str, params: &ParameterDictionary, loc: &FileLoc) -> Result<Filter, String>;
|
fn create(name: &str, params: &ParameterDictionary, loc: &FileLoc) -> Result<Filter, String>;
|
||||||
|
|
@ -71,7 +71,7 @@ impl CreateFilterSampler for FilterSampler {
|
||||||
let nx = (32.0 * radius.x()) as usize;
|
let nx = (32.0 * radius.x()) as usize;
|
||||||
let ny = (32.0 * radius.y()) as usize;
|
let ny = (32.0 * radius.y()) as usize;
|
||||||
|
|
||||||
let mut f = Array2D::new_with_dims(nx, ny);
|
let mut f = DeviceArray2D::new_with_dims(nx, ny);
|
||||||
for y in 0..f.y_size() {
|
for y in 0..f.y_size() {
|
||||||
for x in 0..f.x_size() {
|
for x in 0..f.x_size() {
|
||||||
let p = domain.lerp(Point2f::new(
|
let p = domain.lerp(Point2f::new(
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,11 @@ use shared::core::color::ColorEncoding;
|
||||||
use shared::core::color::LINEAR;
|
use shared::core::color::LINEAR;
|
||||||
use shared::core::geometry::{Bounds2f, Point2f, Point2i};
|
use shared::core::geometry::{Bounds2f, Point2f, Point2i};
|
||||||
use shared::core::image::{DeviceImage, ImageBase, PixelFormat, Pixels, WrapMode, WrapMode2D};
|
use shared::core::image::{DeviceImage, ImageBase, PixelFormat, Pixels, WrapMode, WrapMode2D};
|
||||||
use shared::utils::containers::Array2D;
|
use shared::utils::containers::DeviceArray2D;
|
||||||
use shared::utils::math::square;
|
use shared::utils::math::square;
|
||||||
use smallvec::{SmallVec, smallvec};
|
use smallvec::{SmallVec, smallvec};
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub mod io;
|
pub mod io;
|
||||||
pub mod metadata;
|
pub mod metadata;
|
||||||
|
|
@ -469,14 +470,14 @@ impl Image {
|
||||||
Self::from_storage(new_storage, res, new_names, self.encoding())
|
Self::from_storage(new_storage, res, new_names, self.encoding())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_sampling_distribution<F>(&self, dxd_a: F, domain: Bounds2f) -> Array2D<Float>
|
pub fn get_sampling_distribution<F>(&self, dxd_a: F, domain: Bounds2f) -> DeviceArray2D<Float>
|
||||||
where
|
where
|
||||||
F: Fn(Point2f) -> Float + Sync + Send,
|
F: Fn(Point2f) -> Float + Sync + Send,
|
||||||
{
|
{
|
||||||
let width = self.resolution().x();
|
let width = self.resolution().x();
|
||||||
let height = self.resolution().y();
|
let height = self.resolution().y();
|
||||||
|
|
||||||
let mut dist = Array2D::new_with_dims(width as usize, height as usize);
|
let mut dist = DeviceArray2D::new_with_dims(width as usize, height as usize);
|
||||||
|
|
||||||
dist.values
|
dist.values
|
||||||
.par_chunks_mut(width as usize)
|
.par_chunks_mut(width as usize)
|
||||||
|
|
@ -499,7 +500,7 @@ impl Image {
|
||||||
dist
|
dist
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_sampling_distribution_uniform(&self) -> Array2D<Float> {
|
pub fn get_sampling_distribution_uniform(&self) -> DeviceArray2D<Float> {
|
||||||
let default_domain = Bounds2f::from_points(Point2f::new(0.0, 0.0), Point2f::new(1.0, 1.0));
|
let default_domain = Bounds2f::from_points(Point2f::new(0.0, 0.0), Point2f::new(1.0, 1.0));
|
||||||
|
|
||||||
self.get_sampling_distribution(|_| 1.0, default_domain)
|
self.get_sampling_distribution(|_| 1.0, default_domain)
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,16 @@
|
||||||
|
use shared::core::light::Light;
|
||||||
use crate::core::spectrum::SPECTRUM_CACHE;
|
use crate::core::spectrum::SPECTRUM_CACHE;
|
||||||
use crate::core::texture::FloatTexture;
|
use crate::core::texture::FloatTexture;
|
||||||
use crate::utils::containers::InternCache;
|
use crate::utils::containers::InternCache;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
||||||
use log::error;
|
use anyhow::{Result, anyhow};
|
||||||
use shared::core::camera::CameraTransform;
|
use shared::core::camera::CameraTransform;
|
||||||
use shared::core::light::Light;
|
|
||||||
use shared::core::medium::Medium;
|
use shared::core::medium::Medium;
|
||||||
use shared::core::shape::Shape;
|
use shared::core::shape::Shape;
|
||||||
use shared::core::spectrum::Spectrum;
|
use shared::core::spectrum::Spectrum;
|
||||||
use shared::lights::*;
|
use shared::lights::*;
|
||||||
use shared::spectra::{DenselySampledSpectrum, RGBColorSpace};
|
use shared::spectra::{DenselySampledSpectrum, RGBColorSpace};
|
||||||
use shared::utils::Transform;
|
use shared::utils::Transform;
|
||||||
use std::fmt::Error;
|
|
||||||
|
|
||||||
pub fn lookup_spectrum(s: &Spectrum) -> DenselySampledSpectrum {
|
pub fn lookup_spectrum(s: &Spectrum) -> DenselySampledSpectrum {
|
||||||
let cache = SPECTRUM_CACHE.get_or_init(InternCache::new);
|
let cache = SPECTRUM_CACHE.get_or_init(InternCache::new);
|
||||||
|
|
@ -29,7 +28,7 @@ pub trait CreateLight {
|
||||||
shape: &Shape,
|
shape: &Shape,
|
||||||
alpha_text: &FloatTexture,
|
alpha_text: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
) -> Result<Light, Error>;
|
) -> Result<Light>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait LightFactory {
|
pub trait LightFactory {
|
||||||
|
|
@ -44,7 +43,7 @@ pub trait LightFactory {
|
||||||
alpha_tex: &FloatTexture,
|
alpha_tex: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
camera_transform: CameraTransform,
|
camera_transform: CameraTransform,
|
||||||
) -> Result<Self, Error>;
|
) -> Result<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LightFactory for Light {
|
impl LightFactory for Light {
|
||||||
|
|
@ -59,7 +58,7 @@ impl LightFactory for Light {
|
||||||
alpha_tex: &FloatTexture,
|
alpha_tex: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
camera_transform: CameraTransform,
|
camera_transform: CameraTransform,
|
||||||
) -> Result<Self, Error> {
|
) -> Result<Self> {
|
||||||
match name {
|
match name {
|
||||||
"diffuse" => DiffuseAreaLight::create(
|
"diffuse" => DiffuseAreaLight::create(
|
||||||
name,
|
name,
|
||||||
|
|
@ -130,7 +129,7 @@ impl LightFactory for Light {
|
||||||
colorspace,
|
colorspace,
|
||||||
loc,
|
loc,
|
||||||
)?,
|
)?,
|
||||||
_ => Err(error!(loc, "unknown light type: \"{}\"", name)),
|
_ => Err(anyhow!(loc, "unknown light type: \"{}\"", name)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ use crate::Arena;
|
||||||
use crate::core::image::Image;
|
use crate::core::image::Image;
|
||||||
use crate::utils::TextureParameterDictionary;
|
use crate::utils::TextureParameterDictionary;
|
||||||
use crate::utils::error::FileLoc;
|
use crate::utils::error::FileLoc;
|
||||||
|
use anyhow::{Result, anyhow};
|
||||||
use shared::core::material::Material;
|
use shared::core::material::Material;
|
||||||
use shared::materials::*;
|
use shared::materials::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt::Error;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub trait CreateMaterial: Sized {
|
pub trait CreateMaterial: Sized {
|
||||||
|
|
@ -15,7 +15,7 @@ pub trait CreateMaterial: Sized {
|
||||||
named_materials: &HashMap<String, Material>,
|
named_materials: &HashMap<String, Material>,
|
||||||
loc: &FileLoc,
|
loc: &FileLoc,
|
||||||
arena: &mut Arena,
|
arena: &mut Arena,
|
||||||
) -> Result<Material, Error>;
|
) -> Result<Material>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait MaterialFactory {
|
pub trait MaterialFactory {
|
||||||
|
|
@ -26,7 +26,7 @@ pub trait MaterialFactory {
|
||||||
named_materials: HashMap<String, Material>,
|
named_materials: HashMap<String, Material>,
|
||||||
loc: FileLoc,
|
loc: FileLoc,
|
||||||
arena: &mut Arena,
|
arena: &mut Arena,
|
||||||
) -> Result<Self, Error>;
|
) -> Result<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MaterialFactory for Material {
|
impl MaterialFactory for Material {
|
||||||
|
|
@ -37,7 +37,7 @@ impl MaterialFactory for Material {
|
||||||
named_materials: HashMap<String, Material>,
|
named_materials: HashMap<String, Material>,
|
||||||
loc: FileLoc,
|
loc: FileLoc,
|
||||||
arena: &mut Arena,
|
arena: &mut Arena,
|
||||||
) -> Result<Material, Error> {
|
) -> Result<Material> {
|
||||||
match name {
|
match name {
|
||||||
"diffuse" => {
|
"diffuse" => {
|
||||||
DiffuseMaterial::create(parameters, normal_map, named_materials, loc, arena)?
|
DiffuseMaterial::create(parameters, normal_map, named_materials, loc, arena)?
|
||||||
|
|
@ -77,7 +77,7 @@ impl MaterialFactory for Material {
|
||||||
}
|
}
|
||||||
"mix" => MixMaterial::create(parameters, normal_map, named_materials, loc, arena)?,
|
"mix" => MixMaterial::create(parameters, normal_map, named_materials, loc, arena)?,
|
||||||
|
|
||||||
_ => Err(format!("Material type '{}' unknown at {}", $name, $loc)),
|
_ => Err(anyhow!("Material type '{}' unknown at {}", $name, $loc)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ use crate::utils::parameters::{ParameterDictionary, ParsedParameterVector};
|
||||||
use crate::utils::parser::ParserTarget;
|
use crate::utils::parser::ParserTarget;
|
||||||
use shared::Float;
|
use shared::Float;
|
||||||
use shared::core::camera::CameraTransform;
|
use shared::core::camera::CameraTransform;
|
||||||
|
use shared::core::geometry::Vector3f;
|
||||||
use shared::core::options::RenderingCoordinateSystem;
|
use shared::core::options::RenderingCoordinateSystem;
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::transform::{AnimatedTransform, Transform, look_at};
|
use shared::utils::transform::{AnimatedTransform, Transform, look_at};
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
use crate::utils::{FileLoc, ParameterDictionary};
|
||||||
|
use shared::core::camera::CameraTransform;
|
||||||
|
use shared::utils::{AnimatedTransform, Transform};
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum MaterialRef {
|
pub enum MaterialRef {
|
||||||
Index(usize),
|
Index(usize),
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use crate::core::material::MaterialFactory;
|
||||||
use crate::core::texture::{FloatTexture, SpectrumTexture};
|
use crate::core::texture::{FloatTexture, SpectrumTexture};
|
||||||
use crate::utils::arena::Arena;
|
use crate::utils::arena::Arena;
|
||||||
use crate::utils::error::FileLoc;
|
use crate::utils::error::FileLoc;
|
||||||
use crate::utils::parallel::{AsyncJob, run_async};
|
use crate::utils::parallel::run_async;
|
||||||
use crate::utils::parameters::{NamedTextures, ParameterDictionary, TextureParameterDictionary};
|
use crate::utils::parameters::{NamedTextures, ParameterDictionary, TextureParameterDictionary};
|
||||||
use crate::utils::{Upload, resolve_filename};
|
use crate::utils::{Upload, resolve_filename};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
|
@ -18,7 +18,7 @@ use shared::core::filter::Filter;
|
||||||
use shared::core::light::Light;
|
use shared::core::light::Light;
|
||||||
use shared::core::material::Material;
|
use shared::core::material::Material;
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
use shared::core::primitive::{GeometricPrimitive, Primitive, PrimitiveTrait, SimplePrimitive};
|
use shared::core::primitive::{GeometricPrimitive, Primitive, SimplePrimitive};
|
||||||
use shared::core::sampler::Sampler;
|
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;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,12 @@
|
||||||
|
use super::{SceneEntity, TextureSceneEntity};
|
||||||
|
use crate::core::image::Image;
|
||||||
|
use crate::core::light::Light;
|
||||||
|
use crate::core::medium::Medium;
|
||||||
|
use crate::core::texture::{FloatTexture, SpectrumTexture};
|
||||||
|
use crate::utils::parallel::AsyncJob;
|
||||||
|
use std::collections::{HashMap, HashSet};
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct TextureState {
|
pub struct TextureState {
|
||||||
pub serial_float_textures: Vec<(String, TextureSceneEntity)>,
|
pub serial_float_textures: Vec<(String, TextureSceneEntity)>,
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ pub enum FloatTexture {
|
||||||
Checkerboard(FloatCheckerboardTexture),
|
Checkerboard(FloatCheckerboardTexture),
|
||||||
Dots(FloatDotsTexture),
|
Dots(FloatDotsTexture),
|
||||||
FBm(FBmTexture),
|
FBm(FBmTexture),
|
||||||
Ptex(FloatPtexTexture),
|
// Ptex(FloatPtexTexture),
|
||||||
Windy(WindyTexture),
|
Windy(WindyTexture),
|
||||||
Wrinkled(WrinkledTexture),
|
Wrinkled(WrinkledTexture),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,12 @@ use crate::core::texture::FloatTexture;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary, Upload, resolve_filename};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary, Upload, resolve_filename};
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::{Result, anyhow};
|
||||||
use shared::core::geometry::Point2i;
|
use shared::core::geometry::Point2i;
|
||||||
|
use shared::core::image::DeviceImage;
|
||||||
use shared::core::light::{Light, LightBase, LightType};
|
use shared::core::light::{Light, LightBase, LightType};
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
use shared::core::shape::{Shape, ShapeTrait};
|
use shared::core::shape::{Shape, ShapeTrait};
|
||||||
use shared::core::spectrum::Spectrum;
|
use shared::core::spectrum::Spectrum;
|
||||||
|
use shared::core::texture::GPUFloatTexture;
|
||||||
use shared::core::texture::{SpectrumType, TextureEvalContext};
|
use shared::core::texture::{SpectrumType, TextureEvalContext};
|
||||||
use shared::lights::DiffuseAreaLight;
|
use shared::lights::DiffuseAreaLight;
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@ use crate::core::light::{CreateLight, lookup_spectrum};
|
||||||
use crate::core::spectrum::spectrum_to_photometric;
|
use crate::core::spectrum::spectrum_to_photometric;
|
||||||
use crate::core::texture::FloatTexture;
|
use crate::core::texture::FloatTexture;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
||||||
|
use anyhow::Result;
|
||||||
use shared::Float;
|
use shared::Float;
|
||||||
use shared::core::geometry::{Point3, Point3f, Vector3f, VectorLike};
|
use shared::core::geometry::{Point3f, VectorLike};
|
||||||
use shared::core::light::{Light, LightBase, LightType};
|
use shared::core::light::{Light, LightBase, LightType};
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
use shared::core::shape::Shape;
|
use shared::core::shape::Shape;
|
||||||
|
|
@ -11,8 +12,7 @@ use shared::core::spectrum::Spectrum;
|
||||||
use shared::core::texture::SpectrumType;
|
use shared::core::texture::SpectrumType;
|
||||||
use shared::lights::DistantLight;
|
use shared::lights::DistantLight;
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::Transform;
|
use shared::utils::{Ptr, Transform};
|
||||||
use std::fmt::Error;
|
|
||||||
|
|
||||||
pub trait CreateDistantLight {
|
pub trait CreateDistantLight {
|
||||||
fn new(render_from_light: Transform, le: Spectrum, scale: Float) -> Self;
|
fn new(render_from_light: Transform, le: Spectrum, scale: Float) -> Self;
|
||||||
|
|
@ -46,7 +46,7 @@ impl CreateLight for DistantLight {
|
||||||
_shape: &Shape,
|
_shape: &Shape,
|
||||||
_alpha_text: &FloatTexture,
|
_alpha_text: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
) -> Result<Light, Error> {
|
) -> Result<Light> {
|
||||||
let l = parameters
|
let l = parameters
|
||||||
.get_one_spectrum(
|
.get_one_spectrum(
|
||||||
"L",
|
"L",
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,8 @@ use crate::core::spectrum::spectrum_to_photometric;
|
||||||
use crate::core::texture::FloatTexture;
|
use crate::core::texture::FloatTexture;
|
||||||
use crate::utils::sampling::PiecewiseConstant2D;
|
use crate::utils::sampling::PiecewiseConstant2D;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary, resolve_filename};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary, resolve_filename};
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::{anyhow, Result};
|
||||||
use shared::core::color::ColorEncoding;
|
|
||||||
use shared::core::geometry::Point2i;
|
use shared::core::geometry::Point2i;
|
||||||
use shared::core::image::PixelFormat;
|
|
||||||
use shared::core::light::{Light, LightBase, LightType};
|
use shared::core::light::{Light, LightBase, LightType};
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
use shared::core::shape::Shape;
|
use shared::core::shape::Shape;
|
||||||
|
|
@ -67,7 +65,7 @@ impl CreateLight for GoniometricLight {
|
||||||
shape: &Shape,
|
shape: &Shape,
|
||||||
alpha_text: &FloatTexture,
|
alpha_text: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
) -> Result<Light, Error> {
|
) -> Result<Light> {
|
||||||
let i = params
|
let i = params
|
||||||
.get_one_spectrum(
|
.get_one_spectrum(
|
||||||
"I",
|
"I",
|
||||||
|
|
@ -81,20 +79,21 @@ impl CreateLight for GoniometricLight {
|
||||||
Ptr::null()
|
Ptr::null()
|
||||||
} else {
|
} else {
|
||||||
let im = Image::read(Path::new(&filename), None)
|
let im = Image::read(Path::new(&filename), None)
|
||||||
.map_err(|e| error!(loc, "could not load image '{}': {}", filename, e))?;
|
.map_err(|e| anyhow!(loc, "could not load image '{}': {}", filename, e))?;
|
||||||
|
|
||||||
let loaded = im.image;
|
let loaded = im.image;
|
||||||
let res = loaded.resolution();
|
let res = loaded.resolution();
|
||||||
|
|
||||||
if loaded.has_any_infinite_pixels() {
|
if loaded.has_any_infinite_pixels() {
|
||||||
return Err(error!(
|
return Err(anyhow!(
|
||||||
loc,
|
loc,
|
||||||
"image '{}' has infinite pixels, not suitable for light", filename
|
"image '{}' has infinite pixels, not suitable for light",
|
||||||
|
filename
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
if res.x != res.y {
|
if res.x != res.y {
|
||||||
return Err(error!(
|
return Err(anyhow!(
|
||||||
loc,
|
loc,
|
||||||
"image resolution ({}, {}) is non-square; unlikely to be an equal-area map",
|
"image resolution ({}, {}) is non-square; unlikely to be an equal-area map",
|
||||||
res.x,
|
res.x,
|
||||||
|
|
@ -133,9 +132,10 @@ fn convert_to_luminance_image(image: &Image, filename: &str, loc: &FileLoc) -> R
|
||||||
let y_desc = image.get_channel_desc(&["Y"]);
|
let y_desc = image.get_channel_desc(&["Y"]);
|
||||||
|
|
||||||
match (rgb_desc, y_desc) {
|
match (rgb_desc, y_desc) {
|
||||||
(Ok(_), Ok(_)) => Err(error!(
|
(Ok(_), Ok(_)) => Err(anyhow!(
|
||||||
loc,
|
loc,
|
||||||
"image '{}' has both RGB and Y channels; ambiguous", filename
|
"image '{}' has both RGB and Y channels; ambiguous",
|
||||||
|
filename
|
||||||
)),
|
)),
|
||||||
|
|
||||||
(Ok(_), Err(_)) => {
|
(Ok(_), Err(_)) => {
|
||||||
|
|
@ -159,9 +159,10 @@ fn convert_to_luminance_image(image: &Image, filename: &str, loc: &FileLoc) -> R
|
||||||
Ok(image.clone())
|
Ok(image.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
(Err(_), Err(_)) => Err(error!(
|
(Err(_), Err(_)) => Err(anyhow!(
|
||||||
loc,
|
loc,
|
||||||
"image '{}' has neither RGB nor Y channels", filename
|
"image '{}' has neither RGB nor Y channels",
|
||||||
|
filename
|
||||||
)),
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
use crate::Arena;
|
use crate::Arena;
|
||||||
use crate::core::image::{Image, ImageIO};
|
use crate::core::image::{Image, ImageIO};
|
||||||
use crate::core::spectrum::spectrum_to_photometric;
|
use crate::core::spectrum::spectrum_to_photometric;
|
||||||
use crate::spectra::{get_colorspace_context, get_spectra_context};
|
use crate::spectra::get_spectra_context;
|
||||||
use crate::utils::sampling::{PiecewiseConstant2D, WindowedPiecewiseConstant2D};
|
use crate::utils::sampling::{PiecewiseConstant2D, WindowedPiecewiseConstant2D};
|
||||||
use crate::utils::{FileLoc, ParameterDictionary, Upload, resolve_filename};
|
use crate::utils::{FileLoc, ParameterDictionary, resolve_filename};
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::{Result, anyhow};
|
||||||
|
|
||||||
use rayon::iter::{IndexedParallelIterator, ParallelIterator};
|
use rayon::iter::{IndexedParallelIterator, ParallelIterator};
|
||||||
use rayon::prelude::ParallelSliceMut;
|
use rayon::prelude::ParallelSliceMut;
|
||||||
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, PixelFormat, 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;
|
||||||
use shared::core::texture::SpectrumType;
|
use shared::core::texture::SpectrumType;
|
||||||
use shared::lights::{ImageInfiniteLight, PortalInfiniteLight, UniformInfiniteLight};
|
use shared::lights::{ImageInfiniteLight, PortalInfiniteLight, UniformInfiniteLight};
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::hash::hash_float;
|
|
||||||
use shared::utils::math::{equal_area_sphere_to_square, equal_area_square_to_sphere};
|
use shared::utils::math::{equal_area_sphere_to_square, equal_area_square_to_sphere};
|
||||||
use shared::utils::{Ptr, Transform};
|
use shared::utils::{Ptr, Transform};
|
||||||
use shared::{Float, PI};
|
use shared::{Float, PI};
|
||||||
|
|
@ -41,7 +40,7 @@ impl CreateImageInfiniteLight for ImageInfiniteLight {
|
||||||
render_from_light: Transform,
|
render_from_light: Transform,
|
||||||
medium_interface: MediumInterface,
|
medium_interface: MediumInterface,
|
||||||
scale: Float,
|
scale: Float,
|
||||||
image: Arc<Image>,
|
image: Arc<DeviceImage>,
|
||||||
image_color_space: Arc<RGBColorSpace>,
|
image_color_space: Arc<RGBColorSpace>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let base = LightBase::new(
|
let base = LightBase::new(
|
||||||
|
|
@ -80,7 +79,7 @@ impl CreateImageInfiniteLight for ImageInfiniteLight {
|
||||||
|
|
||||||
let distrib = PiecewiseConstant2D::new(&data, n_u, n_v);
|
let distrib = PiecewiseConstant2D::new(&data, n_u, n_v);
|
||||||
|
|
||||||
let slice = d.as_mut_slice();
|
let slice = distrib.as_mut_slice();
|
||||||
let average = slice.iter().sum::<Float>() / slice.len() as Float;
|
let average = slice.iter().sum::<Float>() / slice.len() as Float;
|
||||||
|
|
||||||
let mut all_zero = true;
|
let mut all_zero = true;
|
||||||
|
|
@ -111,13 +110,13 @@ impl CreateImageInfiniteLight for ImageInfiniteLight {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct InfinitePortalLightStorage {
|
struct InfinitePortalLightStorage {
|
||||||
image: Image,
|
image: Image,
|
||||||
distribution: DeviceWindowedPiecewiseConstant2D,
|
distribution: WindowedPiecewiseConstant2D,
|
||||||
image_color_space: RGBColorSpace,
|
image_color_space: RGBColorSpace,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct PortalInfiniteLightHost {
|
pub struct PortalInfiniteLightHost {
|
||||||
pub view: PortalInfiniteLight,
|
pub device: PortalInfiniteLight,
|
||||||
pub filename: String,
|
pub filename: String,
|
||||||
_storage: Arc<InfinitePortalLightStorage>,
|
_storage: Arc<InfinitePortalLightStorage>,
|
||||||
}
|
}
|
||||||
|
|
@ -241,7 +240,7 @@ impl CreatePortalInfiniteLight for PortalInfiniteLight {
|
||||||
Bounds2f::from_points(Point2f::new(0., 0.), Point2f::new(1., 1.)),
|
Bounds2f::from_points(Point2f::new(0., 0.), Point2f::new(1., 1.)),
|
||||||
);
|
);
|
||||||
|
|
||||||
let distribution = DeviceWindowedPiecewiseConstant2D::new(d);
|
let distribution = WindowedPiecewiseConstant2D::new(d);
|
||||||
|
|
||||||
PortalInfiniteLight {
|
PortalInfiniteLight {
|
||||||
base,
|
base,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use crate::core::light::{CreateLight, lookup_spectrum};
|
||||||
use crate::core::spectrum::spectrum_to_photometric;
|
use crate::core::spectrum::spectrum_to_photometric;
|
||||||
use crate::core::texture::FloatTexture;
|
use crate::core::texture::FloatTexture;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
||||||
|
use anyhow::Result;
|
||||||
use shared::core::geometry::Point3f;
|
use shared::core::geometry::Point3f;
|
||||||
use shared::core::light::{Light, LightBase, LightType};
|
use shared::core::light::{Light, LightBase, LightType};
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
|
|
@ -10,9 +11,8 @@ use shared::core::spectrum::Spectrum;
|
||||||
use shared::core::texture::SpectrumType;
|
use shared::core::texture::SpectrumType;
|
||||||
use shared::lights::PointLight;
|
use shared::lights::PointLight;
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::Transform;
|
use shared::utils::{Ptr, Transform};
|
||||||
use shared::{Float, PI};
|
use shared::{Float, PI};
|
||||||
use std::fmt::Error;
|
|
||||||
|
|
||||||
pub trait CreatePointLight {
|
pub trait CreatePointLight {
|
||||||
fn new(
|
fn new(
|
||||||
|
|
@ -51,7 +51,7 @@ impl CreateLight for PointLight {
|
||||||
_shape: &Shape,
|
_shape: &Shape,
|
||||||
_alpha: &FloatTexture,
|
_alpha: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
) -> Result<Light, Error> {
|
) -> Result<Light> {
|
||||||
let l = parameters
|
let l = parameters
|
||||||
.get_one_spectrum(
|
.get_one_spectrum(
|
||||||
"L",
|
"L",
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ use shared::Float;
|
||||||
use shared::core::geometry::{
|
use shared::core::geometry::{
|
||||||
Bounds2f, Point2f, Point2i, Point3f, Vector3f, VectorLike, cos_theta,
|
Bounds2f, Point2f, Point2i, Point3f, Vector3f, VectorLike, cos_theta,
|
||||||
};
|
};
|
||||||
|
use shared::core::image::DeviceImage;
|
||||||
use shared::core::light::{Light, LightBase, LightType};
|
use shared::core::light::{Light, LightBase, LightType};
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
use shared::core::shape::Shape;
|
use shared::core::shape::Shape;
|
||||||
|
|
@ -101,11 +102,11 @@ impl CreateLight for ProjectionLight {
|
||||||
|
|
||||||
let filename = resolve_filename(¶meters.get_one_string("filename", ""));
|
let filename = resolve_filename(¶meters.get_one_string("filename", ""));
|
||||||
if filename.is_empty() {
|
if filename.is_empty() {
|
||||||
return Err(error!(loc, "must provide filename for projection light"));
|
return Err(anyhow!(loc, "must provide filename for projection light"));
|
||||||
}
|
}
|
||||||
|
|
||||||
let im = Image::read(Path::new(&filename), None)
|
let im = Image::read(Path::new(&filename), None)
|
||||||
.map_err(|e| error!(loc, "could not load image '{}': {}", filename, e))?;
|
.map_err(|e| anyhow!(loc, "could not load image '{}': {}", filename, e))?;
|
||||||
|
|
||||||
if im.image.has_any_infinite_pixels() {
|
if im.image.has_any_infinite_pixels() {
|
||||||
return Err(anyhow!(
|
return Err(anyhow!(
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
use crate::utils::sampling::AliasTableHost;
|
use crate::utils::sampling::AliasTableHost;
|
||||||
use shared::core::light::{Light, LightTrait};
|
use shared::core::light::{Light, LightTrait};
|
||||||
use shared::spectra::{SampledSpectrum, SampledWavelengths};
|
use shared::spectra::{SampledSpectrum, SampledWavelengths};
|
||||||
use shared::utils::sampling::AliasTable;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ use crate::core::light::{CreateLight, lookup_spectrum};
|
||||||
use crate::core::spectrum::spectrum_to_photometric;
|
use crate::core::spectrum::spectrum_to_photometric;
|
||||||
use crate::core::texture::FloatTexture;
|
use crate::core::texture::FloatTexture;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
||||||
|
use anyhow::Result;
|
||||||
use shared::core::geometry::{Frame, Point3f, VectorLike};
|
use shared::core::geometry::{Frame, Point3f, VectorLike};
|
||||||
use shared::core::light::{Light, LightBase, LightType};
|
use shared::core::light::{Light, LightBase, LightType};
|
||||||
use shared::core::medium::{Medium, MediumInterface};
|
use shared::core::medium::{Medium, MediumInterface};
|
||||||
|
|
@ -11,10 +12,9 @@ use shared::core::spectrum::Spectrum;
|
||||||
use shared::core::texture::SpectrumType;
|
use shared::core::texture::SpectrumType;
|
||||||
use shared::lights::SpotLight;
|
use shared::lights::SpotLight;
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::Transform;
|
|
||||||
use shared::utils::math::radians;
|
use shared::utils::math::radians;
|
||||||
|
use shared::utils::{Ptr, Transform};
|
||||||
use shared::{Float, PI};
|
use shared::{Float, PI};
|
||||||
use std::fmt::Error;
|
|
||||||
|
|
||||||
pub trait CreateSpotLight {
|
pub trait CreateSpotLight {
|
||||||
fn new(
|
fn new(
|
||||||
|
|
@ -30,7 +30,7 @@ pub trait CreateSpotLight {
|
||||||
impl CreateSpotLight for SpotLight {
|
impl CreateSpotLight for SpotLight {
|
||||||
fn new(
|
fn new(
|
||||||
render_from_light: Transform,
|
render_from_light: Transform,
|
||||||
medium_interface: MediumInterface,
|
_medium_interface: MediumInterface,
|
||||||
le: Spectrum,
|
le: Spectrum,
|
||||||
scale: shared::Float,
|
scale: shared::Float,
|
||||||
cos_falloff_start: Float,
|
cos_falloff_start: Float,
|
||||||
|
|
@ -63,7 +63,7 @@ impl CreateLight for SpotLight {
|
||||||
_shape: &Shape,
|
_shape: &Shape,
|
||||||
_alpha_tex: &FloatTexture,
|
_alpha_tex: &FloatTexture,
|
||||||
colorspace: Option<&RGBColorSpace>,
|
colorspace: Option<&RGBColorSpace>,
|
||||||
) -> Result<Light, Error> {
|
) -> Result<Light> {
|
||||||
let i = parameters
|
let i = parameters
|
||||||
.get_one_spectrum(
|
.get_one_spectrum(
|
||||||
"I",
|
"I",
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,10 @@ use crate::core::image::Image;
|
||||||
use crate::core::material::CreateMaterial;
|
use crate::core::material::CreateMaterial;
|
||||||
use crate::spectra::get_colorspace_context;
|
use crate::spectra::get_colorspace_context;
|
||||||
use crate::utils::{Arena, FileLoc, TextureParameterDictionary, Upload};
|
use crate::utils::{Arena, FileLoc, TextureParameterDictionary, Upload};
|
||||||
|
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::SpectrumType;
|
use shared::core::texture::{SpectrumTexture, SpectrumType};
|
||||||
use shared::materials::complex::*;
|
use shared::materials::complex::*;
|
||||||
use shared::spectra::RGBUnboundedSpectrum;
|
use shared::spectra::RGBUnboundedSpectrum;
|
||||||
// use shared::spectra::SampledWavelengths;
|
// use shared::spectra::SampledWavelengths;
|
||||||
|
|
@ -35,7 +36,7 @@ impl CreateMaterial for HairMaterial {
|
||||||
let stdcs = get_colorspace_context();
|
let stdcs = get_colorspace_context();
|
||||||
let default_rgb = HairBxDF::sigma_a_from_concentration(1.3, 0.0, stdcs);
|
let default_rgb = HairBxDF::sigma_a_from_concentration(1.3, 0.0, stdcs);
|
||||||
let spectrum =
|
let spectrum =
|
||||||
Spectrum::RGBUnbounded(RGBUnboundedSpectrum::new(stdc.srgb, default_rgb));
|
Spectrum::RGBUnbounded(RGBUnboundedSpectrum::new(stdcs.srgb, default_rgb));
|
||||||
let texture = SpectrumTexture::Constant(SpectrumConstantTexture::new(spectrum));
|
let texture = SpectrumTexture::Constant(SpectrumConstantTexture::new(spectrum));
|
||||||
Some(Arc::new(texture))
|
Some(Arc::new(texture))
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use crate::core::image::Image;
|
||||||
use crate::core::material::CreateMaterial;
|
use crate::core::material::CreateMaterial;
|
||||||
// use crate::core::scattering::TrowbridgeReitzDistribution;
|
// use crate::core::scattering::TrowbridgeReitzDistribution;
|
||||||
use crate::utils::TextureParameterDictionary;
|
use crate::utils::TextureParameterDictionary;
|
||||||
|
use anyhow::Result;
|
||||||
use shared::core::material::Material;
|
use shared::core::material::Material;
|
||||||
use shared::materials::ConductorMaterial;
|
use shared::materials::ConductorMaterial;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
@ -13,7 +14,7 @@ impl CreateMaterial for ConductorMaterial {
|
||||||
_named_materials: &std::collections::HashMap<String, shared::core::material::Material>,
|
_named_materials: &std::collections::HashMap<String, shared::core::material::Material>,
|
||||||
_loc: &crate::utils::FileLoc,
|
_loc: &crate::utils::FileLoc,
|
||||||
_arena: &mut crate::Arena,
|
_arena: &mut crate::Arena,
|
||||||
) -> Result<Material, std::fmt::Error> {
|
) -> Result<Material> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ use crate::Arena;
|
||||||
use crate::core::image::Image;
|
use crate::core::image::Image;
|
||||||
use crate::core::material::CreateMaterial;
|
use crate::core::material::CreateMaterial;
|
||||||
use crate::utils::{FileLoc, TextureParameterDictionary};
|
use crate::utils::{FileLoc, TextureParameterDictionary};
|
||||||
|
use anyhow::Result;
|
||||||
use shared::core::material::Material;
|
use shared::core::material::Material;
|
||||||
use shared::materials::{DielectricMaterial, ThinDielectricMaterial};
|
use shared::materials::{DielectricMaterial, ThinDielectricMaterial};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt::Error;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
impl CreateMaterial for DielectricMaterial {
|
impl CreateMaterial for DielectricMaterial {
|
||||||
|
|
@ -15,7 +15,7 @@ impl CreateMaterial for DielectricMaterial {
|
||||||
_named_materials: &HashMap<String, Material>,
|
_named_materials: &HashMap<String, Material>,
|
||||||
_loc: &FileLoc,
|
_loc: &FileLoc,
|
||||||
_arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Material, Error> {
|
) -> Result<Material> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -27,7 +27,7 @@ impl CreateMaterial for ThinDielectricMaterial {
|
||||||
_named_materials: &HashMap<String, Material>,
|
_named_materials: &HashMap<String, Material>,
|
||||||
_loc: &FileLoc,
|
_loc: &FileLoc,
|
||||||
_arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Material, Error> {
|
) -> Result<Material> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ use crate::Arena;
|
||||||
use crate::core::image::Image;
|
use crate::core::image::Image;
|
||||||
use crate::core::material::CreateMaterial;
|
use crate::core::material::CreateMaterial;
|
||||||
use crate::utils::{FileLoc, TextureParameterDictionary};
|
use crate::utils::{FileLoc, TextureParameterDictionary};
|
||||||
|
use anyhow::Result;
|
||||||
use shared::core::material::Material;
|
use shared::core::material::Material;
|
||||||
use shared::materials::{DiffuseMaterial, DiffuseTransmissionMaterial};
|
use shared::materials::{DiffuseMaterial, DiffuseTransmissionMaterial};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt::Error;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
impl CreateMaterial for DiffuseMaterial {
|
impl CreateMaterial for DiffuseMaterial {
|
||||||
|
|
@ -15,7 +15,7 @@ impl CreateMaterial for DiffuseMaterial {
|
||||||
_named_materials: &HashMap<String, Material>,
|
_named_materials: &HashMap<String, Material>,
|
||||||
_loc: &FileLoc,
|
_loc: &FileLoc,
|
||||||
_arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Material, Error> {
|
) -> Result<Material> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -27,7 +27,7 @@ impl CreateMaterial for DiffuseTransmissionMaterial {
|
||||||
_named_materials: &HashMap<String, Material>,
|
_named_materials: &HashMap<String, Material>,
|
||||||
_loc: &FileLoc,
|
_loc: &FileLoc,
|
||||||
_arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Material, Error> {
|
) -> Result<Material> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,20 @@
|
||||||
// use crate::core::image::Image;
|
|
||||||
// use crate::core::material::CreateMaterial;
|
|
||||||
// use shared::core::bsdf::BSDF;
|
|
||||||
// use shared::core::bssrdf::BSSRDF;
|
|
||||||
// use shared::core::material::{Material, MaterialEvalContext, MaterialTrait};
|
|
||||||
// use shared::core::texture::{GPUFloatTexture, TextureEvaluator};
|
|
||||||
// use shared::spectra::SampledWavelengths;
|
|
||||||
// use shared::utils::Ptr;
|
|
||||||
use crate::core::image::Image;
|
use crate::core::image::Image;
|
||||||
use crate::core::material::CreateMaterial;
|
use crate::core::material::CreateMaterial;
|
||||||
|
use crate::utils::{Arena, FileLoc, TextureParameterDictionary};
|
||||||
|
use anyhow::Result;
|
||||||
|
use shared::core::material::Material;
|
||||||
use shared::materials::MixMaterial;
|
use shared::materials::MixMaterial;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
impl CreateMaterial for MixMaterial {
|
impl CreateMaterial for MixMaterial {
|
||||||
fn create(
|
fn create(
|
||||||
parameters: &crate::utils::TextureParameterDictionary,
|
_parameters: &TextureParameterDictionary,
|
||||||
normal_map: Option<std::sync::Arc<Image>>,
|
_normal_map: Option<Arc<Image>>,
|
||||||
named_materials: &std::collections::HashMap<String, Material>,
|
_named_materials: &HashMap<String, Material>,
|
||||||
loc: &crate::utils::FileLoc,
|
_loc: &FileLoc,
|
||||||
arena: &mut crate::Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Material, std::fmt::Error> {
|
) -> Result<Material> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
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::{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, RandomizeStrategy};
|
use shared::core::sampler::{HaltonSampler, MAX_HALTON_RESOLUTION, RandomizeStrategy};
|
||||||
|
|
||||||
pub trait CreateHaltonSampler {
|
pub trait CreateHaltonSampler {
|
||||||
fn new(
|
fn new(
|
||||||
|
|
@ -22,7 +23,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];
|
||||||
|
|
@ -54,7 +55,7 @@ impl CreateHaltonSampler for HaltonSampler {
|
||||||
Self {
|
Self {
|
||||||
samples_per_pixel,
|
samples_per_pixel,
|
||||||
randomize,
|
randomize,
|
||||||
digit_permutations,
|
digit_permutations: Ptr::from(&digit_permutations),
|
||||||
base_scales,
|
base_scales,
|
||||||
base_exponents,
|
base_exponents,
|
||||||
mult_inverse,
|
mult_inverse,
|
||||||
|
|
@ -68,7 +69,7 @@ impl CreateSampler for HaltonSampler {
|
||||||
fn create(
|
fn create(
|
||||||
params: &ParameterDictionary,
|
params: &ParameterDictionary,
|
||||||
full_res: Point2i,
|
full_res: Point2i,
|
||||||
_loc: &FileLoc,
|
loc: &FileLoc,
|
||||||
_arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let options = get_options();
|
let options = get_options();
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ use anyhow::Result;
|
||||||
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::IndependentSampler;
|
use shared::core::sampler::IndependentSampler;
|
||||||
use std::fmt::Error;
|
|
||||||
|
|
||||||
impl CreateSampler for IndependentSampler {
|
impl CreateSampler for IndependentSampler {
|
||||||
fn create(
|
fn create(
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ impl CreateSampler for ZSobolSampler {
|
||||||
params: &ParameterDictionary,
|
params: &ParameterDictionary,
|
||||||
full_res: Point2i,
|
full_res: Point2i,
|
||||||
loc: &FileLoc,
|
loc: &FileLoc,
|
||||||
_arena: &mut Arena,
|
arena: &mut Arena,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let options = get_options();
|
let options = get_options();
|
||||||
let nsamp = options
|
let nsamp = options
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@ use crate::shapes::mesh::BilinearPatchMesh;
|
||||||
use crate::utils::sampling::PiecewiseConstant2D;
|
use crate::utils::sampling::PiecewiseConstant2D;
|
||||||
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use shared::core::geometry::{Bounds2f, Point2f};
|
|
||||||
use shared::core::shape::Shape;
|
use shared::core::shape::Shape;
|
||||||
use shared::shapes::BilinearPatchShape;
|
use shared::shapes::BilinearPatchShape;
|
||||||
use shared::utils::Transform;
|
use shared::utils::{Ptr, Transform};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
impl CreateShape for BilinearPatchShape {
|
impl CreateShape for BilinearPatchShape {
|
||||||
|
|
@ -20,10 +20,10 @@ impl CreateShape for BilinearPatchShape {
|
||||||
parameters: ParameterDictionary,
|
parameters: ParameterDictionary,
|
||||||
_float_textures: HashMap<String, FloatTexture>,
|
_float_textures: HashMap<String, FloatTexture>,
|
||||||
_loc: FileLoc,
|
_loc: FileLoc,
|
||||||
arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Vec<Shape>, String> {
|
) -> Result<Vec<Shape>, String> {
|
||||||
let mut vertex_indices = parameters.get_int_array("indices");
|
let mut vertex_indices = parameters.get_int_array("indices");
|
||||||
let mut p = parameters.get_point3f_array("P");
|
let p = parameters.get_point3f_array("P");
|
||||||
let mut uv = parameters.get_point2f_array("uv");
|
let mut uv = parameters.get_point2f_array("uv");
|
||||||
let mut n = parameters.get_normal3f_array("N");
|
let mut n = parameters.get_normal3f_array("N");
|
||||||
let mut face_indices = parameters.get_int_array("faceIndices");
|
let mut face_indices = parameters.get_int_array("faceIndices");
|
||||||
|
|
@ -64,7 +64,7 @@ impl CreateShape for BilinearPatchShape {
|
||||||
n.clear();
|
n.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i, &idx) in vertex_indices.iter().enumerate() {
|
for (_, &idx) in vertex_indices.iter().enumerate() {
|
||||||
if idx < 0 || idx as usize >= p.len() {
|
if idx < 0 || idx as usize >= p.len() {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
"Bilinear patch mesh has out-of-bounds vertex index {} ({} \"P\" values were given). Discarding this mesh.",
|
"Bilinear patch mesh has out-of-bounds vertex index {} ({} \"P\" values were given). Discarding this mesh.",
|
||||||
|
|
@ -93,9 +93,9 @@ impl CreateShape for BilinearPatchShape {
|
||||||
"\"emissionfilename\" is currently ignored for bilinear patches if \"uv\" coordinates have been provided--sorry!"
|
"\"emissionfilename\" is currently ignored for bilinear patches if \"uv\" coordinates have been provided--sorry!"
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
match Image::read(Path::new(filename), None) {
|
match Image::read(Path::new(&filename), None) {
|
||||||
Ok(mut im) => {
|
Ok(mut im) => {
|
||||||
let img = im.image;
|
let mut img = im.image;
|
||||||
img.flip_y();
|
img.flip_y();
|
||||||
image_dist = Some(PiecewiseConstant2D::from_image(&img));
|
image_dist = Some(PiecewiseConstant2D::from_image(&img));
|
||||||
}
|
}
|
||||||
|
|
@ -124,7 +124,7 @@ impl CreateShape for BilinearPatchShape {
|
||||||
let n_patches = host_arc.device.n_patches;
|
let n_patches = host_arc.device.n_patches;
|
||||||
let mesh_ptr = Ptr::from(&host_arc.device);
|
let mesh_ptr = Ptr::from(&host_arc.device);
|
||||||
let mut shapes = Vec::with_capacity(n_patches as usize);
|
let mut shapes = Vec::with_capacity(n_patches as usize);
|
||||||
for i in 0..n_patches {
|
for i in 0..n_patches as i32 {
|
||||||
shapes.push(Shape::BilinearPatch(BilinearPatchShape {
|
shapes.push(Shape::BilinearPatch(BilinearPatchShape {
|
||||||
mesh: mesh_ptr,
|
mesh: mesh_ptr,
|
||||||
blp_index: i,
|
blp_index: i,
|
||||||
|
|
@ -132,7 +132,7 @@ impl CreateShape for BilinearPatchShape {
|
||||||
rectangle: false,
|
rectangle: false,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
arena.alloc(shapes);
|
// arena.alloc(shapes);
|
||||||
Ok(shapes)
|
Ok(shapes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ use shared::utils::math::lerp;
|
||||||
use shared::utils::splines::{
|
use shared::utils::splines::{
|
||||||
cubic_bspline_to_bezier, elevate_quadratic_bezier_to_cubic, quadratic_bspline_to_bezier,
|
cubic_bspline_to_bezier, elevate_quadratic_bezier_to_cubic, quadratic_bspline_to_bezier,
|
||||||
};
|
};
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
|
||||||
|
|
@ -181,7 +181,7 @@ impl BilinearPatchMesh {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
render_from_object: &Transform,
|
render_from_object: &Transform,
|
||||||
reverse_orientation: bool,
|
reverse_orientation: bool,
|
||||||
vertex_indices: Vec<ui2>,
|
vertex_indices: Vec<i32>,
|
||||||
mut p: Vec<Point3f>,
|
mut p: Vec<Point3f>,
|
||||||
mut n: Vec<Normal3f>,
|
mut n: Vec<Normal3f>,
|
||||||
uv: Vec<Point2f>,
|
uv: Vec<Point2f>,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use crate::utils::{Arena, FileLoc, ParameterDictionary};
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use shared::core::shape::Shape;
|
use shared::core::shape::Shape;
|
||||||
use shared::shapes::TriangleShape;
|
use shared::shapes::TriangleShape;
|
||||||
use shared::utils::Transform;
|
use shared::utils::{Ptr, Transform};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
|
@ -16,11 +16,11 @@ impl CreateShape for TriangleShape {
|
||||||
reverse_orientation: bool,
|
reverse_orientation: bool,
|
||||||
parameters: ParameterDictionary,
|
parameters: ParameterDictionary,
|
||||||
_float_texture: HashMap<String, FloatTexture>,
|
_float_texture: HashMap<String, FloatTexture>,
|
||||||
loc: FileLoc,
|
_loc: FileLoc,
|
||||||
arena: &mut Arena,
|
_arena: &mut Arena,
|
||||||
) -> Result<Vec<Shape>, String> {
|
) -> Result<Vec<Shape>, String> {
|
||||||
let mut vertex_indices = parameters.get_int_array("indices");
|
let mut vertex_indices = parameters.get_int_array("indices");
|
||||||
let mut p = parameters.get_point3f_array("P");
|
let p = parameters.get_point3f_array("P");
|
||||||
let mut uvs = parameters.get_point2f_array("uv");
|
let mut uvs = parameters.get_point2f_array("uv");
|
||||||
let mut s = parameters.get_vector3f_array("S");
|
let mut s = parameters.get_vector3f_array("S");
|
||||||
let mut n = parameters.get_normal3f_array("N");
|
let mut n = parameters.get_normal3f_array("N");
|
||||||
|
|
@ -62,7 +62,7 @@ impl CreateShape for TriangleShape {
|
||||||
n.clear();
|
n.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i, &index) in vertex_indices.iter().enumerate() {
|
for (_, &index) in vertex_indices.iter().enumerate() {
|
||||||
// Check for negative indices (if keeping i32) or out of bounds
|
// Check for negative indices (if keeping i32) or out of bounds
|
||||||
if index < 0 || index as usize >= p.len() {
|
if index < 0 || index as usize >= p.len() {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
|
|
@ -98,7 +98,7 @@ impl CreateShape for TriangleShape {
|
||||||
|
|
||||||
let host_arc = Arc::new(host);
|
let host_arc = Arc::new(host);
|
||||||
let mut global_store = ALL_TRIANGLE_MESHES.lock();
|
let mut global_store = ALL_TRIANGLE_MESHES.lock();
|
||||||
let mesh_index = global_store.len() as u32;
|
// let mesh_index = global_store.len() as u32;
|
||||||
global_store.push(host_arc.clone());
|
global_store.push(host_arc.clone());
|
||||||
drop(global_store);
|
drop(global_store);
|
||||||
let n_patches = host_arc.device.n_triangles;
|
let n_patches = host_arc.device.n_triangles;
|
||||||
|
|
@ -111,7 +111,7 @@ impl CreateShape for TriangleShape {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
arena.alloc(shapes);
|
// arena.alloc(shapes);
|
||||||
Ok(shapes)
|
Ok(shapes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
|
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;
|
use shared::core::geometry::{Point2f, Vector3f};
|
||||||
|
use shared::core::spectrum::Spectrum;
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::math::SquareMatrix;
|
use shared::utils::math::SquareMatrix;
|
||||||
use shared::utils::ptr::Ptr;
|
use shared::utils::ptr::Ptr;
|
||||||
|
|
@ -26,7 +29,8 @@ impl RGBColorSpaceData {
|
||||||
illuminant: DenselySampledSpectrumBuffer,
|
illuminant: DenselySampledSpectrumBuffer,
|
||||||
rgb_to_spectrum_table: Ptr<RGBToSpectrumTable>,
|
rgb_to_spectrum_table: Ptr<RGBToSpectrumTable>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let w_xyz: XYZ = Spectrum::Dense(illuminant).to_xyz();
|
let stdspec = get_spectra_context();
|
||||||
|
let w_xyz: XYZ = Spectrum::Dense(*illuminant).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));
|
||||||
|
|
@ -37,8 +41,7 @@ impl RGBColorSpaceData {
|
||||||
[r_xyz.z(), g_xyz.z(), b_xyz.z()],
|
[r_xyz.z(), g_xyz.z(), b_xyz.z()],
|
||||||
];
|
];
|
||||||
let rgb = SquareMatrix::new(rgb_values);
|
let rgb = SquareMatrix::new(rgb_values);
|
||||||
let c_vec: Vector3f = rgb.inverse().unwrap() * w_xyz;
|
let c: RGB = rgb.inverse().unwrap() * w_xyz;
|
||||||
let c = RGB::from(c);
|
|
||||||
let xyz_from_rgb = rgb * SquareMatrix::diag(&[c.r, c.g, c.b]);
|
let xyz_from_rgb = rgb * SquareMatrix::diag(&[c.r, c.g, c.b]);
|
||||||
let rgb_from_xyz = xyz_from_rgb
|
let rgb_from_xyz = xyz_from_rgb
|
||||||
.inverse()
|
.inverse()
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
use crate::spectra::{DenselySampledSpectrumBuffer, piecewise::PiecewiseLinearSpectrumBuffer};
|
use crate::spectra::{DenselySampledSpectrumBuffer, piecewise::PiecewiseLinearSpectrumBuffer};
|
||||||
use shared::Float;
|
use shared::Float;
|
||||||
use shared::core::spectrum::Spectrum;
|
use shared::core::spectrum::Spectrum;
|
||||||
use shared::spectra::PiecewiseLinearSpectrum;
|
|
||||||
use shared::spectra::cie::*;
|
use shared::spectra::cie::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
use crate::globals::{ACES_TABLE, DCI_P3_TABLE, REC2020_TABLE, SRGB_TABLE};
|
use crate::globals::{ACES_TABLE, DCI_P3_TABLE, REC2020_TABLE, SRGB_TABLE};
|
||||||
use crate::spectra::colorspace::RGBColorSpaceData;
|
use crate::spectra::colorspace::RGBColorSpaceData;
|
||||||
use shared::core::color::RGBToSpectrumTable;
|
|
||||||
use shared::core::geometry::Point2f;
|
use shared::core::geometry::Point2f;
|
||||||
use shared::core::spectrum::Spectrum;
|
use shared::core::spectrum::Spectrum;
|
||||||
use shared::core::spectrum::StandardSpectra;
|
use shared::core::spectrum::StandardSpectra;
|
||||||
use shared::spectra::DeviceStandardColorSpaces;
|
|
||||||
use shared::spectra::RGBColorSpace;
|
|
||||||
use shared::spectra::cie::{CIE_D65, CIE_X, CIE_Y, CIE_Z};
|
use shared::spectra::cie::{CIE_D65, CIE_X, CIE_Y, CIE_Z};
|
||||||
|
use shared::utils::Ptr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
|
|
||||||
|
|
@ -64,7 +62,7 @@ pub static SRGB: LazyLock<Arc<RGBColorSpaceData>> = LazyLock::new(|| {
|
||||||
let r = Point2f::new(0.64, 0.33);
|
let r = Point2f::new(0.64, 0.33);
|
||||||
let g = Point2f::new(0.3, 0.6);
|
let g = Point2f::new(0.3, 0.6);
|
||||||
let b = Point2f::new(0.15, 0.06);
|
let b = Point2f::new(0.15, 0.06);
|
||||||
let table = Ptr::from(SRGB_TABLE.clone());
|
let table_ptr = Ptr::from(&SRGB_TABLE.clone());
|
||||||
|
|
||||||
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
||||||
});
|
});
|
||||||
|
|
@ -75,7 +73,7 @@ pub static DCI_P3: LazyLock<Arc<RGBColorSpaceData>> = LazyLock::new(|| {
|
||||||
let g = Point2f::new(0.265, 0.690);
|
let g = Point2f::new(0.265, 0.690);
|
||||||
let b = Point2f::new(0.150, 0.060);
|
let b = Point2f::new(0.150, 0.060);
|
||||||
|
|
||||||
let table_ptr = Ptr::from(DCI_P3_TABLE.clone());
|
let table_ptr = Ptr::from(&DCI_P3_TABLE.clone());
|
||||||
|
|
||||||
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
||||||
});
|
});
|
||||||
|
|
@ -86,7 +84,7 @@ pub static REC2020: LazyLock<Arc<RGBColorSpaceData>> = LazyLock::new(|| {
|
||||||
let g = Point2f::new(0.170, 0.797);
|
let g = Point2f::new(0.170, 0.797);
|
||||||
let b = Point2f::new(0.131, 0.046);
|
let b = Point2f::new(0.131, 0.046);
|
||||||
|
|
||||||
let table_ptr = Ptr::from(REC2020_TABLE.clone());
|
let table_ptr = Ptr::from(&REC2020_TABLE.clone());
|
||||||
|
|
||||||
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
||||||
});
|
});
|
||||||
|
|
@ -97,7 +95,7 @@ pub static ACES: LazyLock<Arc<RGBColorSpaceData>> = LazyLock::new(|| {
|
||||||
let g = Point2f::new(0.0000, 1.0000);
|
let g = Point2f::new(0.0000, 1.0000);
|
||||||
let b = Point2f::new(0.0001, -0.0770);
|
let b = Point2f::new(0.0001, -0.0770);
|
||||||
|
|
||||||
let table_ptr = Ptr::from(ACES_TABLE.clone());
|
let table_ptr = Ptr::from(&ACES_TABLE.clone());
|
||||||
|
|
||||||
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
Arc::new(RGBColorSpaceData::new(r, g, b, illum, table_ptr))
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::core::texture::FloatTexture;
|
use crate::core::texture::{
|
||||||
use crate::core::texture::{FloatTextureTrait, SpectrumTextureTrait};
|
FloatTexture, FloatTextureTrait, SpectrumTexture, SpectrumTextureTrait,
|
||||||
|
};
|
||||||
use crate::utils::{Arena, FileLoc, TextureParameterDictionary};
|
use crate::utils::{Arena, FileLoc, TextureParameterDictionary};
|
||||||
use shared::Float;
|
use shared::Float;
|
||||||
use shared::core::geometry::{Vector3f, VectorLike};
|
use shared::core::geometry::{Vector3f, VectorLike};
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::core::image::Image;
|
use crate::core::image::Image;
|
||||||
use crate::core::texture::{FloatTexture, SpectrumTexture, get_texture_cache};
|
use crate::core::texture::{FloatTexture, SpectrumTexture};
|
||||||
use crate::shapes::{BilinearPatchMesh, TriangleMesh};
|
use crate::shapes::{BilinearPatchMesh, TriangleMesh};
|
||||||
use crate::textures::CreateGPUSpectrumPtex;
|
use crate::utils::mipmap::MIPMap;
|
||||||
use crate::utils::sampling::PiecewiseConstant2D;
|
use crate::utils::sampling::PiecewiseConstant2D;
|
||||||
use shared::core::color::RGBToSpectrumTable;
|
use shared::core::color::RGBToSpectrumTable;
|
||||||
use shared::core::image::DeviceImage;
|
use shared::core::image::DeviceImage;
|
||||||
|
|
@ -247,7 +247,6 @@ impl Upload for FloatTexture {
|
||||||
FloatTexture::FBm(tex) => GPUFloatTexture::FBm(tex.clone()),
|
FloatTexture::FBm(tex) => GPUFloatTexture::FBm(tex.clone()),
|
||||||
FloatTexture::Windy(tex) => GPUFloatTexture::Windy(tex.clone()),
|
FloatTexture::Windy(tex) => GPUFloatTexture::Windy(tex.clone()),
|
||||||
FloatTexture::Wrinkled(tex) => GPUFloatTexture::Wrinkled(tex.clone()),
|
FloatTexture::Wrinkled(tex) => GPUFloatTexture::Wrinkled(tex.clone()),
|
||||||
FloatTexture::Constant(val) => GPUFloatTexture::Constant(*val),
|
|
||||||
FloatTexture::Scaled(tex) => {
|
FloatTexture::Scaled(tex) => {
|
||||||
let child_ptr = tex.tex.upload(arena);
|
let child_ptr = tex.tex.upload(arena);
|
||||||
|
|
||||||
|
|
@ -274,7 +273,7 @@ impl Upload for FloatTexture {
|
||||||
FloatTexture::DirectionMix(tex) => {
|
FloatTexture::DirectionMix(tex) => {
|
||||||
let tex1_ptr = tex.tex1.upload(arena);
|
let tex1_ptr = tex.tex1.upload(arena);
|
||||||
let tex2_ptr = tex.tex2.upload(arena);
|
let tex2_ptr = tex.tex2.upload(arena);
|
||||||
let gpu_dmix = shared::textures::GPUFloatDirectionMixTexture {
|
let gpu_dmix = GPUFloatDirectionMixTexture {
|
||||||
tex1: tex1_ptr,
|
tex1: tex1_ptr,
|
||||||
tex2: tex2_ptr,
|
tex2: tex2_ptr,
|
||||||
dir: tex.dir,
|
dir: tex.dir,
|
||||||
|
|
@ -285,16 +284,16 @@ impl Upload for FloatTexture {
|
||||||
FloatTexture::Image(tex) => {
|
FloatTexture::Image(tex) => {
|
||||||
let gpu_image_tex = GPUFloatImageTexture {
|
let gpu_image_tex = GPUFloatImageTexture {
|
||||||
mapping: tex.base.mapping,
|
mapping: tex.base.mapping,
|
||||||
tex_obj: image_ptr.offset as u64,
|
tex_obj: tex.base.mipmap.texture_object(),
|
||||||
scale: tex.base.scale,
|
scale: tex.base.scale,
|
||||||
invert: tex.base.invert,
|
invert: tex.base.invert,
|
||||||
};
|
};
|
||||||
GPUFloatTexture::Image(gpu_image_tex)
|
GPUFloatTexture::Image(gpu_image_tex)
|
||||||
}
|
}
|
||||||
|
|
||||||
FloatTexture::Ptex(tex) => {
|
// FloatTexture::Ptex(tex) => {
|
||||||
todo!("Implement Ptex buffer upload")
|
// todo!("Implement Ptex buffer upload")
|
||||||
}
|
// }
|
||||||
|
|
||||||
FloatTexture::Bilerp(tex) => GPUFloatTexture::Bilerp(tex.clone()),
|
FloatTexture::Bilerp(tex) => GPUFloatTexture::Bilerp(tex.clone()),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use shared::core::geometry::{Bounds2i, Point2i};
|
use shared::core::geometry::{Bounds2i, Point2i};
|
||||||
use shared::utils::containers::Array2D;
|
use shared::utils::containers::DeviceArray2D;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
@ -33,28 +33,29 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Array2DBuffer<T> {
|
#[derive(Debug, Clone)]
|
||||||
pub view: Array2D<T>,
|
pub struct Array2D<T> {
|
||||||
|
pub view: DeviceArray2D<T>,
|
||||||
_storage: Vec<T>,
|
_storage: Vec<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Deref for Array2DBuffer<T> {
|
impl<T> Deref for Array2D<T> {
|
||||||
type Target = Array2D<T>;
|
type Target = DeviceArray2D<T>;
|
||||||
fn deref(&self) -> &Self::Target {
|
fn deref(&self) -> &Self::Target {
|
||||||
&self.view
|
&self.view
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> DerefMut for Array2DBuffer<T> {
|
impl<T> DerefMut for Array2D<T> {
|
||||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
&mut self.view
|
&mut self.view
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Array2DBuffer<T> {
|
impl<T> Array2D<T> {
|
||||||
fn from_vec(extent: Bounds2i, mut storage: Vec<T>) -> Self {
|
fn from_vec(extent: Bounds2i, mut storage: Vec<T>) -> Self {
|
||||||
let width = extent.p_max.x() - extent.p_min.x();
|
let width = extent.p_max.x() - extent.p_min.x();
|
||||||
let view = Array2D {
|
let view = DeviceArray2D {
|
||||||
extent,
|
extent,
|
||||||
values: storage.as_mut_ptr(),
|
values: storage.as_mut_ptr(),
|
||||||
stride: width,
|
stride: width,
|
||||||
|
|
@ -66,7 +67,7 @@ impl<T> Array2DBuffer<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Default + Clone> Array2DBuffer<T> {
|
impl<T: Default + Clone> Array2D<T> {
|
||||||
pub fn new(extent: Bounds2i) -> Self {
|
pub fn new(extent: Bounds2i) -> Self {
|
||||||
let n = extent.area() as usize;
|
let n = extent.area() as usize;
|
||||||
let storage = vec![T::default(); n];
|
let storage = vec![T::default(); n];
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ use shared::core::image::{WrapMode, WrapMode2D};
|
||||||
use shared::spectra::RGBColorSpace;
|
use shared::spectra::RGBColorSpace;
|
||||||
use shared::utils::math::{lerp, safe_sqrt, square};
|
use shared::utils::math::{lerp, safe_sqrt, square};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::OnceLock;
|
|
||||||
|
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::ops::{Add, Mul, Sub};
|
use std::ops::{Add, Mul, Sub};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::core::image::Image;
|
use crate::core::image::Image;
|
||||||
use crate::utils::Arena;
|
use crate::utils::Arena;
|
||||||
|
use crate::utils::containers::Array2D;
|
||||||
use shared::Float;
|
use shared::Float;
|
||||||
use shared::core::geometry::{Point2i, Vector2f, Vector2i};
|
use shared::core::geometry::{Point2i, Vector2f, Vector2i};
|
||||||
use shared::utils::Ptr;
|
use shared::utils::Ptr;
|
||||||
|
|
@ -447,23 +448,23 @@ impl std::ops::Deref for SummedAreaTable {
|
||||||
|
|
||||||
impl SummedAreaTable {
|
impl SummedAreaTable {
|
||||||
pub fn new(values: &Array2D<Float>) -> Self {
|
pub fn new(values: &Array2D<Float>) -> Self {
|
||||||
let width = values.x_size();
|
let width = values.x_size() as i32;
|
||||||
let height = values.y_size();
|
let height = values.y_size() as i32;
|
||||||
|
|
||||||
let mut sum = Array2D::<f64>::new_with_dims(width, height);
|
let mut sum = Array2D::<f64>::new_dims(width, height);
|
||||||
sum[(0, 0)] = values[(0, 0)] as f64;
|
sum[(0, 0)] = values[(0, 0)] as f64;
|
||||||
|
|
||||||
for x in 1..width {
|
for x in 1..width {
|
||||||
sum[(x, 0)] = values[(x as i32, 0)] as f64 + sum[(x - 1, 0)];
|
sum[(x, 0)] = values[(x, 0)] as f64 + sum[(x - 1, 0)];
|
||||||
}
|
}
|
||||||
|
|
||||||
for y in 1..height {
|
for y in 1..height {
|
||||||
sum[(0, y)] = values[(0, y as i32)] as f64 + sum[(0, y - 1)];
|
sum[(0, y)] = values[(0, y)] as f64 + sum[(0, y - 1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
for y in 1..height {
|
for y in 1..height {
|
||||||
for x in 1..width {
|
for x in 1..width {
|
||||||
let term = values[(x as i32, y as i32)] as f64;
|
let term = values[(x, y)] as f64;
|
||||||
let left = sum[(x - 1, y)];
|
let left = sum[(x - 1, y)];
|
||||||
let up = sum[(x, y - 1)];
|
let up = sum[(x, y - 1)];
|
||||||
let diag = sum[(x - 1, y - 1)];
|
let diag = sum[(x - 1, y - 1)];
|
||||||
|
|
@ -472,7 +473,7 @@ impl SummedAreaTable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let device = DeviceSummedAreaTable { sum };
|
let device = DeviceSummedAreaTable { sum: *sum };
|
||||||
Self { device, sum }
|
Self { device, sum }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -494,7 +495,7 @@ impl std::ops::Deref for WindowedPiecewiseConstant2D {
|
||||||
impl WindowedPiecewiseConstant2D {
|
impl WindowedPiecewiseConstant2D {
|
||||||
pub fn new(func: Array2D<Float>) -> Self {
|
pub fn new(func: Array2D<Float>) -> Self {
|
||||||
let sat = *SummedAreaTable::new(&func);
|
let sat = *SummedAreaTable::new(&func);
|
||||||
let device = DeviceWindowedPiecewiseConstant2D { sat, func };
|
let device = DeviceWindowedPiecewiseConstant2D { sat, func: *func };
|
||||||
|
|
||||||
Self { sat, func, device }
|
Self { sat, func, device }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue