package xyz.marsavic.gfxlab.graphics3d.scene; import javafx.util.Pair; import xyz.marsavic.gfxlab.Spectrum; import xyz.marsavic.gfxlab.SplineSpectrum; import xyz.marsavic.gfxlab.Vec3; import xyz.marsavic.gfxlab.graphics3d.Light; import xyz.marsavic.gfxlab.graphics3d.Material; import xyz.marsavic.gfxlab.graphics3d.Scene; import xyz.marsavic.gfxlab.graphics3d.Solid; import xyz.marsavic.gfxlab.graphics3d.solids.Ball; import xyz.marsavic.gfxlab.graphics3d.solids.Group; import xyz.marsavic.gfxlab.graphics3d.solids.HalfSpace; import xyz.marsavic.gfxlab.graphics3d.textures.Grid; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; public class SpectrumTest extends Scene.Base { public SpectrumTest() { var materialUVWalls = Grid.standard(Spectrum.WHITE); var materialUVWallsL = Grid.standard(new SplineSpectrum(new Pair[]{ new Pair(450.0, 0.2), new Pair(550.0, 0.35), new Pair(650.0, 0.8), })); var materialUVWallsR = Grid.standard(new SplineSpectrum(new Pair[]{ new Pair(450.0, 0.3), new Pair(550.0, 0.75), new Pair(650.0, 0.3), })); Collection solids = new ArrayList<>(); Collections.addAll(solids, HalfSpace.pn(Vec3.xyz(-1, 0, 0), Vec3.xyz( 1, 0, 0), materialUVWallsL), HalfSpace.pn(Vec3.xyz( 1, 0, 0), Vec3.xyz(-1, 0, 0), materialUVWallsR), HalfSpace.pn(Vec3.xyz( 0, -1, 0), Vec3.xyz( 0, 1, 0), materialUVWalls), HalfSpace.pn(Vec3.xyz( 0, 1, 0), Vec3.xyz( 0, -1, 0), materialUVWalls), HalfSpace.pn(Vec3.xyz( 0, 0, 1), Vec3.xyz( 0, 0, -1), materialUVWalls), Ball.cr(Vec3.xyz(-0.3, 0.3, 0.0), 0.4, uv -> Material.GLASS.refractive(new SplineSpectrum( new Pair[]{ new Pair(450.0, 0.8), new Pair(550.0, 0.35), new Pair(650.0, 0.2), } ))), Ball.cr(Vec3.xyz( 0.4, -0.4, 0.0), 0.4, uv -> Material.GLASS), Ball.cr(Vec3.xyz(-0.3, -0.4, -0.6), 0.4, uv -> Material.GLASS.refractiveIndex(w -> 2.5)), Ball.cr(Vec3.xyz( 0.4, 0.3, 0.6), 0.4, uv -> Material.GLASS.refractiveIndex(w -> 0.6)) ); Collections.addAll(lights, Light.pc(Vec3.xyz(-0.7, 0.7, -0.7), Spectrum.WHITE), Light.pc(Vec3.xyz(-0.7, 0.7, 0.7), Spectrum.WHITE), Light.pc(Vec3.xyz( 0.7, 0.7, -0.7), Spectrum.WHITE), Light.pc(Vec3.xyz( 0.7, 0.7, 0.7), Spectrum.WHITE) ); solid = Group.of(solids); } }