Revision: 305
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 9, 2006 04:48 by jkochis
Initial Code
public function render() {
// find which map block the camera is in
$cameraBlockX = $this->camX >> 6;
$cameraBlockY = $this->camY >> 6;
$offset = 0;
// clamp angle for lookup tables
if ($this->camAngle < 0) $this->camAngle += pi() * 2;
if ($this->camAngle > pi() * 2) $this->camAngle -= pi() * 2;
$angle = $this->camAngle + $this->camFov * 0.5;
if ($angle > pi() * 2) $angle -= pi() * 2;
$width = $this->width;
$this->camPCentre = $this->height / 2 - $this->camRoll;
$ang = ($this->camAngle * $this->divisor) | 0;
$invertZ = 64 - $this->camZ;
// loop through each vertical strip
while ($width-- > 0) {
// set nearest face to practical infinity
$nearestFace = 4294967296;
$angleLookup = ($angle * $this->divisor);
// find oriented face aligned to X axis of map
$x = $cameraBlockX;
$y = $cameraBlockY;
if ($this->sin[$angleLookup] < 0) {
while ($y > -1 && $x > -1 && $x < $this->mapWidth) {
$absY = $y << 6;
$absX = $this->camX + ($absY - $this->camY) / $this->tan[$angleLookup];
$x = $absX >> 6;
// check if there is a block here
if ($this->map[$x][--$y]) {
$nearestFace = pow($absX - $this->camX, 2) + pow($absY - $this->camY, 2);
$offset = $absX & 63;
break;
}
}
} else {
while ($y++ < $this->mapHeight && $x > -1 && $x < $this->mapWidth) {
$absY = $y << 6;
$absX = $this->camX + ($absY - $this->camY) / $this->tan[$angleLookup];
$x = $absX >> 6;
// check if there is a block here
if ($this->map[$x][$y]) {
$nearestFace = pow($absX - $this->camX, 2) + pow($absY - $this->camY, 2);
$offset = 64 - $absX & 63;
break;
}
}
}
// find closest face oriented to Y axis of map
$x = $cameraBlockX;
$y = $cameraBlockY;
if ($this->cos[$angleLookup] < 0) {
while ($x > -1 && $y > -1 && $y < $this->mapHeight) {
$absX = $x << 6;
$absY = $this->camY + ($absX - $this->camX) * $this->tan[$angleLookup];
$y = $absY >> 6;
// check if there is a block here
if ($this->map[--$x][$y]) {
$distance = pow($absX - $this->camX, 2) + pow($absY - $this->camY, 2);
if ($distance < $nearestFace) {
$nearestFace = $distance;
$offset = 64 - $absY & 63;
}
break;
}
}
} else {
while ($x++ < $this->mapWidth && $y > -1 && $y < $this->mapHeight) {
$absX = $x << 6;
$absY = $this->camY + ($absX - $this->camX) * $this->tan[$angleLookup];
$y = $absY >> 6;
// check if there is a block here
if ($this->map[$x][$y]) {
$distance = pow($absX - $this->camX, 2) + pow($absY - $this->camY, 2);
if ($distance < $nearestFace) {
$nearestFace = $distance;
$offset = $absY & 63;
}
break;
}
}
}
// check whether the current strip is looking left or right of centre angle
if ($angleLookup < $ang) {
$distort = $this->camDistance / $this->cos[7200 + $angleLookup - $ang];
} else {
$distort = $this->camDistance / $this->cos[$angleLookup - $ang];
}
$wallHeight = $distort / sqrt($nearestFace);
$distanceFloor = $invertZ * $distort;
$distanceCeiling = $this->camZ * $distort;
$floorLevel = (int) ($this->camPCentre + $wallHeight * $this->camZ + 0.5);
$wallLevel = (int) ($this->camPCentre - $wallHeight * $invertZ);
$height = $this->height;
// draw floor
while (--$height > $floorLevel && $height >= 0) {
$distance = $distanceFloor / ($height - $this->camPCentre);
imagesetpixel($this->canvas, $width, $height, imagecolorat($this->texFloor, ($this->camX + $this->cos[$angleLookup] * $distance) & 63, ($this->camY + $this->sin[$angleLookup] * $distance) & 63));
}
// draw wall
while (--$height > $wallLevel && $height >= 0) {
imagesetpixel($this->canvas, $width, $height, imagecolorat($this->texWall, $offset, ($height - $wallLevel) / $wallHeight));
}
// draw ceiling
while (--$height > -1) {
$distance = $distanceCeiling / ($this->camPCentre - $height);
imagesetpixel($this->canvas, $width, $height, imagecolorat($this->texCeil, ($this->camX + $this->cos[$angleLookup] * $distance) & 63, ($this->camY + $this->sin[$angleLookup] * $distance) & 63));
}
$angle -= $this->camPerRayAngle;
if ($angle < 0) $angle += pi() * 2;
}
}
Initial URL
Initial Description
Initial Title
PHP 3D Renderer
Initial Tags
php, image
Initial Language
PHP