27 : m_ShadowColour( 0.3f, 0.3f, 0.3f, 1.0f ), m_AmbientColour( 1.0f, 1.0f, 1.0f, 1.0f )
33 m_bIsHighEndMode =
TTRUE;
34 m_bAlphaBlendMaterial =
TFALSE;
49 auto pDevice = pRenderInterface->GetDirect3DDevice();
54 pDevice->SetVertexShader( m_hVertexShader );
55 pDevice->SetPixelShader( NULL );
57 static constexpr TVector4 s_SomeVector( 1.0f, 1.0f, 1.0f, 1.0f );
58 pDevice->SetVertexShaderConstant( 4, &m_AmbientColour, 1 );
59 pDevice->SetVertexShaderConstant( 5, &m_ShadowColour, 1 );
60 pDevice->SetVertexShaderConstant( 6, &s_SomeVector, 1 );
62 pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
63 pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
64 pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
65 pDevice->SetRenderState( D3DRS_ALPHAFUNC, 5 );
67 DWORD dwWasSpecularEnabled;
68 pDevice->GetRenderState( D3DRS_SPECULARENABLE, &dwWasSpecularEnabled );
69 pDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE );
70 pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, 4 );
71 pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, 2 );
72 pDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, 0 );
73 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, 4 );
74 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, 2 );
75 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, 0 );
76 pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, 1 );
77 pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, 1 );
78 pDevice->SetRenderState( D3DRS_CULLMODE, m_bRenderEnvMap ? D3DCULL_CCW : D3DCULL_CW );
79 pDevice->SetRenderState( D3DRS_SPECULARENABLE, dwWasSpecularEnabled );
80 pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
81 pDevice->SetPixelShader( 0 );
96 auto pDevice = pRenderInterface->GetDirect3DDevice();
98 pDevice->SetTextureStageState( 0, D3DTSS_ADDRESSU, 1 );
99 pDevice->SetTextureStageState( 0, D3DTSS_ADDRESSV, 1 );
108 pDevice->SetVertexShader( m_hVertexShader );
109 pDevice->SetPixelShader( NULL );
111 static constexpr TVector4 s_SomeVector( 1.0f, 1.0f, 1.0f, 1.0f );
112 pDevice->SetVertexShaderConstant( 4, &m_AmbientColour, 1 );
113 pDevice->SetVertexShaderConstant( 5, &m_ShadowColour, 1 );
114 pDevice->SetVertexShaderConstant( 6, &s_SomeVector, 1 );
116 pDevice->SetRenderState( D3DRS_ZWRITEENABLE, 1 );
117 pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, 1 );
118 pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, 1 );
119 pDevice->SetRenderState( D3DRS_ALPHAFUNC, 5 );
121 DWORD dwWasSpecularEnabled;
122 pDevice->GetRenderState( D3DRS_SPECULARENABLE, &dwWasSpecularEnabled );
123 pDevice->SetRenderState( D3DRS_SPECULARENABLE, 0 );
124 pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, 4 );
125 pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, 2 );
126 pDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, 0 );
127 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, 4 );
128 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, 2 );
129 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, 0 );
130 pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, 1 );
131 pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, 1 );
132 pDevice->SetRenderState( D3DRS_CULLMODE, m_bRenderEnvMap ? D3DCULL_CCW : D3DCULL_CW );
139 auto pDevice = pRenderInterface->GetDirect3DDevice();
141 pDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE );
142 pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
143 pDevice->SetPixelShader( NULL );
148 m_aOrderTables[ 0 ].Create(
this, -3000 );
149 m_aOrderTables[ 1 ].Create(
this, 100 );
150 m_aOrderTables[ 2 ].Create(
this, 101 );
151 m_aOrderTables[ 3 ].Create(
this, 601 );
152 m_aOrderTables[ 4 ].Create(
this, -400 );
153 m_aOrderTables[ 5 ].Create(
this, 500 );
154 m_aOrderTables[ 6 ].Create(
this, -6005 );
155 m_aOrderTables[ 7 ].Create(
this, -7000 );
156 return AWorldShader::Create();
159static TBOOL CreateWorldVertexShader(
const char* a_szFileName,
const DWORD* a_pFunction, DWORD* a_pOutVertexShader )
161 static constexpr DWORD s_ShaderDeclaration[] = {
162 0x20000000, 0x40020000, 0x40020001, 0x40020002,
163 0x40010003, 0xFFFFFFFF
181 constexpr static DWORD s_VertexShaderFunction[] = {
182 0xFFFE0101, 0x14, 0xC00F0000, 0x90E40000,
183 0xA0E40000, 0x2, 0x800F0001, 0xA0E40006,
184 0x91E40002, 0x5, 0x800F0000, 0x90E40002,
185 0xA0E40004, 0x5, 0x800F0002, 0x80E40001,
186 0xA0E40005, 0x2, 0x800F0000, 0x80E40000,
187 0x80E40002, 0x1, 0x80080000, 0xA0FF0006,
188 0x1, 0xD00F0000, 0x80E40000, 0x5,
189 0x80010001, 0x90000002, 0xA0000008, 0x4,
190 0xD0080000, 0x80FF0000, 0xA0550008, 0x80000001,
191 0x2, 0xE0030000, 0xA0540007, 0x90540003,
192 0x2, 0xE0030001, 0xA0FE0007, 0x90540003,
196 if ( !CreateWorldVertexShader(
"AWorldShader_D3D8_Win.vsh", s_VertexShaderFunction, &m_hVertexShader ) )
198 TASSERT( !
"Couldn't create vertex shader" );
203 return AWorldShader::Validate();
208 if ( !IsValidated() )
return;
212 m_SomeList.DeleteAll();
214 else if ( m_hVertexShader != 0 )
241 auto pDevice = pRenderInterface->GetDirect3DDevice();
244 D3DXMatrixMultiply( &mMVP, a_pRenderPacket->
GetModelViewMatrix(), pCurrentContext->GetProjectionMatrix() );
245 D3DXMatrixTranspose( &mMVP, &mMVP );
247 pDevice->SetVertexShaderConstant( 0, &mMVP, 4 );
249 if ( a_pRenderPacket->
GetAlpha() >= 1.0f || isnan( a_pRenderPacket->
GetAlpha() ) )
253 pDevice->SetRenderState( D3DRS_ALPHAREF, m_iAlphaRef );
259 pDevice->SetRenderState( D3DRS_ALPHAREF,
TUINT8( m_iAlphaRef * a_pRenderPacket->
GetAlpha() ) );
266 if ( pMaterial->GetBlendMode() != 0 || a_pRenderPacket->
GetAlpha() < 1.0f )
270 pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
276 pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
284 if ( pMesh->IsUnknownState1() )
293 pDevice->SetVertexShaderConstant( 8, &vSomeConst, 1 );
300 pVertexPool->GetHALBuffer( &vertexBuffer );
309 pIndexPool->GetHALBuffer( &indexBuffer );
314 pDevice->DrawIndexedPrimitive(
317 pVertexPool->GetNumVertices(),
319 pIndexPool->GetNumIndices() - 2
326 m_bRenderEnvMap = a_bEnable;
331 return m_bAlphaBlendMaterial;
336 m_bAlphaBlendMaterial = a_bIsAlphaBlendMaterial;
344 pMaterial->SetShader(
this );
349 pAlphaBlendMaterial->SetShader(
this );
350 pAlphaBlendMaterial->Create( 1 );
352 pMaterial->SetAlphaBlendMaterial( pAlphaBlendMaterial );
363 pMesh->SetOwnerShader(
this );
370 return m_bIsHighEndMode;
383 auto pDevice = pRenderInterface->GetDirect3DDevice();
387 auto pDirect3D = pRenderInterface->GetDirect3D();
390 if ( !pDirect3D )
return TFALSE;
392 pDirect3D->GetDeviceCaps( 0, D3DDEVTYPE_HAL, &caps );
396 pDevice->GetDeviceCaps( &caps );
399 return ( ( caps.VertexShaderVersion & 0xFFFF ) > 256 ) && ( caps.DevCaps & 0x10000 );
404 return m_bRenderEnvMap;
415 m_ShadowColour = a_rShadowColour;
416 m_AmbientColour = a_rAmbientColour;
418 Toshi::TMath::Clip( m_ShadowColour.x, 0.0f, 1.0f );
419 Toshi::TMath::Clip( m_ShadowColour.y, 0.0f, 1.0f );
420 Toshi::TMath::Clip( m_ShadowColour.z, 0.0f, 1.0f );
421 Toshi::TMath::Clip( m_AmbientColour.x, 0.0f, 1.0f );
422 Toshi::TMath::Clip( m_AmbientColour.y, 0.0f, 1.0f );
423 Toshi::TMath::Clip( m_AmbientColour.z, 0.0f, 1.0f );
426void AWorldShaderHAL::SetupLowEndMode()
430 auto pDevice = pRenderInterface->GetDirect3DDevice();
432 pDevice->SetVertexShader( D3DFVF_TEX1 | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_NORMAL | D3DFVF_XYZ );
433 pDevice->SetPixelShader( NULL );
434 pDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
435 pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
436 pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
437 pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
438 pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
439 pDevice->SetRenderState( D3DRS_SRCBLEND, 5 );
440 pDevice->SetRenderState( D3DRS_DESTBLEND, 6 );
441 pDevice->SetRenderState( D3DRS_ALPHAFUNC, 5 );
443 DWORD dwWasSpecularEnabled;
444 pDevice->GetRenderState( D3DRS_SPECULARENABLE, &dwWasSpecularEnabled );
445 pDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE );
447 pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, 4 );
448 pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, 2 );
449 pDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, 0 );
450 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, 4 );
451 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, 2 );
452 pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, 0 );
453 pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, 1 );
454 pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, 1 );
456 pDevice->SetRenderState( D3DRS_CULLMODE, m_bRenderEnvMap ? D3DCULL_CCW : D3DCULL_CW );
460 pDevice->SetTransform( D3DTS_VIEW, s_IdentityMatrix );
461 pDevice->SetTransform( D3DTS_PROJECTION, pCurrentContext->GetProjectionMatrix() );
462 pDevice->SetRenderState( D3DRS_SPECULARENABLE, dwWasSpecularEnabled );
463 pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
#define TSTATICCAST(POINTERTYPE, VALUE)
#define TOSHI_NAMESPACE_USING
#define TDEFINE_CLASS(...)
static constinit TMatrix44 IDENTITY
IDirect3DIndexBuffer8 * pIndexBuffer
static TRenderContextD3D * Upcast(TRenderContext *a_pRenderContext)
static TBOOL CreateVertexShader(const DWORD *a_ShaderDeclaration, const DWORD *a_pFunction, DWORD *a_pOutVertexShader)
Creates a vertex shader.
static TFORCEINLINE TRenderD3DInterface * Interface()
Gets the render interface singleton.
static void DestroyVertexShader(DWORD a_hVertexShader)
Destroys a vertex shader.
IDirect3DVertexBuffer8 * apVertexBuffers[TVertexFactoryFormat::MAX_NUM_STREAMS]
TMatrix44 & GetModelViewMatrix()
virtual void Invalidate()
virtual TBOOL TryInvalidate() override
virtual void SetAlphaBlendMaterial(TBOOL a_bIsAlphaBlendMaterial) override
virtual void * CreateUnknown(void *, void *, void *, void *)
virtual void StartFlush() override
virtual TBOOL Validate() override
virtual void SetHighEndMode(TBOOL a_bEnable)
virtual void Flush() override
virtual void EndFlush() override
virtual TBOOL Create() override
virtual void Render(Toshi::TRenderPacket *a_pRenderPacket) override
virtual TBOOL IsHighEndMode()
virtual AWorldMaterial * CreateMaterial(const TCHAR *a_szName) override
virtual TBOOL TryValidate() override
virtual TBOOL IsAlphaBlendMaterial() override
virtual void Invalidate() override
void SetColours(const Toshi::TVector4 &a_rShadowColour, const Toshi::TVector4 a_rAmbientColour)
virtual void EnableRenderEnvMap(TBOOL a_bEnable) override
virtual AWorldMesh * CreateMesh(const TCHAR *a_szName) override
virtual TBOOL IsRenderEnvMapEnabled()
virtual TBOOL IsCapableShaders()
static TUINT s_RenderStateFlags