From e6e78928edd790bda3604d5c24ddf432230c899f Mon Sep 17 00:00:00 2001 From: -=yb4f310 Date: Fri, 1 Sep 2017 17:04:43 +0200 Subject: [PATCH] friction contact material --- ...me-lib-d3-api-friction-contact-material.js | 109 ++++++++++++++++ src/game-lib-d3-friction-contact-material.js | 123 ++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 src/game-lib-d3-api-friction-contact-material.js create mode 100644 src/game-lib-d3-friction-contact-material.js diff --git a/src/game-lib-d3-api-friction-contact-material.js b/src/game-lib-d3-api-friction-contact-material.js new file mode 100644 index 0000000..88fc3d3 --- /dev/null +++ b/src/game-lib-d3-api-friction-contact-material.js @@ -0,0 +1,109 @@ +/** + * Raw FrictionContactMaterial API object - should always correspond with the FrictionContactMaterial Schema + * @param id + * @param name + * @param material1 + * @param material2 + * @param friction + * @param restitution + * @param contactEquationStiffness + * @param contactEquationRelaxation + * @param frictionEquationStiffness + * @param frictionEquationRelaxation + * @param parentEntity + * @constructor + */ +GameLib.D3.API.FrictionContactMaterial = function( + id, + name, + material1, + material2, + friction, + restitution, + contactEquationStiffness, + contactEquationRelaxation, + frictionEquationStiffness, + frictionEquationRelaxation, + parentEntity +) { + + if (GameLib.Utils.UndefinedOrNull(id)) { + id = GameLib.Utils.RandomId(); + } + this.id = id; + + if (GameLib.Utils.UndefinedOrNull(name)) { + name = 'Friction Material (' + this.id + ')'; + } + this.name = name; + + if (GameLib.Utils.UndefinedOrNull(material1)) { + material1 = null; + } + this.material1 = material1; + + if (GameLib.Utils.UndefinedOrNull(material2)) { + material2 = null; + } + this.material2 = material2; + + if (GameLib.Utils.UndefinedOrNull(friction)) { + friction = 0.3; + } + this.friction = friction; + + if (GameLib.Utils.UndefinedOrNull(restitution)) { + restitution = 0.3; + } + this.restitution = restitution; + + if (GameLib.Utils.UndefinedOrNull(contactEquationStiffness)) { + contactEquationStiffness = 1e7; + } + this.contactEquationStiffness = contactEquationStiffness; + + if (GameLib.Utils.UndefinedOrNull(contactEquationRelaxation)) { + contactEquationRelaxation = 3; + } + this.contactEquationRelaxation = contactEquationRelaxation; + + if (GameLib.Utils.UndefinedOrNull(frictionEquationStiffness)) { + frictionEquationStiffness = 1e7; + } + this.frictionEquationStiffness = frictionEquationStiffness; + + if (GameLib.Utils.UndefinedOrNull(frictionEquationRelaxation)) { + frictionEquationRelaxation = 3; + } + this.frictionEquationRelaxation = frictionEquationRelaxation; + + if (GameLib.Utils.UndefinedOrNull(parentEntity)) { + parentEntity = null; + } + this.parentEntity = parentEntity; +}; + +GameLib.D3.API.FrictionContactMaterial.prototype = Object.create(GameLib.Component.prototype); +GameLib.D3.API.FrictionContactMaterial.prototype.constructor = GameLib.D3.API.FrictionContactMaterial; + +/** + * Creates an API FrictionContactMaterial from an Object FrictionContactMaterial + * @param objectFrictionContactMaterial + * @constructor + */ +GameLib.D3.API.FrictionContactMaterial.FromObject = function(objectFrictionContactMaterial) { + return new GameLib.D3.API.FrictionContactMaterial( + objectFrictionContactMaterial.id, + objectFrictionContactMaterial.name, + objectFrictionContactMaterial.material1, + objectFrictionContactMaterial.material2, + objectFrictionContactMaterial.friction, + objectFrictionContactMaterial.restitution, + objectFrictionContactMaterial.contactEquationStiffness, + objectFrictionContactMaterial.contactEquationRelaxation, + objectFrictionContactMaterial.frictionEquationStiffness, + objectFrictionContactMaterial.frictionEquationRelaxation, + objectFrictionContactMaterial.parentEntity + ); +}; + diff --git a/src/game-lib-d3-friction-contact-material.js b/src/game-lib-d3-friction-contact-material.js new file mode 100644 index 0000000..cb79883 --- /dev/null +++ b/src/game-lib-d3-friction-contact-material.js @@ -0,0 +1,123 @@ +/** + * FrictionContactMaterial Runtime + * @param physics GameLib.D3.Graphics + * @param apiFrictionContactMaterial GameLib.D3.API.FrictionContactMaterial + * @constructor + */ +GameLib.D3.FrictionContactMaterial = function ( + physics, + apiFrictionContactMaterial +) { + + this.physics = physics; + this.physics.isNotCannonThrow(); + + if (GameLib.Utils.UndefinedOrNull(apiFrictionContactMaterial)) { + apiFrictionContactMaterial = {}; + } + + if (apiFrictionContactMaterial instanceof GameLib.D3.FrictionContactMaterial) { + return apiFrictionContactMaterial; + } + + GameLib.D3.API.FrictionContactMaterial.call( + this, + apiFrictionContactMaterial.id, + apiFrictionContactMaterial.name, + apiFrictionContactMaterial.material1, + apiFrictionContactMaterial.material2, + apiFrictionContactMaterial.friction, + apiFrictionContactMaterial.restitution, + apiFrictionContactMaterial.contactEquationStiffness, + apiFrictionContactMaterial.contactEquationRelaxation, + apiFrictionContactMaterial.frictionEquationStiffness, + apiFrictionContactMaterial.frictionEquationRelaxation, + apiFrictionContactMaterial.parentEntity + ); + + GameLib.Component.call( + this, + GameLib.Component.COMPONENT_FRICTION_CONTACT_MATERIAL, + { + material1 : GameLib.D3.FrictionMaterial, + material2 : GameLib.D3.FrictionMaterial + } + ); +}; + +GameLib.D3.FrictionContactMaterial.prototype = Object.create(GameLib.D3.API.FrictionContactMaterial.prototype); +GameLib.D3.FrictionContactMaterial.prototype.constructor = GameLib.D3.FrictionContactMaterial; + +/** + * + * @returns {*} + */ +GameLib.D3.FrictionContactMaterial.prototype.createInstance = function() { + + var instance = new CANNON.ContactMaterial( + this.material1.instance, + this.material2.instance, + { + friction: this.friction, + restitution: this.restitution, + contactEquationStiffness: this.contactEquationStiffness + } + ); + return instance; +}; + +/** + * + */ +GameLib.D3.FrictionContactMaterial.prototype.updateInstance = function() { + + this.instance.material1 = this.material1.instance; + this.instance.material2 = this.material2.instance; + + this.instance.friction = this.friction; + this.instance.restitution = this.restitution; + this.instance.contactEquationStiffness = this.contactEquationStiffness; + this.instance.contactEquationRelaxation = this.contactEquationRelaxation; + this.instance.frictionEquationStiffness = this.frictionEquationStiffness; + this.instance.frictionEquationRelaxation = this.frictionEquationRelaxation; + +}; + +/** + * GameLib.D3.FrictionContactMaterial to GameLib.D3.API.FrictionContactMaterial + * @returns {GameLib.D3.API.FrictionContactMaterial} + */ +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.friction, + this.restitution, + this.contactEquationStiffness, + this.contactEquationRelaxation, + this.frictionEquationStiffness, + this.frictionEquationRelaxation, + GameLib.Utils.IdOrNull(this.parentEntity) + ); + return apiFrictionContactMaterial; +}; + +/** + * GameLib.D3.FrictionContactMaterial from Object FrictionContactMaterial + * @param physics + * @param objectComponent + * @returns {GameLib.D3.FrictionContactMaterial} + * @constructor + */ +GameLib.D3.FrictionContactMaterial.FromObject = function(physics, objectComponent) { + + var apiFrictionContactMaterial = GameLib.D3.API.FrictionContactMaterial.FromObject(objectComponent); + + return new GameLib.D3.FrictionContactMaterial( + physics, + apiFrictionContactMaterial + ); +};