Created
November 5, 2010 00:25
-
-
Save possan/663450 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* TextureRepository.cpp | |
* SafeDriverApp1 | |
* | |
* Created by Per-Olov Jernberg on 5/30/10. | |
* Copyright 2010 __MyCompanyName__. All rights reserved. | |
* | |
*/ | |
#include "TextureRepository.h" | |
#include <stdlib.h> | |
#include <string.h> | |
#include <math.h> | |
#import <OpenGLES/ES1/glext.h> | |
TextureRepository::TextureRepository() | |
{ | |
m_textures = (TextureInfo *)malloc( sizeof(TextureInfo) * 50 ); | |
memset( m_textures, 0, sizeof(TextureInfo) * 50 ); | |
m_wireframe = false; | |
_valid = false; | |
} | |
TextureRepository::~TextureRepository() | |
{ | |
for( int j=0; j<50; j++ ) | |
if( m_textures[j].texid != 0 ) | |
glDeleteTextures(1, &m_textures[j].texid); | |
free( m_textures ); | |
} | |
bool TextureRepository::IsValid() | |
{ | |
return _valid; | |
} | |
void TextureRepository::SetValid() | |
{ | |
_valid = true; | |
} | |
void TextureRepository::Reset() | |
{ | |
_valid = false; | |
for( int j=0; j<50; j++ ) | |
{ | |
if( m_textures[j].texid != 0 ) | |
{ | |
glDeleteTextures(1, &m_textures[j].texid); | |
m_textures[j].texid = 0; | |
} | |
} | |
} | |
void TextureRepository::SetWireframe( bool wire ) | |
{ | |
m_wireframe = wire; | |
} | |
void TextureRepository::BindTexture( int index ) | |
{ | |
if( index != -1 ) | |
{ | |
GLuint newtex = m_textures[ index ].texid; | |
if( newtex != m_lasttexture ) | |
{ | |
glEnable( GL_TEXTURE_2D ); | |
glBindTexture( GL_TEXTURE_2D, newtex ); | |
m_lasttexture = newtex; | |
} | |
} | |
else { | |
glDisable( GL_TEXTURE_2D ); | |
} | |
} | |
void TextureRepository::RegisterSize( int index, int width, int height ) | |
{ | |
m_textures[ index ].width = width; | |
m_textures[ index ].height = height; | |
} | |
void TextureRepository::RegisterRGBA( int index, unsigned char *pixels, int width, int height ) | |
{ | |
GLuint tex; | |
glGenTextures( 1, &tex ); | |
glBindTexture( GL_TEXTURE_2D, tex ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); | |
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width,height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); | |
glGenerateMipmapOES(GL_TEXTURE_2D); | |
m_textures[ index ].width = width; | |
m_textures[ index ].height = height; | |
m_textures[ index ].texid = tex; | |
} | |
void TextureRepository::RegisterA8( int index, unsigned char *pixels, int width, int height ) | |
{ | |
GLuint tex; | |
glGenTextures( 1, &tex ); | |
glBindTexture( GL_TEXTURE_2D, tex ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); | |
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); | |
glTexImage2D( GL_TEXTURE_2D, 0, GL_ALPHA, width,height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels); | |
glGenerateMipmapOES(GL_TEXTURE_2D); | |
m_textures[ index ].width = width; | |
m_textures[ index ].height = height; | |
m_textures[ index ].texid = tex; | |
} | |
void TextureRepository::DrawSquare( int texture, float w,float h, unsigned char r,unsigned char g,unsigned char b,unsigned char a ) | |
{ | |
DrawSquare( texture, -w/2,-h/2, w/2,h/2, 0,0,1,1, r,g,b,a ); | |
} | |
void TextureRepository::DrawSquare( int texture, float x0,float y0,float x1,float y1, float u0,float v0, float u1,float v1, unsigned char r,unsigned char g,unsigned char b,unsigned char a ) | |
{ | |
GLfloat sprite2Vertices[3*8]; | |
GLfloat spriteVertices[3*4]; | |
GLubyte spriteColors[4*4]; | |
GLfloat spriteTex[2*4]; | |
if( m_wireframe) | |
{ | |
sprite2Vertices[0] = x0; | |
sprite2Vertices[1] = y0; | |
sprite2Vertices[2] = 0; | |
sprite2Vertices[3] = x1; | |
sprite2Vertices[4] = y0; | |
sprite2Vertices[5] = 0; | |
sprite2Vertices[6] = x1; | |
sprite2Vertices[7] = y0; | |
sprite2Vertices[8] = 0; | |
sprite2Vertices[9] = x1; | |
sprite2Vertices[10] = y1; | |
sprite2Vertices[11] = 0; | |
sprite2Vertices[12] = x1; | |
sprite2Vertices[13] = y1; | |
sprite2Vertices[14] = 0; | |
sprite2Vertices[15] = x0; | |
sprite2Vertices[16] = y1; | |
sprite2Vertices[17] = 0; | |
sprite2Vertices[18] = x0; | |
sprite2Vertices[19] = y1; | |
sprite2Vertices[20] = 0; | |
sprite2Vertices[21] = x0; | |
sprite2Vertices[22] = y0; | |
sprite2Vertices[23] = 0; | |
BindTexture( -1 ); | |
glDisable( GL_TEXTURE_2D ); | |
glVertexPointer(3, GL_FLOAT, 0, sprite2Vertices); | |
glEnableClientState( GL_VERTEX_ARRAY ); | |
glDisableClientState( GL_TEXTURE_COORD_ARRAY ); | |
glDisableClientState( GL_COLOR_ARRAY ); | |
glDrawArrays(GL_LINES, 0, 8); | |
} | |
else | |
{ | |
spriteVertices[0] = x0; | |
spriteVertices[1] = y0; | |
spriteVertices[2] = 0; | |
spriteTex[0] = u0; | |
spriteTex[1] = v0; | |
spriteColors[0] = r; | |
spriteColors[1] = g; | |
spriteColors[2] = b; | |
spriteColors[3] = a; | |
spriteVertices[3] = x1; | |
spriteVertices[4] = y0; | |
spriteVertices[5] = 0; | |
spriteTex[2] = u1; | |
spriteTex[3] = v0; | |
spriteColors[4] = r; | |
spriteColors[5] = g; | |
spriteColors[6] = b; | |
spriteColors[7] = a; | |
spriteVertices[6] = x0; | |
spriteVertices[7] = y1; | |
spriteVertices[8] = 0; | |
spriteTex[4] = u0; | |
spriteTex[5] = v1; | |
spriteColors[8] = r; | |
spriteColors[9] = g; | |
spriteColors[10] = b; | |
spriteColors[11] = a; | |
spriteVertices[9] = x1; | |
spriteVertices[10] = y1; | |
spriteVertices[11] = 0; | |
spriteTex[6] = u1; | |
spriteTex[7] = v1; | |
spriteColors[12] = r; | |
spriteColors[13] = g; | |
spriteColors[14] = b; | |
spriteColors[15] = a; | |
BindTexture( texture ); | |
if( texture > 0 ) | |
glBindTexture( GL_TEXTURE_2D, m_textures[ texture ].texid ); | |
else | |
glDisable( GL_TEXTURE_2D ); | |
glTexCoordPointer(2, GL_FLOAT, 0, spriteTex); | |
glEnableClientState( GL_TEXTURE_COORD_ARRAY ); | |
glColorPointer(4, GL_UNSIGNED_BYTE, 0, spriteColors); | |
glEnableClientState( GL_COLOR_ARRAY ); | |
glVertexPointer(3, GL_FLOAT, 0, spriteVertices); | |
glEnableClientState( GL_VERTEX_ARRAY ); | |
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | |
} | |
} | |
void VECZERO( float *targ ) | |
{ | |
targ[0] = .0f; | |
targ[1] = .0f; | |
targ[2] = .0f; | |
} | |
void VECSET( float *targ, float x, float y ) | |
{ | |
targ[0] = x; | |
targ[1] = y; | |
targ[2] = .0f; | |
} | |
void VECADD( float *targ, float *src ) | |
{ | |
targ[0] += src[0]; | |
targ[1] += src[1]; | |
targ[2] += src[2]; | |
} | |
void VECCOPY( float *targ, float *src ) | |
{ | |
targ[0] = src[0]; | |
targ[1] = src[1]; | |
targ[2] = src[2]; | |
} | |
void VECADDMUL( float *targ, float *src, float *srcmul ) | |
{ | |
targ[0] += src[0] * srcmul[0]; | |
targ[1] += src[1] * srcmul[1]; | |
targ[2] += src[2] * srcmul[2]; | |
} | |
void VECADDMUL( float *targ, float src, float *srcmul ) | |
{ | |
targ[0] += src * srcmul[0]; | |
targ[1] += src * srcmul[1]; | |
targ[2] += src * srcmul[2]; | |
} | |
void TextureRepository::DrawFacingSquare( int texture, float x0,float y0,float x1,float y1, float u0,float v0, float u1,float v1, unsigned char r,unsigned char g,unsigned char b,unsigned char a, float rotation, float dx,float dy ) | |
{ | |
GLfloat cornerVertices[4*4]; | |
// VECZERO((float*)&cornerVertices[0]); | |
// VECZERO((float*)&cornerVertices[3]); | |
// VECZERO((float*)&cornerVertices[6]); | |
// VECZERO((float*)&cornerVertices[9]); | |
VECZERO((float*)&cornerVertices[0]); | |
cornerVertices[0] = x0; | |
cornerVertices[1] = y0; | |
VECZERO((float*)&cornerVertices[3]); | |
cornerVertices[3] = x1; | |
cornerVertices[4] = y0; | |
VECZERO((float*)&cornerVertices[6]); | |
cornerVertices[6] = x0; | |
cornerVertices[7] = y1; | |
VECZERO((float*)&cornerVertices[9]); | |
cornerVertices[9] = x1; | |
cornerVertices[10] = y1; | |
float rad = rotation * M_PI / 180.0f; | |
float _cos = cos(rad); | |
float _sin = sin(rad); | |
for( int q=0;q<=9;q+=3 ) | |
{ | |
float _x2 = cornerVertices[q+0] * _cos + cornerVertices[q+1] * _sin; | |
float _y2 = cornerVertices[q+0] * -_sin + cornerVertices[q+1] * _cos; | |
cornerVertices[q+0] = _x2; | |
cornerVertices[q+1] = _y2; | |
} | |
GLfloat spriteVertices[4*4]; | |
VECZERO((float*)&spriteVertices[0]); | |
VECZERO((float*)&spriteVertices[3]); | |
VECZERO((float*)&spriteVertices[6]); | |
VECZERO((float*)&spriteVertices[9]); | |
VECADDMUL((float*)&spriteVertices[0], cornerVertices[0], (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[0], cornerVertices[1], (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[3], cornerVertices[3], (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[3], cornerVertices[4], (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[6], cornerVertices[6], (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[6], cornerVertices[7], (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[9], cornerVertices[9], (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[9], cornerVertices[10], (float*)&m_up ); | |
// VECADDMUL((float*)&spriteVertices[0], x0, (float*)&m_right ); | |
// VECADDMUL((float*)&spriteVertices[0], y0, (float*)&m_up ); | |
// VECADDMUL((float*)&spriteVertices[3], x1, (float*)&m_right ); | |
// VECADDMUL((float*)&spriteVertices[3], y0, (float*)&m_up ); | |
// VECADDMUL((float*)&spriteVertices[6], x0, (float*)&m_right ); | |
// VECADDMUL((float*)&spriteVertices[6], y1, (float*)&m_up ); | |
// VECADDMUL((float*)&spriteVertices[9], x1, (float*)&m_right ); | |
// VECADDMUL((float*)&spriteVertices[9], y1, (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[0], dx, (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[0], dy, (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[3], dx, (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[3], dy, (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[6], dx, (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[6], dy, (float*)&m_up ); | |
VECADDMUL((float*)&spriteVertices[9], dx, (float*)&m_right ); | |
VECADDMUL((float*)&spriteVertices[9], dy, (float*)&m_up ); | |
if( m_wireframe ) | |
{ | |
GLfloat sprite2Vertices[3*12]; | |
sprite2Vertices[0] = spriteVertices[0]; | |
sprite2Vertices[1] = spriteVertices[1]; | |
sprite2Vertices[2] = spriteVertices[2]; | |
sprite2Vertices[3] = spriteVertices[3]; | |
sprite2Vertices[4] = spriteVertices[4]; | |
sprite2Vertices[5] = spriteVertices[5]; | |
sprite2Vertices[6] = spriteVertices[3]; | |
sprite2Vertices[7] = spriteVertices[4]; | |
sprite2Vertices[8] = spriteVertices[5]; | |
sprite2Vertices[9] = spriteVertices[6]; | |
sprite2Vertices[10] = spriteVertices[7]; | |
sprite2Vertices[11] = spriteVertices[8]; | |
sprite2Vertices[12] = spriteVertices[6]; | |
sprite2Vertices[13] = spriteVertices[7]; | |
sprite2Vertices[14] = spriteVertices[8]; | |
sprite2Vertices[15] = spriteVertices[9]; | |
sprite2Vertices[16] = spriteVertices[10]; | |
sprite2Vertices[17] = spriteVertices[11]; | |
sprite2Vertices[18] = spriteVertices[9]; | |
sprite2Vertices[19] = spriteVertices[10]; | |
sprite2Vertices[20] = spriteVertices[11]; | |
sprite2Vertices[21] = spriteVertices[0]; | |
sprite2Vertices[22] = spriteVertices[1]; | |
sprite2Vertices[23] = spriteVertices[2]; | |
sprite2Vertices[24] = spriteVertices[0]; | |
sprite2Vertices[25] = spriteVertices[1]; | |
sprite2Vertices[26] = spriteVertices[2]; | |
sprite2Vertices[27] = spriteVertices[6]; | |
sprite2Vertices[28] = spriteVertices[7]; | |
sprite2Vertices[29] = spriteVertices[8]; | |
sprite2Vertices[30] = spriteVertices[3]; | |
sprite2Vertices[31] = spriteVertices[4]; | |
sprite2Vertices[32] = spriteVertices[5]; | |
sprite2Vertices[33] = spriteVertices[9]; | |
sprite2Vertices[34] = spriteVertices[10]; | |
sprite2Vertices[35] = spriteVertices[11]; | |
glDisable( GL_TEXTURE_2D ); | |
glVertexPointer(3, GL_FLOAT, 0, sprite2Vertices); | |
glEnableClientState( GL_VERTEX_ARRAY ); | |
glDisableClientState( GL_TEXTURE_COORD_ARRAY ); | |
glDisableClientState( GL_COLOR_ARRAY ); | |
glDrawArrays(GL_LINES, 0, 12); | |
return; | |
} | |
GLfloat spriteTex[2*4]; | |
spriteTex[0] = u0; | |
spriteTex[1] = v0; | |
spriteTex[2] = u1; | |
spriteTex[3] = v0; | |
spriteTex[4] = u0; | |
spriteTex[5] = v1; | |
spriteTex[6] = u1; | |
spriteTex[7] = v1; | |
GLubyte spriteColors[4*4]; | |
spriteColors[0] = r; | |
spriteColors[1] = g; | |
spriteColors[2] = b; | |
spriteColors[3] = a; | |
spriteColors[4] = r; | |
spriteColors[5] = g; | |
spriteColors[6] = b; | |
spriteColors[7] = a; | |
spriteColors[8] = r; | |
spriteColors[9] = g; | |
spriteColors[10] = b; | |
spriteColors[11] = a; | |
spriteColors[12] = r; | |
spriteColors[13] = g; | |
spriteColors[14] = b; | |
spriteColors[15] = a; | |
if( texture > 0 ) | |
{ | |
glEnable( GL_TEXTURE_2D ); | |
glBindTexture( GL_TEXTURE_2D, m_textures[ texture ].texid ); | |
} | |
else | |
{ | |
glDisable( GL_TEXTURE_2D ); | |
} | |
glTexCoordPointer(2, GL_FLOAT, 0, spriteTex); | |
glEnableClientState( GL_TEXTURE_COORD_ARRAY ); | |
glColorPointer(4, GL_UNSIGNED_BYTE, 0, spriteColors); | |
glEnableClientState( GL_COLOR_ARRAY ); | |
glVertexPointer(3, GL_FLOAT, 0, spriteVertices); | |
glEnableClientState( GL_VERTEX_ARRAY ); | |
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | |
} | |
void TextureRepository::SetCameraMatrix( float *matrixdata ) | |
{ | |
m_up[0] = 0; | |
m_up[1] = 0; | |
m_up[2] = 1; | |
m_right[0] = 1; | |
m_right[1] = 0; | |
m_right[2] = 0; | |
m_up[0] = matrixdata[1]; | |
m_up[1] = matrixdata[5]; | |
m_up[2] = matrixdata[9]; | |
float l1 = sqrt(m_up[0]*m_up[0] + m_up[1]*m_up[1] + m_up[2]*m_up[2]); | |
m_up[0] /= l1; | |
m_up[1] /= l1; | |
m_up[2] /= l1; | |
m_right[0] = matrixdata[0]; | |
m_right[1] = matrixdata[4]; | |
m_right[2] = matrixdata[8]; | |
float l2 = sqrt(m_right[0]*m_right[0] + m_right[1]*m_right[1] + m_right[2]*m_right[2]); | |
m_right[0] /= l2; | |
m_right[1] /= l2; | |
m_right[2] /= l2; | |
} | |
void TextureRepository::DrawNumbers( int texturebase, char *numbers, float spacing, float centering, float radius ) | |
{ | |
int len = strlen(numbers); | |
float x = -spacing*(len-1)*centering; | |
for( int ch=0; ch<len; ch++ ) | |
{ | |
DrawSquare( texturebase + numbers[ch] - '0', x-radius,-radius,x+radius,+radius, 0,0,1,1, 255,255,255,255 ); | |
x += spacing; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment