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
|
||||
libzoom_la_SOURCES = init.c level.c player.c render.c texture.c light.c
|
||||
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@
|
||||
libzoom_la_LIBADD = @GL_LIBS@ @GLU_LIBS@
|
||||
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@ @LIBPNG_CFLAGS@
|
||||
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
|
||||
|
|
|
@ -76,6 +76,8 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
|
||||
LIBPNG_LIBS = @LIBPNG_LIBS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN_S = @LN_S@
|
||||
|
@ -92,6 +94,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
|
|||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PTHREAD_CC = @PTHREAD_CC@
|
||||
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
|
||||
PTHREAD_LIBS = @PTHREAD_LIBS@
|
||||
|
@ -148,8 +151,8 @@ sysconfdir = @sysconfdir@
|
|||
target_alias = @target_alias@
|
||||
lib_LTLIBRARIES = libzoom.la
|
||||
libzoom_la_SOURCES = init.c level.c player.c render.c texture.c light.c
|
||||
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@
|
||||
libzoom_la_LIBADD = @GL_LIBS@ @GLU_LIBS@
|
||||
libzoom_la_CFLAGS = @GL_CFLAGS@ @GLU_CFLAGS@ @LIBPNG_CFLAGS@
|
||||
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
|
||||
subdir = .
|
||||
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])
|
||||
|
||||
# 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.
|
||||
AC_PROG_CC
|
||||
AC_PROG_LIBTOOL
|
||||
PKG_PROG_PKG_CONFIG
|
||||
|
||||
# Checks for libraries.
|
||||
AX_CHECK_GL
|
||||
|
@ -25,6 +26,7 @@ if test x$no_gl = xyes; then
|
|||
fi
|
||||
|
||||
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.
|
||||
AC_HEADER_STDC
|
||||
|
|
6
init.c
6
init.c
|
@ -47,12 +47,12 @@ int InitGame() {
|
|||
|
||||
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_T, GL_CLAMP);
|
||||
|
||||
|
||||
GLUquadricObj *quadric = gluNewQuadric();
|
||||
gluQuadricDrawStyle(quadric, GLU_FILL);
|
||||
gluQuadricTexture(quadric, GL_TRUE);
|
||||
|
|
194
texture.c
194
texture.c
|
@ -3,69 +3,145 @@
|
|||
#include <string.h>
|
||||
#include <GL/gl.h>
|
||||
#include <zoom/texture.h>
|
||||
|
||||
|
||||
#pragma pack(push,2)
|
||||
typedef struct _TEXHEADER {
|
||||
unsigned char t;
|
||||
unsigned char x;
|
||||
unsigned long w;
|
||||
unsigned long h;
|
||||
} TEXHEADER;
|
||||
#pragma pack(pop)
|
||||
#include <png.h>
|
||||
|
||||
|
||||
int nTex;
|
||||
TEXLIST *texlist;
|
||||
|
||||
|
||||
GLuint LoadTexture(char *filename) {
|
||||
GLuint tex;
|
||||
FILE *file;
|
||||
TEXHEADER txh;
|
||||
unsigned char *data;
|
||||
int i;
|
||||
char name[100];
|
||||
|
||||
for(i = 0; i < nTex; i++) {
|
||||
if(strcasecmp(filename, texlist[i].name) == 0) return texlist[i].id;
|
||||
}
|
||||
|
||||
strcpy(name, "tex/");
|
||||
strcat(name, filename);
|
||||
file = fopen(name, "rb");
|
||||
if(!file) return 0;
|
||||
|
||||
fread(&txh, sizeof(txh), 1, file);
|
||||
if(txh.t != 'T' || txh.x != 'X') {
|
||||
fclose(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
data = malloc(txh.w*txh.h*4);
|
||||
if(!data) {
|
||||
fclose(file);
|
||||
return 0;
|
||||
}
|
||||
fread(data, txh.w*txh.h*4, 1, file);
|
||||
|
||||
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, 4, txh.w, txh.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||
|
||||
free(data);
|
||||
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;
|
||||
FILE *file;
|
||||
GLuint tex;
|
||||
char *name;
|
||||
png_byte header[8];
|
||||
png_structp png_ptr;
|
||||
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;
|
||||
}
|
||||
|
||||
name = malloc(strlen(filename)+5);
|
||||
strcpy(name, "tex/");
|
||||
strcat(name, filename);
|
||||
|
||||
file = fopen(name, "rb");
|
||||
|
||||
free(name);
|
||||
|
||||
if(!file) return 0;
|
||||
|
||||
fread(&header, 1, sizeof(header), file);
|
||||
if(png_sig_cmp(header, 0, sizeof(header))) {
|
||||
fclose(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||
if(!png_ptr) {
|
||||
fclose(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
info_ptr = png_create_info_struct(png_ptr);
|
||||
if(!info_ptr) {
|
||||
png_destroy_read_struct(&png_ptr, NULL, NULL);
|
||||
fclose(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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