Skip to content

Instantly share code, notes, and snippets.

@SirGordon
Created June 3, 2015 09:34
Show Gist options
  • Save SirGordon/e843a1175bb7eaf471ad to your computer and use it in GitHub Desktop.
Save SirGordon/e843a1175bb7eaf471ad to your computer and use it in GitHub Desktop.
SandCastle mobile test
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