diff -Naur sdb-1.0.2.orig/src/byteswap.h sdb-1.0.2/src/byteswap.h --- sdb-1.0.2.orig/src/byteswap.h 1970-01-01 01:00:00.000000000 +0100 +++ sdb-1.0.2/src/byteswap.h 2005-06-11 14:02:33.401905848 +0200 @@ -0,0 +1,187 @@ +/* $OpenBSD: endian.h,v 1.14 2004/01/11 19:17:31 brad Exp $ */ + +/*- + * Copyright (c) 1997 Niklas Hallqvist. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Generic definitions for little- and big-endian systems. Other endianesses + * has to be dealt with in the specific machine/endian.h file for that port. + * + * This file is meant to be included from a little- or big-endian port's + * machine/endian.h after setting BYTE_ORDER to either 1234 for little endian + * or 4321 for big.. + */ + +#ifndef _BYTESWAP_H_ +#define _BYTESWAP_H_ + +#undef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#undef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#undef PDP_ENDIAN +#define PDP_ENDIAN 3412 + +#ifdef __GNUC__ + +#define __swap16gen(x) __extension__({ \ + unsigned short __swap16gen_x = (x); \ + \ + (unsigned short)((__swap16gen_x & 0xff) << 8 | \ + (__swap16gen_x & 0xff00) >> 8); \ +}) + +#define __swap32gen(x) __extension__({ \ + unsigned int __swap32gen_x = (x); \ + \ + (unsigned int)((__swap32gen_x & 0xff) << 24 | \ + (__swap32gen_x & 0xff00) << 8 | \ + (__swap32gen_x & 0xff0000) >> 8 | \ + (__swap32gen_x & 0xff000000) >> 24); \ +}) + +#else /* __GNUC__ */ + +/* Note that these macros evaluate their arguments several times. */ +#define __swap16gen(x) \ + (unsigned short)(((unsigned short)(x) & 0xff) << 8 | ((unsigned short)(x) & 0xff00) >> 8) + +#define __swap32gen(x) \ + (unsigned int)(((unsigned int)(x) & 0xff) << 24 | \ + ((unsigned int)(x) & 0xff00) << 8 | ((unsigned int)(x) & 0xff0000) >> 8 | \ + ((unsigned int)(x) & 0xff000000) >> 24) + +#endif /* __GNUC__ */ + +/* + * Define MD_SWAP if you provide swap{16,32}md functions/macros that are + * optimized for your architecture, These will be used for swap{16,32} + * unless the argument is a constant and we are using GCC, where we can + * take advantage of the CSE phase much better by using the generic version. + */ +#ifdef MD_SWAP +#if __GNUC__ + +#define swap16(x) __extension__({ \ + unsigned short __swap16_x = (x); \ + \ + __builtin_constant_p(x) ? __swap16gen(__swap16_x) : \ + __swap16md(__swap16_x); \ +}) + +#define swap32(x) __extension__({ \ + unsigned int __swap32_x = (x); \ + \ + __builtin_constant_p(x) ? __swap32gen(__swap32_x) : \ + __swap32md(__swap32_x); \ +}) + +#endif /* __GNUC__ */ + +#else /* MD_SWAP */ +#define swap16 __swap16gen +#define swap32 __swap32gen +#endif /* MD_SWAP */ + +#define swap16_multi(v, n) do { \ + size_t __swap16_multi_n = (n); \ + unsigned short *__swap16_multi_v = (v); \ + \ + while (__swap16_multi_n) { \ + *__swap16_multi_v = swap16(*__swap16_multi_v); \ + __swap16_multi_v++; \ + __swap16_multi_n--; \ + } \ +} while (0) + +#if BYTE_ORDER == LITTLE_ENDIAN + +#define letohf(x) (x) + +/* Can be overridden by machine/endian.h before inclusion of this file. */ +#ifndef _QUAD_HIGHWORD +#define _QUAD_HIGHWORD 1 +#endif +#ifndef _QUAD_LOWWORD +#define _QUAD_LOWWORD 0 +#endif + +#define htobe16 swap16 +#define htobe32 swap32 +#define betoh16 swap16 +#define betoh32 swap32 + +#define htole16(x) (x) +#define htole32(x) (x) +#define letoh16(x) (x) +#define letoh32(x) (x) + +#endif /* BYTE_ORDER */ + +#if BYTE_ORDER == BIG_ENDIAN + +inline float letohf(float in) { + float retVal; + char* p = (char*)&retVal; + char* i = (char*)∈ + p[0] = i[3]; + p[1] = i[2]; + p[2] = i[1]; + p[3] = i[0]; + + return retVal; +} + +/* Can be overridden by machine/endian.h before inclusion of this file. */ +#ifndef _QUAD_HIGHWORD +#define _QUAD_HIGHWORD 0 +#endif +#ifndef _QUAD_LOWWORD +#define _QUAD_LOWWORD 1 +#endif + +#define htole16 swap16 +#define htole32 swap32 +#define letoh16 swap16 +#define letoh32 swap32 + +#define htobe16(x) (x) +#define htobe32(x) (x) +#define betoh16(x) (x) +#define betoh32(x) (x) + +#endif /* BYTE_ORDER */ + +#define htons htobe16 +#define htonl htobe32 +#define ntohs betoh16 +#define ntohl betoh32 + +#define NTOHL(x) (x) = ntohl((unsigned int)(x)) +#define NTOHS(x) (x) = ntohs((unsigned short)(x)) +#define HTONL(x) (x) = htonl((unsigned int)(x)) +#define HTONS(x) (x) = htons((unsigned short)(x)) + +#endif /* _SYS_ENDIAN_H_ */ + diff -Naur sdb-1.0.2.orig/src/md2.cpp sdb-1.0.2/src/md2.cpp --- sdb-1.0.2.orig/src/md2.cpp 2005-06-11 13:54:13.616884720 +0200 +++ sdb-1.0.2/src/md2.cpp 2005-06-11 14:28:34.726548424 +0200 @@ -27,6 +27,7 @@ */ #include "sdb.h" +#include "byteswap.h" void ModelObject::draw() { @@ -145,6 +146,23 @@ errorMessage(8, "FLAGRANT SYSTEM ERROR", "Unable to load model %s", strFileName); fread(&m_Header, 1, sizeof(tMd2Header), m_FilePointer); + m_Header.magic = letoh32(m_Header.magic); + m_Header.version = letoh32(m_Header.version); + m_Header.skinWidth = letoh32(m_Header.skinWidth); + m_Header.skinHeight = letoh32(m_Header.skinHeight); + m_Header.frameSize = letoh32(m_Header.frameSize); + m_Header.numSkins = letoh32(m_Header.numSkins); + m_Header.numVertices = letoh32(m_Header.numVertices); + m_Header.numTexCoords = letoh32(m_Header.numTexCoords); + m_Header.numTriangles = letoh32(m_Header.numTriangles); + m_Header.numGlCommands = letoh32(m_Header.numGlCommands); + m_Header.numFrames = letoh32(m_Header.numFrames); + m_Header.offsetSkins = letoh32(m_Header.offsetSkins); + m_Header.offsetTexCoords = letoh32(m_Header.offsetTexCoords); + m_Header.offsetTriangles = letoh32(m_Header.offsetTriangles); + m_Header.offsetFrames = letoh32(m_Header.offsetFrames); + m_Header.offsetGlCommands = letoh32(m_Header.offsetGlCommands); + m_Header.offsetEnd = letoh32(m_Header.offsetEnd); if(m_Header.version != 8) errorMessage(8, "FLAGRANT SYSTEM ERROR", "Invalid file format (version not 8) %s", strFileName); @@ -197,12 +215,22 @@ // Read in all the texture coordinates in one fell swoop fread(m_pTexCoords, sizeof(tMd2TexCoord), m_Header.numTexCoords, m_FilePointer); + for (int i=0; i < m_Header.numTexCoords; ++i) { + m_pTexCoords[i].u = letoh16(m_pTexCoords[i].u); + m_pTexCoords[i].v = letoh16(m_pTexCoords[i].v); + } // Move the file pointer to the triangles/face data offset fseek(m_FilePointer, m_Header.offsetTriangles, SEEK_SET); // Read in the face data for each triangle (vertex and texCoord indices) fread(m_pTriangles, sizeof(tMd2Face), m_Header.numTriangles, m_FilePointer); + for (int i=0; i < m_Header.numTriangles; ++i) { + for (int j=0; j < 3; ++j) { + m_pTriangles[i].vertexIndices[j] = letoh16(m_pTriangles[i].vertexIndices[j]); + m_pTriangles[i].textureIndices[j] = letoh16(m_pTriangles[i].textureIndices[j]); + } + } // Move the file pointer to the vertices (frames) fseek(m_FilePointer, m_Header.offsetFrames, SEEK_SET); @@ -213,6 +241,10 @@ // Read in the first frame of animation fread(pFrame, 1, m_Header.frameSize, m_FilePointer); + for (int j=0; j < 3; ++j) { + pFrame->scale[j] = letohf(pFrame->scale[j]); + pFrame->translate[j] = letohf(pFrame->translate[j]); + } m_pFrames[i].pVertices = new tMd2Triangle [m_Header.numVertices]; diff -Naur sdb-1.0.2.orig/src/sdb.h sdb-1.0.2/src/sdb.h --- sdb-1.0.2.orig/src/sdb.h 2005-06-11 13:54:13.610885632 +0200 +++ sdb-1.0.2/src/sdb.h 2005-06-11 14:26:02.116748640 +0200 @@ -57,11 +57,7 @@ #include #endif -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define MD2_SUFFIX ".md2b" -#else #define MD2_SUFFIX ".md2" -#endif using namespace std;