Hi,
I'm using a couple of PNG's defined as Classes in a SWC. I'm adding
them to stage and want to do nice transitions with away3d. I'm
splitting those PNG into several small pieces (tiles). This works,
I've tested it.
When I hand those BitmapData objects over to Away3D as BitmapMaterial
parameter it seems to work, but at runtime I'm getting this error:
(means parameter shouldnt be null)
TypeError: Error #2007: Parameter bitmap darf nicht 'null' sein.
at flash.display::Graphics/beginBitmapFill()
at flash.display::Graphics/beginFillObject()
at flash.display::Graphics/drawGraphicsData()
at away3d.core.render::AbstractRenderSession/
renderTriangleBitmapF10()[H:\Classes\AS3\away3d\core\render
\AbstractRenderSession.as:674]
at away3d.materials::BitmapMaterial/renderTriangle()[H:\Classes
\AS3\away3d\materials\BitmapMaterial.as:625]
...
My script is this:
package de.leerraum
{
import away3d.cameras.Camera3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.materials.BitmapMaterial;
import away3d.materials.ColorMaterial;
import away3d.primitives.Plane;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Camera;
import gs.TweenMax;
/**
* ...
* @author Kai Reinhardt
*/
public class PlaneHandler extends Sprite
{
private var bitmapSource : BitmapResolver;
private var bitmapTarget : BitmapResolver;
private var xTiles : int;
private var yTiles : int;
private var tileWidth : int = 95;
private var tileHeight : int = 49;
private var bitmapSourceReady : Boolean = false;
private var bitmapTargetReady : Boolean = false;
private var tilePlane : Plane;
private var frontMaterial : BitmapMaterial;
private var backMaterial : BitmapMaterial;
private var planeArray : Array;
private var view : View3D;
private var scene : Scene3D;
private var camera : Camera3D;
public function PlaneHandler(input:BitmapData, output:
BitmapData,
xTiless:int, yTiless:int)
{
trace("PlaneHandler called : input.width:
"+input.width+ "
output.width: "+output.width);
xTiles = xTiless;
yTiles = yTiless;
planeArray = [];
bitmapSource = new BitmapResolver();
bitmapTarget = new BitmapResolver();
bitmapSource.addEventListener("bitmapsReady",
triggerBothReady);
bitmapTarget.addEventListener("bitmapsReady",
triggerBothReady);
bitmapSource.resolve(input, xTiles, yTiles);
bitmapTarget.resolve(output, xTiles, yTiles);
}
private function triggerBothReady(ev:Event):void
{
if (ev.target == bitmapSource) {
bitmapSourceReady = true;
}
if (ev.target == bitmapTarget) {
bitmapTargetReady = true;
}
createPlanes();
}
private function createPlanes ():void
{
if ( bitmapSourceReady == true && bitmapTargetReady ==
true ) {
view = new View3D();
scene = new Scene3D();
for (var i: int = 0; i < yTiles; i++)
{
for (var o:int = 0; o < xTiles; o++)
{
frontMaterial = new
BitmapMaterial(bitmapSource.BitmapArray[i]
[o],{debug:true});
backMaterial = new
BitmapMaterial(bitmapTarget.BitmapArray[i][o],
{debug:true});
// dummymaterialien für den
funktionstest
var cmf : ColorMaterial = new
ColorMaterial
(0xFF00FF);
var cmb : ColorMaterial = new
ColorMaterial(0x00FF00);
tilePlane = new Plane( {x:
o*tileWidth, y: i*tileHeight,
width:tileWidth, height:tileHeight, segments: 2, segmentsW:2,segmentsH:
2, material:frontMaterial, back:backMaterial , bothsides:true,
yUp:true } );
tilePlane.rotationX = 90;
tilePlane.x = o * tileWidth;
tilePlane.y = i * tileHeight;
tilePlane.z = 0;
view.scene.addChild(tilePlane);
planeArray.push(tilePlane);
}
}
view.x = 122;
view.y = 626;
addChild(view);
addEventListener(Event.ENTER_FRAME, renderer);
//movePlanes();
}
}
private function renderer (ev:Event):void
{
view.render();
}
private function resetAll():void
{
removeEventListener(Event.ENTER_FRAME, renderer);
for ( var p : int = 0; p < planeArray.length; p++)
{
view.scene.removeChild(planeArray[p]);
}
removeChild(view);
dispatchEvent(new Event("tranisitionComplete"));
}
private function movePlanes():void
{
for ( var p : int = 0; p < planeArray.length; p++)
{
if(p< planeArray.length-1){
TweenMax.to(planeArray[p], 1, {
rotationY:180, delay: Math.random
()*1 } );
}else {
TweenMax.to(planeArray[p], 1, {
rotationY:180,
onComplete:resetAll } );
}
}
}
}
}
BitmapResolver is splitting the image into tiles. It's storing the
bitmapData in a multidimensional array[x][y] (rows and cols)
Anyone who has an idea whats going wrong here is welcomed to correct
me.
Thanks
Leerraum