コード例 #1
0
ファイル: lwob.cpp プロジェクト: Kalamatee/RayStorm
/*************
 * FUNCTION:      OpenIFF
 * DESCRIPTION:   open iff file and parse to begin of file
 * INPUT:         iff      iff handle
 *                filename name of file
 *                filesize   size of file is returned in this variable
 * OUTPUT:        error string
 *************/
static char *OpenIFF(struct IFFHandle **iff, char *filename, ULONG *filesize)
{
	struct ContextNode *cn;

	// Allocate IFF_File structure.
	*iff = AllocIFF();
	if(!*iff)
		return errors[ERR_MEM];

#ifdef __AMIGA__
	// Set up IFF_File for AmigaDOS I/O.
	(*iff)->iff_Stream = Open(filename, MODE_OLDFILE);
#else
	(*iff)->iff_Stream = Open_(filename, MODE_OLDFILE);
#endif
	if(!(*iff)->iff_Stream)
		return errors[ERR_OPENFILE];

	InitIFFasDOS(*iff);

	// Start the IFF transaction.
	if(OpenIFF(*iff, IFFF_READ))
		return errors[ERR_LWOBFILE];

	if(ParseIFF(*iff, IFFPARSE_RAWSTEP))
		return errors[ERR_LWOBFILE];

	cn = CurrentChunk(*iff);
	if((cn->cn_ID != ID_FORM) || (cn->cn_Type != ID_LWOB))
		return errors[ERR_LWOBFILE];

	*filesize = cn->cn_Size;

	return NULL;
}
コード例 #2
0
ファイル: surface.cpp プロジェクト: Kalamatee/RayStorm
/*************
 * DESCRIPTION:   save a surface definition
 * INPUT:         filename    name of surface file
 * OUTPUT:        error string or NULL if all ok
 *************/
char *SURFACE::Save(char *filename)
{
	struct IFFHandle *iff;

	// Allocate IFF_File structure.
	iff = AllocIFF();
	if(!iff)
		return errors[ERR_MEM];

	// Set up IFF_File for AmigaDOS I/O.
#ifdef __AMIGA__
	iff->iff_Stream = Open(filename, MODE_NEWFILE);
#else
	iff->iff_Stream = Open_(filename, MODE_NEWFILE);
#endif
	if(!iff->iff_Stream)
	{
		IFFCleanup(iff);
		return errors[ERR_OPEN];
	}
	InitIFFasDOS(iff);

	// Start the IFF transaction.
	if(OpenIFF(iff, IFFF_WRITE))
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}

	PUSH_CHUNK(ID_RMAT);

	// write surface
	Write(iff);

	IFFCleanup(iff);
	return NULL;
}
コード例 #3
0
ファイル: surface.cpp プロジェクト: Kalamatee/RayStorm
/*************
 * DESCRIPTION:   load a surface definition
 * INPUT:         filename    name of surface file
 * OUTPUT:        error string or NULL if all ok
 *************/
