From 96fd7e43396c598651f28134eccadf76f88e857f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petar=20Kapri=C5=A1?= Date: Tue, 20 Dec 2022 15:02:57 +0100 Subject: [PATCH] Create simple Obamaborea scene --- resources/obomba.jpg | Bin 0 -> 43956 bytes .../gfxlab/graphics3d/scene/Obamaborea.java | 101 ++++++++++++++++++ .../gfxlab/graphics3d/scene/SceneTest1.java | 20 +++- .../marsavic/gfxlab/playground/GfxLab.java | 4 +- 4 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 resources/obomba.jpg create mode 100644 src/xyz/marsavic/gfxlab/graphics3d/scene/Obamaborea.java diff --git a/resources/obomba.jpg b/resources/obomba.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9786cc5c2e4dd1402093d1ccdc4e04be9501b4da GIT binary patch literal 43956 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 J7@I$=|Jg74f1CgS literal 0 HcmV?d00001 diff --git a/src/xyz/marsavic/gfxlab/graphics3d/scene/Obamaborea.java b/src/xyz/marsavic/gfxlab/graphics3d/scene/Obamaborea.java new file mode 100644 index 0000000..eed345c --- /dev/null +++ b/src/xyz/marsavic/gfxlab/graphics3d/scene/Obamaborea.java @@ -0,0 +1,101 @@ +package xyz.marsavic.gfxlab.graphics3d.scene; + +import xyz.marsavic.gfxlab.Color; +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.Group; +import xyz.marsavic.gfxlab.graphics3d.solids.HalfSpace; +import xyz.marsavic.gfxlab.graphics3d.solids.Parallelepiped; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Obamaborea extends Scene.Base { + BufferedImage obomba; + { + try { + obomba = ImageIO.read(new File("resources/obomba.jpg")); + } catch (IOException e) { + System.err.println("Couldn't load Obomba, exiting"); + System.exit(-1); + } + } + + + + public Obamaborea(int width, int floors) { + double pillarHeight = 5; + double pillarSpace = 5; + Solid floor = HalfSpace.pn(Vec3.xyz(0, -1, 0), Vec3.xyz(0, 0.1, 0), + uv -> Material.diffuseImage(obomba, uv) + ); + Parallelepiped[][][] pillars = new Parallelepiped[floors][width][width]; + + for (int i = 0; i < floors; i++) { + for (int j = 0; j < width; j++) { + for (int k = 0; k < width; k++) { + pillars[i][j][k] = + Parallelepiped.cxyz( + Vec3.xyz((k+0.5-width/2.0)*pillarSpace, + (i*1.5)*pillarHeight, + (j+0.5-width/2.0)*pillarSpace), + 1, pillarHeight, 1, + uv -> Material.diffuseImage(obomba, uv)); + } + } + } + + List objects = Arrays.stream(pillars).flatMap(Arrays::stream).flatMap(Arrays::stream) + .collect(Collectors.toList()); + objects.add(floor); + solid = Group.of(objects); + +// Light[][][] ls = new Light[floors+1][width+1][width+1]; +// +// for (int i = 0; i < floors+1; i++) { +// for (int j = 0; j < width+1; j++) { +// for (int k = 0; k < width+1; k++) { +// ls[i][j][k] = Light.pc(Vec3.xyz(((double) k - width / 2.0) * pillarSpace, +// (i + 0.5) * pillarHeight, +// ((double) j - width / 2.0) * pillarSpace), Color.gray(10)); +// } +// } +// } + // Light [] lsFlat = Arrays.stream(ls).flatMap(Arrays::stream).flatMap(Arrays::stream).collect(Collectors.toList()).toArray(new Light[0]); + Collections.addAll(lights, Light.pc(Vec3.xyz((-width/2.0) * pillarSpace, + 0.5*pillarHeight, + (-width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((width/2.0) * pillarSpace, + 0.5*pillarHeight, + (-width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((-width/2.0) * pillarSpace, + 0.5*pillarHeight, + (width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((width/2.0) * pillarSpace, + 0.5*pillarHeight, + (width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((-width/2.0) * pillarSpace, + (width+0.5)*pillarHeight, + (-width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((width/2.0) * pillarSpace, + (width+0.5)*pillarHeight, + (-width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((-width/2.0) * pillarSpace, + (width+0.5)*pillarHeight, + (width/2.0) * pillarSpace), Color.gray(30)), + Light.pc(Vec3.xyz((width/2.0) * pillarSpace, + (width+0.5)*pillarHeight, + (width/2.0) * pillarSpace), Color.gray(30)) + ); + } + +} diff --git a/src/xyz/marsavic/gfxlab/graphics3d/scene/SceneTest1.java b/src/xyz/marsavic/gfxlab/graphics3d/scene/SceneTest1.java index deb6e3c..89d24e7 100644 --- a/src/xyz/marsavic/gfxlab/graphics3d/scene/SceneTest1.java +++ b/src/xyz/marsavic/gfxlab/graphics3d/scene/SceneTest1.java @@ -9,21 +9,33 @@ import xyz.marsavic.gfxlab.graphics3d.solids.Ball; import xyz.marsavic.gfxlab.graphics3d.solids.Group; import xyz.marsavic.gfxlab.graphics3d.solids.HalfSpace; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.util.Collections; public class SceneTest1 extends Scene.Base{ - + BufferedImage obomba; + { + try { + obomba = ImageIO.read(new File("resources/obomba.jpg")); + } catch (IOException e) { + System.err.println("Couldn't load Obomba, exiting"); + System.exit(-1); + } + } + public SceneTest1() { solid = Group.of( Ball.cr(Vec3.xyz(0, 0, 0), 1, - uv -> new Material(Color.hsb(uv.x() * 6, 0.8, uv.y())) + uv -> Material.diffuseImage(obomba, uv) ), HalfSpace.pn(Vec3.xyz(0, -1, 0), Vec3.xyz(0, 1, 0), - uv -> new Material(Color.hsb(uv.x(), 0.8, 0.8)) + uv -> Material.diffuseImage(obomba, uv) ) ); - Collections.addAll(lights, Light.pc(Vec3.xyz(-1, 1, -1), Color.hsb(0.0, 1.0, 0.6)), Light.pc(Vec3.xyz( 2, 0, 0), Color.gray(0.6)), diff --git a/src/xyz/marsavic/gfxlab/playground/GfxLab.java b/src/xyz/marsavic/gfxlab/playground/GfxLab.java index ec749b4..c109be7 100644 --- a/src/xyz/marsavic/gfxlab/playground/GfxLab.java +++ b/src/xyz/marsavic/gfxlab/playground/GfxLab.java @@ -5,7 +5,7 @@ import xyz.marsavic.functions.interfaces.F1; import xyz.marsavic.gfxlab.*; import xyz.marsavic.gfxlab.elements.Output; import xyz.marsavic.gfxlab.graphics3d.raytracers.RayTracerSimple; -import xyz.marsavic.gfxlab.graphics3d.scene.SceneTest1; +import xyz.marsavic.gfxlab.graphics3d.scene.Obamaborea; import xyz.marsavic.gfxlab.gui.UtilsGL; import xyz.marsavic.gfxlab.tonemapping.ColorTransform; import xyz.marsavic.gfxlab.tonemapping.ToneMapping; @@ -30,7 +30,7 @@ public class GfxLab { e(Fs::transformedColorFunction, // e(Blobs::new, val(5), val(0.1), val(0.2)), e(RayTracerSimple::new, - e(SceneTest1::new) + e(Obamaborea::new, val(3), val(3)) ), e(TransformationsFromSize.toGeometric, eSize) )