-
Notifications
You must be signed in to change notification settings - Fork 39
/
Copy pathuv.cpp
79 lines (71 loc) · 2.57 KB
/
uv.cpp
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
/*
pbrt source code Copyright(c) 1998-2010 Matt Pharr and Greg Humphreys.
This file is part of pbrt.
pbrt is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. Note that the text contents of
the book "Physically Based Rendering" are *not* licensed under the
GNU GPL.
pbrt is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// uv.cpp*
#include "pbrt.h"
#include "texture.h"
#include "paramset.h"
// UVTexture Declarations
class UVTexture : public Texture<Spectrum> {
public:
// UVTexture Public Methods
UVTexture(TextureMapping2D *m) {
mapping = m;
}
~UVTexture() {
delete mapping;
}
Spectrum Evaluate(const DifferentialGeometry &dg) const {
float s, t, dsdx, dtdx, dsdy, dtdy;
mapping->Map(dg, &s, &t, &dsdx, &dtdx, &dsdy, &dtdy);
float cs[COLOR_SAMPLES];
memset(cs, 0, COLOR_SAMPLES * sizeof(float));
cs[0] = s - Floor2Int(s);
cs[1] = t - Floor2Int(t);
return Spectrum(cs);
}
private:
TextureMapping2D *mapping;
};
// UVTexture Method Definitions
extern "C" DLLEXPORT Texture<float> * CreateFloatTexture(const Transform &tex2world,
const TextureParams &tp) {
return NULL;
}
extern "C" DLLEXPORT Texture<Spectrum> * CreateSpectrumTexture(const Transform &tex2world,
const TextureParams &tp) {
// Initialize 2D texture mapping _map_ from _tp_
TextureMapping2D *map = NULL;
string type = tp.FindString("mapping");
if (type == "" || type == "uv") {
float su = tp.FindFloat("uscale", 1.);
float sv = tp.FindFloat("vscale", 1.);
float du = tp.FindFloat("udelta", 0.);
float dv = tp.FindFloat("vdelta", 0.);
map = new UVMapping2D(su, sv, du, dv);
}
else if (type == "spherical") map = new SphericalMapping2D(tex2world.GetInverse());
else if (type == "cylindrical") map = new CylindricalMapping2D(tex2world.GetInverse());
else if (type == "planar")
map = new PlanarMapping2D(tp.FindVector("v1", Vector(1,0,0)),
tp.FindVector("v2", Vector(0,1,0)),
tp.FindFloat("udelta", 0.f), tp.FindFloat("vdelta", 0.f));
else {
Error("2D texture mapping \"%s\" unknown", type.c_str());
map = new UVMapping2D;
}
return new UVTexture(map);
}