char *SURFACE::Load(char *filename)
{
	long error = 0;
	struct IFFHandle *iff;
	struct ContextNode *cn;

	iff = AllocIFF();
	if (!iff)
		return errors[ERR_MEM];

#ifdef __AMIGA__
	iff->iff_Stream = Open(filename, MODE_OLDFILE);
#else
	iff->iff_Stream = Open_(filename, MODE_OLDFILE);
#endif
	if (!(iff->iff_Stream))
	{
		IFFCleanup(iff);
		return errors[ERR_OPEN];
	}

	InitIFFasDOS(iff);
	error = OpenIFF(iff, IFFF_READ);
	if (error)
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}

	error = ParseIFF(iff, IFFPARSE_RAWSTEP);
	if (error)
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}
	cn = CurrentChunk(iff);
	if(!cn)
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}
	if((cn->cn_ID != ID_FORM) || (cn->cn_Type != ID_RMAT))
	{
		IFFCleanup(iff);
		return errors[ERR_NORMATFILE];
	}

	while(!error || error == IFFERR_EOC)
	{
		error = ParseIFF(iff, IFFPARSE_RAWSTEP);
		if(error != IFFERR_EOC)
		{
			// Get a pointer to the context node describing the current context
			cn = CurrentChunk(iff);
			if (cn)
			{
				switch (cn->cn_ID)
				{
					case ID_FORM:
						switch(cn->cn_Type)
						{
							case ID_SURF:
								if(!Read(iff, NULL))
								{
									IFFCleanup(iff);
									return errors[ERR_RMATCORRUPT];
								}
								break;
						}
						break;
				}
			}
		}
	}
	if (error != IFFERR_EOF)
	{
		return errors[ERR_IFFPARSE];
	}

	IFFCleanup(iff);

	return NULL;
}
コード例 #4
0
ファイル: mock_file_provider.hpp プロジェクト: rengeln/spire
 virtual std::unique_ptr<File> Open(const char* str)
 {
     return std::unique_ptr<File>(Open_(str));
 }
