aboutsummaryrefslogtreecommitdiff
path: root/js/helper-classes/RDGE/Materials/TwistVertMaterial.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/helper-classes/RDGE/Materials/TwistVertMaterial.js')
-rw-r--r--js/helper-classes/RDGE/Materials/TwistVertMaterial.js248
1 files changed, 248 insertions, 0 deletions
diff --git a/js/helper-classes/RDGE/Materials/TwistVertMaterial.js b/js/helper-classes/RDGE/Materials/TwistVertMaterial.js
new file mode 100644
index 00000000..853e895c
--- /dev/null
+++ b/js/helper-classes/RDGE/Materials/TwistVertMaterial.js
@@ -0,0 +1,248 @@
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
7
8///////////////////////////////////////////////////////////////////////
9// Class GLMaterial
10// RDGE representation of a material.
11///////////////////////////////////////////////////////////////////////
12function TwistVertMaterial()
13{
14 // initialize the inherited members
15 this.inheritedFrom = GLMaterial;
16 this.inheritedFrom();
17
18 ///////////////////////////////////////////////////////////////////////
19 // Instance variables
20 ///////////////////////////////////////////////////////////////////////
21 this._name = "TwistVertMaterial";
22 this._shaderName = "twistVert";
23
24 this._color = [1,0,0,1];
25
26 this._tex0 = 'assets/images/rocky-normal.jpg';
27 this._tex1 = 'assets/images/metal.png';
28
29 this._angle = 0.0;
30 this._deltaTime = 0.01;
31
32 ///////////////////////////////////////////////////////////////////////
33 // Property Accessors
34 ///////////////////////////////////////////////////////////////////////
35 this.getColor = function() { return this._color; }
36 this.getShaderName = function() { return this._shaderName; }
37
38 this.isAnimated = function() { return true; }
39 this.hasVertexDeformation = function() { return this._hasVertexDeformation; }
40 this._hasVertexDeformation = true;
41 this._vertexDeformationTolerance = 0.02; // should be a property
42
43 ///////////////////////////////////////////////////////////////////////
44 // Methods
45 ///////////////////////////////////////////////////////////////////////
46 // duplcate method requirde
47 this.dup = function() { return new TwistVertMaterial(); }
48
49 this.init = function()
50 {
51 // set up the shader
52 this._shader = new jshader();
53 this._shader.def = twistVertShaderDef;
54 this._shader.init();
55
56 // set the defaults
57 this._shader.twistMe.color.set( this.getColor() );
58
59 // set up the material node
60 this._materialNode = createMaterialNode("twistVertMaterial");
61 this._materialNode.setShader(this._shader);
62
63 // initialize the twist vert properties
64 this.updateShaderValues();
65 }
66
67
68 ///////////////////////////////////////////////////////////////////////
69 // Material Property Accessors
70 ///////////////////////////////////////////////////////////////////////
71 this._propNames = ["color", "u_limit1", "u_limit2", "u_center", "u_twistAmount", "u_tex0", "u_tex1" ];
72 this._propLabels = ["Color", "Minimum Parameter Value", "Center Paramater Value", "Center", "Twist Amount", "Front facing texture map", "Back facing texture map"];
73 this._propTypes = ["color", "float", "float", "float", "float", "file", "file"];
74 this._propValues = [];
75
76 // initialize the property values
77 this._propValues[ this._propNames[0] ] = this._color.slice();
78 this._propValues[ this._propNames[1] ] = 0.25;
79 this._propValues[ this._propNames[2] ] = 0.75;
80 this._propValues[ this._propNames[3] ] = 0.0;
81 this._propValues[ this._propNames[4] ] = 2.0*Math.PI;
82 this._propValues[ this._propNames[5] ] = this._tex0.slice();
83 this._propValues[ this._propNames[6] ] = this._tex1.slice();
84
85 this.setProperty = function( prop, value )
86 {
87 // make sure we have legitimate input
88 if (this.validateProperty( prop, value ))
89 {
90 switch (prop)
91 {
92 case "color":
93 case "u_tex1":
94 case "u_tex0": this._propValues[prop] = value.slice(); break;
95 default: this._propValues[prop] = value; break;
96 }
97
98 this.updateShaderValues();
99 }
100 }
101 ///////////////////////////////////////////////////////////////////////
102
103 this.export = function()
104 {
105 // this function should be overridden by subclasses
106 var exportStr = "material: " + this.getShaderName() + "\n";
107 exportStr += "name: " + this.getName() + "\n";
108
109 if (this._shader)
110 exportStr += "color: " + String(this._shader.twistMe.color) + "\n";
111 else
112 exportStr += "color: " + this.getColor() + "\n";
113 exportStr += "endMaterial\n";
114
115 return exportStr;
116 }
117
118 this.import = function( importStr )
119 {
120 var pu = new ParseUtils( importStr );
121 var material = pu.nextValue( "material: " );
122 if (material != this.getShaderName()) throw new Error( "ill-formed material" );
123 this.setName( pu.nextValue( "name: ") );
124
125 var rtnStr;
126 try
127 {
128 var color = eval( "[" + pu.nextValue( "color: " ) + "]" );
129
130 this.setProperty( "color", color);
131
132 var endKey = "endMaterial\n";
133 var index = importStr.indexOf( endKey );
134 index += endKey.length;
135 rtnStr = importStr.substr( index );
136 }
137 catch (e)
138 {
139 throw new Error( "could not import material: " + importStr );
140 }
141
142 return rtnStr;
143 }
144
145 this.update = function( time )
146 {
147 if (this._shader && this._shader.twistMe)
148 {
149 var angle = this._angle;
150 angle += this._deltaTime;
151 if (angle > this._propValues[ "u_twistAmount" ])
152 {
153 angle = this._propValues[ "u_twistAmount" ];
154 this._deltaTime = -this._deltaTime;
155 }
156 else if (angle < 0.0)
157 {
158 angle = 0;
159 this._deltaTime = -this._deltaTime;
160 }
161 this._angle = angle;
162 this._shader.twistMe["u_twistAmount"].set( [angle] );
163 }
164 }
165
166 this.updateShaderValues = function()
167 {
168 if (this._shader && this._shader.twistMe)
169 {
170 var nProps = this._propNames.length;
171 for (var i=0; i<nProps; i++)
172 {
173 var propName = this._propNames[i];
174 var propValue = this._propValues[propName];
175 switch (propName)
176 {
177 case "u_tex0":
178 case "u_tex1":
179 case "color": this._shader.twistMe[propName].set( propValue ); break;
180 default: this._shader.twistMe[propName].set( [propValue] ); break;
181 }
182 }
183 }
184 }
185
186 this.updateTextures = function()
187 {
188 var material = this._materialNode;
189 if (material)
190 {
191 var technique = material.shaderProgram.default;
192 var renderer = g_Engine.getContext().renderer;
193 if (renderer && technique)
194 {
195 var texMapName = this._propValues[this._propNames[5]];
196 var wrap = 'REPEAT', mips = true;
197 var tex = this.loadTexture( texMapName, wrap, mips );
198 if (tex) technique.u_tex0.set( tex );
199
200 texMapName = this._propValues[this._propNames[6]];
201 tex = this.loadTexture( texMapName, wrap, mips );
202 if (tex) technique.u_tex1.set( tex );
203 }
204 }
205 }
206}
207
208///////////////////////////////////////////////////////////////////////////////////////
209// RDGE shader
210
211// shader spec (can also be loaded from a .JSON file, or constructed at runtime)