/* ================ idCollisionModelManagerLocal::WritePolygons ================ */ void idCollisionModelManagerLocal::WritePolygons( idFile* fp, cm_node_t* node ) { cm_polygonRef_t* pref; cm_polygon_t* p; int i; for( pref = node->polygons; pref; pref = pref->next ) { p = pref->p; if( p->checkcount == checkCount ) { continue; } p->checkcount = checkCount; fp->WriteFloatString( "\t%d (", p->numEdges ); for( i = 0; i < p->numEdges; i++ ) { fp->WriteFloatString( " %d", p->edges[i] ); } fp->WriteFloatString( " ) ( %f %f %f ) %f", p->plane.Normal()[0], p->plane.Normal()[1], p->plane.Normal()[2], p->plane.Dist() ); fp->WriteFloatString( " ( %f %f %f )", p->bounds[0][0], p->bounds[0][1], p->bounds[0][2] ); fp->WriteFloatString( " ( %f %f %f )", p->bounds[1][0], p->bounds[1][1], p->bounds[1][2] ); fp->WriteFloatString( " \"%s\"\n", p->material->GetName() ); } if( node->planeType != -1 ) { WritePolygons( fp, node->children[0] ); WritePolygons( fp, node->children[1] ); } }
/* ================ idCollisionModelManagerLocal::WriteCollisionModel ================ */ void idCollisionModelManagerLocal::WriteCollisionModel( idFile *fp, cm_model_t *model ) { int i, polygonMemory, brushMemory; fp->WriteFloatString( "collisionModel \"%s\" {\n", model->name.c_str() ); // vertices fp->WriteFloatString( "\tvertices { /* numVertices = */ %d\n", model->numVertices ); for( i = 0; i < model->numVertices; i++ ) { fp->WriteFloatString( "\t/* %d */ (%f %f %f)\n", i, model->vertices[i].p[0], model->vertices[i].p[1], model->vertices[i].p[2] ); } fp->WriteFloatString( "\t}\n" ); // edges fp->WriteFloatString( "\tedges { /* numEdges = */ %d\n", model->numEdges ); for( i = 0; i < model->numEdges; i++ ) { fp->WriteFloatString( "\t/* %d */ (%d %d) %d %d\n", i, model->edges[i].vertexNum[0], model->edges[i].vertexNum[1], model->edges[i].internal, model->edges[i].numUsers ); } fp->WriteFloatString( "\t}\n" ); // nodes fp->WriteFloatString( "\tnodes {\n" ); WriteNodes( fp, model->node ); fp->WriteFloatString( "\t}\n" ); // polygons checkCount++; polygonMemory = CountPolygonMemory( model->node ); fp->WriteFloatString( "\tpolygons /* polygonMemory = */ %d {\n", polygonMemory ); checkCount++; WritePolygons( fp, model->node ); fp->WriteFloatString( "\t}\n" ); // brushes checkCount++; brushMemory = CountBrushMemory( model->node ); fp->WriteFloatString( "\tbrushes /* brushMemory = */ %d {\n", brushMemory ); checkCount++; WriteBrushes( fp, model->node ); fp->WriteFloatString( "\t}\n" ); // closing brace fp->WriteFloatString( "}\n" ); }
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; }