package {
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3D;
import alternativa.engine3d.core.Resource;
import alternativa.engine3d.core.View;
import alternativa.engine3d.loaders.ParserA3D;
import alternativa.engine3d.resources.BitmapTextureResource;
import alternativa.engine3d.objects.Mesh;
import alternativa.engine3d.materials.VertexLightTextureMaterial;
import alternativa.engine3d.lights.AmbientLight;
import alternativa.engine3d.lights.DirectionalLight;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
public class Main extends Sprite {
//On embarque notre texture et notre objet 3D
[Embed(source="combinesoldiersheet_prisonguard.jpg")] static private const SoldierTexture:Class;
[Embed("soldier.A3D",mimeType="application/octet-stream")] static private const SoldierA3D:Class;
private var rootContainer:Object3D = new Object3D();
private var camera:Camera3D;
private var stage3D:Stage3D;
private var soldier:Mesh;
private var ambient:AmbientLight;
private var light:DirectionalLight;
public function Main(){
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
camera = new Camera3D(0.1, 10000);
camera.view = new View(640, 512);
camera.view.antiAlias = 8;
addChild(camera.view);
addChild(camera.diagram);
camera.rotationX = -90 * Math.PI / 180;
camera.x = 239;
camera.y = -1209;
camera.z = -240;
rootContainer.addChild(camera);
//Nos lumière
ambient = new AmbientLight(0xffffff);
ambient.intensity = 0.2;
ambient.x = 200;
rootContainer.addChild(ambient);
light = new DirectionalLight(0xffffff);
light.intensity = 6;
light.y = -600;
rootContainer.addChild(light);
//Notre soldat
var parser:ParserA3D = new ParserA3D(); //On initialise le parser de modèles A3D
parser.parse(new SoldierA3D()); //On lui demande de parser notre objet 3D
//Pour charger du Collada ou 3DS, c'est le même principe, il suffit d'utiliser le bon parseur ;)
var soldierTexture:BitmapTextureResource = new BitmapTextureResource(new SoldierTexture().bitmapData);
//On créer notre ressource de texture
soldier = parser.objects[0] as Mesh; //on convertit le premier objet de l'objet 3D en objet exploitable (on verra plus tard qu'il peut y en avoir plusieurs)
//On le positionne
soldier.x = 250;
soldier.y = -800;
soldier.z = -400;
//On l'agrandit un peu
soldier.scaleX = 4;
soldier.scaleY = 4;
soldier.scaleZ = 4;
soldier.setMaterialToAllSurfaces(new VertexLightTextureMaterial(soldierTexture)); //Et enfin, on le texture avec notre ressource
rootContainer.addChild(soldier);
stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
stage3D.requestContext3D();
}
private function onContextCreate(e:Event):void {
for each (var resource:Resource in rootContainer.getResources(true)) {
resource.upload(stage3D.context3D);
}
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void {
camera.view.width = stage.stageWidth;
camera.view.height = stage.stageHeight;
//On fait pivoter notre soldat et on oriente la lumière directionnelle sur lui
soldier.rotationZ += 0.01;
light.lookAt(soldier.x, soldier.y, soldier.z);
camera.render(stage3D);
}
}
}
Romain Dedenis.