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; }
/************* * 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; }