Beispiel #1
0
void read_scene(tokenizer& t,document_type& doc)
{
    //std::cerr << "unsupported data: Scene" << std::endl;
    OutputDebugStringA("Scene>>>>");
    t.expect_literal( "{" );
    for( ;; ) {
        substr token = t();
        OutputDebugStringA((token.str() + "\n").c_str());
        if( token == "}" ) { break; }
        if( token == "amb" ) {
            doc.scene.ambient.red = t.expect_float(0,1);
            doc.scene.ambient.green = t.expect_float(0,1);
            doc.scene.ambient.blue = t.expect_float(0,1);
            doc.scene.ambient.alpha = 1;
            t.expect_linefeed();
        } else if( token == "dirlights" ) {
            t();
            skip_chunk(t);
            skip_to_linefeed(t);
        } else {
            skip_to_linefeed(t);
        }
    }
    OutputDebugStringA("Scene<<<<");
}
Beispiel #2
0
static inline mpeg2_state_t seek_chunk (mpeg2dec_t * mpeg2dec)
{
    int size, skipped;

    size = mpeg2dec->buf_end - mpeg2dec->buf_start;
    skipped = skip_chunk (mpeg2dec, size);
    if (!skipped) {
	mpeg2dec->bytes_since_tag += size;
	return STATE_BUFFER;
    }
    mpeg2dec->bytes_since_tag += skipped;
    mpeg2dec->code = mpeg2dec->buf_start[-1];
    return STATE_INTERNAL_NORETURN;
}
Beispiel #3
0
int
get_mapdata_chunk(FILE *stream, int tag, MapData *md) {
	switch (tag) {
		case MAT_MAPNAME:
			strlimit=13;
			if (!get_mtlchunk(stream,md->name)) {
				return(0);
				}
#ifdef DBGLDMLI
		if (dbgldmli)
				printf("  get_map : mapname: %s \n",md->name);
#endif
			return(1);
		case MAT_MAP_TILING: 
			return(get_mtlchunk(stream,&md->p.tex.texflags));
		case MAT_MAP_TILINGOLD: 
			if (!get_mtlchunk(stream,&md->p.tex.texflags)) {
				return(0);
				}
			if (md->p.tex.texflags&TEX_DECAL)
				md->p.tex.texflags|=TEX_NOWRAP;				
			return(1);
		case MAT_MAP_TEXBLUR: 
			return(get_mtlchunk(stream,&md->p.tex.texblur));
		case MAT_MAP_TEXBLUR_OLD: 
			return(get_mtlchunk(stream,&md->p.tex.texblur));
		case MAT_MAP_USCALE: 
			return(get_mtlchunk(stream,&md->p.tex.uscale));
		case MAT_MAP_VSCALE: 
			return(get_mtlchunk(stream,&md->p.tex.vscale));
		case MAT_MAP_UOFFSET: 
			return(get_mtlchunk(stream,&md->p.tex.uoffset));
		case MAT_MAP_VOFFSET: 
			return(get_mtlchunk(stream,&md->p.tex.voffset));
		case MAT_MAP_ANG: 
			return(get_mtlchunk(stream,&md->p.tex));
		case MAT_MAP_COL1: 
			return(get_mtlchunk(stream,&md->p.tex.col1));
		case MAT_MAP_COL2: 
			return(get_mtlchunk(stream,&md->p.tex.col2));
		case MAT_MAP_RCOL: 
			return(get_mtlchunk(stream,&md->p.tex.rcol));
		case MAT_MAP_GCOL: 
			return(get_mtlchunk(stream,&md->p.tex.gcol));
		case MAT_MAP_BCOL: 
			return(get_mtlchunk(stream,&md->p.tex.bcol));
		default:
			return(skip_chunk(stream));
		}
	}
