00001 /*************************************************************************** 00002 * Copyright (C) 1998-2009 by authors (see AUTHORS.txt ) * 00003 * * 00004 * This file is part of LuxRender. * 00005 * * 00006 * Lux Renderer is free software; you can redistribute it and/or modelse ify * 00007 * it under the terms of the GNU General Public License as published by * 00008 * the Free Software Foundation; either version 3 of the License, or * 00009 * (at your option) any later version. * 00010 * * 00011 * Lux Renderer is distributed in the hope that it will be useful, * 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00014 * GNU General Public License for more details. * 00015 * * 00016 * You should have received a copy of the GNU General Public License * 00017 * along with this program. else if not, see <http://www.gnu.org/licenses/>. * 00018 * * 00019 * This project is based on PBRT ; see http://www.pbrt.org * 00020 * Lux Renderer website : http://www.luxrender.net * 00021 ***************************************************************************/ 00022 00023 // lampspectrum.cpp* 00024 #include "lampspectrum.h" 00025 #include "irregulardata.h" 00026 #include "equalenergy.h" 00027 #include "blackbody.h" 00028 #include "error.h" 00029 #include "dynload.h" 00030 00031 #include "data/lamp_spect.h" 00032 00033 using namespace lux; 00034 00035 // LampSpectrumTexture Method Definitions 00036 Texture<float> * LampSpectrumTexture::CreateFloatTexture(const Transform &tex2world, 00037 const TextureParams &tp) { 00038 return new IrregularDataFloatTexture<float>(1.f); 00039 } 00040 00041 Texture<SWCSpectrum> * LampSpectrumTexture::CreateSWCSpectrumTexture(const Transform &tex2world, 00042 const TextureParams &tp) { 00043 std::string name = tp.FindString("name"); 00044 const int wlcount = 250; 00045 00046 float *wl; 00047 float *data; 00048 00049 if(name == "Alcohol") { 00050 wl = lampspectrum_Alcohol_WL; 00051 data = lampspectrum_Alcohol_AP; 00052 } 00053 else if(name == "AntiInsect") { 00054 wl = lampspectrum_AntiInsect_WL; 00055 data = lampspectrum_AntiInsect_AP; 00056 } 00057 else if(name == "Ar") { 00058 wl = lampspectrum_Ar_WL; 00059 data = lampspectrum_Ar_AP; 00060 } 00061 else if(name == "BLAU") { 00062 wl = lampspectrum_BLAU_WL; 00063 data = lampspectrum_BLAU_AP; 00064 } 00065 else if(name == "BLNG") { 00066 wl = lampspectrum_BLNG_WL; 00067 data = lampspectrum_BLNG_AP; 00068 } 00069 else if(name == "BLP") { 00070 wl = lampspectrum_BLP_WL; 00071 data = lampspectrum_BLP_AP; 00072 } 00073 else if(name == "Butane") { 00074 wl = lampspectrum_Butane_WL; 00075 data = lampspectrum_Butane_AP; 00076 } 00077 else if(name == "Candle") { 00078 //wl = lampspectrum_Candle_WL; 00079 //data = lampspectrum_Candle_AP; 00080 // Override with blackbody for incandescent sources due to poor calibration 00081 return new BlackBodySpectrumTexture<SWCSpectrum>(1020.f); 00082 } 00083 else if(name == "CarbonArc") { 00084 wl = lampspectrum_CarbonArc_WL; 00085 data = lampspectrum_CarbonArc_AP; 00086 } 00087 else if(name == "Cd") { 00088 wl = lampspectrum_Cd_WL; 00089 data = lampspectrum_Cd_AP; 00090 } 00091 else if(name == "CFL27K") { 00092 wl = lampspectrum_CFL27K_WL; 00093 data = lampspectrum_CFL27K_AP; 00094 } 00095 else if(name == "CFL4K") { 00096 wl = lampspectrum_CFL4K_WL; 00097 data = lampspectrum_CFL4K_AP; 00098 } 00099 else if(name == "CFL6K") { 00100 wl = lampspectrum_CFL6K_WL; 00101 data = lampspectrum_CFL6K_AP; 00102 } 00103 else if(name == "CL42053") { 00104 wl = lampspectrum_CL42053_WL; 00105 data = lampspectrum_CL42053_AP; 00106 } 00107 else if(name == "CobaltGlass") { 00108 wl = lampspectrum_CobaltGlass_WL; 00109 data = lampspectrum_CobaltGlass_AP; 00110 } 00111 else if(name == "Daylight") { 00112 wl = lampspectrum_Daylight_WL; 00113 data = lampspectrum_Daylight_AP; 00114 } 00115 else if(name == "FeCo") { 00116 wl = lampspectrum_FeCo_WL; 00117 data = lampspectrum_FeCo_AP; 00118 } 00119 else if(name == "FL37K") { 00120 wl = lampspectrum_FL37K_WL; 00121 data = lampspectrum_FL37K_AP; 00122 } 00123 else if(name == "FLAV17K") { 00124 wl = lampspectrum_FLAV17K_WL; 00125 data = lampspectrum_FLAV17K_AP; 00126 } 00127 else if(name == "FLAV8K") { 00128 wl = lampspectrum_FLAV8K_WL; 00129 data = lampspectrum_FLAV8K_AP; 00130 } 00131 else if(name == "FLBL") { 00132 wl = lampspectrum_FLBL_WL; 00133 data = lampspectrum_FLBL_AP; 00134 } 00135 else if(name == "FLBLB") { 00136 wl = lampspectrum_FLBLB_WL; 00137 data = lampspectrum_FLBLB_AP; 00138 } 00139 else if(name == "FLD2") { 00140 wl = lampspectrum_FLD2_WL; 00141 data = lampspectrum_FLD2_AP; 00142 } 00143 else if(name == "GaPb") { 00144 wl = lampspectrum_GaPb_WL; 00145 data = lampspectrum_GaPb_AP; 00146 } 00147 else if(name == "GreenLaser") { 00148 wl = lampspectrum_GreenLaser_WL; 00149 data = lampspectrum_GreenLaser_AP; 00150 } 00151 else if(name == "GroLux") { 00152 wl = lampspectrum_GroLux_WL; 00153 data = lampspectrum_GroLux_AP; 00154 } 00155 else if(name == "GRUN") { 00156 wl = lampspectrum_GRUN_WL; 00157 data = lampspectrum_GRUN_AP; 00158 } 00159 else if(name == "HPM2") { 00160 wl = lampspectrum_HPM2_WL; 00161 data = lampspectrum_HPM2_AP; 00162 } 00163 else if(name == "HPMFL1") { 00164 wl = lampspectrum_HPMFL1_WL; 00165 data = lampspectrum_HPMFL1_AP; 00166 } 00167 else if(name == "HPMFL2") { 00168 wl = lampspectrum_HPMFL2_WL; 00169 data = lampspectrum_HPMFL2_AP; 00170 } 00171 else if(name == "HPMFL2Glow") { 00172 wl = lampspectrum_HPMFL2Glow_WL; 00173 data = lampspectrum_HPMFL2Glow_AP; 00174 } 00175 else if(name == "HPMFLCL42053") { 00176 wl = lampspectrum_HPMFLCL42053_WL; 00177 data = lampspectrum_HPMFLCL42053_AP; 00178 } 00179 else if(name == "HPMFLCobaltGlass") { 00180 wl = lampspectrum_HPMFLCobaltGlass_WL; 00181 data = lampspectrum_HPMFLCobaltGlass_AP; 00182 } 00183 else if(name == "HPMFLRedGlass") { 00184 wl = lampspectrum_HPMFLRedGlass_WL; 00185 data = lampspectrum_HPMFLRedGlass_AP; 00186 } 00187 else if(name == "HPMSB") { 00188 wl = lampspectrum_HPMSB_WL; 00189 data = lampspectrum_HPMSB_AP; 00190 } 00191 else if(name == "HPMSBFL") { 00192 wl = lampspectrum_HPMSBFL_WL; 00193 data = lampspectrum_HPMSBFL_AP; 00194 } 00195 else if(name == "HPS") { 00196 wl = lampspectrum_HPS_WL; 00197 data = lampspectrum_HPS_AP; 00198 } 00199 else if(name == "HPX") { 00200 wl = lampspectrum_HPX_WL; 00201 data = lampspectrum_HPX_AP; 00202 } 00203 else if(name == "Incandescent1") { 00204 //wl = lampspectrum_Incandescent1_WL; 00205 //data = lampspectrum_Incandescent1_AP; 00206 // Override with blackbody for incandescent sources due to poor calibration 00207 return new BlackBodySpectrumTexture<SWCSpectrum>(2750.f); 00208 } 00209 else if(name == "LCDS") { 00210 wl = lampspectrum_LCDS_WL; 00211 data = lampspectrum_LCDS_AP; 00212 } 00213 else if(name == "LEDB") { 00214 wl = lampspectrum_LEDB_WL; 00215 data = lampspectrum_LEDB_AP; 00216 } 00217 else if(name == "LPM2") { 00218 wl = lampspectrum_LPM2_WL; 00219 data = lampspectrum_LPM2_AP; 00220 } 00221 else if(name == "LPS") { 00222 wl = lampspectrum_LPS_WL; 00223 data = lampspectrum_LPS_AP; 00224 } 00225 else if(name == "MHD") { 00226 wl = lampspectrum_MHD_WL; 00227 data = lampspectrum_MHD_AP; 00228 } 00229 else if(name == "MHN") { 00230 wl = lampspectrum_MHN_WL; 00231 data = lampspectrum_MHN_AP; 00232 } 00233 else if(name == "MHSc") { 00234 wl = lampspectrum_MHSc_WL; 00235 data = lampspectrum_MHSc_AP; 00236 } 00237 else if(name == "MHWWD") { 00238 wl = lampspectrum_MHWWD_WL; 00239 data = lampspectrum_MHWWD_AP; 00240 } 00241 else if(name == "MPS") { 00242 wl = lampspectrum_MPS_WL; 00243 data = lampspectrum_MPS_AP; 00244 } 00245 else if(name == "Ne") { 00246 wl = lampspectrum_Ne_WL; 00247 data = lampspectrum_Ne_AP; 00248 } 00249 else if(name == "NeKrFL") { 00250 wl = lampspectrum_NeKrFL_WL; 00251 data = lampspectrum_NeKrFL_AP; 00252 } 00253 else if(name == "NeXeFL1") { 00254 wl = lampspectrum_NeXeFL1_WL; 00255 data = lampspectrum_NeXeFL1_AP; 00256 } 00257 else if(name == "NeXeFL2") { 00258 wl = lampspectrum_NeXeFL2_WL; 00259 data = lampspectrum_NeXeFL2_AP; 00260 } 00261 else if(name == "OliveOil") { 00262 wl = lampspectrum_OliveOil_WL; 00263 data = lampspectrum_OliveOil_AP; 00264 } 00265 else if(name == "PLANTA") { 00266 wl = lampspectrum_PLANTA_WL; 00267 data = lampspectrum_PLANTA_AP; 00268 } 00269 else if(name == "Rb") { 00270 wl = lampspectrum_Rb_WL; 00271 data = lampspectrum_Rb_AP; 00272 } 00273 else if(name == "RedGlass") { 00274 wl = lampspectrum_RedGlass_WL; 00275 data = lampspectrum_RedGlass_AP; 00276 } 00277 else if(name == "RedLaser") { 00278 wl = lampspectrum_RedLaser_WL; 00279 data = lampspectrum_RedLaser_AP; 00280 } 00281 else if(name == "SHPS") { 00282 wl = lampspectrum_SHPS_WL; 00283 data = lampspectrum_SHPS_AP; 00284 } 00285 else if(name == "SS1") { 00286 wl = lampspectrum_SS1_WL; 00287 data = lampspectrum_SS1_AP; 00288 } 00289 else if(name == "SS2") { 00290 wl = lampspectrum_SS2_WL; 00291 data = lampspectrum_SS2_AP; 00292 } 00293 else if(name == "TV") { 00294 wl = lampspectrum_TV_WL; 00295 data = lampspectrum_TV_AP; 00296 } 00297 else if(name == "UVA") { 00298 wl = lampspectrum_UVA_WL; 00299 data = lampspectrum_UVA_AP; 00300 } 00301 else if(name == "Welsbach") { 00302 wl = lampspectrum_Welsbach_WL; 00303 data = lampspectrum_Welsbach_AP; 00304 } 00305 else if(name == "Xe") { 00306 wl = lampspectrum_Xe_WL; 00307 data = lampspectrum_Xe_AP; 00308 } 00309 else if(name == "XeI") { 00310 wl = lampspectrum_XeI_WL; 00311 data = lampspectrum_XeI_AP; 00312 } 00313 else if(name == "Zn") { 00314 wl = lampspectrum_Zn_WL; 00315 data = lampspectrum_Zn_AP; 00316 } 00317 else { // if(name == "Incandescent2") { 00318 // NOTE - lordcrc - use Incandecent2 as default to match luxblend default 00319 //wl = lampspectrum_Incandescent2_WL; 00320 //data = lampspectrum_Incandescent2_AP; 00321 // Override with blackbody for incandescent sources due to poor calibration 00322 return new BlackBodySpectrumTexture<SWCSpectrum>(2900.f); 00323 } 00324 return new IrregularDataSpectrumTexture<SWCSpectrum>(wlcount, wl, data, 0.1); 00325 } 00326 00327 static DynamicLoader::RegisterFloatTexture<LampSpectrumTexture> r1("lampspectrum"); 00328 static DynamicLoader::RegisterSWCSpectrumTexture<LampSpectrumTexture> r2("lampspectrum");