OpenBarnyard
 
Loading...
Searching...
No Matches
AGlowViewport Class Reference

#include <AGlowViewport.h>

Inheritance diagram for AGlowViewport:

Classes

class  GlowObject
 

Public Member Functions

 AGlowViewport (TINT a_iMaxNumGlowingObjects)
 
 ~AGlowViewport ()
 
GlowObjectCreateGlowObject ()
 
void RemoveGlowObject (GlowObject *a_pGlowObject)
 
void GetInfluencingLightIDs (const Toshi::TSphere &a_rcSphere, Toshi::TLightIDList &a_rLightIDs)
 
void Update ()
 

Detailed Description

Definition at line 9 of file AGlowViewport.h.

Constructor & Destructor Documentation

◆ AGlowViewport()

AGlowViewport::AGlowViewport ( TINT a_iMaxNumGlowingObjects)

Definition at line 15 of file AGlowViewport.cpp.

16 : m_iMaxNumObjects( a_iMaxNumGlowObjects ), m_pHeadFreeObject( TNULL )
17{
18 TASSERT( a_iMaxNumGlowObjects < ( 1 << 8 * sizeof( TLightID ) ) - 1 );
19 m_pAllocObjects = new GlowObject[ a_iMaxNumGlowObjects ];
20
21 // Initialise all objects except the last one
22 for ( TLightID i = 0; i < a_iMaxNumGlowObjects - 1; i++ )
23 {
24 m_pAllocObjects[ i ].m_iID = i;
25 m_pAllocObjects[ i ].m_pNextObject = &m_pAllocObjects[ i + 1 ];
26 }
27
28 // Initialise the last object
29 m_pAllocObjects[ a_iMaxNumGlowObjects - 1 ].m_iID = a_iMaxNumGlowObjects - 1;
30 m_pAllocObjects[ a_iMaxNumGlowObjects - 1 ].m_pNextObject = TNULL;
31
32 m_pHeadUsedObject = TNULL;
33 m_pHeadFreeObject = m_pAllocObjects;
34}
TINT8 TLightID
#define TASSERT(X,...)
Definition Defines.h:138
#define TNULL
Definition Typedefs.h:23

◆ ~AGlowViewport()

AGlowViewport::~AGlowViewport ( )

Definition at line 36 of file AGlowViewport.cpp.

37{
38 delete[] m_pAllocObjects;
39}

Member Function Documentation

◆ CreateGlowObject()

AGlowViewport::GlowObject * AGlowViewport::CreateGlowObject ( )

Definition at line 41 of file AGlowViewport.cpp.

42{
43 if ( m_pHeadFreeObject == TNULL )
44 return TNULL;
45
46 // Get the glow object to return
47 GlowObject* pGlowObject = m_pHeadFreeObject;
48
49 // Update head free object
50 m_pHeadFreeObject = pGlowObject->m_pNextObject;
51
52 // Update it's next object to be the one that was previously created
53 pGlowObject->m_pNextObject = m_pHeadUsedObject;
54
55 // Update head used object
56 m_pHeadUsedObject = pGlowObject;
57
58 return pGlowObject;
59}

◆ GetInfluencingLightIDs()

void AGlowViewport::GetInfluencingLightIDs ( const Toshi::TSphere & a_rcSphere,
Toshi::TLightIDList & a_rLightIDs )

Definition at line 97 of file AGlowViewport.cpp.

98{
99 a_rLightIDs.Reset();
100
101 TINT iNumLights = 0;
102 for ( GlowObject* pGlowObject = m_pHeadUsedObject; pGlowObject != TNULL; pGlowObject = pGlowObject->m_pNextObject )
103 {
104 // Check if the object is enabled, visible and affects the sphere
105 if ( pGlowObject->IsEnabled() &&
106 ( pGlowObject->IsNightLight() || AGameTimeManager::GetSingleton()->IsItNight() ) &&
107 TRenderContext::CullSphereToFrustumSimple( a_rcSphere, pGlowObject->m_oFrustum, WORLDPLANE_NUMOF ) )
108 {
109 // The object is influencing the specified sphere
110 a_rLightIDs[ iNumLights++ ] = pGlowObject->m_iID;
111
112 if ( iNumLights >= TLightIDList::MAX_NUM_LIGHTS )
113 return;
114 }
115 }
116}
@ WORLDPLANE_NUMOF
int TINT
Definition Typedefs.h:7
static constexpr TINT MAX_NUM_LIGHTS
static TBOOL CullSphereToFrustumSimple(const TSphere &a_rSphere, const TPlane *a_pPlanes, TINT a_iNumPlanes)

