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 "lux.h"
00026 #include "dynload.h"
00027 #include "paramset.h"
00028 #include "error.h"
00029 #include "shape.h"
00030 #include "material.h"
00031
00032 namespace lux {
00033
00034 static void LoadError(const string &type, const string &name)
00035 {
00036 std::stringstream ss;
00037 ss << "Static loading of " << type << " '" << name << "' failed.";
00038 luxError(LUX_BUG, LUX_ERROR, ss.str().c_str());
00039
00040 }
00041
00042 boost::shared_ptr<Shape> MakeShape(const string &name,
00043 const Transform &object2world, bool reverseOrientation,
00044 const ParamSet ¶mSet)
00045 {
00046 if (DynamicLoader::registeredShapes().find(name) !=
00047 DynamicLoader::registeredShapes().end()) {
00048 boost::shared_ptr<Shape> ret(DynamicLoader::registeredShapes()[name](object2world, reverseOrientation, paramSet));
00049 paramSet.ReportUnused();
00050 return ret;
00051 }
00052
00053 LoadError("shape", name);
00054 return boost::shared_ptr<Shape>();
00055 }
00056
00057 boost::shared_ptr<Material> MakeMaterial(const string &name,
00058 const Transform &mtl2world, const TextureParams &mp)
00059 {
00060 if (DynamicLoader::registeredMaterials().find(name) !=
00061 DynamicLoader::registeredMaterials().end()) {
00062 boost::shared_ptr<Material> ret(DynamicLoader::registeredMaterials()[name](mtl2world, mp));
00063 ret->InitGeneralParams(mp);
00064 mp.ReportUnused();
00065 return ret;
00066 }
00067
00068 if (name != "")
00069 LoadError("material", name);
00070 return boost::shared_ptr<Material>();
00071 }
00072
00073 boost::shared_ptr<Texture<float> > MakeFloatTexture(const string &name,
00074 const Transform &tex2world, const TextureParams &tp)
00075 {
00076 if (DynamicLoader::registeredFloatTextures().find(name) !=
00077 DynamicLoader::registeredFloatTextures().end()) {
00078 boost::shared_ptr<Texture<float> > ret(DynamicLoader::registeredFloatTextures()[name](tex2world, tp));
00079 tp.ReportUnused();
00080 return ret;
00081 }
00082
00083 LoadError("float texture", name);
00084 return boost::shared_ptr<Texture<float> >();
00085 }
00086
00087 boost::shared_ptr<Texture<SWCSpectrum> > MakeSWCSpectrumTexture(const string &name,
00088 const Transform &tex2world, const TextureParams &tp)
00089 {
00090 if (DynamicLoader::registeredSWCSpectrumTextures().find(name) !=
00091 DynamicLoader::registeredSWCSpectrumTextures().end()) {
00092 boost::shared_ptr<Texture<SWCSpectrum> > ret(DynamicLoader::registeredSWCSpectrumTextures()[name](tex2world, tp));
00093 tp.ReportUnused();
00094 return ret;
00095 }
00096
00097 LoadError("color texture", name);
00098 return boost::shared_ptr<Texture<SWCSpectrum> >();
00099 }
00100
00101 Light *MakeLight(const string &name,
00102 const Transform &light2world, const ParamSet ¶mSet, const TextureParams &tp)
00103 {
00104 if (DynamicLoader::registeredLights().find(name) !=
00105 DynamicLoader::registeredLights().end()) {
00106 Light *ret = DynamicLoader::registeredLights()[name](light2world,
00107 paramSet, tp);
00108 paramSet.ReportUnused();
00109 return ret;
00110 }
00111
00112 LoadError("light", name);
00113 return NULL;
00114 }
00115
00116 AreaLight *MakeAreaLight(const string &name,
00117 const Transform &light2world, const ParamSet ¶mSet, const TextureParams &tp,
00118 const boost::shared_ptr<Primitive> &prim)
00119 {
00120 if (DynamicLoader::registeredAreaLights().find(name) !=
00121 DynamicLoader::registeredAreaLights().end()) {
00122 AreaLight *ret =
00123 DynamicLoader::registeredAreaLights()[name](light2world,
00124 paramSet, tp, prim);
00125 paramSet.ReportUnused();
00126 return ret;
00127 }
00128
00129 LoadError("area light", name);
00130 return NULL;
00131 }
00132
00133 VolumeRegion *MakeVolumeRegion(const string &name,
00134 const Transform &volume2world, const ParamSet ¶mSet)
00135 {
00136 if (DynamicLoader::registeredVolumeRegions().find(name) !=
00137 DynamicLoader::registeredVolumeRegions().end()) {
00138 VolumeRegion *ret =
00139 DynamicLoader::registeredVolumeRegions()[name](volume2world,
00140 paramSet);
00141 paramSet.ReportUnused();
00142 return ret;
00143 }
00144
00145 LoadError("volume region", name);
00146 return NULL;
00147 }
00148
00149 SurfaceIntegrator *MakeSurfaceIntegrator(const string &name,
00150 const ParamSet ¶mSet)
00151 {
00152 if (DynamicLoader::registeredSurfaceIntegrators().find(name) !=
00153 DynamicLoader::registeredSurfaceIntegrators().end()) {
00154 SurfaceIntegrator *ret =
00155 DynamicLoader::registeredSurfaceIntegrators()[name](paramSet);
00156 paramSet.ReportUnused();
00157 return ret;
00158 }
00159
00160 LoadError("surface integrator", name);
00161 return NULL;
00162 }
00163
00164 VolumeIntegrator *MakeVolumeIntegrator(const string &name,
00165 const ParamSet ¶mSet)
00166 {
00167 if (DynamicLoader::registeredVolumeIntegrators().find(name) !=
00168 DynamicLoader::registeredVolumeIntegrators().end()) {
00169 VolumeIntegrator *ret =
00170 DynamicLoader::registeredVolumeIntegrators()[name](paramSet);
00171 paramSet.ReportUnused();
00172 return ret;
00173 }
00174
00175 LoadError("volume integrator", name);
00176 return NULL;
00177 }
00178
00179 boost::shared_ptr<Aggregate> MakeAccelerator(const string &name,
00180 const vector<boost::shared_ptr<Primitive> > &prims, const ParamSet ¶mSet)
00181 {
00182 if (DynamicLoader::registeredAccelerators().find(name) !=
00183 DynamicLoader::registeredAccelerators().end()) {
00184 boost::shared_ptr<Aggregate> ret(
00185 DynamicLoader::registeredAccelerators()[name](prims,
00186 paramSet));
00187 paramSet.ReportUnused();
00188 return ret;
00189 }
00190
00191 LoadError("accelerator", name);
00192 return boost::shared_ptr<Aggregate>();
00193 }
00194
00195 Camera *MakeCamera(const string &name,
00196 const Transform &world2cam, const Transform &world2camEnd,
00197 const ParamSet ¶mSet, Film *film)
00198 {
00199 if (DynamicLoader::registeredCameras().find(name) !=
00200 DynamicLoader::registeredCameras().end()) {
00201 Camera *ret = DynamicLoader::registeredCameras()[name](world2cam,
00202 world2camEnd, paramSet, film);
00203 paramSet.ReportUnused();
00204 return ret;
00205 }
00206
00207 LoadError("camera", name);
00208 return NULL;
00209 }
00210
00211 Sampler *MakeSampler(const string &name,
00212 const ParamSet ¶mSet, const Film *film)
00213 {
00214 if (DynamicLoader::registeredSamplers().find(name) !=
00215 DynamicLoader::registeredSamplers().end()) {
00216 Sampler *ret = DynamicLoader::registeredSamplers()[name](paramSet,
00217 film);
00218 paramSet.ReportUnused();
00219 return ret;
00220 }
00221
00222 LoadError("sampler", name);
00223 return NULL;
00224 }
00225
00226 Filter *MakeFilter(const string &name,
00227 const ParamSet ¶mSet)
00228 {
00229 if (DynamicLoader::registeredFilters().find(name) !=
00230 DynamicLoader::registeredFilters().end()) {
00231 Filter *ret = DynamicLoader::registeredFilters()[name](paramSet);
00232 paramSet.ReportUnused();
00233 return ret;
00234 }
00235
00236 LoadError("filter", name);
00237 return NULL;
00238 }
00239
00240 ToneMap *MakeToneMap(const string &name,
00241 const ParamSet ¶mSet)
00242 {
00243 if (DynamicLoader::registeredToneMaps().find(name) !=
00244 DynamicLoader::registeredToneMaps().end()) {
00245 ToneMap *ret = DynamicLoader::registeredToneMaps()[name](paramSet);
00246 paramSet.ReportUnused();
00247 return ret;
00248 }
00249
00250 LoadError("tonemap", name);
00251 return NULL;
00252 }
00253
00254 Film *MakeFilm(const string &name,
00255 const ParamSet ¶mSet, Filter *filter)
00256 {
00257 if (DynamicLoader::registeredFilms().find(name) !=
00258 DynamicLoader::registeredFilms().end()) {
00259 Film *ret = DynamicLoader::registeredFilms()[name](paramSet,
00260 filter);
00261 paramSet.ReportUnused();
00262 return ret;
00263 }
00264
00265 LoadError("film", name);
00266 return NULL;
00267 }
00268
00269 PixelSampler *MakePixelSampler(const string &name,
00270 const ParamSet ¶mSet)
00271 {
00272 if (DynamicLoader::registeredPixelSamplers().find(name) !=
00273 DynamicLoader::registeredPixelSamplers().end()) {
00274 PixelSampler *ret = DynamicLoader::registeredPixelSamplers()[name](paramSet);
00275 paramSet.ReportUnused();
00276 return ret;
00277 }
00278
00279 LoadError("pixel sampler", name);
00280 return NULL;
00281 }
00282
00283 map<string, DynamicLoader::CreateShape> &DynamicLoader::registeredShapes()
00284 {
00285 static map<string, DynamicLoader::CreateShape> *Map = new map<string, DynamicLoader::CreateShape>;
00286 return *Map;
00287 }
00288 map<string, DynamicLoader::CreateMaterial> &DynamicLoader::registeredMaterials()
00289 {
00290 static map<string, DynamicLoader::CreateMaterial> *Map = new map<string, DynamicLoader::CreateMaterial>;
00291 return *Map;
00292 }
00293 map<string, DynamicLoader::CreateFloatTexture> &DynamicLoader::registeredFloatTextures()
00294 {
00295 static map<string, DynamicLoader::CreateFloatTexture> *Map = new map<string, DynamicLoader::CreateFloatTexture>;
00296 return *Map;
00297 }
00298 map<string, DynamicLoader::CreateSWCSpectrumTexture> &DynamicLoader::registeredSWCSpectrumTextures()
00299 {
00300 static map<string, DynamicLoader::CreateSWCSpectrumTexture> *Map = new map<string, DynamicLoader::CreateSWCSpectrumTexture>;
00301 return *Map;
00302 }
00303 map<string, DynamicLoader::CreateLight> &DynamicLoader::registeredLights()
00304 {
00305 static map<string, DynamicLoader::CreateLight> *Map = new map<string, DynamicLoader::CreateLight>;
00306 return *Map;
00307 }
00308 map<string, DynamicLoader::CreateAreaLight> &DynamicLoader::registeredAreaLights()
00309 {
00310 static map<string, DynamicLoader::CreateAreaLight> *Map = new map<string, DynamicLoader::CreateAreaLight>;
00311 return *Map;
00312 }
00313 map<string, DynamicLoader::CreateVolumeRegion> &DynamicLoader::registeredVolumeRegions()
00314 {
00315 static map<string, DynamicLoader::CreateVolumeRegion> *Map = new map<string, DynamicLoader::CreateVolumeRegion>;
00316 return *Map;
00317 }
00318 map<string, DynamicLoader::CreateSurfaceIntegrator> &DynamicLoader::registeredSurfaceIntegrators()
00319 {
00320 static map<string, DynamicLoader::CreateSurfaceIntegrator> *Map = new map<string, DynamicLoader::CreateSurfaceIntegrator>;
00321 return *Map;
00322 }
00323 map<string, DynamicLoader::CreateVolumeIntegrator> &DynamicLoader::registeredVolumeIntegrators()
00324 {
00325 static map<string, DynamicLoader::CreateVolumeIntegrator> *Map = new map<string, DynamicLoader::CreateVolumeIntegrator>;
00326 return *Map;
00327 }
00328 map<string, DynamicLoader::CreateAccelerator> &DynamicLoader::registeredAccelerators()
00329 {
00330 static map<string, DynamicLoader::CreateAccelerator> *Map = new map<string, DynamicLoader::CreateAccelerator>;
00331 return *Map;
00332 }
00333 map<string, DynamicLoader::CreateCamera> &DynamicLoader::registeredCameras()
00334 {
00335 static map<string, DynamicLoader::CreateCamera> *Map = new map<string, DynamicLoader::CreateCamera>;
00336 return *Map;
00337 }
00338 map<string, DynamicLoader::CreateSampler> &DynamicLoader::registeredSamplers()
00339 {
00340 static map<string, DynamicLoader::CreateSampler> *Map = new map<string, DynamicLoader::CreateSampler>;
00341 return *Map;
00342 }
00343 map<string, DynamicLoader::CreateFilter> &DynamicLoader::registeredFilters()
00344 {
00345 static map<string, DynamicLoader::CreateFilter> *Map = new map<string, DynamicLoader::CreateFilter>;
00346 return *Map;
00347 }
00348 map<string, DynamicLoader::CreateToneMap> &DynamicLoader::registeredToneMaps()
00349 {
00350 static map<string, DynamicLoader::CreateToneMap> *Map = new map<string, DynamicLoader::CreateToneMap>;
00351 return *Map;
00352 }
00353 map<string, DynamicLoader::CreateFilm> &DynamicLoader::registeredFilms()
00354 {
00355 static map<string, DynamicLoader::CreateFilm> *Map = new map<string, DynamicLoader::CreateFilm>;
00356 return *Map;
00357 }
00358 map<string, DynamicLoader::CreatePixelSampler> &DynamicLoader::registeredPixelSamplers()
00359 {
00360 static map<string, DynamicLoader::CreatePixelSampler> *Map = new map<string, DynamicLoader::CreatePixelSampler>;
00361 return *Map;
00362 }
00363
00364 }
00365