= $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)
');
}
?>