move of SDLGL code from Utility to Image
This commit is contained in:
parent
b8ad6a40e8
commit
df8832e08b
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
Definition file for ZEngine Utilities which are used throughout the engine and can be used in
|
Definition file for ZEngine Utilities which are used throughout the engine and can be used in
|
||||||
conjunction with ZEngine.
|
conjunction with ZEngine.
|
||||||
<br>$Id: ZE_Utility.h,v 1.8 2003/10/13 21:40:05 cozman Exp $<br>
|
<br>$Id: ZE_Utility.h,v 1.9 2003/10/13 21:48:12 cozman Exp $<br>
|
||||||
\author James Turk
|
\author James Turk
|
||||||
**/
|
**/
|
||||||
|
|
||||||
@ -51,31 +51,6 @@ std::string FormatStr(const char *fmtstr, ...);
|
|||||||
**/
|
**/
|
||||||
SDL_RWops* RWFromZip(std::string zipname, std::string filename);
|
SDL_RWops* RWFromZip(std::string zipname, std::string filename);
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Rounds a number up to the nearest power of two.
|
|
||||||
|
|
||||||
Rounds a number up to the next highest power of two, used for OpenGL textures. (From testgl.c)
|
|
||||||
Used internally, generally shouldn't be called by users.
|
|
||||||
\param in Number to round up.
|
|
||||||
\return num rounded up to closest power of two.
|
|
||||||
\since 0.8.6
|
|
||||||
**/
|
|
||||||
int PowerOfTwo(int num);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Converts an SDL_Surface to an OpenGL texture ID.
|
|
||||||
|
|
||||||
Given an SDL_Surface returns a texture ID representing the OpenGL
|
|
||||||
texture assigned to that surface. Also returns texture coordinates
|
|
||||||
via texcoord parameter. (From SDL_GL_LoadTexture in testgl.c)
|
|
||||||
Used internally, generally shouldn't be called by users.
|
|
||||||
\param surface SDL_Surface to assign an OpenGL ID, returns unmodified.
|
|
||||||
\param texcoord Should be an array of 4 GLfloat, assigned texture coordinates for OpenGL use.
|
|
||||||
\return OpenGL texture ID for SDL_Surface, 0 if an error occurs.
|
|
||||||
\since 0.8.6
|
|
||||||
**/
|
|
||||||
GLuint SurfaceToTexture(SDL_Surface *surface, GLfloat *texcoord);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Properly free SDL_Surface.
|
\brief Properly free SDL_Surface.
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
\brief Definition file for ZImage.
|
\brief Definition file for ZImage.
|
||||||
|
|
||||||
Definition file for ZImage, the ZImage class for ZEngine.
|
Definition file for ZImage, the ZImage class for ZEngine.
|
||||||
<br>$Id: ZE_ZImage.h,v 1.27 2003/09/24 01:49:52 cozman Exp $<br>
|
<br>$Id: ZE_ZImage.h,v 1.28 2003/10/13 21:48:13 cozman Exp $<br>
|
||||||
\author James Turk
|
\author James Turk
|
||||||
**/
|
**/
|
||||||
|
|
||||||
@ -55,6 +55,31 @@ class ZImage
|
|||||||
GLfloat rWidth;
|
GLfloat rWidth;
|
||||||
//! Current draw height of Texture.
|
//! Current draw height of Texture.
|
||||||
GLfloat rHeight;
|
GLfloat rHeight;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Rounds a number up to the nearest power of two.
|
||||||
|
|
||||||
|
Rounds a number up to the next highest power of two, used for OpenGL textures. (From testgl.c)
|
||||||
|
Used internally, generally shouldn't be called by users.
|
||||||
|
\param in Number to round up.
|
||||||
|
\return num rounded up to closest power of two.
|
||||||
|
\since 0.8.6
|
||||||
|
**/
|
||||||
|
int PowerOfTwo(int num);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Converts an SDL_Surface to an OpenGL texture ID.
|
||||||
|
|
||||||
|
Given an SDL_Surface returns a texture ID representing the OpenGL
|
||||||
|
texture assigned to that surface. Also returns texture coordinates
|
||||||
|
via texcoord parameter. (From SDL_GL_LoadTexture in testgl.c)
|
||||||
|
Used internally, generally shouldn't be called by users.
|
||||||
|
\param surface SDL_Surface to assign an OpenGL ID, returns unmodified.
|
||||||
|
\param texcoord Should be an array of 4 GLfloat, assigned texture coordinates for OpenGL use.
|
||||||
|
\return OpenGL texture ID for SDL_Surface, 0 if an error occurs.
|
||||||
|
\since 0.8.6
|
||||||
|
**/
|
||||||
|
GLuint SurfaceToTexture(SDL_Surface *surface, GLfloat *texcoord);
|
||||||
#endif //GFX_BACKEND == OGL
|
#endif //GFX_BACKEND == OGL
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
\brief Source file for ZEngine utility functions.
|
\brief Source file for ZEngine utility functions.
|
||||||
|
|
||||||
Source file containing open utilities for use inside and alongside ZEngine.
|
Source file containing open utilities for use inside and alongside ZEngine.
|
||||||
<br>$Id: ZE_Utility.cpp,v 1.12 2003/10/13 21:40:05 cozman Exp $<br>
|
<br>$Id: ZE_Utility.cpp,v 1.13 2003/10/13 21:48:13 cozman Exp $<br>
|
||||||
\author James Turk
|
\author James Turk
|
||||||
**/
|
**/
|
||||||
|
|
||||||
@ -75,82 +75,6 @@ SDL_RWops* RWFromZip(std::string zipname, std::string filename)
|
|||||||
return SDL_RWFromMem(buffer, info.uncompressed_size); //return buffer in RW form
|
return SDL_RWFromMem(buffer, info.uncompressed_size); //return buffer in RW form
|
||||||
}
|
}
|
||||||
|
|
||||||
//from SDL's testgl.c power_of_two
|
|
||||||
int PowerOfTwo(int num)
|
|
||||||
{
|
|
||||||
int value = 1;
|
|
||||||
|
|
||||||
while(value < num) //texture coord must be >= input
|
|
||||||
value <<= 1; //value <<= 1 is the same as value *= 2
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
//from SDL's testgl.c SDL_GL_LoadTexture
|
|
||||||
GLuint SurfaceToTexture(SDL_Surface *surface, GLfloat *texcoord)
|
|
||||||
{
|
|
||||||
GLuint texture;
|
|
||||||
int w, h;
|
|
||||||
SDL_Surface *temp;
|
|
||||||
SDL_Rect area;
|
|
||||||
Uint32 saved_flags;
|
|
||||||
Uint8 saved_alpha;
|
|
||||||
|
|
||||||
//expand width and height to nearest powers of 2
|
|
||||||
w = PowerOfTwo(surface->w);
|
|
||||||
h = PowerOfTwo(surface->h);
|
|
||||||
texcoord[0] = 0.0f; //min X
|
|
||||||
texcoord[1] = 0.0f; //min Y
|
|
||||||
texcoord[2] = (GLfloat)surface->w / w; //max X
|
|
||||||
texcoord[3] = (GLfloat)surface->h / h; //max Y
|
|
||||||
|
|
||||||
temp = SDL_CreateRGBSurface(
|
|
||||||
SDL_SWSURFACE,
|
|
||||||
w, h,
|
|
||||||
32,
|
|
||||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN //endian specific color masks
|
|
||||||
0x000000FF,
|
|
||||||
0x0000FF00,
|
|
||||||
0x00FF0000,
|
|
||||||
0xFF000000
|
|
||||||
#else
|
|
||||||
0xFF000000,
|
|
||||||
0x00FF0000,
|
|
||||||
0x0000FF00,
|
|
||||||
0x000000FF
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
if(!temp) //failure in CreateRGBSurface
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//save alpha
|
|
||||||
saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
|
|
||||||
saved_alpha = surface->format->alpha;
|
|
||||||
if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
|
|
||||||
SDL_SetAlpha(surface, 0, 0);
|
|
||||||
|
|
||||||
//copy surface (do not alter passed surface to allow this function to be used in special situations)
|
|
||||||
area.x = 0;
|
|
||||||
area.y = 0;
|
|
||||||
area.w = static_cast<Sint16>(surface->w);
|
|
||||||
area.h = static_cast<Sint16>(surface->h);
|
|
||||||
SDL_BlitSurface(surface, &area, temp, &area);
|
|
||||||
|
|
||||||
//restore saved alpha
|
|
||||||
if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
|
|
||||||
SDL_SetAlpha(surface, saved_flags, saved_alpha);
|
|
||||||
|
|
||||||
//create the OpenGL texture
|
|
||||||
glGenTextures(1, &texture);
|
|
||||||
//setup texture parmaters
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp->pixels);
|
|
||||||
SDL_FreeSurface(temp); //temp surface no longer needed
|
|
||||||
|
|
||||||
return texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Each of the Free*s safely frees & NULLs the pointer
|
//Each of the Free*s safely frees & NULLs the pointer
|
||||||
void FreeImage(SDL_Surface *&image)
|
void FreeImage(SDL_Surface *&image)
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
\brief Source file for ZImage.
|
\brief Source file for ZImage.
|
||||||
|
|
||||||
Implementation of ZImage, the Image class for ZEngine.
|
Implementation of ZImage, the Image class for ZEngine.
|
||||||
<br>$Id: ZE_ZImage.cpp,v 1.49 2003/10/13 21:40:05 cozman Exp $<br>
|
<br>$Id: ZE_ZImage.cpp,v 1.50 2003/10/13 21:48:13 cozman Exp $<br>
|
||||||
\author James Turk
|
\author James Turk
|
||||||
**/
|
**/
|
||||||
|
|
||||||
@ -22,6 +22,85 @@
|
|||||||
namespace ZE
|
namespace ZE
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#if (GFX_BACKEND == ZE_OGL)
|
||||||
|
|
||||||
|
//from SDL's testgl.c power_of_two
|
||||||
|
int ZImage::PowerOfTwo(int num)
|
||||||
|
{
|
||||||
|
int value = 1;
|
||||||
|
|
||||||
|
while(value < num) //texture coord must be >= input
|
||||||
|
value <<= 1; //value <<= 1 is the same as value *= 2
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//from SDL's testgl.c SDL_GL_LoadTexture
|
||||||
|
GLuint ZImage::SurfaceToTexture(SDL_Surface *surface, GLfloat *texcoord)
|
||||||
|
{
|
||||||
|
GLuint texture;
|
||||||
|
int w, h;
|
||||||
|
SDL_Surface *temp;
|
||||||
|
SDL_Rect area;
|
||||||
|
Uint32 saved_flags;
|
||||||
|
Uint8 saved_alpha;
|
||||||
|
|
||||||
|
//expand width and height to nearest powers of 2
|
||||||
|
w = PowerOfTwo(surface->w);
|
||||||
|
h = PowerOfTwo(surface->h);
|
||||||
|
texcoord[0] = 0.0f; //min X
|
||||||
|
texcoord[1] = 0.0f; //min Y
|
||||||
|
texcoord[2] = (GLfloat)surface->w / w; //max X
|
||||||
|
texcoord[3] = (GLfloat)surface->h / h; //max Y
|
||||||
|
|
||||||
|
temp = SDL_CreateRGBSurface(
|
||||||
|
SDL_SWSURFACE,
|
||||||
|
w, h,
|
||||||
|
32,
|
||||||
|
#if SDL_BYTEORDER == SDL_LIL_ENDIAN //endian specific color masks
|
||||||
|
0x000000FF,
|
||||||
|
0x0000FF00,
|
||||||
|
0x00FF0000,
|
||||||
|
0xFF000000
|
||||||
|
#else
|
||||||
|
0xFF000000,
|
||||||
|
0x00FF0000,
|
||||||
|
0x0000FF00,
|
||||||
|
0x000000FF
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
if(!temp) //failure in CreateRGBSurface
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
//save alpha
|
||||||
|
saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
|
||||||
|
saved_alpha = surface->format->alpha;
|
||||||
|
if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
|
||||||
|
SDL_SetAlpha(surface, 0, 0);
|
||||||
|
|
||||||
|
//copy surface (do not alter passed surface to allow this function to be used in special situations)
|
||||||
|
area.x = 0;
|
||||||
|
area.y = 0;
|
||||||
|
area.w = static_cast<Sint16>(surface->w);
|
||||||
|
area.h = static_cast<Sint16>(surface->h);
|
||||||
|
SDL_BlitSurface(surface, &area, temp, &area);
|
||||||
|
|
||||||
|
//restore saved alpha
|
||||||
|
if((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
|
||||||
|
SDL_SetAlpha(surface, saved_flags, saved_alpha);
|
||||||
|
|
||||||
|
//create the OpenGL texture
|
||||||
|
glGenTextures(1, &texture);
|
||||||
|
//setup texture parmaters
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp->pixels);
|
||||||
|
SDL_FreeSurface(temp); //temp surface no longer needed
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
#endif //GFX_BACKEND == ZE_OGL
|
||||||
|
|
||||||
ZImage::ZImage() :
|
ZImage::ZImage() :
|
||||||
rEngine(ZEngine::GetInstance()),
|
rEngine(ZEngine::GetInstance()),
|
||||||
rImage(NULL),
|
rImage(NULL),
|
||||||
|
Loading…
Reference in New Issue
Block a user