Skip to content

Commit 64472cd

Browse files
committed
Added Vector3 and sphere. There is an unknown problem with the normal calculation of the sphere.
1 parent 171ae17 commit 64472cd

File tree

10 files changed

+323
-21
lines changed

10 files changed

+323
-21
lines changed

Renderer/Color.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,22 @@ void Color::SetRaw(unsigned char raw[])
6868
}
6969
}
7070

71-
double Color::GetR()
71+
double Color::GetR() const
7272
{
7373
return (double)(r)/255.0f;
7474
}
7575

76-
double Color::GetG()
76+
double Color::GetG() const
7777
{
7878
return (double)(g) / 255.0f;
7979
}
8080

81-
double Color::GetB()
81+
double Color::GetB() const
8282
{
8383
return (double)(b) / 255.0f;
8484
}
8585

86-
double Color::GetA()
86+
double Color::GetA() const
8787
{
8888
return (double)(a) / 255.0f;
8989
}
@@ -119,3 +119,13 @@ Color& Color::operator=(const Color& c)
119119
return *this;
120120
}
121121

122+
Color Color::operator*(double t)
123+
{
124+
return Color(GetR()*t, GetG()*t, GetB()*t);
125+
}
126+
127+
Color Color::operator+(const Color& obj)
128+
{
129+
return Color(GetR() + obj.GetR(), GetG() + obj.GetG(), GetB() + obj.GetB());
130+
}
131+

Renderer/Color.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,18 @@ class Color
2828
unsigned char* GetRaw();
2929
void SetRaw(unsigned char raw[]);
3030

31-
double GetR();
32-
double GetG();
33-
double GetB();
34-
double GetA();
31+
double GetR() const;
32+
double GetG() const;
33+
double GetB() const;
34+
double GetA() const;
3535

3636
void SetR(double r);
3737
void SetG(double g);
3838
void SetB(double b);
3939
void SetA(double a);
4040

4141
Color& operator =(const Color &c);
42+
Color operator*(double t);
43+
Color operator+(const Color& obj);
4244
};
4345

Renderer/Ray.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "Ray.h"
2+
3+
Ray::Ray()
4+
{
5+
6+
}
7+
8+
Ray::Ray(const Vector3& origin, const Vector3& direction)
9+
{
10+
this->origin = origin;
11+
this->direction = direction;
12+
}
13+
14+
Vector3 Ray::At(double t) const
15+
{
16+
return origin + direction*t;
17+
}
18+
19+
Vector3 Ray::GetOrigin() const
20+
{
21+
return origin;
22+
}
23+
24+
Vector3 Ray::GetDirection() const
25+
{
26+
return direction;
27+
}

Renderer/Ray.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include "Vector3.h"
4+
5+
class Ray
6+
{
7+
private:
8+
Vector3 origin;
9+
Vector3 direction;
10+
public:
11+
Ray();
12+
Ray(const Vector3& origin, const Vector3& direction);
13+
14+
Vector3 At(double t) const;
15+
16+
Vector3 GetOrigin() const;
17+
Vector3 GetDirection() const;
18+
};
19+

Renderer/Renderer.cpp

Lines changed: 88 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,98 @@
11
#include <iostream>
2+
#include <math.h>
23

34
#include "Color.h"
45
#include "TGAImage.h"
6+
#include "Vector3.h"
7+
#include "Ray.h"
58

69
using namespace std;
710