◆ RemoveGlowObject()

void AGlowViewport::RemoveGlowObject ( GlowObject * a_pGlowObject)

Definition at line 61 of file AGlowViewport.cpp.

62{
63 if ( a_pGlowObject == TNULL )
64 return;
65
66 TASSERT( m_pHeadUsedObject != TNULL );
67
68 GlowObject* pPrevObject = TNULL;
69 GlowObject* pGlowObject = m_pHeadUsedObject;
70 for ( ; pGlowObject != TNULL; pGlowObject = pGlowObject->m_pNextObject )
71 {
72 if ( pGlowObject == a_pGlowObject )
73 break;
74
75 pPrevObject = pGlowObject;
76 }
77
78 // Verificate we found the needed object
79 TASSERT( pGlowObject == a_pGlowObject );
80
81 if ( pPrevObject != TNULL )
82 {
83 // Removing some linked object
84 pPrevObject->m_pNextObject = pGlowObject->m_pNextObject;
85 pGlowObject->m_pNextObject = m_pHeadFreeObject;
86 m_pHeadFreeObject = pGlowObject;
87 }
88 else
89 {
90 // Removing head object
91 m_pHeadUsedObject = m_pHeadUsedObject->m_pNextObject;
92 pGlowObject->m_pNextObject = m_pHeadFreeObject;
93 m_pHeadFreeObject = pGlowObject;
94 }
95}

◆ Update()

void AGlowViewport::Update ( )

Definition at line 118 of file AGlowViewport.cpp.

