1 // Copyright (C) 2013 Patryk Nadrowski
2 // Heavily based on the OpenGL driver implemented by Nikolaus Gebhardt
3 // OpenGL ES driver implemented by Christian Stehno and first OpenGL ES 2.0
4 // driver implemented by Amundis.
5 // This file is part of the "Irrlicht Engine".
6 // For conditions of distribution and use, see copyright notice in Irrlicht.h
7
8 #include "IrrCompileConfig.h"
9
10 #ifdef _IRR_COMPILE_WITH_OGLES2_
11
12 #include "COGLES2Renderer2D.h"
13 #include "IGPUProgrammingServices.h"
14 #include "os.h"
15 #include "COGLES2Driver.h"
16
17 namespace irr
18 {
19 namespace video
20 {
21
22 //! Constructor
COGLES2Renderer2D(const c8 * vertexShaderProgram,const c8 * pixelShaderProgram,COGLES2Driver * driver)23 COGLES2Renderer2D::COGLES2Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COGLES2Driver* driver)
24 : COGLES2MaterialRenderer(driver, 0, EMT_SOLID), RenderTargetSize(core::dimension2d<u32>(0,0)),
25 Matrix(core::matrix4::EM4CONST_NOTHING), Texture(0)
26 {
27 #ifdef _DEBUG
28 setDebugName("COGLES2Renderer2D");
29 #endif
30
31 int Temp = 0;
32
33 init(Temp, vertexShaderProgram, pixelShaderProgram, false);
34
35 Driver->getBridgeCalls()->setProgram(Program);
36
37 // These states doesn't change later.
38
39 MatrixID = getPixelShaderConstantID("uOrthoMatrix");
40 UseTextureID = getPixelShaderConstantID("uUseTexture");
41 s32 TextureUnitID = getPixelShaderConstantID("uTextureUnit");
42
43 int TextureUnit = 0;
44 setPixelShaderConstant(TextureUnitID, &TextureUnit, 1);
45
46 Driver->getBridgeCalls()->setProgram(0);
47 }
48
49
50 //! Destructor
~COGLES2Renderer2D()51 COGLES2Renderer2D::~COGLES2Renderer2D()
52 {
53 }
54
55
OnSetMaterial(const video::SMaterial & material,const video::SMaterial & lastMaterial,bool resetAllRenderstates,video::IMaterialRendererServices * services)56 void COGLES2Renderer2D::OnSetMaterial(const video::SMaterial& material,
57 const video::SMaterial& lastMaterial,
58 bool resetAllRenderstates,
59 video::IMaterialRendererServices* services)
60 {
61 Driver->getBridgeCalls()->setProgram(Program);
62
63 Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
64 }
65
66
OnRender(IMaterialRendererServices * service,E_VERTEX_TYPE vtxtype)67 bool COGLES2Renderer2D::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
68 {
69 Driver->setTextureRenderStates(Driver->getCurrentMaterial(), false);
70
71 const core::dimension2d<u32>& renderTargetSize = Driver->getCurrentRenderTargetSize();
72
73 if (RenderTargetSize != renderTargetSize)
74 {
75 Matrix.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-(s32)(renderTargetSize.Height)), -1.0f, 1.0f);
76 Matrix.setTranslation(core::vector3df(-1,1,0));
77
78 setPixelShaderConstant(MatrixID, Matrix.pointer(), 16);
79
80 RenderTargetSize = renderTargetSize;
81 }
82
83 int UseTexture = Texture ? 1 : 0;
84 setPixelShaderConstant(UseTextureID, &UseTexture, 1);
85
86 return true;
87 }
88
89
setTexture(const ITexture * texture)90 void COGLES2Renderer2D::setTexture(const ITexture* texture)
91 {
92 Texture = texture;
93 }
94
95
96 } // end namespace video
97 } // end namespace irr
98
99
100 #endif
101