17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/******************************************************************************
27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @File         OGLES2/PVRTBackground.cpp
47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Title        OGLES2/PVRTBackground
67b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
77b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Version
87b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
97b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Copyright    Copyright (c) Imagination Technologies Limited.
107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Platform     ANSI compatible
127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description  Function to draw a background texture.
147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/
167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTShader.h"
177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTBackground.h"
187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// The header that contains the shaders
207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTBackgroundShaders.h"
217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// Index to bind the attributes to vertex shaders
237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst int VERTEX_ARRAY = 0;
247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst int TEXCOORD_ARRAY = 1;
257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/****************************************************************************
277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Structures
287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// The struct to include various API variables
317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct SPVRTBackgroundAPI
327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLuint	m_ui32VertexShader;
347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLuint	m_ui32FragShader;
357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLuint	m_ui32ProgramObject;
367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLuint	m_ui32VertexBufferObject;
377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/****************************************************************************
407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Class: CPVRTBackground
417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			Background
457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Init some values.
467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
477b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTBackground::CPVRTBackground(void)
487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_bInit = false;
507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI  = 0;
517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			~Background
567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Calls Destroy()
577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
587b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTBackground::~CPVRTBackground(void)
597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	delete m_pAPI;
617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI = 0;
627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function		Destroy
667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description	Destroys the background and releases API specific resources
677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTBackground::Destroy()
697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(m_bInit)
717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Delete shaders
737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glDeleteProgram(m_pAPI->m_ui32ProgramObject);
747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glDeleteShader(m_pAPI->m_ui32VertexShader);
757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glDeleteShader(m_pAPI->m_ui32FragShader);
767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Delete buffer objects
787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glDeleteBuffers(1, &m_pAPI->m_ui32VertexBufferObject);
797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_bInit = false;
817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	delete m_pAPI;
847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI = 0;
857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function		Init
897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input			pContext	A pointer to a PVRTContext
907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input			bRotate		true to rotate texture 90 degrees.
917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input			pszError	An option string for returning errors
927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Return 		PVR_SUCCESS on success
937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description	Initialises the background
947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
957b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTBackground::Init(const SPVRTContext * const pContext, bool bRotate, CPVRTString *pszError)
967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRT_UNREFERENCED_PARAMETER(pContext);
987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	Destroy();
1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI = new SPVRTBackgroundAPI;
1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!m_pAPI)
1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(pszError)
1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*pszError = "Error: Insufficient memory to allocate SCPVRTBackgroundAPI.";
1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
1097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI->m_ui32VertexShader = 0;
1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI->m_ui32FragShader = 0;
1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI->m_ui32ProgramObject = 0;
1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI->m_ui32VertexBufferObject = 0;
1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bResult;
1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString sTmpErrStr;
1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// The shader loading code doesn't expect a null pointer for the error string
1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!pszError)
1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pszError = &sTmpErrStr;
1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/* Compiles the shaders. For a more detailed explanation, see IntroducingPVRTools */
1247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(GL_SGX_BINARY_IMG)
1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Try binary shaders first
1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bResult = (PVRTShaderLoadBinaryFromMemory(_BackgroundFragShader_fsc, _BackgroundFragShader_fsc_size,
1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					GL_FRAGMENT_SHADER, GL_SGX_BINARY_IMG, &m_pAPI->m_ui32FragShader, pszError) == PVR_SUCCESS)
1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		       && (PVRTShaderLoadBinaryFromMemory(_BackgroundVertShader_vsc, _BackgroundVertShader_vsc_size,
1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					GL_VERTEX_SHADER, GL_SGX_BINARY_IMG, &m_pAPI->m_ui32VertexShader, pszError) == PVR_SUCCESS);
1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!bResult)
1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// if binary shaders don't work, try source shaders
1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bResult = (PVRTShaderLoadSourceFromMemory(_BackgroundFragShader_fsh, GL_FRAGMENT_SHADER, &m_pAPI->m_ui32FragShader, pszError) == PVR_SUCCESS) &&
1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				(PVRTShaderLoadSourceFromMemory(_BackgroundVertShader_vsh, GL_VERTEX_SHADER, &m_pAPI->m_ui32VertexShader, pszError)  == PVR_SUCCESS);
1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_ASSERT(bResult);
1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!bResult)
1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Reset the error string
1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(pszError)
1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*pszError = "";
1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Create the shader program
1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pAPI->m_ui32ProgramObject = glCreateProgram();
1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Attach the fragment and vertex shaders to it
1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glAttachShader(m_pAPI->m_ui32ProgramObject, m_pAPI->m_ui32FragShader);
1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glAttachShader(m_pAPI->m_ui32ProgramObject, m_pAPI->m_ui32VertexShader);
1537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Bind the custom vertex attribute "myVertex" to location VERTEX_ARRAY
1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindAttribLocation(m_pAPI->m_ui32ProgramObject, VERTEX_ARRAY, "myVertex");
1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Bind the custom vertex attribute "myUV" to location TEXCOORD_ARRAY
1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindAttribLocation(m_pAPI->m_ui32ProgramObject, TEXCOORD_ARRAY, "myUV");
1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Link the program
1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glLinkProgram(m_pAPI->m_ui32ProgramObject);
1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLint Linked;
1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glGetProgramiv(m_pAPI->m_ui32ProgramObject, GL_LINK_STATUS, &Linked);
1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (!Linked)
1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int i32InfoLogLength, i32CharsWritten;
1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glGetProgramiv(m_pAPI->m_ui32ProgramObject, GL_INFO_LOG_LENGTH, &i32InfoLogLength);
1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		char* pszInfoLog = new char[i32InfoLogLength];
1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glGetProgramInfoLog(m_pAPI->m_ui32ProgramObject, i32InfoLogLength, &i32CharsWritten, pszInfoLog);
1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*pszError = CPVRTString("Failed to link: ") + pszInfoLog + "\n";
1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		delete [] pszInfoLog;
1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bResult = false;
1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_ASSERT(bResult);
1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!bResult)
1787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Use the loaded shader program
1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glUseProgram(m_pAPI->m_ui32ProgramObject);
1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Set the sampler2D variable to the first texture unit
1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glUniform1i(glGetUniformLocation(m_pAPI->m_ui32ProgramObject, "sampler2d"), 0);
1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Create the vertex buffer object
1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLfloat *pVertexData = 0;
1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// The vertex data for non-rotated
1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLfloat afVertexData[16] = { -1, -1, 1, -1, -1, 1, 1, 1,
1917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						0, 0, 1, 0, 0, 1, 1, 1};
1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// The vertex data for rotated
1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLfloat afVertexDataRotated[16] = {-1, 1, -1, -1, 1, 1, 1, -1,
1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						1, 1, 0, 1, 1, 0, 0, 0};
1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!bRotate)
1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pVertexData = &afVertexData[0];
1997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pVertexData = &afVertexDataRotated[0];
2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glGenBuffers(1, &m_pAPI->m_ui32VertexBufferObject);
2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindBuffer(GL_ARRAY_BUFFER, m_pAPI->m_ui32VertexBufferObject);
2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 16, pVertexData, GL_STATIC_DRAW);
2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindBuffer(GL_ARRAY_BUFFER, 0);
2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_bInit = true;
2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function		Draw
2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input			ui32Texture	Texture to use
2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Return 		PVR_SUCCESS on success
2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description	Draws a texture on a quad covering the whole screen.
2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
2217b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTBackground::Draw(const GLuint ui32Texture)
2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!m_bInit)
2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glActiveTexture(GL_TEXTURE0);
2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindTexture(GL_TEXTURE_2D, ui32Texture);
2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDisable(GL_DEPTH_TEST);
2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDisable(GL_CULL_FACE);
2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Use the loaded shader program
2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glUseProgram(m_pAPI->m_ui32ProgramObject);
2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Set vertex data
2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindBuffer(GL_ARRAY_BUFFER, m_pAPI->m_ui32VertexBufferObject);
2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glEnableVertexAttribArray(VERTEX_ARRAY);
2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glVertexAttribPointer(VERTEX_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, (const void*) 0);
2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Set texture coordinates
2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glEnableVertexAttribArray(TEXCOORD_ARRAY);
2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, (const void*) (8 * sizeof(float)));
2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Render geometry
2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDisableVertexAttribArray(VERTEX_ARRAY);
2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDisableVertexAttribArray(TEXCOORD_ARRAY);
2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glBindBuffer(GL_ARRAY_BUFFER, 0);
2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glUseProgram(0);
2557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens End of file (CPVRTBackground.cpp)
2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
263