コード例 #5
0
ファイル: project.cpp プロジェクト: Kalamatee/RayStorm
char *PROJECT::Load(char *filename, DISPLAY *disp)
{
	long error = 0;
	struct IFFHandle *iff;
	struct ContextNode *cn;
	char *err;
	OBJECT *where = NULL;
	int dir = INSERT_HORIZ;

	// there is currently no active camera read
	camera[0] = 0;

	iff = AllocIFF();
	if (!iff)
		return errors[ERR_MEM];

#ifdef __AMIGA__
	iff->iff_Stream = Open(filename, MODE_OLDFILE);
#else
	iff->iff_Stream = Open_(filename, MODE_OLDFILE);
#endif
	if (!(iff->iff_Stream))
	{
		IFFCleanup(iff);
		return errors[ERR_OPEN];
	}

	InitIFFasDOS(iff);
	error = OpenIFF(iff, IFFF_READ);
	if (error)
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}

	error = ParseIFF(iff, IFFPARSE_RAWSTEP);
	if (error)
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}
	cn = CurrentChunk(iff);
	if(!cn)
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}
	if((cn->cn_ID != ID_FORM) || (cn->cn_Type != ID_RSCN))
	{
		IFFCleanup(iff);
		return errors[ERR_NORSCNFILE];
	}

	while(!error || error == IFFERR_EOC)
	{
		error = ParseIFF(iff, IFFPARSE_RAWSTEP);
		if(error != IFFERR_EOC)
		{
			// Get a pointer to the context node describing the current context
			cn = CurrentChunk(iff);
			if (cn)
			{
				switch (cn->cn_ID)
				{
					case ID_VERS:
						if(!ReadULONG(iff,&rscn_version,1))
						{
							IFFCleanup(iff);
							return errors[ERR_RSCNFILE];
						}
						if(rscn_version > VERSION)
						{
							IFFCleanup(iff);
							return errors[ERR_WRONGVERS];
						}
						break;
					case ID_FORM:
						switch(cn->cn_Type)
						{
							case ID_GNRL:
								err = ParseGeneral(iff,disp);
								if(err)
								{
									IFFCleanup(iff);
									return err;
								}
								break;
							case ID_FRAM:
								err = ParseFrame(iff);
								if(err)
								{
									IFFCleanup(iff);
									return err;
								}
								break;
							case ID_SRFS:
								err = ParseSurfaces(iff);
								if(err)
								{
									IFFCleanup(iff);
									return err;
								}
								break;
							case ID_CAMR:
								where = ParseCamera(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_SPHR:
								where = ParseSphere(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_PLAN:
								where = ParsePlane(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_PLGT:
							case ID_SLGT:
							case ID_DLGT:
								where = ParseLight(iff, where, dir, cn->cn_Type);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_MESH:
								where = ParseMesh(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_EXTN:
								where = ParseExternal(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_BOX:
								where = ParseBox(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_CYLR:
								where = ParseCylinder(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_CONE:
								where = ParseCone(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_CSG:
								where = ParseCSG(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_SOR:
								where = ParseSOR(iff, where, dir);
								if(!where)
								{
									IFFCleanup(iff);
									return errors[ERR_RSCNFILE];
								}
								dir = INSERT_HORIZ;
								break;
							case ID_HIER:
								dir = INSERT_VERT;
								break;
						}
						break;
				}
			}
		}
		else
		{
			cn = CurrentChunk(iff);
			if (cn)
			{
				if((cn->cn_ID == ID_FORM) && (cn->cn_Type == ID_HIER))
				{
					if(dir == INSERT_HORIZ)
					{
						while(where->GetPrev())
							where = (OBJECT*)where->GetPrev();
						if(where->GoUp())
							where = (OBJECT*)where->GoUp();
					}
					else
						dir = INSERT_HORIZ;
				}
			}
		}
	}
	if (error != IFFERR_EOF)
	{
		return errors[ERR_IFFPARSE];
	}

	IFFCleanup(iff);

	// we have to set the active camera
	disp->camera = (CAMERA*)GetObjectByName(camera);
	if(!disp->camera)
		err = errors[ERR_NOCAMERA];
	else
		err = NULL;

	// and translate track names to track objects
	// and the surface names to surface pointers
	TranslateNames();

	return err;
}
コード例 #6
0
ファイル: project.cpp プロジェクト: Kalamatee/RayStorm
/*************
 * DESCRIPTION:   save the current project to disk
 * INPUT:         project     projectname (the project is saved to a
 *    directory with this name)
 *                disp        current display
 * OUTPUT:        error string if failed, else NULL;
 *************/
char *PROJECT::Save(char *filename, DISPLAY *disp)
{
	struct IFFHandle *iff;
	ULONG data[2];
	float fdata[2];
	UBYTE ubdata;
	VIEW *view = disp->view;
	OBSERVER obsv;
	int i;

	// Allocate IFF_File structure.
	iff = AllocIFF();
	if(!iff)
		return errors[ERR_MEM];

	// Set up IFF_File for AmigaDOS I/O.
#ifdef __AMIGA__
	iff->iff_Stream = Open(filename, MODE_NEWFILE);
#else
	iff->iff_Stream = Open_(filename, MODE_NEWFILE);
#endif
	if(!iff->iff_Stream)
	{
		IFFCleanup(iff);
		return errors[ERR_OPEN];
	}
	InitIFFasDOS(iff);

	// Start the IFF transaction.
	if(OpenIFF(iff, IFFF_WRITE))
	{
		IFFCleanup(iff);
		return errors[ERR_IFFPARSE];
	}

	PUSH_CHUNK(ID_RSCN);

	data[0] = VERSION;

	WRITE_LONG_CHUNK(ID_VERS, data, 1);

	PUSH_CHUNK(ID_GNRL);
	data[0] = global.xres;
	data[1] = global.yres;

	WRITE_LONG_CHUNK(ID_RESO, data, 2);

	if(global.renderdpic)
		WRITE_CHUNK(ID_PICT, global.renderdpic, strlen(global.renderdpic)+1);

	if(global.picformat)
		WRITE_CHUNK(ID_PTYP, global.picformat, strlen(global.picformat)+1);

	ubdata = disp->display;
	WRITE_CHUNK(ID_DISP, &ubdata, sizeof(UBYTE));
	// changed with v2.1: no longer current viewmode, now current view number
	for(i=0; i<4; i++)
	{
		if(disp->views[i] == disp->view)
		{
			ubdata = i;
			WRITE_CHUNK(ID_VIEW, &ubdata, sizeof(UBYTE));
		}
	}
	WRITE_LONG_CHUNK(ID_GRID, &disp->gridsize, 1);
	data[0] = 0;
	if(disp->grid)
		data[0] |= RSCN_GENERAL_GRID;
	if(disp->gridsnap)
		data[0] |= RSCN_GENERAL_GRIDSNAP;
	if(disp->multiview)
		data[0] |= RSCN_GENERAL_VIEWFOUR;
	if(global.show)
		data[0] |= RSCN_GENERAL_SHOW;
	if(global.enablearea)
		data[0] |= RSCN_GENERAL_ENABLEAREA;
	if(global.enableback)
		data[0] |= RSCN_GENERAL_ENABLEBACK;
	if(global.enablerefl)
		data[0] |= RSCN_GENERAL_ENABLEREFL;
	WRITE_LONG_CHUNK(ID_FLGS, data, 1);

	// write views
	for(i=0; i<4; i++)
	{
		obsv.vpos = disp->views[i]->vpos;
		obsv.valign = disp->views[i]->valign;
		obsv.dist = disp->views[i]->dist;
		obsv.viewpoint = disp->views[i]->viewpoint;
		obsv.zoom = disp->views[i]->zoom;
		obsv.viewmode = disp->views[i]->viewmode;
		WRITE_LONG_CHUNK(ID_OBSV, &obsv, 12);
	}
	WRITE_LONG_CHUNK(ID_FILT, &disp->filter_flags, 1);

	WRITE_LONG_CHUNK(ID_FLEN, &global.flen, 1);
	WRITE_LONG_CHUNK(ID_FHGT, &global.fheight, 1);
	WRITE_LONG_CHUNK(ID_FCOL, &global.fog, 3);
	WRITE_LONG_CHUNK(ID_FILD, &global.xmin, 4);
	WRITE_LONG_CHUNK(ID_HSAM, &global.hyper_samples, 4);
	WRITE_LONG_CHUNK(ID_HMIN, &global.hyper_min_dens, 4);
	WRITE_LONG_CHUNK(ID_HMAX, &global.hyper_max_dens, 4);

	POP_CHUNK();

	PUSH_CHUNK(ID_SRFS);

	WriteSurfaces(iff);

	POP_CHUNK();

	PUSH_CHUNK(ID_FRAM);

	fdata[0] = 0.;
	fdata[1] = 0.;
	WRITE_LONG_CHUNK(ID_TIME, fdata, 2);

	data[0] = 0;
	if(global.quick)
		data[0] |= RSCN_FRAME_QUICK;
	if(global.randjit)
		data[0] |= RSCN_FRAME_RANDJIT;
	WRITE_LONG_CHUNK(ID_FLGS, data, 1);

	WRITE_CHUNK(ID_CAMR, disp->camera->GetName(), strlen(disp->camera->GetName())+1);

	WRITE_LONG_CHUNK(ID_AMBT, &global.ambient, 3);

	WRITE_LONG_CHUNK(ID_ANTC, &global.anticont, 3);

	WRITE_LONG_CHUNK(ID_ANTS, &global.antialias, 1);

	WRITE_LONG_CHUNK(ID_BCKC, &global.backcol, 3);

	WRITE_LONG_CHUNK(ID_MOBJ, &global.minobjects, 1);

	if(global.backpic)
		WRITE_CHUNK(ID_BCKP, global.backpic, strlen(global.backpic)+1);

	if(global.reflmap)
		WRITE_CHUNK(ID_REFM, global.reflmap, strlen(global.reflmap)+1);

	ubdata = global.softshad;
	WRITE_CHUNK(ID_SOFT, &ubdata, sizeof(UBYTE));

	ubdata = global.distrib;
	WRITE_CHUNK(ID_MBLR, &ubdata, sizeof(UBYTE));

	ubdata = global.octreedepth;
	WRITE_CHUNK(ID_ODPT, &ubdata, sizeof(UBYTE));

	POP_CHUNK();

	WriteObjects(iff,FALSE);

	POP_CHUNK();

	IFFCleanup(iff);
	return NULL;
}