libzoom: Texturformat durch PNG ersetzt; zoom: Texturen duch PNG ersetzt
This commit is contained in:
parent
671a686311
commit
6f419cd620
7 changed files with 5142 additions and 4122 deletions
|
@ -1,5 +1,5 @@
|
||||||
lib_LTLIBRARIES = libzoom.la
|
lib_LTLIBRARIES = libzoom.la
|
||||||
libzoom_la_SOURCES = init.c level.c player.c render.c texture.c light.c
|
libzoom_la_SOURCES = init.c level.c player.c render.c texture.c light.c
|
||||||
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@
|
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@ @LIBPNG_CFLAGS@
|
||||||
libzoom_la_LIBADD = @GL_LIBS@ @GLU_LIBS@
|
libzoom_la_LIBADD = @GL_LIBS@ @GLU_LIBS@ @LIBPNG_LIBS@
|
||||||
nobase_include_HEADERS = zoom/types.h zoom/init.h zoom/level.h zoom/player.h zoom/render.h zoom/texture.h zoom/light.h
|
nobase_include_HEADERS = zoom/types.h zoom/init.h zoom/level.h zoom/player.h zoom/render.h zoom/texture.h zoom/light.h
|
||||||
|
|
|
@ -76,6 +76,8 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
|
||||||
|
LIBPNG_LIBS = @LIBPNG_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
@ -92,6 +94,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
PTHREAD_CC = @PTHREAD_CC@
|
PTHREAD_CC = @PTHREAD_CC@
|
||||||
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
|
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
|
||||||
PTHREAD_LIBS = @PTHREAD_LIBS@
|
PTHREAD_LIBS = @PTHREAD_LIBS@
|
||||||
|
@ -148,8 +151,8 @@ sysconfdir = @sysconfdir@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
lib_LTLIBRARIES = libzoom.la
|
lib_LTLIBRARIES = libzoom.la
|
||||||
libzoom_la_SOURCES = init.c level.c player.c render.c texture.c light.c
|
libzoom_la_SOURCES = init.c level.c player.c render.c texture.c light.c
|
||||||
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@
|
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@ @LIBPNG_CFLAGS@
|
||||||
libzoom_la_LIBADD = @GL_LIBS@ @GLU_LIBS@
|
libzoom_la_LIBADD = @GL_LIBS@ @GLU_LIBS@ @LIBPNG_LIBS@
|
||||||
nobase_include_HEADERS = zoom/types.h zoom/init.h zoom/level.h zoom/player.h zoom/render.h zoom/texture.h zoom/light.h
|
nobase_include_HEADERS = zoom/types.h zoom/init.h zoom/level.h zoom/player.h zoom/render.h zoom/texture.h zoom/light.h
|
||||||
subdir = .
|
subdir = .
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
|
158
aclocal.m4
vendored
158
aclocal.m4
vendored
|
@ -7121,3 +7121,161 @@ AC_DEFUN([AM_MAINTAINER_MODE],
|
||||||
|
|
||||||
AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
|
AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
|
||||||
|
|
||||||
|
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||||
|
# ----------------------------------
|
||||||
|
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||||
|
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||||
|
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
|
||||||
|
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
|
||||||
|
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||||
|
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
|
||||||
|
fi
|
||||||
|
if test -n "$PKG_CONFIG"; then
|
||||||
|
_pkg_min_version=m4_default([$1], [0.9.0])
|
||||||
|
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
|
||||||
|
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
PKG_CONFIG=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi[]dnl
|
||||||
|
])# PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
|
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||||
|
#
|
||||||
|
# Check to see whether a particular set of modules exists. Similar
|
||||||
|
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
|
||||||
|
# this or PKG_CHECK_MODULES is called, or make sure to call
|
||||||
|
# PKG_CHECK_EXISTS manually
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||||
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
|
if test -n "$PKG_CONFIG" && \
|
||||||
|
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
|
||||||
|
m4_ifval([$2], [$2], [:])
|
||||||
|
m4_ifvaln([$3], [else
|
||||||
|
$3])dnl
|
||||||
|
fi])
|
||||||
|
|
||||||
|
|
||||||
|
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||||
|
# ---------------------------------------------
|
||||||
|
m4_define([_PKG_CONFIG],
|
||||||
|
[if test -n "$PKG_CONFIG"; then
|
||||||
|
if test -n "$$1"; then
|
||||||
|
pkg_cv_[]$1="$$1"
|
||||||
|
else
|
||||||
|
PKG_CHECK_EXISTS([$3],
|
||||||
|
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
|
||||||
|
[pkg_failed=yes])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
pkg_failed=untried
|
||||||
|
fi[]dnl
|
||||||
|
])# _PKG_CONFIG
|
||||||
|
|
||||||
|
# _PKG_SHORT_ERRORS_SUPPORTED
|
||||||
|
# -----------------------------
|
||||||
|
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||||
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||||
|
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||||
|
_pkg_short_errors_supported=yes
|
||||||
|
else
|
||||||
|
_pkg_short_errors_supported=no
|
||||||
|
fi[]dnl
|
||||||
|
])# _PKG_SHORT_ERRORS_SUPPORTED
|
||||||
|
|
||||||
|
|
||||||
|
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||||
|
# [ACTION-IF-NOT-FOUND])
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Note that if there is a possibility the first call to
|
||||||
|
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||||
|
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
AC_DEFUN([PKG_CHECK_MODULES],
|
||||||
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
|
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||||
|
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||||
|
|
||||||
|
pkg_failed=no
|
||||||
|
AC_MSG_CHECKING([for $1])
|
||||||
|
|
||||||
|
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||||
|
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||||
|
|
||||||
|
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
|
||||||
|
and $1[]_LIBS to avoid the need to call pkg-config.
|
||||||
|
See the pkg-config man page for more details.])
|
||||||
|
|
||||||
|
if test $pkg_failed = yes; then
|
||||||
|
_PKG_SHORT_ERRORS_SUPPORTED
|
||||||
|
if test $_pkg_short_errors_supported = yes; then
|
||||||
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
|
||||||
|
else
|
||||||
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
|
||||||
|
fi
|
||||||
|
# Put the nasty error message in config.log where it belongs
|
||||||
|
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
|
||||||
|
|
||||||
|
ifelse([$4], , [AC_MSG_ERROR(dnl
|
||||||
|
[Package requirements ($2) were not met:
|
||||||
|
|
||||||
|
$$1_PKG_ERRORS
|
||||||
|
|
||||||
|
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||||
|
installed software in a non-standard prefix.
|
||||||
|
|
||||||
|
_PKG_TEXT
|
||||||
|
])],
|
||||||
|
[AC_MSG_RESULT([no])
|
||||||
|
$4])
|
||||||
|
elif test $pkg_failed = untried; then
|
||||||
|
ifelse([$4], , [AC_MSG_FAILURE(dnl
|
||||||
|
[The pkg-config script could not be found or is too old. Make sure it
|
||||||
|
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||||
|
path to pkg-config.
|
||||||
|
|
||||||
|
_PKG_TEXT
|
||||||
|
|
||||||
|
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
|
||||||
|
[$4])
|
||||||
|
else
|
||||||
|
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
|
||||||
|
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
ifelse([$3], , :, [$3])
|
||||||
|
fi[]dnl
|
||||||
|
])# PKG_CHECK_MODULES
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ AM_MAINTAINER_MODE
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
|
PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
# Checks for libraries.
|
# Checks for libraries.
|
||||||
AX_CHECK_GL
|
AX_CHECK_GL
|
||||||
|
@ -25,6 +26,7 @@ if test x$no_gl = xyes; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CHECK_LIB(neofx, MatrixMul, , AC_MSG_ERROR([NeoFX Library not found]))
|
AC_CHECK_LIB(neofx, MatrixMul, , AC_MSG_ERROR([NeoFX Library not found]))
|
||||||
|
PKG_CHECK_MODULES(LIBPNG, libpng, , AC_MSG_ERROR(Test for libpng failed.))
|
||||||
|
|
||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
|
|
4
init.c
4
init.c
|
@ -47,9 +47,9 @@ int InitGame() {
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
meditex_blue = LoadTexture("medib.tex");
|
meditex_blue = LoadTexture("medib.png");
|
||||||
|
|
||||||
lightmap = LoadTexture("lightmap.tex");
|
lightmap = LoadTexture("lightmap.png");
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
|
||||||
|
|
174
texture.c
174
texture.c
|
@ -3,69 +3,145 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <zoom/texture.h>
|
#include <zoom/texture.h>
|
||||||
|
#include <png.h>
|
||||||
|
|
||||||
#pragma pack(push,2)
|
|
||||||
typedef struct _TEXHEADER {
|
|
||||||
unsigned char t;
|
|
||||||
unsigned char x;
|
|
||||||
unsigned long w;
|
|
||||||
unsigned long h;
|
|
||||||
} TEXHEADER;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
|
|
||||||
int nTex;
|
int nTex;
|
||||||
TEXLIST *texlist;
|
TEXLIST *texlist;
|
||||||
|
|
||||||
|
|
||||||
GLuint LoadTexture(char *filename) {
|
GLuint LoadTexture(char *filename) {
|
||||||
GLuint tex;
|
FILE *file;
|
||||||
FILE *file;
|
GLuint tex;
|
||||||
TEXHEADER txh;
|
char *name;
|
||||||
unsigned char *data;
|
png_byte header[8];
|
||||||
int i;
|
png_structp png_ptr;
|
||||||
char name[100];
|
png_infop info_ptr;
|
||||||
|
png_bytep *row_pointers;
|
||||||
|
png_bytep data;
|
||||||
|
png_uint_32 width, height;
|
||||||
|
int bit_depth, color_type, i;
|
||||||
|
GLenum format;
|
||||||
|
|
||||||
for(i = 0; i < nTex; i++) {
|
|
||||||
if(strcasecmp(filename, texlist[i].name) == 0) return texlist[i].id;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(name, "tex/");
|
for(i = 0; i < nTex; i++) {
|
||||||
strcat(name, filename);
|
if(strcasecmp(filename, texlist[i].name) == 0) return texlist[i].id;
|
||||||
file = fopen(name, "rb");
|
}
|
||||||
if(!file) return 0;
|
|
||||||
|
|
||||||
fread(&txh, sizeof(txh), 1, file);
|
name = malloc(strlen(filename)+5);
|
||||||
if(txh.t != 'T' || txh.x != 'X') {
|
strcpy(name, "tex/");
|
||||||
fclose(file);
|
strcat(name, filename);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = malloc(txh.w*txh.h*4);
|
file = fopen(name, "rb");
|
||||||
if(!data) {
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fread(data, txh.w*txh.h*4, 1, file);
|
|
||||||
|
|
||||||
glGenTextures(1, &tex);
|
free(name);
|
||||||
glBindTexture(GL_TEXTURE_2D, tex);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
||||||
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, 4, txh.w, txh.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
|
||||||
|
|
||||||
free(data);
|
if(!file) return 0;
|
||||||
fclose(file);
|
|
||||||
|
|
||||||
nTex++;
|
fread(&header, 1, sizeof(header), file);
|
||||||
|
if(png_sig_cmp(header, 0, sizeof(header))) {
|
||||||
|
fclose(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if(nTex == 1) texlist = malloc(sizeof(TEXLIST));
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||||
else texlist = realloc(texlist, sizeof(TEXLIST)*nTex);
|
if(!png_ptr) {
|
||||||
|
fclose(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
strcpy(texlist[nTex-1].name, filename);
|
info_ptr = png_create_info_struct(png_ptr);
|
||||||
texlist[nTex-1].id = tex;
|
if(!info_ptr) {
|
||||||
|
png_destroy_read_struct(&png_ptr, NULL, NULL);
|
||||||
|
fclose(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return tex;
|
if(setjmp(png_jmpbuf(png_ptr))) {
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
fclose(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_init_io(png_ptr, file);
|
||||||
|
png_set_sig_bytes(png_ptr, sizeof(header));
|
||||||
|
|
||||||
|
png_read_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
width = png_get_image_width(png_ptr, info_ptr);
|
||||||
|
height = png_get_image_height(png_ptr, info_ptr);
|
||||||
|
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
|
||||||
|
color_type = png_get_color_type(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
if(color_type == PNG_COLOR_TYPE_PALETTE)
|
||||||
|
png_set_palette_to_rgb(png_ptr);
|
||||||
|
if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
|
||||||
|
png_set_expand_gray_1_2_4_to_8(png_ptr);
|
||||||
|
if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
||||||
|
png_set_tRNS_to_alpha(png_ptr);
|
||||||
|
if(bit_depth < 8)
|
||||||
|
png_set_packing(png_ptr);
|
||||||
|
|
||||||
|
png_read_update_info(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
|
||||||
|
color_type = png_get_color_type(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
if((bit_depth != 8 && bit_depth != 16) || color_type & PNG_COLOR_MASK_PALETTE) {
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
fclose(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr)*height);
|
||||||
|
row_pointers = png_malloc(png_ptr, height*png_sizeof(png_bytep));
|
||||||
|
for(i = 0; i < height; i++)
|
||||||
|
row_pointers[i] = data + png_get_rowbytes(png_ptr, info_ptr)*i;
|
||||||
|
|
||||||
|
png_read_image(png_ptr, row_pointers);
|
||||||
|
|
||||||
|
switch(color_type) {
|
||||||
|
case PNG_COLOR_TYPE_GRAY:
|
||||||
|
format = GL_LUMINANCE;
|
||||||
|
break;
|
||||||
|
case PNG_COLOR_TYPE_GRAY_ALPHA:
|
||||||
|
format = GL_LUMINANCE_ALPHA;
|
||||||
|
break;
|
||||||
|
case PNG_COLOR_TYPE_RGB:
|
||||||
|
format = GL_RGB;
|
||||||
|
break;
|
||||||
|
case PNG_COLOR_TYPE_RGBA:
|
||||||
|
format = GL_RGBA;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
fclose(file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
glGenTextures(1, &tex);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, tex);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
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, png_get_channels(png_ptr, info_ptr), width, height, 0,
|
||||||
|
format, (bit_depth == 8) ? GL_UNSIGNED_BYTE : GL_UNSIGNED_SHORT, data);
|
||||||
|
|
||||||
|
png_free(png_ptr, row_pointers);
|
||||||
|
png_free(png_ptr, data);
|
||||||
|
|
||||||
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
nTex++;
|
||||||
|
|
||||||
|
if(nTex == 1) texlist = malloc(sizeof(TEXLIST));
|
||||||
|
else texlist = realloc(texlist, sizeof(TEXLIST)*nTex);
|
||||||
|
|
||||||
|
strcpy(texlist[nTex-1].name, filename);
|
||||||
|
texlist[nTex-1].id = tex;
|
||||||
|
|
||||||
|
return tex;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue