Created
June 3, 2015 09:34
-
-
Save SirGordon/e843a1175bb7eaf471ad to your computer and use it in GitHub Desktop.
SandCastle mobile test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package { | |
import away3d.cameras.Camera3D; | |
import away3d.cameras.lenses.PerspectiveLens; | |
import away3d.containers.Scene3D; | |
import away3d.containers.View3D; | |
import away3d.core.managers.Stage3DManager; | |
import away3d.core.managers.Stage3DProxy; | |
import away3d.debug.AwayStats; | |
import away3d.events.Stage3DEvent; | |
import away3d.lights.DirectionalLight; | |
import away3d.materials.ColorMaterial; | |
import away3d.materials.lightpickers.StaticLightPicker; | |
import com.terrainbuilder.dynamicterrain.utils.HeightMap16BitTools; | |
import com.terrainbuilder.effects.objs.ColoredSplatData; | |
import com.terrainbuilder.events.TerrainBlockEvent; | |
import com.terrainbuilder.materials.ColorTerrainMaterial; | |
import com.terrainbuilder.objs.terrain.SeamlessElevationData; | |
import com.terrainbuilder.objs.terrain.TerrainBlock; | |
import flash.display.BitmapData; | |
import flash.display.Sprite; | |
import flash.display.StageAlign; | |
import flash.display.StageQuality; | |
import flash.display.StageScaleMode; | |
import flash.events.Event; | |
import flash.events.ProgressEvent; | |
import flash.utils.ByteArray; | |
[SWF(frameRate="60")] | |
public class ExportClass extends Sprite { | |
[Embed(source="<my user directory>/AppData/Roaming/AIRPlayground/Local Store/textures/dirt_02_bump.jpg")] | |
private var ColoredSplatData0Splat : Class; | |
[Embed(source="<my project directory>/src/colored_blend_000.png")] | |
private var ColoredSplatData0Blend : Class; | |
[Embed(source="<my user directory>/AppData/Roaming/AIRPlayground/Local Store/normal maps/dirt_02_norm.png")] | |
private var ColoredSplatData0Norm : Class; | |
[Embed(source="<my user directory>/AppData/Roaming/AIRPlayground/Local Store/textures/moss_01_bump.jpg")] | |
private var ColoredSplatData1Splat : Class; | |
[Embed(source="<my project directory>/src/colored_blend_001.png")] | |
private var ColoredSplatData1Blend : Class; | |
[Embed(source="<my user directory>/AppData/Roaming/AIRPlayground/Local Store/normal maps/moss_01_norm.png")] | |
private var ColoredSplatData1Norm : Class; | |
[Embed(source="<my user directory>/AppData/Roaming/AIRPlayground/Local Store/textures/cliffs_01_bump.jpg")] | |
private var ColoredSplatData2Splat : Class; | |
[Embed(source="<my project directory>/src/colored_blend_002.png")] | |
private var ColoredSplatData2Blend : Class; | |
[Embed(source="<my user directory>/AppData/Roaming/AIRPlayground/Local Store/normal maps/cliffs_01_norm.png")] | |
private var ColoredSplatData2Norm : Class; | |
[Embed(source="<my project directory>/src/exportclass_terrain_block_000.raw", mimeType="application/octet-stream")] | |
private var HeightMapRaw : Class; | |
public var stage3DManager : Stage3DManager; | |
public var stage3DProxy : Stage3DProxy; | |
public var view : View3D; | |
public var scene : Scene3D; | |
public var camera : Camera3D; | |
public var lens : PerspectiveLens; | |
public var lightPicker : StaticLightPicker; | |
public var sunLight : DirectionalLight; | |
public var coloredSplatDatas : Vector.<ColoredSplatData>; | |
public var colorTerrainMaterial : ColorTerrainMaterial; | |
public var seamlessElevationData : SeamlessElevationData; | |
public var terrainBlock : TerrainBlock; | |
public var LODDistances : Vector.<Number> = Vector.<Number>([51200, 25600, 15360, 1920, 640, 256]); | |
public var sharedHeightMapBitmapData : BitmapData; | |
public var heightMap16BitTools : HeightMap16BitTools = new HeightMap16BitTools(); | |
public function ExportClass() { | |
init(); | |
} | |
private function init() : void { | |
stage3DManager = Stage3DManager.getInstance(stage); | |
stage3DProxy = stage3DManager.getFreeStage3DProxy(); | |
stage3DProxy.addEventListener(Stage3DEvent.CONTEXT3D_CREATED, onContextCreate); | |
} | |
private function onContextCreate(e : Stage3DEvent) : void { | |
initAway3D(); | |
} | |
private function initAway3D() : void { | |
initAway3DEngine(); | |
initLights(); | |
initMaterials(); | |
initObjects(); | |
initListeners(); | |
addChild(new AwayStats(view)); | |
} | |
private function initAway3DEngine() : void { | |
stage.scaleMode = StageScaleMode.NO_SCALE; | |
stage.align = StageAlign.TOP_LEFT; | |
stage.quality = StageQuality.LOW; | |
stage.color = 0x000000; | |
stage.addEventListener(Event.RESIZE, resizeStage); | |
view = new View3D(); | |
view.stage3DProxy = stage3DProxy; //IMPORTANT FOR STARLING | |
view.shareContext = true; //IMPORTANT FOR STARLING | |
view.height = stage.stageHeight; | |
view.width = stage.stageWidth; | |
view.backgroundAlpha = 0; | |
view.forceMouseMove = true; | |
addChild(view); | |
scene = new Scene3D(); | |
view.scene = scene; | |
view.antiAlias = 1; | |
camera = new Camera3D(); // Setup camera | |
camera.x = 110.84064483642578; | |
camera.y = 594.3870849609375; | |
camera.z = -126.40605163574219; | |
camera.rotationX = 35.284046300461846; | |
camera.rotationY = -43.57969312081357; | |
camera.rotationZ = -0.8039024548723112; | |
lens = new PerspectiveLens(60); | |
camera.lens = lens; | |
camera.lens.far = 356; | |
camera.lens.near = 5; | |
view.camera = camera; | |
stage3DProxy.width = stage.stageWidth; | |
stage3DProxy.height = stage.stageHeight; | |
} | |
private function resizeStage(e : Event) : void { | |
stage.align = StageAlign.TOP_LEFT; | |
stage.scaleMode = StageScaleMode.NO_SCALE; | |
view.width = stage.stageWidth; | |
view.height = stage.stageHeight; | |
stage3DProxy.width = stage.stageWidth; | |
stage3DProxy.height = stage.stageHeight; | |
} | |
private function initLights() : void { | |
sunLight = new DirectionalLight(-20000, -20000, 20000); | |
sunLight.color = 0xfffdc5; | |
sunLight.ambientColor = 0xfffdc5; | |
sunLight.ambient = 0.01; | |
sunLight.specular = 1; | |
scene.addChild(sunLight); | |
lightPicker = new StaticLightPicker([sunLight]); | |
} | |
private function initMaterials() : void { | |
heightMap16BitTools = new HeightMap16BitTools(); | |
sharedHeightMapBitmapData = heightMap16BitTools.getBitmapDataFromByteArray(new HeightMapRaw() as ByteArray); | |
seamlessElevationData = new SeamlessElevationData(); | |
seamlessElevationData.heightMap = new BitmapData(131, 131, true, 0xFF400000); | |
seamlessElevationData.width = 128; | |
seamlessElevationData.height = 32; | |
seamlessElevationData.depth = 128; | |
seamlessElevationData.sharedHeightMapBitmapData = sharedHeightMapBitmapData; | |
coloredSplatDatas = new Vector.<ColoredSplatData>(); | |
var coloredSplatData0 : ColoredSplatData = new ColoredSplatData(new ColoredSplatData0Splat().bitmapData, new ColoredSplatData0Blend().bitmapData, 0xb88e54, new ColoredSplatData0Norm().bitmapData); | |
coloredSplatData0.heightMapRange = [0, 1]; | |
coloredSplatData0.useSlopeBlend = false; | |
coloredSplatData0.maxOpacityAngle = 0.45; | |
coloredSplatData0.opacityAngleSpreadRange = 0.3; | |
coloredSplatData0.visible = true; | |
coloredSplatDatas.push(coloredSplatData0); | |
var coloredSplatData1 : ColoredSplatData = new ColoredSplatData(new ColoredSplatData1Splat().bitmapData, new ColoredSplatData1Blend().bitmapData, 0x57552c, new ColoredSplatData1Norm().bitmapData); | |
coloredSplatData1.heightMapRange = [516.1098039215686, 556.1098039215686]; | |
coloredSplatData1.useSlopeBlend = false; | |
coloredSplatData1.maxOpacityAngle = 0.45; | |
coloredSplatData1.opacityAngleSpreadRange = 0.3; | |
coloredSplatData1.visible = true; | |
coloredSplatDatas.push(coloredSplatData1); | |
var coloredSplatData2 : ColoredSplatData = new ColoredSplatData(new ColoredSplatData2Splat().bitmapData, new ColoredSplatData2Blend().bitmapData, 0x979696, new ColoredSplatData2Norm().bitmapData); | |
coloredSplatData2.heightMapRange = [0, 1]; | |
coloredSplatData2.useSlopeBlend = true; | |
coloredSplatData2.maxOpacityAngle = 0.4; | |
coloredSplatData2.opacityAngleSpreadRange = 0.4; | |
coloredSplatData2.visible = true; | |
coloredSplatDatas.push(coloredSplatData2); | |
colorTerrainMaterial = new ColorTerrainMaterial(2, seamlessElevationData, seamlessElevationData.lowestYPosition, coloredSplatDatas, 8); | |
colorTerrainMaterial.coloredSplatDatas = coloredSplatDatas; | |
colorTerrainMaterial.useNormalMaps = false; | |
colorTerrainMaterial.normalMapStrength = 0.5; | |
colorTerrainMaterial.lightPicker = lightPicker; | |
colorTerrainMaterial.ambientColor = 0x202030; | |
colorTerrainMaterial.specularColor = 0xffffff; | |
colorTerrainMaterial.specular = 0.02; | |
colorTerrainMaterial.gloss = 0; | |
colorTerrainMaterial.ambient = 10.45; | |
colorTerrainMaterial.fogEnabled = false; | |
colorTerrainMaterial.minimumFogDistance = 2500; | |
colorTerrainMaterial.maximumFogDistance = 5000; | |
colorTerrainMaterial.fogColor = 10469327; | |
} | |
private function initObjects() : void { | |
terrainBlock = new TerrainBlock(colorTerrainMaterial, new ColorMaterial(0xFF0000), 2, 2); | |
terrainBlock.eventDispatcher.addEventListener(TerrainBlockEvent.ON_ELEVATION_COMPLETE, onTerrainBlockElevationComplete); | |
terrainBlock.eventDispatcher.addEventListener(TerrainBlockEvent.ON_TERRAIN_BLOCK_UPDATED, onTerrainBlockUpdated); | |
terrainBlock.eventDispatcher.addEventListener(ProgressEvent.PROGRESS, updateTerrainBlockProgress); | |
terrainBlock.createTerrain(seamlessElevationData, 16451, null, 16384, false, 100, sharedHeightMapBitmapData); | |
terrainBlock.maxDisplayedSeamlessElevationTiles = 4; | |
view.scene.addChild(terrainBlock); | |
} | |
private function initListeners() : void { | |
stage.addEventListener(Event.ENTER_FRAME, renderFrame); | |
stage.addEventListener(Event.RESIZE, onResize); | |
onResize(); | |
} | |
private function onResize(e : Event = null) : void { | |
view.width = stage.stageWidth; | |
view.height = stage.stageHeight; | |
} | |
public function updateTerrainBlocks(forceUpdate : Boolean = true) : void { | |
//terrainBlock.maxDisplayedSeamlessElevationTiles = 8; //UPDATE MAXIMUM VISIBLE TILES HERE | |
terrainBlock.LODDistances = LODDistances; //UPDATE LOD DISTANCES | |
terrainBlock.update(view, stage, forceUpdate); | |
} | |
public function onTerrainBlockElevationComplete(e : TerrainBlockEvent) : void { | |
//TERRAIN BLOCK ELEVATION COMPLETED | |
} | |
public function onTerrainBlockUpdated(e : TerrainBlockEvent) : void { | |
//TERRAIN BLOCK ELEVATION UPDATED | |
} | |
public function updateTerrainBlockProgress(e : ProgressEvent) : void { | |
//TERRAIN BLOCK PROGRESS | |
//trace("BYTES: " + e.bytesLoaded, e.bytesTotal); | |
} | |
private function renderFrame(e : Event) : void { | |
terrainBlock.autoLoad(view.scene); | |
if (view.shareContext == true) { | |
stage3DProxy.clear(); | |
} | |
updateTerrainBlocks(true); | |
view.render(); | |
stage3DProxy.present(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment