OpenBarnyard
 
Loading...
Searching...
No Matches
ARenderer_Win.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "AppBoot.h"
8#include "GUI/AGUISystem.h"
9#include "GUI/AGUI2.h"
11#include "Render/ARenderer.h"
14#include "Input/AInputHandler.h"
15#include "Movie/AMoviePlayer.h"
16
17#ifdef TOSHI_SKU_WINDOWS
23
28#endif // TOSHI_SKU_WINDOWS
29
30#include <resource.h>
31
32//-----------------------------------------------------------------------------
33// Enables memory debugging.
34// Note: Should be the last include!
35//-----------------------------------------------------------------------------
36#include <Core/TMemoryDebugOn.h>
37
39
41
43 : m_RenderGUIEmitter( this ), m_AnimationUpdateStartEmitter( this ), m_AnimationUpdateEndEmitter( this ), m_pViewport( TNULL ), m_pCameraObject( TNULL ), m_pHALViewport1( TNULL ), m_pHALViewport2( TNULL ), m_bRenderGUI( TTRUE ), m_fNear( 1.0f ), m_fFar( 280.0f )
44{
45}
46
48{
49#if defined( TOSHI_SKU_WINDOWS ) && defined( TRENDERINTERFACE_DX8 )
50 TString8 strRenderInterfaceName = "TRenderD3DInterface";
51#endif
52
53 TKernelInterface::GetSingleton()->LoadInterface( strRenderInterfaceName );
54
55 TClass* pRendererClass = TClass::Find( strRenderInterfaceName );
56 TRenderD3DInterface* pRenderer = TSTATICCAST( TRenderD3DInterface, pRendererClass->CreateObject() );
57
59 pRenderer->Create( "Barnyard" );
60
61 HMODULE hModuleHandle = GetModuleHandleA( TNULL );
62 HICON hIcon = LoadIconA( hModuleHandle, MAKEINTRESOURCE( IDI_ICON1 ) );
63 SendMessageA( pRenderer->GetMSWindow()->GetHWND(), 0x80, TRUE, (LPARAM)hIcon );
64
65 m_DisplayModes.Initialise();
66
68
69 TINT iWidth = 800;
70 TINT iHeight = 600;
71 TINT iColourDepth = 32;
72 TBOOL bWindowed = TTRUE;
73
74 if ( AOptions::GetSingleton() )
75 {
76 iWidth = AOptions::GetSingleton()->GetWidth();
77 iHeight = AOptions::GetSingleton()->GetHeight();
78 bWindowed = AOptions::GetSingleton()->IsWindowed();
79 pRenderer->SetGamma( AOptions::GetSingleton()->GetGamma() );
80 }
81
82 if ( !m_DisplayModes.IsModeExists( iWidth, iHeight, iColourDepth ) )
83 {
84 // Incompatible display mode
85 iWidth = 800;
86 iHeight = 600;
87 iColourDepth = 32;
88 }
89
91 displayParams.uiWidth = iWidth;
92 displayParams.uiHeight = iHeight;
93 displayParams.bWindowed = bWindowed;
94 displayParams.uiColourDepth = 32;
95 displayParams.eDepthStencilFormat = 0;
96
97 auto pDevice = FindSuitableDevice( displayParams, TTRUE );
98
99 if ( !pDevice )
100 {
101 if ( displayParams.uiColourDepth == 32 )
102 {
103 displayParams.uiColourDepth = 16;
104 pDevice = FindSuitableDevice( displayParams, TTRUE );
105
106 if ( pDevice == TNULL )
107 {
109 return TFALSE;
110 }
111 }
112 else
113 {
115 return TFALSE;
116 }
117 }
118
119 if ( pRenderer->CreateDisplay( displayParams ) )
120 {
121 TTODO( "Log info about choosen device" );
122 return TTRUE;
123 }
124
125 return TFALSE;
126}
127
129{
130 TIMPLEMENT();
131
133
134 {
135 auto pResource = TSTATICCAST(
137 pRenderer->CreateResource(
138 TClass::Find( "TVertexFactoryResource" ),
139 "VFSYSVNDUV1",
140 TNULL
141 )
142 );
143
144 pRenderer->SetResourceExplicit( pResource, SYSRESOURCE_VFSYSVNDUV1 );
145
146 TVertexFactoryFormat vertexFormat;
147 vertexFormat.m_uiNumStreams = 1;
148 vertexFormat.m_aStreamFormats[ 0 ].m_uiVertexSize = 24;
149 vertexFormat.m_aStreamFormats[ 0 ].m_Unk = 0;
150 pResource->Create( &vertexFormat, 54050, 0 );
151 }
152
153 {
154 auto pResource = TSTATICCAST(
156 pRenderer->CreateResource(
157 TClass::Find( "TVertexFactoryResource" ),
158 "VFSKIN",
159 TNULL
160 )
161 );
162
163 pRenderer->SetResourceExplicit( pResource, SYSRESOURCE_VFSKIN );
164
165 TVertexFactoryFormat vertexFormat;
166 vertexFormat.m_uiNumStreams = 1;
167 vertexFormat.m_aStreamFormats[ 0 ].m_uiVertexSize = 40;
168 vertexFormat.m_aStreamFormats[ 0 ].m_Unk = 0;
169 pResource->Create( &vertexFormat, 54050, 0 );
170 }
171
172 {
173 auto pResource = TSTATICCAST(
175 pRenderer->CreateResource(
176 TClass::Find( "TVertexFactoryResource" ),
177 "VFWORLD",
178 TNULL
179 )
180 );
181
182 pRenderer->SetResourceExplicit( pResource, SYSRESOURCE_VFWORLD );
183
184 TVertexFactoryFormat vertexFormat;
185 vertexFormat.m_uiNumStreams = 1;
186 vertexFormat.m_aStreamFormats[ 0 ].m_uiVertexSize = 44;
187 vertexFormat.m_aStreamFormats[ 0 ].m_Unk = 0;
188 pResource->Create( &vertexFormat, 54050, 0 );
189 }
190
191 {
192 auto pResource = TSTATICCAST(
194 pRenderer->CreateResource(
195 TClass::Find( "TIndexFactoryResource" ),
196 "IFSYS",
197 TNULL
198 )
199 );
200
201 pRenderer->SetResourceExplicit( pResource, SYSRESOURCE_IFSYS );
202
203 TIndexFactoryFormat indexFormat;
204 indexFormat.uiIndexSize = 2;
205 pResource->Create( &indexFormat, 64700, 0 );
206 }
207
208 {
209 auto pResource = pRenderer->CreateResource(
210 TClass::Find( "TTextureFactoryHAL" ),
211 "TextureFactory",
212 TNULL
213 );
214
215 pRenderer->SetResourceExplicit( pResource, SYSRESOURCE_TEXTUREFACTORY );
216 pResource->Create();
217 }
218
219 return TTRUE;
220}
221
223{
226
227 if ( a_bReverseOrder )
228 {
229 a_rDisplayParams.eDepthStencilFormat = 4;
230 pDevice = pRenderer->FindDevice( a_rDisplayParams );
231
232 if ( !pDevice )
233 {
234 a_rDisplayParams.eDepthStencilFormat = 2;
235 pDevice = pRenderer->FindDevice( a_rDisplayParams );
236
237 if ( !pDevice )
238 {
239 a_rDisplayParams.eDepthStencilFormat = 3;
240 pDevice = pRenderer->FindDevice( a_rDisplayParams );
241
242 if ( !pDevice )
243 {
244 a_rDisplayParams.eDepthStencilFormat = 0;
245 pDevice = pRenderer->FindDevice( a_rDisplayParams );
246
247 if ( !pDevice )
248 {
249 a_rDisplayParams.eDepthStencilFormat = 1;
250 pDevice = pRenderer->FindDevice( a_rDisplayParams );
251 }
252 }
253 }
254 }
255 }
256 else
257 {
258 pDevice = pRenderer->FindDevice( a_rDisplayParams );
259 a_rDisplayParams.eDepthStencilFormat = 0;
260
261 if ( !pDevice )
262 {
263 a_rDisplayParams.eDepthStencilFormat = 1;
264 pDevice = pRenderer->FindDevice( a_rDisplayParams );
265
266 if ( !pRenderer->FindDevice( a_rDisplayParams ) )
267 {
268 a_rDisplayParams.eDepthStencilFormat = 2;
269 pDevice = pRenderer->FindDevice( a_rDisplayParams );
270
271 if ( !pRenderer->FindDevice( a_rDisplayParams ) )
272 {
273 a_rDisplayParams.eDepthStencilFormat = 4;
274 pDevice = pRenderer->FindDevice( a_rDisplayParams );
275
276 if ( !pRenderer->FindDevice( a_rDisplayParams ) )
277 {
278 a_rDisplayParams.eDepthStencilFormat = 3;
279 pDevice = pRenderer->FindDevice( a_rDisplayParams );
280 }
281 }
282 }
283 }
284 }
285
286 return pDevice;
287}
288
289void ARenderer::RenderGUI()
290{
292 auto pViewport = AGUISystem::GetSingleton()->GetRenderObject( 0 )->GetViewport();
293
294 auto pOldContext = pRender->SetCurrentRenderContext( pViewport->GetRenderContext() );
295
296 TTODO( "Save and restore value of 'm_AmbientColor?' when it's figured out" );
297
298 pViewport->Begin();
299
300 // Render UI that is not attached to context
302 m_RenderGUIEmitter.Throw( 0 );
304
305 // Render UI that is attached to the context
307
308 pViewport->End();
309
310 pRender->FlushShaders();
311 pRender->SetCurrentRenderContext( pOldContext );
312}
313
315{
316 TIMPLEMENT();
317
318 TOrderTable::CreateStaticData( 2000, 4000 );
319 TBOOL bCreatedTRender = CreateTRender();
320
321 TASSERT( bCreatedTRender );
322
323 if ( bCreatedTRender )
324 {
325 ( new AWorldShaderHAL() )->Create();
326 ( new ASkinShaderHAL() )->Create();
327 ( new AGrassShaderHAL() )->Create();
328 ( new ASysShaderHAL() )->Create();
329 CreateMainViewport();
330
331 AModelLoader::CreateSingleton();
332 AMaterialLibraryManager::CreateSingleton();
333 AKeyFrameLibraryManager::CreateSingleton();
334 AModelLoader::GetSingleton()->InitialiseStatic();
335 AGlowViewport::CreateSingleton( TLightIDList::MAX_NUM_LIGHTS * SPLITSCREEN_MAX_NUM_PLAYERS );
336 }
337
338 return bCreatedTRender;
339}
340
341void ARenderer::UpdateMainCamera( const Toshi::TMatrix44& a_rTransformMatrix, const ACamera* a_pCamera )
342{
343 m_pCameraObject->SetProjectionCentreX( a_pCamera->m_fProjectionCentreX );
344 m_pCameraObject->SetProjectionCentreY( a_pCamera->m_fProjectionCentreY );
345 m_pCameraObject->SetFOV( a_pCamera->m_fFOV );
346 m_pCameraObject->GetTransformObject().SetMatrix( a_rTransformMatrix );
347 m_pCameraObject->SetFar( m_fFar );
348 m_pCameraObject->SetNear( m_fNear );
349}
350
351void ARenderer::RenderMainScene( TFLOAT a_fDeltaTime )
352{
353 if ( ARootTask::GetSingleton()->ShouldRenderMainScene() )
354 {
355 auto pViewport = m_pViewport;
356 auto pViewportContext = pViewport->GetRenderContext();
357 auto pCameraObject = m_pCameraObject;
358
359 pViewport->AllowDepthClear( TTRUE );
360
361 auto pRender = TRenderD3DInterface::Interface();
362 auto pOldContext = pRender->SetCurrentRenderContext( pViewportContext );
363
364 auto& rTransformStack = pRender->GetTransforms();
365 rTransformStack.Reset();
366 rTransformStack.PushNull().Identity();
367
368 pViewport->Begin();
369 pCameraObject->Render();
370
371 if ( !ARootTask::GetSingleton()->IsPaused() )
372 {
373 TBOOL bFlag1;
374 m_AnimationUpdateStartEmitter.Throw( &bFlag1 );
375
376 AModelRepos::GetSingleton()->Update( a_fDeltaTime );
377 TTODO( "AAnimatableObjectManager::UpdateAttachedObjects" );
378
379 TBOOL bFlag2;
380 m_AnimationUpdateEndEmitter.Throw( &bFlag2 );
381 }
382
383 rTransformStack.Push( pViewportContext->GetWorldViewMatrix() );
384 pViewportContext->SetCameraObject( pCameraObject );
385
386 pRender->FlushShaders();
387 pViewportContext->EnableFog( TTRUE );
388
389 AModelRepos::GetSingleton()->RenderModels( 2 );
390
391 // Render terrain, trees, gates, instances and more...
392 if ( ATerrainInterface::GetSingleton() )
393 {
394 ATerrainInterface::GetSingleton()->Render();
395 // ...
396 }
397
398 pRender->FlushShaders();
399 rTransformStack.Pop();
400 pViewport->End();
401
402 //m_pHALViewport2->Begin();
403 //m_pHALViewport2->End();
404
405 pViewport->AllowBackgroundClear( TTRUE );
406 pViewport->AllowDepthClear( TTRUE );
407
408 pRender->SetCurrentRenderContext( pOldContext );
409 }
410}
411
413{
414 TIMPLEMENT();
415
417
418 if ( g_oTheApp.IsDestroyed() )
419 return TTRUE;
420
421 TBOOL bMoviePlaying = AMoviePlayer::IsSingletonCreated() && AMoviePlayer::GetSingleton()->IsMoviePlaying();
422
423 pRender->Update( a_fDeltaTime );
424
425 if ( g_oSystemManager.IsPaused() )
426 return TFALSE;
427
428 // Update transforms of glow objects
429 AGlowViewport::GetSingleton()->Update();
430
431 ARootTask* pRootTask = ARootTask::GetSingleton();
432 if ( pRootTask->IsGameSystemCreated() )
433 {
434 auto pRenderContext = TRenderInterface::GetSingleton()->GetCurrentContext();
435
436 pRender->BeginScene();
437
438 if ( bMoviePlaying )
439 {
440 AMoviePlayer::GetSingleton()->Render( a_fDeltaTime );
441 }
442 else if ( pRootTask->IsRenderWorld() )
443 {
444 const ACamera* pCamera = ACameraManager::GetSingleton()->GetCurrentCamera();
445 TMatrix44 oCamMatrix = pCamera->GetMatrix();
446 oCamMatrix.SetTranslation( pCamera->GetMatrix().GetTranslation() );
447
448 UpdateMainCamera( oCamMatrix, pCamera );
449 m_pViewport->AllowDepthClear( TFALSE );
450
451 pRenderContext->EnableFog( TTRUE );
452 RenderMainScene( a_fDeltaTime );
453 }
454
455 if ( m_bRenderGUI )
456 RenderGUI();
457
458 pRender->EndScene();
459 return TTRUE;
460 }
461 else
462 {
463 pRender->BeginScene();
464
465 if ( bMoviePlaying )
466 AMoviePlayer::GetSingleton()->Render( a_fDeltaTime );
467
468 if ( m_bRenderGUI )
469 RenderGUI();
470
471 pRender->EndScene();
472 return TTRUE;
473 }
474}
475
477{
478 OnUpdate( 1.0f / 30.0f );
479}
480
481void ARenderer::CreateMainViewport()
482{
484
485 m_pViewport = new TViewport( TTRUE );
486 m_pViewport->SetX( 0 );
487 m_pViewport->SetY( 0 );
488 m_pViewport->SetWidth( TFLOAT( pDisplayParams->uiWidth ) );
489 m_pViewport->SetHeight( TFLOAT( pDisplayParams->uiHeight ) );
490 m_pViewport->SetMinZ( 0.2f );
491 m_pViewport->SetMaxZ( 1.0f );
492 m_pViewport->AllowBackgroundClear( TTRUE );
493 m_pViewport->AllowDepthClear( TTRUE );
494 m_pViewport->SetBackgroundColor( 128, 128, 128, 0 );
495 m_pViewport->Enable( TTRUE );
496 m_pViewport->EnableDefaultBeginRender( TTRUE );
497 m_pViewport->SetMemoryAllocatorBlock( AMemory::GetMemBlock( AMemory::POOL_Viewport ) );
498
499 m_pHALViewport1 = new TViewportHAL( TTRUE );
500 m_pHALViewport1->SetX( 0 );
501 m_pHALViewport1->SetY( 0 );
502 m_pHALViewport1->SetWidth( TFLOAT( pDisplayParams->uiWidth ) );
503 m_pHALViewport1->SetHeight( TFLOAT( pDisplayParams->uiHeight ) );
504 m_pHALViewport1->SetMinZ( 0.2f );
505 m_pHALViewport1->SetMaxZ( 1.0f );
506 m_pHALViewport1->AllowDepthClear( TFALSE );
507 m_pHALViewport1->AllowBackgroundClear( TTRUE );
508 m_pHALViewport1->SetBackgroundColor( 0, 0, 0, 0 );
509 m_pHALViewport1->Enable( TTRUE );
510 m_pHALViewport1->EnableDefaultBeginRender( TTRUE );
511 m_pHALViewport1->SetMemoryAllocatorBlock( AMemory::GetMemBlock( AMemory::POOL_Viewport ) );
512
513 m_pHALViewport2 = new TViewportHAL( TTRUE );
514 m_pHALViewport2->SetX( 0 );
515 m_pHALViewport2->SetY( 0 );
516 m_pHALViewport2->SetWidth( TFLOAT( pDisplayParams->uiWidth ) );
517 m_pHALViewport2->SetHeight( TFLOAT( pDisplayParams->uiHeight ) );
518 m_pHALViewport2->SetMinZ( 0.2f );
519 m_pHALViewport2->SetMaxZ( 1.0f );
520 m_pHALViewport2->AllowBackgroundClear( TFALSE );
521 m_pHALViewport2->AllowDepthClear( TFALSE );
522 m_pHALViewport2->Enable( TTRUE );
523 m_pHALViewport2->EnableDefaultBeginRender( TTRUE );
524 m_pHALViewport2->SetMemoryAllocatorBlock( AMemory::GetMemBlock( AMemory::POOL_Viewport ) );
525
526 m_pCameraObject = new TCameraObject();
527}
@ SYSRESOURCE_VFSKIN
Definition TRender.h:10
@ SYSRESOURCE_IFSYS
Definition TRender.h:18
@ SYSRESOURCE_VFSYSVNDUV1
Definition TRender.h:9
@ SYSRESOURCE_TEXTUREFACTORY
Definition TRender.h:20
@ SYSRESOURCE_VFWORLD
Definition TRender.h:14
#define TIMPLEMENT()
Definition Defines.h:136
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TTODO(DESC)
Definition Defines.h:134
#define TDEFINE_CLASS(...)
Definition TObject.h:120
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
AApplication g_oTheApp
Definition AppBoot.cpp:31
#define SPLITSCREEN_MAX_NUM_PLAYERS
Definition AViewport.h:3
TSystemManager g_oSystemManager
Definition TSystem.cpp:15
void SetTranslation(const TVector4 &a_rTranslation)
Definition TMatrix44.h:167
HWND GetHWND() const
Definition TMSWindow.h:52
DirectX 8 implementation of the render interface Handles DirectX 8 specific rendering functionality a...
virtual TBOOL Create() OVERRIDE
Creates the render interface.
virtual TBOOL CreateDisplay(const DISPLAYPARAMS &a_rParams) OVERRIDE
Creates a display with the specified parameters.
TFORCEINLINE TMSWindow * GetMSWindow()
Gets the MS window.
virtual TBOOL BeginScene() OVERRIDE
Begins a new rendering scene.
static TFORCEINLINE TRenderD3DInterface * Interface()
Gets the render interface singleton.
virtual TBOOL Update(float a_fDeltaTime) OVERRIDE
Updates the render interface state.
virtual void SetGamma(TFLOAT a_fGamma)
Sets the gamma value.
virtual void OnInitializationFailureDisplay() OVERRIDE
Called when display initialization fails.
virtual TBOOL EndScene() OVERRIDE
Ends the current rendering scene and presents the results.
static void CreateStaticData(TUINT a_uiMaxMaterials, TUINT a_uiMaxRenderPackets)
static constexpr TINT MAX_NUM_LIGHTS
void SetAutoCreateSystemResources(TBOOL a_bAutoCreate)
TRenderContext * GetCurrentContext() const
virtual DISPLAYPARAMS * GetCurrentDisplayParams()=0
TVertexStreamFormat m_aStreamFormats[MAX_NUM_STREAMS]
Definition TClass.h:8
class TObject * CreateObject() const
Definition TClass.cpp:116
static TClass * Find(const TCHAR *name, TClass *parent=TNULL)
Definition TClass.cpp:110
static TFORCEINLINE TKernelInterface * GetSingleton()
Definition TSingleton.h:49
TKernelInterfaceDLL * LoadInterface(const TString8 &a_rcName)
Definition TSystem.cpp:83
Toshi::TMatrix44 & GetMatrix()
Definition ACamera.cpp:58
static AGUI2Context * GetContext()
Definition AGUI2.h:32
AGUI2Renderer * GetRenderer() const
virtual void EndScene()=0
virtual void BeginScene()=0
@ POOL_Viewport
Definition AMemory.h:40
static Toshi::TMemory::MemBlock * GetMemBlock(POOL a_ePool)
Definition AMemory.cpp:38
virtual TBOOL OnCreate() override
void UpdateMainCamera(const Toshi::TMatrix44 &a_rTransformMatrix, const ACamera *a_pCamera)
TBOOL CreateTRender()
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime) override
void ForceUpdate30FPS()
Toshi::TRenderAdapter::Mode::Device * FindSuitableDevice(Toshi::TRenderInterface::DISPLAYPARAMS &a_rDisplayParams, bool a_bReverseOrder)
TBOOL CreateTRenderResources()
TBOOL IsRenderWorld()
Definition ARootTask.h:30
TBOOL IsGameSystemCreated() const
Definition ARootTask.h:27