OpenBarnyard
 
Loading...
Searching...
No Matches
AGlowViewport.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "AGlowViewport.h"
4
6
7//-----------------------------------------------------------------------------
8// Enables memory debugging.
9// Note: Should be the last include!
10//-----------------------------------------------------------------------------
11#include <Core/TMemoryDebugOn.h>
12
14
15AGlowViewport::AGlowViewport( TINT a_iMaxNumGlowObjects )
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}
35
37{
38 delete[] m_pAllocObjects;
39}
40
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}
60
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}
96
97void AGlowViewport::GetInfluencingLightIDs( const TSphere& a_rcSphere, TLightIDList& a_rLightIDs )
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}
117
119{
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}
214
216{
217 Unknown1 = 0;
219 m_iAttachBone = -1;
221
224
225 TRenderContext::VIEWPORTPARAMS oViewportParams;
226 oViewportParams.fX = 0.0f;
227 oViewportParams.fY = 0.0f;
228 oViewportParams.fMinZ = 0.0f;
229 oViewportParams.fMaxZ = 1.0f;
230 oViewportParams.fWidth = 1.0f;
231 oViewportParams.fHeight = 1.0f;
232
233 TRenderContext::PROJECTIONPARAMS oProjectionParams;
234 oProjectionParams.SetFromFOV(
235 oViewportParams.fWidth,
236 oViewportParams.fHeight,
237 TMath::DegToRad( 45.0f ),
238 0.1f,
239 30.0f
240 );
241
242 Setup( TMatrix44::IDENTITY, oViewportParams, oProjectionParams, TRenderContext::CameraMode_Perspective );
243}
244
245void AGlowViewport::GlowObject::Setup( const Toshi::TMatrix44& a_rcTransform, const Toshi::TRenderContext::VIEWPORTPARAMS& a_rcViewportParams, const Toshi::TRenderContext::PROJECTIONPARAMS& a_rcProjectionParams, Toshi::TRenderContext::CameraMode a_eCameraMode )
246{
247 m_oViewportParams = a_rcViewportParams;
248 m_oProjectionParams = a_rcProjectionParams;
249 m_eCameraMode = a_eCameraMode;
250
251 TMatrix44 oProjection;
252 TFrustum oFrustum;
253
254 if ( a_eCameraMode == TRenderContext::CameraMode_Orthographic )
255 {
256 TRenderContext::ComputeOrthographicProjection( oProjection, a_rcViewportParams, a_rcProjectionParams );
257 TRenderContext::ComputeOrthographicFrustum( oFrustum, a_rcViewportParams, a_rcProjectionParams );
258 }
259 else
260 {
261 TRenderContext::ComputePerspectiveProjection( oProjection, a_rcViewportParams, a_rcProjectionParams );
262 TRenderContext::ComputePerspectiveFrustum( oFrustum, a_rcViewportParams, a_rcProjectionParams );
263 }
264
265 TMatrix44 oTransformInverted;
266 oTransformInverted.Invert( a_rcTransform );
267
268 for ( TINT i = 0; i < WORLDPLANE_NUMOF; i++ )
269 {
270 TMatrix44::TransformPlaneOrthogonal( m_oFrustum[ i ], oTransformInverted, oFrustum[ i ] );
271 }
272
273 m_oMVP.Multiply( oProjection, a_rcTransform );
274}
@ BASISVECTOR_RIGHT
Definition TMatrix44.h:25
@ BASISVECTOR_UP
Definition TMatrix44.h:26
@ BASISVECTOR_FORWARD
Definition TMatrix44.h:27
TPlane[WORLDPLANE_NUMOF] TFrustum
TINT8 TLightID
@ WORLDPLANE_NUMOF
Rendering system interface for the Toshi engine.
#define TASSERT(X,...)
Definition Defines.h:138
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TTRUE
Definition Typedefs.h:25
TFORCEINLINE constexpr TFLOAT DegToRad(TFLOAT fDeg)
Definition TMathInline.h:64
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
static void TransformPlaneOrthogonal(TPlane &a_rOutPlane, const TMatrix44 &a_rMatrix, const TPlane &a_rcSourcePlane)
Definition TMatrix44.h:239
TBOOL Invert(const TMatrix44 &a_rRight)
Definition TMatrix44.cpp:88
static constinit TMatrix44 IDENTITY
Definition TMatrix44.h:357
void InvertOrthogonal()
TVector4 & GetTranslation()
Definition TMatrix44.h:157
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
TVector3 & AsVector3()
Definition TVector4.h:321
static void Swap(TVector4 &a_rVec1, TVector4 &a_rVec2)
Definition TVector4.h:350
constexpr void Negate3(const TVector4 &vec)
Definition TVector4.h:265
void Normalise()
Definition TVector4.cpp:36
TSkeletonInstance * GetSkeletonInstance() const
Definition TModel.cpp:337
static constexpr TINT MAX_NUM_LIGHTS
static TBOOL CullSphereToFrustumSimple(const TSphere &a_rSphere, const TPlane *a_pPlanes, TINT a_iNumPlanes)
static void ComputeOrthographicFrustum(TFrustum &a_rcFrustum, const VIEWPORTPARAMS &a_rViewportParams, const PROJECTIONPARAMS &a_rProjParams)
static void ComputeOrthographicProjection(TMatrix44 &a_rOutProjection, const VIEWPORTPARAMS &a_rViewportParams, const PROJECTIONPARAMS &a_rProjParams)
void AddLight(TLightID a_iLightId)
static void ComputePerspectiveProjection(TMatrix44 &a_rOutProjection, const VIEWPORTPARAMS &a_rViewportParams, const PROJECTIONPARAMS &a_rProjParams)
static void ComputePerspectiveFrustum(TFrustum &a_rcFrustum, const VIEWPORTPARAMS &a_rViewportParams, const PROJECTIONPARAMS &a_rProjParams)
void SetFromFOV(TFLOAT a_fViewportWidth, TFLOAT a_fViewportHeight, TFLOAT a_fFOV, TFLOAT a_fNearPlane, TFLOAT a_fFarPlane)
TRenderContext * GetCurrentContext() const
const TMatrix44 & GetBoneTransformCurrent(TINT a_iBone)
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49
void RemoveGlowObject(GlowObject *a_pGlowObject)
void GetInfluencingLightIDs(const Toshi::TSphere &a_rcSphere, Toshi::TLightIDList &a_rLightIDs)
AGlowViewport(TINT a_iMaxNumGlowingObjects)
GlowObject * CreateGlowObject()
Toshi::TFrustum m_oFrustum
Toshi::TMatrix44 m_oMVP
Toshi::TRenderContext::VIEWPORTPARAMS m_oViewportParams
void Setup(const Toshi::TMatrix44 &a_rcTransform, const Toshi::TRenderContext::VIEWPORTPARAMS &a_rcViewportParams, const Toshi::TRenderContext::PROJECTIONPARAMS &a_rcProjectionParams, Toshi::TRenderContext::CameraMode a_eCameraMode)
Toshi::TRenderContext::PROJECTIONPARAMS m_oProjectionParams
Toshi::TMatrix44 m_oTransform
Toshi::TSceneObject * m_pSceneObject
Toshi::TRenderContext::CameraMode m_eCameraMode