fixed rotation
added paths
PHP Code:
<?php
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
ini_set( "memory_limit" , "500M" );
$name = "testmap"; //input filename
$scale = 35; //output scale
$snapToGrid = true; //this may distort the output!
$texture = "case"; //default texture
$version = "cod2"; //game version
switch( $version )
{
case "cod5":
$path = "G:\\Modding\\spiele\\cod5\\map_source\\SERTHYWARS\\";
break;
case "cod2":
$path = "X:\\MODDING\\COD2\\map_source\\";
break;
default:
$path = "X:\\MODDING\\COD2\\map_source\\";
break;
}
echo "Converting $name.obj!\n";
$objString = file_get_contents( $name . ".obj" );
$obj = parse_OBJ( $objString );
$map = export_OBJ2MAP( $obj , $scale , $snapToGrid , $texture , $version );
file_put_contents( "$path$name.map" , $map );
echo "Converting done!\n";
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
function parse_OBJ( $mapSourceString )
{
$obj = array();
$obj["faces"] = array();
$obj["verts"] = array();
$lines = explode( "\n" , $mapSourceString );
foreach( $lines as $line )
{
$temp = explode( " " , $line );
$val = $temp[0];
switch( $val )
{
case "#": //skip the unwanted elements like
case "usemtl": //bezier curves, splines, groubs, objects,
case "mtllib": //materials, vertexnormals, vertextestures etc
case "s": //to stay as easy as possible
case "vt":
case "vn":
case "o":
break;
case "v": //plain vertex: v xCoord yCoord zCoord weight
//strip only the 3 worldcoords
//keep the order to get the globalVertexIndex later on!
//this code ignores the lokalVertexIndex
$obj["verts"][] = array_slice( $temp , 1 , 3 );
break;
case "f": //plain face: f globalVertIndex1/globalVertParamIndex1/globalVertNormalIndex1
//this discribes 1 vertex with the globalVertexIndex of the siad vertex
//if the globalVertexIndex is negative it will use the lokalVertexIndex! (not used here)
$temp = array_slice( $temp , 1 , 3 );
//strip the elements and leave the globalVertexIndex
foreach( $temp as $key => $val )
{
$val = explode( "/" , $val );
$temp[$key] = $val[0];
}
$obj["faces"][] = $temp;
break;
}
}
return $obj;
}
function export_OBJ2MAP( $obj , $scale = 1 , $snapToGrid = true , $texture = "case" , $version = "cod2" )
{
$map = "";
$map .= "iwmap 4\n";
if( $version == "cod5" || $version == "cod4" )
{
$map .= "\"000_Global\" flags active\n";
$map .= "\"The Map\" flags\n";
}
$map .= "{\n";
$map .= "\t\"classname\" \"worldspawn\"\n";
foreach( $obj["faces"] as $face )
{
$vertStrArray = array();
foreach( $face as $vertIndex )
{
$vertIndex = (int)$vertIndex - 1;
if( $vertIndex < 0 || !isset( $obj["verts"][$vertIndex] ) || count( $obj["verts"][$vertIndex] ) != 3 )
break;
$vert = $obj["verts"][$vertIndex];
for( $c = 0 ; $c < 3 ; $c++ )
{
$coord = (float)$vert[$c] * $scale;
if( $snapToGrid )
$coord = round( $coord );
$vert[$c] = $coord;
}
$vertStrArray[] = "v $vert[0] $vert[2] $vert[1] t -1600 -1600 -0.625 0.625\n";
}
if( count( $vertStrArray ) != 3 ) //this code handles only trinagles!
continue; //so your *.obj file should consists out of them!
$faceStr = "";
$faceStr .= "\t{\n";
$faceStr .= "\t\tmesh\n";
$faceStr .= "\t\t{\n";
$faceStr .= "\t\t\ttoolFlags splitGeo;\n";
$faceStr .= "\t\t\t$texture\n";
$faceStr .= "\t\t\tlightmap_gray\n";
$faceStr .= "\t\t\t2 2 16 8\n";
$faceStr .= "\t\t\t(\n";
$faceStr .= "\t\t\t\t$vertStrArray[0]"; //play with the indexes here
$faceStr .= "\t\t\t\t$vertStrArray[0]"; //there must be 3 uniques (0,1,2)
$faceStr .= "\t\t\t)\n";
$faceStr .= "\t\t\t(\n";
$faceStr .= "\t\t\t\t$vertStrArray[1]"; //and one duplicate > quad to triangle!
$faceStr .= "\t\t\t\t$vertStrArray[2]"; //this is the best for me right now
$faceStr .= "\t\t\t)\n";
$faceStr .= "\t\t}\n";
$faceStr .= "\t}\n";
$map .= $faceStr;
}
$map .= "}\n";
return $map;
}
to get the best & rly fast texture results:
set $version to cod5
convert
open it in codwawRadiant
select all [i]
invert meshes [shift+i]
hit a texture
bring up the surface inspector [s]
hit [LMAP]