Skip to content

Commit 1a18de5

Browse files
Merge pull request #16 from EdwardPalmer99/EdwardPalmer99/partial-migration-to-CPP
Rewrite Primitives, Scene, Camera, PhotonEngine in C++
2 parents 17bf13f + 2e229c1 commit 1a18de5

48 files changed

Lines changed: 2280 additions & 2382 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.bazelrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
test -c opt --verbose_failures --test_output=all
44

55
build -c opt --verbose_failures
6-
build --copt='-Wall' --copt='-Wno-missing-braces' --copt='-O2'
6+
build --copt='-Wall' --copt='-Wno-missing-braces' --copt='-O2' --copt='-g'
77
build --conlyopt='-std=gnu11'
88
build --cxxopt='-std=c++17'
99
build --color=yes

examples/BUILD.bazel

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cc_binary(
22
name = "batcave",
3-
srcs = ["BatCave.c"],
3+
srcs = ["BatCave.cpp"],
44
deps = [
55
"//lib:cphoton"
66
],
@@ -10,7 +10,7 @@ cc_binary(
1010

1111
cc_binary(
1212
name = "menger-cube",
13-
srcs = ["MengerCube.c"],
13+
srcs = ["MengerCube.cpp"],
1414
deps = [
1515
"//lib:cphoton"
1616
],

examples/BatCave.c

Lines changed: 0 additions & 105 deletions
This file was deleted.

examples/BatCave.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/**
2+
* @file BatCave.c
3+
* @author Edward Palmer
4+
* @date 2025-01-31
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
extern "C"
11+
{
12+
#include "engine/RenderSettings.h"
13+
#include "utility/PPMWriter.h"
14+
}
15+
16+
#include "engine/PhotonEngine.hpp"
17+
#include "engine/Scene.hpp"
18+
#include "engine/primitives/BVHNode.hpp"
19+
#include "engine/primitives/Cube.hpp"
20+
#include "engine/primitives/Plane.hpp"
21+
#include "engine/primitives/Primitive.hpp"
22+
23+
#include <cstdlib>
24+
#include <vector>
25+
26+
Primitive *makeDarkKnightRoom(double length, double width, double height);
27+
28+
int main(int argc, const char *argv[])
29+
{
30+
parseCLIOptions(argc, argv);
31+
32+
// Create the camera:
33+
const double aspectRatio = ((double)gRenderSettings.pixelsWide / (double)gRenderSettings.pixelsHigh);
34+
Camera camera(45.0, aspectRatio, 1, 0, point3(-2.5, 2, 10), point3(0, 2, 0));
35+
36+
Primitive *room = makeDarkKnightRoom(20, 16.0, 5);
37+
38+
Scene scene;
39+
scene.addObject(room);
40+
41+
// Monolith:
42+
for (int i = 0; i < 4; i++)
43+
{
44+
for (int j = 0; j < 9; j++)
45+
{
46+
Primitive *cube = new Cube(point3(0.5 * i, 0.25 + 0.5 * j, 0), zeroVector(), 0.5,
47+
makeLambertian(makeSolidTexture(color3(.01, .01, .01))));
48+
49+
scene.addObject(cube);
50+
}
51+
}
52+
53+
PhotonEngine engine(gRenderSettings.pixelsWide, gRenderSettings.pixelsHigh);
54+
55+
PPMImage *outputImage = engine.render(&scene, &camera);
56+
57+
writeBinary16BitPPMImage(outputImage, gRenderSettings.outputPath);
58+
59+
freePPMImage(outputImage);
60+
61+
return 0;
62+
}
63+
64+
65+
Primitive *makeDarkKnightRoom(double length, double width, double height)
66+
{
67+
const double halfRoomW = 0.5 * width;
68+
const double halfRoomL = 0.5 * length;
69+
70+
Material *wallMaterial = makeLambertian(makeSolidTexture(color3(0.05, 0.05, 0.05)));
71+
Material *lightMaterial = makeEmitter(color3(.9, .9, .9));
72+
73+
std::vector<Primitive *> objects;
74+
75+
objects.push_back(new Plane(point3(halfRoomW, 0, 0), vector3(-1, 0, 0), wallMaterial));
76+
objects.push_back(new Plane(point3(-halfRoomW, 0, 0), vector3(1, 0, 0), wallMaterial));
77+
objects.push_back(new Plane(point3(0, 0, -halfRoomL), vector3(0, 0, 1), wallMaterial));
78+
objects.push_back(new Plane(point3(0, 0, halfRoomL), vector3(0, 0, -1), wallMaterial));
79+
objects.push_back(new Plane(point3(0, height, 0), vector3(0, -1, 0), wallMaterial));
80+
objects.push_back(new Plane(point3(0, 0, 0), vector3(0, 1, 0), wallMaterial));
81+
82+
// Create all of the lights on the ceiling:
83+
for (int i = -halfRoomW; i <= halfRoomW; i += 1)
84+
{
85+
for (int j = -halfRoomL; j <= halfRoomL; j += 1)
86+
{
87+
Primitive *floorPanel = new Cube(point3(i + 0.495, -0.490, j + 0.495), zeroVector(), 0.99, wallMaterial);
88+
89+
Primitive *ceilingPanel =
90+
new Cube(point3(i + 0.495, height + .494, j + 0.495), zeroVector(), 0.99, lightMaterial);
91+
92+
objects.push_back(floorPanel);
93+
objects.push_back(ceilingPanel);
94+
}
95+
}
96+
97+
objects.shrink_to_fit();
98+
return new BVHNode(objects.data(), 0, objects.size());
99+
}
Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,19 @@
77
*
88
*/
99

10-
#include "CPhoton.h"
10+
extern "C"
11+
{
12+
#include "engine/RenderSettings.h"
13+
#include "utility/PPMWriter.h"
14+
}
15+
16+
#include "engine/PhotonEngine.hpp"
17+
#include "engine/Scene.hpp"
18+
#include "engine/primitives/BVHNode.hpp"
19+
#include "engine/primitives/Cube.hpp"
20+
#include "engine/primitives/Plane.hpp"
21+
#include "engine/primitives/Primitive.hpp"
22+
#include "models/MengerCube.hpp"
1123

1224
int main(int argc, const char *argv[])
1325
{
@@ -18,7 +30,7 @@ int main(int argc, const char *argv[])
1830
// Create the camera:
1931
const double aspectRatio = ((double)gRenderSettings.pixelsWide / (double)gRenderSettings.pixelsHigh);
2032

21-
Camera camera = makeCamera(45.0, aspectRatio, 4, 0.0, point3(2, 5, 5), point3(0.2, 0.6, 1.0));
33+
Camera camera(45.0, aspectRatio, 4, 0.0, point3(2, 5, 5), point3(0.2, 0.6, 1.0));
2234

2335
// Create the textures:
2436
Texture *greyColor = makeSolidTexture(color3(0.20, 0.26, 0.35));
@@ -29,30 +41,29 @@ int main(int argc, const char *argv[])
2941
Material *goldLambertian = makeLambertian(goldColor);
3042

3143
// Create the scene:
32-
Scene *scene = makeScene();
44+
Scene scene;
3345

3446
Primitive *mengerSponge0 = makeMengerSponge(0, point3(-1.5, 0.5, -1.5), 1.0, goldLambertian);
3547
Primitive *mengerSponge1 = makeMengerSponge(1, point3(1.5, 0.5, -1.5), 1.0, goldLambertian);
3648
Primitive *mengerSponge3 = makeMengerSponge(3, point3(-1.5, 0.5, 1.5), 1.0, goldLambertian);
3749
Primitive *mengerSponge2 = makeMengerSponge(2, point3(1.5, 0.5, 1.5), 1.0, goldLambertian);
3850
Primitive *mengerSponge4 = makeMengerSponge(4, point3(0, 0.5, 0), 1.0, goldLambertian);
39-
Primitive *plane = makePlane(point3(0, 0, 0), vector3(0, 1, 0), greyMetal);
51+
Primitive *plane = new Plane(point3(0, 0, 0), vector3(0, 1, 0), greyMetal);
4052

41-
scene->addObject(scene, mengerSponge0);
42-
scene->addObject(scene, mengerSponge1);
43-
scene->addObject(scene, mengerSponge2);
44-
scene->addObject(scene, mengerSponge3);
45-
scene->addObject(scene, mengerSponge4);
46-
scene->addObject(scene, plane);
47-
scene->markAsFinished(scene);
53+
scene.addObject(mengerSponge0);
54+
scene.addObject(mengerSponge1);
55+
scene.addObject(mengerSponge2);
56+
scene.addObject(mengerSponge3);
57+
scene.addObject(mengerSponge4);
58+
scene.addObject(plane);
4859

4960
// Render:
50-
PPMImage *outputImage = renderScene(scene, &camera);
61+
PhotonEngine engine(gRenderSettings.pixelsWide, gRenderSettings.pixelsHigh);
62+
63+
PPMImage *outputImage = engine.render(&scene, &camera);
5164
writeBinary16BitPPMImage(outputImage, gRenderSettings.outputPath);
5265

5366
// Cleanup:
5467
freePPMImage(outputImage);
55-
scene->destructor(scene);
56-
5768
return 0;
5869
}

lib/BUILD.bazel

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cc_library(
22
name = "cphoton",
3-
hdrs = glob(["**/*.h", "*.h"]),
4-
srcs = glob(["**/*.cpp", "**/*.c"]),
3+
hdrs = glob(["**/*.h", "*.h", "**/*.hpp", "**/**/*.hpp"]),
4+
srcs = glob(["**/*.cpp", "**/*.c", "**/**/*.cpp"]),
55
strip_include_prefix = ".",
66
visibility = ["//visibility:public"]
77
)

lib/CPhoton.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,10 @@
88
*/
99

1010
#pragma once
11-
#include "engine/Camera.h"
1211
#include "engine/HitRec.h"
1312
#include "engine/Material.h"
14-
#include "engine/Primitive.h"
1513
#include "engine/Ray.h"
16-
#include "engine/RayTracer.h"
1714
#include "engine/RenderSettings.h"
18-
#include "engine/Scene.h"
1915
#include "engine/Texture.h"
2016
#include "logger/Logger.h"
2117
#include "models/Fractals3D.h"

lib/engine/Camera.c

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)