diff options
Diffstat (limited to 'js/lib/rdge/materials/uber-material.js')
-rwxr-xr-x | js/lib/rdge/materials/uber-material.js | 203 |
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 | ||
7 | var MaterialParser = require("js/lib/rdge/materials/material-parser").MaterialParser; | ||
7 | var Material = require("js/lib/rdge/materials/material").Material; | 8 | var Material = require("js/lib/rdge/materials/material").Material; |
8 | 9 | ||
9 | var UberMaterial = function UberMaterial() { | 10 | var 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 |