Blender V4.3
LightExporter.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2010-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <string>
10
11#include "COLLADASWColor.h"
12#include "COLLADASWLight.h"
13
14#include "LightExporter.h"
15#include "collada_internal.h"
16
17template<class Functor>
18void forEachLightObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set)
19{
21 for (node = export_set; node; node = node->next) {
22 Object *ob = (Object *)node->link;
23
24 if (ob->type == OB_LAMP && ob->data) {
25 f(ob);
26 }
27 }
28}
29
30LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings)
31 : COLLADASW::LibraryLights(sw), export_settings(export_settings)
32{
33}
34
36{
37 openLibrary();
38
39 forEachLightObjectInExportSet(sce, *this, this->export_settings.get_export_set());
40
41 closeLibrary();
42}
43
45{
46 Light *la = (Light *)ob->data;
47 std::string la_id(get_light_id(ob));
48 std::string la_name(id_name(la));
49 COLLADASW::Color col(la->r * la->energy, la->g * la->energy, la->b * la->energy);
50
51 /* sun */
52 if (la->type == LA_SUN) {
53 COLLADASW::DirectionalLight cla(mSW, la_id, la_name);
54 cla.setColor(col, false, "color");
55 exportBlenderProfile(cla, la);
56 addLight(cla);
57 }
58
59 /* spot */
60 else if (la->type == LA_SPOT) {
61 COLLADASW::SpotLight cla(mSW, la_id, la_name);
62 cla.setColor(col, false, "color");
63 cla.setFallOffAngle(RAD2DEGF(la->spotsize), false, "fall_off_angle");
64 cla.setFallOffExponent(la->spotblend, false, "fall_off_exponent");
65 exportBlenderProfile(cla, la);
66 addLight(cla);
67 }
68 /* lamp */
69 else if (la->type == LA_LOCAL) {
70 COLLADASW::PointLight cla(mSW, la_id, la_name);
71 cla.setColor(col, false, "color");
72 exportBlenderProfile(cla, la);
73 addLight(cla);
74 }
75 /* area light is not supported
76 * it will be exported as a local lamp */
77 else {
78 COLLADASW::PointLight cla(mSW, la_id, la_name);
79 cla.setColor(col, false, "color");
80 exportBlenderProfile(cla, la);
81 addLight(cla);
82 }
83}
84
85bool LightsExporter::exportBlenderProfile(COLLADASW::Light &cla, Light *la)
86{
87 cla.addExtraTechniqueParameter("blender", "type", la->type);
88 cla.addExtraTechniqueParameter("blender", "flag", la->flag);
89 cla.addExtraTechniqueParameter("blender", "mode", la->mode);
90 cla.addExtraTechniqueParameter("blender", "red", la->r);
91 cla.addExtraTechniqueParameter("blender", "green", la->g);
92 cla.addExtraTechniqueParameter("blender", "blue", la->b);
93 cla.addExtraTechniqueParameter("blender", "energy", la->energy, "blender_energy");
94 cla.addExtraTechniqueParameter("blender", "spotsize", RAD2DEGF(la->spotsize));
95 cla.addExtraTechniqueParameter("blender", "spotblend", la->spotblend);
96 cla.addExtraTechniqueParameter("blender", "clipsta", la->clipsta);
97 cla.addExtraTechniqueParameter("blender", "clipend", la->att_dist);
98 cla.addExtraTechniqueParameter("blender", "radius", la->radius);
99 cla.addExtraTechniqueParameter("blender", "area_shape", la->area_shape);
100 cla.addExtraTechniqueParameter("blender", "area_size", la->area_size);
101 cla.addExtraTechniqueParameter("blender", "area_sizey", la->area_sizey);
102 cla.addExtraTechniqueParameter("blender", "area_sizez", la->area_sizez);
103
104 return true;
105}
#define RAD2DEGF(_rad)
@ LA_LOCAL
@ LA_SPOT
@ LA_SUN
@ OB_LAMP
void forEachLightObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set)
void exportLights(Scene *sce)
LightsExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings)
void operator()(Object *ob)
std::string get_light_id(Object *ob)
std::string id_name(void *id)
OperationNode * node
uint col
float energy
float att_dist
float area_sizez
float area_sizey
short area_shape
float clipsta
float spotblend
float spotsize
float radius
float area_size
short type
short flag
struct LinkNode * next