Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //SPHERE.H
- #ifndef SPHERE_H
- #define SPHERE_H
- class RenderObject;
- class Sphere : public RenderObject
- {
- private:
- public:
- Sphere(Renderer& newRenderer);
- Sphere(Renderer& newRenderer, Material& newMaterial);
- int testRay(const sf::Vector3f& origin, const sf::Vector3f& direction, sf::Vector3f& hitPosition, sf::Vector2f& UVCoordinates);
- const sf::Vector3f& getNormal(const sf::Vector3f& point);
- const sf::Vector3f& getNormal();
- };
- #endif //SPHERE_H
- //SPHERE.CPP
- #include <SFML\Graphics.hpp>
- #include <math.h>
- #include <C:\Users\Laurin\Documents\Visual Studio 2012\Projects\Raytracing\Raytracing\renderer.h>
- #include <C:\Users\Laurin\Documents\Visual Studio 2012\Projects\Raytracing\Raytracing\renderObject.h>
- #include <C:\Users\Laurin\Documents\Visual Studio 2012\Projects\Raytracing\Raytracing\util.h>
- #include <C:\Users\Laurin\Documents\Visual Studio 2012\Projects\Raytracing\Raytracing\sphere.h>
- Sphere::Sphere(Renderer& newRenderer)
- :RenderObject(newRenderer)
- {
- renderer.addRenderObject(this);
- }
- Sphere::Sphere(Renderer& newRenderer, Material& newMaterial)
- :RenderObject(newRenderer, newMaterial)
- {
- renderer.addRenderObject(this);
- }
- int Sphere::testRay(const sf::Vector3f& origin, const sf::Vector3f& direction, sf::Vector3f& hitPosition, sf::Vector2f& UVCoordinates)
- {
- float factor = -dot((origin-transform.position), direction);
- sf::Vector3f x = origin + factor * direction;
- float xLength = length(x-transform.position);
- float distance = sqrt((transform.scale.x/2 * transform.scale.x/2) - (xLength * xLength));
- if(factor > distance)
- {
- hitPosition = origin + (factor - distance) * direction;
- sf::Vector2f UVs(0.0f, 0.0f);
- if(material.texture)
- {
- sf::Vector3f yAxis(0.0f, 1.0f, 0.0f);
- sf::Vector3f zAxis(0.0f, 0.0f, -1.0f);
- sf::Vector3f normal = getNormal(hitPosition);
- float phi = acos( -dot( yAxis, normal ));
- UVs.y = phi / 3.14f;
- float theta = (acos( dot( normal, zAxis) / sin( phi ))) / ( 2 * 3.14f);
- if ( dot(cross( yAxis, zAxis), normal ) > 0 )
- {
- UVs.x = theta;
- }
- else
- {
- UVs.x = 1 - theta;
- }
- }
- UVCoordinates = UVs;
- return 1;
- }
- else if(factor + distance > 0)
- {
- hitPosition = origin + (factor + distance) * direction;
- return -1;
- }
- else
- {
- return 0;
- }
- }
- const sf::Vector3f& Sphere::getNormal(const sf::Vector3f& point)
- {
- sf::Vector3f normal = point-transform.position;
- return normalize(normal);
- }
- const sf::Vector3f& Sphere::getNormal()
- {
- return sf::Vector3f(0.0f, 0.0f, 0.0f);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement