aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xjs/lib/rdge/materials/uber-material.js232
1 files changed, 34 insertions, 198 deletions
diff --git a/js/lib/rdge/materials/uber-material.js b/js/lib/rdge/materials/uber-material.js
index c1d1913c..ca244629 100755
--- a/js/lib/rdge/materials/uber-material.js
+++ b/js/lib/rdge/materials/uber-material.js
@@ -6,6 +6,7 @@
6 6
7var MaterialParser = require("js/lib/rdge/materials/material-parser").MaterialParser; 7var MaterialParser = require("js/lib/rdge/materials/material-parser").MaterialParser;
8var Material = require("js/lib/rdge/materials/material").Material; 8var Material = require("js/lib/rdge/materials/material").Material;
9var Texture = require("js/lib/rdge/texture").Texture;
9 10
10var UberMaterial = function UberMaterial() { 11var UberMaterial = function UberMaterial() {
11 /////////////////////////////////////////////////////////////////////// 12 ///////////////////////////////////////////////////////////////////////
@@ -23,7 +24,8 @@ var UberMaterial = function UberMaterial() {
23 this._environmentAmount = 0.2; // 0 .. 1 24 this._environmentAmount = 0.2; // 0 .. 1
24 25
25 // set the default maps 26 // set the default maps
26 this._diffuseMapOb = { 'texture' : 'assets/images/rocky-diffuse.jpg', 'wrap' : 'REPEAT' }; 27 //this._diffuseMapOb = { 'texture' : 'assets/images/rocky-diffuse.jpg', 'wrap' : 'REPEAT' };
28 this._diffuseMapOb = { 'texture' : 'texture', 'wrap' : 'REPEAT' };
27 this._normalMapOb = { 'texture' : 'assets/images/rocky-normal.jpg', 'wrap' : 'REPEAT' }; 29 this._normalMapOb = { 'texture' : 'assets/images/rocky-normal.jpg', 'wrap' : 'REPEAT' };
28 this._specularMapOb = { 'texture' : 'assets/images/rocky-spec.jpg', 'wrap' : 'REPEAT' }; 30 this._specularMapOb = { 'texture' : 'assets/images/rocky-spec.jpg', 'wrap' : 'REPEAT' };
29 this._environmentMapOb = { 'texture' : 'assets/images/silver.png', 'wrap' : 'CLAMP', 'envReflection' : this._environmentAmount }; 31 this._environmentMapOb = { 'texture' : 'assets/images/silver.png', 'wrap' : 'CLAMP', 'envReflection' : this._environmentAmount };
@@ -34,6 +36,9 @@ var UberMaterial = function UberMaterial() {
34 this._useEnvironmentMap = true; 36 this._useEnvironmentMap = true;
35 this._useLights = [true, true, true, true]; 37 this._useLights = [true, true, true, true];
36 38
39 // these are the abstracted texture objects - defined where they are set
40 this._diffuseTexture;
41
37 this._MAX_LIGHTS = 4; 42 this._MAX_LIGHTS = 4;
38 43
39 /////////////////////////////////////////////////////////////////////// 44 ///////////////////////////////////////////////////////////////////////
@@ -189,6 +194,7 @@ var UberMaterial = function UberMaterial() {
189 if (material) { 194 if (material) {
190 var technique = material.shaderProgram.defaultTechnique; 195 var technique = material.shaderProgram.defaultTechnique;
191 technique.u_diffuseColor.set(this._diffuseColor); 196 technique.u_diffuseColor.set(this._diffuseColor);
197 this.getWorld().restartRenderLoop();
192 } 198 }
193 }; 199 };
194 200
@@ -258,6 +264,7 @@ var UberMaterial = function UberMaterial() {
258 if ((value == null) || (value.length == 0)) { 264 if ((value == null) || (value.length == 0)) {
259 if (this._useDiffuseMap) { 265 if (this._useDiffuseMap) {
260 this._useDiffuseMap = false; 266 this._useDiffuseMap = false;
267 this._diffuseTexture = undefined;
261 this.rebuildShader(); 268 this.rebuildShader();
262 } 269 }
263 } else { 270 } else {
@@ -270,8 +277,8 @@ var UberMaterial = function UberMaterial() {
270 var technique = material.shaderProgram.defaultTechnique; 277 var technique = material.shaderProgram.defaultTechnique;
271 var renderer = g_Engine.getContext().renderer; 278 var renderer = g_Engine.getContext().renderer;
272 if (renderer && technique) { 279 if (renderer && technique) {
273 var tex = renderer.getTextureByName(value, caps.diffuseMap.wrap); 280 this._diffuseTexture = new Texture( this.getWorld(), value, caps.diffuseMap.wrap );
274 this.registerTexture( tex ); 281 var tex = this._diffuseTexture.getTexture();
275 technique.s_diffuseMap.set( tex ); 282 technique.s_diffuseMap.set( tex );
276 } 283 }
277 } 284 }
@@ -370,118 +377,29 @@ var UberMaterial = function UberMaterial() {
370 this._materialNode.setShader(this._shader); 377 this._materialNode.setShader(this._shader);
371 }; 378 };
372 379
373 this.import = function( importStr ) 380 this.update = function()
374 { 381 {
375 // limit the key searches to this material 382 var material = this._materialNode;
376 var endKey = "endMaterial\n"; 383 if (material)
377 var index = importStr.indexOf( endKey ); 384 {
378 index += endKey.length; 385 var technique = material.shaderProgram.defaultTechnique;
379 importStr = importStr.slice( 0, index ); 386 var renderer = g_Engine.getContext().renderer;
380 var pu = new MaterialParser( importStr ); 387 if (renderer && technique)
381 388 {
382 var matProps = pu.nextValue( "materialProps: " ); 389 if (this._diffuseTexture && this._diffuseTexture.isAnimated())
383 if (matProps) 390 {
384 { 391 this._diffuseTexture.rerender();
385 var ambientColor = eval( "[" + pu.nextValue("ambientColor: ") + ']' ); this.setProperty( "ambientColor", ambientColor ); 392 technique.s_diffuseMap.set( this._diffuseTexture.getTexture() );
386 var diffuseColor = eval( "[" + pu.nextValue( "diffuseColor: ") + ']' ); this.setProperty( "diffuseColor", diffuseColor ); 393 }
387 var specularColor = eval( "[" + pu.nextValue( "specularColor: ") + ']' ); this.setProperty( "specularColor", specularColor ); 394 }
388 var specularPower = eval( "[" + pu.nextValue( "specularPower: ") + ']' ); this.setProperty( "specularPower", specularPower ); 395 }
389 } 396 }
390
391 var lightProps = pu.nextValue( "lightProps: " );
392 if (lightProps)
393 {
394 this._lights = [];
395 var lightStr;
396 for (var i=0; i<this._MAX_LIGHTS; i++)
397 {
398 var type = pu.nextValue( "light" + i + ": " );
399 if (type)
400 {
401 var light = new Object;
402 switch (type)
403 {
404 case "directional":
405 lightStr = pu.nextValue( 'light' + i + 'Dir: ');
406 light.direction = eval( "[" + lightStr + "]" );
407 break;
408
409 case "spot":
410 lightStr = pu.nextValue( 'light' + i + 'Pos: ' );
411 light.position = eval( "[" + lightStr + "]" );
412
413 lightStr = pu.nextValue( 'light' + i + 'OuterSpotCutoff: ' );
414 light['spotInnerCutoff'] = Number( lightStr );
415
416 lightStr = pu.nextValue( 'light' + i + 'InnerSpotCutoff: ' );
417 light['spotOuterCutoff'] = Number( lightStr );
418 break;
419
420 case "point":
421 lightStr = pu.nextValue( 'light' + i + 'Pos: ' );
422 light.position = eval( "[" + lightStr + "]" );
423
424 lightStr = pu.nextValue( 'light' + i + 'Attenuation: ' );
425 light.attenuation = eval( "[" + lightStr + "]" );
426 break;
427
428 default:
429 throw new Error( "unrecognized light type on import: " + type );
430 break;
431 }
432
433 // common to all lights
434 light.diffuseColor = eval( "[" + pu.nextValue( 'light' + i + 'Color: ') + "]" );
435 light.specularColor = eval( "[" + pu.nextValue( 'light' + i + 'SpecularColor: ') + "]" );
436
437 // push the light
438 this._lights.push( light );
439 }
440 else
441 this._lights[i] = 'undefined';
442
443 // advance to the next light
444 var endLightKey = "endMaterial\n";
445 index = importStr.indexOf( endLightKey );
446 if (index < 0) throw new Error( "ill-formed light encountered in import" );
447 index += endLightKey.length;
448 importStr = importStr.slice( 0, index );
449
450 }
451
452 if (this._lights.length > 0)
453 {
454 this._ubershaderCaps.lighting =
455 {
456 'light0' : this._lights[0],
457 'light1' : this._lights[1],
458 'light2' : this._lights[2],
459 'light3' : this._lights[3]
460 }
461 }
462 }
463
464 var diffuseMap = pu.nextValue( "diffuseMap: " )
465 if(diffuseMap)
466 this.setProperty( "diffuseMap", diffuseMap );
467
468 var normalMap = pu.nextValue( "normalMap: " );
469 if(normalMap)
470 this.setProperty( "normalMap", normalMap );
471
472 var specularMap = pu.nextValue( "specularMap: " );
473 if(specularMap)
474 this.setProperty( "specularMap", specularMap );
475
476 var environmentMap = pu.nextValue( "environmentMap: " );
477 if(environmentMap)
478 {
479 this.setProperty( "environmentMap", environmentMap );
480 this.setProperty( "environmentAmount", Number( pu.nextValue( "environmentAmount" ) ) );
481 }
482 397
483 this.rebuildShader(); 398 this.isAnimated = function()
484 } 399 {
400 var anim = (this._diffuseTexture && this._diffuseTexture.isAnimated());
401 return anim;
402 }
485 403
486 this.importJSON = function( jObj ) 404 this.importJSON = function( jObj )
487 { 405 {
@@ -658,88 +576,6 @@ var UberMaterial = function UberMaterial() {
658 return jObj; 576 return jObj;
659 } 577 }
660 578
661
662 this.export = function()