-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtexture.hpp
111 lines (90 loc) · 2.74 KB
/
texture.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#ifndef TEXTURE_H
#define TEXTURE_H
#include "base.hpp"
#include "perlin.hpp"
namespace rtc
{
class Texture
{
public:
virtual ~Texture() = default;
// Retrieve color as a function of 1) u-v coordinates in the [0, 1] range and 2) a point.
virtual rgb ValueAt(double u, double v, const point &p) const = 0;
};
class SolidColor : public Texture
{
public:
SolidColor() = default;
SolidColor(const rgb &c);
SolidColor(double r, double g, double b);
// Returns the same thing every time, it's just the color stored in here.
virtual rgb ValueAt(double u, double v, const point &p) const override;
public:
rgb c_;
};
// Takes two other textures and tiles them in 3D space.
class Checkers : public Texture
{
public:
Checkers() = default;
Checkers(std::shared_ptr<Texture> a, std::shared_ptr<Texture> b);
Checkers(const rgb &a, const rgb &b);
virtual rgb ValueAt(double u, double v, const point &p) const override;
public:
std::shared_ptr<Texture> a_;
std::shared_ptr<Texture> b_;
};
// Just perlin noise.
class Noisy : public Texture
{
public:
// Use perlin noise with a scaling factor. A larger factor produces "tighter" patterns. Defaults to 1.
Noisy(double scale = 1.0);
Noisy(const rgb &c, double scale = 1.0);
virtual ~Noisy() = default;
// Produces some color as a function the point's coordinates and the perlin noise at that point.
virtual rgb ValueAt(double u, double v, const point &p) const override;
public:
double scale_ = 1.0; // larger for "tighter" patterns
Perlin noise_;
rgb c_ = rgb(1.0, 1.0, 1.0); // black by default
};
class Turbulence : public Noisy
{
public:
Turbulence(double scale = 1.0);
Turbulence(const rgb &c, double scale = 1.0);
virtual rgb ValueAt(double u, double v, const point &p) const override;
};
class Marble : public Noisy
{
public:
// Choose an axis for the marble's bands to lie on.
Marble(Axis ax, double scale = 1.0);
Marble(Axis ax, const rgb &c, double scale = 1.0);
virtual rgb ValueAt(double u, double v, const point &p) const override;
public:
Axis ax_;
};
class Wood : public Noisy
{
public:
// create a wooden texture, where larger scale and f cause tighter "rings"
Wood(double scale = 1.0, double f = 8.0);
Wood(const rgb &c, double scale = 1.0, double f = 8.0);
virtual rgb ValueAt(double u, double v, const point &p) const override;
public:
double f_;
};
class ImageTexture : public Texture
{
public:
ImageTexture(const char *filename);
ImageTexture(const unsigned char *filedata, int size);
~ImageTexture();
virtual rgb ValueAt(double u, double v, const point &p) const override;
public:
SDL_Surface *buf_ = nullptr;
};
} // namespace rtc
#endif