Results 1 to 8 of 8

Thread: OBJ2Map [mesh-wise]

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #5
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    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 );
                                    
                    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 );
                    
                    
    //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 $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 || !isset( $obj["verts"][$vertIndex] ) || count$obj["verts"][$vertIndex] ) != )
                    break;
            
                
    $vert $obj["verts"][$vertIndex];
                
                for( 
    $c $c $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 ) != )            //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]
    Last edited by serthy; 17th December 2012 at 13:02.

  2. The Following User Says Thank You to serthy For This Useful Post:

    kung foo man (17th December 2012)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •