SDLGL code move
This commit is contained in:
parent
2d2b88b4a6
commit
15178a25fa
@ -14,7 +14,7 @@
|
||||
|
||||
ZE_*.h files should only include this file and any other ZE_*.h files that they need, External Library or C/C++ Standard Library
|
||||
files should be included from within this file.
|
||||
$Id: ZE_Includes.h,v 1.19 2003/10/13 20:59:30 cozman Exp $<br>
|
||||
$Id: ZE_Includes.h,v 1.20 2003/10/13 21:40:05 cozman Exp $<br>
|
||||
\author James Turk
|
||||
**/
|
||||
|
||||
@ -26,7 +26,6 @@
|
||||
#include "SDL.h"
|
||||
#if (GFX_BACKEND == ZE_OGL)
|
||||
#include "SDL_opengl.h"
|
||||
#include "external/SDLGL_Util.h"
|
||||
#endif
|
||||
#ifdef USE_SDL_IMAGE
|
||||
#include "SDL_image.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
Definition file for ZEngine Utilities which are used throughout the engine and can be used in
|
||||
conjunction with ZEngine.
|
||||
<br>$Id: ZE_Utility.h,v 1.7 2003/10/05 19:42:34 cozman Exp $<br>
|
||||
<br>$Id: ZE_Utility.h,v 1.8 2003/10/13 21:40:05 cozman Exp $<br>
|
||||
\author James Turk
|
||||
**/
|
||||
|
||||
@ -42,8 +42,8 @@ std::string FormatStr(const char *fmtstr, ...);
|
||||
\brief Extracts a SDL_RWops memory structure from a zip archive.
|
||||
|
||||
Attempts to open a file from within a zipfile and return a SDL_RWops which can be used
|
||||
to load a resource from memory. Used by 'LoadFromZip' members of ZImage/ZSound/ZFont
|
||||
so generally not called.
|
||||
to load a resource from memory.
|
||||
Used internally, generally shouldn't be called by users.
|
||||
\param zipname Name of zip-format archive to open.
|
||||
\param filename Name of file within archive to access.
|
||||
\return On success, pointer to SDL_RWops, on failure, NULL.
|
||||
@ -51,6 +51,31 @@ std::string FormatStr(const char *fmtstr, ...);
|
||||
**/
|
||||
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.
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
\brief Source file for ZEngine utility functions.
|
||||
|
||||
Source file containing open utilities for use inside and alongside ZEngine.
|
||||
<br>$Id: ZE_Utility.cpp,v 1.11 2003/09/24 02:03:18 cozman Exp $<br>
|
||||
<br>$Id: ZE_Utility.cpp,v 1.12 2003/10/13 21:40:05 cozman Exp $<br>
|
||||
\author James Turk
|
||||
**/
|
||||
|
||||
@ -75,6 +75,82 @@ SDL_RWops* RWFromZip(std::string zipname, std::string filename)
|
||||
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
|
||||
void FreeImage(SDL_Surface *&image)
|
||||
{
|
||||
|
@ -13,7 +13,7 @@
|
||||
\brief Source file for ZImage.
|
||||
|
||||
Implementation of ZImage, the Image class for ZEngine.
|
||||
<br>$Id: ZE_ZImage.cpp,v 1.48 2003/10/11 16:21:50 cozman Exp $<br>
|
||||
<br>$Id: ZE_ZImage.cpp,v 1.49 2003/10/13 21:40:05 cozman Exp $<br>
|
||||
\author James Turk
|
||||
**/
|
||||
|
||||
@ -172,7 +172,7 @@ void ZImage::Attach(SDL_Surface *surface)
|
||||
|
||||
rWidth = static_cast<float>(surface->w);
|
||||
rHeight = static_cast<float>(surface->h);
|
||||
rTexID = SDL_GL_LoadTexture(surface,coord); //major helper, not written by me, from libsdl.org
|
||||
rTexID = SurfaceToTexture(surface,coord);
|
||||
rTexMinX = coord[0];
|
||||
rTexMinY = coord[1];
|
||||
rTexMaxX = coord[2];
|
||||
|
Loading…
Reference in New Issue
Block a user