119{
120 TRenderContext* pRenderContext = TRenderInterface::GetSingleton()->GetCurrentContext();
121
122 // Clear list of visible lights
123 pRenderContext->ClearLightIDs();
124
125 // Update the used glow objects and add lights to the render context if necessary
126 for ( GlowObject* pGlowObject = m_pHeadUsedObject; pGlowObject != TNULL; pGlowObject = pGlowObject->m_pNextObject )
127 {
128 if ( TSceneObject* pSceneObject = pGlowObject->m_pSceneObject )
129 {
130 // Set light at bone position and add it to the render context
131 TModelInstance* pModelInstance = pSceneObject->GetInstance();
132
133 if ( !pModelInstance )
134 continue;
135
136 TSkeletonInstance* pSkeletonInstance = pModelInstance->GetSkeletonInstance();
137
138 // Get local bone transform
139 TMatrix44 oBoneTransform;
140 pSkeletonInstance->GetBoneTransformCurrent( pGlowObject->m_iAttachBone, oBoneTransform );
141
142 // Get model instance transform to calculate world bone transform later
143 TMatrix44 oLightTransform;
144 pSceneObject->GetTransform().GetLocalMatrixImp( oLightTransform );
145
146 // Get world bone transform
147 oLightTransform.Multiply( oBoneTransform );
148
149 // Swap forward and up axes
150 TVector4 vNewForwardVec = oLightTransform.AsBasisVector4( BASISVECTOR_UP );
151 vNewForwardVec.Negate4();
152
153 oLightTransform.AsBasisVector4( BASISVECTOR_UP ) = oLightTransform.AsBasisVector4( BASISVECTOR_FORWARD );
154 oLightTransform.AsBasisVector4( BASISVECTOR_FORWARD ) = vNewForwardVec;
155
156 // Append glow object's transform
157 oLightTransform.Multiply( pGlowObject->m_oTransform );
158
159 switch ( pGlowObject->m_eTransformType )
160 {
161 case -3:
162 oLightTransform.Scale( -1.0f, -1.0f, -1.0f );
163 break;
164 case -2:
165 oLightTransform.Scale( -1.0f, -1.0f, -1.0f );
166 case 1:
167 TVector4::Swap( oLightTransform.AsBasisVector4( BASISVECTOR_UP ), oLightTransform.AsBasisVector4( BASISVECTOR_FORWARD ) );
168 TVector4::Swap( oLightTransform.AsBasisVector4( BASISVECTOR_RIGHT ), oLightTransform.AsBasisVector4( BASISVECTOR_UP ) );
169 break;
170 case -1:
171 oLightTransform.Scale( -1.0f, -1.0f, -1.0f );
172 TVector4::Swap( oLightTransform.AsBasisVector4( BASISVECTOR_RIGHT ), oLightTransform.AsBasisVector4( BASISVECTOR_FORWARD ) );
173 TVector4::Swap( oLightTransform.AsBasisVector4( BASISVECTOR_RIGHT ), oLightTransform.AsBasisVector4( BASISVECTOR_UP ) );
174 break;
175 case 0:
176 TVector4::Swap( oLightTransform.AsBasisVector4( BASISVECTOR_RIGHT ), oLightTransform.AsBasisVector4( BASISVECTOR_FORWARD ) );
177 TVector4::Swap( oLightTransform.AsBasisVector4( BASISVECTOR_RIGHT ), oLightTransform.AsBasisVector4( BASISVECTOR_UP ) );
178 break;
179 }
180
181 // Set the transform to the glow object
182 oLightTransform.InvertOrthogonal();
183 pGlowObject->Setup( oLightTransform, pGlowObject->m_oViewportParams, pGlowObject->m_oProjectionParams, pGlowObject->m_eCameraMode );
184
185 // Finally, add light to the context
186 pRenderContext->AddLight( pGlowObject->m_iID );
187 }
188 else
189 {
190 // Set position of this light far away because no model is bound to the object
191 TVector4 vLightDir( 1.0f, -1.1f, 0.0f );
192 vLightDir.Normalise();
193 vLightDir.Negate3();
194
195 TQuaternion qLightRot;
196 qLightRot.SetVectorDirection( vLightDir.AsVector3(), TVector3::VEC_POSZ );
197
198 TVector4 vLightPos = vLightDir;
199 vLightPos.Negate3();
200 vLightPos *= 100.0f;
201
202 TMatrix44 oMVP(
203 1.0f, 0.0f, 0.0f, 0.0f,
204 0.0f, 0.0f, 1.0f, 0.0f,
205 0.0f, -1.0f, 0.0f, 0.0f,
206 0.0f, 0.0f, 0.0f, 1.0f
207 );
208
209 TMatrix44::TransformVector( oMVP.GetTranslation(), oMVP, vLightPos );
210 pGlowObject->m_oMVP = oMVP;
211 }
212 }
213}
@ BASISVECTOR_RIGHT
Definition TMatrix44.h:25
@ BASISVECTOR_UP
Definition TMatrix44.h:26
@ BASISVECTOR_FORWARD
Definition TMatrix44.h:27
static constexpr void TransformVector(TVector3 &a_rOutVector, const TMatrix44 &a_rMatrix, const TVector3 &a_rVector)
Definition TMatrix44.h:280
constexpr void Scale(TFLOAT a_fScalar1, TFLOAT a_fScalar2, TFLOAT a_fScalar3)
Definition TMatrix44.h:176
void InvertOrthogonal()
const TVector4 & AsBasisVector4(BASISVECTOR a_iIndex) const
Definition TMatrix44.h:131
void Multiply(const TMatrix44 &a_rLeft, const TMatrix44 &a_rRight)
Definition TMatrix44.cpp:61
void SetVectorDirection(const TVector3 &a_rVec3, const TVector3 &a_rVec3_2)
static constinit const TVector3 VEC_POSZ
Definition TVector3.h:153
constexpr void Negate4(const TVector4 &vec)
Definition TVector4.h:274
static void Swap(TVector4 &a_rVec1, TVector4 &a_rVec2)
Definition TVector4.h:350
constexpr void Negate3(const TVector4 &vec)
Definition TVector4.h:265
TSkeletonInstance * GetSkeletonInstance() const
Definition TModel.cpp:337
void AddLight(TLightID a_iLightId)
TRenderContext * GetCurrentContext() const
const TMatrix44 & GetBoneTransformCurrent(TINT a_iBone)
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49

The documentation for this class was generated from the following files: