Por cierto lo he modificado la clase para que me haga lo que necesito os
dejo aqui el archivo por si veis algo mal pero ami para MaterialFile me
funciona por unidad.
/*
* PAPER ON ERVIS NPAPER ISION PE IS ON PERVI IO APER SI PA
* AP VI ONPA RV IO PA SI PA ER SI NP PE ON AP VI ION AP
* PERVI ON PE VISIO APER IONPA RV IO PA RVIS NP PE IS ONPAPE
* ER NPAPER IS PE ON PE ISIO AP IO PA ER SI NP PER
* RV PA RV SI ERVISI NP ER IO PE VISIO AP VISI PA RV3D
* ______________________________________________________________________
* papervision3d.org � blog.papervision3d.org �
osflash.org/papervision3d
*/
/*
* Copyright 2006-2007 (c) Carlos Ulloa Matesanz, noventaynueve.com.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
// ______________________________________________________________________
BITMAP FILE MATERIAL
package org.papervision3d.materials
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Loader;
import flash.events.*;
import flash.net.URLRequest;
import flash.utils.Dictionary;
import org.papervision3d.Papervision3D;
import org.papervision3d.core.geom.Face3D;
import org.papervision3d.core.geom.Vertex2D;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.events.FileLoadEvent;
import org.papervision3d.objects.DisplayObject3D;
/**
* The BitmapFileMaterial class creates a texture by loading a bitmap
from an external file.
*
* Materials collect data about how objects appear when rendered.
*/
public class BitmapFileMaterial extends BitmapMaterial
{
//
___________________________________________________________________ PUBLIC
/**
* Add by Alvaro Touzon is preloader.
* lo que hago es un display object que usare para que actue como
preloader independiente
*/
public var preloader:Object = null;
/**
* The URL that has been requested.
*/
public var url :String = "";
/**
* Whether or not the texture has been loaded.
*/
public var loaded :Boolean;
/**
* Function to call when the last image has loaded.
*/
static public var callback :Function;
/**
* The color to use in materials before loading has finished.
*/
static public var LOADING_COLOR :int =
MaterialObject3D.DEFAULT_COLOR;
/**
* The color to use for the lines when there is an error.
*/
static public var ERROR_COLOR:int = MaterialObject3D.DEBUG_COLOR;
/**
* A texture object.
*/
override public function get texture():Object
{
return this._texture;
}
/**
* @private
*/
override public function set texture( asset:Object ):void
{
if( asset is String == false )
{
Papervision3D.log("Error: BitmapFileMaterial.texture
requires a String for the texture");
return;
}
bitmap = createBitmapFromURL( String(asset) );
_texture = asset;
}
/**
* Internal
*
* Used to define if the loading had failed.
*/
private var errorLoading:Boolean = false;
//
___________________________________________________________________ NEW
/**
* The BitmapFileMaterial class creates a texture by loading a bitmap
from an external file.
*
* @param url The URL of the requested bitmap
file.
* @param initObject [optional] - An object that
contains additional properties with which to populate the newly created
material.
*/
public function BitmapFileMaterial( url :String="" )
{
// save URL reference
this.url = url;
trace(this);
// set the loaded flag
this.loaded = false;
// Loading color
this.fillAlpha = 1;
this.fillColor = LOADING_COLOR;
// start the loading by setting the texture
if ( url.length > 0 ) texture = url;
loadNextBitmap();
}
//
___________________________________________________________________ CREATE
BITMAP
/**
* [internal-use]
*
* @param asset
* @return
*/
protected function createBitmapFromURL( asset:String ):BitmapData
{
// Empy string?
if( asset == "" )
{
return null;
}
// Already loaded?
else if( _loadedBitmaps[ asset ] )
{
var bmp:BitmapData = _loadedBitmaps[ asset ];
bitmap = super.createBitmap( bmp );
this.loadComplete();
return bmp;
}
else
{
queueBitmap( asset );
}
return null;
}
//
___________________________________________________________________ QUEUE
BITMAP
private function queueBitmap( file:String ):void
{
// New filename?
if( ! _subscribedMaterials[ file ] )
{
// Queue file
_waitingBitmaps.push( file );
// Init subscription
_subscribedMaterials[ file ] = new Array();
}
// Subscribe material
_subscribedMaterials[ file ].push( this );
// Launch loading if needed
/*if( _loadingIdle )
loadNextBitmap();*/
}
//
___________________________________________________________________ LOAD
NEXT BITMAP
private function loadNextBitmap():void
{
// Retrieve next filename in queue
var file:String = _waitingBitmaps[0];
var request:URLRequest = new URLRequest( file );
var bitmapLoader:Loader = new Loader();
bitmapLoader.contentLoaderInfo.addEventListener(
ProgressEvent.PROGRESS, loadBitmapProgressHandler );
bitmapLoader.contentLoaderInfo.addEventListener( Event.COMPLETE,
loadBitmapCompleteHandler );
bitmapLoader.contentLoaderInfo.addEventListener(
IOErrorEvent.IO_ERROR, loadBitmapErrorHandler );
try
{
// Load bitmap
bitmapLoader.load( request );
// Save original url
_loaderUrls[ bitmapLoader ] = file;
// Busy loading
_loadingIdle = false;
Papervision3D.log( "BitmapFileMaterial: Loading bitmap from
" + file);
}
catch( error:Error )
{
// Remove from queue
_waitingBitmaps.shift();
// Loading finished
_loadingIdle = true;
Papervision3D.log( "[ERROR] BitmapFileMaterial: Unable to
load file " + error.message );
}
}
//
___________________________________________________________________ LOAD
BITMAP ERROR HANDLER
private function loadBitmapErrorHandler( e:IOErrorEvent ):void
{
var failedAsset:String = String(_waitingBitmaps.shift());
// force the IOErrorEvent to trigger on any reload.
// ie: no reload on retry if we don't clear these 2 statics
below.
_loadedBitmaps[failedAsset] = null;
_subscribedMaterials[failedAsset] = null;
this.errorLoading = true;
this.lineColor = ERROR_COLOR;
this.lineAlpha = 1;
this.lineThickness = 1;
// Queue finished?
if( _waitingBitmaps.length > 0 )
{
// Continue loading
loadNextBitmap();
}
else
{
// Loading finished
_loadingIdle = true;
if( Boolean( callback ) ) callback();
}
var event:FileLoadEvent = new
FileLoadEvent(FileLoadEvent.LOAD_ERROR, failedAsset, -1, -1, e.text);
dispatchEvent(event);
}
//
___________________________________________________________________ LOAD
BITMAP PROGRESS HANDLER
private function loadBitmapProgressHandler( e:ProgressEvent ):void
{
this.url = _waitingBitmaps[0];
var obj:Object = _subscribedMaterials[ url ] ;
var progressEvent:FileLoadEvent = new FileLoadEvent(
FileLoadEvent.LOAD_PROGRESS, this.url, e.bytesLoaded, e.bytesTotal,
"cargando", this );
dispatchEvent( progressEvent );
}
//
___________________________________________________________________ LOAD
BITMAP COMPLETE HANDLER
private function loadBitmapCompleteHandler( e:Event ):void
{
var loader:Loader = Loader( e.target.loader );
var loadedBitmap:Bitmap = Bitmap( loader.content );
// Retrieve original url
var url:String = _loaderUrls[ loader ];
// Retrieve loaded bitmapdata
var bmp:BitmapData = super.createBitmap( loadedBitmap.bitmapData
);
// Update subscribed materials
for each( var material:BitmapFileMaterial in
_subscribedMaterials[ url ] )
{
material.bitmap = bmp;
material.maxU = this.maxU;
material.maxV = this.maxV;
material.resetMapping();
material.loadComplete();
}
// Include in library
_loadedBitmaps[ url ] = bmp;
// Remove from queue
_waitingBitmaps.shift();
// Queue finished?
if( _waitingBitmaps.length > 0 )
{
// Continue loading
//loadNextBitmap();
}
else
{
// Loading finished
_loadingIdle = true;
trace("ENTRO")
if( Boolean( callback ) ) callback();
}
}
//
___________________________________________________________________ LOAD
COMPLETE
private function loadComplete():void
{
this.fillAlpha = 0;
this.fillColor = 0;
this.loaded = true;
// Dispatch event
var fileEvent:FileLoadEvent = new FileLoadEvent(
FileLoadEvent.LOAD_COMPLETE, this.url );
this.dispatchEvent( fileEvent );
}
/**
* drawFace3D
*/
override public function drawFace3D(instance:DisplayObject3D,
face3D:Face3D, graphics:Graphics, v0:Vertex2D, v1:Vertex2D, v2:Vertex2D):int
{
if (bitmap == null || errorLoading)
{
var x0:Number = v0.x;
var y0:Number = v0.y;
var x1:Number = v1.x;
var y1:Number = v1.y;
var x2:Number = v2.x;
var y2:Number = v2.y;
if(errorLoading){
graphics.lineStyle(lineThickness,lineColor,lineAlpha);
}
graphics.beginFill( fillColor, fillAlpha );
graphics.moveTo( x0, y0 );
graphics.lineTo( x1, y1 );
graphics.lineTo( x2, y2 );
graphics.lineTo( x0, y0 );
graphics.endFill();
if(errorLoading){
graphics.lineStyle();
}
return 1;
}
var i:int = super.drawFace3D(instance, face3D, graphics, v0, v1,
v2);
return i;
}
//
___________________________________________________________________ PRIVATE
// Filenames in the queue
private var _waitingBitmaps :Array = new Array();
// URLs per loader
static private var _loaderUrls :Dictionary = new Dictionary();
// Loaded bitmap library
static private var _loadedBitmaps :Object = new Object();
// Materials subscribed to the loading queue
static private var _subscribedMaterials :Object = new Object();
// Loading status
static private var _loadingIdle :Boolean = true;
}
}
El día 7 de mayo de 2008 22:53, Alvaro Touzon <[EMAIL PROTECTED]>
escribió:
> si lo veo pero para que usazs DisplayObject3D?
> Lo que no veo es que traces e,target.name, lo voy a probar.
> Si es conjuno el XML en as3
>
> El día 7 de mayo de 2008 11:48, drusunlimited listas <
> [EMAIL PROTECTED]> escribió:
>
> Hola Alvaro, he probado a ponerle name al material para poder
> > recuperarlo desde el evento y me funciona perfectamente.
> >
> > Perdona la perogrullada pero es por centranos, y es que no se me
> > ocurre otra cosa: el FileLoadEvent que recibe la funcion onLoading
> > hace referencia al material, no al displayObject3D sobre el que se
> > aplica el material, entonces...
> >
> > ¿estás creando un material diferente (y dandole un nombre diferente)
> > para cada displayObject donde aplicas el material en ese for?
> >
> > A mi algo así me funciona:
> > [code]
> > for(var i:Number=0;i<l;i++){
> > var holder_item:DisplayObject3D=new DisplayObject3D();
> > stage.addChild(holder_item);
> > var img:String=_xml.item.attribute("img")[i]; //esto es
> > maravilloso
> > por cierto :)
> > var materialFront:BitmapFileMaterial=new
> > BitmapFileMaterial(img);
> > materialFront.name="minombre"+i;
> >
> > materialFront.addEventListener(FileLoadEvent.LOAD_COMPLETE,onLoaded);
> >
> > materialFront.addEventListener(FileLoadEvent.LOAD_PROGRESS,onLoading);
> > }
> >
> > private function onLoaded(e:FileLoadEvent):void{
> > trace(e.bytesLoaded+" >> target << "+e.target.name);
> > }
> >
> > private function onLoading(e:FileLoadEvent):void{
> > trace(e.bytesLoaded);
> > }
> >
> > [/code]
> >
> > Un saludo
> >
> > 2008/5/7 Alvaro Touzon <[EMAIL PROTECTED]>:
> > > Hola Javier, si el problema esta aqui al menos sobre flash, yo uso la
> > > principal de as3.
> > > Mira
> > > si cambias esto
> > >
> > > private function onLoading(e:FileLoadEvent):void{
> > > trace(e.bytesLoaded);
> > > }
> > > por esto
> > >
> > > private function onLoading(e:FileLoadEvent):void{
> > > trace(e.bytesLoaded+" target"+e.target.name);
> > >
> > > }
> > > a mi solo me sale el nombre del primer item de la secuencia. Con lo
> > cual no
> > > puedo hacer un preloader por secuancia.
> > > Espero que me entiendas, muchas gracias
> > >
> > >
> > >
> > > El día 6 de mayo de 2008 22:44, Javier Fernández Montes <
> > > [EMAIL PROTECTED]> escribió:
> > >
> > >
> > >
> > > > Hola Alvaro, desde mi desconocimiento, puesto que estoy empezando
> > con
> > > > papervision, te puedo decir que a mi me funcionan los eventos sin
> > > > problemas.
> > > >
> > > > ¿qué rama de papervision utilizas?
> > > > Yo uso la greatwhite desde flex y va como la seda, salvo unos
> > cuanto
> > > > warnings por omisión de tipos/retornos que he tenido que corregir a
> > > > mano, pero que no impedían compilar.
> > > >
> > > > Ahora mismo estoy haciendo una frikada tipo:
> > > > [code]
> > > > ...
> > > > public function fInitArchive():void{
> > > > var l:Number=_xml.children().length();
> > > > holder_archivo=new DisplayObject3D();
> > > > basicview.scene.addChild(holder_archivo);
> > > > rueda_archivo=new DisplayObject3D();
> > > > holder_archivo.addChild(rueda_archivo);
> > > > holder_archivo.z=500;
> > > > for(var i:Number=0;i<l;i++){
> > > > var holder_item:DisplayObject3D=new
> > > > DisplayObject3D();
> > > > rueda_archivo.addChild(holder_item);
> > > > var
> > img:String=_xml.item.attribute("img");
> > > > var
> > materialFront:BitmapFileMaterial=new
> > > > BitmapFileMaterial(img);
> > > > var
> > materialBack:BitmapFileMaterial=new
> > > > BitmapFileMaterial(img);
> > > > materialFront.smooth=true;
> > > >
> > > >
> > materialFront.addEventListener(FileLoadEvent.LOAD_COMPLETE,onLoaded);
> > > >
> > > >
> > materialFront.addEventListener(FileLoadEvent.LOAD_PROGRESS,onLoading);
> > > > var itemFront:Plane=new
> > > > Plane(materialFront,290,56,14,4);
> > > > var itemBack:Plane=new
> > > > Plane(materialBack,290,56,1,1);
> > > > holder_item.addChild(itemFront);
> > > > holder_item.addChild(itemBack);
> > > > itemFront.x=itemBack.x=750;
> > > > itemBack.rotationY=180;
> > > > holder_item.rotationZ=i*(180/l);
> > > > }
> > > >
> > > > stage.addEventListener(Event.ENTER_FRAME,renderLoop);
> > > > }
> > > > private function onLoaded(e:FileLoadEvent):void{
> > > > trace(e.bytesTotal);
> > > > }
> > > > private function onLoading(e:FileLoadEvent):void{
> > > > trace(e.bytesLoaded);
> > > > }
> > > > ...
> > > > [/code]
> > > >
> > > > Y ya te digo que ningún problema.
> > > >
> > > >
> > > > Javier Fernández :: Drus Unlimited™
> > > > listas[at]drusunlimited[dot]com
> > > > http://drusunlimited.com
> > > >
> > > > El 05/05/2008, a las 12:39, Alvaro Touzon escribió:
> > > >
> > > > > Hola estoy empezando con papervision y cuando creo una galeria de
> > x
> > > > > img ,
> > > > > con "BitmapFileMaterial", y realizo un preloader LOAD_PROGRESS,
> > no me
> > > > > actualiza los datos del target, me mantiene el del primer
> > material
> > > > > que
> > > > > llamo.
> > > > >
> > > > > var material:BitmapFileMaterial = new BitmapFileMaterial(img);
> > > > >
> > > > >
> > > > > material.addEventListener(FileLoadEvent.LOAD_COMPLETE,
> > > > > onLoaded);
> > > > > material.addEventListener(FileLoadEvent.LOAD_PROGRESS,
> > > > > onLoading);
> > > > >
> > > > > Algu no ha tenido ya este problema he visto por google peo no le
> > veo
> > > > > la
> > > > > solucion, intentare darsela pero lo veo lejos, pues no conocco
> > bien
> > > > > el
> > > > > framework.
> > > > > Gracias.
> > > > > -----------------------------------------------------
> > > > > ASNativos
> > > > > www.5dms.com
> > > > > subscripciones/desubscripciones
> > > > > http://asnativos.5dms.com
> > > > > -----------------------------------------------------
> > > >
> > > >
> > > > -----------------------------------------------------
> > > > ASNativos
> > > > www.5dms.com
> > > > subscripciones/desubscripciones
> > > > http://asnativos.5dms.com
> > > > -----------------------------------------------------
> > > >
> > > -----------------------------------------------------
> > > ASNativos
> > > www.5dms.com
> > > subscripciones/desubscripciones
> > > http://asnativos.5dms.com
> > > -----------------------------------------------------
> > >
> >
> >
> >
> > --
> > Javier Fernández :: Drus Unlimited™
> > http://drusunlimited.com
> >
> > -----------------------------------------------------
> > ASNativos
> > www.5dms.com
> > subscripciones/desubscripciones
> > http://asnativos.5dms.com
> > -----------------------------------------------------
> >
>
>
-----------------------------------------------------
ASNativos
www.5dms.com
subscripciones/desubscripciones
http://asnativos.5dms.com
-----------------------------------------------------