OpenBarnyard
 
Loading...
Searching...
No Matches
AWorldMaterial_DX8.cpp
Go to the documentation of this file.
1#include "pch.h"
3#include "AWorldShader_DX8.h"
4
5#include <Toshi/TScheduler.h>
10
11//-----------------------------------------------------------------------------
12// Enables memory debugging.
13// Note: Should be the last include!
14//-----------------------------------------------------------------------------
15#include <Core/TMemoryDebugOn.h>
16
18
20
22{
23 m_pAlphaBlendMaterial = TNULL;
24 m_pAssignedOrderTable = TNULL;
25
26 for ( TUINT i = 0; i < MAX_TEXTURES; i++ )
27 {
28 m_aHasUVOffsets[ i ] = TFALSE;
29 m_aUVOffsetsX[ i ] = 0.0f;
30 m_aUVOffsetsY[ i ] = 0.0f;
31 }
32}
33
35{
36 if ( m_pRegMaterial )
37 {
38 TOrderTable::DeregisterMaterial( m_pRegMaterial );
39 }
40
41 if ( m_pAlphaBlendMaterial )
42 {
43 delete m_pAlphaBlendMaterial;
44 }
45}
46
48{
49 if ( m_pAssignedOrderTable != TNULL )
50 {
51 TOrderTable::DeregisterMaterial( m_pRegMaterial );
52 m_pAssignedOrderTable = TNULL;
53 }
54
55 BaseClass::OnDestroy();
56}
57
59{
60 auto pRenderInterface = TRenderD3DInterface::Interface();
61 auto pD3DDevice = pRenderInterface->GetDirect3DDevice();
62
64
65 // Setup textures
66 for ( TUINT i = 0; i < TARRAYSIZE( m_aTextures ); i++ )
67 {
68 auto pTexture = TDYNAMICCAST( TTextureResourceHAL, m_aTextures[ i ] );
69
70 if ( pTexture == TNULL )
71 {
72 pD3DDevice->SetTexture( i, NULL );
73 }
74 else
75 {
76 pTexture->Validate();
77 auto pD3DTexture = pTexture->GetD3DTexture();
78
79 if ( pD3DTexture )
80 {
81 pD3DDevice->SetTexture( i, pD3DTexture );
82 pD3DDevice->SetTextureStageState( i, D3DTSS_MIPFILTER, 2 );
83 pD3DDevice->SetTextureStageState( i, D3DTSS_MINFILTER, 2 );
84 pD3DDevice->SetTextureStageState( i, D3DTSS_MAGFILTER, 2 );
85 pRenderInterface->SetTextureAddress( i, pTexture->GetAddressUState(), TEXCOORD_U );
86 pRenderInterface->SetTextureAddress( i, pTexture->GetAddressVState(), TEXCOORD_V );
87 }
88 }
89 }
90
91 if ( m_iNumTex > 1 )
92 {
93 pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, 0xd );
94 pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, 2 );
95 pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, 1 );
96 pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, 0xd );
97 pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, 2 );
98 pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, 1 );
99 pD3DDevice->SetTextureStageState( 2, D3DTSS_COLOROP, 1 );
100 pD3DDevice->SetTextureStageState( 2, D3DTSS_ALPHAOP, 1 );
101 }
102
103 // Animate UV
104 TFLOAT fDeltaTime = g_oSystemManager.GetScheduler()->GetCurrentDeltaTime();
105 m_fUVAnimX += fDeltaTime * m_fUVAnimSpeedX;
106 m_fUVAnimY += fDeltaTime * m_fUVAnimSpeedY;
107
108 // Make sure value of m_fUVAnimX is in [-1; 1] range so we won't overflow
109 if ( m_fUVAnimX <= 1.0f )
110 {
111 if ( m_fUVAnimX < -1.0f && !isnan( m_fUVAnimX ) )
112 {
113 m_fUVAnimX += 1.0f;
114 }
115 }
116 else
117 {
118 m_fUVAnimX -= 1.0f;
119 }
120
121 // Make sure value of m_fUVAnimY is in [-1; 1] range so we won't overflow
122 if ( m_fUVAnimY <= 1.0f )
123 {
124 if ( m_fUVAnimY < -1.0f && !isnan( m_fUVAnimY ) )
125 {
126 m_fUVAnimY += 1.0f;
127 }
128 }
129 else
130 {
131 m_fUVAnimY -= 1.0f;
132 }
133
134 // Save current UV offset
135 m_aHasUVOffsets[ 0 ] = TTRUE;
136 m_aUVOffsetsX[ 0 ] = m_fUVAnimX;
137 m_aUVOffsetsY[ 0 ] = m_fUVAnimY;
138
139 SetupRenderer();
140}
141
143{
144 auto pRenderInterface = TRenderD3DInterface::Interface();
145 auto pCurrentContext = TRenderContextD3D::Upcast( pRenderInterface->GetCurrentContext() );
146 auto pD3DDevice = pRenderInterface->GetDirect3DDevice();
147
148 pD3DDevice->SetRenderState( D3DRS_COLORVERTEX, TRUE );
149 pD3DDevice->SetTexture( 0, NULL );
150 pD3DDevice->SetTexture( 1, NULL );
151 pD3DDevice->SetRenderState( D3DRS_ALPHAREF, 128 );
152 pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
153 pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
154
155 TDYNAMICCAST( AWorldShaderHAL, m_pShader )->SetAlphaRef( 128 );
156 pCurrentContext->DisableFogHAL();
157
158 if ( m_iNumTex > 1 )
159 {
160 pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, 1 );
161 pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, 1 );
162 }
163
165}
166
168{
169 SetBlendMode( a_eBlendMode );
170 return BaseClass::Create( a_eBlendMode );
171}
172
174{
175 auto pShader = TDYNAMICCAST( AWorldShaderHAL, m_pShader );
176
177 switch ( a_eBlendMode )
178 {
179 case 0:
180 SetOrderTable( pShader->GetOrderTable( 0 ) );
181 break;
182 case 1:
183 SetOrderTable( pShader->GetOrderTable( 2 ) );
184 break;
185 case 2:
186 SetOrderTable( pShader->GetOrderTable( 2 ) );
187 break;
188 case 3:
189 SetOrderTable( pShader->GetOrderTable( 3 ) );
190 break;
191 case 5:
192 SetOrderTable( pShader->GetOrderTable( 6 ) );
193 break;
194 case 6:
195 SetOrderTable( pShader->GetOrderTable( 4 ) );
196 break;
197 case 7:
198 SetOrderTable( pShader->GetOrderTable( 7 ) );
199 break;
200 default:
201 TASSERT( !"Invalid blend state" );
202 break;
203 }
204
205 BaseClass::SetBlendMode( a_eBlendMode );
206}
207
209{
210 if ( m_pAlphaBlendMaterial )
211 {
212 m_pAlphaBlendMaterial->m_iNumTex = m_iNumTex;
213 m_pAlphaBlendMaterial->m_aTextures[ 0 ] = m_aTextures[ 0 ];
214 m_pAlphaBlendMaterial->m_aTextures[ 1 ] = m_aTextures[ 1 ];
215 m_pAlphaBlendMaterial->m_aTextures[ 2 ] = m_aTextures[ 2 ];
216 m_pAlphaBlendMaterial->m_aTextures[ 3 ] = m_aTextures[ 3 ];
217
218 m_pAlphaBlendMaterial->SetFlags( FLAGS_BLENDING, TTRUE );
219 }
220}
221
222void AWorldMaterialHAL::SetOrderTable( Toshi::TOrderTable* a_pOrderTable )
223{
224 if ( a_pOrderTable != m_pAssignedOrderTable )
225 {
226 if ( m_pAssignedOrderTable )
227 {
228 TOrderTable::DeregisterMaterial( GetRegMaterial() );
229 }
230
231 if ( a_pOrderTable )
232 {
233 a_pOrderTable->RegisterMaterial( this );
234 }
235
236 m_pAssignedOrderTable = a_pOrderTable;
237 }
238}
239
240void AWorldMaterialHAL::SetupRenderer()
241{
242 // Upload UV offsets
243 TVector4 vOffsets( 0, 0, 0, 0 );
244
245 if ( m_aHasUVOffsets[ 0 ] )
246 {
247 vOffsets.x = m_aUVOffsetsX[ 0 ];
248 vOffsets.y = m_aUVOffsetsY[ 0 ];
249 }
250
251 if ( m_aHasUVOffsets[ 1 ] )
252 {
253 vOffsets.z = m_aUVOffsetsX[ 1 ];
254 vOffsets.w = m_aUVOffsetsY[ 1 ];
255 }
256
257 auto pRenderInterface = TRenderD3DInterface::Interface();
258 auto pCurrentContext = TRenderContextD3D::Upcast( pRenderInterface->GetCurrentContext() );
259 auto pD3DDevice = pRenderInterface->GetDirect3DDevice();
260 pD3DDevice->SetVertexShaderConstant( 7, &vOffsets, 1 );
261
262 // Setup render state for the selected blending state
263
264 switch ( m_eBlendMode )
265 {
266 case 1:
267 pD3DDevice->SetRenderState( D3DRS_SRCBLEND, 5 );
268 pD3DDevice->SetRenderState( D3DRS_DESTBLEND, 6 );
269 pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
270 break;
271 case 3:
272 pD3DDevice->SetRenderState( D3DRS_SRCBLEND, 5 );
273 pD3DDevice->SetRenderState( D3DRS_DESTBLEND, 2 );
274 pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
275 break;
276 default:
277 pD3DDevice->SetRenderState( D3DRS_SRCBLEND, 5 );
278 pD3DDevice->SetRenderState( D3DRS_DESTBLEND, 6 );
279 pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
280 break;
281 }
282
283 if ( m_Flags & FLAGS_BLENDING )
284 {
285 pD3DDevice->SetRenderState( D3DRS_ALPHAREF, 1 );
286 TDYNAMICCAST( AWorldShaderHAL, m_pShader )->SetAlphaRef( 1 );
287 }
288 else
289 {
290 pD3DDevice->SetRenderState( D3DRS_ALPHAREF, 128 );
291 TDYNAMICCAST( AWorldShaderHAL, m_pShader )->SetAlphaRef( 128 );
292 }
293
294 pD3DDevice->SetRenderState( D3DRS_COLORVERTEX, FALSE );
295 pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
296
297 if ( pCurrentContext->IsFogEnabled() )
298 {
299 pCurrentContext->EnableFogHAL();
300 }
301}
@ TEXCOORD_U
Definition TRender.h:30
@ TEXCOORD_V
Definition TRender.h:31
#define TASSERT(X,...)
Definition Defines.h:138
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TARRAYSIZE(ARRAY)
Definition Defines.h:70
#define TDYNAMICCAST(T, OBJECT)
Definition TObject.h:227
#define TDEFINE_CLASS(...)
Definition TObject.h:120
unsigned int TUINT
Definition Typedefs.h:8
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TSystemManager g_oSystemManager
Definition TSystem.cpp:15
static TRenderContextD3D * Upcast(TRenderContext *a_pRenderContext)
static TFORCEINLINE TRenderD3DInterface * Interface()
Gets the render interface singleton.
static void DeregisterMaterial(TRegMaterial *a_pRegMat)
void SetOrderTable(Toshi::TOrderTable *a_pOrderTable)
virtual TBOOL Create(BLENDMODE a_eBlendMode) override
virtual void PreRender() override
virtual void CopyToAlphaBlendMaterial()
virtual void SetBlendMode(BLENDMODE a_eBlendMode) override
virtual void PostRender() override
virtual void OnDestroy() override
static TUINT s_RenderStateFlags
static constexpr TUINT MAX_TEXTURES
Toshi::TTexture * m_aTextures[MAX_TEXTURES]
BLENDMODE m_eBlendMode