11+
double hitSphere(const Vector3& center, double radius, const Ray& r)
12+
{
13+
Vector3 oc = r.GetOrigin() - center;
14+
//quaradic equation
15+
double a = r.GetDirection().Dot(r.GetDirection());
16+
double b = oc.Dot(r.GetDirection()) * 2.0;
17+
double c = oc.Dot(oc) - (radius * radius);
18+
double discriminant = (b * b) - (4 * a * c);
19+
20+
if (discriminant < 0)
21+
{
22+
return -1.0;
23+
}
24+
else
25+
{
26+
return (-b - sqrt(discriminant)) / (2.0 * a);
27+
}
28+
}
29+
30+
Color rayColor(const Ray& r) {
31+
double t = hitSphere(Vector3(0, 0, -1), 0.5, r);
32+
if (t > 0.0)
33+
{
34+
Vector3 normal = (r.At(t) - Vector3(0, 0, -1)).Unit();
35+
return Color(normal.X + 1, normal.Y + 1, normal.Z + 1) * 0.5;
36+
}
37+
38+
Vector3 unitDirection = r.GetDirection().Unit();
39+
double a = (unitDirection.Y + 1.0) * 0.5;
40+
return Color(1.0, 1.0, 1.0) * (1.0 - a) + Color(0.5, 0.7, 1.0) * a;
41+
}
42+
843
int main()
944
{
10-
int imageWidth = 256;
11-
int imageHeight = 256;
12-
13-
TGAImage image(imageWidth, imageHeight, 4);
14-
for (int y = 0; y < imageHeight; y++)
15-
{
16-
for (int x = 0; x < imageWidth; x++)
17-
{
18-
Color color(double(x) / double(imageWidth - 1), double(y) / double(imageHeight - 1), 0);
19-
image.SetPixel(x, y, color);
20-
}
21-
}
22-
image.WriteTGAFile("out.tga");
45+
//Image
46+
double aspectRatio = 16.0 / 9.0;
47+
int imageWidth = 400;
48+
49+
//Calc height using aspect ratio and ensure it is at least 1
50+
int imageHeight = double(imageWidth) / aspectRatio;
51+
if (imageHeight < 1)
52+
{
53+
imageHeight = 1;
54+
}
55+
56+
TGAImage image(imageWidth, imageHeight, 4);
57+
58+
//Camera
59+
double focalLength = 1.0;
60+
double viewportHeight = 2.0;
61+
double viewportWidth = viewportHeight * (double(imageWidth) / double(imageHeight));
62+
Vector3 cameraCenter = Vector3(0, 0, 0);
63+
64+
//Calc vectors across the horizonal and down the vertical edges of viewport
65+
Vector3 viewportU = Vector3(viewportWidth, 0, 0);//horizontal
66+
Vector3 viewportV = Vector3(0, -viewportHeight, 0);//vertical
67+
68+
//Calc delta vector for pixels across viewport
69+
Vector3 pixelDeltaU = viewportU / imageWidth;
70+
Vector3 pixelDeltaV = viewportV / imageHeight;
71+
72+
//Calc location of upper left pixel
73+
Vector3 viewportUpperLeft = cameraCenter - Vector3(0, 0, focalLength) - viewportU / 2 - viewportV / 2;
74+
Vector3 pixel0Center = viewportUpperLeft + (pixelDeltaU + pixelDeltaV) * 0.5;
75+
76+
//Render
77+
for (int y = 0; y < imageHeight; y++)
78+
{
79+
//clog << "\x1b[2K";
80+
//clog << "\rScanlines remaining: " << (imageHeight - y) << ' ' << flush;
81+
82+
for (int x = 0; x < imageWidth; x++)
83+
{
84+
Vector3 pixelCenter = pixel0Center + (pixelDeltaU * x) + (pixelDeltaV * y);
85+
Vector3 rayDirection = pixelCenter - cameraCenter;
86+
Ray ray = Ray(cameraCenter, rayDirection);
87+
88+
//Color color = Color(double(x) / double(imageWidth - 1), double(y) / double(imageHeight - 1), 0);
89+
Color color = rayColor(ray);
90+
91+
92+
image.SetPixel(x, y, color);
93+
}
94+
}
95+
//clog << "\x1b[2K";
96+
//clog << "\rDone";
97+
image.WriteTGAFile("out.tga");
2398
}

Renderer/Renderer.vcxproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,19 @@
128128
</ItemDefinitionGroup>
129129
<ItemGroup>
130130
<ClCompile Include="Color.cpp" />
131+
<ClCompile Include="Ray.cpp" />
131132
<ClCompile Include="Renderer.cpp" />
132133
<ClCompile Include="TGAImage.cpp" />
134+
<ClCompile Include="Vector3.cpp" />
133135
</ItemGroup>
134136
<ItemGroup>
135137
<ClInclude Include="Color.h" />
138+
<ClInclude Include="Ray.h" />
136139
<ClInclude Include="TGAImage.h" />
140+
<ClInclude Include="Vector3.h" />
141+
</ItemGroup>
142+
<ItemGroup>
143+
<Image Include="out.tga" />
137144
</ItemGroup>
138145
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
139146
<ImportGroup Label="ExtensionTargets">

