First Working Render & Vector Class Modifications
Good News: It works! Bad News: 0.2 FPS
This commit is contained in:
		
							
								
								
									
										20
									
								
								3DTest/Objects.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								3DTest/Objects.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | #include "SynGame.hpp" | ||||||
|  |  | ||||||
|  | class Sphere | ||||||
|  | { | ||||||
|  |     public: | ||||||
|  |         Vector3 position; | ||||||
|  |         float radius; | ||||||
|  |         sf::Color color; | ||||||
|  |         Sphere(Vector3 = (0,0,0), float = 1.0, sf::Color = sf::Color::White); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | Sphere::Sphere(Vector3 position, float radius, sf::Color color) | ||||||
|  | { | ||||||
|  |     this -> position = position; | ||||||
|  |     this -> radius = radius; | ||||||
|  |     this -> color = color; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										143
									
								
								3DTest/RayMarch.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								3DTest/RayMarch.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | |||||||
|  | #include "SynGame.hpp" | ||||||
|  |  | ||||||
|  | class RayMarch | ||||||
|  | { | ||||||
|  |     private: | ||||||
|  |         Sphere *spheres; | ||||||
|  |         Sphere *closest; | ||||||
|  |         Vector3 direction; | ||||||
|  |         Vector3 position; | ||||||
|  |         int sphereSize; | ||||||
|  |         int stepLimit; | ||||||
|  |         int stepCounter; | ||||||
|  |         float minDistance; | ||||||
|  |         float maxDistance; | ||||||
|  |         float GetClosestDistance(); | ||||||
|  |         Sphere *GetClosestSphere(); | ||||||
|  |     public: | ||||||
|  |         RayMarch(); | ||||||
|  |         RayMarch(Vector3, Vector3, Sphere *, int = 0); | ||||||
|  |         void SetRay(Vector3, Vector3, Sphere *, int = 0, int = 100, float = 0.01); | ||||||
|  |         void SetPosition(Vector3, Vector3); | ||||||
|  |         int GetStepCount(); | ||||||
|  |         sf::Color FireRay(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | RayMarch::RayMarch() | ||||||
|  | { | ||||||
|  |     this -> position = (0.0, 0.0); | ||||||
|  |     this -> direction = (0.0, 0.0); | ||||||
|  |     this -> spheres = NULL; | ||||||
|  |     stepCounter = 0; | ||||||
|  |     sphereSize = 0; | ||||||
|  |     minDistance = 0.01; | ||||||
|  |     stepLimit = 100; | ||||||
|  |     maxDistance = 100.0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | RayMarch::RayMarch(Vector3 position, Vector3 direction, Sphere *spheres, int size) | ||||||
|  | { | ||||||
|  |     this -> position = position; | ||||||
|  |     this -> direction = direction; | ||||||
|  |     this -> spheres = spheres; | ||||||
|  |     sphereSize = size; | ||||||
|  |     stepCounter = 0; | ||||||
|  |     minDistance = 0.01; | ||||||
|  |     stepLimit = 100; | ||||||
|  |     maxDistance = 100.0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RayMarch::SetRay(Vector3 position, Vector3 direction, Sphere *spheres, int size, int stepLimit, float minDistance) | ||||||
|  | { | ||||||
|  |     this -> position = position; | ||||||
|  |     this -> direction = direction; | ||||||
|  |     this -> spheres = spheres; | ||||||
|  |     this -> sphereSize = size; | ||||||
|  |     this -> stepLimit = stepLimit; | ||||||
|  |     this -> minDistance = minDistance; | ||||||
|  |     stepCounter = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RayMarch::SetPosition(Vector3 position, Vector3 direction) | ||||||
|  | { | ||||||
|  |     this -> position = position; | ||||||
|  |     this -> direction = direction; | ||||||
|  |     stepCounter = 0; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Sphere *RayMarch::GetClosestSphere() | ||||||
|  | { | ||||||
|  |     int i; | ||||||
|  |     Sphere *ptr = spheres; | ||||||
|  |     Sphere *closestSphere = NULL; | ||||||
|  |     float closestDistance; | ||||||
|  |     float distance; | ||||||
|  |  | ||||||
|  |     if(!ptr) return NULL; | ||||||
|  |  | ||||||
|  |     closestDistance = position.Distance((*ptr).position) - (*ptr).radius; | ||||||
|  |     for (i = 0; i < sphereSize; i++) | ||||||
|  |     { | ||||||
|  |         distance = position.Distance((*ptr).position) - (*ptr).radius; | ||||||
|  |         if(distance < closestDistance) | ||||||
|  |         { | ||||||
|  |             closestDistance = distance; | ||||||
|  |             closestSphere = ptr; | ||||||
|  |         } | ||||||
|  |         ptr++; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return closestSphere; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float RayMarch::GetClosestDistance() | ||||||
|  | { | ||||||
|  |     int i; | ||||||
|  |     Sphere *ptr = spheres; | ||||||
|  |     float closestDistance; | ||||||
|  |     float distance; | ||||||
|  |  | ||||||
|  |     if(!ptr) return 0.0; | ||||||
|  |     closestDistance = position.Distance((*ptr).position) - (*ptr).radius; | ||||||
|  |     for (i = 0; i < sphereSize; i++) | ||||||
|  |     { | ||||||
|  |         distance = position.Distance((*ptr).position) - (*ptr).radius; | ||||||
|  |         if(distance < closestDistance) | ||||||
|  |         { | ||||||
|  |             closestDistance = distance; | ||||||
|  |             closest = ptr; | ||||||
|  |         } | ||||||
|  |         ptr++; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return closestDistance; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int RayMarch::GetStepCount() { return stepCounter; } | ||||||
|  |  | ||||||
|  | sf::Color RayMarch::FireRay() | ||||||
|  | { | ||||||
|  |     float distance; | ||||||
|  |     stepCounter = 0; | ||||||
|  |  | ||||||
|  |     if(!spheres) return sf::Color::Black; | ||||||
|  |  | ||||||
|  |     for (stepCounter = 0; stepCounter < stepLimit; stepCounter++) | ||||||
|  |     { | ||||||
|  |         distance = GetClosestDistance(); | ||||||
|  |          | ||||||
|  |         if(distance <= minDistance) | ||||||
|  |             return closest -> color; | ||||||
|  |  | ||||||
|  |         if(distance >= maxDistance) | ||||||
|  |         { | ||||||
|  |             sf::Uint8 val = 256 * stepCounter / stepLimit; | ||||||
|  |             return sf::Color(val, val, val); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         position += direction * distance; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return sf::Color::Black; | ||||||
|  | } | ||||||
| @@ -7,6 +7,7 @@ class RenderWindow : public Window | |||||||
|         unsigned int pixelSize; |         unsigned int pixelSize; | ||||||
|         sf::Vertex *_CreateVertexBuffer(); |         sf::Vertex *_CreateVertexBuffer(); | ||||||
|         void ReloadScreenBuffer(); |         void ReloadScreenBuffer(); | ||||||
|  |         void Render(); | ||||||
|     public: |     public: | ||||||
|         RenderWindow(unsigned int = 960, unsigned int = 540, std::string = "Window", sf::Uint32 = sf::Style::Titlebar | sf::Style::Close); |         RenderWindow(unsigned int = 960, unsigned int = 540, std::string = "Window", sf::Uint32 = sf::Style::Titlebar | sf::Style::Close); | ||||||
|         ~RenderWindow(); |         ~RenderWindow(); | ||||||
| @@ -22,17 +23,55 @@ void RenderWindow::Update() | |||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     Window::Update(); |     Window::Update(); | ||||||
|  |     Render(); | ||||||
|  |  | ||||||
|     window.clear(); |     window.clear(); | ||||||
|     window.draw(vertices, size.x * size.y, sf::Points); |     window.draw(vertices, size.x * size.y, sf::Points); | ||||||
|     window.display(); |     window.display(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void RenderWindow::Render() | ||||||
|  | { | ||||||
|  |     int y; | ||||||
|  |     int x; | ||||||
|  |     sf::Vertex *ptr = vertices; | ||||||
|  |     Sphere spheres[9]; | ||||||
|  |     spheres[0].position = Vector3( 10, 0,  0); spheres[0].radius = 1.0; | ||||||
|  |     spheres[1].position = Vector3(-10, 0,  0); spheres[1].radius = 1.0; | ||||||
|  |     spheres[2].position = Vector3( 0, -10, 0); spheres[2].radius = 1.0; | ||||||
|  |     spheres[3].position = Vector3( 0,  10, 0); spheres[3].radius = 1.0; | ||||||
|  |     spheres[4].position = Vector3( 10, 10,  -10); spheres[4].radius = 1.0; | ||||||
|  |     spheres[5].position = Vector3(-10,-10,  -10); spheres[5].radius = 1.0; | ||||||
|  |     spheres[6].position = Vector3( 10, -10, -10); spheres[6].radius = 1.0; | ||||||
|  |     spheres[7].position = Vector3(-10,  10, -10); spheres[7].radius = 1.0; | ||||||
|  |     spheres[8].position = Vector3(0,  0, 10); spheres[8].radius = 5; | ||||||
|  |     RayMarch ray = RayMarch(); | ||||||
|  |     Vector3 cameraPos(0, 0, -timer.GetTimePassed() * 2); | ||||||
|  |     Vector3 rayDirection; | ||||||
|  |     ray.SetRay(cameraPos, rayDirection, spheres, 9, 100); | ||||||
|  |     rayDirection = (0, 0, 0); | ||||||
|  |     for (y = 0; y < size.y; y++) | ||||||
|  |         for (x = 0; x < size.x; x++) | ||||||
|  |         { | ||||||
|  |             // Change this | ||||||
|  |             rayDirection.x = (float)x - (float)size.x / 2.0; | ||||||
|  |             rayDirection.y = (float)y - (float)size.y / 2.0; | ||||||
|  |             rayDirection.z = 1000.0; | ||||||
|  |             rayDirection = rayDirection.Normalized(); | ||||||
|  |              | ||||||
|  |             ray.SetPosition(cameraPos, rayDirection); | ||||||
|  |  | ||||||
|  |             ptr -> color = ray.FireRay(); | ||||||
|  |             ptr++; | ||||||
|  |         } | ||||||
|  | } | ||||||
|  |  | ||||||
| sf::Vertex *RenderWindow::_CreateVertexBuffer() | sf::Vertex *RenderWindow::_CreateVertexBuffer() | ||||||
| { | { | ||||||
|     int y; |     int y; | ||||||
|     int x; |     int x; | ||||||
|     sf::Vertex *newBuffer = new sf::Vertex[size.x * size.y]; |     sf::Vertex *newVertices = new sf::Vertex[size.x * size.y]; | ||||||
|     sf::Vertex *ptr = newBuffer; |     sf::Vertex *ptr = newVertices; | ||||||
|  |  | ||||||
|     for (y = 0; y < size.y; y++) |     for (y = 0; y < size.y; y++) | ||||||
|         for (x = 0; x < size.x; x++) |         for (x = 0; x < size.x; x++) | ||||||
| @@ -41,7 +80,7 @@ sf::Vertex *RenderWindow::_CreateVertexBuffer() | |||||||
|             ptr++ -> position = sf::Vector2f(x, y);  |             ptr++ -> position = sf::Vector2f(x, y);  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     return newBuffer;     |     return newVertices;     | ||||||
| } | } | ||||||
|  |  | ||||||
| void RenderWindow::ReloadScreenBuffer() | void RenderWindow::ReloadScreenBuffer() | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ | |||||||
|     #include <cmath> |     #include <cmath> | ||||||
|     #include "Timer.hpp" |     #include "Timer.hpp" | ||||||
|     #include "Vectors.hpp" |     #include "Vectors.hpp" | ||||||
|  |     #include "Objects.hpp" | ||||||
|  |     #include "RayMarch.hpp" | ||||||
|     #include "Window.hpp" |     #include "Window.hpp" | ||||||
|     #include "Render.hpp" |     #include "Render.hpp" | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -48,9 +48,10 @@ | |||||||
|     Vector1 Vector1::Normalized() { return Vector1(x < 0.0 ? -1.0 : 1.0); } |     Vector1 Vector1::Normalized() { return Vector1(x < 0.0 ? -1.0 : 1.0); } | ||||||
| #pragma endregion | #pragma endregion | ||||||
| #pragma region Vector2 | #pragma region Vector2 | ||||||
|     class Vector2 : public Vector1 |     class Vector2 | ||||||
|     { |     { | ||||||
|         public: |         public: | ||||||
|  |             float x; | ||||||
|             float y; |             float y; | ||||||
|             Vector2(float = 0, float = 0); |             Vector2(float = 0, float = 0); | ||||||
|             Vector2 operator+(Vector2); |             Vector2 operator+(Vector2); | ||||||
| @@ -70,7 +71,7 @@ | |||||||
|             Vector2 Normalized(); |             Vector2 Normalized(); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     Vector2::Vector2(float x, float y) : Vector1(x) { this -> y = y; } |     Vector2::Vector2(float x, float y) { this -> x = x; this -> y = y; } | ||||||
|  |  | ||||||
|     Vector2 Vector2::operator+ (Vector2 parameter) { Vector2 vector = Vector2(x, y); vector.x += parameter.x; vector.y += parameter.y; return vector; } |     Vector2 Vector2::operator+ (Vector2 parameter) { Vector2 vector = Vector2(x, y); vector.x += parameter.x; vector.y += parameter.y; return vector; } | ||||||
|     Vector2 Vector2::operator- (Vector2 parameter) { Vector2 vector = Vector2(x, y); vector.x -= parameter.x; vector.y -= parameter.y; return vector; } |     Vector2 Vector2::operator- (Vector2 parameter) { Vector2 vector = Vector2(x, y); vector.x -= parameter.x; vector.y -= parameter.y; return vector; } | ||||||
| @@ -99,9 +100,11 @@ | |||||||
|     } |     } | ||||||
| #pragma endregion | #pragma endregion | ||||||
| #pragma region Vector3 | #pragma region Vector3 | ||||||
|     class Vector3 : public Vector2 |     class Vector3 | ||||||
|     { |     { | ||||||
|         public: |         public: | ||||||
|  |             float x; | ||||||
|  |             float y; | ||||||
|             float z; |             float z; | ||||||
|             Vector3(float = 0, float = 0, float = 0); |             Vector3(float = 0, float = 0, float = 0); | ||||||
|             Vector3 operator+(Vector3); |             Vector3 operator+(Vector3); | ||||||
| @@ -121,7 +124,7 @@ | |||||||
|             Vector3 Normalized(); |             Vector3 Normalized(); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     Vector3::Vector3(float x, float y, float z) : Vector2(x, y) { this -> z = z; } |     Vector3::Vector3(float x, float y, float z) { this -> x = x; this -> y = y; this -> z = z; } | ||||||
|  |  | ||||||
|     Vector3 Vector3::operator+ (Vector3 parameter) { Vector3 vector = Vector3(x, y, z); vector.x += parameter.x; vector.y += parameter.y; vector.z += parameter.z; return vector; } |     Vector3 Vector3::operator+ (Vector3 parameter) { Vector3 vector = Vector3(x, y, z); vector.x += parameter.x; vector.y += parameter.y; vector.z += parameter.z; return vector; } | ||||||
|     Vector3 Vector3::operator- (Vector3 parameter) { Vector3 vector = Vector3(x, y, z); vector.x -= parameter.x; vector.y -= parameter.y; vector.z -= parameter.z; return vector; } |     Vector3 Vector3::operator- (Vector3 parameter) { Vector3 vector = Vector3(x, y, z); vector.x -= parameter.x; vector.y -= parameter.y; vector.z -= parameter.z; return vector; } | ||||||
| @@ -140,7 +143,10 @@ | |||||||
|     float Vector3::Magnitude() { return sqrt(x*x+y*y+z*z); } |     float Vector3::Magnitude() { return sqrt(x*x+y*y+z*z); } | ||||||
|     float Vector3::Distance(Vector3 parameter)  |     float Vector3::Distance(Vector3 parameter)  | ||||||
|     {  |     {  | ||||||
|         Vector3 distanceVector = (*this) - parameter; |         Vector3 distanceVector; | ||||||
|  |         distanceVector.x = x - parameter.x; | ||||||
|  |         distanceVector.y = y - parameter.y; | ||||||
|  |         distanceVector.z = z - parameter.z; | ||||||
|         return distanceVector.Magnitude();  |         return distanceVector.Magnitude();  | ||||||
|     } |     } | ||||||
|     Vector3 Vector3::Normalized()  |     Vector3 Vector3::Normalized()  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user