= $brk/2) $res = $res-$brk; } return ($res); } function FlagStuff ($Rwx, $Flags) { if ($Flags & 0x01) gzwrite ($Rwx, "TextureModes Lit Foreshorten\n"); else gzwrite ($Rwx, "TextureModes Foreshorten\n"); $Opacity = 1.0; if ($Flags & 0x02) $Opacity -= 0.25; if ($Flags & 0x04) $Opacity -= 0.5; if ($Flags & 0x06) gzwrite ($Rwx, sprintf ("Opacity %f\n", $Opacity)); if ($Flags & 0x08) define ("TAGVAL", " tag 100\n"); else define ("TAGVAL", " tag 200\n"); gzwrite ($Rwx, "Color .2 .1 .4\n"); gzwrite ($Rwx, "Surface .5 .3 0\n"); } function Box ($Name, $WrkDir) { $GZName = tempnam ($WrkDir, 'qu'); $Rwx = gzopen ("$GZName", 'wb9'); $x = ArgInt ($Name, 2, 2, TRUE)/200.0; $y = ArgInt ($Name, 4, 2, TRUE)/100.0; $z = ArgInt ($Name, 6, 2, TRUE)/200.0; $u = ArgInt ($Name, 8, 2); $v = ArgInt ($Name, 10, 2); $rx = ArgInt ($Name, 12, 2); $rz = ArgInt ($Name, 14, 2); $l = ArgInt ($Name, 16, 1); gzwrite ($Rwx, "modelbegin\nclumpbegin\n"); if ($rx!=0) { if ($rz == $rx) { gzwrite ($Rwx, sprintf ("rotate 1 0 1 %d\n", $rx)); $rz = 0; } else gzwrite ($Rwx, sprintf ("rotate 1 0 0 %d\n", $rx)); } if ($rz!=0) gzwrite ($Rwx, sprintf ("rotate 0 0 1 %d\n", $rz)); gzwrite ($Rwx, sprintf ("Vertex %f 0 %f uv %d %d\n", -$x, -$z, $u, $v)); gzwrite ($Rwx, sprintf ("Vertex %f %f %f uv %d 0\n", -$x, $y, -$z, $u )); gzwrite ($Rwx, sprintf ("Vertex %f %f %f uv 0 0\n", $x, $y, -$z )); gzwrite ($Rwx, sprintf ("Vertex %f 0 %f uv 0 %d\n", $x, -$z, $v)); gzwrite ($Rwx, sprintf ("Vertex %f 0 %f uv %d %d\n", $x, $z, $u, $v)); gzwrite ($Rwx, sprintf ("Vertex %f %f %f uv %d 0\n", $x, $y, $z, $u )); gzwrite ($Rwx, sprintf ("Vertex %f %f %f uv 0 0\n", -$x, $y, $z )); gzwrite ($Rwx, sprintf ("Vertex %f 0 %f uv 0 %d\n", -$x, $z, $v)); FlagStuff ($Rwx, $l); gzwrite ($Rwx, 'Quad 1 2 3 4'.TAGVAL); gzwrite ($Rwx, 'Quad 5 6 7 8'.TAGVAL); gzwrite ($Rwx, 'Quad 2 1 8 7'.TAGVAL); gzwrite ($Rwx, 'Quad 6 5 4 3'.TAGVAL); gzwrite ($Rwx, 'Quad 3 2 7 6'.TAGVAL); gzwrite ($Rwx, 'Quad 1 4 5 8'.TAGVAL); gzwrite ($Rwx, "clumpend\nmodelend\n"); gzclose ($Rwx); $Filesize = filesize ($GZName); Header ('Content-Length: '.$Filesize); if ($Rwx = fopen ($GZName, "rb")) fpassthru ($Rwx); # no fclose, fpassthru() closes the file unlink ($GZName); } function Quad ($Name, $WrkDir) { $GZName = tempnam ($WrkDir, 'qu'); $Rwx = gzopen ("$GZName", 'wb9'); $x = ArgInt ($Name, 2, 2, TRUE)/200.0; $y = ArgInt ($Name, 4, 2, TRUE)/100.0; $u = ArgInt ($Name, 6, 2); $v = ArgInt ($Name, 8, 2); $r = ArgInt ($Name, 10, 2); $l = ArgInt ($Name, 12, 1); gzwrite ($Rwx, "modelbegin\nclumpbegin\n"); if ($r>0) gzwrite ($Rwx, sprintf ("Rotate 1 0 0 %d\n", $r)); gzwrite ($Rwx, sprintf ("Vertex %f %f 0 uv 0 0\n", -$x, $y )); gzwrite ($Rwx, sprintf ("Vertex %f %f 0 uv %d 0\n", $x, $y, $u )); gzwrite ($Rwx, sprintf ("Vertex %f 0 0 uv %d %d\n", $x, $u, $v)); gzwrite ($Rwx, sprintf ("Vertex %f 0 0 uv 0 %d\n", -$x, $v)); FlagStuff ($Rwx, $l); gzwrite ($Rwx, 'Quad 4 3 2 1'.TAGVAL); gzwrite ($Rwx, 'Quad 1 2 3 4'.TAGVAL); gzwrite ($Rwx, "clumpend\nmodelend\n"); gzclose ($Rwx); $Filesize = filesize ($GZName); Header ('Content-Length: '.$Filesize); if ($Rwx = fopen ($GZName, "rb")) fpassthru ($Rwx); # no fclose, fpassthru() closes the file unlink ($GZName); } function Disc ($Name, $WrkDir) { $GZName = tempnam ($WrkDir, 'di'); $Rwx = gzopen ("$GZName", 'wb9'); $x = ArgInt ($Name, 2, 2, TRUE)/100.0; $y = ArgInt ($Name, 4, 2, TRUE)/100.0; $u = ArgInt ($Name, 6, 2); $v = ArgInt ($Name, 8, 2); $r = ArgInt ($Name, 10, 2); $l = ArgInt ($Name, 12, 1); $anz = ArgInt ($Name, 13, 1); gzwrite ($Rwx, "modelbegin\nclumpbegin\n"); if ($r>0) gzwrite ($Rwx, sprintf ("Rotate 1 0 0 %d\n", $r)); $p = pi() / $anz * 2; $f = 0.0; for ($i=0; $i<$anz; $i++) { $ix = sin($f); $iy = cos($f); gzwrite ($Rwx, sprintf ("Vertex %f %f 0 uv %f %f\n", $ix*$x, $iy*$y, ($ix/2+.5)*$u, (-$iy/2+.5)*$v)); $f += $p; } FlagStuff ($Rwx, $l); gzwrite ($Rwx, "AddMaterialMode Double\n"); gzwrite ($Rwx, sprintf ("Polygon %d", $anz)); for ($i=0; $i<$anz; $i++) gzwrite ($Rwx, sprintf (" %d", $i+1)); gzwrite ($Rwx, TAGVAL); gzwrite ($Rwx, "clumpend\nmodelend\n"); gzclose ($Rwx); $Filesize = filesize ($GZName); Header ('Content-Length: '.$Filesize); if ($Rwx = fopen ($GZName, "rb")) fpassthru ($Rwx); # no fclose, fpassthru() closes the file unlink ($GZName); } function Tube ($Name, $WrkDir) { $GZName = tempnam ($WrkDir, 'tu'); $Rwx = gzopen ("$GZName", 'wb9'); $x = ArgInt ($Name, 2, 2, TRUE)/100.0; $y = ArgInt ($Name, 4, 2, TRUE)/100.0; $h = ArgInt ($Name, 6, 2, TRUE)/100.0; $u = ArgInt ($Name, 8, 2); $v = ArgInt ($Name, 10, 2); $r = ArgInt ($Name, 12, 2); $l = ArgInt ($Name, 14, 1); $anz = ArgInt ($Name, 15, 1); gzwrite ($Rwx, "modelbegin\nclumpbegin\n"); if ($r>0) gzwrite ($Rwx, sprintf ("Rotate 1 0 0 %d\n", $r)); $p = pi() / $anz * 2; $f = 0.0; $iu = $u; $u /= $anz; for ($i=0; $i<$anz+1; $i++) { $ix = sin($f); $iy = cos($f); gzwrite ($Rwx, sprintf ("Vertex %f %f 0 UV %f %f\n", $ix*$x, $iy*$y, $iu, $v)); gzwrite ($Rwx, sprintf ("Vertex %f %f %f UV %f 0\n", $ix*$x, $iy*$y, $h, $iu)); $f += $p; $iu -= $u; } FlagStuff ($Rwx, $l); gzwrite ($Rwx, "AddMaterialMode Double\n"); $anz *= 2; for ($i=0; $i<$anz; $i+= 2) gzwrite ($Rwx, sprintf ('Quad %d %d %d %d'.TAGVAL, $i+1, $i+2, $i+4, $i+3)); gzwrite ($Rwx, "clumpend\nmodelend\n"); gzclose ($Rwx); $Filesize = filesize ($GZName); Header ("Content-Length: ".$Filesize); if ($Rwx = fopen ($GZName, 'rb')) fpassthru ($Rwx); # no fclose, fpassthru() closes the file unlink ($GZName); } function Pyramid ($Name, $WrkDir) { $GZName = tempnam ($WrkDir, 'py'); $Rwx = gzopen ("$GZName", 'wb9'); $x = ArgInt ($Name, 2, 2, TRUE)/100.0; $y = ArgInt ($Name, 4, 2, TRUE)/100.0; $h = ArgInt ($Name, 6, 2, TRUE)/100.0; $u = ArgInt ($Name, 8, 2); $v = ArgInt ($Name, 10, 2); $r = ArgInt ($Name, 12, 2); $l = ArgInt ($Name, 14, 1); $anz = ArgInt ($Name, 15, 1); gzwrite ($Rwx, "modelbegin\nclumpbegin\n"); if ($r>0) gzwrite ($Rwx, sprintf ("Rotate 1 0 0 %d\n", $r)); $p = pi() / $anz * 2; $f = 0.0; $iu = 0.0; $u /= $anz; for ($i=0; $i<$anz+1; $i++) { $ix = sin($f); $iy = cos($f); gzwrite ($Rwx, sprintf ("Vertex %f 0 %f UV %f %f\n", $ix*$x, $iy*$y, $iu, $v)); gzwrite ($Rwx, sprintf ("Vertex 0 %f 0 UV %f 0\n", $h, $iu)); $f += $p; $iu += $u; } FlagStuff ($Rwx, $l); gzwrite ($Rwx, "AddMaterialMode Double\n"); gzwrite ($Rwx, sprintf ('Polygon %d', $anz)); $anz *= 2; for ($i=$anz-1; $i>0; $i -= 2) gzwrite ($Rwx, sprintf (' %d', $i)); gzwrite ($Rwx, TAGVAL); for ($i=0; $i<$anz; $i+= 2) gzwrite ($Rwx, sprintf ('Quad %d %d %d %d'.TAGVAL, $i+2, $i+1, $i+3, $i+4)); gzwrite ($Rwx, "clumpend\nmodelend\n"); gzclose ($Rwx); $Filesize = filesize ($GZName); Header ("Content-Length: ".$Filesize); if ($Rwx = fopen ($GZName, 'rb')) fpassthru ($Rwx); # no fclose, fpassthru() closes the file unlink ($GZName); } function Scale ($Name, $WrkDir, $PLocal, $UseTransform) { $x = ArgInt ($Name, 2, 2, TRUE)/10.0; $y = ArgInt ($Name, 4, 2, TRUE)/10.0; $z = ArgInt ($Name, 6, 2, TRUE)/10.0; $rx = ArgInt ($Name, 8, 2); $rz = ArgInt ($Name, 10, 2); if ($x == 0.0) $x = 1.0; if ($y == 0.0) $y = 1.0; if ($z == 0.0) $z = 1.0; $GZName = tempnam ($WrkDir, 'tu'); $Rwx = gzopen ("$GZName", 'wb9'); $Input = popen (UNZIP.' '.$PLocal.'/models/'.substr($Name, 12), "r"); $FirstClump = TRUE; $SecondClump = FALSE; $Found = FALSE; $HasTransform = FALSE; $Proto = 0; while (!feof($Input)) { $Line = ltrim(fgets ($Input, 1024)); gzwrite ($Rwx, $Line); if ($Found && !$HasTransform) continue; $Words = split ("[ \t]", rtrim($Line), 2); if (! strcasecmp ($Words[0], 'ProtoBegin')) $Proto++; else if (! strcasecmp ($Words[0], 'ProtoEnd')) $Proto--; if ($Proto != 0) continue; $Doit = FALSE; if (! $HasTransform) if (! strcasecmp ($Words[0], 'TransformBegin')) { $HasTransform = TRUE; continue; } if ($HasTransform) { if ($UseTransform) { if (! ($Doit = !strcasecmp ($Words[0], 'Transform'))) $Doit = !strcasecmp ($Words[0], 'Identity'); } else $Doit = !strcasecmp ($Words[0], 'ClumpBegin'); } else if ($FirstClump) { if ($Doit = ($SecondClump || !strcasecmp ($Words[0], 'ClumpBegin'))) { $FirstClump = FALSE; $SecondClump = TRUE; } } if ($Doit) { $SecondClump = FALSE; $Found = TRUE; if (! $HasTransform) if ( ($x!=1.0) || ($y!=1.0) || ($z!=1.0) ) gzwrite ($Rwx, sprintf ("scale %f %f %f\n", $x, $y, $z)); if ($rx!=0) { if ($rz == $rx) { gzwrite ($Rwx, sprintf ("rotate 1 0 1 %d\n", $rx)); $rz = 0; } else gzwrite ($Rwx, sprintf ("rotate 1 0 0 %d\n", $rx)); } if ($rz!=0) gzwrite ($Rwx, sprintf ("rotate 0 0 1 %d\n", $rz)); if ($HasTransform) if ( ($x!=1.0) || ($y!=1.0) || ($z!=1.0) ) gzwrite ($Rwx, sprintf ("scale %f %f %f\n", $x, $y, $z)); } } # read loop gzclose ($Rwx); pclose ($Input); if ($Found || $HasTransform) { $Filesize = filesize ($GZName); Header ('Content-Length: '.$Filesize); if ($Rwx = fopen ($GZName, 'rb')) fpassthru ($Rwx); # no fclose, fpassthru() closes the file } unlink ($GZName); return ($Found || $HasTransform); } function Move ($Name, $WrkDir, $PLocal) { $x = ArgInt ($Name, 2, 2, TRUE)/10.0; $y = ArgInt ($Name, 4, 2, TRUE)/10.0; $z = ArgInt ($Name, 6, 2, TRUE)/10.0; $S = ArgInt ($Name, 8, 2, TRUE)/10.0; $GZName = tempnam ($WrkDir, 'tu'); $Rwx = gzopen ("$GZName", 'wb9'); $Input = popen (UNZIP.' '.$PLocal.'/models/'.substr($Name, 10), "r"); $FirstClump = TRUE; $SecondClump = FALSE; $DidTranslate = FALSE; $Found = FALSE; $HasTransform = FALSE; $Proto = 0; while (!feof($Input)) { $Line = ltrim(fgets ($Input, 1024)); gzwrite ($Rwx, $Line); if ($Found && !$HasTransform) continue; $Words = split ("[ \t]", rtrim($Line), 2); if (! strcasecmp ($Words[0], 'ProtoBegin')) $Proto++; else if (! strcasecmp ($Words[0], 'ProtoEnd')) $Proto--; if ($Proto != 0) continue; $Doit = FALSE; if (! $HasTransform) if (! strcasecmp ($Words[0], 'TransformBegin')) { $HasTransform = TRUE; continue; } if ($HasTransform) { $Doit = !strcasecmp ($Words[0], 'ClumpBegin'); } else if ($FirstClump) { if ($Doit = ($SecondClump || !strcasecmp ($Words[0], 'ClumpBegin'))) { $FirstClump = FALSE; $SecondClump = TRUE; } } if ($Doit) { $SecondClump = FALSE; $Found = TRUE; if (! $DidTranslate) { gzwrite ($Rwx, sprintf ("translate %f %f %f\n", $x, $y, $z)); $DidTranslate = TRUE; } if ($S!=0.0) gzwrite ($Rwx, sprintf ("scale %f %f %f\n", $S, $S, $S)); } } # read loop gzclose ($Rwx); pclose ($Input); if ($Found || $HasTransform) { $Filesize = filesize ($GZName); Header ('Content-Length: '.$Filesize); if ($Rwx = fopen ($GZName, 'rb')) fpassthru ($Rwx); # no fclose, fpassthru() closes the file } unlink ($GZName); return ($Found || $HasTransform); } function RandomColor($Name) { if (strlen($Name) != 12) { mt_srand((double)microtime()*1000000); $r = mt_rand (0, 255); $g = mt_rand (0, 255); $b = mt_rand (0, 255); } else { $r = hexdec (substr ($Name, 2, 2)); $g = hexdec (substr ($Name, 4, 2)); $b = hexdec (substr ($Name, 6, 2)); } $im = imagecreate (256,256); $back = ImageColorAllocate ($im, $r, $g, $b); ImageJPEG ($im); ImageDestroy ($im); } function CheckPaths() { global $DocRoot, $PLocal, $Jpg404, $Zip404, $WorkDir; $DoAll = is_dir ($DocRoot); if ($DoAll) echo ('OK : '); else echo ('FAILED : '); echo ('$DocRoot = '.$DocRoot.'
'); if (is_executable (UNZIP)) echo ('OK : '); else echo ('FAILED : '); echo ('UNZIP = '.UNZIP.'
'); if (! $DoAll) return; if (is_dir ($WorkDir)) echo ('OK : '); else echo ('FAILED : '); echo ('$WorkDir = '.$WorkDir.'
'); $DoAll = is_dir ($DocRoot.$PLocal); if ($DoAll) echo ('OK : '); else echo ('FAILED : '); echo ('$DocRoot + $PLocal = '.$DocRoot.$PLocal.'
'); if (! $DoAll) return; if (is_readable ($DocRoot.$PLocal.$Jpg404)) echo ('OK : '); else echo ('FAILED : '); echo ('$DocRoot + $PLocal + $Jpg404 = '.$DocRoot.$PLocal.$Jpg404.'
'); if (is_readable ($DocRoot.$PLocal.$Zip404)) echo ('OK : '); else echo ('FAILED : '); echo ('$DocRoot + $PLocal + $Zip404 = '.$DocRoot.$PLocal.$Zip404.'
'); echo ('
PHP configuration check:

'); if (extension_loaded ("zlib")) echo ('OK : '); else echo ('FAILED : '); echo ('ZLib support (needed to create the ZIP files)
'); if (extension_loaded ("gd")) echo ('OK : '); else echo ('FAILED : '); echo ('gd included (optional, needed for random textures)
'); } ?>