Renderer/Renderer.vcxproj.filters

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
<ClCompile Include="Color.cpp">
2525
<Filter>Source Files</Filter>
2626
</ClCompile>
27+
<ClCompile Include="Vector3.cpp">
28+
<Filter>Source Files</Filter>
29+
</ClCompile>
30+
<ClCompile Include="Ray.cpp">
31+
<Filter>Source Files</Filter>
32+
</ClCompile>
2733
</ItemGroup>
2834
<ItemGroup>
2935
<ClInclude Include="TGAImage.h">
@@ -32,5 +38,16 @@
3238
<ClInclude Include="Color.h">
3339
<Filter>Header Files</Filter>
3440
</ClInclude>
41+
<ClInclude Include="Vector3.h">
42+
<Filter>Header Files</Filter>
43+
</ClInclude>
44+
<ClInclude Include="Ray.h">
45+
<Filter>Header Files</Filter>
46+
</ClInclude>
47+
</ItemGroup>
48+
<ItemGroup>
49+
<Image Include="out.tga">
50+
<Filter>Resource Files</Filter>
51+
</Image>
3552
</ItemGroup>
3653
</Project>

Renderer/Vector3.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#include "Vector3.h"
2+
3+
Vector3::Vector3()
4+
{
5+
X = 0;
6+
Y = 0;
7+
Z = 0;
8+
}
9+
10+
Vector3::Vector3(double x, double y, double z)
11+
{
12+
X = x;
13+
Y = y;
14+
Z = z;
15+
}
16+
17+
Vector3::Vector3(const Vector3& v)
18+
{
19+
X = v.X;
20+
Y = v.Y;
21+
Z = v.Z;
22+
}
23+
24+
double Vector3::Length()
25+
{
26+
return sqrt(LengthSquared());
27+
}
28+
29+
double Vector3::LengthSquared()
30+
{
31+
return (X * X) + (Y * Y) + (Z * Z);
32+
}
33+
34+
double Vector3::Dot(const Vector3& v)
35+
{
36+
return (X * v.X) + (Y * v.Y) + (Z * v.Z);
37+
}
38+
39+
Vector3 Vector3::Cross(const Vector3& v)
40+
{
41+
return Vector3((Y * v.Z) - (Z * v.Y), (Z * v.X) - (X * v.Z), (X * v.Y) - (Y * v.X));
42+
}
43+
44+
Vector3 Vector3::Unit()
45+
{
46+
double length = Length();
47+
return Vector3(X/length, Y/length, Z/length);
48+
}
49+
50+
Vector3 Vector3::operator-() const
51+
{
52+
return Vector3(-X, -Y, -Z);
53+
}
54+
55+
Vector3& Vector3::operator+=(const Vector3& rhs)
56+
{
57+
X += rhs.X;
58+
Y += rhs.Y;
59+
Z += rhs.Z;
60+
return *this;
61+
}
62+
63+
Vector3& Vector3::operator*=(double t)
64+
{
65+
X *= t;
66+
Y *= t;
67+
Z *= t;
68+
return *this;
69+
}
70+
71+
Vector3& Vector3::operator/=(double t)
72+
{
73+
return *this *= 1 / t;
74+
}
75+
76+
Vector3 Vector3::operator+(const Vector3& obj) const
77+
{
78+
return Vector3(X + obj.X, Y + obj.Y, Z + obj.Z);
79+
}
80+
81+
Vector3 Vector3::operator-(const Vector3& obj) const
82+
{
83+
return Vector3(X - obj.X, Y - obj.Y, Z - obj.Z);
84+
}
85+
86+
Vector3 Vector3::operator*(const Vector3& obj) const
87+
{
88+
return Vector3(X * obj.X, Y * obj.Y, Z * obj.Z);
89+
}
90+
91+
Vector3 Vector3::operator*(double t) const
92+
{
93+
return Vector3(X * t, Y * t, Z * t);
94+
}
95+
96+
Vector3 Vector3::operator/(double t) const
97+
{
98+
return Vector3(X / t, Y / t, Z / t);
99+
}
100+
101+
102+
103+
104+
105+
106+

0 commit comments

Comments
 (0)