aboutsummaryrefslogtreecommitdiff
path: root/js/lib/rdge/materials/uber-material.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/lib/rdge/materials/uber-material.js')
-rwxr-xr-xjs/lib/rdge/materials/uber-material.js203
1 files changed, 202 insertions, 1 deletions
diff --git a/js/lib/rdge/materials/uber-material.js b/js/lib/rdge/materials/uber-material.js
index 6bc35d51..91f43754 100755
--- a/js/lib/rdge/materials/uber-material.js
+++ b/js/lib/rdge/materials/uber-material.js
@@ -4,6 +4,7 @@
4 (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. 4 (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5 </copyright> */ 5 </copyright> */
6 6
7var MaterialParser = require("js/lib/rdge/materials/material-parser").MaterialParser;
7var Material = require("js/lib/rdge/materials/material").Material; 8var Material = require("js/lib/rdge/materials/material").Material;
8 9
9var UberMaterial = function UberMaterial() { 10var UberMaterial = function UberMaterial() {
@@ -33,6 +34,8 @@ var UberMaterial = function UberMaterial() {
33 this._useEnvironmentMap = true; 34 this._useEnvironmentMap = true;
34 this._useLights = [true, true, true, true]; 35 this._useLights = [true, true, true, true];
35 36
37 this._MAX_LIGHTS = 4;
38
36 /////////////////////////////////////////////////////////////////////// 39 ///////////////////////////////////////////////////////////////////////
37 // Material Property Accessors 40 // Material Property Accessors
38 /////////////////////////////////////////////////////////////////////// 41 ///////////////////////////////////////////////////////////////////////
@@ -363,10 +366,208 @@ var UberMaterial = function UberMaterial() {
363 this._shader = this.buildUberShader( this._ubershaderCaps ); 366 this._shader = this.buildUberShader( this._ubershaderCaps );
364 367
365 // set up the material node 368 // set up the material node
366 this._materialNode = createMaterialNode("uberMaterial"); 369 this._materialNode = createMaterialNode("uberMaterial" + "_" + world.generateUniqueNodeID());
367 this._materialNode.setShader(this._shader); 370 this._materialNode.setShader(this._shader);
368 }; 371 };
369 372
373 this.import = function( importStr )
374 {
375 // limit the key searches to this material
376 var endKey = "endMaterial\n";
377 var index = importStr.indexOf( endKey );
378 index += endKey.length;
379 importStr = importStr.slice( 0, index );
380 var pu = new MaterialParser( importStr );
381
382 var matProps = pu.nextValue( "materialProps: " );
383 if (matProps)
384 {
385 var ambientColor = eval( "[" + pu.nextValue("ambientColor: ") + ']' ); this.setProperty( "ambientColor", ambientColor );
386 var diffuseColor = eval( "[" + pu.nextValue( "diffuseColor: ") + ']' ); this.setProperty( "diffuseColor", diffuseColor );
387 var specularColor = eval( "[" + pu.nextValue( "specularColor: ") + ']' ); this.setProperty( "specularColor", specularColor );
388 var specularPower = eval( "[" + pu.nextValue( "specularPower: ") + ']' ); this.setProperty( "specularPower", specularPower );
389 }
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
483 this.rebuildShader();
484 }
485
486 this.export = function()
487 {
488 // every material needs the base type and instance name
489 var exportStr = "material: " + this.getShaderName() + "\n";
490 exportStr += "name: " + this.getName() + "\n";
491
492 var caps = this._ubershaderCaps;
493
494 // export the material properties
495 if (typeof caps.material != 'undefined')
496 {
497 exportStr += "materialProps: true\n";
498 exportStr += "ambientColor: " + this._ambientColor + "\n";
499 exportStr += "diffuseColor: " + this._diffuseColor + "\n";
500 exportStr += "specularColor: " + this._specularColor + "\n";
501 exportStr += "specularPower: " + this._specularPower + "\n";
502 }
503
504 if (typeof caps.lighting != 'undefined')
505 {
506 exportStr += "lightProps: true\n";
507
508 var light = caps.lighting['light' + i];
509 for (var i=0; i<this._MAX_LIGHTS; i++)
510 {
511 var light = caps.lighting["light" + i];
512 if( typeof light != "undefined")
513 {
514 exportStr += "light" + i + ': ' + light.type + "\n";
515
516 // output the light secific data
517 if (light.type === 'directional')
518 {
519 exportStr += 'light' + i + 'Dir: ' + light['direction'] + '\n';
520 }
521 else if (light.type === 'spot')
522 {
523 exportStr += 'light' + i + 'Pos: ' + light['position'] + '\n';
524 exportStr += 'light' + i + 'SpotInnerCutoff: ' + light['spotInnerCutoff'] + '\n';
525 exportStr += 'light' + i + 'SpotOuterCutoff: ' + light['spotOuterCutoff'] + '\n';
526 }
527 else // light.type === 'point'
528 {
529 exportStr += 'light' + i + 'Pos: ' + (light['position'] || [ 0, 0, 0 ]) + '\n';
530 exportStr += 'light' + i + 'Attenuation: ' + (light['attenuation'] || [ 1, 0, 0 ]) + '\n';
531 }
532
533 // common to all lights
534 exportStr += 'light' + i + 'Color: ' + (light['diffuseColor'] || [ 1,1,1,1 ]) + '\n';
535 exportStr += 'light' + i + 'SpecularColor: ' + (light['specularColor'] || [ 1, 1, 1, 1 ]) + '\n';
536
537 exportStr += "endlight\n";
538 }
539 }
540 }
541
542// this._diffuseMapOb = { 'texture' : 'assets/images/rocky-diffuse.jpg', 'wrap' : 'REPEAT' };
543// this._normalMapOb = { 'texture' : 'assets/images/rocky-normal.jpg', 'wrap' : 'REPEAT' };
544// this._specularMapOb = { 'texture' : 'assets/images/rocky-spec.jpg', 'wrap' : 'REPEAT' };
545// this._environmentMapOb = { 'texture' : 'assets/images/silver.png', 'wrap' : 'CLAMP', 'envReflection' : this._environmentAmount };
546 var world = this.getWorld();
547 if (!world)
548 throw new Error( "no world in material.export, " + this.getName() );
549
550 if(typeof caps.diffuseMap != 'undefined')
551