Skip to content

Instantly share code, notes, and snippets.

@possan
Created November 5, 2010 00:25
Show Gist options
  • Save possan/663450 to your computer and use it in GitHub Desktop.
Save possan/663450 to your computer and use it in GitHub Desktop.
/*
* 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