/*
This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/
var MaterialParser = require("js/lib/rdge/materials/material-parser").MaterialParser;
var Material = require("js/lib/rdge/materials/material").Material;
var GLWorld = require("js/lib/drawing/world").World;
var Texture = require("js/lib/rdge/texture").Texture;
var ElementMediator = require("js/mediators/element-mediator").ElementMediator;
var TagTool = require("js/tools/TagTool").TagTool;
///////////////////////////////////////////////////////////////////////
// Class GLMaterial
// RDGE representation of a material.
///////////////////////////////////////////////////////////////////////
var CloudMaterial = function CloudMaterial() {
///////////////////////////////////////////////////////////////////////
// Instance variables
///////////////////////////////////////////////////////////////////////
this._name = "CloudMaterial";
this._shaderName = "cloud";
//this._texMap = 'assets/images/cloud10.png';
this._texMap = 'assets/images/us_flag.png';
//this._texMap = 'assets/images/cubelight.png';
this._diffuseColor = [0.5, 0.5, 0.5, 0.5];
// base size of cloud polygons. Random adjustments made to each quad
this._cloudSize = 40;
this._time = 0.0;
this._dTime = 0.01;
// parameter initial values
this._time = 0.0;
this._surfaceAlpha = 0.6;
this._zmin = 0.1;
this._zmax = 10.0;
///////////////////////////////////////////////////////////////////////
// Property Accessors
///////////////////////////////////////////////////////////////////////
this.getName = function() { return this._name; };
this.getShaderName = function() { return this._shaderName; };
this.getTextureMap = function() { return this._propValues[this._propNames[0]] ? this._propValues[this._propNames[0]].slice() : null };
this.setTextureMap = function(m) { this._propValues[this._propNames[0]] = m ? m.slice(0) : null; this.updateTexture(); };
this.isAnimated = function() { return true; };
///////////////////////////////////////////////////////////////////////
// Material Property Accessors
///////////////////////////////////////////////////////////////////////
this._propNames = ["texmap", "diffusecolor"];
this._propLabels = ["Texture map", "Diffuse Color"];
this._propTypes = ["file", "color"];
this._propValues = [];
this._propValues[ this._propNames[0] ] = this._texMap.slice(0);
this._propValues[ this._propNames[1] ] = this._diffuseColor.slice();
this.setProperty = function( prop, value )
{
if (prop === 'color') prop = 'diffusecolor';
// make sure we have legitimate imput
var ok = this.validateProperty( prop, value );
if (!ok) {
console.log( "invalid property in Radial Gradient Material:" + prop + " : " + value );
}
switch (prop)
{
case "texmap":
this.setTextureMap(value);
break;
case "color":
break;
}
};
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// Methods
///////////////////////////////////////////////////////////////////////
// duplcate method requirde
this.dup = function( world )
{
// save the world
if (world) this.setWorld( world );
// allocate a new uber material
var newMat = new CloudMaterial();
// copy over the current values;
var propNames = [], propValues = [], propTypes = [], propLabels = [];
this.getAllProperties( propNames, propValues, propTypes, propLabels);
var n = propNames.length;
for (var i=0; i 200.0) this._time = 0.0;
}
};
this.buildSource = function()
{
// save the current RDGE context so we can reset it later
var saveContext = g_Engine.getContext();
this.getWorld().stop();
// build a world to do the rendering
this._srcWorld = new GLWorld( this._srcCanvas, true, true );
var srcWorld = this._srcWorld;
if (!this._srcCanvas) throw new Error( "No source canvas in Cloud material" );
this._srcCanvas.__GLWorld = srcWorld;
// build the geometry
var prim = this.buildGeometry( srcWorld, srcCanvas.width, srcCanvas.height );
// set up the shader
var shader = new jshader();
shader.def = cloudMaterialDef;
shader.init();
this._srcShader = shader;
// set up the material node
var materialNode = createMaterialNode("cloudMaterial" + "_" + srcWorld.generateUniqueNodeID());
materialNode.setShader(shader);
this._srcMaterialNode = materialNode;
// add the nodes to the tree
var trNode = createTransformNode("objRootNode_" + srcWorld._nodeCounter++);
srcWorld._rootNode.insertAsChild( trNode );
trNode.attachMeshNode(srcWorld.renderer.id + "_prim_" + srcWorld._nodeCounter++, prim);
trNode.attachMaterial( materialNode );
// initialize the shader uniforms
this._time = 0;
if (shader['default']) {
var t = shader['default'];
if (t)
{
t.u_time.set( [this._time] );
t.u_surfaceAlpha.set( [this._surfaceAlpha] );
t.u_zmin.set( [this._zmin] );
t.u_zmax.set( [this._zmax] );
var wrap = 'REPEAT', mips = true;
var texMapName = this._propValues[this._propNames[0]];
var tex = srcWorld.renderer.getTextureByName(texMapName, wrap, mips );
if (tex)
{
srcWorld.textureToLoad( tex );
t.u_tex0.set( tex );
}
}
}
// restore the original context
g_Engine.setContext( saveContext.id );
this.getWorld().start();
};
this.buildGeometry = function(world, canvasWidth, canvasHeight)
{
var RectangleGeometry = require("js/lib/geom/rectangle").RectangleGeometry;
RectangleGeometry.init();
// get the normalized device coordinates (NDC) for
// all position and dimensions.
var vpw = world.getViewportWidth(), vph = world.getViewportHeight();
var xNDC = 0.0/vpw, yNDC = 0.0/vph,
xFillNDC = canvasWidth/vpw, yFillNDC = canvasHeight/vph;
var aspect = world.getAspect();
var zn = world.getZNear(), zf = world.getZFar();
var t = zn * Math.tan(world.getFOV() * Math.PI / 360.0),
b = -t,
r = aspect*t,
l = -r;
// calculate the object coordinates from their NDC coordinates
var z = -world.getViewDistance();
// get the position of the origin
var x = -z*(r-l)/(2.0*zn)*xNDC,
y = -z*(t-b)/(2.0*zn)*yNDC;
// get the x and y fill
var hWidth = -z*(r-l)/(2.0*zn)*xFillNDC,
hHeight = -z*(t-b)/(2.0*zn)*yFillNDC;
//this.createFill([x,y], 2*xFill, 2*yFill, tlRadius, blRadius, brRadius, trRadius, fillMaterial);
var ctr = [x,y], width = 2*hWidth, height = 2*hHeight;
var cloudSize = width > height ? 0.25*width : 0.25*height;
//var prim = RectangleGeometry.create( ctr, width, height );
//return prim;
var verts = [],
normals = [ [0,0,1], [0,0,1], [0,0,1], [0,0,1] ],
uvs = [ [0,0], [1,0], [1,1], [0,1] ];
for ( i = 0; i < 12; i++ )
{
var x = hWidth*2*(Math.random() - 0.5),
//y = hHeight*2.0*(Math.random() * Math.random() - 0.5),
y = hHeight*2.0*(Math.random() - 0.5),
z = 0, //i,
zRot = (Math.random() - 0.5) * Math.PI,
sz = cloudSize * Math.random();
//x = 0.0; y = 0.0; z = 0.0;
//zRot = 0.0;
verts[0] = [-sz, -sz, 0];
verts[1] = [-sz, sz, 0];
verts[2] = [ sz, sz, 0];
verts[3] = [ sz, -sz, 0];
var rotMat = Matrix.RotationZ( zRot );
//var scaleMat = Matrix.Scale( [sz,sz,sz] );
var transMat = Matrix.Translation( [x,y,z] );
var mat = glmat4.multiply( transMat, rotMat, [] );
glmat4.multiplyVec3( mat, verts[0] );
glmat4.multiplyVec3( mat, verts[1] );
glmat4.multiplyVec3( mat, verts[2] );
glmat4.multiplyVec3( mat, verts[3] );
RectangleGeometry.addQuad( verts, normals, uvs );
}
return RectangleGeometry.buildPrimitive();
};
// JSON export
this.exportJSON = function()
{
var jObj =
{
'material' : this.getShaderName(),
'name' : this.getName(),
'texture' : this._propValues[this._propNames[0]]
};
return jObj;
};
this.importJSON = function( jObj )
{
if (this.getShaderName() != jObj.material) throw new Error( "ill-formed material" );
this.setName( jObj.name );
try {
this._propValues[this._propNames[0]] = jObj.texture;
}
catch (e)
{
throw new Error( "could not import material: " + jObj );
}
}
};
///////////////////////////////////////////////////////////////////////////////////////
// RDGE shader
// the cloud material def is used for cloud generation on the
// local world created by the cloud material.
var cloudMaterialDef =
{'shaders':
{
'defaultVShader':"assets/shaders/Cloud.vert.glsl",
'defaultFShader':"assets/shaders/Cloud.frag.glsl"
},
'techniques':
{
'default':
[
{
'vshader' : 'defaultVShader',
'fshader' : 'defaultFShader',
// attributes
'attributes' :
{
'vert' : { 'type' : 'vec3' },
'normal' : { 'type' : 'vec3' },
'texcoord' : { 'type' : 'vec2' }
},
// parameters
'params' :
{
'u_tex0' : { 'type' : 'tex2d' },
'u_time' : { 'type' : 'float' },
'u_surfaceAlpha' : { 'type' : 'float' },
'u_zmin' : { 'type' : 'float' },
'u_zmax' : { 'type' : 'float' }
},
// render states
'states' :
{
'depthEnable' : true,
'offset':[1.0, 0.1]
}
}
]
}
};
// the cloud map material def is used to map the cloud image onto
// the destination geometry
var cloudMapMaterialDef =
{'shaders':
{
'defaultVShader':"assets/shaders/Basic.vert.glsl",
'defaultFShader':"assets/shaders/BasicTex.frag.glsl"
},
'techniques':
{
'default':
[
{
'vshader' : 'defaultVShader',
'fshader' : 'defaultFShader',
// attributes
'attributes' :
{
'vert' : { 'type' : 'vec3' },
'normal' : { 'type' : 'vec3' },
'texcoord' : { 'type' : 'vec2' }
},
// parameters
'params' :
{
'u_tex0' : { 'type' : 'tex2d' },
},
// render states
'states' :
{
'depthEnable' : true,
'offset':[1.0, 0.1]
}
}
]
}
};
CloudMaterial.prototype = new Material();
if (typeof exports === "object") {
exports.CloudMaterial = CloudMaterial;
}