First Working Render & Vector Class Modifications
Good News: It works! Bad News: 0.2 FPS
This commit is contained in:
parent
4af9ae0765
commit
99305779d5
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue