mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-11 18:50:46 +00:00
Misc additional optimizations, mostly to polymost/mdsprite. Also separate voxmodel into its own source file and object. This commit is pretty large because I was hitting the limit of what could realistically be carved up into smaller patches. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4639 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
2631da8822
commit
4263626f97
11 changed files with 1377 additions and 1433 deletions
|
@ -46,7 +46,7 @@ else
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq (1,$(USE_OPENGL))
|
ifeq (1,$(USE_OPENGL))
|
||||||
ENGINE_OBJS+= mdsprite glbuild
|
ENGINE_OBJS+= glbuild voxmodel mdsprite
|
||||||
ifeq (1,$(POLYMER))
|
ifeq (1,$(POLYMER))
|
||||||
ENGINE_OBJS+= polymer
|
ENGINE_OBJS+= polymer
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -131,22 +131,23 @@ ENGINE_OBJS= \
|
||||||
$(ENGINE_OBJ)\crc32.$o \
|
$(ENGINE_OBJ)\crc32.$o \
|
||||||
$(ENGINE_OBJ)\defs.$o \
|
$(ENGINE_OBJ)\defs.$o \
|
||||||
$(ENGINE_OBJ)\engine.$o \
|
$(ENGINE_OBJ)\engine.$o \
|
||||||
$(ENGINE_OBJ)\polymost.$o \
|
$(ENGINE_OBJ)\glbuild.$o \
|
||||||
$(ENGINE_OBJ)\texcache.$o \
|
$(ENGINE_OBJ)\texcache.$o \
|
||||||
$(ENGINE_OBJ)\dxtfilter.$o \
|
$(ENGINE_OBJ)\kplib.$o \
|
||||||
$(ENGINE_OBJ)\hightile.$o \
|
$(ENGINE_OBJ)\hightile.$o \
|
||||||
|
$(ENGINE_OBJ)\polymost.$o \
|
||||||
|
$(ENGINE_OBJ)\polymer.$o \
|
||||||
$(ENGINE_OBJ)\mdsprite.$o \
|
$(ENGINE_OBJ)\mdsprite.$o \
|
||||||
|
$(ENGINE_OBJ)\voxmodel.$o \
|
||||||
|
$(ENGINE_OBJ)\dxtfilter.$o \
|
||||||
$(ENGINE_OBJ)\textfont.$o \
|
$(ENGINE_OBJ)\textfont.$o \
|
||||||
$(ENGINE_OBJ)\smalltextfont.$o \
|
$(ENGINE_OBJ)\smalltextfont.$o \
|
||||||
$(ENGINE_OBJ)\glbuild.$o \
|
|
||||||
$(ENGINE_OBJ)\kplib.$o \
|
|
||||||
$(ENGINE_OBJ)\lz4.$o \
|
$(ENGINE_OBJ)\lz4.$o \
|
||||||
$(ENGINE_OBJ)\lzwnew.$o \
|
$(ENGINE_OBJ)\lzwnew.$o \
|
||||||
$(ENGINE_OBJ)\mmulti_null.$o \
|
$(ENGINE_OBJ)\mmulti_null.$o \
|
||||||
$(ENGINE_OBJ)\osd.$o \
|
$(ENGINE_OBJ)\osd.$o \
|
||||||
$(ENGINE_OBJ)\pragmas.$o \
|
$(ENGINE_OBJ)\pragmas.$o \
|
||||||
$(ENGINE_OBJ)\scriptfile.$o \
|
$(ENGINE_OBJ)\scriptfile.$o \
|
||||||
$(ENGINE_OBJ)\polymer.$o \
|
|
||||||
$(ENGINE_OBJ)\mutex.$o \
|
$(ENGINE_OBJ)\mutex.$o \
|
||||||
$(ENGINE_OBJ)\winbits.$o \
|
$(ENGINE_OBJ)\winbits.$o \
|
||||||
$(ENGINE_OBJ)\xxhash.$o
|
$(ENGINE_OBJ)\xxhash.$o
|
||||||
|
|
|
@ -14,6 +14,7 @@ $(ENGINE_OBJ)/polymost.$o: $(ENGINE_SRC)/polymost.c $(ENGINE_INC)/lz4.h $(ENGINE
|
||||||
$(ENGINE_OBJ)/texcache.$o: $(ENGINE_SRC)/texcache.c $(ENGINE_INC)/texcache.h $(ENGINE_INC)/polymost.h $(ENGINE_INC)/dxtfilter.h
|
$(ENGINE_OBJ)/texcache.$o: $(ENGINE_SRC)/texcache.c $(ENGINE_INC)/texcache.h $(ENGINE_INC)/polymost.h $(ENGINE_INC)/dxtfilter.h
|
||||||
$(ENGINE_OBJ)/dxtfilter.$o: $(ENGINE_SRC)/dxtfilter.c $(ENGINE_INC)/dxtfilter.h $(ENGINE_INC)/texcache.h
|
$(ENGINE_OBJ)/dxtfilter.$o: $(ENGINE_SRC)/dxtfilter.c $(ENGINE_INC)/dxtfilter.h $(ENGINE_INC)/texcache.h
|
||||||
$(ENGINE_OBJ)/hightile.$o: $(ENGINE_SRC)/hightile.c $(ENGINE_INC)/kplib.h $(ENGINE_INC)/hightile.h
|
$(ENGINE_OBJ)/hightile.$o: $(ENGINE_SRC)/hightile.c $(ENGINE_INC)/kplib.h $(ENGINE_INC)/hightile.h
|
||||||
|
$(ENGINE_OBJ)/voxmodel.$o: $(ENGINE_SRC)/voxmodel.c $(ENGINE_SRC)/engine_priv.h $(ENGINE_INC)/polymost.h $(ENGINE_INC)/hightile.h $(ENGINE_INC)/mdsprite.h $(ENGINE_INC)/texcache.h
|
||||||
$(ENGINE_OBJ)/mdsprite.$o: $(ENGINE_SRC)/mdsprite.c $(ENGINE_SRC)/engine_priv.h $(ENGINE_INC)/polymost.h $(ENGINE_INC)/hightile.h $(ENGINE_INC)/mdsprite.h $(ENGINE_INC)/texcache.h
|
$(ENGINE_OBJ)/mdsprite.$o: $(ENGINE_SRC)/mdsprite.c $(ENGINE_SRC)/engine_priv.h $(ENGINE_INC)/polymost.h $(ENGINE_INC)/hightile.h $(ENGINE_INC)/mdsprite.h $(ENGINE_INC)/texcache.h
|
||||||
$(ENGINE_OBJ)/textfont.$o: $(ENGINE_SRC)/textfont.c
|
$(ENGINE_OBJ)/textfont.$o: $(ENGINE_SRC)/textfont.c
|
||||||
$(ENGINE_OBJ)/smalltextfont.$o: $(ENGINE_SRC)/smalltextfont.c
|
$(ENGINE_OBJ)/smalltextfont.$o: $(ENGINE_SRC)/smalltextfont.c
|
||||||
|
|
|
@ -287,11 +287,11 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float x, y;
|
float x, y;
|
||||||
} fvec2_t;
|
} vec2f_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
} fvec3_t;
|
} vec3f_t;
|
||||||
|
|
||||||
// Links to various ABIs specifying (or documenting non-normatively) the
|
// Links to various ABIs specifying (or documenting non-normatively) the
|
||||||
// alignment requirements of aggregates:
|
// alignment requirements of aggregates:
|
||||||
|
|
|
@ -15,6 +15,8 @@ extern "C" {
|
||||||
|
|
||||||
#ifdef WITHKPLIB
|
#ifdef WITHKPLIB
|
||||||
int32_t cache1d_file_fromzip(int32_t fil);
|
int32_t cache1d_file_fromzip(int32_t fil);
|
||||||
|
extern char *kpzbuf;
|
||||||
|
extern int32_t kpzbufsiz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void initcache(intptr_t dacachestart, int32_t dacachesize);
|
void initcache(intptr_t dacachestart, int32_t dacachesize);
|
||||||
|
|
|
@ -6,13 +6,23 @@
|
||||||
|
|
||||||
#define SHIFTMOD32(a) ((a)&31)
|
#define SHIFTMOD32(a) ((a)&31)
|
||||||
|
|
||||||
|
#define SHARED_MODEL_DATA int32_t mdnum, shadeoff; \
|
||||||
|
float scale, bscale, zadd, yoffset; \
|
||||||
|
GLuint *texid; \
|
||||||
|
int32_t flags;
|
||||||
|
|
||||||
|
#define IDMODEL_SHARED_DATA int32_t numframes, cframe, nframe, fpssc, usesalpha; \
|
||||||
|
float oldtime, curtime, interpol; \
|
||||||
|
mdanim_t *animations; \
|
||||||
|
mdskinmap_t *skinmap; \
|
||||||
|
int32_t numskins, skinloaded;
|
||||||
|
|
||||||
|
#define IDP2_MAGIC 0x32504449
|
||||||
|
#define IDP3_MAGIC 0x33504449
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
SHARED_MODEL_DATA;
|
||||||
int32_t shadeoff;
|
|
||||||
float scale, bscale, zadd, yoffset;
|
|
||||||
GLuint *texid; // skins
|
|
||||||
int32_t flags;
|
|
||||||
} mdmodel_t;
|
} mdmodel_t;
|
||||||
|
|
||||||
typedef struct _mdanim_t
|
typedef struct _mdanim_t
|
||||||
|
@ -21,6 +31,7 @@ typedef struct _mdanim_t
|
||||||
int32_t fpssc, flags;
|
int32_t fpssc, flags;
|
||||||
struct _mdanim_t *next;
|
struct _mdanim_t *next;
|
||||||
} mdanim_t;
|
} mdanim_t;
|
||||||
|
|
||||||
#define MDANIM_LOOP 0
|
#define MDANIM_LOOP 0
|
||||||
#define MDANIM_ONESHOT 1
|
#define MDANIM_ONESHOT 1
|
||||||
|
|
||||||
|
@ -40,7 +51,6 @@ typedef struct _mdskinmap_t
|
||||||
// Available from http://web.archive.org/web/20030816010242/http://tfc.duke.free.fr/us/tutorials/models/md2.htm
|
// Available from http://web.archive.org/web/20030816010242/http://tfc.duke.free.fr/us/tutorials/models/md2.htm
|
||||||
// Now at http://tfc.duke.free.fr/coding/md2.html (in French)
|
// Now at http://tfc.duke.free.fr/coding/md2.html (in French)
|
||||||
//He probably wouldn't recognize it if he looked at it though :)
|
//He probably wouldn't recognize it if he looked at it though :)
|
||||||
typedef struct { float x, y, z; } point3d;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -52,7 +62,7 @@ typedef struct
|
||||||
typedef struct { uint8_t v[3], ni; } md2vert_t; //compressed vertex coords (x,y,z)
|
typedef struct { uint8_t v[3], ni; } md2vert_t; //compressed vertex coords (x,y,z)
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
point3d mul, add; //scale&translation vector
|
vec3f_t mul, add; //scale&translation vector
|
||||||
char name[16]; //frame name
|
char name[16]; //frame name
|
||||||
md2vert_t verts[1]; //first vertex of this frame
|
md2vert_t verts[1]; //first vertex of this frame
|
||||||
} md2frame_t;
|
} md2frame_t;
|
||||||
|
@ -66,18 +76,8 @@ typedef struct
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
//WARNING: This top block is a union between md2model&md3model: Make sure it matches!
|
SHARED_MODEL_DATA;
|
||||||
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
IDMODEL_SHARED_DATA;
|
||||||
int32_t shadeoff;
|
|
||||||
float scale, bscale, zadd, yoffset;
|
|
||||||
GLuint *texid; // texture ids for base skin if no mappings defined
|
|
||||||
int32_t flags;
|
|
||||||
|
|
||||||
int32_t numframes, cframe, nframe, fpssc, usesalpha;
|
|
||||||
float oldtime, curtime, interpol;
|
|
||||||
mdanim_t *animations;
|
|
||||||
mdskinmap_t *skinmap;
|
|
||||||
int32_t numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified,
|
|
||||||
|
|
||||||
//MD2 specific stuff:
|
//MD2 specific stuff:
|
||||||
int32_t numverts, numglcmds, framebytes, *glcmds;
|
int32_t numverts, numglcmds, framebytes, *glcmds;
|
||||||
|
@ -96,7 +96,7 @@ typedef struct { int16_t x, y, z; uint8_t nlat, nlng; } md3xyzn_t; //xyz are [10
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
point3d min, max, cen; //bounding box&origin
|
vec3f_t min, max, cen; //bounding box&origin
|
||||||
float r; //radius of bounding sphere
|
float r; //radius of bounding sphere
|
||||||
char nam[16]; //ascz frame name
|
char nam[16]; //ascz frame name
|
||||||
} md3frame_t;
|
} md3frame_t;
|
||||||
|
@ -104,7 +104,7 @@ typedef struct
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char nam[64]; //ascz tag name
|
char nam[64]; //ascz tag name
|
||||||
point3d p, x, y, z; //tag object pos&orient
|
vec3f_t p, x, y, z; //tag object pos&orient
|
||||||
} md3tag_t;
|
} md3tag_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -152,22 +152,12 @@ typedef struct
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
//WARNING: This top block is a union between md2model&md3model: Make sure it matches!
|
SHARED_MODEL_DATA;
|
||||||
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
IDMODEL_SHARED_DATA;
|
||||||
int32_t shadeoff;
|
|
||||||
float scale, bscale, zadd, yoffset;
|
|
||||||
uint32_t *texid; // texture ids for base skin if no mappings defined
|
|
||||||
int32_t flags;
|
|
||||||
|
|
||||||
int32_t numframes, cframe, nframe, fpssc, usesalpha;
|
|
||||||
float oldtime, curtime, interpol;
|
|
||||||
mdanim_t *animations;
|
|
||||||
mdskinmap_t *skinmap;
|
|
||||||
int32_t numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified,
|
|
||||||
|
|
||||||
//MD3 specific
|
//MD3 specific
|
||||||
md3head_t head;
|
md3head_t head;
|
||||||
point3d *muladdframes;
|
vec3f_t *muladdframes;
|
||||||
uint16_t *indexes;
|
uint16_t *indexes;
|
||||||
uint16_t *vindexes;
|
uint16_t *vindexes;
|
||||||
float *maxdepths;
|
float *maxdepths;
|
||||||
|
@ -198,8 +188,8 @@ typedef struct
|
||||||
//VOX specific stuff:
|
//VOX specific stuff:
|
||||||
voxrect_t *quad; int32_t qcnt, qfacind[7];
|
voxrect_t *quad; int32_t qcnt, qfacind[7];
|
||||||
int32_t *mytex, mytexx, mytexy;
|
int32_t *mytex, mytexx, mytexy;
|
||||||
int32_t xsiz, ysiz, zsiz;
|
vec3_t siz;
|
||||||
float xpiv, ypiv, zpiv;
|
vec3f_t piv;
|
||||||
int32_t is8bit;
|
int32_t is8bit;
|
||||||
} voxmodel_t;
|
} voxmodel_t;
|
||||||
|
|
||||||
|
@ -210,9 +200,10 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf);
|
||||||
void mdinit(void);
|
void mdinit(void);
|
||||||
void freeallmodels(void);
|
void freeallmodels(void);
|
||||||
void clearskins(void);
|
void clearskins(void);
|
||||||
int32_t mddraw(const spritetype *tspr);
|
int32_t polymost_mddraw(const spritetype *tspr);
|
||||||
|
EXTERN void md3_vox_calcmat_common(const spritetype *tspr, const vec3f_t *a0, float f, float mat[16]);
|
||||||
|
|
||||||
typedef struct { float xadd, yadd, zadd; int16_t angadd, flags, fov; } hudtyp;
|
typedef struct { vec3f_t add; int16_t angadd, flags, fov; } hudtyp;
|
||||||
|
|
||||||
EXTERN hudtyp hudmem[2][MAXTILES];
|
EXTERN hudtyp hudmem[2][MAXTILES];
|
||||||
|
|
||||||
|
@ -222,10 +213,11 @@ EXTERN voxmodel_t *voxmodels[MAXVOXELS];
|
||||||
|
|
||||||
void voxfree(voxmodel_t *m);
|
void voxfree(voxmodel_t *m);
|
||||||
voxmodel_t *voxload(const char *filnam);
|
voxmodel_t *voxload(const char *filnam);
|
||||||
int32_t voxdraw(voxmodel_t *m, const spritetype *tspr);
|
int32_t polymost_voxdraw(voxmodel_t *m, const spritetype *tspr);
|
||||||
|
|
||||||
int md3postload_polymer(md3model_t* m);
|
int md3postload_polymer(md3model_t* m);
|
||||||
//int32_t md_thinoutmodel(int32_t modelid, uint8_t *usedframebitmap);
|
//int32_t md_thinoutmodel(int32_t modelid, uint8_t *usedframebitmap);
|
||||||
|
EXTERN void md_freevbos(void);
|
||||||
|
|
||||||
#endif // defined USE_OPENGL
|
#endif // defined USE_OPENGL
|
||||||
|
|
||||||
|
|
|
@ -2767,7 +2767,7 @@ static WSHELPER_DECL void calc_vplcinc_wall(uint32_t *vplc, int32_t *vinc, inthi
|
||||||
#ifdef HIGH_PRECISION_SPRITE
|
#ifdef HIGH_PRECISION_SPRITE
|
||||||
static WSHELPER_DECL void calc_vplcinc_sprite(uint32_t *vplc, int32_t *vinc, int32_t x, int32_t y1v)
|
static WSHELPER_DECL void calc_vplcinc_sprite(uint32_t *vplc, int32_t *vinc, int32_t x, int32_t y1v)
|
||||||
{
|
{
|
||||||
inthi_t tmpvinc = swallf[x];
|
inthi_t tmpvinc = Blrintf(swallf[x]);
|
||||||
inthi_t tmpvplc = globalzd + tmpvinc*(y1v-globalhoriz+1);
|
inthi_t tmpvplc = globalzd + tmpvinc*(y1v-globalhoriz+1);
|
||||||
|
|
||||||
*vinc = tmpvinc;
|
*vinc = tmpvinc;
|
||||||
|
@ -6897,7 +6897,7 @@ static inline int32_t addscaleclamp(int32_t a, int32_t b, int32_t s1, int32_t s2
|
||||||
// a + scale(b, s1, s1-s2), but without arithmetic exception when the
|
// a + scale(b, s1, s1-s2), but without arithmetic exception when the
|
||||||
// scale() expression overflows
|
// scale() expression overflows
|
||||||
|
|
||||||
double tmp = (double)a + ((double)b*s1)/(s1-s2);
|
int64_t tmp = (int64_t)a + ((int64_t)b*s1)/(s1-s2);
|
||||||
|
|
||||||
if (tmp <= INT32_MIN+1)
|
if (tmp <= INT32_MIN+1)
|
||||||
return INT32_MIN+1;
|
return INT32_MIN+1;
|
||||||
|
@ -7896,18 +7896,20 @@ static void dosetaspect(void)
|
||||||
//
|
//
|
||||||
static inline void calcbritable(void)
|
static inline void calcbritable(void)
|
||||||
{
|
{
|
||||||
int32_t i,j;
|
int32_t i, j;
|
||||||
double a,b;
|
float a, b;
|
||||||
|
|
||||||
for (i=0; i<16; i++)
|
for (i=0; i<16; i++)
|
||||||
{
|
{
|
||||||
a = (double)8 / ((double)i+8);
|
a = 8.f / ((float)i+8.f);
|
||||||
b = (double)255 / pow((double)255,a);
|
b = 255.f / powf(255.f, a);
|
||||||
|
|
||||||
for (j=0; j<256; j++) // JBF 20040207: full 8bit precision
|
for (j=0; j<256; j++) // JBF 20040207: full 8bit precision
|
||||||
britable[i][j] = (uint8_t)(pow((double)j,a)*b);
|
britable[i][j] = (uint8_t) (powf((float)j, a) * b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BANG2RAD (PI/1024.0)
|
#define BANG2RAD ((float)PI * (1.f/1024.f))
|
||||||
|
|
||||||
static int32_t loadtables(void)
|
static int32_t loadtables(void)
|
||||||
{
|
{
|
||||||
|
@ -8290,16 +8292,16 @@ int32_t getclosestcol_lim(int32_t r, int32_t g, int32_t b, int32_t lastokcol)
|
||||||
if (dist < mindist && i <= lastokcol)
|
if (dist < mindist && i <= lastokcol)
|
||||||
{
|
{
|
||||||
dist += rdist[pal1[0]+r];
|
dist += rdist[pal1[0]+r];
|
||||||
if (dist < mindist)
|
if (dist >= mindist)
|
||||||
{
|
continue;
|
||||||
dist += bdist[pal1[2]+b];
|
dist += bdist[pal1[2]+b];
|
||||||
if (dist < mindist) { mindist = dist; retcol = i; }
|
if (dist >= mindist)
|
||||||
|
continue;
|
||||||
|
mindist = dist;
|
||||||
|
retcol = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
while ((i = colnext[i]) >= 0);
|
||||||
i = colnext[i];
|
|
||||||
}
|
|
||||||
while (i >= 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retcol >= 0)
|
if (retcol >= 0)
|
||||||
|
@ -8609,12 +8611,12 @@ static inline void keepaway(int32_t *x, int32_t *y, int32_t w)
|
||||||
ox = ksgn(-dy); oy = ksgn(dx);
|
ox = ksgn(-dy); oy = ksgn(dx);
|
||||||
first = (klabs(dx) <= klabs(dy));
|
first = (klabs(dx) <= klabs(dy));
|
||||||
|
|
||||||
while (1)
|
do
|
||||||
{
|
{
|
||||||
if (dx*(*y-y1) > (*x-x1)*dy) return;
|
if (dx*(*y-y1) > (*x-x1)*dy) return;
|
||||||
if (first == 0) *x += ox; else *y += oy;
|
if (first == 0) *x += ox; else *y += oy;
|
||||||
first ^= 1;
|
first ^= 1;
|
||||||
}
|
} while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8797,6 +8799,7 @@ int32_t preinitengine(void)
|
||||||
getvalidmodes();
|
getvalidmodes();
|
||||||
|
|
||||||
initcrc32table();
|
initcrc32table();
|
||||||
|
|
||||||
#ifdef HAVE_CLIPSHAPE_FEATURE
|
#ifdef HAVE_CLIPSHAPE_FEATURE
|
||||||
clipmapinfo_init();
|
clipmapinfo_init();
|
||||||
#endif
|
#endif
|
||||||
|
@ -8920,6 +8923,9 @@ void uninitengine(void)
|
||||||
DO_FREE_AND_NULL(blockptr);
|
DO_FREE_AND_NULL(blockptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WITHKPLIB
|
||||||
|
DO_FREE_AND_NULL(kpzbuf);
|
||||||
|
#endif
|
||||||
uninitsystem();
|
uninitsystem();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17511,9 +17517,7 @@ int32_t setrendermode(int32_t renderer)
|
||||||
#ifdef USE_OPENGL
|
#ifdef USE_OPENGL
|
||||||
void setrollangle(int32_t rolla)
|
void setrollangle(int32_t rolla)
|
||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(rolla);
|
gtang = (float) rolla * PI * (1.f/1024.f);
|
||||||
if (rolla == 0) gtang = 0.0;
|
|
||||||
else gtang = PI * (double)rolla / 1024.0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -83,24 +83,6 @@ Low priority:
|
||||||
#include "kplib.h"
|
#include "kplib.h"
|
||||||
#include "texcache.h"
|
#include "texcache.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && defined(_WIN64)
|
|
||||||
/*
|
|
||||||
#include <emmintrin.h>
|
|
||||||
static inline int32_t Blrintf(float const x) {
|
|
||||||
return _mm_cvtss_si32(_mm_load_ss(&x));}
*/
|
|
||||||
#define Blrintf (int32_t)
|
|
||||||
#elif defined (_MSC_VER)
|
|
||||||
static inline int32_t Blrintf(const float x)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
__asm fld x;
|
|
||||||
__asm fistp n;
|
|
||||||
return n;
}
|
|
||||||
#else
|
|
||||||
#define Blrintf lrintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
extern int32_t filelength(int h); // kplib.c
|
extern int32_t filelength(int h); // kplib.c
|
||||||
#endif
|
#endif
|
||||||
|
@ -376,7 +358,6 @@ float glox1, gloy1, glox2, gloy2;
|
||||||
|
|
||||||
//Use this for both initialization and uninitialization of OpenGL.
|
//Use this for both initialization and uninitialization of OpenGL.
|
||||||
static int32_t gltexcacnum = -1;
|
static int32_t gltexcacnum = -1;
|
||||||
extern void freevbos(void);
|
|
||||||
|
|
||||||
void polymost_glreset()
|
void polymost_glreset()
|
||||||
{
|
{
|
||||||
|
@ -427,7 +408,7 @@ void polymost_glreset()
|
||||||
bglDeleteTextures(1,&polymosttext);
|
bglDeleteTextures(1,&polymosttext);
|
||||||
polymosttext=0;
|
polymosttext=0;
|
||||||
|
|
||||||
freevbos();
|
md_freevbos();
|
||||||
|
|
||||||
memset(texcache.list,0,sizeof(texcache.list));
|
memset(texcache.list,0,sizeof(texcache.list));
|
||||||
glox1 = -1;
|
glox1 = -1;
|
||||||
|
@ -710,28 +691,24 @@ static void resizeglcheck(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: must not use DAPICNUM for indexing into tile arrays.
|
static void fixtransparency(coltype *dapic, vec2_t dasiz, vec2_t dasiz2, int32_t dameth)
|
||||||
static void fixtransparency(const int32_t dapicnum, coltype *dapic, int32_t daxsiz, int32_t daysiz,
|
|
||||||
const int32_t daxsiz2, const int32_t daysiz2, const int32_t dameth)
|
|
||||||
{
|
{
|
||||||
int32_t y, naxsiz2;
|
int32_t y, naxsiz2;
|
||||||
int32_t dox = daxsiz2-1, doy = daysiz2-1;
|
vec2_t doxy = { dasiz2.x-1, dasiz2.y-1 };
|
||||||
|
|
||||||
UNREFERENCED_PARAMETER(dapicnum);
|
if (dameth&4) { doxy.x = min(doxy.x, dasiz.x); doxy.y = min(doxy.y, dasiz.y); }
|
||||||
|
else { dasiz = dasiz2; } //Make repeating textures duplicate top/left parts
|
||||||
|
|
||||||
if (dameth&4) { dox = min(dox,daxsiz); doy = min(doy,daysiz); }
|
dasiz.x--; dasiz.y--; naxsiz2 = -dasiz2.x; //Hacks for optimization inside loop
|
||||||
else { daxsiz = daxsiz2; daysiz = daysiz2; } //Make repeating textures duplicate top/left parts
|
|
||||||
|
|
||||||
daxsiz--; daysiz--; naxsiz2 = -daxsiz2; //Hacks for optimization inside loop
|
|
||||||
|
|
||||||
//Set transparent pixels to average color of neighboring opaque pixels
|
//Set transparent pixels to average color of neighboring opaque pixels
|
||||||
//Doing this makes bilinear filtering look much better for masked textures (I.E. sprites)
|
//Doing this makes bilinear filtering look much better for masked textures (I.E. sprites)
|
||||||
for (y=doy; y>=0; y--)
|
for (y=doxy.y; y>=0; y--)
|
||||||
{
|
{
|
||||||
int32_t x;
|
int32_t x;
|
||||||
coltype * wpptr = &dapic[y*daxsiz2+dox];
|
coltype * wpptr = &dapic[y*dasiz2.x+doxy.x];
|
||||||
|
|
||||||
for (x=dox; x>=0; x--,wpptr--)
|
for (x=doxy.x; x>=0; x--,wpptr--)
|
||||||
{
|
{
|
||||||
int32_t r=0, g=0, b=0, j=0;
|
int32_t r=0, g=0, b=0, j=0;
|
||||||
|
|
||||||
|
@ -739,9 +716,9 @@ static void fixtransparency(const int32_t dapicnum, coltype *dapic, int32_t daxs
|
||||||
|
|
||||||
r = g = b = j = 0;
|
r = g = b = j = 0;
|
||||||
if ((x> 0) && (wpptr[ -1].a)) { r += wpptr[ -1].r; g += wpptr[ -1].g; b += wpptr[ -1].b; j++; }
|
if ((x> 0) && (wpptr[ -1].a)) { r += wpptr[ -1].r; g += wpptr[ -1].g; b += wpptr[ -1].b; j++; }
|
||||||
if ((x<daxsiz) && (wpptr[ +1].a)) { r += wpptr[ +1].r; g += wpptr[ +1].g; b += wpptr[ +1].b; j++; }
|
if ((x<dasiz.x) && (wpptr[ +1].a)) { r += wpptr[ +1].r; g += wpptr[ +1].g; b += wpptr[ +1].b; j++; }
|
||||||
if ((y> 0) && (wpptr[naxsiz2].a)) { r += wpptr[naxsiz2].r; g += wpptr[naxsiz2].g; b += wpptr[naxsiz2].b; j++; }
|
if ((y> 0) && (wpptr[naxsiz2].a)) { r += wpptr[naxsiz2].r; g += wpptr[naxsiz2].g; b += wpptr[naxsiz2].b; j++; }
|
||||||
if ((y<daysiz) && (wpptr[daxsiz2].a)) { r += wpptr[daxsiz2].r; g += wpptr[daxsiz2].g; b += wpptr[daxsiz2].b; j++; }
|
if ((y<dasiz.y) && (wpptr[dasiz2.x].a)) { r += wpptr[dasiz2.x].r; g += wpptr[dasiz2.x].g; b += wpptr[dasiz2.x].b; j++; }
|
||||||
switch (j)
|
switch (j)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -849,7 +826,17 @@ void uploadtexture(int32_t doalloc, int32_t xsiz, int32_t ysiz, int32_t intexfmt
|
||||||
//if (wpptr->a) wpptr->a = 255;
|
//if (wpptr->a) wpptr->a = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tsizx >= 0) fixtransparency(-1, pic,(tsizx+(1<<j)-1)>>j,(tsizy+(1<<j)-1)>>j,x3,y3,dameth);
|
|
||||||
|
if (tsizx >= 0)
|
||||||
|
{
|
||||||
|
vec2_t tsizzle;
|
||||||
|
vec2_t mnizzle = { x3, y3 };
|
||||||
|
|
||||||
|
tsizzle.x = (tsizx+(1<<j)-1)>>j;
|
||||||
|
tsizzle.y = (tsizy+(1<<j)-1)>>j;
|
||||||
|
fixtransparency(pic, tsizzle, mnizzle, dameth);
|
||||||
|
}
|
||||||
|
|
||||||
if (j >= js)
|
if (j >= js)
|
||||||
{
|
{
|
||||||
if (doalloc&1)
|
if (doalloc&1)
|
||||||
|
@ -907,64 +894,63 @@ static void texture_setup(const int32_t dameth)
|
||||||
void gloadtile_art(int32_t dapic, int32_t dapal, int32_t dashade, int32_t dameth, pthtyp *pth, int32_t doalloc)
|
void gloadtile_art(int32_t dapic, int32_t dapal, int32_t dashade, int32_t dameth, pthtyp *pth, int32_t doalloc)
|
||||||
{
|
{
|
||||||
coltype *pic;
|
coltype *pic;
|
||||||
int32_t xsiz, ysiz, npoty = 0;
|
int32_t npoty = 0;
|
||||||
char hasalpha = 0, hasfullbright = 0;
|
char hasalpha = 0, hasfullbright = 0;
|
||||||
|
|
||||||
static int32_t fullbrightloadingpass = 0;
|
static int32_t fullbrightloadingpass = 0;
|
||||||
|
|
||||||
int32_t tsizx = tilesiz[dapic].x;
|
vec2_t siz, tsiz = tilesiz[dapic];
|
||||||
int32_t tsizy = tilesiz[dapic].y;
|
|
||||||
|
|
||||||
if (!glinfo.texnpot)
|
if (!glinfo.texnpot)
|
||||||
{
|
{
|
||||||
for (xsiz=1; xsiz<tsizx; xsiz+=xsiz);
|
for (siz.x=1; siz.x<tsiz.x; siz.x+=siz.x);
|
||||||
for (ysiz=1; ysiz<tsizy; ysiz+=ysiz);
|
for (siz.y=1; siz.y<tsiz.y; siz.y+=siz.y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((tsizx|tsizy) == 0)
|
if ((tsiz.x|tsiz.y) == 0)
|
||||||
{
|
{
|
||||||
xsiz = ysiz = 1;
|
siz.x = siz.y = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
xsiz = tsizx;
|
siz.x = tsiz.x;
|
||||||
ysiz = tsizy;
|
siz.y = tsiz.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pic = (coltype *)Xmalloc(xsiz*ysiz*sizeof(coltype));
|
pic = (coltype *)Xmalloc(siz.x*siz.y*sizeof(coltype));
|
||||||
|
|
||||||
if (!waloff[dapic])
|
if (!waloff[dapic])
|
||||||
{
|
{
|
||||||
//Force invalid textures to draw something - an almost purely transparency texture
|
//Force invalid textures to draw something - an almost purely transparency texture
|
||||||
//This allows the Z-buffer to be updated for mirrors (which are invalidated textures)
|
//This allows the Z-buffer to be updated for mirrors (which are invalidated textures)
|
||||||
pic[0].r = pic[0].g = pic[0].b = 0; pic[0].a = 1;
|
pic[0].r = pic[0].g = pic[0].b = 0; pic[0].a = 1;
|
||||||
tsizx = tsizy = 1; hasalpha = 1;
|
tsiz.x = tsiz.y = 1; hasalpha = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const int32_t dofullbright = !(picanm[dapic].sf&PICANM_NOFULLBRIGHT_BIT);
|
const int32_t dofullbright = !(picanm[dapic].sf&PICANM_NOFULLBRIGHT_BIT);
|
||||||
int32_t y;
|
int32_t y;
|
||||||
|
|
||||||
for (y=0; y<ysiz; y++)
|
for (y=0; y<siz.y; y++)
|
||||||
{
|
{
|
||||||
coltype *wpptr = &pic[y*xsiz];
|
coltype *wpptr = &pic[y*siz.x];
|
||||||
int32_t x;
|
int32_t x;
|
||||||
int32_t y2 = (y < tsizy) ? y : y-tsizy;
|
int32_t y2 = (y < tsiz.y) ? y : y-tsiz.y;
|
||||||
|
|
||||||
for (x=0; x<xsiz; x++,wpptr++)
|
for (x=0; x<siz.x; x++,wpptr++)
|
||||||
{
|
{
|
||||||
int32_t dacol;
|
int32_t dacol;
|
||||||
int32_t x2 = (x < tsizx) ? x : x-tsizx;
|
int32_t x2 = (x < tsiz.x) ? x : x-tsiz.x;
|
||||||
|
|
||||||
if ((dameth & DAMETH_CLAMPED) && (x >= tsizx || y >= tsizy)) //Clamp texture
|
if ((dameth & DAMETH_CLAMPED) && (x >= tsiz.x || y >= tsiz.y)) //Clamp texture
|
||||||
{
|
{
|
||||||
wpptr->r = wpptr->g = wpptr->b = wpptr->a = 0;
|
wpptr->r = wpptr->g = wpptr->b = wpptr->a = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
dacol = *(char *)(waloff[dapic]+x2*tsizy+y2);
|
dacol = *(char *)(waloff[dapic]+x2*tsiz.y+y2);
|
||||||
|
|
||||||
if (!fullbrightloadingpass)
|
if (!fullbrightloadingpass)
|
||||||
{
|
{
|
||||||
|
@ -1007,27 +993,27 @@ void gloadtile_art(int32_t dapic, int32_t dapal, int32_t dashade, int32_t dameth
|
||||||
if (doalloc) bglGenTextures(1,(GLuint *)&pth->glpic); //# of textures (make OpenGL allocate structure)
|
if (doalloc) bglGenTextures(1,(GLuint *)&pth->glpic); //# of textures (make OpenGL allocate structure)
|
||||||
bglBindTexture(GL_TEXTURE_2D,pth->glpic);
|
bglBindTexture(GL_TEXTURE_2D,pth->glpic);
|
||||||
|
|
||||||
fixtransparency(dapic, pic,tsizx,tsizy,xsiz,ysiz,dameth);
|
fixtransparency(pic,tsiz,siz,dameth);
|
||||||
|
|
||||||
if (polymost_want_npotytex(dameth, ysiz) &&
|
if (polymost_want_npotytex(dameth, siz.y) &&
|
||||||
tsizx==xsiz && tsizy==ysiz) // XXX
|
tsiz.x==siz.x && tsiz.y==siz.y) // XXX
|
||||||
{
|
{
|
||||||
const int32_t nextpoty = 1<<((picsiz[dapic]>>4)+1);
|
const int32_t nextpoty = 1<<((picsiz[dapic]>>4)+1);
|
||||||
const int32_t ydif = nextpoty - ysiz;
|
const int32_t ydif = nextpoty - siz.y;
|
||||||
coltype *paddedpic;
|
coltype *paddedpic;
|
||||||
|
|
||||||
Bassert(ydif > 0 && ydif < ysiz);
|
Bassert(ydif > 0 && ydif < siz.y);
|
||||||
|
|
||||||
paddedpic = (coltype*) Xrealloc(pic, xsiz*nextpoty*sizeof(coltype));
|
paddedpic = (coltype*) Xrealloc(pic, siz.x*nextpoty*sizeof(coltype));
|
||||||
|
|
||||||
pic = paddedpic;
|
pic = paddedpic;
|
||||||
Bmemcpy(&pic[xsiz*ysiz], pic, xsiz*ydif*sizeof(coltype));
|
Bmemcpy(&pic[siz.x*siz.y], pic, siz.x*ydif*sizeof(coltype));
|
||||||
ysiz = tsizy = nextpoty;
|
siz.y = tsiz.y = nextpoty;
|
||||||
|
|
||||||
npoty = PTH_NPOTWALL;
|
npoty = PTH_NPOTWALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uploadtexture(doalloc,xsiz,ysiz,hasalpha?GL_RGBA:GL_RGB,GL_RGBA,pic,tsizx,tsizy,dameth);
|
uploadtexture(doalloc,siz.x,siz.y,hasalpha?GL_RGBA:GL_RGB,GL_RGBA,pic,tsiz.x,tsiz.y,dameth);
|
||||||
|
|
||||||
texture_setup(dameth);
|
texture_setup(dameth);
|
||||||
|
|
||||||
|
@ -1059,7 +1045,9 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
int32_t dameth, pthtyp *pth, int32_t doalloc, char effect)
|
int32_t dameth, pthtyp *pth, int32_t doalloc, char effect)
|
||||||
{
|
{
|
||||||
coltype *pic = NULL;
|
coltype *pic = NULL;
|
||||||
int32_t xsiz=0, ysiz=0, tsizx, tsizy;
|
// int32_t xsiz=0, ysiz=0, tsizx, tsizy;
|
||||||
|
vec2_t siz ={ 0, 0 };
|
||||||
|
vec2_t tsiz;
|
||||||
|
|
||||||
char *picfil = NULL, *fn, hasalpha = 255;
|
char *picfil = NULL, *fn, hasalpha = 255;
|
||||||
int32_t picfillen, texfmt = GL_RGBA, intexfmt = GL_RGBA, filh;
|
int32_t picfillen, texfmt = GL_RGBA, intexfmt = GL_RGBA, filh;
|
||||||
|
@ -1102,8 +1090,8 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
|
|
||||||
if (gotcache && !texcache_loadtile(&cachead, &doalloc, pth))
|
if (gotcache && !texcache_loadtile(&cachead, &doalloc, pth))
|
||||||
{
|
{
|
||||||
tsizx = cachead.xdim;
|
tsiz.x = cachead.xdim;
|
||||||
tsizy = cachead.ydim;
|
tsiz.y = cachead.ydim;
|
||||||
hasalpha = (cachead.flags & CACHEAD_HASALPHA) ? 0 : 255;
|
hasalpha = (cachead.flags & CACHEAD_HASALPHA) ? 0 : 255;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1127,33 +1115,34 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
// tsizx/y = replacement texture's natural size
|
// tsizx/y = replacement texture's natural size
|
||||||
// xsiz/y = 2^x size of replacement
|
// xsiz/y = 2^x size of replacement
|
||||||
|
|
||||||
kpgetdim(picfil,picfillen,&tsizx,&tsizy);
|
kpgetdim(picfil,picfillen,&tsiz.x,&tsiz.y);
|
||||||
if (tsizx == 0 || tsizy == 0) { Bfree(picfil); return -1; }
|
if (tsiz.x == 0 || tsiz.y == 0) { Bfree(picfil); return -1; }
|
||||||
pth->sizx = tsizx;
|
|
||||||
pth->sizy = tsizy;
|
pth->siz.x = tsiz.x;
|
||||||
|
pth->siz.y = tsiz.y;
|
||||||
|
|
||||||
if (!glinfo.texnpot)
|
if (!glinfo.texnpot)
|
||||||
{
|
{
|
||||||
for (xsiz=1; xsiz<tsizx; xsiz+=xsiz);
|
for (siz.x=1; siz.x<tsiz.x; siz.x+=siz.x);
|
||||||
for (ysiz=1; ysiz<tsizy; ysiz+=ysiz);
|
for (siz.y=1; siz.y<tsiz.y; siz.y+=siz.y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
xsiz = tsizx;
|
siz.x = tsiz.x;
|
||||||
ysiz = tsizy;
|
siz.y = tsiz.y;
|
||||||
}
|
}
|
||||||
pic = (coltype *)Xcalloc(xsiz,ysiz*sizeof(coltype));
|
pic = (coltype *)Xcalloc(siz.x,siz.y*sizeof(coltype));
|
||||||
|
|
||||||
startticks = getticks();
|
startticks = getticks();
|
||||||
|
|
||||||
if (lastpic && lastfn && !Bstrcmp(lastfn,fn))
|
if (lastpic && lastfn && !Bstrcmp(lastfn,fn))
|
||||||
{
|
{
|
||||||
willprint=1;
|
willprint=1;
|
||||||
Bmemcpy(pic, lastpic, xsiz*ysiz*sizeof(coltype));
|
Bmemcpy(pic, lastpic, siz.x*siz.y*sizeof(coltype));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (kprender(picfil,picfillen,(intptr_t)pic,xsiz*sizeof(coltype),xsiz,ysiz,0,0)) { Bfree(picfil); Bfree(pic); return -2; }
|
if (kprender(picfil,picfillen,(intptr_t)pic,siz.x*sizeof(coltype),siz.x,siz.y)) { Bfree(picfil); Bfree(pic); return -2; }
|
||||||
willprint=2;
|
willprint=2;
|
||||||
|
|
||||||
if (hicprecaching)
|
if (hicprecaching)
|
||||||
|
@ -1161,16 +1150,16 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
lastfn = fn; // careful...
|
lastfn = fn; // careful...
|
||||||
if (!lastpic)
|
if (!lastpic)
|
||||||
{
|
{
|
||||||
lastpic = (coltype *)Bmalloc(xsiz*ysiz*sizeof(coltype));
|
lastpic = (coltype *)Bmalloc(siz.x*siz.y*sizeof(coltype));
|
||||||
lastsize = xsiz*ysiz;
|
lastsize = siz.x*siz.y;
|
||||||
}
|
}
|
||||||
else if (lastsize < xsiz*ysiz)
|
else if (lastsize < siz.x*siz.y)
|
||||||
{
|
{
|
||||||
Bfree(lastpic);
|
Bfree(lastpic);
|
||||||
lastpic = (coltype *)Bmalloc(xsiz*ysiz*sizeof(coltype));
|
lastpic = (coltype *)Bmalloc(siz.x*siz.y*sizeof(coltype));
|
||||||
}
|
}
|
||||||
if (lastpic)
|
if (lastpic)
|
||||||
Bmemcpy(lastpic, pic, xsiz*ysiz*sizeof(coltype));
|
Bmemcpy(lastpic, pic, siz.x*siz.y*sizeof(coltype));
|
||||||
}
|
}
|
||||||
else if (lastpic)
|
else if (lastpic)
|
||||||
{
|
{
|
||||||
|
@ -1183,7 +1172,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
r=(glinfo.bgra)?hictinting[dapalnum].r:hictinting[dapalnum].b;
|
r=(glinfo.bgra)?hictinting[dapalnum].r:hictinting[dapalnum].b;
|
||||||
g=hictinting[dapalnum].g;
|
g=hictinting[dapalnum].g;
|
||||||
b=(glinfo.bgra)?hictinting[dapalnum].b:hictinting[dapalnum].r;
|
b=(glinfo.bgra)?hictinting[dapalnum].b:hictinting[dapalnum].r;
|
||||||
for (y=0,j=0; y<tsizy; y++,j+=xsiz)
|
for (y=0,j=0; y<tsiz.y; y++,j+=siz.x)
|
||||||
{
|
{
|
||||||
coltype tcol;
|
coltype tcol;
|
||||||
char *cptr = britable[gammabrightness ? 0 : curbrightness];
|
char *cptr = britable[gammabrightness ? 0 : curbrightness];
|
||||||
|
@ -1191,12 +1180,13 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
|
|
||||||
int32_t x;
|
int32_t x;
|
||||||
|
|
||||||
for (x=0; x<tsizx; x++)
|
for (x=0; x<tsiz.x; x++)
|
||||||
{
|
{
|
||||||
tcol.b = cptr[rpptr[x].b];
|
tcol.b = cptr[rpptr[x].b];
|
||||||
tcol.g = cptr[rpptr[x].g];
|
tcol.g = cptr[rpptr[x].g];
|
||||||
tcol.r = cptr[rpptr[x].r];
|
tcol.r = cptr[rpptr[x].r];
|
||||||
tcol.a = rpptr[x].a; hasalpha &= rpptr[x].a;
|
tcol.a = rpptr[x].a;
|
||||||
|
hasalpha &= rpptr[x].a;
|
||||||
|
|
||||||
if (effect & HICTINT_GRAYSCALE)
|
if (effect & HICTINT_GRAYSCALE)
|
||||||
{
|
{
|
||||||
|
@ -1221,28 +1211,25 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
tcol.r = min((int32_t)((tcol.r)*b)/64,255);
|
tcol.r = min((int32_t)((tcol.r)*b)/64,255);
|
||||||
}
|
}
|
||||||
|
|
||||||
rpptr[x].b = tcol.b;
|
rpptr[x] = tcol;
|
||||||
rpptr[x].g = tcol.g;
|
|
||||||
rpptr[x].r = tcol.r;
|
|
||||||
rpptr[x].a = tcol.a;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!(dameth & DAMETH_CLAMPED)) || facen) //Duplicate texture pixels (wrapping tricks for non power of 2 texture sizes)
|
if ((!(dameth & DAMETH_CLAMPED)) || facen) //Duplicate texture pixels (wrapping tricks for non power of 2 texture sizes)
|
||||||
{
|
{
|
||||||
if (xsiz > tsizx) //Copy left to right
|
if (siz.x > tsiz.x) //Copy left to right
|
||||||
{
|
{
|
||||||
int32_t *lptr = (int32_t *)pic;
|
int32_t *lptr = (int32_t *)pic;
|
||||||
for (y=0; y<tsizy; y++,lptr+=xsiz)
|
for (y=0; y<tsiz.y; y++,lptr+=siz.x)
|
||||||
Bmemcpy(&lptr[tsizx],lptr,(xsiz-tsizx)<<2);
|
Bmemcpy(&lptr[tsiz.x],lptr,(siz.x-tsiz.x)<<2);
|
||||||
}
|
}
|
||||||
if (ysiz > tsizy) //Copy top to bottom
|
if (siz.y > tsiz.y) //Copy top to bottom
|
||||||
Bmemcpy(&pic[xsiz*tsizy],pic,(ysiz-tsizy)*xsiz<<2);
|
Bmemcpy(&pic[siz.x*tsiz.y],pic,(siz.y-tsiz.y)*siz.x<<2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!glinfo.bgra)
|
if (!glinfo.bgra)
|
||||||
{
|
{
|
||||||
for (j=xsiz*ysiz-1; j>=0; j--)
|
for (j=siz.x*siz.y-1; j>=0; j--)
|
||||||
{
|
{
|
||||||
swapchar(&pic[j].r, &pic[j].b);
|
swapchar(&pic[j].r, &pic[j].b);
|
||||||
}
|
}
|
||||||
|
@ -1251,7 +1238,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
|
|
||||||
Bfree(picfil); picfil = 0;
|
Bfree(picfil); picfil = 0;
|
||||||
|
|
||||||
if (tsizx>>r_downsize <= tilesiz[dapic].x || tsizy>>r_downsize <= tilesiz[dapic].y)
|
if (tsiz.x>>r_downsize <= tilesiz[dapic].x || tsiz.y>>r_downsize <= tilesiz[dapic].y)
|
||||||
hicr->flags |= (HICR_NOCOMPRESS + HICR_NOSAVE);
|
hicr->flags |= (HICR_NOCOMPRESS + HICR_NOSAVE);
|
||||||
|
|
||||||
if (glinfo.texcompr && glusetexcompr && !(hicr->flags & HICR_NOSAVE))
|
if (glinfo.texcompr && glusetexcompr && !(hicr->flags & HICR_NOSAVE))
|
||||||
|
@ -1262,48 +1249,45 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
|
||||||
bglGenTextures(1, &pth->glpic); //# of textures (make OpenGL allocate structure)
|
bglGenTextures(1, &pth->glpic); //# of textures (make OpenGL allocate structure)
|
||||||
bglBindTexture(GL_TEXTURE_2D,pth->glpic);
|
bglBindTexture(GL_TEXTURE_2D,pth->glpic);
|
||||||
|
|
||||||
fixtransparency(-1, pic,tsizx,tsizy,xsiz,ysiz,dameth);
|
fixtransparency(pic,tsiz,siz,dameth);
|
||||||
uploadtexture(doalloc,xsiz,ysiz,intexfmt,texfmt,pic,-1,tsizy,
|
uploadtexture(doalloc,siz.x,siz.y,intexfmt,texfmt,pic,-1,tsiz.y,
|
||||||
dameth | DAMETH_HI | (hicr->flags & HICR_NOCOMPRESS ? DAMETH_NOCOMPRESS : 0));
|
dameth | DAMETH_HI | (hicr->flags & HICR_NOCOMPRESS ? DAMETH_NOCOMPRESS : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// precalculate scaling parameters for replacement
|
// precalculate scaling parameters for replacement
|
||||||
if (facen > 0)
|
if (facen > 0)
|
||||||
{
|
{
|
||||||
pth->scalex = ((float)tsizx) * (1.0f/64.f);
|
pth->scale.x = (float)tsiz.x * (1.0f/64.f);
|
||||||
pth->scaley = ((float)tsizy) * (1.0f/64.f);
|
pth->scale.y = (float)tsiz.y * (1.0f/64.f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pth->scalex = ((float)tsizx) / ((float)tilesiz[dapic].x);
|
pth->scale.x = (float)tsiz.x / (float)tilesiz[dapic].x;
|
||||||
pth->scaley = ((float)tsizy) / ((float)tilesiz[dapic].y);
|
pth->scale.y = (float)tsiz.y / (float)tilesiz[dapic].y;
|
||||||
}
|
}
|
||||||
|
|
||||||
texture_setup(dameth);
|
texture_setup(dameth);
|
||||||
|
|
||||||
DO_FREE_AND_NULL(pic);
|
DO_FREE_AND_NULL(pic);
|
||||||
|
|
||||||
if (tsizx>>r_downsize <= tilesiz[dapic].x || tsizy>>r_downsize <= tilesiz[dapic].y)
|
if (tsiz.x>>r_downsize <= tilesiz[dapic].x || tsiz.y>>r_downsize <= tilesiz[dapic].y)
|
||||||
hicr->flags |= (HICR_NOCOMPRESS + HICR_NOSAVE);
|
hicr->flags |= HICR_NOCOMPRESS | HICR_NOSAVE;
|
||||||
|
|
||||||
pth->picnum = dapic;
|
pth->picnum = dapic;
|
||||||
pth->effects = effect;
|
pth->effects = effect;
|
||||||
pth->flags = TO_PTH_CLAMPED(dameth) + PTH_HIGHTILE + (facen>0)*PTH_SKYBOX;
|
pth->flags = TO_PTH_CLAMPED(dameth) | PTH_HIGHTILE | ((facen>0) * PTH_SKYBOX) | ((hasalpha != 255) ? PTH_HASALPHA : 0);
|
||||||
if (hasalpha != 255)
|
|
||||||
pth->flags |= PTH_HASALPHA;
|
|
||||||
pth->skyface = facen;
|
pth->skyface = facen;
|
||||||
pth->hicr = hicr;
|
pth->hicr = hicr;
|
||||||
|
|
||||||
if (glinfo.texcompr && glusetexcompr && glusetexcache && !(hicr->flags & HICR_NOSAVE))
|
if (glinfo.texcompr && glusetexcompr && glusetexcache && !(hicr->flags & HICR_NOSAVE))
|
||||||
if (!gotcache)
|
if (!gotcache)
|
||||||
{
|
{
|
||||||
const int32_t nonpow2 = check_nonpow2(xsiz) || check_nonpow2(ysiz);
|
const int32_t nonpow2 = check_nonpow2(siz.x) || check_nonpow2(siz.y);
|
||||||
|
|
||||||
// save off the compressed version
|
// save off the compressed version
|
||||||
if (hicr->flags & HICR_NOCOMPRESS) cachead.quality = 0;
|
cachead.quality = (hicr->flags & HICR_NOCOMPRESS) ? 0 : r_downsize;
|
||||||
else cachead.quality = r_downsize;
|
cachead.xdim = tsiz.x>>cachead.quality;
|
||||||
cachead.xdim = tsizx>>cachead.quality;
|
cachead.ydim = tsiz.y>>cachead.quality;
|
||||||
cachead.ydim = tsizy>>cachead.quality;
|
|
||||||
|
|
||||||
// handle nocompress:
|
// handle nocompress:
|
||||||
cachead.flags = nonpow2*CACHEAD_NONPOW2 |
|
cachead.flags = nonpow2*CACHEAD_NONPOW2 |
|
||||||
|
@ -1402,7 +1386,10 @@ static float alpha = 0.f;
|
||||||
static pthtyp *our_texcache_fetch(int32_t dameth)
|
static pthtyp *our_texcache_fetch(int32_t dameth)
|
||||||
{
|
{
|
||||||
// r_usetileshades 1 is TX's method.
|
// r_usetileshades 1 is TX's method.
|
||||||
return texcache_fetch(globalpicnum, globalpal, getpalookup((r_usetileshades == 1) ? globvis>>3 : 0, globalshade), dameth);
|
if (r_usetileshades != 1)
|
||||||
|
return texcache_fetch(globalpicnum, globalpal, globalshade, dameth);
|
||||||
|
|
||||||
|
return texcache_fetch(globalpicnum, globalpal, getpalookup(globvis>>3, globalshade), dameth);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drawpoly(float *dpx, float *dpy, int32_t n, int32_t method)
|
static void drawpoly(float *dpx, float *dpy, int32_t n, int32_t method)
|
||||||
|
@ -1485,7 +1472,6 @@ static void drawpoly(float *dpx, float *dpy, int32_t n, int32_t method)
|
||||||
pthtyp *pth, *detailpth, *glowpth;
|
pthtyp *pth, *detailpth, *glowpth;
|
||||||
int32_t texunits = GL_TEXTURE0_ARB;
|
int32_t texunits = GL_TEXTURE0_ARB;
|
||||||
int32_t xx, yy;
|
int32_t xx, yy;
|
||||||
int32_t k;
|
|
||||||
|
|
||||||
int32_t jj = j;
|
int32_t jj = j;
|
||||||
|
|
||||||
|
@ -1565,10 +1551,10 @@ static void drawpoly(float *dpx, float *dpy, int32_t n, int32_t method)
|
||||||
|
|
||||||
if (pth && (pth->flags & PTH_HIGHTILE))
|
if (pth && (pth->flags & PTH_HIGHTILE))
|
||||||
{
|
{
|
||||||
hackscx = pth->scalex;
|
hackscx = pth->scale.x;
|
||||||
hackscy = pth->scaley;
|
hackscy = pth->scale.y;
|
||||||
tsiz.x = pth->sizx;
|
tsiz.x = pth->siz.x;
|
||||||
tsiz.y = pth->sizy;
|
tsiz.y = pth->siz.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
xx = tsiz.x;
|
xx = tsiz.x;
|
||||||
|
@ -2113,7 +2099,7 @@ static void polymost_internal_nonparallaxed(float nx0, float ny0, float nx1, flo
|
||||||
//relative alignment
|
//relative alignment
|
||||||
fx = (float)(wall[wall[sec->wallptr].point2].x-wall[sec->wallptr].x);
|
fx = (float)(wall[wall[sec->wallptr].point2].x-wall[sec->wallptr].x);
|
||||||
fy = (float)(wall[wall[sec->wallptr].point2].y-wall[sec->wallptr].y);
|
fy = (float)(wall[wall[sec->wallptr].point2].y-wall[sec->wallptr].y);
|
||||||
r = 1.f/Bsqrtf(fx*fx+fy*fy); fx *= r; fy *= r;
|
r = polymost_invsqrt(fx*fx+fy*fy); fx *= r; fy *= r;
|
||||||
ft[2] = fcosglobalang*fx + fsinglobalang*fy;
|
ft[2] = fcosglobalang*fx + fsinglobalang*fy;
|
||||||
ft[3] = fsinglobalang*fx - fcosglobalang*fy;
|
ft[3] = fsinglobalang*fx - fcosglobalang*fy;
|
||||||
ft[0] = ((float)(globalposx-wall[sec->wallptr].x))*fx + ((float)(globalposy-wall[sec->wallptr].y))*fy;
|
ft[0] = ((float)(globalposx-wall[sec->wallptr].x))*fx + ((float)(globalposy-wall[sec->wallptr].y))*fy;
|
||||||
|
@ -2152,7 +2138,7 @@ static void polymost_internal_nonparallaxed(float nx0, float ny0, float nx1, flo
|
||||||
fy = global_cf_ypanning*((float)(1<<(picsiz[globalpicnum]>>4)))*(1.0f/256.f);
|
fy = global_cf_ypanning*((float)(1<<(picsiz[globalpicnum]>>4)))*(1.0f/256.f);
|
||||||
if ((globalorientation&(2+64)) == (2+64)) //Hack for panning for slopes w/ relative alignment
|
if ((globalorientation&(2+64)) == (2+64)) //Hack for panning for slopes w/ relative alignment
|
||||||
{
|
{
|
||||||
float r = global_cf_heinum * (1.0f/4096.f); r = 1.f/Bsqrtf(r*r+1);
|
float r = global_cf_heinum * (1.0f/4096.f); r = polymost_invsqrt(r*r+1);
|
||||||
if (!(globalorientation&4)) fy *= r; else fx *= r;
|
if (!(globalorientation&4)) fy *= r; else fx *= r;
|
||||||
}
|
}
|
||||||
guy += gdy*fx; guo += gdo*fx;
|
guy += gdy*fx; guo += gdo*fx;
|
||||||
|
@ -3086,7 +3072,7 @@ void polymost_scansector(int32_t sectnum)
|
||||||
walltype *wal, *wal2;
|
walltype *wal, *wal2;
|
||||||
spritetype *spr;
|
spritetype *spr;
|
||||||
int32_t z, zz, startwall, endwall, numscansbefore, scanfirst, bunchfrst, nextsectnum, sectorbordercnt;
|
int32_t z, zz, startwall, endwall, numscansbefore, scanfirst, bunchfrst, nextsectnum, sectorbordercnt;
|
||||||
fvec2_t p1, p2, fp1, fp2;
|
vec2f_t p1, p2, fp1, fp2;
|
||||||
float d;
|
float d;
|
||||||
|
|
||||||
if (sectnum < 0) return;
|
if (sectnum < 0) return;
|
||||||
|
@ -3821,7 +3807,7 @@ void polymost_drawsprite(int32_t snum)
|
||||||
{
|
{
|
||||||
if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0)
|
if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0)
|
||||||
{
|
{
|
||||||
if (mddraw(tspr))
|
if (polymost_mddraw(tspr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
break; // else, render as flat sprite
|
break; // else, render as flat sprite
|
||||||
|
@ -3829,14 +3815,14 @@ void polymost_drawsprite(int32_t snum)
|
||||||
|
|
||||||
if (usevoxels && (tspr->cstat&48)!=48 && tiletovox[tspr->picnum] >= 0 && voxmodels[tiletovox[tspr->picnum]])
|
if (usevoxels && (tspr->cstat&48)!=48 && tiletovox[tspr->picnum] >= 0 && voxmodels[tiletovox[tspr->picnum]])
|
||||||
{
|
{
|
||||||
if (voxdraw(voxmodels[tiletovox[tspr->picnum]], tspr))
|
if (polymost_voxdraw(voxmodels[tiletovox[tspr->picnum]], tspr))
|
||||||
return;
|
return;
|
||||||
break; // else, render as flat sprite
|
break; // else, render as flat sprite
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tspr->cstat&48)==48 && voxmodels[tspr->picnum])
|
if ((tspr->cstat&48)==48 && voxmodels[tspr->picnum])
|
||||||
{
|
{
|
||||||
voxdraw(voxmodels[tspr->picnum], tspr);
|
polymost_voxdraw(voxmodels[tspr->picnum], tspr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -3846,7 +3832,7 @@ void polymost_drawsprite(int32_t snum)
|
||||||
{
|
{
|
||||||
curpolygonoffset += .25f;
|
curpolygonoffset += .25f;
|
||||||
bglEnable(GL_POLYGON_OFFSET_FILL);
|
bglEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
bglPolygonOffset(-1.f-curpolygonoffset, -1.f);
|
bglPolygonOffset(-1.f, -1.f-curpolygonoffset);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -4159,7 +4145,7 @@ void polymost_drawsprite(int32_t snum)
|
||||||
//copied&modified from relative alignment
|
//copied&modified from relative alignment
|
||||||
xv = (float)tspr->x + s*x1 + c*y1; fx = (float)-(x0+x1)*s;
|
xv = (float)tspr->x + s*x1 + c*y1; fx = (float)-(x0+x1)*s;
|
||||||
yv = (float)tspr->y + s*y1 - c*x1; fy = (float)+(x0+x1)*c;
|
yv = (float)tspr->y + s*y1 - c*x1; fy = (float)+(x0+x1)*c;
|
||||||
f = 1.f/Bsqrtf(fx*fx+fy*fy); fx *= f; fy *= f;
|
f = polymost_invsqrt(fx*fx+fy*fy); fx *= f; fy *= f;
|
||||||
ft[2] = singlobalang*fy + cosglobalang*fx;
|
ft[2] = singlobalang*fy + cosglobalang*fx;
|
||||||
ft[3] = singlobalang*fx - cosglobalang*fy;
|
ft[3] = singlobalang*fx - cosglobalang*fy;
|
||||||
ft[0] = ((float)(globalposy-yv))*fy + ((float)(globalposx-xv))*fx;
|
ft[0] = ((float)(globalposy-yv))*fy + ((float)(globalposx-xv))*fx;
|
||||||
|
@ -4245,7 +4231,7 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
{
|
{
|
||||||
int32_t oldviewingrange;
|
int32_t oldviewingrange;
|
||||||
float ogxyaspect;
|
float ogxyaspect;
|
||||||
float x1, y1, z1;
|
vec3f_t vec1;
|
||||||
|
|
||||||
spritetype tspr;
|
spritetype tspr;
|
||||||
memset(&tspr, 0, sizeof(spritetype));
|
memset(&tspr, 0, sizeof(spritetype));
|
||||||
|
@ -4262,15 +4248,13 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
ogxyaspect = gxyaspect; gxyaspect = 1.f;
|
ogxyaspect = gxyaspect; gxyaspect = 1.f;
|
||||||
oldviewingrange = viewingrange; viewingrange = 65536;
|
oldviewingrange = viewingrange; viewingrange = 65536;
|
||||||
|
|
||||||
x1 = hudmem[(dastat&4)>>2][picnum].xadd;
|
vec1 = hudmem[(dastat&4)>>2][picnum].add;
|
||||||
y1 = hudmem[(dastat&4)>>2][picnum].yadd;
|
|
||||||
z1 = hudmem[(dastat&4)>>2][picnum].zadd;
|
|
||||||
|
|
||||||
#ifdef POLYMER
|
#ifdef POLYMER
|
||||||
if (pr_overridehud) {
|
if (pr_overridehud) {
|
||||||
x1 = pr_hudxadd;
|
vec1.x = pr_hudxadd;
|
||||||
y1 = pr_hudyadd;
|
vec1.y = pr_hudyadd;
|
||||||
z1 = pr_hudzadd;
|
vec1.z = pr_hudzadd;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!(hudmem[(dastat&4)>>2][picnum].flags & HUDFLAG_NOBOB))
|
if (!(hudmem[(dastat&4)>>2][picnum].flags & HUDFLAG_NOBOB))
|
||||||
|
@ -4297,13 +4281,13 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
|
|
||||||
if (!(dastat & RS_AUTO))
|
if (!(dastat & RS_AUTO))
|
||||||
{
|
{
|
||||||
x1 += fx/((float) (xdim<<15))-1.f; //-1: left of screen, +1: right of screen
|
vec1.x += fx/((float) (xdim<<15))-1.f; //-1: left of screen, +1: right of screen
|
||||||
y1 += fy/((float) (ydim<<15))-1.f; //-1: top of screen, +1: bottom of screen
|
vec1.y += fy/((float) (ydim<<15))-1.f; //-1: top of screen, +1: bottom of screen
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x1 += fx*(1.0f/160.f)-1.f; //-1: left of screen, +1: right of screen
|
vec1.x += fx*(1.0f/160.f)-1.f; //-1: left of screen, +1: right of screen
|
||||||
y1 += fy*(1.0f/100.f)-1.f; //-1: top of screen, +1: bottom of screen
|
vec1.y += fy*(1.0f/100.f)-1.f; //-1: top of screen, +1: bottom of screen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tspr.ang = hudmem[(dastat&4)>>2][picnum].angadd+globalang;
|
tspr.ang = hudmem[(dastat&4)>>2][picnum].angadd+globalang;
|
||||||
|
@ -4314,30 +4298,28 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dastat & RS_YFLIP) { x1 = -x1; y1 = -y1; }
|
if (dastat & RS_YFLIP) { vec1.x = -vec1.x; vec1.y = -vec1.y; }
|
||||||
|
|
||||||
// In Polymost, we don't care if the model is very big
|
// In Polymost, we don't care if the model is very big
|
||||||
if (getrendermode() < REND_POLYMER)
|
if (getrendermode() < REND_POLYMER)
|
||||||
{
|
{
|
||||||
tspr.xrepeat = tspr.yrepeat = 32;
|
tspr.xrepeat = tspr.yrepeat = 32;
|
||||||
|
|
||||||
tspr.x = (int32_t) (((float) gcosang*z1 - (float) gsinang*x1)*16384.f + globalposx);
|
tspr.x = globalposx + Blrintf((gcosang*vec1.z - gsinang*vec1.x)*16384.f);
|
||||||
tspr.y = (int32_t) (((float) gsinang*z1 + (float) gcosang*x1)*16384.f + globalposy);
|
tspr.y = globalposy + Blrintf((gsinang*vec1.z + gcosang*vec1.x)*16384.f);
|
||||||
tspr.z = (int32_t) (globalposz + y1*16384.f*0.8f);
|
tspr.z = globalposz + Blrintf(vec1.y * (16384.f * 0.8f));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float x, y, z;
|
vec3f_t vec2;
|
||||||
|
|
||||||
tspr.xrepeat = tspr.yrepeat = 5;
|
tspr.xrepeat = tspr.yrepeat = 5;
|
||||||
|
|
||||||
x = (float) (((float) gcosang*z1 - (float) gsinang*x1)*2560.f + globalposx);
|
vec2.x = (float)globalposx + (gcosang*vec1.z - gsinang*vec1.x)*2560.f;
|
||||||
y = (float) (((float) gsinang*z1 + (float) gcosang*x1)*2560.f + globalposy);
|
vec2.y = (float)globalposy + (gsinang*vec1.z + gcosang*vec1.x)*2560.f;
|
||||||
z = (float) (globalposz + y1*2560.f*0.8f);
|
vec2.z = (float)globalposz + (vec1.y*(2560.f*0.8f));
|
||||||
|
|
||||||
memcpy(&tspr.x, &x, sizeof(float));
|
Bmemcpy(&tspr.x, &vec2, sizeof(vec3f_t));
|
||||||
memcpy(&tspr.y, &y, sizeof(float));
|
|
||||||
memcpy(&tspr.z, &z, sizeof(float));
|
|
||||||
}
|
}
|
||||||
tspr.picnum = picnum;
|
tspr.picnum = picnum;
|
||||||
tspr.shade = dashade;
|
tspr.shade = dashade;
|
||||||
|
@ -4346,8 +4328,7 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
// 1 -> 1
|
// 1 -> 1
|
||||||
// 32 -> 32*16 = 512
|
// 32 -> 32*16 = 512
|
||||||
// 4 -> 8
|
// 4 -> 8
|
||||||
globalorientation = (dastat&RS_TRANS1) + ((dastat&RS_TRANS2)<<4) + ((dastat&RS_YFLIP)<<1);
|
tspr.cstat = globalorientation = (dastat&RS_TRANS1) | ((dastat&RS_TRANS2)<<4) | ((dastat&RS_YFLIP)<<1);
|
||||||
tspr.cstat = globalorientation;
|
|
||||||
|
|
||||||
if ((dastat&(RS_AUTO|RS_NOCLIP)) == RS_AUTO)
|
if ((dastat&(RS_AUTO|RS_NOCLIP)) == RS_AUTO)
|
||||||
bglViewport(windowx1, yres-(windowy2+1), windowx2-windowx1+1, windowy2-windowy1+1);
|
bglViewport(windowx1, yres-(windowy2+1), windowx2-windowx1+1, windowy2-windowy1+1);
|
||||||
|
@ -4360,10 +4341,10 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
if (getrendermode() < REND_POLYMER)
|
if (getrendermode() < REND_POLYMER)
|
||||||
{
|
{
|
||||||
bglMatrixMode(GL_PROJECTION);
|
bglMatrixMode(GL_PROJECTION);
|
||||||
memset(m, 0, sizeof(m));
|
Bmemset(m, 0, sizeof(m));
|
||||||
|
|
||||||
if ((dastat&(RS_AUTO|RS_NOCLIP)) == RS_AUTO)
|
if ((dastat&(RS_AUTO|RS_NOCLIP)) == RS_AUTO)
|
||||||
{
|
{
|
||||||
const float ratioratio = 1.f; //(float)xdim/ydim;
|
|
||||||
float f = 1.f;
|
float f = 1.f;
|
||||||
int32_t fov = hudmem[(dastat&4)>>2][picnum].fov;
|
int32_t fov = hudmem[(dastat&4)>>2][picnum].fov;
|
||||||
#ifdef POLYMER
|
#ifdef POLYMER
|
||||||
|
@ -4371,16 +4352,11 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
fov = pr_hudfov;
|
fov = pr_hudfov;
|
||||||
#endif
|
#endif
|
||||||
if (fov != -1)
|
if (fov != -1)
|
||||||
{
|
f = 1.f/tanf(((float)fov * 2.56f) * ((.5f * PI) * (1.0f/2048.f)));
|
||||||
// XXX: what's the cause for this (half-guessed /
|
|
||||||
// empirically determined) factor being necessary?
|
|
||||||
fov = (fov*512)/400;
|
|
||||||
f = 1.f / tanf((PI * fov)*(1.0f/2048.f));
|
|
||||||
}
|
|
||||||
|
|
||||||
m[0][0] = f*(float) ydimen*(ratioratio >= 1.6 ? 1.2 : 1); m[0][2] = 1.f;
|
m[0][0] = f*(float) ydimen; m[0][2] = 1.f;
|
||||||
m[1][1] = f*(float) xdimen; m[1][2] = 1.f;
|
m[1][1] = f*(float) xdimen; m[1][2] = 1.f;
|
||||||
m[2][2] = 1.f; m[2][3] = (float) ydimen*(ratioratio >= 1.6 ? 1.2 : 1);
|
m[2][2] = 1.f; m[2][3] = (float) ydimen;
|
||||||
m[3][2] =-1.f;
|
m[3][2] =-1.f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4417,8 +4393,8 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
|
||||||
|
|
||||||
bglDisable(GL_FOG);
|
bglDisable(GL_FOG);
|
||||||
|
|
||||||
if (getrendermode() < REND_POLYMER)
|
if (getrendermode() == REND_POLYMOST)
|
||||||
mddraw(&tspr);
|
polymost_mddraw(&tspr);
|
||||||
# ifdef POLYMER
|
# ifdef POLYMER
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -4883,7 +4859,7 @@ void polymost_fillpolygon(int32_t npoints)
|
||||||
|
|
||||||
f = getshadefactor(globalshade);
|
f = getshadefactor(globalshade);
|
||||||
|
|
||||||
if ((globalorientation>>7)&3 > 1)
|
if (((globalorientation>>7)&3) > 1)
|
||||||
{
|
{
|
||||||
bglEnable(GL_BLEND);
|
bglEnable(GL_BLEND);
|
||||||
a = float_trans[(globalorientation>>7)&3];
|
a = float_trans[(globalorientation>>7)&3];
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "dxtfilter.h"
|
#include "dxtfilter.h"
|
||||||
#include "scriptfile.h"
|
#include "scriptfile.h"
|
||||||
#include "xxhash.h"
|
#include "xxhash.h"
|
||||||
|
#include "kplib.h"
|
||||||
|
|
||||||
#define CLEAR_GL_ERRORS() while(bglGetError() != GL_NO_ERROR) { }
|
#define CLEAR_GL_ERRORS() while(bglGetError() != GL_NO_ERROR) { }
|
||||||
#define TEXCACHE_FREEBUFS() { Bfree(pic), Bfree(packbuf), Bfree(midbuf); }
|
#define TEXCACHE_FREEBUFS() { Bfree(pic), Bfree(packbuf), Bfree(midbuf); }
|
||||||
|
@ -70,7 +71,7 @@ pthtyp *texcache_fetchmulti(pthtyp *pth, hicreplctyp *si, int32_t dapicnum, int3
|
||||||
|
|
||||||
for (pth2=texcache.list[i]; pth2; pth2=pth2->next)
|
for (pth2=texcache.list[i]; pth2; pth2=pth2->next)
|
||||||
{
|
{
|
||||||
if (pth2->hicr && pth2->hicr->filename && Bstrcasecmp(pth2->hicr->filename, si->filename) == 0)
|
if (pth2->hicr && pth2->hicr->filename && filnamcmp(pth2->hicr->filename, si->filename) == 0)
|
||||||
{
|
{
|
||||||
Bmemcpy(pth, pth2, sizeof(pthtyp));
|
Bmemcpy(pth, pth2, sizeof(pthtyp));
|
||||||
pth->picnum = dapicnum;
|
pth->picnum = dapicnum;
|
||||||
|
@ -151,8 +152,7 @@ pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int3
|
||||||
pth = (pthtyp *)Xcalloc(1,sizeof(pthtyp));
|
pth = (pthtyp *)Xcalloc(1,sizeof(pthtyp));
|
||||||
|
|
||||||
// possibly fetch an already loaded multitexture :_)
|
// possibly fetch an already loaded multitexture :_)
|
||||||
if (dapalnum >= (MAXPALOOKUPS - RESERVEDPALS))
|
if (dapalnum >= (MAXPALOOKUPS - RESERVEDPALS) && texcache_fetchmulti(pth, si, dapicnum, dameth))
|
||||||
if (texcache_fetchmulti(pth, si, dapicnum, dameth))
|
|
||||||
return pth;
|
return pth;
|
||||||
|
|
||||||
tilestat = gloadtile_hi(dapicnum, dapalnum, drawingskybox, si, dameth, pth, 1, (si->palnum>0) ? 0 : hictinting[dapalnum].f);
|
tilestat = gloadtile_hi(dapicnum, dapalnum, drawingskybox, si, dameth, pth, 1, (si->palnum>0) ? 0 : hictinting[dapalnum].f);
|
||||||
|
@ -192,7 +192,7 @@ void texcache_freeptrs(void)
|
||||||
{
|
{
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
|
||||||
for (i = texcache.numentries-1; i >= 0; i--)
|
for (i = 0; i < texcache.numentries; i++)
|
||||||
if (texcache.ptrs[i])
|
if (texcache.ptrs[i])
|
||||||
{
|
{
|
||||||
int32_t ii;
|
int32_t ii;
|
||||||
|
@ -760,8 +760,8 @@ int32_t texcache_loadtile(const texcacheheader *head, int32_t *doalloc, pthtyp *
|
||||||
|
|
||||||
texcache_setuptexture(doalloc, &pth->glpic);
|
texcache_setuptexture(doalloc, &pth->glpic);
|
||||||
|
|
||||||
pth->sizx = head->xdim;
|
pth->siz.x = head->xdim;
|
||||||
pth->sizy = head->ydim;
|
pth->siz.y = head->ydim;
|
||||||
|
|
||||||
CLEAR_GL_ERRORS();
|
CLEAR_GL_ERRORS();
|
||||||
|
|
||||||
|
|
811
polymer/eduke32/build/src/voxmodel.c
Normal file
811
polymer/eduke32/build/src/voxmodel.c
Normal file
|
@ -0,0 +1,811 @@
|
||||||
|
//--------------------------------------- VOX LIBRARY BEGINS ---------------------------------------
|
||||||
|
|
||||||
|
#ifdef USE_OPENGL
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
|
#include "build.h"
|
||||||
|
#include "glbuild.h"
|
||||||
|
#include "pragmas.h"
|
||||||
|
#include "baselayer.h"
|
||||||
|
#include "engine_priv.h"
|
||||||
|
#include "hightile.h"
|
||||||
|
#include "polymost.h"
|
||||||
|
#include "texcache.h"
|
||||||
|
#include "mdsprite.h"
|
||||||
|
#include "cache1d.h"
|
||||||
|
#include "kplib.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
//For loading/conversion only
|
||||||
|
static vec3_t voxsiz;
|
||||||
|
static int32_t yzsiz, *vbit = 0; //vbit: 1 bit per voxel: 0=air,1=solid
|
||||||
|
static vec3f_t voxpiv;
|
||||||
|
static int32_t *vcolhashead = 0, vcolhashsizm1;
|
||||||
|
typedef struct { int32_t p, c, n; } voxcol_t;
|
||||||
|
static voxcol_t *vcol = 0; int32_t vnum = 0, vmax = 0;
|
||||||
|
typedef struct { int16_t x, y; } spoint2d;
|
||||||
|
static spoint2d *shp;
|
||||||
|
static int32_t *shcntmal, *shcnt = 0, shcntp;
|
||||||
|
static int32_t mytexo5, *zbit, gmaxx, gmaxy, garea, pow2m1[33];
|
||||||
|
static voxmodel_t *gvox;
|
||||||
|
|
||||||
|
//pitch must equal xsiz*4
|
||||||
|
uint32_t gloadtex(int32_t *picbuf, int32_t xsiz, int32_t ysiz, int32_t is8bit, int32_t dapal)
|
||||||
|
{
|
||||||
|
uint32_t rtexid;
|
||||||
|
int32_t i;
|
||||||
|
|
||||||
|
const char *const cptr = &britable[gammabrightness ? 0 : curbrightness][0];
|
||||||
|
|
||||||
|
// Correct for GL's RGB order; also apply gamma here:
|
||||||
|
const coltype *const pic = (const coltype *) picbuf;
|
||||||
|
coltype *pic2 = (coltype *) Xmalloc(xsiz*ysiz*sizeof(coltype));
|
||||||
|
|
||||||
|
if (!is8bit)
|
||||||
|
{
|
||||||
|
for (i=xsiz*ysiz-1; i>=0; i--)
|
||||||
|
{
|
||||||
|
pic2[i].b = cptr[pic[i].r];
|
||||||
|
pic2[i].g = cptr[pic[i].g];
|
||||||
|
pic2[i].r = cptr[pic[i].b];
|
||||||
|
pic2[i].a = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (palookup[dapal] == NULL)
|
||||||
|
dapal = 0;
|
||||||
|
|
||||||
|
for (i=xsiz*ysiz-1; i>=0; i--)
|
||||||
|
{
|
||||||
|
const int32_t ii = palookup[dapal][pic[i].a] * 3;
|
||||||
|
|
||||||
|
pic2[i].b = cptr[palette[ii+2]*4];
|
||||||
|
pic2[i].g = cptr[palette[ii+1]*4];
|
||||||
|
pic2[i].r = cptr[palette[ii+0]*4];
|
||||||
|
pic2[i].a = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bglGenTextures(1, (GLuint *) &rtexid);
|
||||||
|
bglBindTexture(GL_TEXTURE_2D, rtexid);
|
||||||
|
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
bglTexImage2D(GL_TEXTURE_2D, 0, 4, xsiz, ysiz, 0, GL_RGBA, GL_UNSIGNED_BYTE, (char *) pic2);
|
||||||
|
|
||||||
|
Bfree(pic2);
|
||||||
|
|
||||||
|
return rtexid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t getvox(int32_t x, int32_t y, int32_t z)
|
||||||
|
{
|
||||||
|
z += x*yzsiz + y*voxsiz.z;
|
||||||
|
for (x=vcolhashead[(z*214013)&vcolhashsizm1]; x>=0; x=vcol[x].n)
|
||||||
|
if (vcol[x].p == z) return(vcol[x].c);
|
||||||
|
return(0x808080);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void putvox(int32_t x, int32_t y, int32_t z, int32_t col)
|
||||||
|
{
|
||||||
|
if (vnum >= vmax) { vmax = max(vmax<<1, 4096); vcol = (voxcol_t *) Xrealloc(vcol, vmax*sizeof(voxcol_t)); }
|
||||||
|
|
||||||
|
z += x*yzsiz + y*voxsiz.z;
|
||||||
|
vcol[vnum].p = z; z = ((z*214013)&vcolhashsizm1);
|
||||||
|
vcol[vnum].c = col;
|
||||||
|
vcol[vnum].n = vcolhashead[z]; vcolhashead[z] = vnum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set all bits in vbit from (x,y,z0) to (x,y,z1-1) to 0's
|
||||||
|
#if 0
|
||||||
|
static void setzrange0(int32_t *lptr, int32_t z0, int32_t z1)
|
||||||
|
{
|
||||||
|
int32_t z, ze;
|
||||||
|
if (!((z0^z1)&~31)) { lptr[z0>>5] &= ((~(-1<<SHIFTMOD32(z0)))|(-1<<SHIFTMOD32(z1))); return; }
|
||||||
|
z = (z0>>5); ze = (z1>>5);
|
||||||
|
lptr[z] &=~(-1<<SHIFTMOD32(z0)); for (z++; z<ze; z++) lptr[z] = 0;
|
||||||
|
lptr[z] &= (-1<<SHIFTMOD32(z1));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//Set all bits in vbit from (x,y,z0) to (x,y,z1-1) to 1's
|
||||||
|
static void setzrange1(int32_t *lptr, int32_t z0, int32_t z1)
|
||||||
|
{
|
||||||
|
int32_t z, ze;
|
||||||
|
if (!((z0^z1)&~31)) { lptr[z0>>5] |= ((~(-1<<SHIFTMOD32(z1)))&(-1<<SHIFTMOD32(z0))); return; }
|
||||||
|
z = (z0>>5); ze = (z1>>5);
|
||||||
|
lptr[z] |= (-1<<SHIFTMOD32(z0)); for (z++; z<ze; z++) lptr[z] = -1;
|
||||||
|
lptr[z] |=~(-1<<SHIFTMOD32(z1));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t isrectfree(int32_t x0, int32_t y0, int32_t dx, int32_t dy)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
int32_t i, j, x;
|
||||||
|
i = y0*gvox->mytexx + x0;
|
||||||
|
for (dy=0; dy; dy--, i+=gvox->mytexx)
|
||||||
|
for (x=0; x<dx; x++) { j = i+x; if (zbit[j>>5]&(1<<SHIFTMOD32(j))) return(0); }
|
||||||
|
#else
|
||||||
|
int32_t i, c, m, m1, x;
|
||||||
|
|
||||||
|
i = y0*mytexo5 + (x0>>5); dx += x0-1; c = (dx>>5) - (x0>>5);
|
||||||
|
m = ~pow2m1[x0&31]; m1 = pow2m1[(dx&31)+1];
|
||||||
|
if (!c) { for (m&=m1; dy; dy--, i+=mytexo5) if (zbit[i]&m) return(0); }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (; dy; dy--, i+=mytexo5)
|
||||||
|
{
|
||||||
|
if (zbit[i]&m) return(0);
|
||||||
|
for (x=1; x<c; x++) if (zbit[i+x]) return(0);
|
||||||
|
if (zbit[i+x]&m1) return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setrect(int32_t x0, int32_t y0, int32_t dx, int32_t dy)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
int32_t i, j, y;
|
||||||
|
i = y0*gvox->mytexx + x0;
|
||||||
|
for (y=0; y<dy; y++, i+=gvox->mytexx)
|
||||||
|
for (x=0; x<dx; x++) { j = i+x; zbit[j>>5] |= (1<<SHIFTMOD32(j)); }
|
||||||
|
#else
|
||||||
|
int32_t i, c, m, m1, x;
|
||||||
|
|
||||||
|
i = y0*mytexo5 + (x0>>5); dx += x0-1; c = (dx>>5) - (x0>>5);
|
||||||
|
m = ~pow2m1[x0&31]; m1 = pow2m1[(dx&31)+1];
|
||||||
|
if (!c) { for (m&=m1; dy; dy--, i+=mytexo5) zbit[i] |= m; }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (; dy; dy--, i+=mytexo5)
|
||||||
|
{
|
||||||
|
zbit[i] |= m;
|
||||||
|
for (x=1; x<c; x++) zbit[i+x] = -1;
|
||||||
|
zbit[i+x] |= m1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cntquad(int32_t x0, int32_t y0, int32_t z0, int32_t x1, int32_t y1, int32_t z1, int32_t x2, int32_t y2, int32_t z2, int32_t face)
|
||||||
|
{
|
||||||
|
int32_t x, y, z;
|
||||||
|
|
||||||
|
UNREFERENCED_PARAMETER(x1);
|
||||||
|
UNREFERENCED_PARAMETER(y1);
|
||||||
|
UNREFERENCED_PARAMETER(z1);
|
||||||
|
UNREFERENCED_PARAMETER(face);
|
||||||
|
|
||||||
|
x = labs(x2-x0); y = labs(y2-y0); z = labs(z2-z0);
|
||||||
|
if (!x) x = z; else if (!y) y = z;
|
||||||
|
if (x < y) { z = x; x = y; y = z; }
|
||||||
|
shcnt[y*shcntp+x]++;
|
||||||
|
if (x > gmaxx) gmaxx = x;
|
||||||
|
if (y > gmaxy) gmaxy = y;
|
||||||
|
garea += (x+(VOXBORDWIDTH<<1))*(y+(VOXBORDWIDTH<<1));
|
||||||
|
gvox->qcnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addquad(int32_t x0, int32_t y0, int32_t z0, int32_t x1, int32_t y1, int32_t z1, int32_t x2, int32_t y2, int32_t z2, int32_t face)
|
||||||
|
{
|
||||||
|
int32_t i, j, x, y, z, xx, yy, nx = 0, ny = 0, nz = 0, *lptr;
|
||||||
|
voxrect_t *qptr;
|
||||||
|
|
||||||
|
x = labs(x2-x0); y = labs(y2-y0); z = labs(z2-z0);
|
||||||
|
if (!x) { x = y; y = z; i = 0; }
|
||||||
|
else if (!y) { y = z; i = 1; }
|
||||||
|
else i = 2;
|
||||||
|
if (x < y) { z = x; x = y; y = z; i += 3; }
|
||||||
|
z = shcnt[y*shcntp+x]++;
|
||||||
|
lptr = &gvox->mytex[(shp[z].y+VOXBORDWIDTH)*gvox->mytexx+(shp[z].x+VOXBORDWIDTH)];
|
||||||
|
switch (face)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
ny = y1; x2 = x0; x0 = x1; x1 = x2; break;
|
||||||
|
case 1:
|
||||||
|
ny = y0; y0++; y1++; y2++; break;
|
||||||
|
case 2:
|
||||||
|
nz = z1; y0 = y2; y2 = y1; y1 = y0; z0++; z1++; z2++; break;
|
||||||
|
case 3:
|
||||||
|
nz = z0; break;
|
||||||
|
case 4:
|
||||||
|
nx = x1; y2 = y0; y0 = y1; y1 = y2; x0++; x1++; x2++; break;
|
||||||
|
case 5:
|
||||||
|
nx = x0; break;
|
||||||
|
}
|
||||||
|
for (yy=0; yy<y; yy++, lptr+=gvox->mytexx)
|
||||||
|
for (xx=0; xx<x; xx++)
|
||||||
|
{
|
||||||
|
switch (face)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (i < 3) { nx = x1+x-1-xx; nz = z1+yy; } //back
|
||||||
|
else { nx = x1+y-1-yy; nz = z1+xx; }
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (i < 3) { nx = x0+xx; nz = z0+yy; } //front
|
||||||
|
else { nx = x0+yy; nz = z0+xx; }
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (i < 3) { nx = x1-x+xx; ny = y1-1-yy; } //bot
|
||||||
|
else { nx = x1-1-yy; ny = y1-1-xx; }
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (i < 3) { nx = x0+xx; ny = y0+yy; } //top
|
||||||
|
else { nx = x0+yy; ny = y0+xx; }
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (i < 3) { ny = y1+x-1-xx; nz = z1+yy; } //right
|
||||||
|
else { ny = y1+y-1-yy; nz = z1+xx; }
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (i < 3) { ny = y0+xx; nz = z0+yy; } //left
|
||||||
|
else { ny = y0+yy; nz = z0+xx; }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lptr[xx] = getvox(nx, ny, nz);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Extend borders horizontally
|
||||||
|
for (yy=VOXBORDWIDTH; yy<y+VOXBORDWIDTH; yy++)
|
||||||
|
for (xx=0; xx<VOXBORDWIDTH; xx++)
|
||||||
|
{
|
||||||
|
lptr = &gvox->mytex[(shp[z].y+yy)*gvox->mytexx+shp[z].x];
|
||||||
|
lptr[xx] = lptr[VOXBORDWIDTH]; lptr[xx+x+VOXBORDWIDTH] = lptr[x-1+VOXBORDWIDTH];
|
||||||
|
}
|
||||||
|
//Extend borders vertically
|
||||||
|
for (yy=0; yy<VOXBORDWIDTH; yy++)
|
||||||
|
{
|
||||||
|
Bmemcpy(&gvox->mytex[(shp[z].y+yy)*gvox->mytexx+shp[z].x],
|
||||||
|
&gvox->mytex[(shp[z].y+VOXBORDWIDTH)*gvox->mytexx+shp[z].x],
|
||||||
|
(x+(VOXBORDWIDTH<<1))<<2);
|
||||||
|
Bmemcpy(&gvox->mytex[(shp[z].y+y+yy+VOXBORDWIDTH)*gvox->mytexx+shp[z].x],
|
||||||
|
&gvox->mytex[(shp[z].y+y-1+VOXBORDWIDTH)*gvox->mytexx+shp[z].x],
|
||||||
|
(x+(VOXBORDWIDTH<<1))<<2);
|
||||||
|
}
|
||||||
|
|
||||||
|
qptr = &gvox->quad[gvox->qcnt];
|
||||||
|
qptr->v[0].x = x0; qptr->v[0].y = y0; qptr->v[0].z = z0;
|
||||||
|
qptr->v[1].x = x1; qptr->v[1].y = y1; qptr->v[1].z = z1;
|
||||||
|
qptr->v[2].x = x2; qptr->v[2].y = y2; qptr->v[2].z = z2;
|
||||||
|
for (j=0; j<3; j++) { qptr->v[j].u = shp[z].x+VOXBORDWIDTH; qptr->v[j].v = shp[z].y+VOXBORDWIDTH; }
|
||||||
|
if (i < 3) qptr->v[1].u += x; else qptr->v[1].v += y;
|
||||||
|
qptr->v[2].u += x; qptr->v[2].v += y;
|
||||||
|
|
||||||
|
qptr->v[3].u = qptr->v[0].u - qptr->v[1].u + qptr->v[2].u;
|
||||||
|
qptr->v[3].v = qptr->v[0].v - qptr->v[1].v + qptr->v[2].v;
|
||||||
|
qptr->v[3].x = qptr->v[0].x - qptr->v[1].x + qptr->v[2].x;
|
||||||
|
qptr->v[3].y = qptr->v[0].y - qptr->v[1].y + qptr->v[2].y;
|
||||||
|
qptr->v[3].z = qptr->v[0].z - qptr->v[1].z + qptr->v[2].z;
|
||||||
|
if (gvox->qfacind[face] < 0) gvox->qfacind[face] = gvox->qcnt;
|
||||||
|
gvox->qcnt++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int32_t isolid(int32_t x, int32_t y, int32_t z)
|
||||||
|
{
|
||||||
|
if ((uint32_t) x >= (uint32_t) voxsiz.x) return(0);
|
||||||
|
if ((uint32_t) y >= (uint32_t) voxsiz.y) return(0);
|
||||||
|
if ((uint32_t) z >= (uint32_t) voxsiz.z) return(0);
|
||||||
|
z += x*yzsiz + y*voxsiz.z; return(vbit[z>>5]&(1<<SHIFTMOD32(z)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static voxmodel_t *vox2poly()
|
||||||
|
{
|
||||||
|
int32_t i, j, x, y, z, v, ov, oz = 0, cnt, sc, x0, y0, dx, dy, *bx0, *by0;
|
||||||
|
void(*daquad)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t);
|
||||||
|
|
||||||
|
gvox = (voxmodel_t *) Xmalloc(sizeof(voxmodel_t));
|
||||||
|
memset(gvox, 0, sizeof(voxmodel_t));
|
||||||
|
|
||||||
|
//x is largest dimension, y is 2nd largest dimension
|
||||||
|
x = voxsiz.x; y = voxsiz.y; z = voxsiz.z;
|
||||||
|
if ((x < y) && (x < z)) x = z; else if (y < z) y = z;
|
||||||
|
if (x < y) { z = x; x = y; y = z; }
|
||||||
|
shcntp = x; i = x*y*sizeof(int32_t);
|
||||||
|
shcntmal = (int32_t *) Xmalloc(i);
|
||||||
|
memset(shcntmal, 0, i); shcnt = &shcntmal[-shcntp-1];
|
||||||
|
gmaxx = gmaxy = garea = 0;
|
||||||
|
|
||||||
|
if (pow2m1[32] != -1) { for (i=0; i<32; i++) pow2m1[i] = (1u<<i)-1; pow2m1[32] = -1; }
|
||||||
|
for (i=0; i<7; i++) gvox->qfacind[i] = -1;
|
||||||
|
|
||||||
|
i = ((max(voxsiz.y, voxsiz.z)+1)<<2);
|
||||||
|
bx0 = (int32_t *) Xmalloc(i<<1);
|
||||||
|
by0 = (int32_t *) (((intptr_t) bx0)+i);
|
||||||
|
|
||||||
|
for (cnt=0; cnt<2; cnt++)
|
||||||
|
{
|
||||||
|
if (!cnt) daquad = cntquad;
|
||||||
|
else daquad = addquad;
|
||||||
|
gvox->qcnt = 0;
|
||||||
|
|
||||||
|
memset(by0, -1, (max(voxsiz.y, voxsiz.z)+1)<<2); v = 0;
|
||||||
|
|
||||||
|
for (i=-1; i<=1; i+=2)
|
||||||
|
for (y=0; y<voxsiz.y; y++)
|
||||||
|
for (x=0; x<=voxsiz.x; x++)
|
||||||
|
for (z=0; z<=voxsiz.z; z++)
|
||||||
|
{
|
||||||
|
ov = v; v = (isolid(x, y, z) && (!isolid(x, y+i, z)));
|
||||||
|
if ((by0[z] >= 0) && ((by0[z] != oz) || (v >= ov)))
|
||||||
|
{
|
||||||
|
daquad(bx0[z], y, by0[z], x, y, by0[z], x, y, z, i>=0); by0[z] = -1;
|
||||||
|
}
|
||||||
|
if (v > ov) oz = z; else if ((v < ov) && (by0[z] != oz)) { bx0[z] = x; by0[z] = oz; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=-1; i<=1; i+=2)
|
||||||
|
for (z=0; z<voxsiz.z; z++)
|
||||||
|
for (x=0; x<=voxsiz.x; x++)
|
||||||
|
for (y=0; y<=voxsiz.y; y++)
|
||||||
|
{
|
||||||
|
ov = v; v = (isolid(x, y, z) && (!isolid(x, y, z-i)));
|
||||||
|
if ((by0[y] >= 0) && ((by0[y] != oz) || (v >= ov)))
|
||||||
|
{
|
||||||
|
daquad(bx0[y], by0[y], z, x, by0[y], z, x, y, z, (i>=0)+2); by0[y] = -1;
|
||||||
|
}
|
||||||
|
if (v > ov) oz = y; else if ((v < ov) && (by0[y] != oz)) { bx0[y] = x; by0[y] = oz; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=-1; i<=1; i+=2)
|
||||||
|
for (x=0; x<voxsiz.x; x++)
|
||||||
|
for (y=0; y<=voxsiz.y; y++)
|
||||||
|
for (z=0; z<=voxsiz.z; z++)
|
||||||
|
{
|
||||||
|
ov = v; v = (isolid(x, y, z) && (!isolid(x-i, y, z)));
|
||||||
|
if ((by0[z] >= 0) && ((by0[z] != oz) || (v >= ov)))
|
||||||
|
{
|
||||||
|
daquad(x, bx0[z], by0[z], x, y, by0[z], x, y, z, (i>=0)+4); by0[z] = -1;
|
||||||
|
}
|
||||||
|
if (v > ov) oz = z; else if ((v < ov) && (by0[z] != oz)) { bx0[z] = y; by0[z] = oz; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cnt)
|
||||||
|
{
|
||||||
|
shp = (spoint2d *) Xmalloc(gvox->qcnt*sizeof(spoint2d));
|
||||||
|
|
||||||
|
sc = 0;
|
||||||
|
for (y=gmaxy; y; y--)
|
||||||
|
for (x=gmaxx; x>=y; x--)
|
||||||
|
{
|
||||||
|
i = shcnt[y*shcntp+x]; shcnt[y*shcntp+x] = sc; //shcnt changes from counter to head index
|
||||||
|
for (; i>0; i--) { shp[sc].x = x; shp[sc].y = y; sc++; }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (gvox->mytexx=32; gvox->mytexx<(gmaxx+(VOXBORDWIDTH<<1)); gvox->mytexx<<=1);
|
||||||
|
for (gvox->mytexy=32; gvox->mytexy<(gmaxy+(VOXBORDWIDTH<<1)); gvox->mytexy<<=1);
|
||||||
|
while (gvox->mytexx*gvox->mytexy*8 < garea*9) //This should be sufficient to fit most skins...
|
||||||
|
{
|
||||||
|
skindidntfit:
|
||||||
|
;
|
||||||
|
if (gvox->mytexx <= gvox->mytexy) gvox->mytexx <<= 1; else gvox->mytexy <<= 1;
|
||||||
|
}
|
||||||
|
mytexo5 = (gvox->mytexx>>5);
|
||||||
|
|
||||||
|
i = (((gvox->mytexx*gvox->mytexy+31)>>5)<<2);
|
||||||
|
zbit = (int32_t *) Xmalloc(i);
|
||||||
|
memset(zbit, 0, i);
|
||||||
|
|
||||||
|
v = gvox->mytexx*gvox->mytexy;
|
||||||
|
for (z=0; z<sc; z++)
|
||||||
|
{
|
||||||
|
dx = shp[z].x+(VOXBORDWIDTH<<1); dy = shp[z].y+(VOXBORDWIDTH<<1); i = v;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
#if (VOXUSECHAR != 0)
|
||||||
|
x0 = (((rand()&32767)*(min(gvox->mytexx, 255)-dx))>>15);
|
||||||
|
y0 = (((rand()&32767)*(min(gvox->mytexy, 255)-dy))>>15);
|
||||||
|
#else
|
||||||
|
x0 = (((rand()&32767)*(gvox->mytexx+1-dx))>>15);
|
||||||
|
y0 = (((rand()&32767)*(gvox->mytexy+1-dy))>>15);
|
||||||
|
#endif
|
||||||
|
i--;
|
||||||
|
if (i < 0) //Time-out! Very slow if this happens... but at least it still works :P
|
||||||
|
{
|
||||||
|
Bfree(zbit);
|
||||||
|
|
||||||
|
//Re-generate shp[].x/y (box sizes) from shcnt (now head indices) for next pass :/
|
||||||
|
j = 0;
|
||||||
|
for (y=gmaxy; y; y--)
|
||||||
|
for (x=gmaxx; x>=y; x--)
|
||||||
|
{
|
||||||
|
i = shcnt[y*shcntp+x];
|
||||||
|
for (; j<i; j++) { shp[j].x = x0; shp[j].y = y0; }
|
||||||
|
x0 = x; y0 = y;
|
||||||
|
}
|
||||||
|
for (; j<sc; j++) { shp[j].x = x0; shp[j].y = y0; }
|
||||||
|
|
||||||
|
goto skindidntfit;
|
||||||
|
}
|
||||||
|
} while (!isrectfree(x0, y0, dx, dy));
|
||||||
|
while ((y0) && (isrectfree(x0, y0-1, dx, 1))) y0--;
|
||||||
|
while ((x0) && (isrectfree(x0-1, y0, 1, dy))) x0--;
|
||||||
|
setrect(x0, y0, dx, dy);
|
||||||
|
shp[z].x = x0; shp[z].y = y0; //Overwrite size with top-left location
|
||||||
|
}
|
||||||
|
|
||||||
|
gvox->quad = (voxrect_t *) Xmalloc(gvox->qcnt*sizeof(voxrect_t));
|
||||||
|
gvox->mytex = (int32_t *) Xmalloc(gvox->mytexx*gvox->mytexy*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Bfree(shp); Bfree(zbit); Bfree(bx0);
|
||||||
|
return(gvox);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t loadvox(const char *filnam)
|
||||||
|
{
|
||||||
|
int32_t i, j, k, x, y, z, pal[256], fil;
|
||||||
|
char c[3], *tbuf;
|
||||||
|
|
||||||
|
fil = kopen4load(filnam, 0); if (fil < 0) return(-1);
|
||||||
|
kread(fil, &voxsiz, sizeof(vec3_t));
|
||||||
|
#if B_BIG_ENDIAN != 0
|
||||||
|
voxsiz.x = B_LITTLE32(voxsiz.x);
|
||||||
|
voxsiz.y = B_LITTLE32(voxsiz.y);
|
||||||
|
voxsiz.z = B_LITTLE32(voxsiz.z);
|
||||||
|
#endif
|
||||||
|
voxpiv.x = (float) voxsiz.x * .5f;
|
||||||
|
voxpiv.y = (float) voxsiz.y * .5f;
|
||||||
|
voxpiv.z = (float) voxsiz.z * .5f;
|
||||||
|
|
||||||
|
klseek(fil, -768, SEEK_END);
|
||||||
|
for (i=0; i<256; i++)
|
||||||
|
{
|
||||||
|
kread(fil, c, 3); pal[i] = (((int32_t) c[0])<<18)+(((int32_t) c[1])<<10)+(((int32_t) c[2])<<2)+(i<<24);
|
||||||
|
}
|
||||||
|
pal[255] = -1;
|
||||||
|
|
||||||
|
vcolhashsizm1 = 8192-1;
|
||||||
|
vcolhashead = (int32_t *) Xmalloc((vcolhashsizm1+1)*sizeof(int32_t));
|
||||||
|
memset(vcolhashead, -1, (vcolhashsizm1+1)*sizeof(int32_t));
|
||||||
|
|
||||||
|
yzsiz = voxsiz.y*voxsiz.z; i = ((voxsiz.x*yzsiz+31)>>3)+1;
|
||||||
|
vbit = (int32_t *) Xmalloc(i);
|
||||||
|
memset(vbit, 0, i);
|
||||||
|
|
||||||
|
tbuf = (char *) Xmalloc(voxsiz.z*sizeof(uint8_t));
|
||||||
|
|
||||||
|
klseek(fil, 12, SEEK_SET);
|
||||||
|
for (x=0; x<voxsiz.x; x++)
|
||||||
|
for (y=0, j=x*yzsiz; y<voxsiz.y; y++, j+=voxsiz.z)
|
||||||
|
{
|
||||||
|
kread(fil, tbuf, voxsiz.z);
|
||||||
|
for (z=voxsiz.z-1; z>=0; z--)
|
||||||
|
{
|
||||||
|
if (tbuf[z] != 255) { i = j+z; vbit[i>>5] |= (1<<SHIFTMOD32(i)); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
klseek(fil, 12, SEEK_SET);
|
||||||
|
for (x=0; x<voxsiz.x; x++)
|
||||||
|
for (y=0, j=x*yzsiz; y<voxsiz.y; y++, j+=voxsiz.z)
|
||||||
|
{
|
||||||
|
kread(fil, tbuf, voxsiz.z);
|
||||||
|
for (z=0; z<voxsiz.z; z++)
|
||||||
|
{
|
||||||
|
if (tbuf[z] == 255) continue;
|
||||||
|
if ((!x) || (!y) || (!z) || (x == voxsiz.x-1) || (y == voxsiz.y-1) || (z == voxsiz.z-1))
|
||||||
|
{
|
||||||
|
putvox(x, y, z, pal[tbuf[z]]); continue;
|
||||||
|
}
|
||||||
|
k = j+z;
|
||||||
|
if ((!(vbit[(k-yzsiz)>>5]&(1<<SHIFTMOD32(k-yzsiz)))) ||
|
||||||
|
(!(vbit[(k+yzsiz)>>5]&(1<<SHIFTMOD32(k+yzsiz)))) ||
|
||||||
|
(!(vbit[(k- voxsiz.z)>>5]&(1<<SHIFTMOD32(k- voxsiz.z)))) ||
|
||||||
|
(!(vbit[(k+ voxsiz.z)>>5]&(1<<SHIFTMOD32(k+ voxsiz.z)))) ||
|
||||||
|
(!(vbit[(k- 1)>>5]&(1<<SHIFTMOD32(k- 1)))) ||
|
||||||
|
(!(vbit[(k+ 1)>>5]&(1<<SHIFTMOD32(k+ 1)))))
|
||||||
|
{
|
||||||
|
putvox(x, y, z, pal[tbuf[z]]); continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bfree(tbuf); kclose(fil); return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t loadkvx(const char *filnam)
|
||||||
|
{
|
||||||
|
int32_t i, j, k, x, y, z, pal[256], z0, z1, mip1leng, ysizp1, fil;
|
||||||
|
uint16_t *xyoffs;
|
||||||
|
char c[3], *tbuf, *cptr;
|
||||||
|
|
||||||
|
fil = kopen4load(filnam, 0); if (fil < 0) return(-1);
|
||||||
|
kread(fil, &mip1leng, 4); mip1leng = B_LITTLE32(mip1leng);
|
||||||
|
kread(fil, &voxsiz, sizeof(vec3_t));
|
||||||
|
#if B_BIG_ENDIAN != 0
|
||||||
|
voxsiz.x = B_LITTLE32(voxsiz.x);
|
||||||
|
voxsiz.y = B_LITTLE32(voxsiz.y);
|
||||||
|
voxsiz.z = B_LITTLE32(voxsiz.z);
|
||||||
|
#endif
|
||||||
|
kread(fil, &i, 4); voxpiv.x = (float) B_LITTLE32(i)*(1.f/256.f);
|
||||||
|
kread(fil, &i, 4); voxpiv.y = (float) B_LITTLE32(i)*(1.f/256.f);
|
||||||
|
kread(fil, &i, 4); voxpiv.z = (float) B_LITTLE32(i)*(1.f/256.f);
|
||||||
|
klseek(fil, (voxsiz.x+1)<<2, SEEK_CUR);
|
||||||
|
|
||||||
|
ysizp1 = voxsiz.y+1;
|
||||||
|
i = voxsiz.x*ysizp1*sizeof(int16_t);
|
||||||
|
xyoffs = (uint16_t *) Xmalloc(i);
|
||||||
|
kread(fil, xyoffs, i); for (i=i/sizeof(int16_t)-1; i>=0; i--) xyoffs[i] = B_LITTLE16(xyoffs[i]);
|
||||||
|
|
||||||
|
klseek(fil, -768, SEEK_END);
|
||||||
|
for (i=0; i<256; i++)
|
||||||
|
{
|
||||||
|
kread(fil, c, 3);
|
||||||
|
#if B_BIG_ENDIAN != 0
|
||||||
|
pal[i] = B_LITTLE32((((int32_t) c[0])<<18)+(((int32_t) c[1])<<10)+(((int32_t) c[2])<<2)+(i<<24));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
yzsiz = voxsiz.y*voxsiz.z; i = ((voxsiz.x*yzsiz+31)>>3)+1;
|
||||||
|
vbit = (int32_t *) Xmalloc(i);
|
||||||
|
memset(vbit, 0, i);
|
||||||
|
|
||||||
|
for (vcolhashsizm1=4096; vcolhashsizm1<(mip1leng>>1); vcolhashsizm1<<=1)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
vcolhashsizm1--; //approx to numvoxs!
|
||||||
|
vcolhashead = (int32_t *) Xmalloc((vcolhashsizm1+1)*sizeof(int32_t));
|
||||||
|
memset(vcolhashead, -1, (vcolhashsizm1+1)*sizeof(int32_t));
|
||||||
|
|
||||||
|
klseek(fil, 28+((voxsiz.x+1)<<2)+((ysizp1*voxsiz.x)<<1), SEEK_SET);
|
||||||
|
|
||||||
|
i = kfilelength(fil)-ktell(fil);
|
||||||
|
tbuf = (char *) Xmalloc(i);
|
||||||
|
kread(fil, tbuf, i); kclose(fil);
|
||||||
|
|
||||||
|
cptr = tbuf;
|
||||||
|
for (x=0; x<voxsiz.x; x++) //Set surface voxels to 1 else 0
|
||||||
|
for (y=0, j=x*yzsiz; y<voxsiz.y; y++, j+=voxsiz.z)
|
||||||
|
{
|
||||||
|
i = xyoffs[x*ysizp1+y+1] - xyoffs[x*ysizp1+y]; if (!i) continue;
|
||||||
|
z1 = 0;
|
||||||
|
while (i)
|
||||||
|
{
|
||||||
|
z0 = (int32_t) cptr[0]; k = (int32_t) cptr[1]; cptr += 3;
|
||||||
|
if (!(cptr[-1]&16)) setzrange1(vbit, j+z1, j+z0);
|
||||||
|
i -= k+3; z1 = z0+k;
|
||||||
|
setzrange1(vbit, j+z0, j+z1); // PK: oob in AMC TC dev if vbit alloc'd w/o +1
|
||||||
|
for (z=z0; z<z1; z++) putvox(x, y, z, pal[*cptr++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bfree(tbuf); Bfree(xyoffs); return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t loadkv6(const char *filnam)
|
||||||
|
{
|
||||||
|
int32_t i, j, x, y, numvoxs, z0, z1, fil;
|
||||||
|
uint16_t *ylen;
|
||||||
|
char c[8];
|
||||||
|
|
||||||
|
fil = kopen4load((char *) filnam, 0); if (fil < 0) return(-1);
|
||||||
|
kread(fil, &i, 4); if (B_LITTLE32(i) != 0x6c78764b) { kclose(fil); return(-1); } //Kvxl
|
||||||
|
kread(fil, &voxsiz, sizeof(vec3_t));
|
||||||
|
#if B_BIG_ENDIAN != 0
|
||||||
|
voxsiz.x = B_LITTLE32(voxsiz.x);
|
||||||
|
voxsiz.y = B_LITTLE32(voxsiz.y);
|
||||||
|
voxsiz.z = B_LITTLE32(voxsiz.z);
|
||||||
|
#endif
|
||||||
|
kread(fil, &i, 4); voxpiv.x = (float) (B_LITTLE32(i));
|
||||||
|
kread(fil, &i, 4); voxpiv.y = (float) (B_LITTLE32(i));
|
||||||
|
kread(fil, &i, 4); voxpiv.z = (float) (B_LITTLE32(i));
|
||||||
|
kread(fil, &numvoxs, 4); numvoxs = B_LITTLE32(numvoxs);
|
||||||
|
|
||||||
|
ylen = (uint16_t *) Xmalloc(voxsiz.x*voxsiz.y*sizeof(int16_t));
|
||||||
|
|
||||||
|
klseek(fil, 32+(numvoxs<<3)+(voxsiz.x<<2), SEEK_SET);
|
||||||
|
kread(fil, ylen, voxsiz.x*voxsiz.y*sizeof(int16_t)); for (i=voxsiz.x*voxsiz.y-1; i>=0; i--) ylen[i] = B_LITTLE16(ylen[i]);
|
||||||
|
klseek(fil, 32, SEEK_SET);
|
||||||
|
|
||||||
|
yzsiz = voxsiz.y*voxsiz.z; i = ((voxsiz.x*yzsiz+31)>>3)+1;
|
||||||
|
vbit = (int32_t *) Xmalloc(i);
|
||||||
|
memset(vbit, 0, i);
|
||||||
|
|
||||||
|
for (vcolhashsizm1=4096; vcolhashsizm1<numvoxs; vcolhashsizm1<<=1)
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
vcolhashsizm1--;
|
||||||
|
vcolhashead = (int32_t *) Xmalloc((vcolhashsizm1+1)*sizeof(int32_t));
|
||||||
|
memset(vcolhashead, -1, (vcolhashsizm1+1)*sizeof(int32_t));
|
||||||
|
|
||||||
|
for (x=0; x<voxsiz.x; x++)
|
||||||
|
for (y=0, j=x*yzsiz; y<voxsiz.y; y++, j+=voxsiz.z)
|
||||||
|
{
|
||||||
|
z1 = voxsiz.z;
|
||||||
|
for (i=ylen[x*voxsiz.y+y]; i>0; i--)
|
||||||
|
{
|
||||||
|
kread(fil, c, 8); //b,g,r,a,z_lo,z_hi,vis,dir
|
||||||
|
z0 = B_LITTLE16(*(uint16_t *) &c[4]);
|
||||||
|
if (!(c[6]&16)) setzrange1(vbit, j+z1, j+z0);
|
||||||
|
vbit[(j+z0)>>5] |= (1<<SHIFTMOD32(j+z0));
|
||||||
|
putvox(x, y, z0, B_LITTLE32(*(int32_t *) &c[0])&0xffffff);
|
||||||
|
z1 = z0+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Bfree(ylen); kclose(fil); return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void voxfree(voxmodel_t *m)
|
||||||
|
{
|
||||||
|
if (!m) return;
|
||||||
|
DO_FREE_AND_NULL(m->mytex);
|
||||||
|
DO_FREE_AND_NULL(m->quad);
|
||||||
|
DO_FREE_AND_NULL(m->texid);
|
||||||
|
Bfree(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
voxmodel_t *voxload(const char *filnam)
|
||||||
|
{
|
||||||
|
int32_t i, is8bit, ret;
|
||||||
|
voxmodel_t *vm;
|
||||||
|
|
||||||
|
i = strlen(filnam)-4; if (i < 0) return NULL;
|
||||||
|
if (!Bstrcasecmp(&filnam[i], ".vox")) { ret = loadvox(filnam); is8bit = 1; }
|
||||||
|
else if (!Bstrcasecmp(&filnam[i], ".kvx")) { ret = loadkvx(filnam); is8bit = 1; }
|
||||||
|
else if (!Bstrcasecmp(&filnam[i], ".kv6")) { ret = loadkv6(filnam); is8bit = 0; }
|
||||||
|
//else if (!Bstrcasecmp(&filnam[i],".vxl")) { ret = loadvxl(filnam); is8bit = 0; }
|
||||||
|
else return NULL;
|
||||||
|
if (ret >= 0) vm = vox2poly(); else vm = 0;
|
||||||
|
if (vm)
|
||||||
|
{
|
||||||
|
vm->mdnum = 1; //VOXel model id
|
||||||
|
vm->scale = vm->bscale = 1.f;
|
||||||
|
vm->siz.x = voxsiz.x; vm->siz.y = voxsiz.y; vm->siz.z = voxsiz.z;
|
||||||
|
vm->piv.x = voxpiv.x; vm->piv.y = voxpiv.y; vm->piv.z = voxpiv.z;
|
||||||
|
vm->is8bit = is8bit;
|
||||||
|
|
||||||
|
vm->texid = (uint32_t *) Xcalloc(MAXPALOOKUPS, sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
DO_FREE_AND_NULL(shcntmal);
|
||||||
|
DO_FREE_AND_NULL(vbit);
|
||||||
|
DO_FREE_AND_NULL(vcol);
|
||||||
|
vnum = vmax = 0;
|
||||||
|
DO_FREE_AND_NULL(vcolhashead);
|
||||||
|
|
||||||
|
return vm;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Draw voxel model as perfect cubes
|
||||||
|
int32_t polymost_voxdraw(voxmodel_t *m, const spritetype *tspr)
|
||||||
|
{
|
||||||
|
vec3f_t m0, a0;
|
||||||
|
int32_t i, j, fi, xx, yy, zz;
|
||||||
|
float ru, rv, phack[2]; //, clut[6] = {1.02,1.02,0.94,1.06,0.98,0.98};
|
||||||
|
float f, g, k0, mat[16], omat[16], pc[4];
|
||||||
|
vert_t *vptr;
|
||||||
|
|
||||||
|
if ((intptr_t) m == (intptr_t) (-1)) // hackhackhack
|
||||||
|
return 0;
|
||||||
|
if ((tspr->cstat&48)==32) return 0;
|
||||||
|
|
||||||
|
//updateanimation((md2model *)m,tspr);
|
||||||
|
|
||||||
|
m0.x = m->scale;
|
||||||
|
m0.y = m->scale;
|
||||||
|
m0.z = m->scale;
|
||||||
|
a0.x = a0.y = 0; a0.z = ((globalorientation&8) ? -m->zadd : m->zadd)*m->scale;
|
||||||
|
|
||||||
|
//if (globalorientation&8) //y-flipping
|
||||||
|
//{
|
||||||
|
// m0.z = -m0.z; a0.z = -a0.z;
|
||||||
|
// //Add height of 1st frame (use same frame to prevent animation bounce)
|
||||||
|
// a0.z += m->zsiz*m->scale;
|
||||||
|
//}
|
||||||
|
//if (globalorientation&4) { m0.y = -m0.y; a0.y = -a0.y; } //x-flipping
|
||||||
|
|
||||||
|
k0 = 1.f/(m->bscale * 64.f);
|
||||||
|
f = (float) tspr->xrepeat * (256.f/320.f) * k0;
|
||||||
|
if ((sprite[tspr->owner].cstat&48)==16)
|
||||||
|
f *= 1.25f;
|
||||||
|
|
||||||
|
m0.x *= f; a0.x *= f; f = -f;
|
||||||
|
m0.y *= f; a0.y *= f;
|
||||||
|
f = (float) tspr->yrepeat * k0;
|
||||||
|
m0.z *= f; a0.z *= f;
|
||||||
|
|
||||||
|
k0 = (float) tspr->z;
|
||||||
|
if (globalorientation&128) k0 += (float) ((tilesiz[tspr->picnum].y*tspr->yrepeat)<<1);
|
||||||
|
|
||||||
|
f = (65536.f*512.f)/((float) xdimen*viewingrange);
|
||||||
|
g = 32.f/((float) xdimen*gxyaspect);
|
||||||
|
m0.y *= f; a0.y = (((float) (tspr->x-globalposx))* (1.f/1024.f) + a0.y)*f;
|
||||||
|
m0.x *=-f; a0.x = (((float) (tspr->y-globalposy))* -(1.f/1024.f) + a0.x)*-f;
|
||||||
|
m0.z *= g; a0.z = (((float) (k0 -globalposz))* -(1.f/16384.f) + a0.z)*g;
|
||||||
|
|
||||||
|
md3_vox_calcmat_common(tspr, &a0, f, mat);
|
||||||
|
|
||||||
|
//Mirrors
|
||||||
|
if (grhalfxdown10x < 0) { mat[0] = -mat[0]; mat[4] = -mat[4]; mat[8] = -mat[8]; mat[12] = -mat[12]; }
|
||||||
|
|
||||||
|
if (tspr->cstat&CSTAT_SPRITE_MDHACK)
|
||||||
|
{
|
||||||
|
bglDepthFunc(GL_LESS); //NEVER,LESS,(,L)EQUAL,GREATER,(NOT,G)EQUAL,ALWAYS
|
||||||
|
bglDepthRange(0.0, 0.9999);
|
||||||
|
}
|
||||||
|
bglPushAttrib(GL_POLYGON_BIT);
|
||||||
|
if ((grhalfxdown10x >= 0) /*^ ((globalorientation&8) != 0) ^ ((globalorientation&4) != 0)*/) bglFrontFace(GL_CW); else bglFrontFace(GL_CCW);
|
||||||
|
bglEnable(GL_CULL_FACE);
|
||||||
|
bglCullFace(GL_BACK);
|
||||||
|
|
||||||
|
bglEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
pc[0] = pc[1] = pc[2] = ((float) (numshades-min(max((globalshade * shadescale)+m->shadeoff, 0), numshades)))/((float) numshades);
|
||||||
|
hictinting_apply(pc, globalpal);
|
||||||
|
|
||||||
|
if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66f; else pc[3] = 0.33f; }
|
||||||
|
else pc[3] = 1.0f;
|
||||||
|
pc[3] *= 1.0f - spriteext[tspr->owner].alpha;
|
||||||
|
if ((tspr->cstat&2) || spriteext[tspr->owner].alpha > 0.f || pc[3] < 1.0f) bglEnable(GL_BLEND); //else bglDisable(GL_BLEND);
|
||||||
|
//------------
|
||||||
|
|
||||||
|
//transform to Build coords
|
||||||
|
Bmemcpy(omat, mat, sizeof(omat));
|
||||||
|
f = 1.f/64.f;
|
||||||
|
g = m0.x*f; mat[0] *= g; mat[1] *= g; mat[2] *= g;
|
||||||
|
g = m0.y*f; mat[4] = omat[8]*g; mat[5] = omat[9]*g; mat[6] = omat[10]*g;
|
||||||
|
g =-m0.z*f; mat[8] = omat[4]*g; mat[9] = omat[5]*g; mat[10] = omat[6]*g;
|
||||||
|
mat[12] -= (m->piv.x*mat[0] + m->piv.y*mat[4] + (m->piv.z+m->siz.z*.5f)*mat[8]);
|
||||||
|
mat[13] -= (m->piv.x*mat[1] + m->piv.y*mat[5] + (m->piv.z+m->siz.z*.5f)*mat[9]);
|
||||||
|
mat[14] -= (m->piv.x*mat[2] + m->piv.y*mat[6] + (m->piv.z+m->siz.z*.5f)*mat[10]);
|
||||||
|
bglMatrixMode(GL_MODELVIEW); //Let OpenGL (and perhaps hardware :) handle the matrix rotation
|
||||||
|
mat[3] = mat[7] = mat[11] = 0.f; mat[15] = 1.f;
|
||||||
|
|
||||||
|
bglLoadMatrixf(mat);
|
||||||
|
|
||||||
|
ru = 1.f/((float) m->mytexx);
|
||||||
|
rv = 1.f/((float) m->mytexy);
|
||||||
|
#if (VOXBORDWIDTH == 0)
|
||||||
|
uhack[0] = ru*.125; uhack[1] = -uhack[0];
|
||||||
|
vhack[0] = rv*.125; vhack[1] = -vhack[0];
|
||||||
|
#endif
|
||||||
|
phack[0] = 0; phack[1] = 1.f/256.f;
|
||||||
|
|
||||||
|
if (!m->texid[globalpal]) m->texid[globalpal] = gloadtex(m->mytex, m->mytexx, m->mytexy, m->is8bit, globalpal);
|
||||||
|
else bglBindTexture(GL_TEXTURE_2D, m->texid[globalpal]);
|
||||||
|
bglBegin(GL_QUADS);
|
||||||
|
for (i=0, fi=0; i<m->qcnt; i++)
|
||||||
|
{
|
||||||
|
if (i == m->qfacind[fi]) { f = 1 /*clut[fi++]*/; bglColor4f(pc[0]*f, pc[1]*f, pc[2]*f, pc[3]*f); }
|
||||||
|
vptr = &m->quad[i].v[0];
|
||||||
|
|
||||||
|
xx = vptr[0].x+vptr[2].x;
|
||||||
|
yy = vptr[0].y+vptr[2].y;
|
||||||
|
zz = vptr[0].z+vptr[2].z;
|
||||||
|
|
||||||
|
for (j=0; j<4; j++)
|
||||||
|
{
|
||||||
|
vec3f_t fp;
|
||||||
|
#if (VOXBORDWIDTH == 0)
|
||||||
|
bglTexCoord2f(((float) vptr[j].u)*ru+uhack[vptr[j].u!=vptr[0].u],
|
||||||
|
((float) vptr[j].v)*rv+vhack[vptr[j].v!=vptr[0].v]);
|
||||||
|
#else
|
||||||
|
bglTexCoord2f(((float) vptr[j].u)*ru, ((float) vptr[j].v)*rv);
|
||||||
|
#endif
|
||||||
|
fp.x = ((float) vptr[j].x) - phack[xx>vptr[j].x*2] + phack[xx<vptr[j].x*2];
|
||||||
|
fp.y = ((float) vptr[j].y) - phack[yy>vptr[j].y*2] + phack[yy<vptr[j].y*2];
|
||||||
|
fp.z = ((float) vptr[j].z) - phack[zz>vptr[j].z*2] + phack[zz<vptr[j].z*2];
|
||||||
|
bglVertex3fv((float *) &fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bglEnd();
|
||||||
|
|
||||||
|
//------------
|
||||||
|
bglDisable(GL_CULL_FACE);
|
||||||
|
bglPopAttrib();
|
||||||
|
if (tspr->cstat&CSTAT_SPRITE_MDHACK)
|
||||||
|
{
|
||||||
|
bglDepthFunc(GL_LESS); //NEVER,LESS,(,L)EQUAL,GREATER,(NOT,G)EQUAL,ALWAYS
|
||||||
|
bglDepthRange(0.0, 0.99999);
|
||||||
|
}
|
||||||
|
bglLoadIdentity();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//---------------------------------------- VOX LIBRARY ENDS ----------------------------------------
|
Loading…
Reference in a new issue