예제 #1
0
bool CLwoWriter::Write()
{
	OBJ_ASSERT(m_pLwoFile);
	if(!m_pLwoFile)
		return false;

	std::string fileName(m_fileName.string()); // Extract native file path string

	m_ofs.open(fileName.c_str(), ios::out | ios::binary | std::ios::trunc);

	MSG_INFO("Writing LWO file : '" << fileName << "'.");
	if( !m_ofs.is_open() )
	{
		MSG_ERROR("Couldn't write to .LWO file '" << fileName << "'");
		return false;
	}

	// TODO iterate through layers here:
	m_curLayer = m_pLwoFile->GetLayerVector()[0]; // first layer

	// Build the chunk lengths
	BuildChunkLengths();

	// Write the LWO file header
	WriteHeader();

	{
		// Write TAGS strings
		WriteTagStrings();

		// Write LAYR : Support for only one layer
		WriteLayer();

		// Write PNTS
		WritePoints();

		// Write VMAP | TXUV
		WriteVertexMapping();

		// Write POLS | FACE
		WritePolygons();

		// Write PTAG
		WritePolygonTagMapping();

		// Write VMAD | TXUV
		WriteDiscVertexMapping();

		// Write CLIP
		WriteImageDefinitions();

		// Write SURF
		WriteSurfaces();
	}

	MSG_DEBUG("Done.");

	// Close file
	m_ofs.close();

	return true;
}
예제 #2
0
/*************
 * 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;
}