aboutsummaryrefslogtreecommitdiff
path: root/js/lib/rdge/materials/material.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/lib/rdge/materials/material.js')
-rwxr-xr-xjs/lib/rdge/materials/material.js346
1 files changed, 346 insertions, 0 deletions
diff --git a/js/lib/rdge/materials/material.js b/js/lib/rdge/materials/material.js
new file mode 100755
index 00000000..c1d13b15
--- /dev/null
+++ b/js/lib/rdge/materials/material.js
@@ -0,0 +1,346 @@
1/* <copyright>
2This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3No 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// Class GLMaterial
9// GL representation of a material.
10///////////////////////////////////////////////////////////////////////
11var Material = function GLMaterial( world ) {
12 ///////////////////////////////////////////////////////////////////////
13 // Instance variables
14 ///////////////////////////////////////////////////////////////////////
15 this._name = "GLMaterial";
16 this._shaderName = "undefined";
17
18 // keep a reference to the owning GLWorld
19 this._world = null;
20 if(world) {
21 this._world = world;
22 }
23
24 this._shininess = 60;
25
26 this._ambient = [0.0, 0.0, 0.0, 1.0];
27 this._diffuse = [0.0, 0.0, 0.0, 1.0];
28 this._specular = [0.0, 0.0, 0.0, 1.0];
29
30 this._texture = null;
31
32 // vertex deformation variables
33 this._hasVertexDeformation = false;
34 this._vertexDeformationRange = [0, 0, 1, 1]; // (xMin, yMin, xMax, yMax)
35 this._vertexDeformationTolerance = 0.1;
36
37 // RDGE variables
38 this._shader = null;
39 this._materialNode = null;
40
41 ///////////////////////////////////////////////////////////////////////
42 // Property Accessors
43 ///////////////////////////////////////////////////////////////////////
44 this.getShininess = function() {
45 return this._shininess;
46 };
47
48 this.setShininess = function(s) {
49 this._shininess = s;
50 };
51
52 this.setName = function(n) {
53 this._name = n;
54 };
55
56 this.getName = function() {
57 return this._name;
58 };
59
60 this.setShaderName = function(n) {
61 this._shaderName = n;
62 };
63
64 this.getShaderName = function() {
65 return this._shaderName;
66 };
67
68 this.setWorld = function(world) {
69 this._world = world;
70 };
71
72 this.getWorld = function() {
73 return this._world;
74 };
75
76 this.setAmbient = function(r, g, b, a) {
77 this._ambient = [r, g, b, a];
78 };
79
80 this.getAmbient = function() {
81 return [this._ambient[0], this._ambient[1], this._ambient[2], this._ambient[3]];
82 };
83
84 this.setDiffuse = function(r, g, b, a) {
85 this._diffuse = [r, g, b, a];
86 };
87
88 this.getDiffuse = function() {
89 return [this._diffuse[0], this._diffuse[1], this._diffuse[2], this._diffuse[3]];
90 };
91
92 this.setSpecular = function(r, g, b, a) {
93 this._specular = [r, g, b, a];
94 };
95
96 this.getSpecular = function() {
97 return [this._specular[0], this._specular[1], this._specular[2], this._specular[3]];
98 };
99
100 this.getShader = function() {
101 return this._shader;
102 };
103
104 this.getMaterialNode = function() {
105 return this._materialNode;
106 };
107
108 // a material can be animated or not. default is not.
109 // Any material needing continuous rendering should override this method
110 this.isAnimated = function() {
111 return false;
112 };
113
114 // the vertex shader can apply deformations requiring refinement in
115 // certain areas.
116 this.hasVertexDeformation = function() {
117 return this._hasVertexDeformation;
118 };
119
120 this.getVertexDeformationRange = function() {
121 return this._vertexDeformationRange.slice();
122 };
123
124 this.getVertexDeformationTolerance = function() {
125 return this._vertexDeformationTolerance;
126 };
127
128 ///////////////////////////////////////////////////////////////////////
129 // Common Material Methods
130 ///////////////////////////////////////////////////////////////////////
131 this.getProperty = function( propName ) {
132 return this._propValues[propName];
133 };
134
135 this.getPropertyCount = function() {
136 return this._propNames.length;
137 };
138
139 this.getPropertyAtIndex = function( index ) {
140 var rtnArr = [];
141 if ((index < 0) || (index >= this.getPropertyCount())) {
142 throw new Error( "property index " + index + " is out of range for material" );
143 }
144
145 return [ this._propNames[index], this._propLabels[index], this._propTypes[index], this._propValues[index] ];
146 };
147
148 this.getAllProperties = function( propNames, propValues, propTypes, propLabels) {
149 // clear all the input arrays if there is junk in them
150 propNames.length = 0;
151 propValues.length = 0;
152 propTypes.length = 0;
153 propLabels.length = 0;
154
155 var nProps = this._propNames.length;
156 for (var i=0; i<nProps; i++) {
157 propNames[i] = this._propNames[i];
158 propValues[i] = this._propValues[this._propNames[i]];
159 propTypes[i] = this._propTypes[i];
160 propLabels[i] = this._propLabels[i];
161 }
162 };
163
164 this.validateProperty = function( prop, value ) {
165 var rtnVal = false;
166 try
167 {
168 //if (!this._propValues[prop]) return false;
169
170 // find the index of the property
171 var n = this._propNames.length;
172 var valType = typeof value;
173 for (var i=0; i<n; i++) {
174 if (this._propNames[i] == prop) {
175
176 switch (this._propTypes[i])
177 {
178 case "color":
179 rtnVal = ((valType == "object") && (value.length >= 4));
180 break;
181
182 case "vector2d":
183 rtnVal = ((valType == "object") && (value.length >= 2));
184 break;
185
186 case "vector3d":
187 rtnVal = ((valType == "object") && (value.length >= 3));
188 break;
189
190 case "float":
191 rtnVal = (valType == "number");
192 break;
193
194 case "file":
195 rtnVal = ((valType == "string") || !value);
196 break;
197 }
198
199 break;
200 }
201 }
202 }
203 catch(e) {
204 console.log( "setting invalid material property: " + prop + ", value: " + value );
205 }
206
207 if (!rtnVal) {
208 console.log( "invalid material property: " + prop + " : " + value );
209 }
210
211 return rtnVal;
212 };
213 ///////////////////////////////////////////////////////////////////////
214
215 ///////////////////////////////////////////////////////////////////////
216 // Methods
217 ///////////////////////////////////////////////////////////////////////
218 // duplcate method required by sub class
219 this.dup = function() {
220 throw new Error( "Material.dup() must be overridden by subclass" );
221 };
222
223 this.init = function( world ) {
224 throw new Error( "Material.init() must be overridden by subclass" );
225 };
226
227 this.update = function( time ) {
228 // animated materials should implement the update method
229 };
230
231 this.registerTexture = function( texture ) {
232 // the world needs to know about the texture map
233 var world = this.getWorld();
234 if (!world) {
235 console.log( "**** world not defined for registering texture map: " + texture.lookUpName );