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