Example #1
0
int cl_init(void)
{
	unsigned int i;
	gfs = gfs_open("data/game.gfs");
	if ( gfs == NULL )
		return 0;

	client_frame = 0;

	/* Bind keys */
	cl_cmd_bind("backquote", "console");
	cl_cmd_bind("q", "quit");
	cl_cmd_bind("w", "+forwards");
	cl_cmd_bind("s", "+backwards");
	cl_cmd_bind("a", "+strafe_left");
	cl_cmd_bind("d", "+strafe_right");
	cl_cmd_bind("space", "+jump");
	cl_cmd_bind("c", "+crouch");

	//if ( !gl_init(1920, 1080, 24, 1) )
	if ( !gl_init(1280, 720, 24, 0) )
		return 0;

	if ( !hud_init() )
		return 0;
#if 0
	for(i = 0; i < sizeof(soldier)/sizeof(*soldier); i++) {
		soldier[i] = md2_new("md2_mdl/monsters/soldier/tris.md2");
		if ( soldier[i] ) {
			vector_t v;
			v[X] = 50 + 30 * i;
			v[Y] = 0;
			v[Z] = 0;
			md2_skin(soldier[i], i);
			md2_animate(soldier[i], 146, 214);
			md2_spawn(soldier[i], v);
		}
	}
#endif
	for(i = 0; i < sizeof(marine)/sizeof(*marine); i++) {
		marine[i] = md5_new("models/md5/chars/marine.md5mesh");
		if ( marine[i] ) {
			vector_t v;
			v[Z] = 0;
			v[Y] = 0;
			v[Z] = 50 + 50 * i;
			md5_animate(marine[i], anims[i]);
			md5_spawn(marine[i], v);
		}
	}

	return 1;
}
Example #2
0
int32 func__loadimage(qbs *f,int32 bpp,int32 passed){
if (new_error) return 0;

static int32 isHardware;
isHardware=0; if (bpp==33){bpp=32; isHardware=1;}

//validate bpp
if (passed){
if ((bpp!=32)&&(bpp!=256)){error(5); return 0;}
}else{
if (write_page->text){error(5); return 0;}
bpp=-1;
}
if (!f->len) return -1;//return invalid handle if null length string
//load the file
static int32 fh,result;
static int64 lof;
fh=gfs_open(f,1,0,0);
if (fh<0) return -1;
lof=gfs_lof(fh);
static uint8* content;
content=(uint8*)malloc(lof); if (!content){gfs_close(fh); return -1;}
result=gfs_read(fh,-1,content,lof);
gfs_close(fh);
if (result<0){free(content); return -1;}

//Identify format:
 static int32 format;
format=0;

//'.png'
if (lof>=8){
if ((content[0]==0x89)&&(content[1]==0x50)&&(content[2]==0x4E)&&(content[3]==0x47)&&
    (content[4]==0x0D)&&(content[5]==0x0A)&&(content[6]==0x1A)&&(content[7]==0x0A))
    {format=2; goto got_format;}//PNG
}//8

//'.bmp'
if (lof>=6){
 if ((content[0]==0x42)&&(content[1]==0x4D)){
  if ( (*((int32*)(&content[2]))) == lof ){//length of file
   format=3; goto got_format;
  }
 }//BMP 
}//6

//'.jpg' The first two bytes of every JPEG stream are the Start Of Image (SOI) marker values FFh D8h
if (lof>=2){
if ((content[0]==0xFF)&&(content[1]==0xD8)){format=1; goto got_format;}//JP[E]G
}//2

//GIF is handled by our "other" library
//'.gif' "GIF"
//if (lof>=3){
//if ((content[0]==71)&&(content[1]==73)&&(content[2]==70)){format=4; goto got_format;}//GIF
//}//3

got_format:

static uint8 *pixels;
static int32 x,y;

if (format==0) pixels=image_decode_other(content,lof,&result,&x,&y);
if (format==1) pixels=image_decode_jpg(content,lof,&result,&x,&y);
if (format==2) pixels=image_decode_png(content,lof,&result,&x,&y);
if (format==3) pixels=image_decode_bmp(content,lof,&result,&x,&y);

free(content);
if (!(result&1)) return -1;

//...

static int32 i;
i=func__newimage(x,y,32,1);
if (i==-1){free(pixels); return -1;}
memcpy(img[-i].offset,pixels,x*y*4);
free(pixels);

if (isHardware){
 static int32 iHardware;
 iHardware=func__copyimage(i,33,1);
 sub__freeimage(i,1);
 i=iHardware;
}

return i;


#ifndef NO_S_D_L
static qbs *tqbs=NULL,*nullt=NULL;
static int32 i;
if (new_error) return 0;
//validate bpp
if (passed){
if ((bpp!=32)&&(bpp!=256)){error(5); return 0;}
}else{
if (write_page->text){error(5); return 0;}
bpp=-1;
}
if (!f->len) return -1;//return invalid handle if null length string
if (!tqbs) tqbs=qbs_new(0,0);
if (!nullt){nullt=qbs_new(1,0); nullt->chr[0]=0;}
qbs_set(tqbs,qbs_add(f,nullt));
i=imgload(fixdir(tqbs),bpp);
if (!i) return -1;//failed
return -i;
return -1;
#endif //NO_S_D_L

}
Example #3
0
int32 func__sndopen(qbs* filename,qbs* requirements,int32 passed){
sndsetup();
if (new_error) return 0;

static qbs *s1=NULL;
if (!s1) s1=qbs_new(0,0);
static qbs *req=NULL;
if (!req) req=qbs_new(0,0);
static qbs *s3=NULL;
if (!s3) s3=qbs_new(0,0);

static uint8 r[32];
static int32 i,i2,i3;
//check requirements
memset(r,0,32);
if (passed){
if (requirements->len){
i=1;
qbs_set(req,qbs_ucase(requirements));//convert tmp str to perm str
nextrequirement:
i2=func_instr(i,req,qbs_new_txt(","),1);
if (i2){
qbs_set(s1,func_mid(req,i,i2-i,1));
}else{
qbs_set(s1,func_mid(req,i,req->len-i+1,1));
}
qbs_set(s1,qbs_rtrim(qbs_ltrim(s1)));
if (qbs_equal(s1,qbs_new_txt("SYNC"))){r[0]++; goto valid;}
if (qbs_equal(s1,qbs_new_txt("VOL"))){r[1]++; goto valid;}
if (qbs_equal(s1,qbs_new_txt("PAUSE"))){r[2]++; goto valid;}
if (qbs_equal(s1,qbs_new_txt("LEN"))){r[3]++; goto valid;}
if (qbs_equal(s1,qbs_new_txt("SETPOS"))){r[4]++; goto valid;}
error(5); return 0;//invalid requirements
valid:
if (i2){i=i2+1; goto nextrequirement;}
for (i=0;i<32;i++) if (r[i]>1){error(5); return 0;}//cannot define requirements twice
}//->len
}//passed
qbs_set(s1,qbs_add(filename,qbs_new_txt_len("\0",1)));//s1=filename+CHR$(0)

if (!r[0]){//NOT SYNC
 if (snd_stream_handle){error(5); return 0;}//stream in use
}

//load file
if (s1->len==1) return 0;//return invalid handle if null length string
static int32 fh,result;
static int64 lof;
fh=gfs_open(s1,1,0,0);
if (fh<0) return 0;
lof=gfs_lof(fh);
static uint8* content;
content=(uint8*)malloc(lof); if (!content){gfs_close(fh); return 0;}
result=gfs_read(fh,-1,content,lof);
gfs_close(fh);
if (result<0){free(content); return 0;}

//identify file format
static snd_sequence_struct *seq;

//OGG?
#ifdef DEPENDENCY_AUDIO_DECODE_OGG
if (lof>=3){
if (content[0]==79){ if (content[1]==103){ if (content[2]==103){//"Ogg"
   seq=snd_decode_ogg(content,lof);
   goto got_seq;
}}}
}//3
#endif

//WAV?
#ifdef DEPENDENCY_AUDIO_DECODE_WAV
if (lof>=12){
  if ((*(uint32*)&content[8])==0x45564157){//WAVE
   seq=snd_decode_wav(content,lof);
   goto got_seq;
  }//WAVE
}
#endif

//assume mp3!
//MP3?
#ifdef DEPENDENCY_AUDIO_DECODE_MP3
seq=snd_decode_mp3(content,lof);
#endif

got_seq:
free(content);
if (seq==NULL) return 0;

//convert sequence (includes sample rate conversion etc etc)

//just perform sample_rate fix for now...

//1. 8->16bit conversion and/or edian conversion
static int32 incorrect_format;
incorrect_format=0;
if (seq->bits_per_sample!=16) incorrect_format=1;
if (seq->is_unsigned) incorrect_format=1;
//todo... if (seq->endian==???)

//this section does not fix the frequency, only the bits per sample
//and signed-ness of the data
if (incorrect_format){
 static int32 bps; bps=seq->bits_per_sample/8;
 static int32 samples; samples=seq->data_size/bps;
 static uint8 *new_data;
 if (bps!=2){
  new_data=(uint8*)malloc(samples*2);
 }else{
  new_data=seq->data;
 }
 static int32 i,v;
 for (i=0;i<samples;i++){
  //read original value
  v=0;
  if (bps==1){
   if (seq->is_unsigned){
    v=*(uint8*)(seq->data+i*1);
    v=(v-128)*256;
   }else{
    v=*(int8*)(seq->data+i*1);
    v=v*128;
   }
  }
  if (bps==2){
   if (seq->is_unsigned){
    v=*(uint16*)(seq->data+i*2);
    v=v-32768;
   }else{
    v=*(int16*)(seq->data+i*2);
   }
  }
  //place new value into array
  ((int16*)new_data)[i]=v;
 }//i
 if (bps!=2){free(seq->data); seq->data=new_data; seq->data_size=samples*2;}
 //update seq info
 seq->bits_per_sample=16;
 seq->is_unsigned=0;
}//incorrect format


//2. samplerate conversion
if (seq->sample_rate != snd_frequency) { //need to resample seq->data
  //create new resampler
  SpeexResamplerState *state;
  state = speex_resampler_init(seq->channels, seq->sample_rate, snd_frequency, SPEEX_RESAMPLER_QUALITY_MIN, NULL);
  if (!state) { //NULL means failure
    free(seq->data);
    return 0;
  }
  
  //allocate new memory for output
  int32 out_samples_max = ((double)seq->data_size / seq->channels / 2) * ((((double)snd_frequency) / ((double)seq->sample_rate)) + 0.1) + 100;//10%+100 extra samples as a buffer-zone
  int16 *resampled = (int16 *)malloc(out_samples_max * seq->channels * sizeof(int16));
  if (!resampled) {
    free(seq->data);
    return 0;
  }
  
  //establish data sizes
  //in_len will be set by the resampler to number of samples processed
  spx_uint32_t in_len = seq->data_size / seq->channels / 2; // divide by 2 because 2byte samples, divive by #channels because function wants it per-channel
  //out_len will be set to the number of samples written
  spx_uint32_t out_len;
  
  //resample!
  if (speex_resampler_process_interleaved_int(state, (spx_int16_t *)seq->data, &in_len, (spx_int16_t *)resampled, &out_len) != RESAMPLER_ERR_SUCCESS) {
    //Error
    free(resampled);
    free(seq->data);
    speex_resampler_destroy(state);
    return 0;
  }
  
  //destroy the resampler anyway
  speex_resampler_destroy(state);
  
  //establish real size of new data and update seq
  free(seq->data); //That was the old data
  seq->data_size = out_len * seq->channels * 2; //remember out_len is perchannel, and each sample is 2 bytes
  seq->data = (uint8_t *)realloc(resampled, seq->data_size); //we overestimated the array size before, so make it the correct size now
  if (!seq->data) { //realloc could fail
    free(resampled);
    return 0;
  }
  seq->sample_rate = snd_frequency;
}

if (seq->channels==1){
seq->data_mono=seq->data;
seq->data_mono_size=seq->data_size;
}
if (seq->channels==2){
seq->data_stereo=seq->data;
seq->data_stereo_size=seq->data_size;
}
if (seq->channels>2) return 0;

//attach sequence to handle (& inc. refs)
//create snd handle
static int32 handle; handle=list_add(snd_handles);
static snd_struct *snd; snd=(snd_struct*)list_get(snd_handles,handle);

snd->internal=0;
snd->type=2;
snd->seq=seq;
snd->volume=1.0;
snd->capability=r[0]*SND_CAPABILITY_SYNC+r[1]*SND_CAPABILITY_VOL+r[2]*SND_CAPABILITY_PAUSE+r[3]*SND_CAPABILITY_LEN+r[4]*SND_CAPABILITY_SETPOS;
if (!r[0]){
 snd->streamed=1;//NOT SYNC
 snd_stream_handle=handle;
}

return handle;
}