Beispiel #4
0
void read_backimage(tokenizer& t,document_type& doc)
{
    //std::cerr << "unsupported data: BackImage" << std::endl;
    skip_chunk(t);
}
Beispiel #5
0
int
get_mtlchunk(FILE *stream,void *data)
	{
	/* Grab a chunk from the file and process all its subsets */
	Chunk_hdr chunk;
	Chunk_hdr nxt;
	uint thistag,nexttag;
	char *string;
	short *pshort;
	
	RDERR(&chunk,6);
	
	thistag=chunk.tag;
	
#ifdef DBGLDMLI
	if (dbgldmli)
		printf("          get_mtlchunk: tag=%X, size=%d \n",thistag,chunk.size);
#endif
	
	/* Update chunk size to account for header */
	
	chunk.size-=6L;
	
	/* Find chunk type and go process it */
	
	switch(thistag)
		{
		case MLIBMAGIC:
			while(chunk.size)
				{
				if(get_next_chunk(stream,&nxt)==0)
					return(0);
				nexttag=nxt.tag;
				switch(nexttag)
					{
					case MAT_ENTRY:
						loadmtl= &inmtl;
						/* Zero out data structure first */
						init_mtl_struct(loadmtl);
	
						if(get_mtlchunk(stream,NULL)==0)
							return(0);
						if(put_lib_mtl(loadmtl)==0)
							return(0);
						break;     
					default:
						if(skip_chunk(stream)==0){
							MtlError();
							return(0);
							}
						break;
					}
				chunk.size-=nxt.size;
				}
			break;
		case MAT_ENTRY:
		case MATMAGIC:
			while(chunk.size)
				{
				if(get_next_chunk(stream,&nxt)==0)
					return(0);
				nexttag=nxt.tag;
				switch(nexttag)
					{
					case MAT_NAME:
						strlimit=17;
						if(get_mtlchunk(stream,loadmtl->name)==0)
							return(0);
#ifdef DBGLDMLI
						if (dbgldmli)
							printf(" **** Loading material : %s \n", loadmtl->name);
#endif
						if(just_name) /* If all we need is the name, return */
							return(1);
						break;     
					case MAT_AMBIENT:
						if(get_mtlchunk(stream,&loadmtl->amb)==0)
							return(0);
						break;     
					case MAT_DIFFUSE:
						if(get_mtlchunk(stream,&loadmtl->diff)==0)
							return(0);
						break;     
					case MAT_SPECULAR:
						if(get_mtlchunk(stream,&loadmtl->spec)==0)
							return(0);
						break;     
					case MAT_ACUBIC:
						{
						Mapping *m = loadmtl->map[Nrefl];
						if (m==NULL) goto	skip_mtl_chunk;
						if (get_mtlchunk(stream,&m->map.p.ref.acb)==0)
							return(0);
						}
						break;     
	
					case MAT_SXP_TEXT_DATA:       
					case MAT_SXP_TEXT2_DATA: 
					case MAT_SXP_OPAC_DATA:  
					case MAT_SXP_BUMP_DATA:  
					case MAT_SXP_SPEC_DATA:  
					case MAT_SXP_SELFI_DATA: 
					case MAT_SXP_SHIN_DATA:  
				
					case MAT_SXP_TEXT_MASKDATA:  
					case MAT_SXP_TEXT2_MASKDATA: 
					case MAT_SXP_OPAC_MASKDATA:  
					case MAT_SXP_BUMP_MASKDATA:  
					case MAT_SXP_SPEC_MASKDATA:  
					case MAT_SXP_SELFI_MASKDATA: 
					case MAT_SXP_SHIN_MASKDATA:  
					case MAT_SXP_REFL_MASKDATA:  
						if(get_mtlchunk(stream,NULL)==0)
							return(0);
						break;
				
					case MAT_TEXMAP:   
					case MAT_TEX2MAP:  
					case MAT_OPACMAP:  
					case MAT_BUMPMAP:  
					case MAT_SPECMAP:  
					case MAT_SHINMAP:  
					case MAT_SELFIMAP: 
					case MAT_REFLMAP:  
	
					case MAT_TEXMASK:   
					case MAT_TEX2MASK:  
					case MAT_OPACMASK:  
					case MAT_BUMPMASK:  
					case MAT_SPECMASK:  
					case MAT_SHINMASK:  
					case MAT_SELFIMASK: 
					case MAT_REFLMASK:  
						if(get_mtlchunk(stream,NULL)==0)
							return(0);
						break;
	
					case MAT_SHININESS:
					case MAT_SHIN2PCT:
					case MAT_TRANSPARENCY:
					case MAT_XPFALL:
					case MAT_REFBLUR:
					case MAT_SELF_ILPCT:
					case MAT_SHADING:
					case MAT_TWO_SIDE:
					case MAT_SUPERSMP:
					case MAT_SELF_ILLUM:
					case MAT_DECAL:
					case MAT_ADDITIVE:
					case MAT_WIRE:
					case MAT_FACEMAP:
					case MAT_XPFALLIN:
					case MAT_PHONGSOFT:
					case MAT_WIREABS:
					case MAT_USE_XPFALL:
					case MAT_USE_REFBLUR:
					case MAT_WIRESIZE:
						if(get_mtlchunk(stream,NULL)==0)
							return(0);
						break;
					case APP_DATA:
						if(get_mtlchunk(stream,&loadmtl->appdata)==0)
							return(0);
						break;
					default:
						skip_mtl_chunk:
						if(skip_chunk(stream)==0) {
							MtlError();
							return(0);
							}
						break;
					}
				chunk.size-=nxt.size;
				}
						
#ifdef DBGLDMLI
			if (dbgldmli)
					printf("  finished loading mtl %s, flags = %X\n",
						loadmtl->name, loadmtl->flags);
#endif
			/* convert old data formats to new */
			if (loadmtl->shading==REND_WIRE) {
				loadmtl->shading = REND_FLAT;
				loadmtl->flags |= MF_WIRE;
				loadmtl->flags |= MF_TWOSIDE;
				loadmtl->shininess=0;
				loadmtl->shin2pct=0;
				loadmtl->transparency=0;
				}

			if (loadmtl->xpfall<0.0) {
				loadmtl->flags|= MF_XPFALLIN;
				loadmtl->xpfall = -loadmtl->xpfall;
				}
			if (loadmtl->flags&MF_DECAL) {
				set_mtl_decal(loadmtl);
				loadmtl->flags &= ~MF_DECAL;
				}
			if (loadmtl->shin2pct==255) {
				float shin = (((float)(loadmtl->shininess))/100.0f);
				float atten = (float)sin(1.5707*shin);
				loadmtl->shin2pct = (int)((atten)*100.0f+0.5f);
				}

			break;

		case MAT_SXP_TEXT_DATA:  GET_SXP(Ntex,0); break;     
		case MAT_SXP_TEXT2_DATA: GET_SXP(Ntex2,0);  break;     
		case MAT_SXP_OPAC_DATA:  GET_SXP(Nopac,0);  break;
		case MAT_SXP_BUMP_DATA:  GET_SXP(Nbump,0);  break; 
		case MAT_SXP_SPEC_DATA:  GET_SXP(Nspec,0);  break;
		case MAT_SXP_SELFI_DATA: GET_SXP(Nselfi,0);  break;
		case MAT_SXP_SHIN_DATA:  GET_SXP(Nshin,0);  break;
	
		case MAT_SXP_TEXT_MASKDATA:  GET_SXP(Ntex,1);  break;     
		case MAT_SXP_TEXT2_MASKDATA: GET_SXP(Ntex2,1);  break;     
		case MAT_SXP_OPAC_MASKDATA:  GET_SXP(Nopac,1);  break;
		case MAT_SXP_BUMP_MASKDATA:  GET_SXP(Nbump,1);  break; 
		case MAT_SXP_SPEC_MASKDATA:  GET_SXP(Nspec,1);  break;
		case MAT_SXP_SELFI_MASKDATA: GET_SXP(Nselfi,1);  break;
		case MAT_SXP_SHIN_MASKDATA:  GET_SXP(Nshin,1);  break;
		case MAT_SXP_REFL_MASKDATA:  GET_SXP(Nrefl,1);  break;

		case MAT_TEXMAP:   GET_MAP(Ntex);  break;     
		case MAT_TEX2MAP:  GET_MAP(Ntex2);  break;     
		case MAT_OPACMAP:  GET_MAP(Nopac);  break;     
		case MAT_BUMPMAP:  GET_MAP(Nbump);  break;     
		case MAT_SPECMAP:  GET_MAP(Nspec);  break;     
		case MAT_SHINMAP:  GET_MAP(Nshin);  break;     
		case MAT_SELFIMAP: GET_MAP(Nselfi);  break;     
		case MAT_REFLMAP:  GET_MAP(Nrefl);  break;     

		case MAT_TEXMASK:   GET_MASK(Ntex);  break;     
		case MAT_TEX2MASK:  GET_MASK(Ntex2);  break;     
		case MAT_OPACMASK:  GET_MASK(Nopac);  break;     
		case MAT_BUMPMASK:  GET_MASK(Nbump);  break;     
		case MAT_SPECMASK:  GET_MASK(Nspec);  break;     
		case MAT_SHINMASK:  GET_MASK(Nshin);  break;     
		case MAT_SELFIMASK: GET_MASK(Nselfi);  break;     
		case MAT_REFLMASK:  GET_MASK(Nrefl);  break;     

		case MAT_AMBIENT:
		case MAT_DIFFUSE:
		case MAT_SPECULAR:
			{
			int got_lin,got_gam;
			got_lin = got_gam = 0;
			while(chunk.size)
				{
				if(get_next_chunk(stream,&nxt)==0)
					return(0);
				nexttag=nxt.tag;
				switch(nexttag)	{
					case COLOR_F:
					case COLOR_24:
						got_gam = 1;
						if(get_mtlchunk(stream,NULL)==0) return(0);
						break;     
					case LIN_COLOR_24:
						got_lin = 1;
						if(get_mtlchunk(stream,NULL)==0)	return(0);
						break;     
					default:
						if(skip_chunk(stream)==0) {
							MtlError();
							return(0);
							}
						break;
					}
				chunk.size-=nxt.size;
				}
			if (got_lin) {
				memcpy((char *)data,(char *)&LC24,sizeof(Color_24));
				}
			else { 
				if (!got_gam) {
					MtlError();
					return(0);
					}
				if (gammaMgr.enable) {
					Color_24 gc;
					gc.r = gammaMgr.file_in_degamtab[C24.r]>>8;
					gc.g = gammaMgr.file_in_degamtab[C24.g]>>8;
					gc.b = gammaMgr.file_in_degamtab[C24.b]>>8;
					memcpy((char *)data,(char *)&gc,sizeof(Color_24));
					}
				else { 
					memcpy((char *)data,(char *)&C24,sizeof(Color_24));
					}
				}
			}
Beispiel #6
0
/*
 * Complete the reading of the status byte. The parsed midi
 * command will be added to the specified track .
 * 
 *  Arguments:
 *    msp       - Current midi file status
 *    track     - Current track
 *    status    - Status byte, ie. current command
 */
static void 
handle_status(struct midistate *msp, struct trackElement *track, int status)
{
	int  ch;
	int  type;
	int  device;
	int  length;
	short note, vel, control;
	int  val;
	unsigned char *data;
	struct element *el;

	ch = status & 0x0f;
	type = status & 0xf0;

	/*
	 * Do not set the device if the type is 0xf0 as these commands are
	 * not channel specific
	 */
	device = 0;
	if (type != 0xf0)
		device = (msp->port<<4) + ch;
	msp->device = device;

	el = NULL;

	switch (type) {	
	case MIDI_NOTE_OFF:
		note = read_int(msp, 1);
		vel = read_int(msp, 1);

		finish_note(msp, note, vel);
		break;

	case MIDI_NOTE_ON:
		note = read_int(msp, 1);
		vel = read_int(msp, 1);

		if (vel == 0) {
			/* This is really a note off */
			finish_note(msp, note, vel);
		} else {
			/* Save the start, so it can be matched with the note off */
			el = save_note(msp, note, vel);
		}
		break;

	case MIDI_KEY_AFTERTOUCH:
		note = read_int(msp, 1);
		vel = read_int(msp, 1);

		/* new aftertouchElement */
		el = MD_ELEMENT(md_keytouch_new(note, vel));
		break;

	case MIDI_CONTROLER:
		control = read_int(msp, 1);
		val = read_int(msp, 1);
		el = MD_ELEMENT(md_control_new(control, val));

		break;
	
	case MIDI_PATCH:
		val = read_int(msp, 1);
		el = MD_ELEMENT(md_program_new(val));
		break;

	case MIDI_CHANNEL_AFTERTOUCH:
		val = read_int(msp, 1);
		el = MD_ELEMENT(md_pressure_new(val));
		break;
	case MIDI_PITCH_WHEEL:
    {
		val = read_int(msp, 1);
        int val2 = read_int(msp, 1);
		val |=  val2 << 7;
		val -= 0x2000;	/* Center it around zero */
		el = MD_ELEMENT(md_pitch_new(val));
		break;
    }
	/* Now for all the non-channel specific ones */
	case 0xf0:
		/* Deal with the end of track event first */
		if (ch == 0x0f) {
			type = read_int(msp, 1);
			if (type == 0x2f) {
				/* End of track - skip to end of real track */
				track->final_time = msp->current_time;
				skip_chunk(msp);
				return;
			}
		}

		/* Get the length of the following data */
		length = read_var(msp);
		data = read_data(msp, length);
		if (ch == 0x0f) {
			el = (struct element *)handle_meta(msp, type, data);
		} else {
			el = (struct element *)md_sysex_new(status, data, length);
		}
		break;
	default:
		except(formatError, "Bad status type 0x%x", type);
		/*NOTREACHED*/
	}

	if (el != NULL) {
		el->element_time = msp->current_time;
		el->device_channel = device;

		md_add(MD_CONTAINER(track), el);
	}
}