OpenBarnyard
 
Loading...
Searching...
No Matches
T2Render_GL.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
2#include "Render/T2Render.h"
3#include "File/TFile.h"
4#include "T2GLTexture_GL.h"
5
6//-----------------------------------------------------------------------------
7// Enables memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
10#include "Core/TMemoryDebugOn.h"
11
13
14T2Render::T2Render()
15{
16}
17
18T2Render::~T2Render()
19{
20}
21
23
24TBOOL T2Render::Create( const WindowParams& a_rcWindowParams )
25{
27
28 TINFO( "Creating T2Render (OpenGL)\n" );
29
30 SDL_Init( SDL_INIT_VIDEO );
31 SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
32 SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 );
33 SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
34 SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
35 SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
36 SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
37
38 SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 4 );
39 SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
40 SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
41
42 const TCHAR* pchWindowTitle = a_rcWindowParams.pchTitle;
43
44 if ( !pchWindowTitle )
45 pchWindowTitle = "TOSHI : T2Render";
46
47 m_pWindow = new T2Window();
48 if ( m_pWindow->Create( this, pchWindowTitle ) )
49 {
50 // Create SDL context
51 m_pGLContext = SDL_GL_CreateContext( m_pWindow->GetNativeWindow() );
52 SDL_GL_MakeCurrent( m_pWindow->GetNativeWindow(), m_pGLContext );
53
54 // Initialise glew
55 GLenum glewStatus = glewInit();
56 TASSERT( glewStatus == GLEW_OK, (const char*)glewGetErrorString( glewStatus ) );
57
58 // Create the actual display window
59 m_oWindowParams = a_rcWindowParams;
60
61 if ( !m_oWindowParams.bIsWindowed )
62 {
63 m_pWindow->SetFullscreen( TTRUE );
64 TINFO( "Setting window mode to fullscreen\n" );
65 }
66
67 m_pWindow->SetPosition( 100, 100, m_oWindowParams.uiWidth, m_oWindowParams.uiHeight );
68
69 // Create related systems
72
73 return TTRUE;
74 }
75 else
76 {
77 TERROR( "Failed to create Window\n" );
78 return TFALSE;
79 }
80}
81
82void T2Render::Destroy()
83{
84}
85
86T2VertexBuffer T2Render::CreateVertexBuffer( const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
87{
88 GLuint uiBufferId;
89 glGenBuffers( 1, &uiBufferId );
90
91 TASSERT( uiBufferId != 0 );
92 T2VertexBuffer buffer( uiBufferId );
93
94 if ( a_uiSize != 0 )
95 {
96 buffer.Bind();
97 buffer.SetData( a_pData, a_uiSize, a_eUsage );
98 }
99
100 return buffer;
101}
102
103T2IndexBuffer T2Render::CreateIndexBuffer( const TUINT16* a_pIndices, GLuint a_uiCount, GLenum a_eUsage )
104{
105 GLuint uiBufferId;
106 glGenBuffers( 1, &uiBufferId );
107
108 TASSERT( uiBufferId != 0 );
109 T2IndexBuffer buffer( uiBufferId );
110
111 if ( a_uiCount != 0 )
112 {
113 buffer.Bind();
114 buffer.SetData( a_pIndices, sizeof( *a_pIndices ) * a_uiCount, a_eUsage );
115 }
116
117 return buffer;
118}
119
120T2IndirectBuffer T2Render::CreateIndirectBuffer( const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
121{
122 GLuint uiBufferId;
123 glGenBuffers( 1, &uiBufferId );
124
125 TASSERT( uiBufferId != 0 );
126 T2IndirectBuffer buffer( uiBufferId );
127
128 if ( a_uiSize != 0 )
129 {
130 buffer.Bind();
131 buffer.SetData( a_pData, a_uiSize, a_eUsage );
132 }
133
134 return buffer;
135}
136
137T2ShaderStorageBuffer T2Render::CreateShaderStorageBuffer( const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
138{
139 GLuint uiBufferId;
140 glGenBuffers( 1, &uiBufferId );
141
142 TASSERT( uiBufferId != 0 );
143 T2ShaderStorageBuffer buffer( uiBufferId );
144
145 if ( a_uiSize != 0 )
146 {
147 buffer.Bind();
148 buffer.SetData( a_pData, a_uiSize, a_eUsage );
149 }
150
151 return buffer;
152}
153
154T2UniformBuffer T2Render::CreateUniformBuffer( const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
155{
156 GLuint uiBufferId;
157 glGenBuffers( 1, &uiBufferId );
158
159 TASSERT( uiBufferId != 0 );
160 T2UniformBuffer buffer( uiBufferId );
161
162 if ( a_uiSize != 0 )
163 {
164 buffer.Bind();
165 buffer.SetData( a_pData, a_uiSize, a_eUsage );
166 }
167
168 return buffer;
169}
170
171T2VertexArray T2Render::CreateVertexArray()
172{
173 GLuint uiVaoId;
174 glGenVertexArrays( 1, &uiVaoId );
175
176 TASSERT( uiVaoId != 0 );
177 return uiVaoId;
178}
179
180T2VertexArray T2Render::CreateVertexArray( T2VertexBuffer a_VertexBuffer, T2IndexBuffer a_IndexBuffer )
181{
182 GLuint uiVaoId;
183 glGenVertexArrays( 1, &uiVaoId );
184 TASSERT( uiVaoId != 0 );
185
186 T2VertexArray vao( uiVaoId );
187 vao.Bind();
188 vao.SetVertexBuffer( a_VertexBuffer );
189 vao.SetIndexBuffer( a_IndexBuffer );
190
191 return vao;
192}
193
194T2CompiledShader T2Render::CompileShader( GLenum a_eShader, const TCHAR* a_szSource )
195{
196 T2CompiledShader shader = glCreateShader( a_eShader );
197 TASSERT( shader );
198
199 glShaderSource( shader.GetId(), 1, &a_szSource, TNULL );
200 glCompileShader( shader.GetId() );
201
202 GLint compileSuccess = 0;
203 glGetShaderiv( shader.GetId(), GL_COMPILE_STATUS, &compileSuccess );
204
205 if ( compileSuccess == GL_FALSE )
206 {
207 GLint logLength;
208 glGetShaderiv( shader.GetId(), GL_INFO_LOG_LENGTH, &logLength );
209
210 GLchar* log = new GLchar[ logLength - 1 ];
211 glGetShaderInfoLog( shader.GetId(), logLength - 1, nullptr, log );
212
213 TERROR( "Unable to compile shader\n" );
214 TERROR( "Error: %s\n", log );
215 delete[] log;
216
217 TASSERT( TFALSE );
218 }
219
220 return shader;
221}
222
223T2Shader T2Render::CreateShaderProgram( T2CompiledShader a_VertexShader, T2CompiledShader a_FragmentShader )
224{
225 T2Shader program( a_VertexShader, a_FragmentShader );
226 program.Create();
227
228 return program;
229}
230
231T2CompiledShader T2Render::CompileShaderFromFile( GLenum a_eShader, const TCHAR* a_szFileName )
232{
233 TFile* pFile = TFile::Create( a_szFileName );
234 TSIZE uiFileSize = pFile->GetSize();
235
236 TCHAR* pSrc = new TCHAR[ uiFileSize + 1 ];
237 pFile->Read( pSrc, uiFileSize );
238 pSrc[ uiFileSize ] = '\0';
239 pFile->Destroy();
240
241 T2CompiledShader shader = T2Render::CompileShader( a_eShader, pSrc );
242 delete[] pSrc;
243
244 return shader;
245}
246
247GLuint T2Render::CreateTexture( GLsizei a_iWidth, GLsizei a_iHeight, GLenum a_eInternalFormat, GLenum a_eFormat, GLenum a_ePixelType, TBOOL a_bGenerateMipmap, const void* a_pData )
248{
249 GLuint uiTexture;
250 glGenTextures( 1, &uiTexture );
251
252 glBindTexture( GL_TEXTURE_2D, uiTexture );
253 glTexImage2D( GL_TEXTURE_2D, 0, a_eInternalFormat, a_iWidth, a_iHeight, 0, a_eFormat, a_ePixelType, a_pData );
254
255 if ( a_pData && a_bGenerateMipmap )
256 {
257 glGenerateMipmap( GL_TEXTURE_2D );
258 }
259
260 return uiTexture;
261}
262
263void T2Render::DestroyTexture( GLuint a_iId )
264{
265 glDeleteTextures( 1, &a_iId );
266}
267
268void T2Render::Update( TFLOAT a_fDeltaTime )
269{
270 TASSERT( TFALSE == m_bIsInScene );
271 m_pWindow->Update();
272}
273
274void T2Render::BeginScene()
275{
276 TASSERT( TFALSE == m_bIsInScene );
277
278 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
279 glViewport( 0, 0, m_oWindowParams.uiWidth, m_oWindowParams.uiHeight );
280
281 m_bIsInScene = TTRUE;
282}
283
284void T2Render::EndScene()
285{
286 TASSERT( TTRUE == m_bIsInScene );
287
288 SDL_GL_SwapWindow( m_pWindow->GetNativeWindow() );
289 m_bIsInScene = TFALSE;
290}
291
292void T2Render::DestroyVertexBuffer( const T2VertexBuffer& a_VertexBuffer )
293{
294 GLuint uiId = a_VertexBuffer.GetId();
295 glDeleteBuffers( 1, &uiId );
296}
297
298void T2Render::DestroyIndexBuffer( const T2IndexBuffer& a_IndexBuffer )
299{
300 GLuint uiId = a_IndexBuffer.GetId();
301 glDeleteBuffers( 1, &uiId );
302}
303
304void T2Render::DestroyIndirectBuffer( const T2IndirectBuffer& a_IndirectBuffer )
305{
306 GLuint uiId = a_IndirectBuffer.GetId();
307 glDeleteBuffers( 1, &uiId );
308}
309
310void T2Render::DestroyShaderStorageBuffer( const T2IndirectBuffer& a_IndirectBuffer )
311{
312 GLuint uiId = a_IndirectBuffer.GetId();
313 glDeleteBuffers( 1, &uiId );
314}
315
316void T2Render::DestroyUniformBuffer( const T2IndirectBuffer& a_IndirectBuffer )
317{
318 GLuint uiId = a_IndirectBuffer.GetId();
319 glDeleteBuffers( 1, &uiId );
320}
321
Core file system interface for the Toshi engine.
#define TASSERT(X,...)
Definition Defines.h:138
#define TERROR(...)
Definition Defines.h:153
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TINFO(...)
Definition Defines.h:151
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
uint16_t TUINT16
Definition Typedefs.h:15
size_t TSIZE
Definition Typedefs.h:9
char TCHAR
Definition Typedefs.h:20
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
TBOOL g_bCreated
Definition TFile.h:128
void Destroy()
Definition TFile.cpp:184
virtual TSIZE GetSize()=0
virtual TSIZE Read(void *a_pDst, TSIZE a_uiSize)=0
Reads specified number of bytes from the file into the buffer.
static TFile * Create(const TString8 &a_rcFilename, TFILEMODE a_eMode=TFILEMODE_READ)
Definition TFile.cpp:29
static TFORCEINLINE T2TextureManager * CreateSingleton(Args &&... args)
Definition TSingleton.h:17