24TBOOL T2Render::Create(
const WindowParams& a_rcWindowParams )
28 TINFO(
"Creating T2Render (OpenGL)\n" );
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 );
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 );
42 const TCHAR* pchWindowTitle = a_rcWindowParams.pchTitle;
44 if ( !pchWindowTitle )
45 pchWindowTitle =
"TOSHI : T2Render";
48 if ( m_pWindow->Create(
this, pchWindowTitle ) )
51 m_pGLContext = SDL_GL_CreateContext( m_pWindow->GetNativeWindow() );
52 SDL_GL_MakeCurrent( m_pWindow->GetNativeWindow(), m_pGLContext );
55 GLenum glewStatus = glewInit();
56 TASSERT( glewStatus == GLEW_OK, (
const char*)glewGetErrorString( glewStatus ) );
59 m_oWindowParams = a_rcWindowParams;
61 if ( !m_oWindowParams.bIsWindowed )
63 m_pWindow->SetFullscreen(
TTRUE );
64 TINFO(
"Setting window mode to fullscreen\n" );
67 m_pWindow->SetPosition( 100, 100, m_oWindowParams.uiWidth, m_oWindowParams.uiHeight );
77 TERROR(
"Failed to create Window\n" );
82void T2Render::Destroy()
86T2VertexBuffer T2Render::CreateVertexBuffer(
const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
89 glGenBuffers( 1, &uiBufferId );
92 T2VertexBuffer buffer( uiBufferId );
97 buffer.SetData( a_pData, a_uiSize, a_eUsage );
103T2IndexBuffer T2Render::CreateIndexBuffer(
const TUINT16* a_pIndices, GLuint a_uiCount, GLenum a_eUsage )
106 glGenBuffers( 1, &uiBufferId );
109 T2IndexBuffer buffer( uiBufferId );
111 if ( a_uiCount != 0 )
114 buffer.SetData( a_pIndices,
sizeof( *a_pIndices ) * a_uiCount, a_eUsage );
120T2IndirectBuffer T2Render::CreateIndirectBuffer(
const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
123 glGenBuffers( 1, &uiBufferId );
126 T2IndirectBuffer buffer( uiBufferId );
131 buffer.SetData( a_pData, a_uiSize, a_eUsage );
137T2ShaderStorageBuffer T2Render::CreateShaderStorageBuffer(
const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
140 glGenBuffers( 1, &uiBufferId );
143 T2ShaderStorageBuffer buffer( uiBufferId );
148 buffer.SetData( a_pData, a_uiSize, a_eUsage );
154T2UniformBuffer T2Render::CreateUniformBuffer(
const void* a_pData, GLuint a_uiSize, GLenum a_eUsage )
157 glGenBuffers( 1, &uiBufferId );
160 T2UniformBuffer buffer( uiBufferId );
165 buffer.SetData( a_pData, a_uiSize, a_eUsage );
171T2VertexArray T2Render::CreateVertexArray()
174 glGenVertexArrays( 1, &uiVaoId );
180T2VertexArray T2Render::CreateVertexArray( T2VertexBuffer a_VertexBuffer, T2IndexBuffer a_IndexBuffer )
183 glGenVertexArrays( 1, &uiVaoId );
186 T2VertexArray vao( uiVaoId );
188 vao.SetVertexBuffer( a_VertexBuffer );
189 vao.SetIndexBuffer( a_IndexBuffer );
194T2CompiledShader T2Render::CompileShader( GLenum a_eShader,
const TCHAR* a_szSource )
196 T2CompiledShader shader = glCreateShader( a_eShader );
199 glShaderSource( shader.GetId(), 1, &a_szSource,
TNULL );
200 glCompileShader( shader.GetId() );
202 GLint compileSuccess = 0;
203 glGetShaderiv( shader.GetId(), GL_COMPILE_STATUS, &compileSuccess );
205 if ( compileSuccess == GL_FALSE )
208 glGetShaderiv( shader.GetId(), GL_INFO_LOG_LENGTH, &logLength );
210 GLchar* log =
new GLchar[ logLength - 1 ];
211 glGetShaderInfoLog( shader.GetId(), logLength - 1,
nullptr, log );
213 TERROR(
"Unable to compile shader\n" );
214 TERROR(
"Error: %s\n", log );
223T2Shader T2Render::CreateShaderProgram( T2CompiledShader a_VertexShader, T2CompiledShader a_FragmentShader )
225 T2Shader program( a_VertexShader, a_FragmentShader );
231T2CompiledShader T2Render::CompileShaderFromFile( GLenum a_eShader,
const TCHAR* a_szFileName )
237 pFile->
Read( pSrc, uiFileSize );
238 pSrc[ uiFileSize ] =
'\0';
241 T2CompiledShader shader = T2Render::CompileShader( a_eShader, pSrc );
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 )
250 glGenTextures( 1, &uiTexture );
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 );
255 if ( a_pData && a_bGenerateMipmap )
257 glGenerateMipmap( GL_TEXTURE_2D );
263void T2Render::DestroyTexture( GLuint a_iId )
265 glDeleteTextures( 1, &a_iId );
268void T2Render::Update(
TFLOAT a_fDeltaTime )
274void T2Render::BeginScene()
278 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
279 glViewport( 0, 0, m_oWindowParams.uiWidth, m_oWindowParams.uiHeight );
281 m_bIsInScene =
TTRUE;
284void T2Render::EndScene()
288 SDL_GL_SwapWindow( m_pWindow->GetNativeWindow() );
292void T2Render::DestroyVertexBuffer(
const T2VertexBuffer& a_VertexBuffer )
294 GLuint uiId = a_VertexBuffer.GetId();
295 glDeleteBuffers( 1, &uiId );
298void T2Render::DestroyIndexBuffer(
const T2IndexBuffer& a_IndexBuffer )
300 GLuint uiId = a_IndexBuffer.GetId();
301 glDeleteBuffers( 1, &uiId );
304void T2Render::DestroyIndirectBuffer(
const T2IndirectBuffer& a_IndirectBuffer )
306 GLuint uiId = a_IndirectBuffer.GetId();
307 glDeleteBuffers( 1, &uiId );
310void T2Render::DestroyShaderStorageBuffer(
const T2IndirectBuffer& a_IndirectBuffer )
312 GLuint uiId = a_IndirectBuffer.GetId();
313 glDeleteBuffers( 1, &uiId );
316void T2Render::DestroyUniformBuffer(
const T2IndirectBuffer& a_IndirectBuffer )
318 GLuint uiId = a_IndirectBuffer.GetId();
319 glDeleteBuffers( 1, &uiId );
Core file system interface for the Toshi engine.
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
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)
static TFORCEINLINE T2TextureManager * CreateSingleton(Args &&... args)