aboutsummaryrefslogtreecommitdiff
path: root/js/lib/rdge/materials/pulse-material.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/lib/rdge/materials/pulse-material.js')
-rw-r--r--js/lib/rdge/materials/pulse-material.js258
1 files changed, 258 insertions, 0 deletions
diff --git a/js/lib/rdge/materials/pulse-material.js b/js/lib/rdge/materials/pulse-material.js
new file mode 100644
index 00000000..63cab2f4
--- /dev/null
+++ b/js/lib/rdge/materials/pulse-material.js
@@ -0,0 +1,258 @@
1/* <copyright>
2 This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3 No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
4 (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5 </copyright> */
6
7var MaterialParser = require("js/lib/rdge/materials/material-parser").MaterialParser;
8var Material = require("js/lib/rdge/materials/material").Material;
9///////////////////////////////////////////////////////////////////////
10// Class GLMaterial
11// RDGE representation of a material.
12///////////////////////////////////////////////////////////////////////
13var PulseMaterial = function PulseMaterial() {
14 ///////////////////////////////////////////////////////////////////////
15 // Instance variables
16 ///////////////////////////////////////////////////////////////////////
17 this._name = "PulseMaterial";
18 this._shaderName = "pulse";
19
20 this._texMap = 'assets/images/cubelight.png';
21
22 this._time = 0.0;
23 this._dTime = 0.01;
24
25 ///////////////////////////////////////////////////////////////////////
26 // Property Accessors
27 ///////////////////////////////////////////////////////////////////////
28 this.getName = function() { return this._name; };
29 this.getShaderName = function() { return this._shaderName; };
30
31 this.getTextureMap = function() { return this._propValues[this._propNames[0]] ? this._propValues[this._propNames[0]].slice() : null };
32 this.setTextureMap = function(m) { this._propValues[this._propNames[0]] = m ? m.slice(0) : null; this.updateTexture(); };
33
34 this.isAnimated = function() { return true; };
35
36 ///////////////////////////////////////////////////////////////////////
37 // Material Property Accessors
38 ///////////////////////////////////////////////////////////////////////
39 this._propNames = ["texmap"];
40 this._propLabels = ["Texture map"];
41 this._propTypes = ["file"];
42 this._propValues = [];
43
44 this._propValues[ this._propNames[0] ] = this._texMap.slice(0);
45
46 this.setProperty = function( prop, value ) {
47 // make sure we have legitimate imput
48 var ok = this.validateProperty( prop, value );
49 if (!ok) {
50 console.log( "invalid property in Radial Gradient Material:" + prop + " : " + value );
51 }
52
53 switch (prop)
54 {
55 case "texmap":
56 this.setTextureMap(value);
57 break;
58
59 case "color":
60 break;
61 }
62 };
63 ///////////////////////////////////////////////////////////////////////
64
65
66 ///////////////////////////////////////////////////////////////////////
67 // Methods
68 ///////////////////////////////////////////////////////////////////////
69 // duplcate method requirde
70 this.dup = function( world )
71 {
72 // save the world
73 if (world) this.setWorld( world );
74
75 // allocate a new uber material
76 var newMat = new PulseMaterial();
77
78 // copy over the current values;
79 var propNames = [], propValues = [], propTypes = [], propLabels = [];
80 this.getAllProperties( propNames, propValues, propTypes, propLabels);
81 var n = propNames.length;
82 for (var i=0; i<n; i++) {
83 newMat.setProperty( propNames[i], propValues[i] );
84 }
85
86 return newMat;
87 };
88
89 this.init = function( world )
90 {
91 // save the world
92 if (world) this.setWorld( world );
93
94 // this variable declared above is inherited set to a smaller delta.
95 // the pulse material runs a little faster
96 this._dTime = 0.01;
97
98 // set up the shader
99 this._shader = new jshader();
100 this._shader.def = pulseMaterialDef;
101 this._shader.init();
102
103 // set up the material node
104 this._materialNode = createMaterialNode("pulseMaterial");
105 this._materialNode.setShader(this._shader);
106
107 this._time = 0;
108 if (this._shader && this._shader['default']) {
109 this._shader['default'].u_time.set( [this._time] );
110 }
111
112
113 // set the shader values in the shader
114 this.updateTexture();
115 this.setResolution( [world.getViewportWidth(),world.getViewportHeight()] );
116 this.update( 0 );
117 };
118
119 this.updateTexture = function() {
120 var material = this._materialNode;
121 if (material) {
122 var technique = material.shaderProgram['default'];
123 var renderer = g_Engine.getContext().renderer;
124 if (renderer && technique) {
125 var texMapName = this._propValues[this._propNames[0]];
126 var wrap = 'REPEAT', mips = true;
127 var tex = this.loadTexture( texMapName, wrap, mips );
128
129 /*
130 var glTex = new GLTexture( this.getWorld() );
131 var prevWorld = this.findPreviousWorld();
132 if (prevWorld)
133 {
134 var srcCanvas = prevWorld.getCanvas();
135 tex = glTex.loadFromCanvas( srcCanvas );
136 }
137 else
138 tex = glTex.loadFromFile( texMapName, wrap, mips );
139 */
140
141 if (tex) {
142 technique.u_tex0.set( tex );
143 }
144 }
145 }
146 };
147
148 this.update = function( time )
149 {
150 var material = this._materialNode;
151 if (material)
152 {
153 var technique = material.shaderProgram['default'];
154 var renderer = g_Engine.getContext().renderer;
155 if (renderer && technique) {
156 if (this._shader && this._shader['default']) {
157 this._shader['default'].u_time.set( [this._time] );
158 }
159 this._time += this._dTime;
160
161 if (this._time > 200.0) this._time = 0.0;
162 }
163 }
164 };
165
166 this.setResolution = function( res ) {
167 var material = this._materialNode;
168 if (material) {
169 var technique = material.shaderProgram['default'];
170 var renderer = g_Engine.getContext().renderer;
171 if (renderer && technique) {
172 technique.u_resolution.set( res );
173 }
174 }
175 };
176
177 this.export = function() {
178 // every material needs the base type and instance name
179 var exportStr = "material: " + this.getShaderName() + "\n";
180 exportStr += "name: " + this.getName() + "\n";
181
182 // every material needs to terminate like this
183 exportStr += "endMaterial\n";
184
185 return exportStr;
186 };
187
188 this.import = function( importStr ) {
189 var pu = new MaterialParser( importStr );
190 var material = pu.nextValue( "material: " );
191 if (material != this.getShaderName()) throw new Error( "ill-formed material" );
192 this.setName( pu.nextValue( "name: ") );
193
194 var rtnStr;
195 try {
196 var endKey = "endMaterial\n";
197 var index = importStr.indexOf( endKey );
198 index += endKey.length;
199 rtnStr = importStr.substr( index );
200 }
201 catch (e)
202 {
203 throw new Error( "could not import material: " + importStr );
204 }
205
206 return rtnStr;
207 }
208};
209
210///////////////////////////////////////////////////////////////////////////////////////
211// RDGE shader
212
213// shader spec (can also be loaded from a .JSON file, or constructed at runtime)
214var pulseMaterialDef =
215{'shaders':
216 {
217 'defaultVShader':"assets/shaders/Basic.vert.glsl",
218 'defaultFShader':"assets/shaders/Pulse.frag.glsl"
219 },
220 'techniques':
221 {
222 'default':
223 [
224 {
225 'vshader' : 'defaultVShader',