CFx SDK Documentation 2026 SP0
Loading...
Searching...
No Matches
GiLightTraitsData.h
Go to the documentation of this file.
1
2// Copyright (C) 2002-2024, Open Design Alliance (the "Alliance").
3// All rights reserved.
4//
5// This software and its documentation and related materials are owned by
6// the Alliance. The software may only be incorporated into application
7// programs owned by members of the Alliance, subject to a signed
8// Membership Agreement and Supplemental Software License Agreement with the
9// Alliance. The structure and organization of this software are the valuable
10// trade secrets of the Alliance and its suppliers. The software is also
11// protected by copyright law and international treaty provisions. Application
12// programs incorporating this software must include the following statement
13// with their copyright notices:
14//
15// This application incorporates Open Design Alliance software pursuant to a license
16// agreement with Open Design Alliance.
17// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.
18// All rights reserved.
19//
20// By use of this software, its documentation or related materials, you
21// acknowledge and accept the above terms.
23
24#ifndef __OD_GI_LIGHT_TRAITS_DATA__
25#define __OD_GI_LIGHT_TRAITS_DATA__
26
27#include "TD_PackPush.h"
28
29#include "Gi/GiLightTraits.h"
30#include "Ge/GeMatrix3d.h"
31#include "MemoryStream.h"
32
40{
41 double m_dIntensity;
42 OdCmEntityColor m_color;
43 OdGiShadowParameters m_shadowParameters;
44 OdGeMatrix3d m_xform;
45public:
62
69 static LightType drawableLightType(const OdGiDrawable *pDrawable);
70protected:
79
80protected:
82 : m_dIntensity(0.0)
83 , m_uFlags(0)
85 {}
86
87public:
94 bool isOn() const { return GETBIT(m_uFlags, kFlagIsOn); }
95
102
109 double intensity() const { return m_dIntensity; }
110
116 void setIntensity(double dIntensity) { m_dIntensity = dIntensity; }
117
124 OdCmEntityColor color() const { return m_color; }
125
131 void setColor(const OdCmEntityColor& color) { m_color = color; }
132
141 OdGiShadowParameters shadowParameters() const { return m_shadowParameters; }
142
150 void setShadowParameters(const OdGiShadowParameters& params) { m_shadowParameters = params; }
151
158 LightType type() const { return m_type; }
159
165 void save(OdGsFiler * pFiler) const;
166
172 void load(OdGsFiler * pFiler);
173
179 static void deleteLightTraitsData(OdGiLightTraitsData* pLightTraits);
180
187 { SETBIT(m_uFlags, kFlagIsTransformed, !(m_xform = xForm).isEqualTo(OdGeMatrix3d::kIdentity)); }
188
195 { SETBIT(m_uFlags, kFlagIsTransformed, !(m_xform = xForm * m_xform).isEqualTo(OdGeMatrix3d::kIdentity)); }
196
201
208
214 const OdGeMatrix3d &lightTransformationMatrix() const { return m_xform; }
215};
216
218{
219 const LightType lightType = (pDrawable) ? (LightType)pDrawable->drawableType() : kInvalidLight;
220 switch (lightType)
221 {
222 case kPointLight:
223 case kSpotLight:
224 case kDistantLight:
225 case kWebLight:
226 return lightType;
227 default:
228 return kInvalidLight;
229 }
230}
231
232inline void OdGiLightTraitsData::save(OdGsFiler *pFiler) const {
233 pFiler->wrBool(isOn());
234 pFiler->wrDouble(intensity());
235 pFiler->wrUInt32(color().color());
236 m_shadowParameters.save(pFiler);
237 pFiler->wrBool(isLightTransformed());
238 if (isLightTransformed())
240}
241
243 setOn(pFiler->rdBool());
244 setIntensity(pFiler->rdDouble());
245 { OdCmEntityColor lightColor; lightColor.setColor(pFiler->rdUInt32()); setColor(lightColor); }
246 m_shadowParameters.load(pFiler);
247 if (pFiler->rdBool())
248 { OdGeMatrix3d xForm;
249 pFiler->rdMatrix3d(xForm);
250 setLightTransform(xForm);
251 }
252}
253
261{
262 OdGePoint3d m_position;
263 OdGiLightAttenuation m_attenuation;
264 // Photometric data
265 double m_dPhysIntensity;
266 OdGiColorRGB m_lampColor;
267 OdGePoint3d m_target;
268
269protected:
276
277public:
283 : m_dPhysIntensity(1500.0)
284 , m_lampColor(1.0, 1.0, 1.0)
285 {
287 }
288
295 OdGePoint3d position() const { return m_position; }
296
302 void setPosition(const OdGePoint3d& pos) { m_position = pos; }
303
310 OdGiLightAttenuation attenuation() const { return m_attenuation; }
311
317 void setAttenuation(const OdGiLightAttenuation& atten) { m_attenuation = atten; }
318
325 double physicalIntensity() const { return m_dPhysIntensity; }
326
332 void setPhysicalIntensity(double intensity) { m_dPhysIntensity = intensity; }
333
340 OdGiColorRGB lampColor() const { return m_lampColor; }
341
347 void setLampColor(const OdGiColorRGB& color) { m_lampColor = color; }
348
355 bool hasTarget() const { return GETBIT(m_uFlags, kFlagHasTarget); }
356
362 void setHasTarget(bool bTarget) { SETBIT(m_uFlags, kFlagHasTarget, bTarget); }
363
370 OdGePoint3d targetLocation() const { return m_target; }
371
377 void setTargetLocation(const OdGePoint3d &loc) { m_target = loc; }
378
384 void setHemisphericalDistribution(bool bHemisphere) { SETBIT(m_uFlags, kFlagHemisphere, bHemisphere); }
391
397 inline void save(OdGsFiler *pFiler) const {
399 pFiler->wrPoint3d(position());
400 attenuation().save(pFiler);
401 pFiler->wrDouble(physicalIntensity());
402 pFiler->wrDouble(m_lampColor.red);
403 pFiler->wrDouble(m_lampColor.green);
404 pFiler->wrDouble(m_lampColor.blue);
405 pFiler->wrBool(hasTarget());
406 pFiler->wrPoint3d(targetLocation());
408 }
409
415 inline void load(OdGsFiler *pFiler) {
417 pFiler->rdPoint3d(m_position);
418 m_attenuation.load(pFiler);
420 m_lampColor.red = pFiler->rdDouble();
421 m_lampColor.green = pFiler->rdDouble();
422 m_lampColor.blue = pFiler->rdDouble();
423 setHasTarget(pFiler->rdBool());
424 pFiler->rdPoint3d(m_target);
426 }
427};
428
436{
437 OdGePoint3d m_position, m_target;
438 OdGiLightAttenuation m_attenuation;
439 double m_dHotspot, m_dFalloff;
440 // Photometric data
441 double m_dPhysIntensity;
442 OdGiColorRGB m_lampColor;
443
444public:
450 : m_dHotspot(0.0)
451 , m_dFalloff(0.0)
452 , m_dPhysIntensity(1500.0)
453 , m_lampColor(1.0, 1.0, 1.0)
454 {
456 }
457
464 OdGePoint3d position() const { return m_position; }
465
471 void setPosition(const OdGePoint3d& pos) { m_position = pos; }
472
479 OdGePoint3d target() const { return m_target; }
480
486 void setTarget(const OdGePoint3d& trg) { m_target = trg; }
487
494 OdGiLightAttenuation attenuation() const { return m_attenuation; }
495
501 void setAttenuation(const OdGiLightAttenuation& atten) { m_attenuation = atten; }
502
509 bool setHotspotAndFalloff(double hotSpot, double falloff);
510
517 double hotspot() const { return m_dHotspot; }
518
525 double falloff() const { return m_dFalloff; }
526
533 double physicalIntensity() const { return m_dPhysIntensity; }
534
540 void setPhysicalIntensity(double intensity) { m_dPhysIntensity = intensity; }
541
548 OdGiColorRGB lampColor() const { return m_lampColor; }
549
555 void setLampColor(const OdGiColorRGB& color) { m_lampColor = color; }
556
562 void save(OdGsFiler *pFiler) const {
564 pFiler->wrPoint3d(position());
565 pFiler->wrPoint3d(target());
566 attenuation().save(pFiler);
567 pFiler->wrDouble(physicalIntensity());
568 pFiler->wrDouble(hotspot());
569 pFiler->wrDouble(falloff());
570 pFiler->wrDouble(m_lampColor.red);
571 pFiler->wrDouble(m_lampColor.green);
572 pFiler->wrDouble(m_lampColor.blue);
573 }
574
580 void load(OdGsFiler *pFiler) {
582 pFiler->rdPoint3d(m_position);
583 pFiler->rdPoint3d(m_target);
584 m_attenuation.load(pFiler);
586 m_dHotspot = pFiler->rdDouble();
587 m_dFalloff = pFiler->rdDouble();
588 m_lampColor.red = pFiler->rdDouble();
589 m_lampColor.green = pFiler->rdDouble();
590 m_lampColor.blue = pFiler->rdDouble();
591 }
592};
593
599{
600 if((hotspot > falloff) ||
601 (hotspot < 0.0) || (falloff < 0.0) ||
602 (OdaToDegree(hotspot) > 160.0) || (OdaToDegree(falloff) > 160.0))
603 return false;
604 m_dHotspot = hotspot;
605 m_dFalloff = falloff;
606 return true;
607}
608
616{
617 OdGeVector3d m_direction;
618 // Photometric data
619 double m_dPhysIntensity;
620 OdGiColorRGB m_lampColor;
621 //OdGiSkyParameters m_skyParams; // Unused
622
623protected:
629
630public:
636 : m_dPhysIntensity(1500.0)
637 , m_lampColor(1.0, 1.0, 1.0)
638 {
640 }
641
648 OdGeVector3d direction() const { return m_direction; }
649
655 void setDirection(const OdGeVector3d& dir) { m_direction = dir; }
656
663 bool isSunlight() const { return GETBIT(m_uFlags, kFlagIsSunlight); }
664
670 void setSunlight(bool val) { SETBIT(m_uFlags, kFlagIsSunlight, val); }
671
678 double physicalIntensity() const { return m_dPhysIntensity; }
679
685 void setPhysicalIntensity(double intensity) { m_dPhysIntensity = intensity; }
686
693 OdGiColorRGB lampColor() const { return m_lampColor; }
694
700 void setLampColor(const OdGiColorRGB& color) { m_lampColor = color; }
701
705 void skyParameters(OdGiSkyParameters & /*params*/) const { /*params = m_skyParams;*/ }
706
710 void setSkyParameters(const OdGiSkyParameters & /*params*/) { /*m_skyParams = params;*/ }
711
717 void save(OdGsFiler *pFiler) const {
719 pFiler->wrVector3d(direction());
720 pFiler->wrBool(isSunlight());
721 pFiler->wrDouble(physicalIntensity());
722 pFiler->wrDouble(m_lampColor.red);
723 pFiler->wrDouble(m_lampColor.green);
724 pFiler->wrDouble(m_lampColor.blue);
725 }
726
732 void load(OdGsFiler *pFiler) {
734 pFiler->rdVector3d(m_direction);
735 setSunlight(pFiler->rdBool());
737 m_lampColor.red = pFiler->rdDouble();
738 m_lampColor.green = pFiler->rdDouble();
739 m_lampColor.blue = pFiler->rdDouble();
740 }
741};
742
748{
749 OdString m_webFile;
750 OdStreamBufPtr m_pWebStream;
751 OdGeVector3d m_webRotate;
752 double m_dFlux;
755
756protected:
762
763public:
769 , m_dFlux(0.0)
770 , m_webFileType(OdGiWebLightTraits::kTypeA)
771 , m_webSymmetry(OdGiWebLightTraits::kNoSymmetry)
772 {
774 }
775
779 const OdString &webFile() const { return m_webFile; }
780
786 void setWebFile(const OdString &fileName) { m_webFile = fileName; }
787
793 virtual void setWebFileStream(OdStreamBufPtr& pWebStream)
794 {
795 if (!m_pWebStream.isNull())
796 m_pWebStream.release();
797 m_pWebStream = pWebStream;
798 };
799
803 virtual OdStreamBufPtr webFileStream() const { return m_pWebStream; };
804
805
809 const OdGeVector3d& webRotation() const { return m_webRotate; }
810
817 void setWebRotation(const OdGeVector3d& rot) { m_webRotate = rot; }
818
819
823 double webFlux() const { return m_dFlux; }
824
830 void setWebFlux(double flux) { m_dFlux = flux; }
831
832
836 OdGiWebLightTraits::WebFileType webFileType() const { return m_webFileType; }
837
844
845
849 OdGiWebLightTraits::WebSymmetry webSymmetry() const { return m_webSymmetry; }
850
856 void setWebSymmetry(OdGiWebLightTraits::WebSymmetry sym) { m_webSymmetry = sym; }
857
865
872
878 inline void save(OdGsFiler *pFiler) const {
880 pFiler->wrString(webFile());
881 pFiler->wrVector3d(webRotation());
882 pFiler->wrDouble(webFlux());
883 pFiler->wrUInt8((OdUInt8)webFileType());
884 pFiler->wrUInt8((OdUInt8)webSymmetry());
885 pFiler->wrBool(webHorzAng90to270());
886 OdStreamBufPtr pWebFileStream = webFileStream();
887 if (pWebFileStream.isNull())
888 {
889 pFiler->wrBool(false);
890 }
891 else
892 {
893 pFiler->wrBool(true);
894 pWebFileStream->rewind();
895 OdUInt32 dataLength = (OdUInt32)pWebFileStream->length();
897 data.resize(dataLength);
898 pWebFileStream->getBytes(data.asArrayPtr(), dataLength);
899 pFiler->wrInt64((OdInt64)dataLength);
900 pFiler->wrRawData(data.asArrayPtr(), dataLength);
901 }
902 }
903
909 inline void load(OdGsFiler *pFiler) {
911 pFiler->rdString(m_webFile);
912 pFiler->rdVector3d(m_webRotate);
913 setWebFlux(pFiler->rdDouble());
916 setWebHorzAng90to270(pFiler->rdBool());
917 if (pFiler->rdBool())
918 {
919 OdUInt32 dataLength = (OdUInt32)pFiler->rdInt64();
921 data.resize(dataLength);
922 pFiler->rdRawData(data.asArrayPtr(), dataLength);
923 OdStreamBufPtr pWebStream = OdMemoryStream::createNew(dataLength);
924 pWebStream->putBytes(data.asArrayPtr(), dataLength);
925 setWebFileStream(pWebStream);
926 }
927 }
928};
929
931{
932 switch(pLightTraits->type())
933 {
935 delete static_cast<OdGiDistantLightTraitsData*>(pLightTraits);
936 break;
938 delete static_cast<OdGiPointLightTraitsData*>(pLightTraits);
939 break;
941 delete static_cast<OdGiSpotLightTraitsData*>(pLightTraits);
942 break;
944 delete static_cast<OdGiWebLightTraitsData*>(pLightTraits);
945 break;
946 default:
947 {
949 }
950 break;
951 }
952}
953
959{
960 OdUInt32 m_nViewportId;
961 OdDbStub* m_pViewportObjectId;
962 bool m_bVpDepOn;
963 double m_dVpDepDimming;
964
965public:
966
971 m_nViewportId( 0 ),
972 m_pViewportObjectId( NULL ),
973 m_bVpDepOn( false ),
974 m_dVpDepDimming( 0.0 )
975 {
976 }
977
981 OdUInt32 viewportId() const { return m_nViewportId; }
982
988 void setViewportId( OdUInt32 id ) { m_nViewportId = id; }
989
990
994 OdDbStub* viewportObjectId() const { return m_pViewportObjectId; }
995
1001 void setViewportObjectId( OdDbStub* id ) { m_pViewportObjectId = id; }
1002
1003
1010 bool vpDepOn() const { return m_bVpDepOn; }
1011
1017 void setVpDepOn( bool on ) { m_bVpDepOn = on; }
1018
1019 double vpDepDimming() const { return m_dVpDepDimming; }
1020 void setVpDepDimming( double dimming ) { m_dVpDepDimming = dimming; }
1021
1027 inline void save(OdGsFiler *pFiler) const {
1029 pFiler->wrBool( vpDepOn() );
1030 pFiler->wrDouble( vpDepDimming() );
1031 pFiler->wrUInt32( viewportId() );
1032 pFiler->wrHandle( viewportObjectId() );
1033 }
1034
1040 inline void load(OdGsFiler *pFiler) {
1042 setVpDepOn( pFiler->rdBool() );
1043 setVpDepDimming( pFiler->rdDouble() );
1044 setViewportId( pFiler->rdUInt32() );
1045 setViewportObjectId( pFiler->rdHandle() );
1046 }
1047};
1048
1049template <class LightTraitsDataType>
1050inline void transformLightTraitsDataPosition(LightTraitsDataType &traitsData, const OdGeMatrix3d &modelTransform)
1051{
1052 OdGePoint3d newPos(traitsData.position());
1053 newPos.transformBy(modelTransform);
1054 traitsData.setPosition(newPos);
1055 traitsData.addLightTransform(modelTransform);
1056}
1057// For Point and Web lights
1058template <class LightTraitsDataType>
1059inline void transformLightTraitsData(LightTraitsDataType &traitsData, const OdGeMatrix3d &modelTransform)
1060{
1061 transformLightTraitsDataPosition(traitsData, modelTransform);
1062 if (traitsData.hasTarget())
1063 {
1064 OdGePoint3d newTarget = traitsData.targetLocation();
1065 newTarget.transformBy(modelTransform);
1066 traitsData.setTargetLocation(newTarget);
1067 }
1068}
1069// Specialization for Spot lights
1070template <>
1072{
1073 transformLightTraitsDataPosition(traitsData, modelTransform);
1074 OdGePoint3d newTarget = traitsData.target();
1075 newTarget.transformBy(modelTransform);
1076 traitsData.setTarget(newTarget);
1077}
1078// Specialization for Direction lights
1079template <>
1081{
1082 OdGeVector3d newDirection = traitsData.direction();
1083 newDirection.transformBy(modelTransform);
1084 traitsData.setDirection(newDirection);
1085 traitsData.addLightTransform(modelTransform);
1086}
1087
1088#include "TD_PackPop.h"
1089
1090#endif // __OD_GI_LIGHT_TRAITS_DATA__
OdSmartPtr< OdStreamBuf > OdStreamBufPtr
#define ODA_FAIL_ONCE()
Definition DebugStuff.h:89
false
Definition DimVarDefs.h:165
void transformLightTraitsData(LightTraitsDataType &traitsData, const OdGeMatrix3d &modelTransform)
void transformLightTraitsData< OdGiDistantLightTraitsData >(OdGiDistantLightTraitsData &traitsData, const OdGeMatrix3d &modelTransform)
void transformLightTraitsData< OdGiSpotLightTraitsData >(OdGiSpotLightTraitsData &traitsData, const OdGeMatrix3d &modelTransform)
void transformLightTraitsDataPosition(LightTraitsDataType &traitsData, const OdGeMatrix3d &modelTransform)
unsigned int OdUInt32
unsigned char OdUInt8
#define OdaToDegree(rad)
Definition OdaCommon.h:60
#define SETBIT(flags, bit, value)
Definition OdaDefs.h:516
#define SETBIT_0(flags, bit)
Definition OdaDefs.h:519
#define GETBIT(flags, bit)
Definition OdaDefs.h:517
bool isNull() const
void setColor(OdUInt32 color)
static GE_STATIC_EXPORT const OdGeMatrix3d kIdentity
Definition GeMatrix3d.h:97
OdGePoint3d & transformBy(const OdGeMatrix3d &xfm)
OdGeVector3d & transformBy(const OdGeMatrix3d &xfm)
void skyParameters(OdGiSkyParameters &) const
OdGiColorRGB lampColor() const
OdGeVector3d direction() const
void setDirection(const OdGeVector3d &dir)
void setPhysicalIntensity(double intensity)
void setLampColor(const OdGiColorRGB &color)
void setSkyParameters(const OdGiSkyParameters &)
void save(OdGsFiler *pFiler) const
void load(OdGsFiler *pFiler)
virtual DrawableType drawableType() const
Definition GiDrawable.h:116
void save(OdGsFiler *pFiler) const
void addLightTransform(const OdGeMatrix3d &xForm)
void setOn(bool value)
void save(OdGsFiler *pFiler) const
void load(OdGsFiler *pFiler)
void setColor(const OdCmEntityColor &color)
void setShadowParameters(const OdGiShadowParameters &params)
const OdGeMatrix3d & lightTransformationMatrix() const
static void deleteLightTraitsData(OdGiLightTraitsData *pLightTraits)
LightType type() const
static LightType drawableLightType(const OdGiDrawable *pDrawable)
OdCmEntityColor color() const
void setLightTransform(const OdGeMatrix3d &xForm)
void setIntensity(double dIntensity)
bool isLightTransformed() const
OdGiShadowParameters shadowParameters() const
void setViewportObjectId(OdDbStub *id)
void load(OdGsFiler *pFiler)
OdDbStub * viewportObjectId() const
void save(OdGsFiler *pFiler) const
void setVpDepDimming(double dimming)
void setViewportId(OdUInt32 id)
void save(OdGsFiler *pFiler) const
void setLampColor(const OdGiColorRGB &color)
void setPhysicalIntensity(double intensity)
void setTargetLocation(const OdGePoint3d &loc)
void load(OdGsFiler *pFiler)
void setAttenuation(const OdGiLightAttenuation &atten)
OdGePoint3d position() const
OdGePoint3d targetLocation() const
void setHemisphericalDistribution(bool bHemisphere)
OdGiColorRGB lampColor() const
void setPosition(const OdGePoint3d &pos)
OdGiLightAttenuation attenuation() const
void setHasTarget(bool bTarget)
void save(OdGsFiler *pFiler) const
OdGiColorRGB lampColor() const
OdGiLightAttenuation attenuation() const
void setPosition(const OdGePoint3d &pos)
OdGePoint3d target() const
void setLampColor(const OdGiColorRGB &color)
void load(OdGsFiler *pFiler)
OdGePoint3d position() const
void setAttenuation(const OdGiLightAttenuation &atten)
bool setHotspotAndFalloff(double hotSpot, double falloff)
void setTarget(const OdGePoint3d &trg)
void setPhysicalIntensity(double intensity)
void setWebHorzAng90to270(bool bHA)
OdGiWebLightTraits::WebSymmetry webSymmetry() const
void setWebSymmetry(OdGiWebLightTraits::WebSymmetry sym)
void setWebFileType(OdGiWebLightTraits::WebFileType type)
void load(OdGsFiler *pFiler)
const OdGeVector3d & webRotation() const
void setWebFlux(double flux)
virtual OdStreamBufPtr webFileStream() const
OdGiWebLightTraits::WebFileType webFileType() const
const OdString & webFile() const
virtual void setWebFileStream(OdStreamBufPtr &pWebStream)
void save(OdGsFiler *pFiler) const
void setWebRotation(const OdGeVector3d &rot)
void setWebFile(const OdString &fileName)
virtual void wrPoint3d(const OdGePoint3d &pt)
virtual void wrDouble(double val)
virtual void wrInt64(OdInt64 val)
virtual void rdMatrix3d(OdGeMatrix3d &mat) const
virtual void rdVector3d(OdGeVector3d &vec) const
virtual void wrString(const OdString &str)
virtual OdUInt8 rdUInt8() const
virtual void wrHandle(OdDbStub *pHandle)=0
virtual void wrUInt8(OdUInt8 val)
virtual void wrRawData(const void *pData, OdUInt32 nDataSize)=0
virtual bool rdBool() const
virtual OdDbStub * rdHandle() const =0
virtual void rdPoint3d(OdGePoint3d &pt) const
virtual void wrBool(bool bVal)
virtual void rdString(OdString &str) const
virtual void wrMatrix3d(const OdGeMatrix3d &mat)
virtual void rdRawData(void *pData, OdUInt32 nDataSize) const =0
virtual OdUInt32 rdUInt32() const
virtual OdInt64 rdInt64() const
virtual void wrVector3d(const OdGeVector3d &vec)
virtual double rdDouble() const
virtual void wrUInt32(OdUInt32 val)
static OdMemoryStreamPtr createNew(OdUInt32 pageDataSize=0x800)
virtual void rewind()
virtual OdUInt64 length()
virtual void getBytes(void *buffer, OdUInt32 numBytes)
virtual void putBytes(const void *buffer, OdUInt32 numBytes)
GLenum GLint * params
Definition gles2_ext.h:184
GLint GLenum GLsizei GLsizei GLint GLsizei const void * data
Definition gles2_ext.h:110
GLsizei const GLfloat * value
Definition gles2_ext.h:302