Adding support for pattern.
Still a bit more work to be done there.
This commit is contained in:
30
source/include/gradientpattern.h
Normal file
30
source/include/gradientpattern.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* DoRayMe - a quick and dirty Raytracer
|
||||
* Gradient Pattern header
|
||||
*
|
||||
* Created by Manoël Trapier
|
||||
* Copyright (c) 2020 986-Studio.
|
||||
*
|
||||
*/
|
||||
#ifndef DORAYME_GRADIENTPATTERN_H
|
||||
#define DORAYME_GRADIENTPATTERN_H
|
||||
|
||||
#include <pattern.h>
|
||||
|
||||
class GradientPattern : public Pattern
|
||||
{
|
||||
public:
|
||||
GradientPattern(Colour a, Colour b) : Pattern(a, b) { };
|
||||
|
||||
Colour patternAt(Tuple point)
|
||||
{
|
||||
Tuple distance = this->b - this->a;
|
||||
double fraction = point.x - floor(point.x);
|
||||
|
||||
Tuple ret = this->a + distance * fraction;
|
||||
|
||||
return Colour(ret.x, ret.y, ret.z);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //DORAYME_GRADIENTPATTERN_H
|
||||
@@ -11,8 +11,11 @@
|
||||
|
||||
#include <tuple.h>
|
||||
#include <colour.h>
|
||||
#include <pattern.h>
|
||||
#include <light.h>
|
||||
|
||||
class Shape;
|
||||
|
||||
class Material
|
||||
{
|
||||
public:
|
||||
@@ -22,10 +25,12 @@ public:
|
||||
double specular;
|
||||
double shininess;
|
||||
|
||||
public:
|
||||
Material() : colour(Colour(1, 1, 1)), ambient(0.1), diffuse(0.9), specular(0.9), shininess(200) {};
|
||||
Pattern *pattern;
|
||||
|
||||
Colour lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, bool inShadow = false);
|
||||
public:
|
||||
Material() : colour(Colour(1, 1, 1)), ambient(0.1), diffuse(0.9), specular(0.9), shininess(200), pattern(nullptr) {};
|
||||
|
||||
Colour lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, Shape *hitObject, bool inShadow = false);
|
||||
|
||||
bool operator==(const Material &b) const { return double_equal(this->ambient, b.ambient) &&
|
||||
double_equal(this->diffuse, b.diffuse) &&
|
||||
|
||||
36
source/include/pattern.h
Normal file
36
source/include/pattern.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* DoRayMe - a quick and dirty Raytracer
|
||||
* Pattern header
|
||||
*
|
||||
* Created by Manoël Trapier
|
||||
* Copyright (c) 2020 986-Studio.
|
||||
*
|
||||
*/
|
||||
#ifndef DORAYME_PATTERN_H
|
||||
#define DORAYME_PATTERN_H
|
||||
|
||||
#include <colour.h>
|
||||
#include <tuple.h>
|
||||
#include <matrix.h>
|
||||
|
||||
class Shape;
|
||||
|
||||
class Pattern
|
||||
{
|
||||
public:
|
||||
Colour a;
|
||||
Colour b;
|
||||
|
||||
Matrix transformMatrix;
|
||||
Matrix inverseTransform;
|
||||
|
||||
public:
|
||||
Pattern(Colour a, Colour b);
|
||||
|
||||
virtual Colour patternAt(Tuple point) = 0;
|
||||
|
||||
void setTransform(Matrix transform);
|
||||
Colour patternAtObject(Shape *object, Tuple point);
|
||||
};
|
||||
|
||||
#endif /* DORAYME_PATTERN_H */
|
||||
31
source/include/ringpattern.h
Normal file
31
source/include/ringpattern.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* DoRayMe - a quick and dirty Raytracer
|
||||
* Ring Pattern header
|
||||
*
|
||||
* Created by Manoël Trapier
|
||||
* Copyright (c) 2020 986-Studio.
|
||||
*
|
||||
*/
|
||||
#ifndef DORAYME_RINGSUPPORT_H
|
||||
#define DORAYME_RINGSUPPORT_H
|
||||
|
||||
#include <pattern.h>
|
||||
|
||||
class RingPattern : public Pattern
|
||||
{
|
||||
public:
|
||||
RingPattern(Colour a, Colour b) : Pattern(a, b) { };
|
||||
|
||||
Colour patternAt(Tuple point)
|
||||
{
|
||||
Tuple distance = this->b - this->a;
|
||||
double fraction = point.x - floor(point.x);
|
||||
|
||||
Tuple ret = this->a + distance * fraction;
|
||||
|
||||
return Colour(ret.x, ret.y, ret.z);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif //DORAYME_RINGSUPPORT_H
|
||||
32
source/include/strippattern.h
Normal file
32
source/include/strippattern.h
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* DoRayMe - a quick and dirty Raytracer
|
||||
* Strip Pattern header
|
||||
*
|
||||
* Created by Manoël Trapier
|
||||
* Copyright (c) 2020 986-Studio.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DORAYME_STRIPPATTERN_H
|
||||
#define DORAYME_STRIPPATTERN_H
|
||||
|
||||
#include <pattern.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
class StripPattern : public Pattern
|
||||
{
|
||||
public:
|
||||
StripPattern(Colour a, Colour b) : Pattern(a, b) { };
|
||||
|
||||
Colour patternAt(Tuple point)
|
||||
{
|
||||
if (fmod(floor(point.x), 2) == 0)
|
||||
{
|
||||
return this->a;
|
||||
}
|
||||
return this->b;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* DORAYME_STRIPPATTERN_H */
|
||||
27
source/include/testpattern.h
Normal file
27
source/include/testpattern.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* DoRayMe - a quick and dirty Raytracer
|
||||
* Strip Pattern header
|
||||
*
|
||||
* Created by Manoël Trapier
|
||||
* Copyright (c) 2020 986-Studio.
|
||||
*
|
||||
*/
|
||||
#ifndef DORAYME_TESTPATTERN_H
|
||||
#define DORAYME_TESTPATTERN_H
|
||||
|
||||
#include <pattern.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
class TestPattern : public Pattern
|
||||
{
|
||||
public:
|
||||
TestPattern() : Pattern(Colour(0, 0, 0), Colour(1, 1, 1)) { };
|
||||
|
||||
Colour patternAt(Tuple point)
|
||||
{
|
||||
return Colour(point.x, point.y, point.z);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //DORAYME_TESTPATTERN_H
|
||||
31
source/pattern.cpp
Normal file
31
source/pattern.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* DoRayMe - a quick and dirty Raytracer
|
||||
* Pattern implementation
|
||||
*
|
||||
* Created by Manoël Trapier
|
||||
* Copyright (c) 2020 986-Studio.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <pattern.h>
|
||||
#include <shape.h>
|
||||
|
||||
Pattern::Pattern(Colour a, Colour b): a(a), b(b)
|
||||
{
|
||||
this->transformMatrix = Matrix4().identity();
|
||||
this->inverseTransform = this->transformMatrix.inverse();
|
||||
};
|
||||
|
||||
Colour Pattern::patternAtObject(Shape *object, Tuple worldPoint)
|
||||
{
|
||||
Tuple objectPoint = object->inverseTransform * worldPoint;
|
||||
Tuple patternPoint = this->inverseTransform * objectPoint;
|
||||
|
||||
return this->patternAt(patternPoint);
|
||||
}
|
||||
|
||||
void Pattern::setTransform(Matrix transform)
|
||||
{
|
||||
this->transformMatrix = transform;
|
||||
this->inverseTransform = transform.inverse();
|
||||
}
|
||||
@@ -9,13 +9,21 @@
|
||||
#include <tuple.h>
|
||||
#include <material.h>
|
||||
#include <colour.h>
|
||||
#include <shape.h>
|
||||
|
||||
Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, bool inShadow)
|
||||
Colour Material::lighting(Light light, Tuple point, Tuple eyeVector, Tuple normalVector, Shape *hitObject, bool inShadow)
|
||||
{
|
||||
Colour pointColor = this->colour;
|
||||
|
||||
if (this->pattern != nullptr)
|
||||
{
|
||||
pointColor = this->pattern->patternAtObject(hitObject, point);
|
||||
}
|
||||
|
||||
Tuple lightVector = (light.position - point).normalise();
|
||||
Tuple reflectVector = Tuple(0, 0, 0, 0);
|
||||
|
||||
Tuple effectiveColour = this->colour * light.intensity;
|
||||
Tuple effectiveColour = pointColor * light.intensity;
|
||||
Tuple ambientColour = Colour(0, 0, 0);
|
||||
Tuple diffuseColour = Colour(0, 0, 0);
|
||||
Tuple specularColour = Colour(0, 0, 0);
|
||||
|
||||
@@ -99,7 +99,7 @@ Tuple World::shadeHit(Computation comps)
|
||||
bool isThereAnObstacle = this->isShadowed(comps.overHitPoint);
|
||||
|
||||
return comps.object->material.lighting(*this->lightList[0], comps.overHitPoint, comps.eyeVector,
|
||||
comps.normalVector, isThereAnObstacle);
|
||||
comps.normalVector, comps.object, isThereAnObstacle);
|
||||
}
|
||||
|
||||
Tuple World::colourAt(Ray r)
|
||||
|
||||
Reference in New Issue
Block a user