/**
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
* If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.
* You may add additional accurate notices of copyright ownership.
*
* It is desirable to notify that Covered Software was "Powered by AlternativaPlatform" with link to http://www.alternativaplatform.com/
* */
package alternativa.engine3d.core {
import alternativa.Alternativa3D;
import alternativa.engine3d.alternativa3d;
import alternativa.engine3d.core.events.MouseEvent3D;
import alternativa.engine3d.materials.ShaderProgram;
import alternativa.engine3d.materials.compiler.Linker;
import alternativa.engine3d.materials.compiler.Procedure;
import alternativa.engine3d.materials.compiler.VariableType;
import alternativa.engine3d.objects.Surface;
import alternativa.engine3d.resources.Geometry;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DCompareMode;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DTriangleFace;
import flash.display3D.VertexBuffer3D;
import flash.events.ContextMenuEvent;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Vector3D;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.ui.Keyboard;
import flash.ui.Mouse;
import flash.utils.Dictionary;
import flash.utils.setTimeout;
use namespace alternativa3d;
/**
* A viewport. Though GPU can render to one of Stage3D only, View still extends DisplayObject and should be in DisplayList.
* Since 8 version of Alternativa3D view used as wrapper for configuring Stage3D properties for first. Main task of view is defining
* rectangular field of screen to which image will be rendered. Another opportunity is render image to Bitmap. In this case the view
* will have this Bitmap as a child. The size of View should be 50x50 at least.
* In case of size will be more than 2048 and anti-aliasing is turned on, usage of MouseEvents will cause of crash.
*
* @see alternativa.engine3d.core.Camera3D
*/
public class View extends Sprite {
private static const renderEvent:MouseEvent = new MouseEvent("render");
private static var properties:Dictionary = new Dictionary(true);
private var cachedContext3D:Context3D;
private var context3DViewProperties:Context3DViewProperties;
static private var drawDistanceFragment:Linker;
static private var drawDistanceVertexProcedure:Procedure;
static private const drawUnit:DrawUnit = new DrawUnit();
static private const pixels:Dictionary = new Dictionary();
static private const stack:Vector. = new Vector.();
static private const point:Point = new Point();
static private const scissor:Rectangle = new Rectangle(0, 0, 1, 1);
static private const localCoords:Vector3D = new Vector3D();
static private const branch:Vector. = new Vector.();
static private const overedBranch:Vector. = new Vector.();
static private const changedBranch:Vector. = new Vector.();
static private const functions:Vector. = new Vector.();
private static const drawColoredRectConst:Vector. = Vector.([0, 0, -1, 1]);
private static const drawRectColor:Vector. = new Vector.(4);
/**
* Background color.
*/
public var backgroundColor:uint;
/**
* Background transparency.
*/
public var backgroundAlpha:Number;
/**
* Level of anti-aliasing.
*/
public var antiAlias:int;
/**
* @private
*/
alternativa3d var _width:int;
/**
* @private
*/
alternativa3d var _height:int;
private var backBufferContext3D:Context3D;
private var backBufferWidth:int = -1;
private var backBufferHeight:int = -1;
private var backBufferAntiAlias:int = -1;
/**
* @private
*/
alternativa3d var _canvas:BitmapData = null;
/**
* Mouse events occurred over this View since last render.
*/
private var events:Vector. = new Vector.();
/**
* Indices of rays in the raysOrigins array for each mouse event.
*/
private var indices:Vector. = new Vector.();
private var eventsLength:int = 0;
// Surfaces of objects which can be crossed by mouse and procedures of transformation their coordinates
private var surfaces:Vector. = new Vector.();
private var geometries:Vector. = new Vector.();
private var procedures:Vector. = new Vector.();
private var surfacesLength:int = 0;
/**
* @private
*/
alternativa3d var raysOrigins:Vector. = new Vector.();
/**
* @private
*/
alternativa3d var raysDirections:Vector. = new Vector.();
private var raysCoefficients:Vector. = new Vector.();
private var raysSurfaces:Vector.> = new Vector.>();
private var raysDepths:Vector.> = new Vector.>();
private var raysIs:Vector. = new Vector.();
private var raysJs:Vector. = new Vector.();
/**
* @private
*/
alternativa3d var raysLength:int = 0;
private var lastEvent:MouseEvent;
private var target:Object3D;
private var targetSurface:Surface;
private var targetDepth:Number;
private var pressedTarget:Object3D;
private var clickedTarget:Object3D;
private var overedTarget:Object3D;
private var overedTargetSurface:Surface;
private var altKey:Boolean;
private var ctrlKey:Boolean;
private var shiftKey:Boolean;
private var container:Bitmap;
private var area:Sprite;
private var logo:Logo;
private var bitmap:Bitmap;
private var _logoAlign:String = "BR";
private var _logoHorizontalMargin:Number = 0;
private var _logoVerticalMargin:Number = 0;
private var _renderToBitmap:Boolean;
/**
* Creates a View object.
* @param width Width of a view, should be 50 at least.
* @param height Height of a view, should be 50 at least.
* @param renderToBitmap If true, image will render to Bitmap object which will included into the view as a child. It also will available through canvas property.
* @param backgroundColor Background color.
* @param backgroundAlpha BAckground transparency.
* @param antiAlias Level of anti-aliasing.
*
* @see #canvas
*/
public function View(width:int, height:int, renderToBitmap:Boolean = false, backgroundColor:uint = 0, backgroundAlpha:Number = 1, antiAlias:int = 0) {
if (width < 50) width = 50;
if (height < 50) height = 50;
_width = width;
_height = height;
_renderToBitmap = renderToBitmap;
this.backgroundColor = backgroundColor;
this.backgroundAlpha = backgroundAlpha;
this.antiAlias = antiAlias;
mouseEnabled = true;
mouseChildren = true;
doubleClickEnabled = true;
buttonMode = true;
useHandCursor = false;
tabEnabled = false;
tabChildren = false;
// Context menu
var item:ContextMenuItem = new ContextMenuItem("Powered by Alternativa3D " + Alternativa3D.version);
item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(e:ContextMenuEvent):void {
try {
navigateToURL(new URLRequest("http://alternativaplatform.com"), "_blank");
} catch (e:Error) {
}
});
var menu:ContextMenu = new ContextMenu();
menu.customItems = [item];
contextMenu = menu;
// Canvas
container = new Bitmap();
if (renderToBitmap) {
createRenderBitmap();
}
super.addChild(container);
// Hit area
area = new Sprite();
area.graphics.beginFill(0xFF0000);
area.graphics.drawRect(0, 0, 100, 100);
area.mouseEnabled = false;
area.visible = false;
area.width = _width;
area.height = _height;
hitArea = area;
super.addChild(hitArea);
// Logo
showLogo();
if (drawDistanceFragment == null) {
drawDistanceVertexProcedure = Procedure.compileFromArray([
// Declaraion
"#v0=distance",
"#c0=transform0",
"#c1=transform1",
"#c2=transform2",
"#c3=coefficient",
"#c4=projection",
// Convert to the camera coordinates
"dp4 t0.x, i0, c0",
"dp4 t0.y, i0, c1",
"dp4 t0.z, i0, c2",
// Passing the depth
"mul v0.x, t0.z, c3.z",
"mov v0.y, i0.x",
"mov v0.z, i0.x",
"mov v0.w, i0.x",
// Projection
"mul t1.x, t0.x, c4.x",
"mul t1.y, t0.y, c4.y",
"mul t0.w, t0.z, c4.z",
"add t1.z, t0.w, c4.w",
// Get last line
"mov t3.z, c4.x",
"div t3.z, t3.z, c4.x",
"sub t3.z, t3.z, c3.w",
// Finding W
"mul t1.w, t0.z, t3.z",
"add t1.w, t1.w, c3.w",
// Offset
"mul t0.x, c3.x, t1.w",
"mul t0.y, c3.y, t1.w",
"add t1.x, t1.x, t0.x",
"add t1.y, t1.y, t0.y",
"mov o0, t1",
], "mouseEventsVertex");
drawDistanceFragment = new Linker(Context3DProgramType.FRAGMENT);
drawDistanceFragment.addProcedure(new Procedure([
// Id
"mov t0.z, c0.z",
// An unit
"mov t0.w, c0.w",
// Remainder
"frc t0.y, v0.x",
// A whole part
"sub t0.x, v0.x, t0.y",
"mul t0.x, t0.x, c0.x",
"mov o0, ft0",
// Declaration
"#v0=distance",
"#c0=code",
], "mouseEventsFragment"));
}
// Listeners
addEventListener(MouseEvent.MOUSE_DOWN, onMouse);
addEventListener(MouseEvent.CLICK, onMouse);
addEventListener(MouseEvent.DOUBLE_CLICK, onMouse);
addEventListener(MouseEvent.MOUSE_MOVE, onMouse);
addEventListener(MouseEvent.MOUSE_OVER, onMouse);
addEventListener(MouseEvent.MOUSE_WHEEL, onMouse);
addEventListener(MouseEvent.MOUSE_OUT, onLeave);
addEventListener(Event.ADDED_TO_STAGE, onAddToStage);
addEventListener(Event.REMOVED_FROM_STAGE, onRemoveFromStage);
}
private function onMouse(mouseEvent:MouseEvent):void {
var prev:int = eventsLength - 1;
// case of mouseMove repeats
if (eventsLength > 0 && mouseEvent.type == "mouseMove" && (events[prev] as MouseEvent).type == "mouseMove") {
events[prev] = mouseEvent;
} else {
events[eventsLength] = mouseEvent;
eventsLength++;
}
lastEvent = mouseEvent;
}
private function onLeave(mouseEvent:MouseEvent):void {
events[eventsLength] = mouseEvent;
eventsLength++;
lastEvent = null;
}
private function createRenderBitmap():void {
_canvas = new BitmapData(_width, _height, backgroundAlpha < 1, backgroundColor);
container.bitmapData = _canvas;
container.smoothing = true;
}
private function onAddToStage(e:Event):void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
}
private function onRemoveFromStage(e:Event):void {
stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp);
altKey = false;
ctrlKey = false;
shiftKey = false;
}
private function onKeyDown(keyboardEvent:KeyboardEvent):void {
altKey = keyboardEvent.altKey;
ctrlKey = keyboardEvent.ctrlKey;
shiftKey = keyboardEvent.shiftKey;
if (ctrlKey && shiftKey && keyboardEvent.keyCode == Keyboard.F1 && bitmap == null) {
bitmap = new Bitmap(Logo.image);
bitmap.x = Math.round((_width - bitmap.width)/2);
bitmap.y = Math.round((_height - bitmap.height)/2);
super.addChild(bitmap);
setTimeout(removeBitmap, 2048);
}
}
private function onKeyUp(keyboardEvent:KeyboardEvent):void {
altKey = keyboardEvent.altKey;
ctrlKey = keyboardEvent.ctrlKey;
shiftKey = keyboardEvent.shiftKey;
}
private function removeBitmap():void {
if (bitmap != null) {
super.removeChild(bitmap);
bitmap = null;
}
}
/**
* @private
*/
alternativa3d function calculateRays(camera:Camera3D):void {
var i:int;
var mouseEvent:MouseEvent;
// Case of last coordinates fits in the view.
if (lastEvent != null) {
// Detecting mouse movement within the frame
var mouseMoved:Boolean = false;
for (i = 0; i < eventsLength; i++) {
mouseEvent = events[i];
if (mouseEvent.type == "mouseMove" || mouseEvent.type == "mouseOut") {
mouseMoved = true;
break;
}
}
// Add event of checking if content over mouse was changed
if (!mouseMoved) {
renderEvent.localX = lastEvent.localX;
renderEvent.localY = lastEvent.localY;
renderEvent.ctrlKey = ctrlKey;
renderEvent.altKey = altKey;
renderEvent.shiftKey = shiftKey;
renderEvent.buttonDown = lastEvent.buttonDown;
renderEvent.delta = 0;
events[eventsLength] = renderEvent;
eventsLength++;
}
}
// Creation of exclusive rays
var mouseX:Number = 1e+22;
var mouseY:Number = 1e+22;
for (i = 0; i < eventsLength; i++) {
mouseEvent = events[i];
if (mouseEvent.type != "mouseOut") {
// Calculation of ray within the camera
if (mouseEvent.localX != mouseX || mouseEvent.localY != mouseY) {
mouseX = mouseEvent.localX;
mouseY = mouseEvent.localY;
// Creation
var origin:Vector3D;
var direction:Vector3D;
var coefficient:Point;
if (raysLength < raysOrigins.length) {
origin = raysOrigins[raysLength];
direction = raysDirections[raysLength];
coefficient = raysCoefficients[raysLength];
} else {
origin = new Vector3D();
direction = new Vector3D();
coefficient = new Point();
raysOrigins[raysLength] = origin;
raysDirections[raysLength] = direction;
raysCoefficients[raysLength] = coefficient;
raysSurfaces[raysLength] = new Vector.();
raysDepths[raysLength] = new Vector.();
}
// Filling
if (!camera.orthographic) {
direction.x = mouseX - _width*0.5;
direction.y = mouseY - _height*0.5;
direction.z = camera.focalLength;
origin.x = direction.x*camera.nearClipping/camera.focalLength;
origin.y = direction.y*camera.nearClipping/camera.focalLength;
origin.z = camera.nearClipping;
direction.normalize();
coefficient.x = mouseX*2/_width;
coefficient.y = mouseY*2/_height;
} else {
direction.x = 0;
direction.y = 0;
direction.z = 1;
origin.x = mouseX - _width*0.5;
origin.y = mouseY - _height*0.5;
origin.z = camera.nearClipping;
coefficient.x = mouseX*2/_width;
coefficient.y = mouseY*2/_height;
}
raysLength++;
}
// Considering event with the ray
indices[i] = raysLength - 1;
} else {
indices[i] = -1;
}
}
}
/**
* @private
*/
alternativa3d function addSurfaceToMouseEvents(surface:Surface, geometry:Geometry, procedure:Procedure):void {
surfaces[surfacesLength] = surface;
geometries[surfacesLength] = geometry;
procedures[surfacesLength] = procedure;
surfacesLength++;
}
/**
* @private
*/
alternativa3d function prepareToRender(stage3D:Stage3D, context:Context3D):void {
if (_canvas == null) {
var vis:Boolean = this.visible;
for (var parent:DisplayObject = this.parent; parent != null; parent = parent.parent) {
vis &&= parent.visible;
}
var coords:Point;
point.x = 0;
point.y = 0;
coords = localToGlobal(point);
stage3D.x = coords.x;
stage3D.y = coords.y;
stage3D.visible = vis;
} else {
stage3D.visible = false;
if (_width != _canvas.width || _height != _canvas.height || (backgroundAlpha < 1) != _canvas.transparent) {
_canvas.dispose();
createRenderBitmap();
}
}
if (_width != backBufferWidth || _height != backBufferHeight || antiAlias != backBufferAntiAlias || context != backBufferContext3D) {
backBufferWidth = _width;
backBufferHeight = _height;
backBufferAntiAlias = antiAlias;
backBufferContext3D = context;
context.configureBackBuffer(_width, _height, antiAlias);
}
var r:Number = ((backgroundColor >> 16) & 0xff)/0xff;
var g:Number = ((backgroundColor >> 8) & 0xff)/0xff;
var b:Number = (backgroundColor & 0xff)/0xff;
if (canvas != null) {
r *= backgroundAlpha;
g *= backgroundAlpha;
b *= backgroundAlpha;
}
context.clear(r, g, b, backgroundAlpha);
}
/**
* @private
*/
alternativa3d function processMouseEvents(context:Context3D, camera:Camera3D):void {
var i:int;
// Mouse events
if (eventsLength > 0) {
if (surfacesLength > 0) {
// Calculating the depth
calculateSurfacesDepths(context, camera, _width, _height);
// Sorting by decreasing the depth
for (i = 0; i < raysLength; i++) {
var raySurfaces:Vector. = raysSurfaces[i];
var rayDepths:Vector. = raysDepths[i];
var raySurfacesLength:int = raySurfaces.length;
if (raySurfacesLength > 1) {
sort(raySurfaces, rayDepths, raySurfacesLength);
}
}
}
// Event handling
targetDepth = camera.farClipping;
for (i = 0; i < eventsLength; i++) {
var mouseEvent:MouseEvent = events[i];
var index:int = indices[i];
// Check event type
switch (mouseEvent.type) {
case "mouseDown":
defineTarget(index);
if (target != null) {
propagateEvent(MouseEvent3D.MOUSE_DOWN, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
}
pressedTarget = target;
break;
case "mouseWheel":
defineTarget(index);
if (target != null) {
propagateEvent(MouseEvent3D.MOUSE_WHEEL, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
}
break;
case "click":
defineTarget(index);
if (target != null) {
propagateEvent(MouseEvent3D.MOUSE_UP, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
if (pressedTarget == target) {
clickedTarget = target;
propagateEvent(MouseEvent3D.CLICK, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
}
}
pressedTarget = null;
break;
case "doubleClick":
defineTarget(index);
if (target != null) {
propagateEvent(MouseEvent3D.MOUSE_UP, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
if (pressedTarget == target) {
propagateEvent(clickedTarget == target && target.doubleClickEnabled ? MouseEvent3D.DOUBLE_CLICK : MouseEvent3D.CLICK, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
}
}
clickedTarget = null;
pressedTarget = null;
break;
case "mouseMove":
defineTarget(index);
if (target != null) {
propagateEvent(MouseEvent3D.MOUSE_MOVE, mouseEvent, camera, target, targetSurface, branchToVector(target, branch));
}
if (overedTarget != target) {
processOverOut(mouseEvent, camera);
}
break;
case "mouseOut":
lastEvent = null;
target = null;
targetSurface = null;
if (overedTarget != target) {
processOverOut(mouseEvent, camera);
}
break;
case "render":
defineTarget(index);
if (overedTarget != target) {
processOverOut(mouseEvent, camera);
}
break;
}
target = null;
targetSurface = null;
targetDepth = camera.farClipping;
}
}
// Reset surfaces
surfaces.length = 0;
surfacesLength = 0;
// Reset events
events.length = 0;
eventsLength = 0;
// Reset rays
for (i = 0; i < raysLength; i++) {
raysSurfaces[i].length = 0;
raysDepths[i].length = 0;
}
raysLength = 0;
}
/**
* Calculates depth of every ray to every surface and writes it to the rayDepths property
*
* @param context
* @param camera
* @param contextWidth
* @param contextHeight
*/
private function calculateSurfacesDepths(context:Context3D, camera:Camera3D, contextWidth:int, contextHeight:int):void {
// Clear
context.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);
context.setCulling(Context3DTriangleFace.FRONT);
context.setTextureAt(0, null);
context.setTextureAt(1, null);
context.setTextureAt(2, null);
context.setTextureAt(3, null);
context.setTextureAt(4, null);
context.setTextureAt(5, null);
context.setTextureAt(6, null);
context.setTextureAt(7, null);
context.setVertexBufferAt(0, null);
context.setVertexBufferAt(1, null);
context.setVertexBufferAt(2, null);
context.setVertexBufferAt(3, null);
context.setVertexBufferAt(4, null);
context.setVertexBufferAt(5, null);
context.setVertexBufferAt(6, null);
context.setVertexBufferAt(7, null);
if (context != cachedContext3D) {
// Get properties.
cachedContext3D = context;
context3DViewProperties = properties[cachedContext3D];
if (context3DViewProperties == null) {
context3DViewProperties = new Context3DViewProperties();
var rectGeometry:Geometry = new Geometry(4);
rectGeometry.addVertexStream([VertexAttributes.POSITION, VertexAttributes.POSITION, VertexAttributes.POSITION, VertexAttributes.TEXCOORDS[0], VertexAttributes.TEXCOORDS[0]]);
rectGeometry.setAttributeValues(VertexAttributes.POSITION, Vector.([0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1]));
rectGeometry.setAttributeValues(VertexAttributes.TEXCOORDS[0], Vector.([0, 0, 0, 1, 1, 1, 1, 0]));
rectGeometry.indices = Vector.([0, 1, 3, 2, 3, 1]);
rectGeometry.upload(context);
vLinker = new Linker(Context3DProgramType.VERTEX);
vLinker.addProcedure(Procedure.compileFromArray([
"#a0=a0",
"#c0=c0",
"mul t0.x, a0.x, c0.x",
"mul t0.y, a0.y, c0.y",
"add o0.x, t0.x, c0.z",
"add o0.y, t0.y, c0.w",
"mov o0.z, a0.z",
"mov o0.w, a0.z",
]));
fLinker = new Linker(Context3DProgramType.FRAGMENT);
fLinker.addProcedure(Procedure.compileFromArray([
"#c0=c0",
"mov o0, c0",
]));
var coloredRectProgram:ShaderProgram = new ShaderProgram(vLinker, fLinker);
coloredRectProgram.upload(context);
context3DViewProperties.drawRectGeometry = rectGeometry;
context3DViewProperties.drawColoredRectProgram = coloredRectProgram;
properties[cachedContext3D] = context3DViewProperties;
}
}
var drawRectGeometry:Geometry = context3DViewProperties.drawRectGeometry;
var drawColoredRectProgram:ShaderProgram = context3DViewProperties.drawColoredRectProgram;
// Rectangle
var vLinker:Linker, fLinker:Linker;
// Constants
var m0:Number = camera.m0;
var m5:Number = camera.m5;
var m10:Number = camera.m10;
var m11:Number = camera.m14;
var kZ:Number = 255/camera.farClipping;
var fragmentConst:Number = 1/255;
// Loop the unique rays
var i:int;
var j:int;
var pixelIndex:int = 0;
for (i = 0; i < raysLength; i++) {
var rayCoefficients:Point = raysCoefficients[i];
// Draws the surface of the ray
for (j = 0; j < surfacesLength; j++) {
if (pixelIndex == 0) {
// Set constants
drawColoredRectConst[0] = raysLength*surfacesLength*2/contextWidth;
drawColoredRectConst[1] = -2/contextHeight;
// Fill background with blue color
context.setDepthTest(false, Context3DCompareMode.ALWAYS);
context.setProgram(drawColoredRectProgram.program);
context.setVertexBufferAt(0, drawRectGeometry.getVertexBuffer(VertexAttributes.POSITION), drawRectGeometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]);
context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, drawColoredRectConst);
drawRectColor[0] = 0;
drawRectColor[1] = 0;
drawRectColor[2] = 1;
drawRectColor[3] = 1;
context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, drawRectColor);
context.drawTriangles(drawRectGeometry._indexBuffer, 0, 2);
context.setVertexBufferAt(0, null);
context.setDepthTest(true, Context3DCompareMode.LESS);
}
scissor.x = pixelIndex;
context.setScissorRectangle(scissor);
drawSurface(context, camera, j, m0, m5, m10, m11, (pixelIndex*2/contextWidth - rayCoefficients.x), rayCoefficients.y, kZ, fragmentConst, camera.orthographic);
raysIs[pixelIndex] = i;
raysJs[pixelIndex] = j;
pixelIndex++;
if (pixelIndex >= contextWidth || i >= raysLength - 1 && j >= surfacesLength - 1) {
// get
var pixel:BitmapData = pixels[pixelIndex];
if (pixel == null) {
pixel = new BitmapData(pixelIndex, 1, false, 0xFF);
pixels[pixelIndex] = pixel;
}
context.drawToBitmapData(pixel);
for (var k:int = 0; k < pixelIndex; k++) {
var color:int = pixel.getPixel(k, 0);
var red:int = (color >> 16) & 0xFF;
var green:int = (color >> 8) & 0xFF;
var blue:int = color & 0xFF;
if (blue == 0) {
var ind:int = raysIs[k];
var raySurfaces:Vector. = raysSurfaces[ind];
var rayDepths:Vector. = raysDepths[ind];
ind = raysJs[k];
raySurfaces.push(surfaces[ind]);
rayDepths.push((red + green/255)/kZ);
}
}
pixelIndex = 0;
}
}
}
context.setScissorRectangle(null);
// Overlaying by background color
context.setDepthTest(true, Context3DCompareMode.ALWAYS);
context.setProgram(drawColoredRectProgram.program);
context.setVertexBufferAt(0, drawRectGeometry.getVertexBuffer(VertexAttributes.POSITION), drawRectGeometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]);
drawColoredRectConst[0] = raysLength*surfacesLength*2/contextWidth;
drawColoredRectConst[1] = -2/contextHeight;
context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, drawColoredRectConst);
var r:Number = ((backgroundColor >> 16) & 0xff)/0xff;
var g:Number = ((backgroundColor >> 8) & 0xff)/0xff;
var b:Number = (backgroundColor & 0xff)/0xff;
if (canvas != null) {
drawRectColor[0] = backgroundAlpha*r;
drawRectColor[1] = backgroundAlpha*g;
drawRectColor[2] = backgroundAlpha*b;
} else {
drawRectColor[0] = r;
drawRectColor[1] = g;
drawRectColor[2] = b;
}
drawRectColor[3] = backgroundAlpha;
context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, drawRectColor);
context.drawTriangles(drawRectGeometry._indexBuffer, 0, 2);
context.setVertexBufferAt(0, null);
}
private function drawSurface(context:Context3D, camera:Camera3D, index:int, m0:Number, m5:Number, m10:Number, m14:Number, xOffset:Number, yOffset:Number, vertexConst:Number, fragmentConst:Number, orthographic:Boolean):void {
// Surface
var surface:Surface = surfaces[index];
var geometry:Geometry = geometries[index];
var procedure:Procedure = procedures[index];
var object:Object3D = surface.object;
// Program
var drawDistanceProgram:ShaderProgram = context3DViewProperties.drawDistancePrograms[procedure];
if (drawDistanceProgram == null) {
// Assembling the vertex shader
var vertex:Linker = new Linker(Context3DProgramType.VERTEX);
var position:String = "position";
vertex.declareVariable(position, VariableType.ATTRIBUTE);
if (procedure != null) {
vertex.addProcedure(procedure);
vertex.declareVariable("localPosition", VariableType.TEMPORARY);
vertex.setInputParams(procedure, position);
vertex.setOutputParams(procedure, "localPosition");
position = "localPosition";
}
vertex.addProcedure(drawDistanceVertexProcedure);
vertex.setInputParams(drawDistanceVertexProcedure, position);
// Assembling the prgram
drawDistanceProgram = new ShaderProgram(vertex, drawDistanceFragment);
drawDistanceProgram.fragmentShader.varyings = drawDistanceProgram.vertexShader.varyings;
drawDistanceProgram.upload(context);
context3DViewProperties.drawDistancePrograms[procedure] = drawDistanceProgram;
}
var buffer:VertexBuffer3D = geometry.getVertexBuffer(VertexAttributes.POSITION);
if (buffer == null) return;
// Draw call (it is required for setting constants only)
drawUnit.vertexBuffersLength = 0;
drawUnit.vertexConstantsRegistersCount = 0;
drawUnit.fragmentConstantsRegistersCount = 0;
object.setTransformConstants(drawUnit, surface, drawDistanceProgram.vertexShader, camera);
drawUnit.setVertexConstantsFromTransform(drawDistanceProgram.vertexShader.getVariableIndex("transform0"), object.localToCameraTransform);
drawUnit.setVertexConstantsFromNumbers(drawDistanceProgram.vertexShader.getVariableIndex("coefficient"), xOffset, yOffset, vertexConst, orthographic ? 1 : 0);
drawUnit.setVertexConstantsFromNumbers(drawDistanceProgram.vertexShader.getVariableIndex("projection"), m0, m5, m10, m14);
drawUnit.setFragmentConstantsFromNumbers(drawDistanceProgram.fragmentShader.getVariableIndex("code"), fragmentConst, 0, 0, 1);
context.setProgram(drawDistanceProgram.program);
// Buffers
var i:int;
context.setVertexBufferAt(0, buffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]);
for (i = 0; i < drawUnit.vertexBuffersLength; i++) {
context.setVertexBufferAt(drawUnit.vertexBuffersIndexes[i], drawUnit.vertexBuffers[i], drawUnit.vertexBuffersOffsets[i], drawUnit.vertexBuffersFormats[i]);
}
context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, drawUnit.vertexConstants, drawUnit.vertexConstantsRegistersCount);
context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, drawUnit.fragmentConstants, drawUnit.fragmentConstantsRegistersCount);
context.drawTriangles(geometry._indexBuffer, surface.indexBegin, surface.numTriangles);
// Clearing
context.setVertexBufferAt(0, null);
for (i = 0; i < drawUnit.vertexBuffersLength; i++) {
context.setVertexBufferAt(drawUnit.vertexBuffersIndexes[i], null);
}
}
private function sort(surfaces:Vector., depths:Vector., length:int):void {
stack[0] = 0;
stack[1] = length - 1;
var index:int = 2;
while (index > 0) {
index--;
var r:int = stack[index];
var j:int = r;
index--;
var l:int = stack[index];
var i:int = l;
var median:Number = depths[(r + l) >> 1];
while (i <= j) {
var left:Number = depths[i];
while (left > median) {
i++;
left = depths[i];
}
var right:Number = depths[j];
while (right < median) {
j--;
right = depths[j];
}
if (i <= j) {
depths[i] = right;
depths[j] = left;
var surface:Surface = surfaces[i];
surfaces[i] = surfaces[j];
surfaces[j] = surface;
i++;
j--;
}
}
if (l < j) {
stack[index] = l;
index++;
stack[index] = j;
index++;
}
if (i < r) {
stack[index] = i;
index++;
stack[index] = r;
index++;
}
}
}
private function processOverOut(mouseEvent:MouseEvent, camera:Camera3D):void {
branchToVector(target, branch);
branchToVector(overedTarget, overedBranch);
var branchLength:int = branch.length;
var overedBranchLength:int = overedBranch.length;
var changedBranchLength:int;
var i:int;
var j:int;
var object:Object3D;
if (overedTarget != null) {
propagateEvent(MouseEvent3D.MOUSE_OUT, mouseEvent, camera, overedTarget, overedTargetSurface, overedBranch, true, target);
changedBranchLength = 0;
for (i = 0; i < overedBranchLength; i++) {
object = overedBranch[i];
for (j = 0; j < branchLength; j++) if (object == branch[j]) break;
if (j == branchLength) {
changedBranch[changedBranchLength] = object;
changedBranchLength++;
}
}
if (changedBranchLength > 0) {
changedBranch.length = changedBranchLength;
propagateEvent(MouseEvent3D.ROLL_OUT, mouseEvent, camera, overedTarget, overedTargetSurface, changedBranch, false, target);
}
}
if (target != null) {
changedBranchLength = 0;
for (i = 0; i < branchLength; i++) {
object = branch[i];
for (j = 0; j < overedBranchLength; j++) if (object == overedBranch[j]) break;
if (j == overedBranchLength) {
changedBranch[changedBranchLength] = object;
changedBranchLength++;
}
}
if (changedBranchLength > 0) {
changedBranch.length = changedBranchLength;
propagateEvent(MouseEvent3D.ROLL_OVER, mouseEvent, camera, target, targetSurface, changedBranch, false, overedTarget);
}
propagateEvent(MouseEvent3D.MOUSE_OVER, mouseEvent, camera, target, targetSurface, branch, true, overedTarget);
useHandCursor = target.useHandCursor;
} else {
useHandCursor = false;
}
Mouse.cursor = Mouse.cursor;
overedTarget = target;
overedTargetSurface = targetSurface;
}
private function branchToVector(object:Object3D, vector:Vector.):Vector. {
var len:int = 0;
while (object != null) {
vector[len] = object;
len++;
object = object._parent;
}
vector.length = len;
return vector;
}
private function propagateEvent(type:String, mouseEvent:MouseEvent, camera:Camera3D, target:Object3D, targetSurface:Surface, objects:Vector., bubbles:Boolean = true, relatedObject:Object3D = null):void {
var oblectsLength:int = objects.length;
var object:Object3D;
var vector:Vector.;
var length:int;
var i:int;
var j:int;
var mouseEvent3D:MouseEvent3D;
// Capture
for (i = oblectsLength - 1; i > 0; i--) {
object = objects[i];
if (object.captureListeners != null) {
vector = object.captureListeners[type];
if (vector != null) {
if (mouseEvent3D == null) {
calculateLocalCoords(camera, target.cameraToLocalTransform, targetDepth, mouseEvent);
mouseEvent3D = new MouseEvent3D(type, bubbles, localCoords.x, localCoords.y, localCoords.z, relatedObject, mouseEvent.ctrlKey, mouseEvent.altKey, mouseEvent.shiftKey, mouseEvent.buttonDown, mouseEvent.delta);
mouseEvent3D._target = target;
mouseEvent3D._surface = targetSurface;
}
mouseEvent3D._currentTarget = object;
mouseEvent3D._eventPhase = 1;
length = vector.length;
for (j = 0; j < length; j++) functions[j] = vector[j];
for (j = 0; j < length; j++) {
(functions[j] as Function).call(null, mouseEvent3D);
if (mouseEvent3D.stopImmediate) return;
}
if (mouseEvent3D.stop) return;
}
}
}
// Bubble
for (i = 0; i < oblectsLength; i++) {
object = objects[i];
if (object.bubbleListeners != null) {
vector = object.bubbleListeners[type];
if (vector != null) {
if (mouseEvent3D == null) {
calculateLocalCoords(camera, target.cameraToLocalTransform, targetDepth, mouseEvent);
mouseEvent3D = new MouseEvent3D(type, bubbles, localCoords.x, localCoords.y, localCoords.z, relatedObject, mouseEvent.ctrlKey, mouseEvent.altKey, mouseEvent.shiftKey, mouseEvent.buttonDown, mouseEvent.delta);
mouseEvent3D._target = target;
mouseEvent3D._surface = targetSurface;
}
mouseEvent3D._currentTarget = object;
mouseEvent3D._eventPhase = (i == 0) ? 2 : 3;
length = vector.length;
for (j = 0; j < length; j++) functions[j] = vector[j];
for (j = 0; j < length; j++) {
(functions[j] as Function).call(null, mouseEvent3D);
if (mouseEvent3D.stopImmediate) return;
}
if (mouseEvent3D.stop) return;
}
}
}
}
private function calculateLocalCoords(camera:Camera3D, transform:Transform3D, z:Number, mouseEvent:MouseEvent):void {
var x:Number;
var y:Number;
if (!camera.orthographic) {
x = z*(mouseEvent.localX - _width*0.5)/camera.focalLength;
y = z*(mouseEvent.localY - _height*0.5)/camera.focalLength;
} else {
x = mouseEvent.localX - _width*0.5;
y = mouseEvent.localY - _height*0.5;
}
localCoords.x = transform.a*x + transform.b*y + transform.c*z + transform.d;
localCoords.y = transform.e*x + transform.f*y + transform.g*z + transform.h;
localCoords.z = transform.i*x + transform.j*y + transform.k*z + transform.l;
}
private function defineTarget(index:int):void {
var source:Object3D;
// Get surfaces
var surfaces:Vector. = raysSurfaces[index];
var depths:Vector. = raysDepths[index];
// Loop surfaces
for (var i:int = surfaces.length - 1; i >= 0; i--) {
var surface:Surface = surfaces[i];
var depth:Number = depths[i];
var object:Object3D = surface.object;
var potentialTarget:Object3D = null;
var obj:Object3D;
// Get possible target
for (obj = object; obj != null; obj = obj._parent) {
if (!obj.mouseChildren) potentialTarget = null;
if (potentialTarget == null && obj.mouseEnabled) potentialTarget = obj;
}
// If possible target found
if (potentialTarget != null) {
if (target != null) {
for (obj = potentialTarget; obj != null; obj = obj._parent) {
if (obj == target) {
source = object;
if (target != potentialTarget) {
target = potentialTarget;
targetSurface = surface;
targetDepth = depth;
}
break;
}
}
} else {
source = object;
target = potentialTarget;
targetSurface = surface;
targetDepth = depth;
}
if (source == target) break;
}
}
}
/**
* If true, image will render to Bitmap object which will included into the view as a child. It also will available through canvas property.
*
* @see #canvas
*/
public function get renderToBitmap():Boolean {
return _canvas != null;
}
/**
* @private
*/
public function set renderToBitmap(value:Boolean):void {
if (value) {
if (_canvas == null) createRenderBitmap();
} else {
if (_canvas != null) {
container.bitmapData = null;
_canvas.dispose();
_canvas = null;
}
}
}
/**
* BitmapData with rendered image in case of renderToBitmap turned on.
*
* @see #renderToBitmap
*/
public function get canvas():BitmapData {
return _canvas;
}
/**
* Places Alternativa3D logo into the view.
*/
public function showLogo():void {
if (logo == null) {
logo = new Logo();
super.addChild(logo);
resizeLogo();
}
}
/**
* Places Alternativa3D logo from the view.
*/
public function hideLogo():void {
if (logo != null) {
super.removeChild(logo);
logo = null;
}
}
/**
* Alinging the logo. Constants of StageAlign class can be used as a value to set.
*/
public function get logoAlign():String {
return _logoAlign;
}
/**
* @private
*/
public function set logoAlign(value:String):void {
_logoAlign = value;
resizeLogo();
}
/**
* Horizontal margin.
*/
public function get logoHorizontalMargin():Number {
return _logoHorizontalMargin;
}
/**
* @private
*/
public function set logoHorizontalMargin(value:Number):void {
_logoHorizontalMargin = value;
resizeLogo();
}
/**
* Vertical margin.
*/
public function get logoVerticalMargin():Number {
return _logoVerticalMargin;
}
/**
* @private
*/
public function set logoVerticalMargin(value:Number):void {
_logoVerticalMargin = value;
resizeLogo();
}
private function resizeLogo():void {
if (logo != null) {
if (_logoAlign == StageAlign.TOP_LEFT || _logoAlign == StageAlign.LEFT || _logoAlign == StageAlign.BOTTOM_LEFT) {
logo.x = Math.round(_logoHorizontalMargin);
}
if (_logoAlign == StageAlign.TOP || _logoAlign == StageAlign.BOTTOM) {
logo.x = Math.round((_width - logo.width)/2);
}
if (_logoAlign == StageAlign.TOP_RIGHT || _logoAlign == StageAlign.RIGHT || _logoAlign == StageAlign.BOTTOM_RIGHT) {
logo.x = Math.round(_width - _logoHorizontalMargin - logo.width);
}
if (_logoAlign == StageAlign.TOP_LEFT || _logoAlign == StageAlign.TOP || _logoAlign == StageAlign.TOP_RIGHT) {
logo.y = Math.round(_logoVerticalMargin);
}
if (_logoAlign == StageAlign.LEFT || _logoAlign == StageAlign.RIGHT) {
logo.y = Math.round((_height - logo.height)/2);
}
if (_logoAlign == StageAlign.BOTTOM_LEFT || _logoAlign == StageAlign.BOTTOM || _logoAlign == StageAlign.BOTTOM_RIGHT) {
logo.y = Math.round(_height - _logoVerticalMargin - logo.height);
}
}
}
/**
* Width of this View. Should be 50 at least.
*/
override public function get width():Number {
return _width;
}
/**
* @private
*/
override public function set width(value:Number):void {
if (value < 50) value = 50;
_width = value;
area.width = value;
resizeLogo();
}
/**
* Height of this View. Should be 50 at least.
*/
override public function get height():Number {
return _height;
}
/**
* @private
*/
override public function set height(value:Number):void {
if (value < 50) value = 50;
_height = value;
area.height = value;
resizeLogo();
}
/**
* @private
*/
override public function addChild(child:DisplayObject):DisplayObject {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function removeChild(child:DisplayObject):DisplayObject {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function addChildAt(child:DisplayObject, index:int):DisplayObject {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function removeChildAt(index:int):DisplayObject {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function removeChildren(beginIndex:int = 0, endIndex:int = 2147483647):void {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function getChildAt(index:int):DisplayObject {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function getChildIndex(child:DisplayObject):int {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function setChildIndex(child:DisplayObject, index:int):void {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function swapChildren(child1:DisplayObject, child2:DisplayObject):void {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function swapChildrenAt(index1:int, index2:int):void {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function get numChildren():int {
return 0;
}
/**
* @private
*/
override public function getChildByName(name:String):DisplayObject {
throw new Error("Unsupported operation.");
}
/**
* @private
*/
override public function contains(child:DisplayObject):Boolean {
throw new Error("Unsupported operation.");
}
}
}
import alternativa.engine3d.materials.ShaderProgram;
import alternativa.engine3d.resources.Geometry;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.utils.Dictionary;
class Logo extends Sprite {
static public const image:BitmapData = createBMP();
static private function createBMP():BitmapData {
var bmp:BitmapData = new BitmapData(165, 27, true, 0);
bmp.setVector(bmp.rect, Vector.([
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,134217728,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,419430400,721420288,788529152,536870912,234881024,50331648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1677721600,503316480,503316480,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,67108864,301989888,822083584,1677721600,2365587456,2483027968,1996488704,1241513984,536870912,117440512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,167772160,520093696,822083584,905969664,822083584,520093696,301989888,520093696,822083584,905969664,822083584,620756992,620756992,721420288,620756992,620756992,721420288,620756992,620756992,721420288,620756992,620756992,822083584,905969664,822083584,520093696,218103808,234881024,536870912,721420288,620756992,620756992,822083584,905969664,822083584,520093696,301989888,520093696,822083584,1493172224,2768240640,4292467161,2533359616,822083584,822083584,2533359616,4292467161,2768240640,1493172224,822083584,620756992,620756992,721420288,503316480,268435456,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,620756992,1392508928,2248146944,3514129719,4192520610,4277921461,3886715221,2905283846,1778384896,788529152,234881024,50331648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167772160,822083584,1845493760,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2734686208,2533359616,2164260864,2164260864,2348810240,2164260864,2164260864,2348810240,2164260864,2164260864,2348810240,2164260864,2164260864,2533359616,2734686208,2533359616,1845493760,1056964608,1107296256,1895825408,2348810240,2164260864,2164260864,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2952790016,3730463322,4292467161,2734686208,905969664,905969664,2734686208,4292467161,3730463322,2952790016,2533359616,2164260864,2164260864,2348810240,1677721600,989855744,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,16777216,167772160,754974720,1828716544,3022988562,4022445697,4294959283,4294953296,4294953534,4294961056,4226733479,3463135252,2130706432,1224736768,486539264,83886080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,520093696,1845493760,3665591420,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,3816191606,3355443200,4292467161,3355443200,3355443200,4292467161,3355443200,3355443200,4292467161,3355443200,3816191606,4292467161,4292467161,4292467161,3665591420,2382364672,2415919104,3801125008,4292467161,3355443200,3816191606,4292467161,4292467161,4292467161,3495911263,2650800128,3665591420,4292467161,4292467161,4292467161,4292467161,2533359616,822083584,822083584,2533359616,4292467161,4292467161,4292467161,4292467161,3816191606,3355443200,4292467161,2533359616,1627389952,2533359616,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,50331648,251658240,889192448,1962934272,3463338042,4260681651,4294955128,4294949388,4294949120,4294948864,4294948864,4294953816,4294960063,3903219779,2701722370,1627389952,620756992,100663296,0,0,0,0,0,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,3730463322,3187671040,3730463322,4292467161,3456106496,4292467161,3849680245,3221225472,3849680245,4292467161,3640655872,4292467161,3640655872,3640655872,4292467161,3640655872,3640655872,4292467161,3640655872,4292467161,3966923378,3640655872,3966923378,4292467161,3355443200,3918236555,4292467161,3763951961,3539992576,4292467161,3966923378,3640655872,3966923378,4292467161,3456106496,4292467161,3849680245,3221225472,3422552064,3456106496,2348810240,721420288,721420288,2348810240,3456106496,3422552064,3221225472,3849680245,4292467161,3640655872,4292467161,2734686208,1828716544,2734686208,4292467161,2734686208,905969664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,50331648,318767104,1006632960,2080374784,3683940948,4294958002,4294949951,4294946816,4294946048,4294944256,4294944256,4294945536,4294944512,4294944799,4294954914,4123823487,3056010753,1778384896,671088640,117440512,0,0,0,0,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,3187671040,2734686208,3187671040,4292467161,3640655872,4292467161,3221225472,2801795072,3221225472,4292467161,3640655872,4292467161,3966923378,3640655872,4292467161,3966923378,3640655872,4292467161,3640655872,4292467161,3640655872,4292467161,4292467161,4292467161,3640655872,4292467161,3613154396,2818572288,3221225472,4292467161,3640655872,4292467161,4292467161,4292467161,3640655872,4292467161,3221225472,2801795072,3221225472,4292467161,2533359616,822083584,822083584,2533359616,4292467161,3221225472,2801795072,3221225472,4292467161,3640655872,4292467161,2952790016,2264924160,2952790016,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,50331648,318767104,1056964608,2147483648,3819605095,4294955172,4294944795,4294943744,4294941184,4294939392,4294940672,4294940160,4294938624,4294941440,4294940672,4294936323,4294815095,4208955271,3208382211,1845493760,721420288,134217728,0,0,0,0,0,0,0,0,0,0,0,721420288,2348810240,3456106496,3405774848,3187671040,3730463322,4292467161,3456106496,4292467161,3849680245,3221225472,3849680245,4292467161,3355443200,3816191606,4292467161,3966923378,3966923378,4292467161,3966923378,4292467161,3640655872,4292467161,3966923378,3640655872,3640655872,3640655872,3640655872,4292467161,2868903936,1996488704,2684354560,4292467161,3966923378,3640655872,3640655872,3539992576,3456106496,4292467161,3849680245,3221225472,3849680245,4292467161,2533359616,822083584,822083584,2533359616,4292467161,3849680245,3221225472,3849680245,4292467161,3456106496,4292467161,3730463322,3187671040,3405774848,3456106496,2348810240,721420288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,16777216,234881024,989855744,2147483648,3836647021,4294952084,4294939916,4294939392,4294936064,4294935808,4294939907,3970992676,3783616794,4260594952,4294933248,4294937088,4294937088,4294865664,4294676569,4243165579,3292924164,1862270976,721420288,134217728,0,0,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,3665591420,2348810240,2348810240,3665591420,4292467161,3355443200,3816191606,4292467161,4292467161,3355443200,3816191606,4292467161,4292467161,4292467161,3696908890,3355443200,4292467161,2533359616,1325400064,1845493760,3665591420,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,3665591420,1845493760,520093696,520093696,1845493760,3665591420,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,150994944,855638016,2063597568,3785853032,4294949263,4294935301,4294934528,4294931200,4294865408,4294739211,3598869795,2348810240,2248146944,3157861897,4158024716,4294930432,4294934272,4294934016,4294796032,4294604868,4260400774,3309963524,1862270976,704643072,117440512,0,0,0,0,0,0,0,0,0,905969664,2734686208,4292467161,3730463322,2952790016,2533359616,1845493760,1325400064,1845493760,2533359616,2734686208,2533359616,1845493760,1006632960,1006632960,1845493760,2348810240,2164260864,2164260864,2533359616,2533359616,2164260864,2164260864,2533359616,2734686208,2533359616,2164260864,2164260864,2348810240,1677721600,671088640,822083584,1845493760,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2734686208,2533359616,1845493760,822083584,167772160,167772160,822083584,1845493760,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2952790016,3730463322,4292467161,2734686208,905969664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,117440512,738197504,1962934272,3632951638,4294947982,4294931462,4294930176,4294794752,4294662144,4260327185,3378071325,1946157056,922746880,822083584,1677721600,2785937666,3954400527,4294929408,4294931968,4294931712,4294661120,4294469180,4260200571,3208316675,1795162112,620756992,83886080,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,2768240640,1493172224,822083584,520093696,301989888,520093696,822083584,905969664,822083584,520093696,184549376,184549376,520093696,721420288,620756992,620756992,822083584,822083584,620756992,620756992,822083584,905969664,822083584,620756992,620756992,721420288,503316480,150994944,167772160,520093696,822083584,905969664,822083584,520093696,301989888,520093696,822083584,905969664,822083584,520093696,167772160,16777216,16777216,167772160,520093696,822083584,905969664,822083584,520093696,301989888,520093696,822083584,1493172224,2768240640,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,67108864,620756992,1811939328,3429059385,4294882972,4294796301,4294727936,4294526208,4294325760,4226241553,3242276118,1862270976,738197504,150994944,100663296,520093696,1325400064,2264924160,3768667144,4294928385,4294929408,4294796800,4294460416,4294335293,4225986666,3055813377,1644167168,503316480,50331648,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,16777216,335544320,1459617792,3005750036,4243500445,4294661403,4294524672,4294258432,4294121728,4259985678,3259118102,1845493760,704643072,134217728,0,0,50331648,335544320,1006632960,2080374784,3751757574,4294794241,4294794240,4294592771,4294323463,4294400588,4123811671,2769158144,1275068416,251658240,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,134217728,503316480,721420288,503316480,268435456,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,520093696,167772160,16777216,0,0,0,0,0,0,0,0,134217728,503316480,721420288,520093696,234881024,285212672,570425344,687865856,436207616,117440512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,150994944,922746880,2348810240,4056321414,4294197820,4294119936,4294056448,4293921536,4293991688,3394978333,1879048192,704643072,117440512,0,0,0,0,33554432,268435456,1023410176,2248146944,3869450497,4293927168,4293661957,4293331976,4293330946,4293609799,3936365867,2181038080,822083584,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1744830464,1140850688,1744830464,2348810240,1744830464,637534208,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1744830464,637534208,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1811939328,771751936,150994944,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1811939328,1040187392,1207959552,1979711488,2248146944,1509949440,436207616,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,50331648,620756992,1879048192,3649264467,4294272360,4293853184,4293920000,4293920000,4293918720,3649195041,1979711488,754974720,134217728,0,0,0,0,0,67108864,335544320,1023410176,2080374784,3036676096,4088070144,4292476928,4292608000,4292739072,4292804608,4293347915,3581022738,1879048192,654311424,83886080,0,0,0,0,0,0,0,0,50331648,201326592,335544320,201326592,50331648,0,822083584,2533359616,4294967295,3261885548,2080374784,2768240640,4294967295,3261885548,1258291200,234881024,117440512,402653184,671088640,687865856,469762048,184549376,33554432,0,83886080,318767104,419430400,352321536,469762048,620756992,620756992,520093696,335544320,150994944,50331648,0,0,50331648,201326592,335544320,201326592,50331648,0,822083584,2533359616,4294967295,3295439980,1610612736,872415232,520093696,318767104,301989888,167772160,33554432,0,33554432,167772160,301989888,167772160,33554432,50331648,201326592,335544320,201326592,50331648,0,0,0,50331648,184549376,469762048,704643072,704643072,469762048,184549376,855638016,2533359616,4294809856,3566287616,1493172224,335544320,0,0,50331648,234881024,402653184,234881024,50331648,0,822083584,2550136832,4294809856,3583064832,2147483648,2382364672,3921236224,4209802240,2181038080,687865856,184549376,469762048,704643072,704643072,469762048,184549376,50331648,50331648,234881024,520093696,671088640,704643072,822083584,889192448,771751936,721420288,805306368,771751936,520093696,234881024,50331648,0,
0,0,0,268435456,1358954496,3023117852,4260334217,4293854213,4293919488,4293921024,4293853184,4055516443,2348810240,939524096,150994944,0,0,0,0,33554432,201326592,671088640,1442840576,2264924160,3513790764,3356295425,3473866752,4207017984,4292673536,4292804608,4292870144,4292937479,4276240705,3174499075,1610612736,419430400,0,0,0,0,0,0,0,83886080,452984832,1157627904,1577058304,1174405120,486539264,83886080,905969664,2734686208,4294967295,3479528805,2533359616,3087007744,4294967295,3429394536,1543503872,520093696,754974720,1610612736,2248146944,2298478592,1845493760,1107296256,385875968,150994944,587202560,1409286144,1644167168,1442840576,1761607680,2147483648,2147483648,1962934272,1593835520,1040187392,385875968,50331648,83886080,452984832,1157627904,1577058304,1174405120,486539264,234881024,1191182336,2868903936,4294967295,3630326370,2734686208,2432696320,1962934272,1526726656,1392508928,822083584,167772160,0,167772160,822083584,1392508928,1073741824,436207616,503316480,1157627904,1577058304,1174405120,486539264,83886080,0,83886080,452984832,1140850688,1845493760,2315255808,2315255808,1845493760,1140850688,1375731712,2818572288,4294804480,3666292992,1744830464,419430400,0,100663296,520093696,1275068416,1694498816,1291845632,536870912,234881024,1191182336,2868903936,4294804480,3783471360,2952790016,3768006912,4294606336,3681495040,2130706432,1023410176,1140850688,1845493760,2315255808,2315255808,1845493760,1140850688,469762048,335544320,1006632960,1879048192,2248146944,2298478592,2533359616,2667577344,2449473536,2332033024,2499805184,2449473536,1962934272,1191182336,419430400,50331648,
0,0,83886080,754974720,2181038080,3971250292,4293995053,4293853184,4293855488,4293591040,4208406034,2938050314,1426063360,335544320,16777216,0,0,50331648,234881024,620756992,1207959552,2013265920,3107396370,4055000155,4293554803,4003672881,3221225472,3544186880,4292673536,4292804608,4292870144,4292870144,4293006099,4122616354,2600796160,1023410176,134217728,0,0,0,0,0,67108864,520093696,1560281088,2685209869,3768886436,2736133654,1644167168,603979776,1006632960,2734686208,4294967295,3630326370,2952790016,3630326370,4294967295,3429394536,1711276032,1191182336,1979711488,3531768450,4140814287,4140945873,3801519766,2584349194,1493172224,1006632960,1728053248,3380576127,3769610159,2734686208,3752175013,4022386880,4022386880,3886721706,3513806960,2739028546,1140850688,285212672,520093696,1560281088,2685209869,3768886436,2736133654,1644167168,1107296256,1996488704,3579994722,4294967295,3780992349,3456106496,4294967295,3596837731,3173130786,3600916897,1828716544,553648128,50331648,553648128,1828716544,3600916897,2620009002,1509949440,1694498816,2685209869,3768886436,2736133654,1644167168,603979776,150994944,503316480,1543503872,2889486848,3767873792,4175254272,4175254272,3767873792,2889486848,2399141888,3120562176,4294798592,3632408576,1694498816,402653184,83886080,587202560,1644167168,2786133248,3870512384,2870872320,1711276032,1140850688,2013265920,3682543616,4294798592,3866764800,3456106496,4294798592,4054399232,3338665984,2516582400,2097152000,2889486848,3767873792,4175254272,4175254272,3767873792,2889486848,1660944384,1275068416,2097152000,3836689152,4192360448,3422552064,4294798592,4294798592,4192360448,3970513152,4294798592,4192360448,3903601152,2788757760,1174405120,234881024,
0,0,335544320,1493172224,3259970090,4294206305,4293591040,4293263872,4292935936,4292806915,3648730389,1862270976,620756992,117440512,117440512,285212672,553648128,922746880,1392508928,2063597568,2938704652,3834466116,4276189301,4292948534,4293067009,4293740360,3732214294,3187671040,3918004480,4293132288,4293066752,4292935680,4292870144,4293073434,3681683208,1879048192,536870912,33554432,0,0,0,16777216,402653184,1509949440,2869890831,4106733511,4277729528,4157920468,3022135842,1644167168,1392508928,2751463424,4294967295,3730726494,3271557120,4294967295,4294967295,3429394536,2030043136,2147483648,3768820643,4209699562,3832574064,3815599469,4260820726,3970410407,2936999695,2499805184,3464001656,4022189501,3578678862,3355443200,4294967295,3747569503,3426828609,3426828609,4004030632,3784347792,1996488704,922746880,1509949440,2869890831,4106733511,4277729528,4157920468,3022135842,2348810240,2768240640,4294967295,4294967295,3847969627,3640655872,4294967295,3847969627,4020084125,4260820726,2888510251,1157627904,335544320,1157627904,2888510251,4260820726,3852772516,2734686208,3004174352,4106733511,4277729528,4157920468,3022135842,1644167168,721420288,1275068416,3058897920,4106697728,4294726912,4020186368,4020186368,4294726912,4106697728,3561427200,3489660928,4294792448,3598458880,1660944384,402653184,452984832,1577058304,2937455616,4158017536,4277752576,4192228608,3090025216,2382364672,2801795072,4294792448,4294792448,3916570368,3640655872,4294792448,4294792448,4294792448,3170893824,3460961024,4106697728,4294726912,4020186368,4020186368,4294726912,4106697728,3259962368,2617245696,3649906432,4277752576,3730839552,3539992576,4294792448,3849592320,3679458560,4277752576,4037094656,3813479168,4277752576,3886493184,1996488704,536870912,
0,67108864,788529152,2281701376,4072894821,4293201424,4292870144,4292804608,4292608000,4156898324,2634022912,1392508928,822083584,905969664,1140850688,1476395008,2013265920,2617573888,3292798484,3902098491,4241976422,4292888908,4292806923,4293001216,4293263360,4293525760,4294260515,3510376966,3305308160,4191289856,4293394432,4293066752,4292935680,4293001473,4242215445,2871133184,1191182336,201326592,0,0,0,268435456,1291845632,2701723913,4072652735,4260754933,3782702967,4175355614,4158446812,2870877726,2264924160,3019898880,4294967295,3630326370,2952790016,3305111552,4294967295,3462817382,2399141888,3243660886,4277795321,3764675684,3372220416,3405774848,3780071247,4174829270,3729542220,3456106496,4294967295,3801256594,2885681152,3271557120,4294967295,3546506083,2298478592,2348810240,3648616825,4294967295,2818572288,2097152000,2701723913,4072652735,4260754933,3782702967,4175355614,4158446812,3289979161,3137339392,3456106496,4294967295,3847969627,3640655872,4294967295,3780992349,3645064003,4226674157,3767833748,1996488704,1174405120,1996488704,3767833748,4243385580,3712107074,3473278470,4072652735,4260754933,3782702967,4175355614,4158446812,2870877726,1711276032,1811939328,3685360896,4124521216,3410759424,2920416000,2920416000,3427536640,4157944576,4105775616,3640655872,4294787072,3564509184,1627389952,637534208,1342177280,2785739264,4106956544,4260773120,3867745792,4209325824,4192286208,3323987200,3137339392,3456106496,4294787072,3899463168,3640655872,4294787072,3798931456,3204448256,3221225472,4055509504,4157944576,3427536640,2920416000,2920416000,3427536640,4157944576,4072286720,3456106496,4294787072,3886162944,2969567232,3305111552,4294787072,3698464768,2952790016,3783794432,4294787072,3640655872,3951172864,4294787072,2550136832,822083584,
0,285212672,1426063360,3277007389,4293737023,4293066752,4292870144,4292739072,4241565196,3423471106,2717908992,2197815296,2264924160,2685010432,3005286916,3377536014,3851039012,4139536965,4292959323,4292818747,4292742414,4292804608,4292804608,4292935680,4293725440,4294590464,3954466066,2871071238,2466250752,3445623808,4294119168,4293525504,4293132288,4293001216,4293462024,3835439624,2030043136,654311424,67108864,0,50331648,788529152,2348941826,3851061898,4260886519,3529005144,3120562176,3525452322,4243451373,3902446234,3288926473,3439329280,4294967295,3513017444,2634022912,3137339392,4294967295,3496306021,2583691264,3717567893,4209041632,3489660928,4141406424,4141538010,4124168657,4192461795,3868365458,3523215360,4294967295,3462817382,2499805184,3070230528,4294967295,3429394536,1811939328,1845493760,3446040166,4294967295,3422552064,3221225472,3851061898,4260886519,3529005144,3120562176,3525452322,4243451373,3952580503,3490318858,3539992576,4294967295,3847969627,3640655872,4294967295,3630326370,2952790016,3869483939,4260689140,3123917619,2415919104,3123917619,4260689140,4020084125,3640655872,3968239238,4260886519,3529005144,3120562176,3525452322,4243451373,3902446234,2735475724,2113929216,2600468480,3019898880,2583691264,2063597568,2063597568,2667577344,3714912256,4294781952,3640655872,4294781952,3547336960,1728053248,1191182336,2382495744,3902150144,4277545472,3580038656,3120562176,3559458048,4243531776,3986889472,3490382080,3539992576,4294781952,3882225408,3640655872,4294781952,3614249216,2634022912,2919235584,4294781952,3714912256,2667577344,2063597568,2063597568,2667577344,3714912256,4294781952,3640655872,4294781952,3547336960,2583691264,3120562176,4294781952,3547336960,2566914048,3547336960,4294781952,3640655872,3882225408,4294781952,2734686208,905969664,
50331648,687865856,2164260864,4004986156,4293526023,4293132288,4292804608,4292739072,4190049031,3866102791,3816952331,3868467732,4003800346,4156500256,4275644710,4292683559,4292682277,4292679193,4292739073,4292739072,4292608000,4292411392,4292673536,4293661184,4174923273,3446360857,2164260864,1291845632,1191182336,2332033024,4073140736,4294119168,4293525504,4293066752,4293263360,4276230916,3260750080,1392508928,318767104,16777216,184549376,1275068416,3157340465,4274439878,3678486849,3120562176,3289452817,3848232799,4120681628,4291611852,3711251765,3456106496,4291611852,3799348597,2919235584,3288334336,4291611852,3461435729,2499805184,3410446151,4206212533,3778952766,3591574291,3388997632,3305111552,3170893824,3036676096,3372220416,4291611852,3427947090,2415919104,3019898880,4291611852,3427947090,1795162112,1795162112,3427947090,4291611852,3640655872,3760793897,4274439878,3678486849,3120562176,3289452817,3848232799,4120681628,4291611852,3795137845,3640655872,4291611852,3846785353,3640655872,4291611852,3478212945,2399141888,3073322799,4172394929,4121339558,3491832097,4121339558,4172394929,3542690089,3643353385,4274439878,3678486849,3120562176,3289452817,3848232799,4120681628,4291611852,3510188345,2785017856,3582069760,4090368512,3376612608,2920218624,2920218624,3393389824,4123791872,4037807872,3456106496,4294514688,3835038720,2231369728,1862270976,3191800832,4277278208,3696690944,3137339392,3323461888,3883600384,4140044544,4294514688,3813017088,3640655872,4294514688,3865118720,3640655872,4294514688,3496610048,2130706432,2399141888,3954183936,4123791872,3393389824,2920218624,2920218624,3393389824,4123791872,4071296768,3640655872,4294514688,3496610048,2466250752,3053453312,4294514688,3496610048,2466250752,3496610048,4294514688,3640655872,3865118720,4294514688,2734686208,905969664,
201326592,1224736768,3023639812,4277017613,4293656576,4293263360,4292870144,4292804608,4292870144,4292871176,4292939794,4292939796,4292873232,4292871689,4292739587,4292804608,4292804608,4292673536,4292542464,4292345856,4292542464,4293133568,4157219336,3665638928,2651785731,1677721600,771751936,251658240,385875968,1526726656,3327729408,4294721792,4294119168,4293591040,4293197824,4293925893,3987551235,2248146944,872415232,134217728,385875968,1677721600,3630721128,4291546059,3813757265,3849088108,4189172145,4154893990,3881063508,4154762404,3781387107,3070230528,3629931612,4257728455,3661512254,3539992576,4291611852,3427947090,2231369728,2769885465,3934158462,4205949361,3847311697,3643419178,3729081669,4037585064,2902458368,3288334336,4291611852,3427947090,2415919104,3019898880,4291611852,3427947090,1795162112,1795162112,3427947090,4291611852,3640655872,3932250465,4291546059,3813757265,3849088108,4189172145,4154893990,3881063508,4154762404,3915275870,3640655872,4291611852,3846785353,3640655872,4291611852,3427947090,1929379840,1946157056,3309980234,4206541498,4274374085,4206541498,3427289160,2835349504,3731187045,4291546059,3813757265,3849088108,4189172145,4154893990,3881063508,4154762404,3865075808,3456106496,4294511104,4088530432,4294380032,3968205824,3968205824,4294380032,4038395392,3158180096,2533359616,3531015424,4260563200,3310682880,2583691264,3665954048,4294445568,3815047936,3867608064,4191881216,4157409024,3899130624,4157277952,3933602816,3640655872,4294511104,3864789504,3640655872,4294511104,3462923264,1778384896,1577058304,2957115648,4038395392,4294380032,3968205824,3968205824,4294380032,4038395392,3493396736,3472883712,4294511104,3462923264,2449473536,3036676096,4294511104,3462923264,2449473536,3462923264,4294511104,3640655872,3864789504,4294511104,2734686208,905969664,
436207616,1795162112,3784914178,4294453760,4293985792,4293525504,4293263360,4293066752,4293001216,4292870144,4292870144,4292870144,4292804608,4292739072,4292608000,4292411392,4292411392,4292411392,4292804608,4276096257,4055439621,3462337541,2617967874,1778384896,1006632960,436207616,100663296,0,83886080,822083584,2332033024,4107292928,4294722560,4294251776,4293656576,4293856768,4276101633,3515097344,1342177280,234881024,436207616,1711276032,3817968017,4206673084,4223647679,4019952539,3613812326,3157077293,2869101315,3461238350,4037716650,2516582400,2365587456,3614865014,4104759721,3405774848,4291611852,3260503895,1560281088,1526726656,2703500324,3630786921,4036861341,4240490688,3867575942,2973514812,2231369728,2885681152,4291611852,3260503895,2080374784,2768240640,4291611852,3260503895,1493172224,1493172224,3260503895,4291611852,3372220416,3951922573,4206673084,4223647679,4019952539,3613812326,3157077293,2869101315,3461238350,4087982505,3405774848,4291611852,3662499149,3355443200,4291611852,3260503895,1358954496,872415232,1795162112,3224646708,4257662662,3224646708,2147483648,2147483648,3817968017,4206673084,4223647679,4019952539,3613812326,3157077293,2869101315,3461238350,4104628135,3590324224,4294508544,3815702528,3698589696,4073127936,4073127936,3598123008,2720661504,1543503872,1107296256,1929379840,3616538624,4057071616,2801795072,3870294016,4209246208,4226351104,4022140928,3615162368,3157852160,2869100544,3462266880,4090298368,3405774848,4294508544,3663659008,3355443200,4294508544,3261661184,1325400064,687865856,1476395008,2720661504,3598123008,4073127936,4073127936,3598123008,2720661504,2231369728,2902458368,4294508544,3261661184,2080374784,2768240640,4294508544,3261661184,2080374784,3261661184,4294508544,3355443200,3663659008,4294508544,2533359616,822083584,
520093696,1962934272,4022817026,4294132225,4294521600,4294253056,4293920768,4293591296,4293197824,4293132288,4292935680,4292804608,4292804608,4292804608,4292935936,4293135104,4242084099,4072214529,3597801734,3023440387,2231369728,1577058304,956301312,452984832,117440512,16777216,0,0,0,352321536,1627389952,3530502912,4294929408,4294791936,4294592513,4158276864,3444975876,2535986688,1006632960,150994944,234881024,1006632960,1929379840,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,1929379840,1459617792,1124073472,1660944384,2130706432,2264924160,2348810240,1744830464,687865856,436207616,1023410176,1694498816,2197815296,2348810240,1962934272,1224736768,989855744,1761607680,2348810240,1744830464,1140850688,1744830464,2348810240,1744830464,721420288,721420288,1744830464,2348810240,2197815296,2164260864,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,2063597568,2248146944,2348810240,2164260864,2164260864,2348810240,1744830464,637534208,184549376,704643072,1728053248,2281701376,1728053248,939524096,1124073472,1929379840,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,2483027968,3305111552,4294508544,3563126784,2449473536,2214592512,2147483648,1677721600,1023410176,402653184,234881024,788529152,1660944384,1996488704,1828716544,2030043136,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,2063597568,2248146944,2348810240,2164260864,2164260864,2348810240,1744830464,637534208,150994944,402653184,1023410176,1677721600,2147483648,2147483648,1677721600,1023410176,905969664,1744830464,2348810240,1744830464,1140850688,1744830464,2348810240,1744830464,1140850688,1744830464,2348810240,2164260864,2164260864,2348810240,1677721600,503316480,
318767104,1375731712,3059226113,3699846145,3869130506,4022230030,4141306627,4226171904,4260378112,4260178176,4259914240,4191428864,4089652224,3936955141,3648853506,3361147392,2887846915,2248146944,1694498816,1191182336,721420288,335544320,83886080,16777216,0,0,0,0,0,117440512,989855744,2585332736,4039860480,3784984577,3226543360,2382364672,1728053248,989855744,318767104,33554432,50331648,234881024,536870912,771751936,788529152,620756992,385875968,167772160,134217728,352321536,520093696,369098752,234881024,436207616,620756992,671088640,721420288,503316480,134217728,33554432,150994944,385875968,637534208,721420288,520093696,234881024,184549376,503316480,721420288,503316480,268435456,503316480,721420288,503316480,134217728,134217728,503316480,721420288,637534208,620756992,771751936,788529152,620756992,385875968,167772160,134217728,352321536,587202560,671088640,721420288,620756992,620756992,721420288,503316480,134217728,0,134217728,469762048,687865856,469762048,167772160,234881024,536870912,771751936,788529152,620756992,385875968,167772160,134217728,352321536,1258291200,2734686208,4294508544,3278503936,1476395008,754974720,620756992,385875968,150994944,33554432,16777216,150994944,436207616,570425344,503316480,587202560,771751936,788529152,620756992,385875968,167772160,134217728,352321536,587202560,671088640,721420288,620756992,620756992,721420288,503316480,134217728,0,33554432,150994944,385875968,620756992,620756992,385875968,150994944,150994944,503316480,721420288,503316480,268435456,503316480,721420288,503316480,268435456,503316480,721420288,620756992,620756992,721420288,503316480,134217728,
67108864,503316480,1224736768,1744830464,1979711488,2181038080,2382364672,2533359616,2634022912,2634022912,2600468480,2466250752,2298478592,2046820352,1728053248,1409286144,1073741824,704643072,385875968,167772160,50331648,0,0,0,0,0,0,0,0,16777216,419430400,1342177280,1979711488,1862270976,1342177280,822083584,419430400,150994944,33554432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1744830464,637534208,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,50331648,234881024,419430400,536870912,637534208,738197504,822083584,855638016,872415232,838860800,788529152,687865856,570425344,419430400,251658240,117440512,33554432,0,0,0,0,0,0,0,0,0,0,0,0,67108864,335544320,536870912,469762048,234881024,50331648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
]));
return bmp;
}
private var border:int = 5;
public function Logo() {
graphics.beginFill(0xFF0000, 0);
graphics.drawRect(0, 0, image.width + border + border, image.height + border + border);
graphics.drawRect(border, border, image.width, image.height);
graphics.beginBitmapFill(image, new Matrix(1, 0, 0, 1, border, border), false, true);
graphics.drawRect(border, border, image.width, image.height);
tabEnabled = false;
buttonMode = true;
useHandCursor = true;
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
addEventListener(MouseEvent.CLICK, onClick);
addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick);
addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
addEventListener(MouseEvent.MOUSE_OVER, onMouseMove);
addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel);
}
private function onMouseDown(e:MouseEvent):void {
e.stopPropagation();
}
private function onClick(e:MouseEvent):void {
e.stopPropagation();
try {
navigateToURL(new URLRequest("http://alternativaplatform.com"), "_blank");
} catch (e:Error) {
}
}
private function onDoubleClick(e:MouseEvent):void {
e.stopPropagation();
}
private static const normal:ColorTransform = new ColorTransform();
private static const highlighted:ColorTransform = new ColorTransform(1.1, 1.1, 1.1, 1);
private function onMouseMove(e:MouseEvent):void {
e.stopPropagation();
transform.colorTransform = highlighted;
}
private function onMouseOut(e:MouseEvent):void {
e.stopPropagation();
transform.colorTransform = normal;
}
private function onMouseWheel(e:MouseEvent):void {
e.stopPropagation();
}
}
class Context3DViewProperties {
// Key - vertex program of object, value - program.
public var drawDistancePrograms:Dictionary = new Dictionary();
public var drawColoredRectProgram:ShaderProgram;
public var drawRectGeometry:Geometry;
}