From 3b18b59852a4671231de651805a3d1e5004d54cc Mon Sep 17 00:00:00 2001 From: -=yb4f310 Date: Tue, 13 Feb 2018 15:52:51 +0100 Subject: [PATCH] points material, raw shader, fixed aspect ratios for orthographic cams --- src/game-lib-a-component-a.js | 16 +- src/game-lib-controls-0.js | 2 +- src/game-lib-controls-d3-editor.js | 2 +- src/game-lib-controls-keyboard.js | 4 +- src/game-lib-controls-touch.js | 4 +- src/game-lib-d3-api-camera-a.js | 29 +-- src/game-lib-d3-api-camera-orthographic.js | 45 ++++- src/game-lib-d3-api-material-a.js | 17 +- src/game-lib-d3-api-material-points.js | 92 +++++++++ ...s => game-lib-d3-api-material-shader-a.js} | 0 src/game-lib-d3-api-material-shader-raw.js | 43 +++++ src/game-lib-d3-api-mesh-0.js | 3 + src/game-lib-d3-api-z-animation.js | 2 + src/game-lib-d3-camera-a.js | 17 +- src/game-lib-d3-camera-orthographic.js | 177 +++++++++++++++--- src/game-lib-d3-material-a.js | 4 + src/game-lib-d3-material-basic.js | 30 +-- src/game-lib-d3-material-phong.js | 50 +---- src/game-lib-d3-material-points.js | 114 +++++++++++ ...er.js => game-lib-d3-material-shader-a.js} | 0 src/game-lib-d3-material-shader-raw.js | 99 ++++++++++ src/game-lib-d3-material-standard.js | 55 ++---- src/game-lib-d3-mesh-0.js | 13 +- src/game-lib-d3-scene.js | 14 +- src/game-lib-system-gui.js | 19 +- src/game-lib-system-render.js | 20 ++ 26 files changed, 685 insertions(+), 186 deletions(-) create mode 100644 src/game-lib-d3-api-material-points.js rename src/{game-lib-d3-api-material-shader.js => game-lib-d3-api-material-shader-a.js} (100%) create mode 100644 src/game-lib-d3-api-material-shader-raw.js create mode 100644 src/game-lib-d3-material-points.js rename src/{game-lib-d3-material-shader.js => game-lib-d3-material-shader-a.js} (100%) create mode 100644 src/game-lib-d3-material-shader-raw.js diff --git a/src/game-lib-a-component-a.js b/src/game-lib-a-component-a.js index e3312c0..76e6924 100644 --- a/src/game-lib-a-component-a.js +++ b/src/game-lib-a-component-a.js @@ -397,8 +397,10 @@ GameLib.Component.SHADER = 0x9e; GameLib.Component.SHADER_VERTEX = 0x9f; GameLib.Component.SHADER_FRAGMENT = 0xa0; GameLib.Component.GEOMETRY_BUFFER_INSTANCED = 0xa1; +GameLib.Component.MATERIAL_SHADER_RAW = 0xa2; +GameLib.Component.MATERIAL_POINTS = 0xa3; -GameLib.Component.MAX_COMPONENTS = 0xa2; +GameLib.Component.MAX_COMPONENTS = 0xa4; GameLib.Component.GRAPHICS_RUNTIME = 0x1; GameLib.Component.PHYSICS_RUNTIME = 0x2; @@ -1385,6 +1387,18 @@ GameLib.Component.GetComponentInfo = function(number) { constructor : GameLib.D3.Geometry.Buffer.Instanced, apiConstructor : GameLib.D3.API.Geometry.Buffer.Instanced }; + case 0xa2 : return { + name : 'GameLib.D3.Material.Shader.Raw', + runtime : GameLib.Component.GRAPHICS_RUNTIME, + constructor : GameLib.D3.Material.Shader.Raw, + apiConstructor : GameLib.D3.API.Material.Shader.Raw + }; + case 0xa3 : return { + name : 'GameLib.D3.Material.Points', + runtime : GameLib.Component.GRAPHICS_RUNTIME, + constructor : GameLib.D3.Material.Points, + apiConstructor : GameLib.D3.API.Material.Points + }; break; } diff --git a/src/game-lib-controls-0.js b/src/game-lib-controls-0.js index c7fc187..6481a38 100644 --- a/src/game-lib-controls-0.js +++ b/src/game-lib-controls-0.js @@ -67,7 +67,7 @@ GameLib.Controls.prototype.updateInstance = function(property) { ); } - console.log('default controls update instance'); + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-controls-d3-editor.js b/src/game-lib-controls-d3-editor.js index b30053e..5cec59f 100644 --- a/src/game-lib-controls-d3-editor.js +++ b/src/game-lib-controls-d3-editor.js @@ -98,7 +98,7 @@ GameLib.Controls.D3.Editor.prototype.updateInstance = function(property) { console.warn('an update instance was called on editor controls - which, if not called from within a running system at the right time will affect the order of input event handling and cause system instability'); - GameLib.Controls.prototype.updateInstance.call(this); + GameLib.Controls.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-controls-keyboard.js b/src/game-lib-controls-keyboard.js index 667ab9d..fe6ba33 100644 --- a/src/game-lib-controls-keyboard.js +++ b/src/game-lib-controls-keyboard.js @@ -46,8 +46,8 @@ GameLib.Controls.Keyboard.prototype.createInstance = function() { /** * Update Instance */ -GameLib.Controls.Keyboard.prototype.updateInstance = function() { - GameLib.Controls.prototype.updateInstance.call(this); +GameLib.Controls.Keyboard.prototype.updateInstance = function(property) { + GameLib.Controls.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-controls-touch.js b/src/game-lib-controls-touch.js index 2801d33..9540cba 100644 --- a/src/game-lib-controls-touch.js +++ b/src/game-lib-controls-touch.js @@ -47,8 +47,8 @@ GameLib.Controls.Touch.prototype.createInstance = function() { /** * Update Instance */ -GameLib.Controls.Touch.prototype.updateInstance = function() { - GameLib.Controls.prototype.updateInstance.call(this); +GameLib.Controls.Touch.prototype.updateInstance = function(property) { + GameLib.Controls.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-api-camera-a.js b/src/game-lib-d3-api-camera-a.js index 78e39bc..464496d 100644 --- a/src/game-lib-d3-api-camera-a.js +++ b/src/game-lib-d3-api-camera-a.js @@ -58,7 +58,6 @@ GameLib.D3.API.Camera = function( this.name = name; if (GameLib.Utils.UndefinedOrNull(aspect)) { - //aspect = new GameLib.API.Number(1, 0.001, 0, 5); aspect = 1; } this.aspect = aspect; @@ -91,9 +90,21 @@ GameLib.D3.API.Camera = function( } this.quaternion = quaternion; + GameLib.API.Component.call( + this, + GameLib.D3.API.Camera.GetComponentType(this.cameraType), + parentEntity + ); +}; + +GameLib.D3.API.Camera.prototype = Object.create(GameLib.API.Component.prototype); +GameLib.D3.API.Camera.prototype.constructor = GameLib.D3.API.Camera; + +GameLib.D3.API.Camera.GetComponentType = function(cameraType) { + var componentType = null; - switch (this.cameraType) { + switch (cameraType) { case GameLib.D3.API.Camera.CAMERA_TYPE_PERSPECTIVE : componentType = GameLib.Component.CAMERA_PERSPECTIVE; break; @@ -107,20 +118,16 @@ GameLib.D3.API.Camera = function( componentType = GameLib.Component.CAMERA_CUBE; break; default: - throw new Error('unsupported camera type: ' + this.cameraType); + throw new Error('unsupported camera type: ' + cameraType); } - GameLib.API.Component.call( - this, - componentType, - parentEntity - ); -}; + return componentType; -GameLib.D3.API.Camera.prototype = Object.create(GameLib.API.Component.prototype); -GameLib.D3.API.Camera.prototype.constructor = GameLib.D3.API.Camera; +}; GameLib.D3.API.Camera.CAMERA_TYPE_PERSPECTIVE = 0x1; GameLib.D3.API.Camera.CAMERA_TYPE_ORTHOGRAPHIC = 0x2; GameLib.D3.API.Camera.CAMERA_TYPE_STEREO = 0x3; GameLib.D3.API.Camera.CAMERA_TYPE_CUBE = 0x4; + + diff --git a/src/game-lib-d3-api-camera-orthographic.js b/src/game-lib-d3-api-camera-orthographic.js index 620d323..7bed7c8 100644 --- a/src/game-lib-d3-api-camera-orthographic.js +++ b/src/game-lib-d3-api-camera-orthographic.js @@ -17,7 +17,9 @@ * * @constructor * @param apiCamera + * @param aspectRatioMode * @param width + * @param height * @param near * @param far * @param left @@ -28,7 +30,11 @@ */ GameLib.D3.API.Camera.Orthographic = function( apiCamera, + aspectRatioMode, + minWidth, + minHeight, width, + height, near, far, left, @@ -56,50 +62,67 @@ GameLib.D3.API.Camera.Orthographic = function( apiCamera.lookAt = new GameLib.API.Vector3(0,0,-1); } + if (GameLib.Utils.UndefinedOrNull(aspectRatioMode)) { + aspectRatioMode = GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT; + } + this.aspectRatioMode = aspectRatioMode; + + if (GameLib.Utils.UndefinedOrNull(minWidth)) { + minWidth = 10; + } + this.minWidth = minWidth; + + if (GameLib.Utils.UndefinedOrNull(minHeight)) { + minHeight = 10; + } + this.minHeight = minHeight; + + if (GameLib.Utils.UndefinedOrNull(height)) { + height = 10; + } + this.height = height; + if (GameLib.Utils.UndefinedOrNull(width)) { - //width = GameLib.API.Number(10, 1, 1, 2000); width = 10; } this.width = width; + if (GameLib.Utils.UndefinedOrNull(height)) { + height = 10; + } + this.height = height; + if (GameLib.Utils.UndefinedOrNull(near)) { - //near = GameLib.API.Number(0.1, 0, 0.1, 2000); near = 0.1; } this.near = near; if (GameLib.Utils.UndefinedOrNull(far)) { - // far = GameLib.API.Number(2000, 0, 0.1, 4000); far = 2000; } this.far = far; if (GameLib.Utils.UndefinedOrNull(left)) { - // left = GameLib.API.Number(-5, 1, -2000, 0); left = -5; } this.left = left; if (GameLib.Utils.UndefinedOrNull(right)) { - //right = GameLib.API.Number(5, 1, 0, 2000); right = 5; } this.right = right; if (GameLib.Utils.UndefinedOrNull(top)) { - //top = GameLib.API.Number(5, 1, 0, 2000); top = 5; } this.top = top; if (GameLib.Utils.UndefinedOrNull(bottom)) { - // bottom = GameLib.API.Number(-5, 1, -2000, 0); bottom = -5; } this.bottom = bottom; if (GameLib.Utils.UndefinedOrNull(zoom)) { - // zoom = new GameLib.API.Number(1, 0.01, 0, 10); zoom = 1; } this.zoom = zoom; @@ -119,4 +142,8 @@ GameLib.D3.API.Camera.Orthographic = function( }; GameLib.D3.API.Camera.Orthographic.prototype = Object.create(GameLib.D3.API.Camera.prototype); -GameLib.D3.API.Camera.Orthographic.prototype.constructor = GameLib.D3.API.Camera.Orthographic; \ No newline at end of file +GameLib.D3.API.Camera.Orthographic.prototype.constructor = GameLib.D3.API.Camera.Orthographic; + +GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_NONE = 0x0; +GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_FIXED = 0x1; +GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT = 0x2; diff --git a/src/game-lib-d3-api-material-a.js b/src/game-lib-d3-api-material-a.js index d6feb5b..e5196d2 100644 --- a/src/game-lib-d3-api-material-a.js +++ b/src/game-lib-d3-api-material-a.js @@ -106,6 +106,12 @@ GameLib.D3.API.Material = function( case GameLib.D3.API.Material.MATERIAL_TYPE_SHADER : name = 'Material Shader'; break; + case GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW : + name = 'Material Shader Raw'; + break; + case GameLib.D3.API.Material.MATERIAL_TYPE_POINTS : + name = 'Material Points'; + break; default : console.warn('no nice name for material'); name = 'Material'; @@ -219,7 +225,9 @@ GameLib.D3.API.Material = function( if ( this.materialType === GameLib.D3.API.Material.MATERIAL_TYPE_BASIC || - this.materialType === GameLib.D3.API.Material.MATERIAL_TYPE_SHADER + this.materialType === GameLib.D3.API.Material.MATERIAL_TYPE_SHADER || + this.materialType === GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW || + this.materialType === GameLib.D3.API.Material.MATERIAL_TYPE_POINTS ) { lights = false; } else { @@ -322,6 +330,12 @@ GameLib.D3.API.Material.GetComponentType = function(materialType) { case GameLib.D3.API.Material.MATERIAL_TYPE_SHADER : componentType = GameLib.Component.MATERIAL_SHADER; break; + case GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW : + componentType = GameLib.Component.MATERIAL_SHADER_RAW; + break; + case GameLib.D3.API.Material.MATERIAL_TYPE_POINTS : + componentType = GameLib.Component.MATERIAL_POINTS; + break; default : throw new Error('unhandled material type: ' + materialType); } @@ -431,6 +445,7 @@ GameLib.D3.API.Material.MATERIAL_TYPE_POINTS = 0x9; GameLib.D3.API.Material.MATERIAL_TYPE_SPRITE = 0xa; GameLib.D3.API.Material.MATERIAL_TYPE_TOON = 0xb; GameLib.D3.API.Material.MATERIAL_TYPE_SHADER = 0xc; +GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW = 0xd; /** * Line Cap diff --git a/src/game-lib-d3-api-material-points.js b/src/game-lib-d3-api-material-points.js new file mode 100644 index 0000000..9a17b9b --- /dev/null +++ b/src/game-lib-d3-api-material-points.js @@ -0,0 +1,92 @@ +/** + * GameLib.D3.API.Material.Points + * @param apiMaterial + * @param color + * @param diffuseMap + * @param size + * @param sizeAttenuation + * @constructor + */ +GameLib.D3.API.Material.Points = function( + apiMaterial, + color, + diffuseMap, + size, + sizeAttenuation +) { + + if (GameLib.Utils.UndefinedOrNull(apiMaterial)) { + apiMaterial = { + materialType: GameLib.D3.API.Material.MATERIAL_TYPE_POINTS + }; + } + + if (GameLib.Utils.UndefinedOrNull(apiMaterial.materialType)) { + apiMaterial.materialType = GameLib.D3.API.Material.MATERIAL_TYPE_POINTS; + } + + if (GameLib.Utils.UndefinedOrNull(color)) { + color = new GameLib.API.Color(1, 1, 1, 1) + } + this.color = color; + + if (GameLib.Utils.UndefinedOrNull(diffuseMap)) { + diffuseMap = null; + } + this.diffuseMap = diffuseMap; + + if (GameLib.Utils.UndefinedOrNull(size)) { + size = 1; + } + this.size = size; + + if (GameLib.Utils.UndefinedOrNull(sizeAttenuation)) { + sizeAttenuation = true; + } + this.sizeAttenuation = sizeAttenuation; + + GameLib.D3.API.Material.call( + this, + apiMaterial.id, + apiMaterial.name, + apiMaterial.materialType, + apiMaterial.parentEntity, + apiMaterial.parentMeshes, + apiMaterial.alphaTest, + apiMaterial.blendDst, + apiMaterial.blendDstAlpha, + apiMaterial.blendEquation, + apiMaterial.blendEquationAlpha, + apiMaterial.blending, + apiMaterial.blendSrc, + apiMaterial.blendSrcAlpha, + apiMaterial.clipIntersection, + apiMaterial.clippingPlanes, + apiMaterial.clipShadows, + apiMaterial.colorWrite, + apiMaterial.customDepthMaterial, + apiMaterial.customDistanceMaterial, + apiMaterial.defines, + apiMaterial.depthFunc, + apiMaterial.depthTest, + apiMaterial.depthWrite, + apiMaterial.fog, + apiMaterial.lights, + apiMaterial.opacity, + apiMaterial.overdraw, + apiMaterial.polygonOffset, + apiMaterial.polygonOffsetFactor, + apiMaterial.polygonOffsetUnits, + apiMaterial.precision, + apiMaterial.premultipliedAlpha, + apiMaterial.dithering, + apiMaterial.flatShading, + apiMaterial.side, + apiMaterial.transparent, + apiMaterial.vertexColors, + apiMaterial.visible + ); +}; + +GameLib.D3.API.Material.Points.prototype = Object.create(GameLib.D3.API.Material.prototype); +GameLib.D3.API.Material.Points.prototype.constructor = GameLib.D3.API.Material.Points; diff --git a/src/game-lib-d3-api-material-shader.js b/src/game-lib-d3-api-material-shader-a.js similarity index 100% rename from src/game-lib-d3-api-material-shader.js rename to src/game-lib-d3-api-material-shader-a.js diff --git a/src/game-lib-d3-api-material-shader-raw.js b/src/game-lib-d3-api-material-shader-raw.js new file mode 100644 index 0000000..c10288d --- /dev/null +++ b/src/game-lib-d3-api-material-shader-raw.js @@ -0,0 +1,43 @@ +/** + * GameLib.D3.API.Material.Shader.Raw + * @param apiMaterialShader + * @constructor + */ +GameLib.D3.API.Material.Shader.Raw = function( + apiMaterialShader +) { + + if (GameLib.Utils.UndefinedOrNull(apiMaterialShader)) { + apiMaterialShader = { + materialType: GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW + }; + } + + if (GameLib.Utils.UndefinedOrNull(apiMaterialShader.materialType)) { + apiMaterialShader.materialType = GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW; + } + + GameLib.D3.API.Material.Shader.call( + this, + apiMaterialShader, + apiMaterialShader.clipping, + apiMaterialShader.defaultAttributeValues, + apiMaterialShader.extensions, + apiMaterialShader.fog, + apiMaterialShader.fragmentShader, + apiMaterialShader.index0AttributeName, + apiMaterialShader.linewidth, + apiMaterialShader.morphTargets, + apiMaterialShader.morphNormals, + apiMaterialShader.program, + apiMaterialShader.skinning, + apiMaterialShader.uniforms, + apiMaterialShader.vertexColors, + apiMaterialShader.vertexShader, + apiMaterialShader.wireframe, + apiMaterialShader.wireframeLinewidth + ); +}; + +GameLib.D3.API.Material.Shader.Raw.prototype = Object.create(GameLib.D3.API.Material.Shader.prototype); +GameLib.D3.API.Material.Shader.Raw.prototype.constructor = GameLib.D3.API.Material.Shader.Raw; diff --git a/src/game-lib-d3-api-mesh-0.js b/src/game-lib-d3-api-mesh-0.js index a9e2b34..d1ffe39 100644 --- a/src/game-lib-d3-api-mesh-0.js +++ b/src/game-lib-d3-api-mesh-0.js @@ -63,6 +63,9 @@ GameLib.D3.API.Mesh = function( if (GameLib.Utils.UndefinedOrNull(name)) { switch (this.meshType) { + case GameLib.D3.API.Mesh.MESH_TYPE_NORMAL : + name = 'Mesh'; + break; case GameLib.D3.API.Mesh.MESH_TYPE_BOX : name = 'Mesh Box'; break; diff --git a/src/game-lib-d3-api-z-animation.js b/src/game-lib-d3-api-z-animation.js index abcec93..e2d5431 100644 --- a/src/game-lib-d3-api-z-animation.js +++ b/src/game-lib-d3-api-z-animation.js @@ -172,6 +172,8 @@ GameLib.D3.Animation.prototype.updateInstance = function(property, item) { ) } + GameLib.Component.prototype.updateInstance.call(this, property); + }; /** diff --git a/src/game-lib-d3-camera-a.js b/src/game-lib-d3-camera-a.js index 3dddfb8..d404331 100644 --- a/src/game-lib-d3-camera-a.js +++ b/src/game-lib-d3-camera-a.js @@ -111,15 +111,14 @@ GameLib.D3.Camera.prototype.createInstance = function() { this.instance.aspect = this.aspect; } - if (GameLib.Utils.Defined(this.instance.lookAt)) { - if (this.instance.isCamera) { - - /** - * For some reason - cube camera does not think it is a camera - so it does a lookAt differently - - * which messes up its rotation - */ - this.instance.lookAt(this.lookAt.instance); - } + /** + * Only do lookAt for stereo and cube cameras + */ + if ( + this.cameraType === GameLib.D3.API.Camera.CAMERA_TYPE_STEREO || + this.cameraType === GameLib.D3.API.Camera.CAMERA_TYPE_PERSPECTIVE + ) { + this.instance.lookAt(this.lookAt.instance); } if (GameLib.Utils.Defined(this.instance.updateProjectionMatrix)) { diff --git a/src/game-lib-d3-camera-orthographic.js b/src/game-lib-d3-camera-orthographic.js index e6fcb14..c9a88de 100644 --- a/src/game-lib-d3-camera-orthographic.js +++ b/src/game-lib-d3-camera-orthographic.js @@ -23,7 +23,11 @@ GameLib.D3.Camera.Orthographic = function( GameLib.D3.API.Camera.Orthographic.call( this, apiOrthographicCamera, + apiOrthographicCamera.aspectRatioMode, + apiOrthographicCamera.minWidth, + apiOrthographicCamera.minHeight, apiOrthographicCamera.width, + apiOrthographicCamera.height, apiOrthographicCamera.near, apiOrthographicCamera.far, apiOrthographicCamera.left, @@ -59,6 +63,21 @@ GameLib.D3.Camera.Orthographic.prototype.createInstance = function() { this.far ); + if ( + this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_FIXED || + this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT + ) { + + if (this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT) { + + var size = GameLib.Utils.GetWindowSize(); + + this.aspect = size.width / size.height; + } + + this.updateFromAspectRatio(); + } + GameLib.D3.Camera.prototype.createInstance.call(this); }; @@ -67,32 +86,53 @@ GameLib.D3.Camera.Orthographic.prototype.createInstance = function() { */ GameLib.D3.Camera.Orthographic.prototype.updateInstance = function(property) { - var width, height; + var size; - if ( - property === 'width' || - property === 'aspect' - ) { + if (property === 'aspectRatioMode') { - if (!this.fixedAspectRatio) { - console.warn('changing the aspect ratio when this camera is not in fixedAspectRatio mode has no effect'); + if (this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_NONE) { + this.updateFromDimensions(); return; } - height = this.width / this.aspect; + if (this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_FIXED) { + this.updateFromAspectRatio(); + return; + } - this.left = this.width / -2; - this.right = this.width / 2; + if (this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT) { - this.top = height / 2; - this.bottom = height / -2; + size = GameLib.Utils.GetWindowSize(); - this.instance.left = this.left; - this.instance.right = this.right; - this.instance.top = this.top; - this.instance.bottom = this.bottom; + this.aspect = size.width / size.height; - this.instance.updateProjectionMatrix(); + this.updateFromAspectRatio(); + return; + } + } + + if ( + property === 'width' || + property === 'height' || + property === 'minWidth' || + property === 'minHeight' || + property === 'aspect' + ) { + + if ( + this.aspectRatioMode !== GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_FIXED && + this.aspectRatioMode !== GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT + ) { + console.warn('changing the this value when this camera is not in the right aspect ratio mode has no effect'); + return; + } + + if (this.aspectRatioMode === GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT) { + size = GameLib.Utils.GetWindowSize(); + this.aspect = size.width / size.height; + } + + this.updateFromAspectRatio(); return; } @@ -103,18 +143,25 @@ GameLib.D3.Camera.Orthographic.prototype.updateInstance = function(property) { property === 'top' || property === 'bottom' ) { - this.instance.left = this.left; - this.instance.right = this.right; - this.instance.top = this.top; - this.instance.bottom = this.bottom; - width = this.right - this.left; - height = this.top - this.bottom; + if ( + this.aspectRatioMode === GameLib.D3.API.Camera.ASPECT_RATIO_MODE_FIXED || + this.aspectRatioMode === GameLib.D3.API.Camera.ASPECT_RATIO_MODE_BASED_ON_CURRENT + ) { + console.warn('changing this value within a fixed aspect ratio has no effect'); + return; + } + + this.updateFromDimensions(); - this.aspect = width / height; return; } + if (property === 'zoom') { + this.instance.zoom = this.zoom; + this.instance.updateProjectionMatrix(); + } + GameLib.D3.Camera.prototype.updateInstance.call(this, property); }; @@ -128,7 +175,11 @@ GameLib.D3.Camera.Orthographic.prototype.toApiObject = function() { var apiOrthographicCamera = new GameLib.D3.API.Camera.Orthographic( apiCamera, + this.aspectRatioMode, + this.minWidth, + this.minHeight, this.width, + this.height, this.near, this.far, this.left, @@ -142,13 +193,77 @@ GameLib.D3.Camera.Orthographic.prototype.toApiObject = function() { }; GameLib.D3.Camera.Orthographic.prototype.updateFromInstance = function() { - this.width = this.instance.right - this.instance.left; - this.near = this.instance.near; - this.far = this.instance.far; - this.left = this.instance.left; - this.right = this.instance.right; - this.top = this.instance.top; + this.width = this.instance.right - this.instance.left; + this.height = this.instance.top - this.instance.bottom; + this.near = this.instance.near; + this.far = this.instance.far; + this.left = this.instance.left; + this.right = this.instance.right; + this.top = this.instance.top; this.bottom = this.instance.bottom; - this.zoom = this.instance.zoom; + this.zoom = this.instance.zoom; GameLib.D3.Camera.prototype.updateFromInstance.call(this); +}; + +GameLib.D3.Camera.Orthographic.prototype.updateFromAspectRatio = function() { + + if (this.aspect < 1) { + /** + * Make height dependend on width + */ + this.width = this.minWidth; + this.height = this.minWidth / this.aspect; + + if (this.height < this.minHeight) { + /** + * We have a problem - our new height is less than our minimum height + */ + this.height = this.minHeight; + this.width = this.aspect * this.height; + } + + } else { + /** + * Make width dependend on height + */ + this.height = this.minHeight; + this.width = this.aspect * this.minHeight; + + if (this.width < this.minWidth) { + /** + * We have a problem - our new width is less than our minimum width + */ + this.width = this.minWidth; + this.height = this.width / this.aspect; + } + } + + this.left = this.width / -2; + this.right = this.width / 2; + + this.top = this.height / 2; + this.bottom = this.height / -2; + + this.instance.left = this.left; + this.instance.right = this.right; + this.instance.top = this.top; + this.instance.bottom = this.bottom; + + this.instance.updateProjectionMatrix(); + +}; + +GameLib.D3.Camera.Orthographic.prototype.updateFromDimensions = function() { + + this.instance.left = this.left; + this.instance.right = this.right; + this.instance.top = this.top; + this.instance.bottom = this.bottom; + + this.width = this.right - this.left; + this.height = this.top - this.bottom; + + this.aspect = this.width / this.height; + + this.instance.updateProjectionMatrix(); }; \ No newline at end of file diff --git a/src/game-lib-d3-material-a.js b/src/game-lib-d3-material-a.js index aafb814..33a0c4c 100644 --- a/src/game-lib-d3-material-a.js +++ b/src/game-lib-d3-material-a.js @@ -100,9 +100,13 @@ GameLib.D3.Material = function( linkedObjects.specularMap = GameLib.D3.Texture; break; case GameLib.D3.API.Material.MATERIAL_TYPE_SHADER : + case GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW : linkedObjects.vertexShader = GameLib.D3.Shader.Vertex; linkedObjects.fragmentShader = GameLib.D3.Shader.Fragment; break; + case GameLib.D3.API.Material.MATERIAL_TYPE_POINTS : + linkedObjects.diffuseMap = GameLib.D3.Texture; + break; default : throw new Error('unhandled material type: ' + this.materialType); diff --git a/src/game-lib-d3-material-basic.js b/src/game-lib-d3-material-basic.js index 135b544..296634a 100644 --- a/src/game-lib-d3-material-basic.js +++ b/src/game-lib-d3-material-basic.js @@ -41,17 +41,11 @@ GameLib.D3.Material.Basic = function( ); if (this.alphaMap instanceof GameLib.D3.API.Texture) { - this.alphaMap = new GameLib.D3.Texture( - this.graphics, - this.alphaMap - ); + this.alphaMap = GameLib.Component.ConstructFromObject(this.alphaMap); } if (this.aoMap instanceof GameLib.D3.API.Texture) { - this.aoMap = new GameLib.D3.Texture( - this.graphics, - this.aoMap - ); + this.aoMap = GameLib.Component.ConstructFromObject(this.aoMap); } this.color = new GameLib.Color( @@ -61,31 +55,19 @@ GameLib.D3.Material.Basic = function( ); if (this.envMap instanceof GameLib.D3.API.Texture) { - this.envMap = new GameLib.D3.Texture( - this.graphics, - this.envMap - ); + this.envMap = GameLib.Component.ConstructFromObject(this.envMap); } if (this.lightMap instanceof GameLib.D3.API.Texture) { - this.lightMap = new GameLib.D3.Texture( - this.graphics, - this.lightMap - ); + this.lightMap = GameLib.Component.ConstructFromObject(this.lightMap); } if (this.diffuseMap instanceof GameLib.D3.API.Texture) { - this.diffuseMap = new GameLib.D3.Texture( - this.graphics, - this.diffuseMap - ); + this.diffuseMap = GameLib.Component.ConstructFromObject(this.diffuseMap); } if (this.specularMap instanceof GameLib.D3.API.Texture) { - this.specularMap = new GameLib.D3.Texture( - this.graphics, - this.specularMap - ); + this.specularMap = GameLib.Component.ConstructFromObject(this.specularMap); } GameLib.D3.Material.call( diff --git a/src/game-lib-d3-material-phong.js b/src/game-lib-d3-material-phong.js index 2d21dff..0226f3a 100644 --- a/src/game-lib-d3-material-phong.js +++ b/src/game-lib-d3-material-phong.js @@ -54,24 +54,15 @@ GameLib.D3.Material.Phong = function( ); if (this.alphaMap instanceof GameLib.D3.API.Texture) { - this.alphaMap = new GameLib.D3.Texture( - this.graphics, - this.alphaMap - ); + this.alphaMap = GameLib.Component.ConstructFromObject(this.alphaMap); } if (this.aoMap instanceof GameLib.D3.API.Texture) { - this.aoMap = new GameLib.D3.Texture( - this.graphics, - this.aoMap - ); + this.aoMap = GameLib.Component.ConstructFromObject(this.aoMap); } if (this.bumpMap instanceof GameLib.D3.API.Texture) { - this.bumpMap = new GameLib.D3.Texture( - this.graphics, - this.bumpMap - ); + this.bumpMap = GameLib.Component.ConstructFromObject(this.bumpMap); } this.color = new GameLib.Color( @@ -81,10 +72,7 @@ GameLib.D3.Material.Phong = function( ); if (this.displacementMap instanceof GameLib.D3.API.Texture) { - this.displacementMap = new GameLib.D3.Texture( - this.graphics, - this.displacementMap - ); + this.displacementMap = GameLib.Component.ConstructFromObject(this.displacementMap); } this.emissive = new GameLib.Color( @@ -94,38 +82,23 @@ GameLib.D3.Material.Phong = function( ); if (this.emissiveMap instanceof GameLib.D3.API.Texture) { - this.emissiveMap = new GameLib.D3.Texture( - this.graphics, - this.emissiveMap - ); + this.emissiveMap = GameLib.Component.ConstructFromObject(this.emissiveMap); } if (this.envMap instanceof GameLib.D3.API.Texture) { - this.envMap = new GameLib.D3.Texture( - this.graphics, - this.envMap - ); + this.envMap = GameLib.Component.ConstructFromObject(this.envMap); } if (this.lightMap instanceof GameLib.D3.API.Texture) { - this.lightMap = new GameLib.D3.Texture( - this.graphics, - this.lightMap - ); + this.lightMap = GameLib.Component.ConstructFromObject(this.lightMap); } if (this.diffuseMap instanceof GameLib.D3.API.Texture) { - this.diffuseMap = new GameLib.D3.Texture( - this.graphics, - this.diffuseMap - ); + this.diffuseMap = GameLib.Component.ConstructFromObject(this.diffuseMap); } if (this.normalMap instanceof GameLib.D3.API.Texture) { - this.normalMap = new GameLib.D3.Texture( - this.graphics, - this.normalMap - ); + this.normalMap = GameLib.Component.ConstructFromObject(this.normalMap); } this.specular = new GameLib.Color( @@ -135,10 +108,7 @@ GameLib.D3.Material.Phong = function( ); if (this.specularMap instanceof GameLib.D3.API.Texture) { - this.specularMap = new GameLib.D3.Texture( - this.graphics, - this.specularMap - ); + this.specularMap = GameLib.Component.ConstructFromObject(this.specularMap); } GameLib.D3.Material.call( diff --git a/src/game-lib-d3-material-points.js b/src/game-lib-d3-material-points.js new file mode 100644 index 0000000..d60ece0 --- /dev/null +++ b/src/game-lib-d3-material-points.js @@ -0,0 +1,114 @@ +/** + * GameLib.D3.Material.Points + * @param graphics + * @param apiMaterialPoints + * @constructor + */ +GameLib.D3.Material.Points = function( + graphics, + apiMaterialPoints +) { + this.graphics = graphics; + this.graphics.isNotThreeThrow(); + + if (GameLib.Utils.UndefinedOrNull(apiMaterialPoints)) { + apiMaterialPoints = { + materialType : GameLib.D3.API.Material.MATERIAL_TYPE_POINTS + }; + } + + GameLib.D3.API.Material.Points.call( + this, + apiMaterialPoints, + apiMaterialPoints.color, + apiMaterialPoints.diffuseMap, + apiMaterialPoints.size, + apiMaterialPoints.sizeAttenuation + ); + + this.color = new GameLib.Color( + this.graphics, + this.color, + this + ); + + if (this.diffuseMap instanceof GameLib.D3.API.Texture) { + this.diffuseMap = GameLib.Component.ConstructFromObject(this.diffuseMap); + } + + GameLib.D3.Material.call( + this, + this.graphics, + this + ); + +}; + +GameLib.D3.Material.Points.prototype = Object.create(GameLib.D3.Material.prototype); +GameLib.D3.Material.Points.prototype.constructor = GameLib.D3.Material.Points; + +/** + * Creates an instance of our texture object + * @returns {*} + */ +GameLib.D3.Material.Points.prototype.createInstance = function() { + + this.instance = new THREE.PointsMaterial( + { + color : this.color.instance, + map : this.diffuseMap ? this.diffuseMap.instance : null, + size : this.size, + sizeAttenuation : this.sizeAttenuation + } + ); + + GameLib.D3.Material.prototype.createInstance.call(this); +}; + +/** + * Updates the instance with the current state + */ +GameLib.D3.Material.Points.prototype.updateInstance = function(property) { + + if (property === 'color') { + this.instance.color = this.color.instance; + return; + } + + if (property === 'diffuseMap') { + this.assignTexture('map', property); + return; + } + + if (property === 'size') { + this.instance.size = this.size; + return; + } + + if (property === 'sizeAttenuation') { + this.instance.sizeAttenuation = this.sizeAttenuation; + this.instance.needsUpdate = true; + return; + } + + GameLib.D3.Material.prototype.updateInstance.call(this, property); +}; + +/** + * Converts a GameLib.D3.Material.Points to a GameLib.D3.API.Material.Points + * @returns {GameLib.D3.API.Material.Points} + */ +GameLib.D3.Material.Points.prototype.toApiObject = function() { + + var apiMaterial = GameLib.D3.Material.prototype.toApiObject.call(this); + + var apiMaterialPoints = new GameLib.D3.API.Material.Points( + apiMaterial, + this.color.toApiObject(), + GameLib.Utils.IdOrNull(this.diffuseMap), + this.size, + this.sizeAttenuation + ); + + return apiMaterialPoints; +}; diff --git a/src/game-lib-d3-material-shader.js b/src/game-lib-d3-material-shader-a.js similarity index 100% rename from src/game-lib-d3-material-shader.js rename to src/game-lib-d3-material-shader-a.js diff --git a/src/game-lib-d3-material-shader-raw.js b/src/game-lib-d3-material-shader-raw.js new file mode 100644 index 0000000..63fd8b1 --- /dev/null +++ b/src/game-lib-d3-material-shader-raw.js @@ -0,0 +1,99 @@ +/** + * GameLib.D3.Material.Shader.Raw + * @param graphics + * @param apiMaterialShaderRaw + * @constructor + */ +GameLib.D3.Material.Shader.Raw = function( + graphics, + apiMaterialShaderRaw +) { + this.graphics = graphics; + this.graphics.isNotThreeThrow(); + + if (GameLib.Utils.UndefinedOrNull(apiMaterialShaderRaw)) { + apiMaterialShaderRaw = { + materialType : GameLib.D3.API.Material.MATERIAL_TYPE_SHADER_RAW + }; + } + + GameLib.D3.API.Material.Shader.Raw.call( + this, + apiMaterialShaderRaw + ); + + GameLib.D3.Material.Shader.call( + this, + this.graphics, + this + ); + +}; + +GameLib.D3.Material.Shader.Raw.prototype = Object.create(GameLib.D3.Material.Shader.prototype); +GameLib.D3.Material.Shader.Raw.prototype.constructor = GameLib.D3.Material.Shader.Raw; + +/** + * Creates an instance of our texture object + * @returns {*} + */ +GameLib.D3.Material.Shader.Raw.prototype.createInstance = function() { + + var fragmentShader = ''; + var vertexShader = ''; + + if (this.fragmentShader && this.fragmentShader.instance) { + fragmentShader = this.fragmentShader.instance; + } + + if (this.vertexShader && this.vertexShader.instance) { + vertexShader = this.vertexShader.instance; + } + + this.instance = new THREE.RawShaderMaterial( + { + clipping : this.clipping, + defaultAttributeValues : this.defaultAttributeValues, + extensions : this.extensions, + fog : this.fog, + fragmentShader : fragmentShader, + linewidth : this.linewidth, + morphTargets : this.morphTargets, + morphNormals : this.morphNormals, + skinning : this.skinning, + uniforms : this.uniforms, + vertexColors : this.vertexColors, + vertexShader : vertexShader, + wireframe : this.wireframe, + wireframeLinewidth : this.wireframeLinewidth + } + ); + + if (GameLib.Utils.Defined(this.index0AttributeName)) { + this.instance.index0AttributeName = this.index0AttributeName; + } + + GameLib.D3.Material.prototype.createInstance.call(this); +}; + +/** + * Updates the instance with the current state + */ +GameLib.D3.Material.Shader.Raw.prototype.updateInstance = function(property) { + GameLib.D3.Material.Shader.prototype.updateInstance.call(this, property); +}; + +/** + * Converts a GameLib.D3.Material.Shader.Raw to a GameLib.D3.API.Material.Shader.Raw + * @returns {GameLib.D3.API.Material.Shader.Raw} + */ +GameLib.D3.Material.Shader.Raw.prototype.toApiObject = function() { + + var apiMaterialShader = GameLib.D3.Material.Shader.prototype.toApiObject.call(this); + + var apiMaterialShaderRaw = new GameLib.D3.API.Material.Shader.Raw( + apiMaterialShader + ); + + return apiMaterialShaderRaw; +}; diff --git a/src/game-lib-d3-material-standard.js b/src/game-lib-d3-material-standard.js index 988f351..f4762d7 100644 --- a/src/game-lib-d3-material-standard.js +++ b/src/game-lib-d3-material-standard.js @@ -54,24 +54,15 @@ GameLib.D3.Material.Standard = function( ); if (this.alphaMap instanceof GameLib.D3.API.Texture) { - this.alphaMap = new GameLib.D3.Texture( - this.graphics, - this.alphaMap - ); + this.alphaMap = GameLib.Component.ConstructFromObject(this.alphaMap); } if (this.aoMap instanceof GameLib.D3.API.Texture) { - this.aoMap = new GameLib.D3.Texture( - this.graphics, - this.aoMap - ); + this.aoMap = GameLib.Component.ConstructFromObject(this.aoMap); } if (this.bumpMap instanceof GameLib.D3.API.Texture) { - this.bumpMap = new GameLib.D3.Texture( - this.graphics, - this.bumpMap - ); + this.bumpMap = GameLib.Component.ConstructFromObject(this.bumpMap); } @@ -82,10 +73,7 @@ GameLib.D3.Material.Standard = function( ); if (this.displacementMap instanceof GameLib.D3.API.Texture) { - this.displacementMap = new GameLib.D3.Texture( - this.graphics, - this.displacementMap - ); + this.displacementMap = GameLib.Component.ConstructFromObject(this.displacementMap); } this.emissive = new GameLib.Color( @@ -95,52 +83,31 @@ GameLib.D3.Material.Standard = function( ); if (this.emissiveMap instanceof GameLib.D3.API.Texture) { - this.emissiveMap = new GameLib.D3.Texture( - this.graphics, - this.emissiveMap - ); + this.emissiveMap = GameLib.Component.ConstructFromObject(this.emissiveMap); } if (this.envMap instanceof GameLib.D3.API.Texture) { - this.envMap = new GameLib.D3.Texture( - this.graphics, - this.envMap - ); + this.envMap = GameLib.Component.ConstructFromObject(this.envMap); } if (this.lightMap instanceof GameLib.D3.API.Texture) { - this.lightMap = new GameLib.D3.Texture( - this.graphics, - this.lightMap - ); + this.lightMap = GameLib.Component.ConstructFromObject(this.lightMap); } if (this.diffuseMap instanceof GameLib.D3.API.Texture) { - this.diffuseMap = new GameLib.D3.Texture( - this.graphics, - this.diffuseMap - ); + this.diffuseMap = GameLib.Component.ConstructFromObject(this.diffuseMap); } if (this.metalnessMap instanceof GameLib.D3.API.Texture) { - this.metalnessMap = new GameLib.D3.Texture( - this.graphics, - this.metalnessMap - ); + this.metalnessMap = GameLib.Component.ConstructFromObject(this.metalnessMap); } if (this.normalMap instanceof GameLib.D3.API.Texture) { - this.normalMap = new GameLib.D3.Texture( - this.graphics, - this.normalMap - ); + this.normalMap = GameLib.Component.ConstructFromObject(this.normalMap); } if (this.roughnessMap instanceof GameLib.D3.API.Texture) { - this.roughnessMap = new GameLib.D3.Texture( - this.graphics, - this.roughnessMap - ); + this.roughnessMap = GameLib.Component.ConstructFromObject(this.roughnessMap); } GameLib.D3.Material.call( diff --git a/src/game-lib-d3-mesh-0.js b/src/game-lib-d3-mesh-0.js index fa30126..77b33ef 100644 --- a/src/game-lib-d3-mesh-0.js +++ b/src/game-lib-d3-mesh-0.js @@ -190,12 +190,13 @@ GameLib.D3.Mesh.prototype.createInstance = function() { } - if (GameLib.Utils.Defined(this.parentScene)) { - if (GameLib.Utils.UndefinedOrNull(this.parentScene.instance)) { - console.warn('parent scene not linked at time of create instance'); - } else { - this.parentScene.add(this.instance, this); - } + if ( + GameLib.Utils.Defined(this.parentScene) && + GameLib.Utils.Defined(this.parentScene.instance) + ) { + this.parentScene.addObject(this); + } else { + console.warn('parent scene not linked yet'); } this.instance.position.x = this.position.x; diff --git a/src/game-lib-d3-scene.js b/src/game-lib-d3-scene.js index 1c8e208..b2017d9 100644 --- a/src/game-lib-d3-scene.js +++ b/src/game-lib-d3-scene.js @@ -375,6 +375,8 @@ GameLib.D3.Scene.prototype.addObject = function(object) { if (this.instance.children.indexOf(object.instance) === -1) { this.instance.add(object.instance); } + } else { + console.warn('either scene or mesh instance not ready'); } // if (this.parentEntity) { @@ -389,11 +391,21 @@ GameLib.D3.Scene.prototype.addClone = function(component) { component instanceof GameLib.D3.Light ) { if (this.instance && component.instance) { - this.instance.add(component.instance); + if (this.instance.children.indexOf(component.instance) === -1) { + this.instance.add(component.instance); + } } + component.isClone = true; + GameLib.Utils.PushUnique(this.clones, component); + var index = this.meshes.indexOf(component); + + if (index !== -1) { + this.meshes.splice(index, 1); + } + component.parentScene = this; } }; diff --git a/src/game-lib-system-gui.js b/src/game-lib-system-gui.js index 1bd609f..4e33b5f 100644 --- a/src/game-lib-system-gui.js +++ b/src/game-lib-system-gui.js @@ -940,6 +940,18 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, } ) ); + } else if (property === 'aspectRatioMode') { + controllers.push( + folder.add( + object, + property, + { + 'none' : GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_NONE, + 'fixed' : GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_FIXED, + 'based on current' : GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_BASED_ON_CURRENT + } + ) + ); } else if (property === 'socketType') { controllers.push( folder.add( @@ -1192,8 +1204,8 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, 'standard': GameLib.D3.API.Material.MATERIAL_TYPE_STANDARD, 'basic': GameLib.D3.API.Material.MATERIAL_TYPE_BASIC, 'phong': GameLib.D3.API.Material.MATERIAL_TYPE_PHONG, - 'shader': GameLib.D3.API.Material.MATERIAL_TYPE_SHADER - // 'points': GameLib.D3.API.Material.MATERIAL_TYPE_POINTS, + 'shader': GameLib.D3.API.Material.MATERIAL_TYPE_SHADER, + 'points': GameLib.D3.API.Material.MATERIAL_TYPE_POINTS // 'toon': GameLib.D3.API.Material.MATERIAL_TYPE_TOON, // 'line basic' : GameLib.D3.API.Material.MATERIAL_TYPE_LINE_BASIC } @@ -1655,7 +1667,8 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, ) { controllers.push(folder.add(object, property, -2, 2, 0.0001)); } else if ( - property === 'arc' + property === 'arc' || + property === 'size' ) { controllers.push(folder.add(object, property, 0, 200, 0.001)); } else { diff --git a/src/game-lib-system-render.js b/src/game-lib-system-render.js index 96e8601..cc8d710 100644 --- a/src/game-lib-system-render.js +++ b/src/game-lib-system-render.js @@ -244,6 +244,26 @@ GameLib.System.Render.prototype.windowResize = function(data) { } ); + + GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.Camera).map( + function(camera){ + if ( + camera instanceof GameLib.D3.Camera.Orthographic && + camera.aspectRatioMode !== GameLib.D3.API.Camera.Orthographic.ASPECT_RATIO_MODE_NONE + ) { + camera.updateInstance('aspect'); + } + + if ( + camera instanceof GameLib.D3.Camera.Perspective || + camera instanceof GameLib.D3.Camera.Stereo + ) { + camera.aspect = data.width / data.height; + camera.updateInstance('aspect'); + } + } + ); + GameLib.EntityManager.Instance.queryComponents(GameLib.Component.COMPOSER).map( function(composer){