Loader class
class Loader {
Element statusDomElement;
LoadStartCallback onLoadStart;
LoadProgressCallback onLoadProgress;
LoadCompleteCallback onLoadComplete;
String crossOrigin = 'anonymous';
Loader( [bool showStatus = false] ) :
statusDomElement = showStatus ? Loader.addStatusElement() : null {
onLoadStart = () {};
onLoadProgress = (data) {};
onLoadComplete = () {};
}
static addStatusElement() {
var e = new Element.tag('div');
e.style
..position = "absolute"
..right = "0px"
..top = "0px"
..fontSize = "0.8em"
..textAlign = "left"
..background = "rgba(0,0,0,0.25)"
..color = "#fff"
..width = "120px"
..padding = "0.5em 0.5em 0.5em 0.5em"
..zIndex = "1000";
e.innerHtml = "Loading ...";
return e;
}
_updateProgress( progress ) {
var message = "Loaded ";
if ( progress.total ) {
message = "$message${ ( 100 * progress.loaded / progress.total ).toStringAsFixed(0)}%";
} else {
message = "$message${ ( progress.loaded / 1000 ).toFixed(2)} KB";
}
statusDomElement.innerHtml = message;
}
static _extractUrlBase( url ) {
var parts = url.split( '/' );
parts.removeLast();
return "${( parts.length < 1 ? '.' : parts.join('/' ) )}/";
}
_initMaterials( Geometry geometry, List materials, String texturePath ) {
geometry.materials = [];
for ( var i = 0; i < materials.length; ++ i ) {
geometry.materials.add( _createMaterial( materials[ i ], texturePath ));
}
}
_hasNormals( Geometry geometry ) {
var m, i, il = geometry.materials.length;
for( i = 0; i < il; i ++ ) {
m = geometry.materials[ i ];
if ( m is ShaderMaterial ) return true;
}
return false;
}
_is_pow2( n ) {
var l = Math.log( n ) / Math.LN2;
return l.floor() == l;
}
_nearest_pow2( n ) {
var l = Math.log( n ) / Math.LN2;
return Math.pow( 2, l.round() );
}
_load_image( where, url ) {
var image = new ImageElement();
image.onLoad.listen((Event evt) {
if ( !_is_pow2( image.width ) || !_is_pow2( image.height ) ) {
var width = _nearest_pow2( image.width );
var height = _nearest_pow2( image.height );
where.image.width = width;
where.image.height = height;
where.image.getContext( '2d' ).drawImage( this, 0, 0, width, height );
} else {
where.image = this;
}
where.needsUpdate = true;
});
image.crossOrigin = crossOrigin;
image.src = url;
}
_create_texture( texturePath, sourceFile, repeat, offset, wrap, anisotropy ) {
var isCompressed = sourceFile.toLowerCase().endsWith( ".dds" );
var fullPath = texturePath + "/" + sourceFile;
var result;
var texture;
if ( isCompressed ) {
texture = ImageUtils.loadCompressedTexture( fullPath );
result = texture;
} else {
var texture = new Element.tag('canvas' );
result = new Texture( texture );
}
// TODO(nelsonsilva) - do whe need this?
// result.sourceFile = sourceFile;
if( repeat ) {
result.repeat.setValues( repeat[ 0 ], repeat[ 1 ] );
if ( repeat[ 0 ] != 1 ) result.wrapS = RepeatWrapping;
if ( repeat[ 1 ] != 1 ) result.wrapT = RepeatWrapping;
}
if ( offset ) {
result.offset.setValues( offset[ 0 ], offset[ 1 ] );
}
if ( wrap ) {
var wrapMap = {
"repeat": RepeatWrapping,
"mirror": MirroredRepeatWrapping
};
if ( wrapMap.containsKey( wrap[ 0 ] ) ) { result.wrapS = wrapMap[ wrap[ 0 ] ]; }
if ( wrapMap.containsKey( wrap[ 1 ] ) ) { result.wrapT = wrapMap[ wrap[ 1 ] ]; }
}
if ( anisotropy ) {
result.anisotropy = anisotropy;
}
if ( ! isCompressed ) {
_load_image( result, fullPath );
}
return result;
}
_rgb2hex( rgb ) =>
( (rgb[ 0 ] * 255).toInt() << 16 ) +
( (rgb[ 1 ] * 255).toInt() << 8 ) +
rgb[ 2 ].toInt() * 255;
_createMaterial( Map m, String texturePath ) {
IMaterial material;
// defaults
var mtype = "MeshLambertMaterial";
// mpars
var color = 0xeeeeee,
opacity = 1.0,
map = null,
wireframe = false,
vertexColors = null,
blending = NormalBlending,
transparent = false,
depthTest = true,
depthWrite = true,
visible = true,
side = FrontSide,
specular = 0x111111,
ambient = 0xffffff,
shininess = null,
lightMap = null,
bumpMap = null,
normalMap = null,
specularMap = null,
bumpScale = null;
// parameters from model file
if ( m.containsKey("shading") ) {
var shading = m["shading"].toLowerCase();
if ( shading == "phong" ) {
mtype = "MeshPhongMaterial";
} else if ( shading == "basic" ) {
mtype = "MeshBasicMaterial";
}
}
if ( m.containsKey("blending") ) { // TODO - && THREE[ m.blending ] != undefined ) {
// TODO - Check if we're missing some blend modes or come up with a better way to make this work
var blendmodes = {
"NoBlending": NoBlending,
"NormalBlending": NormalBlending,
"AdditiveBlending": AdditiveBlending,
"SubtractiveBlending": SubtractiveBlending,
"MultiplyBlending": MultiplyBlending,
"CustomBlending": CustomBlending
};
blending = blendmodes[ m["blending"] ];
}
if ( m.containsKey("transparent") || ( m.containsKey("opacity") && m["opacity"] < 1.0) ) {
transparent = m["transparent"];
}
if ( m.containsKey("depthTest") ) {
depthTest = m["depthTest"];
}
if ( m.containsKey("depthWrite") ) {
depthWrite = m["depthWrite"];
}
if ( m.containsKey("visible") ) {
visible = m["visible"];
}
if ( m.containsKey("flipSided") ) {
side = BackSide;
}
if ( m.containsKey("doubleSided") ) {
side = DoubleSide;
}
if ( m.containsKey("wireframe") ) {
wireframe = m["wireframe"];
}
if ( m.containsKey("vertexColors") ) {
if ( m["vertexColors"] == "face" ) {
vertexColors = FaceColors;
} else if ( !m["vertexColors"] ) {
vertexColors = VertexColors;
}
}
// colors
if ( m.containsKey("colorDiffuse") ) {
color = _rgb2hex( m["colorDiffuse"] );
} else if ( m.containsKey("DbgColor") ) {
color = m["DbgColor"];
}
if ( m.containsKey("colorSpecular") ) {
specular = _rgb2hex( m["colorSpecular"] );
}
if ( m.containsKey("colorAmbient") ) {
ambient = _rgb2hex( m["colorAmbient"] );
}
// modifiers
if ( m.containsKey("transparency") ) {
opacity = m["transparency"];
}
if ( m.containsKey("specularCoef") ) {
shininess = m["specularCoef"];
}
// textures
if ( m.containsKey("mapDiffuse") && (texturePath != null) ) {
map = _create_texture( texturePath, m["mapDiffuse"], m["mapDiffuseRepeat"], m["mapDiffuseOffset"], m["mapDiffuseWrap"], m["mapDiffuseAnisotropy"] );
}
if ( m.containsKey("mapLight") && (texturePath != null) ) {
lightMap = _create_texture( texturePath, m["mapLight"], m["mapLightRepeat"], m["mapLightOffset"], m["mapLightWrap"], m["mapLightAnisotropy"] );
}
if ( m.containsKey("mapBump") && (texturePath != null) ) {
bumpMap = _create_texture( texturePath, m["mapBump"], m["mapBumpRepeat"], m["mapBumpOffset"], m["mapBumpWrap"], m["mapBumpAnisotropy"] );
}
if ( m.containsKey("mapNormal") && (texturePath != null) ) {
normalMap = _create_texture( texturePath, m["mapNormal"], m["mapNormalRepeat"], m["mapNormalOffset"], m["mapNormalWrap"], m["mapNormalAnisotropy"] );
}
if ( m.containsKey("mapSpecular") && (texturePath != null) ) {
specularMap = _create_texture( texturePath, m["mapSpecular"], m["mapSpecularRepeat"], m["mapSpecularOffset"], m["mapSpecularWrap"], m["mapSpecularAnisotropy"] );
}
//
if ( m.containsKey("mapBumpScale") ) {
bumpScale = m["mapBumpScale"];
}
// special case for normal mapped material
if ( m.containsKey("mapNormal") ) {
var shader = ShaderUtils.lib[ "normal" ];
var uniforms = UniformsUtils.clone( shader.uniforms );
uniforms[ "tNormal" ].value = normalMap;
if ( m.containsKey("mapNormalFactor") ) {
uniforms[ "uNormalScale" ].value.setValues( m["mapNormalFactor"], m["mapNormalFactor"] );
}
if ( map != null ) {
uniforms[ "tDiffuse" ].value = map;
uniforms[ "enableDiffuse" ].value = true;
}
if ( specularMap != null) {
uniforms[ "tSpecular" ].value = specularMap;
uniforms[ "enableSpecular" ].value = true;
}
if ( lightMap != null ) {
uniforms[ "tAO" ].value = lightMap;
uniforms[ "enableAO" ].value = true;
}
// for the moment don't handle displacement texture
uniforms[ "uDiffuseColor" ].value.setHex( color );
uniforms[ "uSpecularColor" ].value.setHex( specular );
uniforms[ "uAmbientColor" ].value.setHex( ambient );
uniforms[ "uShininess" ].value = shininess;
if ( opacity != null ) {
uniforms[ "uOpacity" ].value = opacity;
}
material = new ShaderMaterial(
fragmentShader: shader.fragmentShader,
vertexShader: shader.vertexShader,
uniforms: uniforms
//lights: true,
//fog: true
);
} else {
switch (mtype) {
case "MeshLambertMaterial" :
material = new MeshLambertMaterial(
map: map,
color: color,
ambient: ambient,
lightMap: lightMap,
specularMap: specularMap,
vertexColors: vertexColors,
wireframe: wireframe,
side: FrontSide,
opacity: opacity,
transparent: transparent,
blending: blending,
depthTest: depthTest,
depthWrite: depthWrite,
visible: visible);
break;
case "MeshPhongMaterial":
material = new MeshPhongMaterial(
map: map,
color: color,
ambient: ambient,
shininess: shininess,
lightMap: lightMap,
bumpMap: bumpMap,
bumpScale: bumpScale,
specularMap: specularMap,
vertexColors: vertexColors,
wireframe: wireframe,
side: FrontSide,
opacity: opacity,
transparent: transparent,
blending: blending,
depthTest: depthTest,
depthWrite: depthWrite,
visible: visible);
break;
case "MeshBasicMaterial":
material = new MeshBasicMaterial(
map: map,
color: color,
lightMap: lightMap,
specularMap: specularMap,
vertexColors: vertexColors,
wireframe: wireframe,
side: FrontSide,
opacity: opacity,
transparent: transparent,
blending: blending,
depthTest: depthTest,
depthWrite: depthWrite,
visible: visible);
break;
default:
print("Unknow material type!");
}
}
if ( m.containsKey("DbgName") ) {
material.name = m["DbgName"];
}
return material;
}
}
Subclasses
Static Methods
dynamic addStatusElement() #
static addStatusElement() {
var e = new Element.tag('div');
e.style
..position = "absolute"
..right = "0px"
..top = "0px"
..fontSize = "0.8em"
..textAlign = "left"
..background = "rgba(0,0,0,0.25)"
..color = "#fff"
..width = "120px"
..padding = "0.5em 0.5em 0.5em 0.5em"
..zIndex = "1000";
e.innerHtml = "Loading ...";
return e;
}
Constructors
new Loader([bool showStatus = false]) #
Creates a new Object instance.
Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.
docs inherited from Object
Loader( [bool showStatus = false] ) :
statusDomElement = showStatus ? Loader.addStatusElement() : null {
onLoadStart = () {};
onLoadProgress = (data) {};
onLoadComplete = () {};
}
Properties
LoadCompleteCallback onLoadComplete #
LoadCompleteCallback onLoadComplete
LoadProgressCallback onLoadProgress #
LoadProgressCallback onLoadProgress
LoadStartCallback onLoadStart #
LoadStartCallback onLoadStart