All pastes #895613 Raw Edit

Mine

public text v1 · immutable
·published 2008-02-07 23:10 UTC
rendered paste body
d,package {
	
	import org.papervision3d.core.*;
	import org.papervision3d.core.proto.*;
	import org.papervision3d.core.geom.*;
	import org.papervision3d.objects.*;
	import org.papervision3d.objects.primitives.*;
	import org.papervision3d.materials.utils.*;	
	import org.papervision3d.materials.*;	
	//import org.papervision3d.core.geom.renderables.Triangle3D;
	//import org.papervision3d.core.geom.renderables.Vertex3D;
	//import org.papervision3d.core.math.NumberUV;
	
	import LevelMap;
	
	public class LevelGeometry extends DisplayObject3D {
		
		var height:uint=200;//aka yScale
		var xScale:uint=200;
		var zScale:uint=200;
		
		private var segments:uint=5;
		
		private var xWalls=new Array(new Array());
		private var zWalls=new Array(new Array());
		private var cells = new Array(new Array());
		
		public function LevelGeometry(ld:LevelMap, initObject:Object = null) {
			super(null,null,initObject);
			
			this.materials=new MaterialsList( {
				pinkwall:   new WireframeMaterial(0xff00ff, 1),
				all:    new WireframeMaterial(0xff0000, 1),
				greenwall:  new WireframeMaterial(0x00ff00, 1),
				yellowwall: new ColorMaterial(0xffff00),
				brownwall:  new WireframeMaterial(0x660000, 1),
				bluewall:   new WireframeMaterial(0x0000ff, 1)
			});
			
			//var upNormal;
			//var downNormal;
			//var leftNormal;
			//var rightNormal;
			
			var height:Number=300;
			var xScale:Number=300;
			var zScale:Number=300;
			
			var iy:uint,ix:uint;
			
			xWalls=new Array();
			for(iy=0;iy<=ld.ySize;iy++) {
				xWalls[iy]=new Array();
				for(ix=0;ix<ld.xSize;ix++) {
					xWalls[iy][ix]=null;
				}
			}
			
			zWalls=new Array();
			for(iy=0;iy<ld.ySize;iy++) {
				zWalls[iy]=new Array();
				for(ix=0;ix<=ld.xSize;ix++) {
					zWalls[iy][ix]=null;
				}
			}
			
			cells=new Array();
			for(iy=0;iy<ld.ySize;iy++) {
				cells[iy]=new Array();
				for(ix=0;ix<ld.xSize;ix++) {
					cells[iy][ix]=new DisplayCell();
				}
			}
			
			updateWalls(ld);
			
		}
		
		private function updateWalls(ld:LevelMap) {
			
			var ix:uint, iy:uint;
			var pl:Plane;
						
			//warning, these loops WILL access outside of the normal data range
			for(iy=1;iy<ld.ySize-1;iy++) {
				var iy1=iy+1;
				for(ix=1;ix<ld.xSize-1;ix++) {
					var ix1=ix+1;
					
					var top:uint=ld[iy][ix-1];
					var bottom:uint=ld[iy][ix1];
					var left:uint=ld[iy-1][ix];
					var right:uint=ld[iy1][ix];
					var here:uint=ld[iy][ix];
					var needWall:Boolean;
					
					if((here & LevelMap.LOWER)==LevelMap.LOWER) {
					
						needWall=(top & LevelMap.LOWER)!=LevelMap.LOWER;
						if(xWalls[iy1][ix]!=null && !needWall) {
							removeChild(xWalls[iy1][ix]);
							xWalls[iy1][ix]=null;
						} else if(xWalls[iy1][ix]==null && needWall) {
							xWalls[iy1][ix]=pl=new Plane(
								getWallMat(here,top),
								xScale, height,
								segments, segments,
								{
									x: ix*xScale,
									y: 0,
									z: iy1*zScale,
									rotationX: 0,
									rotationY: 0,
									rotationZ: 0
								}
							);
							addChild(pl);
						} else if(cells[iy1][ix].selected) {}
					
						needWall=(bottom & LevelMap.LOWER)!=LevelMap.LOWER;
						if(xWalls[iy][ix]!=null && !needWall) {
							removeChild(xWalls[iy][ix]);
							xWalls[iy][ix]=null;
						} else if(xWalls[iy][ix]==null && needWall) {
							xWalls[iy][ix]=pl=new Plane(
								getWallMat(here,bottom,true),//hack to get differnt texture for debuging
								xScale, height,
								segments, segments,
								{
									x: (ix-1)*xScale,
									y: 0,
									z: iy*zScale,
									rotationX: 0,
									rotationY: 180,
									rotationZ: 0
								}
							);
							addChild(pl);
						} else if(cells[iy1][ix].selected) {}

					}
					/*if((bottom & LevelData.lower)!=(here & LevelData.lower)) {
						generatewall("back",u,v,LevelData.wallTypes[bottom & LevelData.wallTypesMask]);
					}
						
					if((left & LevelData.lower)!=(here & LevelData.lower)) {
						generatewall("left",u,v,LevelData.wallTypes[left & LevelData.wallTypesMask]);
					}
						
					if((right & LevelData.lower)!=(here & LevelData.lower)) {
						generatewall("right",u,v,LevelData.wallTypes[right & LevelData.wallTypesMask]);
					}
					
					//TODO: add top wall
					
					trace("floor");
					
					buildPlane(
						materials.getMaterialByName("greenwall"),
						"x","z",
						xScale,zScale,
						((here & LevelData.lower)==LevelData.lower) ? 0 : height,
						false,
						(u-1)*xScale,0,0
					);
					*/
					
				}//end for
			}//end for
			
			
					
			//mergeVertices();
	
			//this.geometry.ready = true;
			
		} // end of constructor
		
		private function getWallMat(here:uint,there:uint,selected:Boolean=false):MaterialObject3D {
			
			switch(selected) {
				
				case false:			
					switch(here) {
						case LevelMap.OPEN:
						case LevelMap.WATER:
						case LevelMap.LAVA:
							switch(there) {
								case LevelMap.ROCK:
									return materials.getMaterialByName("brownwall");
								break;
						
								case LevelMap.DIRT:
									return materials.getMaterialByName("greenwall");
								break;
								
								case LevelMap.GOLD:
									return materials.getMaterialByName("yellowwall");
								break;
								
								case LevelMap.GEMS:
									return materials.getMaterialByName("pinkwall");
								break;
								
								default:
									return materials.getMaterialByName("redwall");
								break;
							}
						break;
					}
				break;
				
				case true:
					switch(there) {
						case LevelMap.GOLD:
							return materials.getMaterialByName("yellowwall");
						break;
						
						case LevelMap.DIRT:
							return materials.getMaterialByName("bluewall");
						break;
					}
				break;
			}
			return null;
		}
		
	}//end of class
	
}//end of package