00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "pbrt.h"
00026 #include "texture.h"
00027 #include "paramset.h"
00028
00029 template <class T>
00030 class BilerpTexture : public Texture<T> {
00031 public:
00032
00033 BilerpTexture(TextureMapping2D *m,
00034 const T &t00, const T &t01,
00035 const T &t10, const T &t11) {
00036 mapping = m;
00037 v00 = t00;
00038 v01 = t01;
00039 v10 = t10;
00040 v11 = t11;
00041 }
00042 ~BilerpTexture() {
00043 delete mapping;
00044 }
00045 T Evaluate(const DifferentialGeometry &dg) const {
00046 float s, t, dsdx, dtdx, dsdy, dtdy;
00047 mapping->Map(dg, &s, &t, &dsdx, &dtdx, &dsdy, &dtdy);
00048 return (1-s)*(1-t) * v00 +
00049 (1-s)*( t) * v01 +
00050 ( s)*(1-t) * v10 +
00051 ( s)*( t) * v11;
00052 }
00053 private:
00054
00055 TextureMapping2D *mapping;
00056 T v00, v01, v10, v11;
00057 };
00058
00059 extern "C" DLLEXPORT Texture<float> * CreateFloatTexture(const Transform &tex2world,
00060 const TextureParams &tp) {
00061
00062 TextureMapping2D *map = NULL;
00063 string type = tp.FindString("mapping");
00064 if (type == "" || type == "uv") {
00065 float su = tp.FindFloat("uscale", 1.);
00066 float sv = tp.FindFloat("vscale", 1.);
00067 float du = tp.FindFloat("udelta", 0.);
00068 float dv = tp.FindFloat("vdelta", 0.);
00069 map = new UVMapping2D(su, sv, du, dv);
00070 }
00071 else if (type == "spherical") map = new SphericalMapping2D(tex2world.GetInverse());
00072 else if (type == "cylindrical") map = new CylindricalMapping2D(tex2world.GetInverse());
00073 else if (type == "planar")
00074 map = new PlanarMapping2D(tp.FindVector("v1", Vector(1,0,0)),
00075 tp.FindVector("v2", Vector(0,1,0)),
00076 tp.FindFloat("udelta", 0.f), tp.FindFloat("vdelta", 0.f));
00077 else {
00078 Error("2D texture mapping \"%s\" unknown", type.c_str());
00079 map = new UVMapping2D;
00080 }
00081 return new BilerpTexture<float>(map,
00082 tp.FindFloat("v00", 0.f), tp.FindFloat("v01", 1.f),
00083 tp.FindFloat("v10", 0.f), tp.FindFloat("v11", 1.f));
00084 }
00085
00086 extern "C" DLLEXPORT Texture<Spectrum> * CreateSpectrumTexture(const Transform &tex2world,
00087 const TextureParams &tp) {
00088
00089 TextureMapping2D *map = NULL;
00090 string type = tp.FindString("mapping");
00091 if (type == "" || type == "uv") {
00092 float su = tp.FindFloat("uscale", 1.);
00093 float sv = tp.FindFloat("vscale", 1.);
00094 float du = tp.FindFloat("udelta", 0.);
00095 float dv = tp.FindFloat("vdelta", 0.);
00096 map = new UVMapping2D(su, sv, du, dv);
00097 }
00098 else if (type == "spherical") map = new SphericalMapping2D(tex2world.GetInverse());
00099 else if (type == "cylindrical") map = new CylindricalMapping2D(tex2world.GetInverse());
00100 else if (type == "planar")
00101 map = new PlanarMapping2D(tp.FindVector("v1", Vector(1,0,0)),
00102 tp.FindVector("v2", Vector(0,1,0)),
00103 tp.FindFloat("udelta", 0.f), tp.FindFloat("vdelta", 0.f));
00104 else {
00105 Error("2D texture mapping \"%s\" unknown", type.c_str());
00106 map = new UVMapping2D;
00107 }
00108 return new BilerpTexture<Spectrum>(map,
00109 tp.FindSpectrum("v00", 0.f), tp.FindSpectrum("v01", 1.f),
00110 tp.FindSpectrum("v10", 0.f), tp.FindSpectrum("v11", 1.f));
00111 }