Blender V4.5
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
8
9#include <string>
10
11#include "COLLADASWColor.h"
12#include "COLLADASWLight.h"
13
14#include "DNA_light_types.h"
15#include "LightExporter.h"
16#include "collada_internal.h"
17
18#include "BKE_light.h"
19
20template<class Functor>
21void forEachLightObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set)
22{
23 LinkNode *node;
24 for (node = export_set; node; node = node->next) {
25 Object *ob = (Object *)node->link;
26
27 if (ob->type == OB_LAMP && ob->data) {
28 f(ob);
29 }
30 }
31}
32
33LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw, BCExportSettings &export_settings)
34 : COLLADASW::LibraryLights(sw), export_settings(export_settings)
35{
36}
37
39{
40 openLibrary();
41
42 forEachLightObjectInExportSet(sce, *this, this->export_settings.get_export_set());
43
44 closeLibrary();
45}
46
48{
49 Light *la = (Light *)ob->data;
50 std::string la_id(get_light_id(ob));
51 std::string la_name(id_name(la));
53 if (la->mode & LA_UNNORMALIZED) {
54 color *= BKE_light_area(*la, ob->runtime->object_to_world);
55 }
56 COLLADASW::Color col(color[0], color[1], color[2]);
57
58 /* sun */
59 if (la->type == LA_SUN) {
60 COLLADASW::DirectionalLight cla(mSW, la_id, la_name);
61 cla.setColor(col, false, "color");
62 exportBlenderProfile(cla, la);
63 addLight(cla);
64 }
65
66 /* spot */
67 else if (la->type == LA_SPOT) {
68 COLLADASW::SpotLight cla(mSW, la_id, la_name);
69 cla.setColor(col, false, "color");
70 cla.setFallOffAngle(RAD2DEGF(la->spotsize), false, "fall_off_angle");
71 cla.setFallOffExponent(la->spotblend, false, "fall_off_exponent");
72 exportBlenderProfile(cla, la);
73 addLight(cla);
74 }
75 /* lamp */
76 else if (la->type == LA_LOCAL) {
77 COLLADASW::PointLight cla(mSW, la_id, la_name);
78 cla.setColor(col, false, "color");
79 exportBlenderProfile(cla, la);
80 addLight(cla);
81 }
82 /* area light is not supported
83 * it will be exported as a local lamp */
84 else {
85 COLLADASW::PointLight cla(mSW, la_id, la_name);
86 cla.setColor(col, false, "color");
87 exportBlenderProfile(cla, la);
88 addLight(cla);
89 }
90}
91
92bool LightsExporter::exportBlenderProfile(COLLADASW::Light &cla, Light *la)
93{
94 cla.addExtraTechniqueParameter("blender", "type", la->type);
95 cla.addExtraTechniqueParameter("blender", "flag", la->flag);
96 cla.addExtraTechniqueParameter("blender", "mode", la->mode);
97 cla.addExtraTechniqueParameter("blender", "red", la->r);
98 cla.addExtraTechniqueParameter("blender", "green", la->g);
99 cla.addExtraTechniqueParameter("blender", "blue", la->b);
100 cla.addExtraTechniqueParameter("blender", "energy", la->energy, "blender_energy");
101 cla.addExtraTechniqueParameter("blender", "spotsize", RAD2DEGF(la->spotsize));
102 cla.addExtraTechniqueParameter("blender", "spotblend", la->spotblend);
103 cla.addExtraTechniqueParameter("blender", "clipsta", la->clipsta);
104 cla.addExtraTechniqueParameter("blender", "clipend", la->att_dist);
105 cla.addExtraTechniqueParameter("blender", "radius", la->radius);
106 cla.addExtraTechniqueParameter("blender", "area_shape", la->area_shape);
107 cla.addExtraTechniqueParameter("blender", "area_size", la->area_size);
108 cla.addExtraTechniqueParameter("blender", "area_sizey", la->area_sizey);
109 cla.addExtraTechniqueParameter("blender", "area_sizez", la->area_sizez);
110
111 return true;
112}
General operations, lookup, etc. for blender lights.
blender::float3 BKE_light_color(const Light &light)
float BKE_light_area(const Light &light, const blender::float4x4 &object_to_world)
float BKE_light_power(const Light &light)
#define RAD2DEGF(_rad)
@ LA_UNNORMALIZED
@ 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)
uint col
VecBase< float, 3 > float3
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
void * link
struct LinkNode * next
ObjectRuntimeHandle * runtime