diff --git a/src/game-lib-a-1-event.js b/src/game-lib-a-1-event.js index 4c42acd..17f0be4 100644 --- a/src/game-lib-a-1-event.js +++ b/src/game-lib-a-1-event.js @@ -34,7 +34,7 @@ GameLib.Event.TEXTURE_ANIMATED_CHANGE = 0x10; GameLib.Event.ANIMATE_TEXTURE_INSTANCE = 0x11; GameLib.Event.REMOVE_PARTICLE_ENGINE = 0x12; GameLib.Event.GAME_PAUSE = 0x13; -GameLib.Event.TEXTURE_INSTANCE_UPDATED = 0x14; +//GameLib.Event.TEXTURE_INSTANCE_UPDATED = 0x14; GameLib.Event.PLAY_AUDIO = 0x15; GameLib.Event.MATERIAL_INSTANCE_UPDATED = 0x16; GameLib.Event.PAUSE_AUDIO = 0x17; @@ -61,7 +61,7 @@ GameLib.Event.RENDER = 0x2b; GameLib.Event.EVENT_LIST = 0x2c; GameLib.Event.COMPILE_SUCCESS = 0x2d; GameLib.Event.COMPILE_FAILED = 0x2e; -GameLib.Event.TEXTURE_IMAGE_UPDATED = 0x2f; +GameLib.Event.TEXTURE_INSTANCE_UPDATED = 0x2f; //GameLib.Event.PARENT_ENTITY_CHANGED = 0x30; GameLib.Event.MATERIAL_TEXTURES_UPDATED = 0x31; GameLib.Event.DELETE_COMPONENT_ERROR = 0x32; diff --git a/src/game-lib-api-image.js b/src/game-lib-api-image.js index 16e654c..e540914 100644 --- a/src/game-lib-api-image.js +++ b/src/game-lib-api-image.js @@ -1,13 +1,14 @@ /** - * Image + * GameLib.API.Image * @param id * @param name + * @param parentEntity + * @param parentTexture * @param fileName * @param extension * @param path * @param contentType * @param size - * @param parentEntity GameLib.Entity * @constructor */ GameLib.API.Image = function( diff --git a/src/game-lib-d3-api-camera-a.js b/src/game-lib-d3-api-camera-a.js index 52450b9..e22e0be 100644 --- a/src/game-lib-d3-api-camera-a.js +++ b/src/game-lib-d3-api-camera-a.js @@ -24,16 +24,35 @@ GameLib.D3.API.Camera = function( } this.id = id; - if (GameLib.Utils.UndefinedOrNull(name)) { - name = 'Camera (' + this.id + ')'; - } - this.name = name; - if (GameLib.Utils.UndefinedOrNull(cameraType)) { throw new Error('No camera type specified - do not call this constructor directly'); } this.cameraType = cameraType; + if (GameLib.Utils.UndefinedOrNull(name)) { + + switch (this.cameraType) { + case GameLib.D3.API.Camera.CAMERA_TYPE_ORTHOGRAPHIC : + name = 'Camera Orthographic'; + break; + case GameLib.D3.API.Camera.CAMERA_TYPE_PERSPECTIVE : + name = 'Camera Perspective'; + break; + case GameLib.D3.API.Camera.CAMERA_TYPE_CUBE : + name = 'Camera Cube'; + break; + case GameLib.D3.API.Camera.CAMERA_TYPE_STEREO : + name = 'Camera Stereo'; + break; + default : + console.warn('no nice name for camera'); + name = 'Camera'; + } + + name += ' (' + this.id + ')'; + } + this.name = name; + if (GameLib.Utils.UndefinedOrNull(aspect)) { //aspect = new GameLib.API.Number(1, 0.001, 0, 5); aspect = 1; diff --git a/src/game-lib-d3-api-camera-cube.js b/src/game-lib-d3-api-camera-cube.js index ea92633..48255bf 100644 --- a/src/game-lib-d3-api-camera-cube.js +++ b/src/game-lib-d3-api-camera-cube.js @@ -26,25 +26,22 @@ GameLib.D3.API.Camera.Cube = function( } if (GameLib.Utils.UndefinedOrNull(near)) { - //near = new GameLib.API.Number(0.1, 0.001, 0.001, 2000); - near = 0.1; + near = 0.1; } this.near = near; if (GameLib.Utils.UndefinedOrNull(far)) { - //far = new GameLib.API.Number(2000, 1, 1, 4000); far = 2000; } this.far = far; if (GameLib.Utils.UndefinedOrNull(cubeResolution)) { - //cubeResolution = new GameLib.API.Number(512, 64, 64, 8192); cubeResolution = 128; } this.cubeResolution = cubeResolution; if (GameLib.Utils.UndefinedOrNull(renderTarget)) { - renderTarget = new GameLib.D3.API.RenderTarget.Cube(); + renderTarget = null; } this.renderTarget = renderTarget; diff --git a/src/game-lib-d3-api-render-target-a.js b/src/game-lib-d3-api-render-target-a.js index ee17a6e..fae1203 100644 --- a/src/game-lib-d3-api-render-target-a.js +++ b/src/game-lib-d3-api-render-target-a.js @@ -3,24 +3,36 @@ * @param id * @param name * @param renderTargetType + * @param parentEntity + * @param autoUpdateSize * @param width * @param height + * @param scissor + * @param scissorTest + * @param viewport + * @param texture + * @param depthBuffer + * @param depthTexture * @param stencilBuffer * @param textureParameters - * @param texture - * @param parentEntity * @constructor */ GameLib.D3.API.RenderTarget = function ( - id, - name, - renderTargetType, - width, - height, - stencilBuffer, - textureParameters, - texture, - parentEntity + id, + name, + renderTargetType, + parentEntity, + autoUpdateSize, + width, + height, + scissor, + scissorTest, + viewport, + texture, + depthBuffer, + depthTexture, + stencilBuffer, + textureParameters ) { if (GameLib.Utils.UndefinedOrNull(id)) { id = GameLib.Utils.RandomId(); @@ -47,6 +59,11 @@ GameLib.D3.API.RenderTarget = function ( } this.name = name; + if (GameLib.Utils.UndefinedOrNull(autoUpdateSize)) { + autoUpdateSize = true; + } + this.autoUpdateSize = autoUpdateSize; + if (GameLib.Utils.UndefinedOrNull(width)) { width = 512; } @@ -57,6 +74,36 @@ GameLib.D3.API.RenderTarget = function ( } this.height = height; + if (GameLib.Utils.UndefinedOrNull(scissor)) { + scissor = GameLib.API.Vector4(0,0,1,1); + } + this.scissor = scissor; + + if (GameLib.Utils.UndefinedOrNull(scissorTest)) { + scissorTest = false; + } + this.scissorTest = scissorTest; + + if (GameLib.Utils.UndefinedOrNull(viewport)) { + viewport = new GameLib.D3.API.Viewport(null, 'Viewport RT ' + this.id); + } + this.viewport = viewport; + + if (GameLib.Utils.UndefinedOrNull(texture)) { + texture = null; + } + this.texture = texture; + + if (GameLib.Utils.UndefinedOrNull(depthBuffer)) { + depthBuffer = true; + } + this.depthBuffer = depthBuffer; + + if (GameLib.Utils.UndefinedOrNull(depthTexture)) { + depthTexture = null; + } + this.depthTexture = depthTexture; + if (GameLib.Utils.UndefinedOrNull(stencilBuffer)) { stencilBuffer = false; } @@ -67,34 +114,6 @@ GameLib.D3.API.RenderTarget = function ( } this.textureParameters = textureParameters; - if (GameLib.Utils.UndefinedOrNull(texture)) { - texture = null; - // - // switch (this.renderTargetType) { - // case GameLib.D3.API.RenderTarget.TARGET_TYPE_NORMAL : - // - // texture = new GameLib.D3.API.Texture( - // null, - // 'Texture (Render Target ' + this.id + ')', - // GameLib.D3.API.Texture.TEXTURE_TYPE_IMAGE - // ); - // break; - // - // case GameLib.D3.API.RenderTarget.TARGET_TYPE_CUBE : - // - // texture = new GameLib.D3.API.Texture( - // null, - // 'Cube Texture (Render Target ' + this.id + ')', - // GameLib.D3.API.Texture.TEXTURE_TYPE_CUBE - // ); - // break; - // - // default : - // throw new Error('Unknown render target type: ' + this.renderTargetType); - // } - } - this.texture = texture; - var componentType = GameLib.D3.API.RenderTarget.GetComponentType(this.renderTargetType); GameLib.API.Component.call( diff --git a/src/game-lib-d3-api-render-target-cube.js b/src/game-lib-d3-api-render-target-cube.js index 8b424f3..8093dce 100644 --- a/src/game-lib-d3-api-render-target-cube.js +++ b/src/game-lib-d3-api-render-target-cube.js @@ -32,12 +32,18 @@ GameLib.D3.API.RenderTarget.Cube = function ( apiRenderTarget.id, apiRenderTarget.name, apiRenderTarget.renderTargetType, + apiRenderTarget.parentEntity, + apiRenderTarget.autoUpdateSize, apiRenderTarget.width, apiRenderTarget.height, - apiRenderTarget.stencilBuffer, - apiRenderTarget.textureParameters, + apiRenderTarget.scissor, + apiRenderTarget.scissorTest, + apiRenderTarget.viewport, apiRenderTarget.texture, - apiRenderTarget.parentEntity + apiRenderTarget.depthBuffer, + apiRenderTarget.depthTexture, + apiRenderTarget.stencilBuffer, + apiRenderTarget.textureParameters ); }; diff --git a/src/game-lib-d3-api-texture-a.js b/src/game-lib-d3-api-texture-a.js index 953d004..e61e383 100644 --- a/src/game-lib-d3-api-texture-a.js +++ b/src/game-lib-d3-api-texture-a.js @@ -66,16 +66,32 @@ GameLib.D3.API.Texture = function( } this.id = id; - if (GameLib.Utils.UndefinedOrNull(name)) { - name = 'Texture (' + id + ')'; - } - this.name = name; - if (GameLib.Utils.UndefinedOrNull(textureType)) { textureType = GameLib.D3.API.Texture.TEXTURE_TYPE_NONE; } this.textureType = textureType; + if (GameLib.Utils.UndefinedOrNull(name)) { + + switch (this.textureType) { + case GameLib.D3.API.Texture.TEXTURE_TYPE_IMAGE : + name = 'Texture Image'; + break; + case GameLib.D3.API.Texture.TEXTURE_TYPE_CANVAS : + name = 'Texture Canvas'; + break; + case GameLib.D3.API.Texture.TEXTURE_TYPE_CUBE : + name = 'Texture Cube'; + break; + default: + name = 'Texture'; + break; + } + + name += ' (' + id + ')'; + } + this.name = name; + if (GameLib.Utils.UndefinedOrNull(parentMaterials)) { parentMaterials = []; } @@ -196,9 +212,23 @@ GameLib.D3.API.Texture = function( } this.forward = forward; + this.needsUpdate = false; + + GameLib.API.Component.call( + this, + GameLib.D3.API.Texture.GetComponentType(this.textureType), + parentEntity + ); +}; + +GameLib.D3.API.Texture.GetComponentType = function(textureType) { + var componentType = null; - switch (this.textureType) { + switch (textureType) { + case GameLib.D3.API.Texture.TEXTURE_TYPE_NONE : + componentType = GameLib.Component.TEXTURE; + break; case GameLib.D3.API.Texture.TEXTURE_TYPE_IMAGE : componentType = GameLib.Component.TEXTURE_IMAGE; break; @@ -209,16 +239,10 @@ GameLib.D3.API.Texture = function( componentType = GameLib.Component.TEXTURE_CANVAS; break; default : - throw new Error('Wrong texture type: ' + this.textureType); + throw new Error('unhandled texture type: ' + textureType); } - this.needsUpdate = false; - - GameLib.API.Component.call( - this, - componentType, - parentEntity - ); + return componentType; }; GameLib.D3.API.Texture.prototype = Object.create(GameLib.API.Component.prototype); diff --git a/src/game-lib-d3-audio.js b/src/game-lib-d3-audio.js index 172e74a..ddf2f2c 100644 --- a/src/game-lib-d3-audio.js +++ b/src/game-lib-d3-audio.js @@ -113,6 +113,7 @@ GameLib.D3.Audio.prototype.updateInstance = function(property) { } } + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-bone-weight.js b/src/game-lib-d3-bone-weight.js index f897f63..3bfc68d 100644 --- a/src/game-lib-d3-bone-weight.js +++ b/src/game-lib-d3-bone-weight.js @@ -38,24 +38,3 @@ GameLib.D3.BoneWeight.prototype.toApiObject = function() { return apiBoneWeight; }; - -/** - * Returns a GameLib.D3.BoneWeight from a boneWeight Object - * @param graphics GameLib.GraphicsRuntime - * @param objectBoneWeight Object - * @returns {GameLib.D3.BoneWeight} - * @constructor - */ -GameLib.D3.BoneWeight.FromObject = function( - graphics, - objectBoneWeight -) { - var apiBoneWeight = GameLib.D3.API.BoneWeight.FromObject(objectBoneWeight); - - var boneWeight = new GameLib.D3.BoneWeight( - graphics, - apiBoneWeight - ); - - return boneWeight; -}; \ No newline at end of file diff --git a/src/game-lib-d3-bone.js b/src/game-lib-d3-bone.js index fb6faea..e40f501 100644 --- a/src/game-lib-d3-bone.js +++ b/src/game-lib-d3-bone.js @@ -92,7 +92,7 @@ GameLib.D3.Bone.prototype.createInstance = function() { /** * Updates the instance */ -GameLib.D3.Bone.prototype.updateInstance = function() { +GameLib.D3.Bone.prototype.updateInstance = function(property) { this.instance.name = this.name; this.instance.position.x = this.position.x; @@ -111,6 +111,8 @@ GameLib.D3.Bone.prototype.updateInstance = function() { this.instance.up.x = this.up.x; this.instance.up.y = this.up.y; this.instance.up.z = this.up.z; + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-broadphase.js b/src/game-lib-d3-broadphase.js index 9770ce1..41c9173 100644 --- a/src/game-lib-d3-broadphase.js +++ b/src/game-lib-d3-broadphase.js @@ -61,7 +61,7 @@ GameLib.D3.Broadphase.prototype.createInstance = function() { /** * */ -GameLib.D3.Broadphase.prototype.updateInstance = function() { +GameLib.D3.Broadphase.prototype.updateInstance = function(property) { if (this.broadphaseType === GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE) { if (!(this.instance instanceof CANNON.NaiveBroadphase)) { @@ -80,6 +80,8 @@ GameLib.D3.Broadphase.prototype.updateInstance = function() { this.createInstance(); } } + + 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 008770f..2891d51 100644 --- a/src/game-lib-d3-camera-a.js +++ b/src/game-lib-d3-camera-a.js @@ -173,6 +173,7 @@ GameLib.D3.Camera.prototype.updateInstance = function(property) { return; } + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-camera-cube.js b/src/game-lib-d3-camera-cube.js index e002cc2..2b5f709 100644 --- a/src/game-lib-d3-camera-cube.js +++ b/src/game-lib-d3-camera-cube.js @@ -57,11 +57,35 @@ GameLib.D3.Camera.Cube.prototype.createInstance = function() { this.cubeResolution ); - this.renderTarget.instance = this.instance.renderTarget; + /** + * We have the same situation here - if we have no render target, this camera was constructed dynamically, + * otherwise, it was loaded from the API + */ - this.renderTarget.instance.texture = this.instance.renderTarget.texture; - // - // this.renderTarget.texture.instance = this.instance.renderTarget.texture; + if (GameLib.Utils.UndefinedOrNull(this.renderTarget)) { + + /** + * We construct a new target, assign it the instance from the cube camera, and update ourselves from the instance + * @type {GameLib.D3.RenderTarget.Cube} + */ + this.renderTarget = new GameLib.D3.RenderTarget.Cube(this.graphics); + this.renderTarget.instance = this.instance.renderTarget; + + this.renderTarget.updateFromInstance(); + + } else { + + /** + * We have a render target loaded from the API + */ + this.renderTarget.instance = this.instance.renderTarget; + this.renderTarget.applyToInstance(); + } + + this.renderTarget.instance.setSize( + this.cubeResolution, + this.cubeResolution + ); GameLib.D3.Camera.prototype.createInstance.call(this); }; @@ -87,12 +111,21 @@ GameLib.D3.Camera.Cube.prototype.updateInstance = function(property) { } if (property === 'cubeResolution') { - this.instance.cubeResolution = this.cubeResolution; + this.instance.renderTarget.setSize( + this.cubeResolution, + this.cubeResolution + ); return; } if (property === 'renderTarget') { - this.instance.renderTarget = this.renderTarget.instance; + + console.warn('experimental render target change for cube camera'); + + if (this.renderTarget && this.renderTarget.instance) { + this.instance.renderTarget = this.renderTarget.instance; + } + return; } @@ -130,12 +163,20 @@ GameLib.D3.Camera.Cube.prototype.toApiObject = function() { return apiCubeCamera; }; +/** + * Updates GameLib.D3.Camera.Cube from instance + */ GameLib.D3.Camera.Cube.prototype.updateFromInstance = function() { - this.near = this.instance.near; - this.far = this.instance.far; - this.cubeResolution = this.instance.cubeResolution; + this.near = this.instance.near; + this.far = this.instance.far; + this.cubeResolution = this.instance.cubeResolution; + + this.renderTarget.instance = this.instance.renderTarget; + + if (this.renderTarget.instance) { + this.renderTarget.updateFromInstance(); + } - console.warn('todo: implement renderTarget updateFromInstance'); GameLib.D3.Camera.prototype.updateFromInstance.call(this); }; \ No newline at end of file diff --git a/src/game-lib-d3-composer.js b/src/game-lib-d3-composer.js index c1c07b0..eb6bd2f 100644 --- a/src/game-lib-d3-composer.js +++ b/src/game-lib-d3-composer.js @@ -165,6 +165,7 @@ GameLib.D3.Composer.prototype.updateInstance = function(property) { ) } + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-effect-a.js b/src/game-lib-d3-effect-a.js index ee52374..5e76dda 100644 --- a/src/game-lib-d3-effect-a.js +++ b/src/game-lib-d3-effect-a.js @@ -108,6 +108,8 @@ GameLib.D3.Effect.prototype.updateInstance = function(property) { return; } + GameLib.Component.prototype.updateInstance.call(this, property); + }; /** diff --git a/src/game-lib-d3-fog.js b/src/game-lib-d3-fog.js index 45cedf3..1ccacbb 100644 --- a/src/game-lib-d3-fog.js +++ b/src/game-lib-d3-fog.js @@ -111,6 +111,7 @@ GameLib.D3.Fog.prototype.updateInstance = function(property) { } } + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-font.js b/src/game-lib-d3-font.js index 8e422e7..d8fc2bb 100644 --- a/src/game-lib-d3-font.js +++ b/src/game-lib-d3-font.js @@ -64,6 +64,8 @@ GameLib.D3.Font.prototype.updateInstance = function() { font : this } ); + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-material-a.js b/src/game-lib-d3-material-a.js index 6fbb39b..e2df356 100644 --- a/src/game-lib-d3-material-a.js +++ b/src/game-lib-d3-material-a.js @@ -350,6 +350,8 @@ GameLib.D3.Material.prototype.updateInstance = function(property) { this.instance.needsUpdate = true; this.needsUpdate = false; + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** @@ -423,7 +425,12 @@ GameLib.D3.Material.prototype.getTextures = function() { Object.keys(this.linkedObjects).map( function(property) { if (this[property] instanceof GameLib.D3.Texture) { - textures.push(this[property]); + textures.push( + { + property: property, + texture: this[property] + } + ); } }.bind(this) ); diff --git a/src/game-lib-d3-material-basic.js b/src/game-lib-d3-material-basic.js index 47b4ad4..6437b9b 100644 --- a/src/game-lib-d3-material-basic.js +++ b/src/game-lib-d3-material-basic.js @@ -244,7 +244,7 @@ GameLib.D3.Material.Basic.prototype.toApiObject = function() { this.color.toApiObject(), this.combine, GameLib.Utils.IdOrNull(this.envMap), - GameLib.Utils.IdOrNull(this.envMap), + GameLib.Utils.IdOrNull(this.lightMap), this.lightMapIntensity, GameLib.Utils.IdOrNull(this.diffuseMap), this.morphTargets, diff --git a/src/game-lib-d3-particle.js b/src/game-lib-d3-particle.js index d3368b0..818e676 100644 --- a/src/game-lib-d3-particle.js +++ b/src/game-lib-d3-particle.js @@ -138,6 +138,7 @@ GameLib.D3.Particle.prototype.updateInstance = function(property) { } } + GameLib.Component.prototype.updateInstance.call(this, property); }; diff --git a/src/game-lib-d3-pass-0.js b/src/game-lib-d3-pass-0.js index 809749a..29e9e55 100644 --- a/src/game-lib-d3-pass-0.js +++ b/src/game-lib-d3-pass-0.js @@ -86,6 +86,7 @@ GameLib.D3.Pass.prototype.updateInstance = function(property) { this.instance.renderToScreen = this.renderToScreen; } + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-physics-world.js b/src/game-lib-d3-physics-world.js index 5bda6af..ad14f33 100644 --- a/src/game-lib-d3-physics-world.js +++ b/src/game-lib-d3-physics-world.js @@ -240,7 +240,7 @@ GameLib.D3.PhysicsWorld.prototype.removeRigidBody = function(rigidBody) { /** * */ -GameLib.D3.PhysicsWorld.prototype.updateInstance = function() { +GameLib.D3.PhysicsWorld.prototype.updateInstance = function(property) { if (!this.instance) { console.log('no world instance'); @@ -259,6 +259,7 @@ GameLib.D3.PhysicsWorld.prototype.updateInstance = function() { this.instance.defaultContactMaterial.frictionEquationStiffness = this.defaultContactMaterial.frictionEquationStiffness; this.instance.defaultContactMaterial.frictionEquationRelaxation = this.defaultContactMaterial.frictionEquationRelaxation; + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-raycast-vehicle.js b/src/game-lib-d3-raycast-vehicle.js index ada25d7..c206864 100644 --- a/src/game-lib-d3-raycast-vehicle.js +++ b/src/game-lib-d3-raycast-vehicle.js @@ -125,10 +125,11 @@ GameLib.D3.RaycastVehicle.prototype.createInstance = function() { }; -GameLib.D3.RaycastVehicle.prototype.updateInstance = function() { +GameLib.D3.RaycastVehicle.prototype.updateInstance = function(property) { // this.instance.chassisBody = this.chassis.instance; //TODO: add / remove wheels? console.log('TODO: update raycast vehicle instance'); + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-render-target-a.js b/src/game-lib-d3-render-target-a.js index b871ec2..95f734a 100644 --- a/src/game-lib-d3-render-target-a.js +++ b/src/game-lib-d3-render-target-a.js @@ -23,24 +23,53 @@ GameLib.D3.RenderTarget = function ( apiRenderTarget.id, apiRenderTarget.name, apiRenderTarget.renderTargetType, + apiRenderTarget.parentEntity, + apiRenderTarget.autoUpdateSize, apiRenderTarget.width, apiRenderTarget.height, + apiRenderTarget.scissor, + apiRenderTarget.scissorTest, + apiRenderTarget.viewport, + apiRenderTarget.texture, + apiRenderTarget.depthBuffer, + apiRenderTarget.depthTexture, apiRenderTarget.stencilBuffer, - apiRenderTarget.textureParameters, - apiRenderTarget.texture + apiRenderTarget.textureParameters ); - // if (this.texture instanceof GameLib.D3.API.Texture) { - // this.texture = new GameLib.D3.Texture( - // this.graphics, - // this.texture - // ) - // } + this.scissor = new GameLib.Vector4( + this.graphics, + this.scissor, + this + ); + + if (this.viewport instanceof GameLib.D3.API.Viewport) { + this.viewport = new GameLib.D3.Viewport( + this.graphics, + this.viewport + ); + } + + if (this.texture instanceof GameLib.D3.API.Texture) { + this.texture = new GameLib.D3.Texture( + this.graphics, + this.texture + ) + } + + if (this.depthTexture instanceof GameLib.D3.API.Texture) { + this.depthTexture = new GameLib.D3.Texture( + this.graphics, + this.depthTexture + ) + } GameLib.Component.call( this, { - 'texture' : GameLib.D3.Texture + 'texture' : GameLib.D3.Texture, + 'depthTexture' : GameLib.D3.Texture, + 'viewport' : GameLib.D3.Viewport } ); }; @@ -48,34 +77,107 @@ GameLib.D3.RenderTarget = function ( GameLib.D3.RenderTarget.prototype = Object.create(GameLib.Component.prototype); GameLib.D3.RenderTarget.prototype.constructor = GameLib.D3.RenderTarget; +GameLib.D3.RenderTarget.prototype.applyToInstance = function() { + + this.instance.scissor = this.scissor.instance; + this.instance.scissorTest = this.scissorTest; + this.instance.viewport = this.viewport.instance; + this.instance.depthBuffer = this.depthBuffer; + this.instance.stencilBuffer = this.stencilBuffer; + + if (this.instance.texture) { + + if (GameLib.Utils.UndefinedOrNull(this.texture)) { + this.texture = new GameLib.D3.Texture(this.graphics); + this.texture.instance = this.instance.texture; + this.texture.updateFromInstance(); + } else { + this.texture.instance = this.instance.texture; + this.texture.applyToInstance(); + } + + this.publish( + GameLib.Event.TEXTURE_INSTANCE_UPDATED, + { + texture : this.texture + } + ); + } + + if (this.instance.depthTexture) { + + if (GameLib.Utils.UndefinedOrNull(this.depthTexture)) { + this.depthTexture = new GameLib.D3.Texture(this.graphics); + this.depthTexture.instance = this.instance.depthTexture; + this.depthTexture.updateFromInstance(); + } else { + this.depthTexture.instance = this.instance.depthTexture; + this.depthTexture.applyToInstance(); + } + + this.publish( + GameLib.Event.TEXTURE_INSTANCE_UPDATED, + { + texture : this.depthTexture + } + ); + } + +}; + /** * Creates a Render Target instance * @returns {*} */ GameLib.D3.RenderTarget.prototype.createInstance = function() { - if (GameLib.Utils.UndefinedOrNull(this.texture)) { - throw new Error('no texture'); + if (this.autoUpdateSize) { + GameLib.Utils.UpdateWindowSize(this); } - if (GameLib.Utils.UndefinedOrNull(this.texture.instance)) { - throw new Error('no texture instance'); - } - - this.instance = new THREE.WebGLRenderTarget( - this.width, - this.height, - this.textureParameters - ); - /** - * The instance texture is automatically generated - we assign it to our texture and update from instance - * TODO: do this later if it starts failing + * Only create the instance if it does not already exist - it could be created by a child */ - //this.texture.instance = this.instance.texture; - //this.texture.updateFromInstance(); + if (GameLib.Utils.UndefinedOrNull(this.instance)) { + this.instance = new THREE.WebGLRenderTarget( + this.width, + this.height, + this.textureParameters + ); + } - this.instance.texture = this.texture.instance; + /** + * We have two cases - our texure is null, in this case, we create one and update it from instance, + * Or, we loaded it from API, so our texture is up to date, and we should update our instance + */ + + if (GameLib.Utils.UndefinedOrNull(this.texture)) { + + /** + * We need to generate a new texture and update it from the instance (we provide an overrideInstance) + */ + this.texture = new GameLib.D3.Texture( + this.graphics, + null, + this.instance.texture + ); + + } else { + + /** + * This texture is loaded from the API, we assign the instance to it, and then apply our settings to it + */ + this.texture.instance = this.instance.texture; + this.texture.applyToInstance(); + + } + + if (GameLib.Utils.Defined(this.depthTexture)) { + this.depthTexture.instance = this.instance.depthTexture; + this.depthTexture.applyToInstance(); + } + + this.applyToInstance(); GameLib.Component.prototype.createInstance.call(this); }; @@ -87,19 +189,79 @@ GameLib.D3.RenderTarget.prototype.updateInstance = function(property) { if ( property === 'width' || - property === 'height' + property === 'height' || + property === 'autoUpdateSize' ) { + + if (this.autoUpdateSize) { + GameLib.Utils.UpdateWindowSize(this); + } + this.instance.setSize(this.width, this.height); } + if (property === 'renderTargetType') { + console.warn('todo : update renderTargetType'); + return; + } + + if (property === 'parentEntity') { + console.warn('todo : update parentEntity'); + return; + } + + if (property === 'scissor') { + console.warn('todo : update scissor'); + return; + } + + if (property === 'scissorTest') { + this.instance.scissorTest = this.scissorTest; + return; + } + + if (property === 'viewport') { + if (this.viewport && this.viewport.instance) { + this.instance.viewport = this.viewport.instance; + } else { + this.instance.viewport = null; + } + return; + } + + if (property === 'texture') { + console.warn('experimental texture change'); + if (this.texture && this.texture.instance) { + this.instance.texture = this.texture.instance; + } + return; + } + + if (property === 'depthBuffer') { + this.instance.depthBuffer = this.depthBuffer; + return; + } + + if (property === 'depthTexture') { + console.warn('experimental depthTexture change'); + if (this.depthTexture && this.depthTexture.instance) { + this.instance.depthTexture = this.depthTexture.instance; + } + return; + } + if (property === 'stencilBuffer') { this.instance.stencilBuffer = this.stencilBuffer; + return; } - if (property === 'texture') { - this.instance.texture = this.texture.instance; + if (property === 'textureParameters') { + console.warn('todo: texture parameters change'); + return; } - + + GameLib.Component.prototype.updateInstance.call(this, property); + }; /** @@ -112,13 +274,62 @@ GameLib.D3.RenderTarget.prototype.toApiObject = function() { this.id, this.name, this.renderTargetType, + GameLib.Utils.IdOrNull(this.parentEntity), + this.autoUpdateSize, this.width, this.height, - this.stencilBuffer, - this.textureParameters, + this.scissor.toApiObject(), + this.scissorTest, + GameLib.Utils.IdOrNull(this.viewport), GameLib.Utils.IdOrNull(this.texture), - GameLib.Utils.IdOrNull(this.parentEntity) + this.depthBuffer, + GameLib.Utils.IdOrNull(this.depthTexture), + this.stencilBuffer, + this.textureParameters ); return apiRenderTarget; }; + +/** + * Updates GameLib.D3.RenderTarget from instance + */ +GameLib.D3.RenderTarget.prototype.updateFromInstance = function() { + + this.width = this.instance.width; + this.height = this.instance.height; + + this.scissor.x = this.instance.scissor.x; + this.scissor.y = this.instance.scissor.y; + this.scissor.z = this.instance.scissor.z; + this.scissor.w = this.instance.scissor.w; + + this.scissorTest = this.instance.scissorTest; + + this.viewport.x = this.instance.viewport.x; + this.viewport.y = this.instance.viewport.y; + this.viewport.width = this.instance.viewport.z; + this.viewport.height = this.instance.viewport.w; + + if (this.texture.instance) { + if (GameLib.Utils.UndefinedOrNull(this.texture)) { + this.texture = new GameLib.D3.Texture(this.graphics); + } + this.texture.instance = this.instance.texture; + this.texture.updateFromInstance(); + } + + this.depthBuffer = this.instance.depthBuffer; + + if (this.instance.depthTexture) { + + if (GameLib.Utils.UndefinedOrNull(this.depthTexture)) { + this.depthTexture = new GameLib.D3.Texture(this.graphics); + } + + this.depthTexture.instance = this.instance.depthTexture; + this.depthTexture.updateFromInstance(); + } + + this.stencilBuffer = this.instance.stencilBuffer; +}; \ No newline at end of file diff --git a/src/game-lib-d3-render-target-cube.js b/src/game-lib-d3-render-target-cube.js index 9ba2379..9533edd 100644 --- a/src/game-lib-d3-render-target-cube.js +++ b/src/game-lib-d3-render-target-cube.js @@ -30,7 +30,7 @@ GameLib.D3.RenderTarget.Cube = function ( ); }; -GameLib.D3.RenderTarget.Cube.prototype = Object.create(GameLib.Component.prototype); +GameLib.D3.RenderTarget.Cube.prototype = Object.create(GameLib.D3.RenderTarget.prototype); GameLib.D3.RenderTarget.Cube.prototype.constructor = GameLib.D3.RenderTarget.Cube; /** @@ -39,57 +39,20 @@ GameLib.D3.RenderTarget.Cube.prototype.constructor = GameLib.D3.RenderTarget.Cub */ GameLib.D3.RenderTarget.Cube.prototype.createInstance = function() { - if ( - GameLib.Utils.UndefinedOrNull(this.texture) || - GameLib.Utils.UndefinedOrNull(this.texture.instance) - ) { - console.warn('render target texture not ready'); - return; - } - this.instance = new THREE.WebGLRenderTargetCube( this.width, this.height, this.textureParameters ); - /** - * The instance texture is automatically generated - we assign it to our texture and update from instance - */ - - this.texture.instance = this.instance.texture; - this.texture.updateFromInstance(); - - GameLib.Component.prototype.createInstance.call(this); + GameLib.D3.RenderTarget.prototype.createInstance.call(this); }; /** * updates instance */ GameLib.D3.RenderTarget.Cube.prototype.updateInstance = function(property) { - - if (property === 'texture') { - if (GameLib.Utils.UndefinedOrNull(this.instance)) { - this.createInstance(); - } else { - this.instance.dispose(); - this.createInstance(); - } - } - - if ( - property === 'width' || - property === 'height' - ) { - this.instance.setSize(this.width, this.height); - } - - if (property === 'stencilBuffer') { - this.instance.stencilBuffer = this.stencilBuffer; - } - - - + GameLib.D3.RenderTarget.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-renderer.js b/src/game-lib-d3-renderer.js index e120e40..ba3d57f 100644 --- a/src/game-lib-d3-renderer.js +++ b/src/game-lib-d3-renderer.js @@ -438,9 +438,7 @@ GameLib.D3.Renderer.prototype.updateInstance = function(property) { console.warn('todo: viewports change'); } - if (property === 'parentEntity') { - console.warn('todo: parentEntity change'); - } + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-rigid-body.js b/src/game-lib-d3-rigid-body.js index b12951a..9700417 100644 --- a/src/game-lib-d3-rigid-body.js +++ b/src/game-lib-d3-rigid-body.js @@ -199,6 +199,8 @@ GameLib.D3.RigidBody.prototype.updateInstance = function() { this.instance.collisionFilterMask = this.collisionFilterMask; this.instance.fixedRotation = this.fixedRotation; this.instance.kinematic = this.kinematic; + + GameLib.Component.prototype.updateInstance.call(this, property); }; GameLib.D3.RigidBody.prototype.setFromParentMesh = function() { diff --git a/src/game-lib-d3-scene.js b/src/game-lib-d3-scene.js index a0456c0..1c8e208 100644 --- a/src/game-lib-d3-scene.js +++ b/src/game-lib-d3-scene.js @@ -286,6 +286,8 @@ GameLib.D3.Scene.prototype.updateInstance = function(property) { this.removeAxis(); } } + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-shadow-a.js b/src/game-lib-d3-shadow-a.js index 0693e16..e48b940 100644 --- a/src/game-lib-d3-shadow-a.js +++ b/src/game-lib-d3-shadow-a.js @@ -101,10 +101,7 @@ GameLib.D3.Shadow.prototype.updateInstance = function(property) { this.instance.radius = this.radius; } - if (property === 'parentEntity') { - console.warn('todo: implement parentEntity change for light') - } - + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-shape-0.js b/src/game-lib-d3-shape-0.js index 3b6f01f..0e5db14 100644 --- a/src/game-lib-d3-shape-0.js +++ b/src/game-lib-d3-shape-0.js @@ -54,8 +54,9 @@ GameLib.D3.Shape.prototype.createInstance = function() { /** * Updates the mesh instance */ -GameLib.D3.Shape.prototype.updateInstance = function() { +GameLib.D3.Shape.prototype.updateInstance = function(property) { throw new Error('Do not instantiate this class directly - use a child class instead'); + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-skeleton.js b/src/game-lib-d3-skeleton.js index 9e596dc..fe4c989 100644 --- a/src/game-lib-d3-skeleton.js +++ b/src/game-lib-d3-skeleton.js @@ -171,8 +171,8 @@ GameLib.D3.Skeleton.prototype.createInstance = function(update) { /** * Updates the instance */ -GameLib.D3.Skeleton.prototype.updateInstance = function() { - +GameLib.D3.Skeleton.prototype.updateInstance = function(property) { + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-solver.js b/src/game-lib-d3-solver.js index 9dea2db..e7e18b7 100644 --- a/src/game-lib-d3-solver.js +++ b/src/game-lib-d3-solver.js @@ -55,7 +55,7 @@ GameLib.D3.Solver.prototype.createInstance = function() { /** * */ -GameLib.D3.Solver.prototype.updateInstance = function() { +GameLib.D3.Solver.prototype.updateInstance = function(property) { if (this.solverType === GameLib.D3.API.Solver.GS_SOLVER) { if (!(this.instance instanceof CANNON.GSSolver)) { @@ -71,6 +71,8 @@ GameLib.D3.Solver.prototype.updateInstance = function() { this.instance.iterations = this.iterations; this.instance.tolerance = this.tolerance; + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-spline.js b/src/game-lib-d3-spline.js index 435eb44..985079d 100644 --- a/src/game-lib-d3-spline.js +++ b/src/game-lib-d3-spline.js @@ -67,7 +67,7 @@ GameLib.D3.Spline.prototype.createInstance = function() { /** * Updates the instance */ -GameLib.D3.Spline.prototype.updateInstance = function() { +GameLib.D3.Spline.prototype.updateInstance = function(property) { var vertices = this.vertices.map( function (vertex) { @@ -85,6 +85,8 @@ GameLib.D3.Spline.prototype.updateInstance = function() { ); this.instance = new THREE.CatmullRomCurve3(vertices); + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-d3-text.js b/src/game-lib-d3-text.js index 1ae62a1..ce71b86 100644 --- a/src/game-lib-d3-text.js +++ b/src/game-lib-d3-text.js @@ -94,6 +94,8 @@ GameLib.D3.Text.prototype.updateInstance = function(property) { } } + GameLib.Component.prototype.updateInstance.call(this, property); + }; /** diff --git a/src/game-lib-d3-texture-a.js b/src/game-lib-d3-texture-a.js index 8aaf802..159b415 100644 --- a/src/game-lib-d3-texture-a.js +++ b/src/game-lib-d3-texture-a.js @@ -3,16 +3,23 @@ * created * @param apiTexture * @param graphics GameLib.GraphicsRuntime + * @param overrideInstance * @property textureType * @constructor */ GameLib.D3.Texture = function( graphics, - apiTexture + apiTexture, + overrideInstance ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); + if (GameLib.Utils.UndefinedOrNull(overrideInstance)) { + overrideInstance = null; + } + this.overrideInstance = overrideInstance; + if (GameLib.Utils.UndefinedOrNull(apiTexture)) { apiTexture = { textureType : GameLib.D3.API.Texture.TEXTURE_TYPE_NONE @@ -72,6 +79,8 @@ GameLib.D3.Texture = function( var linkedObjects = {}; switch (apiTexture.textureType) { + case GameLib.D3.API.Texture.TEXTURE_TYPE_NONE : + break; case GameLib.D3.API.Texture.TEXTURE_TYPE_IMAGE : linkedObjects.image = GameLib.Image; break; @@ -94,13 +103,53 @@ GameLib.D3.Texture = function( GameLib.D3.Texture.prototype = Object.create(GameLib.Component.prototype); GameLib.D3.Texture.prototype.constructor = GameLib.D3.Texture; +/** + * Apply our settings to the instance (which are OK to be applied) + */ +GameLib.D3.Texture.prototype.applyToInstance = function() { + + this.instance.name = this.name; + this.instance.wrapS = this.wrapS; + this.instance.wrapT = this.wrapT; + this.instance.magFilter = this.magFilter; + this.instance.minFilter = this.minFilter; + this.instance.anisotropy = this.anisotropy; + this.instance.offset.x = this.offset.x; + this.instance.offset.y = this.offset.y; + this.instance.repeat.x = this.repeat.x; + this.instance.repeat.y = this.repeat.y; + this.instance.rotation = this.rotation; + this.instance.center.x = this.center.x; + this.instance.center.y = this.center.y; + this.instance.matrixAutoUpdate = this.matrixAutoUpdate; + this.instance.generateMipMaps = this.generateMipMaps; + this.instance.premultiplyAlpha = this.premultiplyAlpha; + this.instance.flipY = this.flipY; + + this.instance.needsUpdate = true; +}; + /** * Creates an instance of our texture object * @returns {*} */ GameLib.D3.Texture.prototype.createInstance = function() { - console.log('creating texture instance'); + if (this.overrideInstance) { + + this.instance = this.overrideInstance; + this.updateFromInstance(); + + } else { + + if (GameLib.Utils.UndefinedOrNull(this.instance)) { + + /** + * We have no instance - create one + */ + this.instance = new THREE.Texture(); + } + } /** * Some settings we copy from the instance @@ -116,25 +165,7 @@ GameLib.D3.Texture.prototype.createInstance = function() { /** * Others we apply to the instance */ - this.instance.name = this.name; - this.instance.wrapS = this.wrapS; - this.instance.wrapT = this.wrapT; - this.instance.magFilter = this.magFilter; - this.instance.minFilter = this.minFilter; - this.instance.anisotropy = this.anisotropy; - this.instance.offset.x = this.offset.x; - this.instance.offset.y = this.offset.y; - this.instance.repeat.x = this.repeat.x; - this.instance.repeat.y = this.repeat.y; - this.instance.rotation = this.rotation; - this.instance.center.x = this.center.x; - this.instance.center.y = this.center.y; - this.instance.matrixAutoUpdate = this.matrixAutoUpdate; - this.instance.generateMipMaps = this.generateMipMaps; - this.instance.premultiplyAlpha = this.premultiplyAlpha; - this.instance.flipY = this.flipY; - - this.instance.needsUpdate = true; + this.applyToInstance(); GameLib.Component.prototype.createInstance.call(this); }; @@ -146,7 +177,6 @@ GameLib.D3.Texture.prototype.updateInstance = function(property) { if (GameLib.Utils.UndefinedOrNull(this.instance)) { console.warn('no texture instance'); - this.instance.needsUpdate = true; return; } @@ -275,6 +305,8 @@ GameLib.D3.Texture.prototype.updateInstance = function(property) { */ this.instance.needsUpdate = true; this.version = this.instance.version; + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** @@ -321,8 +353,11 @@ GameLib.D3.Texture.prototype.toApiObject = function() { return apiTexture; }; +/** + * Updates GameLib.D3.Texture from instance + */ GameLib.D3.Texture.prototype.updateFromInstance = function() { - this.name = this.instance.name; + this.name = this.instance.name; this.mipmaps = this.instance.mipmaps; this.mapping = this.instance.mapping; this.wrapS = this.instance.wrapS; @@ -334,11 +369,11 @@ GameLib.D3.Texture.prototype.updateFromInstance = function() { this.storageType = this.instance.storageType; this.offset.x = this.instance.offset.x; this.offset.y = this.instance.offset.y; - this.repeat.x = this.instance.repeat.x; - this.repeat.y = this.instance.repeat.y; + this.repeat.x = this.instance.repeat.x; + this.repeat.y = this.instance.repeat.y; this.rotation = this.instance.rotation; - this.center.x = this.instance.center.x; - this.center.y = this.instance.center.y; + this.center.x = this.instance.center.x; + this.center.y = this.instance.center.y; this.matrixAutoUpdate = this.instance.matrixAutoUpdate; this.generateMipMaps = this.instance.generateMipMaps; this.premultiplyAlpha = this.instance.premultiplyAlpha; diff --git a/src/game-lib-d3-texture-cube.js b/src/game-lib-d3-texture-cube.js index e9d7054..c0ad3f1 100644 --- a/src/game-lib-d3-texture-cube.js +++ b/src/game-lib-d3-texture-cube.js @@ -107,7 +107,7 @@ GameLib.D3.Texture.Cube.prototype.updateInstance = function(property) { } this.publish( - GameLib.Event.TEXTURE_IMAGE_UPDATED, + GameLib.Event.TEXTURE_INSTANCE_UPDATED, { texture : this } diff --git a/src/game-lib-d3-texture-image.js b/src/game-lib-d3-texture-image.js index 963e4ab..9c8dd3b 100644 --- a/src/game-lib-d3-texture-image.js +++ b/src/game-lib-d3-texture-image.js @@ -2,11 +2,13 @@ * GameLib.D3.Texture.Image * @param graphics * @param apiTextureImage + * @param overrideInstance - if we pass an instance to the constructor, we want to skip the construction of this texture * @constructor */ GameLib.D3.Texture.Image = function( graphics, - apiTextureImage + apiTextureImage, + overrideInstance ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); @@ -17,6 +19,11 @@ GameLib.D3.Texture.Image = function( }; } + if (GameLib.Utils.UndefinedOrNull(overrideInstance)) { + overrideInstance = null; + } + this.overrideInstance = overrideInstance; + GameLib.D3.API.Texture.Image.call( this, apiTextureImage, @@ -54,9 +61,22 @@ GameLib.D3.Texture.Image.prototype.createInstance = function() { return; } - this.instance = new THREE.Texture( - this.image.instance - ); + /** + * At this point - our image object exists + */ + + if (this.overrideInstance) { + + this.instance = this.overrideInstance; + this.updateFromInstance(); + + } else { + + this.instance = new THREE.Texture( + this.image.instance + ); + + } GameLib.D3.Texture.prototype.createInstance.call(this); }; @@ -74,7 +94,7 @@ GameLib.D3.Texture.Image.prototype.updateInstance = function(property) { } this.publish( - GameLib.Event.TEXTURE_IMAGE_UPDATED, + GameLib.Event.TEXTURE_INSTANCE_UPDATED, { texture : this } @@ -101,3 +121,18 @@ GameLib.D3.Texture.Image.prototype.toApiObject = function() { return apiTextureImage; }; + +/** + * Updates GameLib.D3.Texture.Image from instance + */ +GameLib.D3.Texture.Image.prototype.updateFromInstance = function() { + + this.image.instance = this.instance.image; + + if (this.image.instance) { + this.image.updateFromInstance(); + } + + GameLib.D3.Texture.prototype.updateFromInstance.call(this); + +}; \ No newline at end of file diff --git a/src/game-lib-d3-viewport.js b/src/game-lib-d3-viewport.js index 22879a3..dfa21bd 100644 --- a/src/game-lib-d3-viewport.js +++ b/src/game-lib-d3-viewport.js @@ -38,14 +38,34 @@ GameLib.D3.Viewport.prototype.constructor = GameLib.D3.Viewport; * @returns {boolean} */ GameLib.D3.Viewport.prototype.createInstance = function() { - this.instance = true; + + this.instance = new THREE.Vector4( + this.x, + this.y, + this.width, + this.height + ); + GameLib.Component.prototype.createInstance.call(this); }; /** * */ -GameLib.D3.Viewport.prototype.updateInstance = function() { +GameLib.D3.Viewport.prototype.updateInstance = function(property) { + + if ( + property === 'x' || + property === 'y' || + property === 'width' || + property === 'height' + ) { + this.instance.x = this.x; + this.instance.y = this.y; + this.instance.z = this.width; + this.instance.w = this.height; + } + }; /** @@ -66,20 +86,3 @@ GameLib.D3.Viewport.prototype.toApiObject = function() { return apiViewport; }; - -/** - * GameLib.D3.Viewport from Object Viewport - * @param graphics - * @param objectComponent - * @returns {GameLib.D3.Viewport} - * @constructor - */ -GameLib.D3.Viewport.FromObject = function(graphics, objectComponent) { - - var apiViewport = GameLib.D3.API.Viewport.FromObject(objectComponent); - - return new GameLib.D3.Viewport( - graphics, - apiViewport - ); -}; \ No newline at end of file diff --git a/src/game-lib-dom-element.js b/src/game-lib-dom-element.js index fa7a970..67e2298 100644 --- a/src/game-lib-dom-element.js +++ b/src/game-lib-dom-element.js @@ -41,6 +41,8 @@ GameLib.DomElement.prototype.updateInstance = function(property) { if (property === 'domElementId') { this.createInstance() } + + GameLib.Component.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-entity.js b/src/game-lib-entity.js index f6a815a..25c9af8 100644 --- a/src/game-lib-entity.js +++ b/src/game-lib-entity.js @@ -241,6 +241,8 @@ GameLib.Entity.prototype.updateInstance = function(property) { return; } + GameLib.Component.prototype.updateInstance.call(this, property); + }; /** diff --git a/src/game-lib-image.js b/src/game-lib-image.js index 7d99d91..cd01c15 100644 --- a/src/game-lib-image.js +++ b/src/game-lib-image.js @@ -75,6 +75,8 @@ GameLib.Image.prototype.updateInstance = function(property) { ) { this.createInstance(); } + + GameLib.Component.prototype.updateInstance.call(this, property); }; GameLib.Image.prototype.updateFromRawObject = function(rawObject) { @@ -107,3 +109,14 @@ GameLib.Image.prototype.toApiObject = function() { return apiImage; }; + +/** + * Updates GameLib.Image from instance + */ +GameLib.Image.prototype.updateFromInstance = function() { + this.fileName = this.instance.fileName || 'no filename'; + this.extension = this.instance.extension || 'no extension'; + this.path = this.instance.path || 'no path'; + this.contentType = this.instance.contentType || 'no content type'; + this.size = this.instance.size || 'no size'; +}; diff --git a/src/game-lib-mouse.js b/src/game-lib-mouse.js index b87ddc0..a693dcb 100644 --- a/src/game-lib-mouse.js +++ b/src/game-lib-mouse.js @@ -39,13 +39,16 @@ GameLib.Mouse.prototype.createInstance = function() { */ GameLib.Mouse.prototype.updateInstance = function(property) { - if (property === 'x') { + if ( + property === 'x' || + property === 'y' + ) { this.instance.x = this.x; + this.instance.y = this.y; + return; } - if (property === 'y') { - this.instance.y = this.y; - } + GameLib.Component.prototype.updateInstance.call(this, property); }; diff --git a/src/game-lib-plane.js b/src/game-lib-plane.js index 145e24b..212fc2e 100644 --- a/src/game-lib-plane.js +++ b/src/game-lib-plane.js @@ -65,6 +65,8 @@ GameLib.Plane.prototype.updateInstance = function(property) { this.instance.constant = this.constant; } + GameLib.D3.Texture.prototype.updateInstance.call(this, property); + }; /** diff --git a/src/game-lib-server.js b/src/game-lib-server.js index 21b61f0..57cdd0e 100644 --- a/src/game-lib-server.js +++ b/src/game-lib-server.js @@ -53,6 +53,8 @@ GameLib.Server.prototype.updateInstance = function(property) { if (property === 'protocols') { console.log('todo: server protocols update'); } + + GameLib.D3.Texture.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-socket-0.js b/src/game-lib-socket-0.js index 5a14a0d..d14df5c 100644 --- a/src/game-lib-socket-0.js +++ b/src/game-lib-socket-0.js @@ -78,6 +78,7 @@ GameLib.Socket.prototype.updateInstance = function(property) { if (property === 'server') { console.log('todo: implement socket server update'); } + GameLib.D3.Texture.prototype.updateInstance.call(this, property); }; /** diff --git a/src/game-lib-system-gui.js b/src/game-lib-system-gui.js index 0524ff6..7ada962 100644 --- a/src/game-lib-system-gui.js +++ b/src/game-lib-system-gui.js @@ -1383,7 +1383,8 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, object, property, { - 'normal': GameLib.D3.API.Texture.TEXTURE_TYPE_IMAGE, + 'normal': GameLib.D3.API.Texture.TEXTURE_TYPE_NONE, + 'image': GameLib.D3.API.Texture.TEXTURE_TYPE_IMAGE, 'cube': GameLib.D3.API.Texture.TEXTURE_TYPE_CUBE, 'canvas': GameLib.D3.API.Texture.TEXTURE_TYPE_CANVAS } @@ -1513,6 +1514,10 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate, property === 'volume' ) { controllers.push(folder.add(object, property, 0, 1.0, 0.001)); + } else if ( + property === 'cubeResolution' + ) { + controllers.push(folder.add(object, property, 16, 4096, 16)); } else if ( property === 'shininess' || property === 'fov' diff --git a/src/game-lib-system-render.js b/src/game-lib-system-render.js index 07dc07e..1992a73 100644 --- a/src/game-lib-system-render.js +++ b/src/game-lib-system-render.js @@ -29,7 +29,7 @@ GameLib.System.Render = function( /** * Images */ - this.imageChangedSubscription = null; + this.textureUpdatedSubscription = null; this.renderConfigurations = []; @@ -87,9 +87,9 @@ GameLib.System.Render.prototype.start = function() { this.windowResize ); - this.imageChangedSubscription = this.subscribe( - GameLib.Event.TEXTURE_IMAGE_UPDATED, - this.imageChanged + this.textureUpdatedSubscription = this.subscribe( + GameLib.Event.TEXTURE_INSTANCE_UPDATED, + this.textureUpdated ); this.getRenderConfigurationSubscription = this.subscribe( @@ -189,6 +189,14 @@ GameLib.System.Render.prototype.windowResize = function(data) { data ); + GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.RenderTarget).map( + function(renderTarget) { + if (renderTarget.autoUpdateSize) { + renderTarget.updateInstance('autoUpdateSize'); + } + } + ); + var renderers = GameLib.EntityManager.Instance.queryComponents(GameLib.Component.RENDERER); renderers.map( @@ -231,27 +239,27 @@ GameLib.System.Render.prototype.windowResize = function(data) { }; -GameLib.System.Render.prototype.imageChanged = function(data) { +GameLib.System.Render.prototype.textureUpdated = function(data) { - // var textures = GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.Texture).map( - // function(texture) { - // if (texture.image ===) - // } - // ); + GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.Material).map( + function(material) { - var materials = GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.Material); + material.getTextures().map( + function (object) { - materials.map(function(material){ + if (object.texture === data.texture) { - var textures = material.getTextures(); + if (material.loaded) { + material.updateInstance(object.property); + } + + } + + } + ); - if (textures.indexOf(data.texture) !== -1) { - if (material.loaded) { - material.updateInstance('diffuseMap'); - } } - - }); + ); }; @@ -550,6 +558,34 @@ GameLib.System.Render.prototype.render = function(data) { viewport.height * size.height ); + /** + * Update any cube camera's based on the scene + */ + this.cubeCameras.map( + function(cubeCamera) { + + GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.Mesh.Box).map( + function(mesh) { + mesh.visible = false; + mesh.updateInstance('visible'); + } + ); + + scenes.map( + function(scene) { + cubeCamera.update(renderer, scene); + } + ); + + GameLib.EntityManager.Instance.queryComponentsByConstructor(GameLib.D3.Mesh.Box).map( + function(mesh) { + mesh.visible = true; + mesh.updateInstance('visible'); + } + ); + } + ); + if (configuration.enableComposer) { composer.render(); return; @@ -559,15 +595,6 @@ GameLib.System.Render.prototype.render = function(data) { function (scene) { - /** - * Update any cube camera's based on the scene - */ - this.cubeCameras.map( - function(cubeCamera) { - cubeCamera.update(renderer, scene); - } - ); - if (renderer.renderMode === GameLib.D3.API.Renderer.MODE_TARGET || renderer.renderMode === GameLib.D3.API.Renderer.MODE_CANVAS_AND_TARGET) { @@ -632,7 +659,7 @@ GameLib.System.Render.prototype.stop = function() { /** * Images */ - this.imageChangedSubscription.remove(); + this.textureUpdatedSubscription.remove(); // this.delayedInstanceEncounteredSubscription.remove();