From 74ef87c6aa452d08d2b550cdab5d686008155990 Mon Sep 17 00:00:00 2001 From: -=yb4f310 Date: Thu, 14 Sep 2017 05:42:38 +0200 Subject: [PATCH] clock, linking system updates, physics updates, animation system started --- src/game-lib-a-1-event.js | 9 ++ src/game-lib-a-component-a.js | 2 + src/game-lib-api-clock.js | 46 ++++++++ src/game-lib-clock.js | 104 ++++++++++++++++++ ...me-lib-d3-api-friction-contact-material.js | 17 +-- src/game-lib-d3-api-mesh.js | 2 +- src/game-lib-d3-api-physics-world.js | 18 +++ src/game-lib-d3-friction-contact-material.js | 31 ++++-- src/game-lib-d3-mesh-0.js | 12 ++ src/game-lib-d3-physics-world.js | 31 +++++- src/game-lib-d3-rigid-body.js | 35 ++++++ src/game-lib-system-0.js | 41 ++++--- src/game-lib-system-animation.js | 26 ++++- src/game-lib-system-custom-code.js | 4 + src/game-lib-system-gui.js | 17 ++- src/game-lib-system-input.js | 4 + src/game-lib-system-linking.js | 9 ++ src/game-lib-system-physics.js | 4 + src/game-lib-system-render.js | 4 + src/game-lib-system-storage.js | 5 + src/game-lib-system-visualization.js | 4 + src/game-lib-vector3.js | 3 +- 22 files changed, 381 insertions(+), 47 deletions(-) create mode 100644 src/game-lib-api-clock.js create mode 100644 src/game-lib-clock.js diff --git a/src/game-lib-a-1-event.js b/src/game-lib-a-1-event.js index 0c761b8..8734614 100644 --- a/src/game-lib-a-1-event.js +++ b/src/game-lib-a-1-event.js @@ -81,6 +81,7 @@ GameLib.Event.FETCH_COMPONENTS = 0x3f; GameLib.Event.GET_API_URL = 0x40; GameLib.Event.GET_PHYSICS_ENGINE = 0x41; GameLib.Event.PARENT_WORLD_CHANGE = 0x42; +GameLib.Event.ANIMATE = 0x43; /** * Returns string name of event ID @@ -157,6 +158,7 @@ GameLib.Event.GetEventName = function(number) { case 0x40 : return 'get_api_url'; case 0x41 : return 'get_physics_engine'; case 0x42 : return 'parent_world_change'; + case 0x43 : return 'animate'; break; } @@ -378,6 +380,13 @@ GameLib.Event.Emit = function( } ) } else { + if (clientCallback) { + /** + * We execute the client callback immediately since there are no subscriptions to this event + */ + clientCallback(); + } + if (clientErrorCallback) { clientErrorCallback({ message : 'No subscriptions for event ' + eventName diff --git a/src/game-lib-a-component-a.js b/src/game-lib-a-component-a.js index f4f865f..9f32b97 100644 --- a/src/game-lib-a-component-a.js +++ b/src/game-lib-a-component-a.js @@ -150,6 +150,7 @@ GameLib.Component.COMPONENT_FRICTION_MATERIAL = 0x33; GameLib.Component.COMPONENT_FRICTION_CONTACT_MATERIAL = 0x34; GameLib.Component.COMPONENT_RAYCAST_VEHICLE = 0x35; GameLib.Component.COMPONENT_RAYCAST_WHEEL = 0x36; +GameLib.Component.COMPONENT_CLOCK = 0x37; /** * Returns string name for component number @@ -213,6 +214,7 @@ GameLib.Component.GetComponentName = function(number) { case 0x34 : return 'GameLib.D3.FrictionContactMaterial'; case 0x35 : return 'GameLib.D3.RaycastVehicle'; case 0x36 : return 'GameLib.D3.RaycastWheel'; + case 0x37 : return 'GameLib.Clock'; break; } diff --git a/src/game-lib-api-clock.js b/src/game-lib-api-clock.js new file mode 100644 index 0000000..965d02e --- /dev/null +++ b/src/game-lib-api-clock.js @@ -0,0 +1,46 @@ +/** + * Raw Clock API object - should always correspond with the Clock Schema + * @constructor + * @param id + * @param name + * @param parentEntity + */ +GameLib.API.Clock = function( + id, + name, + parentEntity +) { + + if (GameLib.Utils.UndefinedOrNull(id)) { + id = GameLib.Utils.RandomId(); + } + this.id = id; + + if (GameLib.Utils.UndefinedOrNull(name)) { + name = 'Clock (' + this.id + ')'; + } + this.name = name; + + if (GameLib.Utils.UndefinedOrNull(parentEntity)) { + parentEntity = null; + } + this.parentEntity = parentEntity; +}; + +GameLib.API.Clock.prototype = Object.create(GameLib.Component.prototype); +GameLib.API.Clock.prototype.constructor = GameLib.API.Clock; + +/** + * Creates an API camera from an Object camera + * @param objectClock + * @constructor + */ +GameLib.API.Clock.FromObject = function(objectClock) { + + return new GameLib.API.Clock( + objectClock.id, + objectClock.name, + objectClock.parentEntity + ); + +}; diff --git a/src/game-lib-clock.js b/src/game-lib-clock.js new file mode 100644 index 0000000..ddd6c96 --- /dev/null +++ b/src/game-lib-clock.js @@ -0,0 +1,104 @@ +/** + * Creates a camera object + * @param implementation + * @param apiClock GameLib.API.Clock + * @constructor + */ +GameLib.Clock = function( + implementation, + apiClock +) { + + this.implementation = implementation; + this.implementation.isNotThreeThrow(); + + if (GameLib.Utils.UndefinedOrNull(apiClock)) { + apiClock = {}; + } + + if (apiClock instanceof GameLib.Clock) { + return apiClock; + } + + GameLib.API.Clock.call( + this, + apiClock.id, + apiClock.name, + apiClock.parentEntity + ); + + GameLib.Component.call( + this, + GameLib.Component.COMPONENT_CLOCK + ); + +} ; + +GameLib.Clock.prototype = Object.create(GameLib.API.Clock.prototype); +GameLib.Clock.prototype.constructor = GameLib.Clock; + +/** + * Creates a camera instance of 'graphics' type (only THREE for now) + * @returns {THREE.Clock} + */ +GameLib.Clock.prototype.createInstance = function() { + + var instance = new THREE.Clock(); + + return instance; +}; + +/** + * Updates the instance with the current state + */ +GameLib.Clock.prototype.updateInstance = function() { + +}; + +GameLib.Clock.prototype.getDelta = function() { + + var delta = this.instance.getDelta(); + + /** + * clamp the delta to 1/60 + */ + + if (delta > (1 / 30.0)) { + console.log('clipped ' + (delta - (1/30.0)) + ' seconds - essentially lost time'); + delta = (1 / 30.0); + } + + return delta; +}; + +/** + * Converts a GameLib.Clock to a new GameLib.API.Clock + * @returns {GameLib.API.Clock} + */ +GameLib.Clock.prototype.toApiObject = function() { + + return new GameLib.API.Clock( + this.id, + this.name, + GameLib.Utils.IdOrNull(this.parentEntity) + ); + +}; + +/** + * Converts from an Object camera to a GameLib.Clock + * @param graphics GameLib.Graphics + * @param objectClock Object + * @returns {GameLib.Clock} + * @constructor + */ +GameLib.Clock.FromObject = function(graphics, objectClock) { + + var apiClock = GameLib.API.Clock.FromObject(objectClock); + + return new GameLib.Clock( + graphics, + apiClock + ); + +}; diff --git a/src/game-lib-d3-api-friction-contact-material.js b/src/game-lib-d3-api-friction-contact-material.js index 88fc3d3..fdd1022 100644 --- a/src/game-lib-d3-api-friction-contact-material.js +++ b/src/game-lib-d3-api-friction-contact-material.js @@ -16,8 +16,7 @@ GameLib.D3.API.FrictionContactMaterial = function( id, name, - material1, - material2, + materials, friction, restitution, contactEquationStiffness, @@ -37,15 +36,10 @@ GameLib.D3.API.FrictionContactMaterial = function( } this.name = name; - if (GameLib.Utils.UndefinedOrNull(material1)) { - material1 = null; + if (GameLib.Utils.UndefinedOrNull(materials)) { + materials = []; } - this.material1 = material1; - - if (GameLib.Utils.UndefinedOrNull(material2)) { - material2 = null; - } - this.material2 = material2; + this.materials = materials; if (GameLib.Utils.UndefinedOrNull(friction)) { friction = 0.3; @@ -95,8 +89,7 @@ GameLib.D3.API.FrictionContactMaterial.FromObject = function(objectFrictionConta return new GameLib.D3.API.FrictionContactMaterial( objectFrictionContactMaterial.id, objectFrictionContactMaterial.name, - objectFrictionContactMaterial.material1, - objectFrictionContactMaterial.material2, + objectFrictionContactMaterial.materials, objectFrictionContactMaterial.friction, objectFrictionContactMaterial.restitution, objectFrictionContactMaterial.contactEquationStiffness, diff --git a/src/game-lib-d3-api-mesh.js b/src/game-lib-d3-api-mesh.js index 0b721c0..a7e9119 100644 --- a/src/game-lib-d3-api-mesh.js +++ b/src/game-lib-d3-api-mesh.js @@ -98,7 +98,7 @@ GameLib.D3.API.Mesh = function( } this.skinWeights = skinWeights; - if (GameLib.Utils.UndefinedOrNull(materials)) { + if (GameLib.Utils.UndefinedOrNull(materials) || (materials instanceof Array && materials.length === 0)) { materials = [new GameLib.D3.API.Material(null, GameLib.D3.Material.MATERIAL_TYPE_STANDARD, 'Material (' + this.name + ')')]; } this.materials = materials; diff --git a/src/game-lib-d3-api-physics-world.js b/src/game-lib-d3-api-physics-world.js index 2a2eb7a..677800c 100644 --- a/src/game-lib-d3-api-physics-world.js +++ b/src/game-lib-d3-api-physics-world.js @@ -7,6 +7,7 @@ * @param solver * @param rigidBodies * @param contactMaterials + * @param allowSleep * @param parentEntity * @constructor */ @@ -18,6 +19,8 @@ GameLib.D3.API.PhysicsWorld = function( solver, rigidBodies, contactMaterials, + allowSleep, + defaultContactMaterial, parentEntity ) { @@ -62,6 +65,19 @@ GameLib.D3.API.PhysicsWorld = function( } this.contactMaterials = contactMaterials; + if (GameLib.Utils.UndefinedOrNull(allowSleep)) { + allowSleep = true; + } + this.allowSleep = allowSleep; + + if (GameLib.Utils.UndefinedOrNull(defaultContactMaterial)) { + defaultContactMaterial = new GameLib.D3.API.FrictionContactMaterial( + null, + 'Default Contact Material (Physics World ' + this.id + ')' + ); + } + this.defaultContactMaterial = defaultContactMaterial; + if (GameLib.Utils.UndefinedOrNull(parentEntity)) { parentEntity = null; } @@ -85,6 +101,8 @@ GameLib.D3.API.PhysicsWorld.FromObject = function(objectWorld) { objectWorld.solver, objectWorld.rigidBodies, objectWorld.contactMaterials, + objectWorld.allowSleep, + objectWorld.defaultContactMaterial, objectWorld.parentEntity ); }; diff --git a/src/game-lib-d3-friction-contact-material.js b/src/game-lib-d3-friction-contact-material.js index cb79883..294471b 100644 --- a/src/game-lib-d3-friction-contact-material.js +++ b/src/game-lib-d3-friction-contact-material.js @@ -24,8 +24,7 @@ GameLib.D3.FrictionContactMaterial = function ( this, apiFrictionContactMaterial.id, apiFrictionContactMaterial.name, - apiFrictionContactMaterial.material1, - apiFrictionContactMaterial.material2, + apiFrictionContactMaterial.materials, apiFrictionContactMaterial.friction, apiFrictionContactMaterial.restitution, apiFrictionContactMaterial.contactEquationStiffness, @@ -39,8 +38,7 @@ GameLib.D3.FrictionContactMaterial = function ( this, GameLib.Component.COMPONENT_FRICTION_CONTACT_MATERIAL, { - material1 : GameLib.D3.FrictionMaterial, - material2 : GameLib.D3.FrictionMaterial + materials : [GameLib.D3.FrictionMaterial] } ); }; @@ -55,14 +53,21 @@ GameLib.D3.FrictionContactMaterial.prototype.constructor = GameLib.D3.FrictionCo GameLib.D3.FrictionContactMaterial.prototype.createInstance = function() { var instance = new CANNON.ContactMaterial( - this.material1.instance, - this.material2.instance, + null, + null, { friction: this.friction, restitution: this.restitution, contactEquationStiffness: this.contactEquationStiffness } ); + + instance.materials = this.materials.map( + function(material){ + return material.instance; + } + ); + return instance; }; @@ -71,8 +76,11 @@ GameLib.D3.FrictionContactMaterial.prototype.createInstance = function() { */ GameLib.D3.FrictionContactMaterial.prototype.updateInstance = function() { - this.instance.material1 = this.material1.instance; - this.instance.material2 = this.material2.instance; + this.instance.materials = this.materials.map( + function(material) { + return material.instance; + } + ); this.instance.friction = this.friction; this.instance.restitution = this.restitution; @@ -92,8 +100,11 @@ GameLib.D3.FrictionContactMaterial.prototype.toApiObject = function() { var apiFrictionContactMaterial = new GameLib.D3.API.FrictionContactMaterial( this.id, this.name, - GameLib.Utils.IdOrNull(this.material1), - GameLib.Utils.IdOrNull(this.material2), + this.materials.map( + function(material) { + return GameLib.Utils.IdOrNull(material); + } + ), this.friction, this.restitution, this.contactEquationStiffness, diff --git a/src/game-lib-d3-mesh-0.js b/src/game-lib-d3-mesh-0.js index 1676037..373a49a 100644 --- a/src/game-lib-d3-mesh-0.js +++ b/src/game-lib-d3-mesh-0.js @@ -1046,6 +1046,10 @@ GameLib.D3.Mesh.prototype.applyLocalPositionRotationScale = function() { this.scale.y = 1; this.scale.z = 1; + this.localPosition.x = 0; + this.localPosition.y = 0; + this.localPosition.z = 0; + this.quaternion.axis.x = 0; this.quaternion.axis.y = 0; this.quaternion.axis.z = 0; @@ -1221,6 +1225,14 @@ GameLib.D3.Mesh.prototype.createHelper = function() { }; +GameLib.D3.Mesh.prototype.addMaterial = function(material) { + if (this.materials.length === 1) { + this.instance.material = material.instance; + } else { + this.instance.material.push(material.instance); + } +}; + /** * Convenience function for removing a helper for this Mesh - should be called from Systems only */ diff --git a/src/game-lib-d3-physics-world.js b/src/game-lib-d3-physics-world.js index a1a5b9f..2f11a36 100644 --- a/src/game-lib-d3-physics-world.js +++ b/src/game-lib-d3-physics-world.js @@ -29,6 +29,8 @@ GameLib.D3.PhysicsWorld = function( apiWorld.solver, apiWorld.rigidBodies, apiWorld.contactMaterials, + apiWorld.allowSleep, + apiWorld.defaultContactMaterial, apiWorld.parentEntity ); @@ -78,6 +80,13 @@ GameLib.D3.PhysicsWorld = function( }.bind(this) ); + if (this.defaultContactMaterial instanceof GameLib.D3.API.FrictionContactMaterial) { + this.defaultContactMaterial = new GameLib.D3.FrictionContactMaterial( + this.physics, + this.defaultContactMaterial + ) + } + GameLib.Component.call( this, GameLib.Component.COMPONENT_PHYSICS_WORLD, @@ -85,7 +94,8 @@ GameLib.D3.PhysicsWorld = function( 'broadphase' : GameLib.D3.Broadphase, 'solver' : GameLib.D3.Solver, 'rigidBodies' : [GameLib.D3.RigidBody], - 'contactMaterials' : [GameLib.D3.FrictionContactMaterial] + 'contactMaterials' : [GameLib.D3.FrictionContactMaterial], + 'defaultContactMaterial' : GameLib.D3.FrictionContactMaterial } ); }; @@ -106,6 +116,7 @@ GameLib.D3.PhysicsWorld.prototype.createInstance = function() { instance.broadphase = this.broadphase.instance; instance.solver = this.solver.instance; instance.gravity = this.gravity.instance; + instance.allowSleep = this.allowSleep; this.contactMaterials.map( function(contactMaterial) { @@ -135,6 +146,13 @@ GameLib.D3.PhysicsWorld.prototype.createInstance = function() { } ); + instance.defaultContactMaterial.friction = this.defaultContactMaterial.friction; + instance.defaultContactMaterial.restitution = this.defaultContactMaterial.restitution; + instance.defaultContactMaterial.contactEquationStiffness = this.defaultContactMaterial.contactEquationStiffness; + instance.defaultContactMaterial.contactEquationRelaxation = this.defaultContactMaterial.contactEquationRelaxation; + instance.defaultContactMaterial.frictionEquationStiffness = this.defaultContactMaterial.frictionEquationStiffness; + instance.defaultContactMaterial.frictionEquationRelaxation = this.defaultContactMaterial.frictionEquationRelaxation; + return instance; } else { @@ -225,8 +243,15 @@ GameLib.D3.PhysicsWorld.prototype.updateInstance = function() { this.instance.broadphase = this.broadphase.instance; this.instance.solver = this.solver.instance; this.instance.gravity = this.gravity.instance; + this.instance.allowSleep = this.allowSleep; + + this.instance.defaultContactMaterial.friction = this.defaultContactMaterial.friction; + this.instance.defaultContactMaterial.restitution = this.defaultContactMaterial.restitution; + this.instance.defaultContactMaterial.contactEquationStiffness = this.defaultContactMaterial.contactEquationStiffness; + this.instance.defaultContactMaterial.contactEquationRelaxation = this.defaultContactMaterial.contactEquationRelaxation; + this.instance.defaultContactMaterial.frictionEquationStiffness = this.defaultContactMaterial.frictionEquationStiffness; + this.instance.defaultContactMaterial.frictionEquationRelaxation = this.defaultContactMaterial.frictionEquationRelaxation; - //TODO add contact materials and rigidbodies ? - this functionality is actually part of the physics system.. }; /** @@ -247,6 +272,8 @@ GameLib.D3.PhysicsWorld.prototype.toApiObject = function() { this.contactMaterials.map(function(contactMaterial){ return GameLib.Utils.IdOrNull(contactMaterial); }), + this.allowSleep, + GameLib.Utils.IdOrNull(this.defaultContactMaterial), GameLib.Utils.IdOrNull(this.parentEntity) ); diff --git a/src/game-lib-d3-rigid-body.js b/src/game-lib-d3-rigid-body.js index b011e8b..ad6552e 100644 --- a/src/game-lib-d3-rigid-body.js +++ b/src/game-lib-d3-rigid-body.js @@ -69,6 +69,14 @@ GameLib.D3.RigidBody = function ( this ); + this.force = new GameLib.Vector3( + this.physics + ); + + this.forcePoint = new GameLib.Vector3( + this.physics + ); + GameLib.Component.call( this, GameLib.Component.COMPONENT_RIGID_BODY, @@ -109,6 +117,18 @@ GameLib.D3.RigidBody.prototype.createInstance = function() { } ); + instance.addEventListener("sleepy",function(event){ + console.log(this.name + " is feeling sleepy..."); + }.bind(this)); + + instance.addEventListener("sleep",function(event){ + console.log(this.name + " fell asleep!"); + }.bind(this)); + + instance.addEventListener("wakeup",function(event){ + console.log(this.name + " woke up!"); + }.bind(this)); + this.shapes.map(function(shape){ if (shape.loaded) { @@ -237,3 +257,18 @@ GameLib.D3.RigidBody.FromObject = function(physics, objectComponent) { apiRigidBody ); }; + +GameLib.D3.RigidBody.prototype.applyForce = function() { + this.instance.applyForce( + this.force.instance, + this.forcePoint.instance + ) +}; + + +GameLib.D3.RigidBody.prototype.applyLocalForce = function() { + this.instance.applyLocalForce( + this.force.instance, + this.forcePoint.instance + ) +}; diff --git a/src/game-lib-system-0.js b/src/game-lib-system-0.js index 296440e..14cf1a0 100644 --- a/src/game-lib-system-0.js +++ b/src/game-lib-system-0.js @@ -24,6 +24,8 @@ GameLib.System = function( apiSystem.parentEntity ); + this.started = false; + GameLib.Component.call( this, GameLib.Component.COMPONENT_SYSTEM @@ -56,17 +58,19 @@ GameLib.System.prototype.createInstance = function() { */ GameLib.System.prototype.start = function() { + this.started = true; - if (this.systemType === GameLib.System.SYSTEM_TYPE_ANIMATION) { - // this.pathFollowingObjects = GameLib.EntityManager.Instance.query([GameLib.D3.PathFollowing]); - // this.followObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Follow]); - // this.meshObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Mesh]); - // this.lookAtObjects = GameLib.EntityManager.Instance.query([GameLib.D3.LookAt]); - // this.cameraObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Camera]); - // this.lightObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Light]); - } - this.update(); + // if (this.systemType === GameLib.System.SYSTEM_TYPE_ANIMATION) { + // // this.pathFollowingObjects = GameLib.EntityManager.Instance.query([GameLib.D3.PathFollowing]); + // // this.followObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Follow]); + // // this.meshObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Mesh]); + // // this.lookAtObjects = GameLib.EntityManager.Instance.query([GameLib.D3.LookAt]); + // // this.cameraObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Camera]); + // // this.lightObjects = GameLib.EntityManager.Instance.query([GameLib.D3.Light]); + // } + // + // this.update(); }; @@ -126,14 +130,17 @@ GameLib.System.prototype.update = function(deltaTime) { */ GameLib.System.prototype.stop = function() { - if (this.systemType === GameLib.System.SYSTEM_TYPE_ANIMATION) { - // this.pathFollowingObjects = []; - // this.followObjects = []; - // this.meshObjects = []; - // this.lookAtObjects = []; - // this.cameraObjects = []; - // this.lightObjects = []; - } + this.started = false; + + // + // if (this.systemType === GameLib.System.SYSTEM_TYPE_ANIMATION) { + // // this.pathFollowingObjects = []; + // // this.followObjects = []; + // // this.meshObjects = []; + // // this.lookAtObjects = []; + // // this.cameraObjects = []; + // // this.lightObjects = []; + // } }; /** diff --git a/src/game-lib-system-animation.js b/src/game-lib-system-animation.js index 9ca160f..bed48e0 100644 --- a/src/game-lib-system-animation.js +++ b/src/game-lib-system-animation.js @@ -16,11 +16,33 @@ GameLib.System.Animation.prototype = Object.create(GameLib.System.prototype); GameLib.System.Animation.prototype.constructor = GameLib.System.Animation; GameLib.System.Animation.prototype.start = function() { - console.log('todo: animation system start'); + + GameLib.System.prototype.start.call(this); + + this.animateSubscription = GameLib.Event.Subscribe( + GameLib.Event.ANIMATE, + this.animate + ); + }; +GameLib.System.Animation.prototype.animate = function(data, clientCallback) { + + this.renderSubscription = GameLib.Event.Subscribe( + GameLib.Event.BEFORE_RENDER, + function(data) { + if (clientCallback(data)) { + this.renderSubscription.remove(); + } + }.bind(this) + ) + +}; GameLib.System.Animation.prototype.stop = function() { - console.log('todo: animation system stop'); + + GameLib.System.prototype.stop.call(this); + + this.animateSubscription.remove(); }; diff --git a/src/game-lib-system-custom-code.js b/src/game-lib-system-custom-code.js index 63eb9d4..88fb5cf 100644 --- a/src/game-lib-system-custom-code.js +++ b/src/game-lib-system-custom-code.js @@ -26,6 +26,8 @@ GameLib.System.CustomCode.prototype.constructor = GameLib.System.CustomCode; */ GameLib.System.CustomCode.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.customCodeComponents = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.CustomCode); this.customCodeComponents.map(function(customCodeComponent){ @@ -46,6 +48,8 @@ GameLib.System.CustomCode.prototype.start = function() { */ GameLib.System.CustomCode.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); + this.subscriptions.map(function(subscription){ subscription.remove(); }); diff --git a/src/game-lib-system-gui.js b/src/game-lib-system-gui.js index bc0b7e5..40c7bce 100644 --- a/src/game-lib-system-gui.js +++ b/src/game-lib-system-gui.js @@ -43,6 +43,8 @@ GameLib.System.GUI.prototype.constructor = GameLib.System.GUI; GameLib.System.GUI.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.guis = GameLib.EntityManager.Instance.queryComponents(GameLib.GUI); /** @@ -188,8 +190,17 @@ GameLib.System.GUI.prototype.start = function() { GameLib.System.GUI.prototype.onChange = function(property, subProperty, affected) { return function(value) { affected.map(function(component){ - component[property][subProperty] = value; - component.updateInstance(); + + component[property][subProperty] = value; + + if (typeof component[property].updateInstance === 'function') { + component[property].updateInstance(); + } else if (typeof component[property][subProperty].updateInstance === 'function') { + component[property][subProperty].updateInstance(); + } else { + component.updateInstance(); + } + }); } }; @@ -1679,6 +1690,8 @@ GameLib.System.GUI.prototype.newEntity = function(data) { GameLib.System.GUI.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); + this.guis.map(function(gui){ gui.domElement.instance.parentElement.removeChild(gui.instance.domElement); }); diff --git a/src/game-lib-system-input.js b/src/game-lib-system-input.js index 4f4579a..7d6d5a7 100644 --- a/src/game-lib-system-input.js +++ b/src/game-lib-system-input.js @@ -43,6 +43,8 @@ GameLib.System.Input.prototype.constructor = GameLib.System.Input; */ GameLib.System.Input.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.renderers = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.Renderer); this.renderers.map( @@ -374,6 +376,8 @@ GameLib.System.Input.prototype.deSelectMesh = function(mesh) { */ GameLib.System.Input.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); + /** * Now remove all input capabilities */ diff --git a/src/game-lib-system-linking.js b/src/game-lib-system-linking.js index 25ca3da..153dbe0 100644 --- a/src/game-lib-system-linking.js +++ b/src/game-lib-system-linking.js @@ -50,6 +50,8 @@ GameLib.System.Linking.prototype.constructor = GameLib.System.Linking; GameLib.System.Linking.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.componentCreatedSubscription = this.subscribe( GameLib.Event.COMPONENT_CREATED, this.componentCreated.bind(this) @@ -700,6 +702,12 @@ GameLib.System.Linking.prototype.arrayItemAdded = function(data) { ) { data.component.addRigidBody(data.item); } + + if (data.component instanceof GameLib.D3.Mesh && + data.item instanceof GameLib.D3.Material + ) { + data.component.addMaterial(data.item); + } }; GameLib.System.Linking.prototype.instanceCreated = function(data) { @@ -999,6 +1007,7 @@ GameLib.System.Linking.prototype.meshDeleted = function(data) { }; GameLib.System.Linking.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); this.imageNotFoundSubscription.remove(); this.componentCreatedSubscription.remove(); this.parentSceneChangeSubscription.remove(); diff --git a/src/game-lib-system-physics.js b/src/game-lib-system-physics.js index 2a07b1b..1485e03 100644 --- a/src/game-lib-system-physics.js +++ b/src/game-lib-system-physics.js @@ -32,6 +32,8 @@ GameLib.System.Physics.prototype.constructor = GameLib.System.Physics; GameLib.System.Physics.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.worlds = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.PhysicsWorld); // this.rigidBodies = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RigidBody); // this.wheels = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RaycastWheel); @@ -130,6 +132,8 @@ GameLib.System.Physics.prototype.beforeRender = function(data) { GameLib.System.Physics.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); + this.worlds = []; this.rigidBodies = []; this.wheels = []; diff --git a/src/game-lib-system-render.js b/src/game-lib-system-render.js index 30e6166..bed0298 100644 --- a/src/game-lib-system-render.js +++ b/src/game-lib-system-render.js @@ -24,6 +24,8 @@ GameLib.System.Render.prototype.constructor = GameLib.System.Render; */ GameLib.System.Render.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.renderers = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.Renderer); this.renderers.map( @@ -69,6 +71,8 @@ GameLib.System.Render.prototype.render = function(data) { */ GameLib.System.Render.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); + this.renderers.map( function(renderer) { if (renderer.statistics) { diff --git a/src/game-lib-system-storage.js b/src/game-lib-system-storage.js index 4e4ac08..4e27552 100644 --- a/src/game-lib-system-storage.js +++ b/src/game-lib-system-storage.js @@ -99,6 +99,8 @@ GameLib.System.Storage.prototype.constructor = GameLib.System.Storage; GameLib.System.Storage.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.loginSubscription = this.subscribe( GameLib.Event.LOGGED_IN, function(data) { @@ -998,6 +1000,9 @@ GameLib.System.Storage.prototype.loadImage = function(data) { }; GameLib.System.Storage.prototype.stop = function() { + + GameLib.System.prototype.stop.call(this); + this.loginSubscription.remove(); this.loadSubscription.remove(); this.saveSubscription.remove(); diff --git a/src/game-lib-system-visualization.js b/src/game-lib-system-visualization.js index c6a0059..9fe0b7a 100644 --- a/src/game-lib-system-visualization.js +++ b/src/game-lib-system-visualization.js @@ -34,6 +34,8 @@ GameLib.System.Visualization.prototype.constructor = GameLib.System.Visualizatio GameLib.System.Visualization.prototype.start = function() { + GameLib.System.prototype.start.call(this); + this.visualizationSubscription = this.subscribe( GameLib.Event.VISUALIZE, this.visualize @@ -110,6 +112,8 @@ GameLib.System.Visualization.prototype.stopVisualize = function(data) { GameLib.System.Visualization.prototype.stop = function() { + GameLib.System.prototype.stop.call(this); + if (this.visualizationSubscription) { this.visualizationSubscription.remove(); } diff --git a/src/game-lib-vector3.js b/src/game-lib-vector3.js index 45a8b89..f1e4b8c 100644 --- a/src/game-lib-vector3.js +++ b/src/game-lib-vector3.js @@ -43,7 +43,7 @@ GameLib.Vector3 = function ( ); if (GameLib.Utils.UndefinedOrNull(parentObject)) { - parentObject = null; + parentObject = this; } this.parentObject = parentObject; @@ -93,6 +93,7 @@ GameLib.Vector3.prototype.updateInstance = function() { this.instance.z = this.z; if (this.parentObject && + this.parentObject !== this && this.parentObject.updateInstance) { this.parentObject.updateInstance(); }