shithub: qk1

Download patch

ref: 9d1536e2b0ecf2765e31c575bc3bc79f31aaa786
parent: 698fd693eb728ed79c8246674981318450241756
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Dec 28 10:26:15 EST 2023

sprite: add SPRITE32 (found in Nehahra) support

--- a/model_sprite.c
+++ b/model_sprite.c
@@ -1,9 +1,9 @@
 #include "quakedef.h"
 
 static byte *
-Mod_LoadSpriteFrame(byte *in, byte *e, mspriteframe_t **ppframe)
+Mod_LoadSpriteFrame(model_t *mod, byte *in, byte *e, mspriteframe_t **ppframe)
 {
-	int w, h, size, origin[2];
+	int i, w, h, size, origin[2];
 	mspriteframe_t *pspriteframe;
 
 	if(e-in < 4*4){
@@ -20,7 +20,7 @@
 		werrstr("invalid dimensions: %dx%d", w, h);
 		return nil;
 	}
-	if(e-in < (size = w*h))
+	if(e-in < (size = w*h)*(mod->ver == SPRITE32_VERSION ? (int)sizeof(pixel_t) : 1))
 		goto toosmall;
 
 	*ppframe = pspriteframe = Hunk_Alloc(sizeof(*pspriteframe) + size*sizeof(pixel_t));
@@ -30,14 +30,19 @@
 	pspriteframe->down = origin[1] - h;
 	pspriteframe->left = origin[0];
 	pspriteframe->right = w + origin[0];
-	torgbx(in, pspriteframe->pixels, size);
-	in += size;
+	if(mod->ver == SPRITE_VERSION){
+		torgbx(in, pspriteframe->pixels, size);
+		in += size;
+	}else if(mod->ver == SPRITE32_VERSION){
+		for(i = 0; i < size; i++, in += sizeof(pixel_t))
+			pspriteframe->pixels[i] = in[0]<<24 | in[3]<<16 | in[1]<<8 | in[2];
+	}
 
 	return in;
 }
 
 static byte *
-Mod_LoadSpriteGroup(byte *in, byte *e, mspritegroup_t **ppgroup)
+Mod_LoadSpriteGroup(model_t *mod, byte *in, byte *e, mspritegroup_t **ppgroup)
 {
 	mspritegroup_t *spgrp;
 	float *poutintervals;
@@ -69,7 +74,7 @@
 	}
 
 	for(i = 0; i < numframes; i++){
-		in = Mod_LoadSpriteFrame(in, e, &spgrp->frames[i]);
+		in = Mod_LoadSpriteFrame(mod, in, e, &spgrp->frames[i]);
 		if(in == nil)
 			break;
 	}
@@ -80,8 +85,8 @@
 void
 Mod_LoadSpriteModel(model_t *mod, byte *in0, int total)
 {
-	int version, numframes, i;
 	msprite_t *psprite;
+	int numframes, i;
 	byte *in, *e;
 
 	if(total < 9*4){
@@ -92,8 +97,8 @@
 
 	in = in0 + 4;
 	e = in0 + total;
-	if((version = le32(in)) != SPRITE_VERSION){
-		werrstr("wrong version number (%d should be %d)", version, SPRITE_VERSION);
+	if((mod->ver = le32(in)) != SPRITE_VERSION && mod->ver != SPRITE32_VERSION){
+		werrstr("invalid/unsupported version number: %d", mod->ver);
 		goto err;
 	}
 
@@ -128,9 +133,9 @@
 		if(e-in < 4)
 			goto toosmall;
 		if((psprite->frames[i].type = le32(in)) == SPR_SINGLE)
-			in = Mod_LoadSpriteFrame(in, e, &psprite->frames[i].frameptr);
+			in = Mod_LoadSpriteFrame(mod, in, e, &psprite->frames[i].frameptr);
 		else
-			in = Mod_LoadSpriteGroup(in, e, &psprite->frames[i].framegrp);
+			in = Mod_LoadSpriteGroup(mod, in, e, &psprite->frames[i].framegrp);
 		if(in == nil){
 			werrstr("frame(group) %d: %s", i, lerr());
 			goto err;
--- a/spritegn.h
+++ b/spritegn.h
@@ -2,6 +2,7 @@
 
 enum {
 	SPRITE_VERSION = 1,
+	SPRITE32_VERSION = 32,
 
 	SPR_VP_PARALLEL_UPRIGHT = 0,
 	SPR_FACING_UPRIGHT,