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