/*
================
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" );
}
Example #3
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;
}