|
Blender
V2.59
|
00001 /* 00002 * $Id: LightExporter.cpp 38079 2011-07-04 08:59:28Z jesterking $ 00003 * 00004 * ***** BEGIN GPL LICENSE BLOCK ***** 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU General Public License 00008 * as published by the Free Software Foundation; either version 2 00009 * of the License, or (at your option) any later version. 00010 * 00011 * This program 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; if not, write to the Free Software Foundation, 00018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00019 * 00020 * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed, 00021 * Nathan Letwory 00022 * 00023 * ***** END GPL LICENSE BLOCK ***** 00024 */ 00025 00030 #include <string> 00031 00032 #include "COLLADASWColor.h" 00033 #include "COLLADASWLight.h" 00034 00035 #include "BLI_math.h" 00036 00037 #include "LightExporter.h" 00038 #include "collada_internal.h" 00039 00040 template<class Functor> 00041 void forEachLampObjectInScene(Scene *sce, Functor &f, bool export_selected) 00042 { 00043 Base *base= (Base*) sce->base.first; 00044 while(base) { 00045 Object *ob = base->object; 00046 00047 if (ob->type == OB_LAMP && ob->data 00048 && !(export_selected && !(ob->flag & SELECT))) { 00049 f(ob); 00050 } 00051 base= base->next; 00052 } 00053 } 00054 00055 LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){} 00056 00057 void LightsExporter::exportLights(Scene *sce, bool export_selected) 00058 { 00059 openLibrary(); 00060 00061 forEachLampObjectInScene(sce, *this, export_selected); 00062 00063 closeLibrary(); 00064 } 00065 void LightsExporter::operator()(Object *ob) 00066 { 00067 Lamp *la = (Lamp*)ob->data; 00068 std::string la_id(get_light_id(ob)); 00069 std::string la_name(id_name(la)); 00070 COLLADASW::Color col(la->r * la->energy, la->g * la->energy, la->b * la->energy); 00071 float d, constatt, linatt, quadatt; 00072 00073 d = la->dist; 00074 00075 constatt = 1.0f; 00076 00077 if(la->falloff_type==LA_FALLOFF_INVLINEAR) { 00078 linatt = 1.0f / d; 00079 quadatt = 0.0f; 00080 } 00081 else { 00082 linatt = 0.0f; 00083 quadatt = 1.0f / (d * d); 00084 } 00085 00086 // sun 00087 if (la->type == LA_SUN) { 00088 COLLADASW::DirectionalLight cla(mSW, la_id, la_name); 00089 cla.setColor(col); 00090 cla.setConstantAttenuation(constatt); 00091 exportBlenderProfile(cla, la); 00092 addLight(cla); 00093 } 00094 // hemi 00095 else if (la->type == LA_HEMI) { 00096 COLLADASW::AmbientLight cla(mSW, la_id, la_name); 00097 cla.setColor(col); 00098 cla.setConstantAttenuation(constatt); 00099 exportBlenderProfile(cla, la); 00100 addLight(cla); 00101 } 00102 // spot 00103 else if (la->type == LA_SPOT) { 00104 COLLADASW::SpotLight cla(mSW, la_id, la_name); 00105 cla.setColor(col); 00106 cla.setFallOffAngle(la->spotsize); 00107 cla.setFallOffExponent(la->spotblend); 00108 cla.setConstantAttenuation(constatt); 00109 cla.setLinearAttenuation(linatt); 00110 cla.setQuadraticAttenuation(quadatt); 00111 exportBlenderProfile(cla, la); 00112 addLight(cla); 00113 } 00114 // lamp 00115 else if (la->type == LA_LOCAL) { 00116 COLLADASW::PointLight cla(mSW, la_id, la_name); 00117 cla.setColor(col); 00118 cla.setConstantAttenuation(constatt); 00119 cla.setLinearAttenuation(linatt); 00120 cla.setQuadraticAttenuation(quadatt); 00121 exportBlenderProfile(cla, la); 00122 addLight(cla); 00123 } 00124 // area lamp is not supported 00125 // it will be exported as a local lamp 00126 else { 00127 COLLADASW::PointLight cla(mSW, la_id, la_name); 00128 cla.setColor(col); 00129 cla.setConstantAttenuation(constatt); 00130 cla.setLinearAttenuation(linatt); 00131 cla.setQuadraticAttenuation(quadatt); 00132 exportBlenderProfile(cla, la); 00133 addLight(cla); 00134 } 00135 00136 } 00137 00138 bool LightsExporter::exportBlenderProfile(COLLADASW::Light &cla, Lamp *la) 00139 { 00140 cla.addExtraTechniqueParameter("blender", "type", la->type); 00141 cla.addExtraTechniqueParameter("blender", "flag", la->flag); 00142 cla.addExtraTechniqueParameter("blender", "mode", la->mode); 00143 cla.addExtraTechniqueParameter("blender", "gamma", la->k); 00144 cla.addExtraTechniqueParameter("blender", "red", la->r); 00145 cla.addExtraTechniqueParameter("blender", "green", la->g); 00146 cla.addExtraTechniqueParameter("blender", "blue", la->b); 00147 cla.addExtraTechniqueParameter("blender", "shadow_r", la->shdwr); 00148 cla.addExtraTechniqueParameter("blender", "shadow_g", la->shdwg); 00149 cla.addExtraTechniqueParameter("blender", "shadow_b", la->shdwb); 00150 cla.addExtraTechniqueParameter("blender", "energy", la->energy); 00151 cla.addExtraTechniqueParameter("blender", "dist", la->dist); 00152 cla.addExtraTechniqueParameter("blender", "spotsize", la->spotsize); 00153 cla.addExtraTechniqueParameter("blender", "spotblend", la->spotblend); 00154 cla.addExtraTechniqueParameter("blender", "halo_intensity", la->haint); 00155 cla.addExtraTechniqueParameter("blender", "att1", la->att1); 00156 cla.addExtraTechniqueParameter("blender", "att2", la->att2); 00157 // \todo figure out how we can have falloff curve supported here 00158 cla.addExtraTechniqueParameter("blender", "falloff_type", la->falloff_type); 00159 cla.addExtraTechniqueParameter("blender", "clipsta", la->clipsta); 00160 cla.addExtraTechniqueParameter("blender", "clipend", la->clipend); 00161 cla.addExtraTechniqueParameter("blender", "shadspotsize", la->shadspotsize); 00162 cla.addExtraTechniqueParameter("blender", "bias", la->bias); 00163 cla.addExtraTechniqueParameter("blender", "soft", la->soft); 00164 cla.addExtraTechniqueParameter("blender", "compressthresh", la->compressthresh); 00165 cla.addExtraTechniqueParameter("blender", "bufsize", la->bufsize); 00166 cla.addExtraTechniqueParameter("blender", "samp", la->samp); 00167 cla.addExtraTechniqueParameter("blender", "buffers", la->buffers); 00168 cla.addExtraTechniqueParameter("blender", "filtertype", la->filtertype); 00169 cla.addExtraTechniqueParameter("blender", "bufflag", la->bufflag); 00170 cla.addExtraTechniqueParameter("blender", "buftype", la->buftype); 00171 cla.addExtraTechniqueParameter("blender", "ray_samp", la->ray_samp); 00172 cla.addExtraTechniqueParameter("blender", "ray_sampy", la->ray_sampy); 00173 cla.addExtraTechniqueParameter("blender", "ray_sampz", la->ray_sampz); 00174 cla.addExtraTechniqueParameter("blender", "ray_samp_type", la->ray_samp_type); 00175 cla.addExtraTechniqueParameter("blender", "area_shape", la->area_shape); 00176 cla.addExtraTechniqueParameter("blender", "area_size", la->area_size); 00177 cla.addExtraTechniqueParameter("blender", "area_sizey", la->area_sizey); 00178 cla.addExtraTechniqueParameter("blender", "area_sizez", la->area_sizez); 00179 cla.addExtraTechniqueParameter("blender", "adapt_thresh", la->adapt_thresh); 00180 cla.addExtraTechniqueParameter("blender", "ray_samp_method", la->ray_samp_method); 00181 cla.addExtraTechniqueParameter("blender", "shadhalostep", la->shadhalostep); 00182 cla.addExtraTechniqueParameter("blender", "sun_effect_type", la->shadhalostep); 00183 cla.addExtraTechniqueParameter("blender", "skyblendtype", la->skyblendtype); 00184 cla.addExtraTechniqueParameter("blender", "horizon_brightness", la->horizon_brightness); 00185 cla.addExtraTechniqueParameter("blender", "spread", la->spread); 00186 cla.addExtraTechniqueParameter("blender", "sun_brightness", la->sun_brightness); 00187 cla.addExtraTechniqueParameter("blender", "sun_size", la->sun_size); 00188 cla.addExtraTechniqueParameter("blender", "backscattered_light", la->backscattered_light); 00189 cla.addExtraTechniqueParameter("blender", "sun_intensity", la->sun_intensity); 00190 cla.addExtraTechniqueParameter("blender", "atm_turbidity", la->atm_turbidity); 00191 cla.addExtraTechniqueParameter("blender", "atm_extinction_factor", la->atm_extinction_factor); 00192 cla.addExtraTechniqueParameter("blender", "atm_distance_factor", la->atm_distance_factor); 00193 cla.addExtraTechniqueParameter("blender", "skyblendfac", la->skyblendfac); 00194 cla.addExtraTechniqueParameter("blender", "sky_exposure", la->sky_exposure); 00195 cla.addExtraTechniqueParameter("blender", "sky_colorspace", la->sky_colorspace); 00196 00197 return true; 00198 }