huge refactorings - vector fixes

beta.r3js.org
Theunis J. Botha 2016-12-02 16:03:03 +01:00
parent 90622a80d9
commit b543c586e4
52 changed files with 617 additions and 779 deletions

View File

@ -35,7 +35,7 @@ GameLib.D3.API.Camera = function(
maxZ maxZ
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -1,6 +1,23 @@
GameLib.D3.API.Color = function Color(r, g, b, a) { GameLib.D3.API.Color = function Color(r, g, b, a) {
this.r = r || 1;
this.g = g || 1; if (GameLib.D3.Utils.UndefinedOrNull(r)) {
this.b = b || 1; r = 1;
this.a = a || 0; }
this.r = r;
if (GameLib.D3.Utils.UndefinedOrNull(g)) {
g = 1;
}
this.g = g;
if (GameLib.D3.Utils.UndefinedOrNull(b)) {
b = 1;
}
this.b = b;
if (GameLib.D3.Utils.UndefinedOrNull(a)) {
a = 0;
}
this.a = a;
}; };

View File

@ -79,7 +79,7 @@ GameLib.D3.API.ComponentInterface = function(
maxSteerAngle maxSteerAngle
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -21,7 +21,7 @@ GameLib.D3.API.Entity = function Entity(
mesh mesh
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;
@ -88,17 +88,17 @@ GameLib.D3.Entity = function Entity(
this.mesh = null; this.mesh = null;
if(GameLib.D3.Utils.UndefinedOrNull(position)) { if(GameLib.D3.Utils.UndefinedOrNull(position)) {
position = new GameLib.D3.Vector3(0, 0, 0); position = new GameLib.D3.API.Vector3(0, 0, 0);
} }
this.position = position; this.position = position;
if(GameLib.D3.Utils.UndefinedOrNull(quaternion)) { if(GameLib.D3.Utils.UndefinedOrNull(quaternion)) {
quaternion = new GameLib.D3.Vector4(0, 0, 0, 1); quaternion = new GameLib.D3.API.Vector4(0, 0, 0, 1);
} }
this.quaternion = quaternion; this.quaternion = quaternion;
if(GameLib.D3.Utils.UndefinedOrNull(scale)) { if(GameLib.D3.Utils.UndefinedOrNull(scale)) {
scale = new GameLib.D3.Vector3(1, 1, 1); scale = new GameLib.D3.API.Vector3(1, 1, 1);
} }
this.scale = scale; this.scale = scale;
}; };

View File

@ -35,7 +35,7 @@ GameLib.D3.API.Light = function(
penumbra penumbra
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -119,7 +119,7 @@ GameLib.D3.API.Material = function(
envMapIntensity envMapIntensity
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -39,7 +39,7 @@ GameLib.D3.API.Mesh = function(
up up
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -16,6 +16,7 @@
* @param shapes GameLib.D3.API.Shape[] * @param shapes GameLib.D3.API.Shape[]
* @param cameras * @param cameras
* @param activeCameraIndex * @param activeCameraIndex
* @param splines GameLib.D3.API.Spline[]
* @constructor * @constructor
*/ */
GameLib.D3.API.Scene = function( GameLib.D3.API.Scene = function(
@ -38,7 +39,7 @@ GameLib.D3.API.Scene = function(
splines splines
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -8,7 +8,7 @@ GameLib.D3.API.Spline = function(
vertices vertices
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -47,7 +47,7 @@ GameLib.D3.API.Texture = function(
encoding encoding
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -2,3 +2,10 @@ GameLib.D3.API.Vector2 = function Vector2(x, y) {
this.x = x || 0; this.x = x || 0;
this.y = y || 0; this.y = y || 0;
}; };
GameLib.D3.API.Vector2.prototype.copy = function () {
return new GameLib.D3.API.Vector2(
this.x,
this.y
);
};

View File

@ -18,13 +18,13 @@ GameLib.D3.Camera = function Camera(
this.graphics.isNotThreeThrow(); this.graphics.isNotThreeThrow();
this.position = new GameLib.D3.Runtime.Vector3( this.position = new GameLib.D3.Vector3(
graphics, graphics,
this, this,
this.position this.position
); );
this.lookAt = new GameLib.D3.Runtime.Vector3( this.lookAt = new GameLib.D3.Vector3(
graphics, graphics,
this, this,
this.lookAt this.lookAt
@ -55,9 +55,7 @@ GameLib.D3.Camera.prototype.createInstance = function(update) {
instance = this.instance; instance = this.instance;
} }
if (!instance || if (!instance) {
(instance && this.cameraType != instance.cameraType)
) {
if (this.cameraType == GameLib.D3.Camera.CAMERA_TYPE_PERSPECTIVE) { if (this.cameraType == GameLib.D3.Camera.CAMERA_TYPE_PERSPECTIVE) {
instance = new this.graphics.instance.PerspectiveCamera( instance = new this.graphics.instance.PerspectiveCamera(
this.fov, this.fov,
@ -77,7 +75,7 @@ GameLib.D3.Camera.prototype.createInstance = function(update) {
} }
} }
if (update && this.cameraType == instance.cameraType) { if (update) {
instance.minX = this.minX; instance.minX = this.minX;
instance.maxX = this.maxX; instance.maxX = this.maxX;
instance.minY = this.minY; instance.minY = this.minY;
@ -90,21 +88,9 @@ GameLib.D3.Camera.prototype.createInstance = function(update) {
instance.far = this.far; instance.far = this.far;
} }
if (update) { instance.position.copy(this.position.instance);
instance.cameraType = this.cameraType;
}
instance.position.x = this.position.x; instance.lookAt(this.lookAt.instance);
instance.position.y = this.position.y;
instance.position.z = this.position.z;
instance.lookAt(
new this.graphics.instance.Vector3(
this.lookAt.x,
this.lookAt.y,
this.lookAt.z
)
);
instance.updateProjectionMatrix(); instance.updateProjectionMatrix();

View File

@ -6,7 +6,7 @@
* @param grain Number * @param grain Number
* @constructor * @constructor
*/ */
GameLib.D3.Runtime.Color = function RuntimeColor(graphics, parentObject, color, grain) { GameLib.D3.Color = function RuntimeColor(graphics, parentObject, color, grain) {
for (var property in color) { for (var property in color) {
if (color.hasOwnProperty(property)) { if (color.hasOwnProperty(property)) {
@ -14,7 +14,7 @@ GameLib.D3.Runtime.Color = function RuntimeColor(graphics, parentObject, color,
} }
} }
GameLib.D3.Utils.Extend(GameLib.D3.Runtime.Color, GameLib.D3.API.Color); GameLib.D3.Utils.Extend(GameLib.D3.Color, GameLib.D3.API.Color);
this.graphics = graphics; this.graphics = graphics;
@ -35,7 +35,7 @@ GameLib.D3.Runtime.Color = function RuntimeColor(graphics, parentObject, color,
* @param update * @param update
* @returns {*} * @returns {*}
*/ */
GameLib.D3.Runtime.Color.prototype.createInstance = function(update) { GameLib.D3.Color.prototype.createInstance = function(update) {
var instance = null; var instance = null;
@ -54,7 +54,7 @@ GameLib.D3.Runtime.Color.prototype.createInstance = function(update) {
/** /**
* Updates the instance color, calls updateInstance on the parent object * Updates the instance color, calls updateInstance on the parent object
*/ */
GameLib.D3.Runtime.Color.prototype.updateInstance = function() { GameLib.D3.Color.prototype.updateInstance = function() {
this.createInstance(true); this.createInstance(true);
@ -67,7 +67,7 @@ GameLib.D3.Runtime.Color.prototype.updateInstance = function() {
* Converts runtime color to API Color * Converts runtime color to API Color
* @returns {GameLib.D3.API.Color} * @returns {GameLib.D3.API.Color}
*/ */
GameLib.D3.Runtime.Color.prototype.toApiColor = function() { GameLib.D3.Color.prototype.toApiColor = function() {
return new GameLib.D3.API.Color( return new GameLib.D3.API.Color(
this.r, this.r,
this.g, this.g,
@ -80,7 +80,7 @@ GameLib.D3.Runtime.Color.prototype.toApiColor = function() {
* Converts the current color to HTML hex format (ex. #ffffff) * Converts the current color to HTML hex format (ex. #ffffff)
* @returns {string} * @returns {string}
*/ */
GameLib.D3.Runtime.Color.prototype.toHex = function() { GameLib.D3.Color.prototype.toHex = function() {
if (this.r < 0) { if (this.r < 0) {
this.r = 0; this.r = 0;
@ -124,3 +124,17 @@ GameLib.D3.Runtime.Color.prototype.toHex = function() {
return '#' + rf + gf + bf; return '#' + rf + gf + bf;
}; };
/**
* Sets this object color to what the hex value is
* @param hex
* @returns {string}
*/
GameLib.D3.Color.prototype.fromHex = function(hex) {
var matches = hex.match(new RegExp('#+(..)(..)(..)'));
this.r = parseInt(matches[1], 16) / 255.0;
this.g = parseInt(matches[2], 16) / 255.0;
this.b = parseInt(matches[3], 16) / 255.0;
};

View File

@ -11,7 +11,7 @@ GameLib.D3.ComponentCamera = function ComponentCamera(
name, name,
camera camera
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -8,7 +8,7 @@ GameLib.D3.ComponentColorFlash = function ComponentColorFlash(
id, id,
name name
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -5,7 +5,7 @@ GameLib.D3.ComponentColorLerp = function(
endColor, endColor,
lerpSpeed lerpSpeed
) { ) {
this.id = id|| GameLib.D3.Tools.RandomId(); this.id = id|| GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
} }

View File

@ -12,7 +12,7 @@ GameLib.D3.ComponentEntityParent = function ComponentEntityParent(
parent, parent,
centerToOrigin centerToOrigin
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -14,7 +14,7 @@ GameLib.D3.ComponentEntityPermutation = function ComponentEntityPermutation(
quaternionOffset, quaternionOffset,
scaleOffset scaleOffset
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
@ -24,17 +24,17 @@ GameLib.D3.ComponentEntityPermutation = function ComponentEntityPermutation(
this.parentEntity = null; this.parentEntity = null;
if(GameLib.D3.Utils.UndefinedOrNull(positionOffset)) { if(GameLib.D3.Utils.UndefinedOrNull(positionOffset)) {
positionOffset = new GameLib.D3.Vector3(0, 0, 0); positionOffset = new GameLib.D3.API.Vector3(0, 0, 0);
} this.positionOffset = positionOffset; } this.positionOffset = positionOffset;
if(GameLib.D3.Utils.UndefinedOrNull(quaternionOffset)) { if(GameLib.D3.Utils.UndefinedOrNull(quaternionOffset)) {
quaternionOffset = new GameLib.D3.Vector4(0, 0, 0, 1); quaternionOffset = new GameLib.D3.API.Vector4(0, 0, 0, 1);
} this.quaternionOffset = quaternionOffset; } this.quaternionOffset = quaternionOffset;
if(GameLib.D3.Utils.UndefinedOrNull(scaleOffset)) { if(GameLib.D3.Utils.UndefinedOrNull(scaleOffset)) {
scaleOffset = new GameLib.D3.Vector3(1, 1, 1); scaleOffset = new GameLib.D3.API.Vector3(1, 1, 1);
} this.scaleOffset = scaleOffset; } this.scaleOffset = scaleOffset;
GameLib.D3.Utils.Extend(GameLib.D3.ComponentEntityPermutation, GameLib.D3.ComponentInterface); GameLib.D3.Utils.Extend(GameLib.D3.ComponentEntityPermutation, GameLib.D3.ComponentInterface);

View File

@ -8,7 +8,7 @@ GameLib.D3.ComponentFlyControls = function ComponentFlyControls(
id, id,
name name
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -16,7 +16,7 @@ GameLib.D3.ComponentFollow = function ComponentFollow(
minDistance, minDistance,
moveSpeed moveSpeed
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -8,7 +8,7 @@ GameLib.D3.ComponentInterface = function ComponentInterface(
id, id,
name name
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -14,7 +14,7 @@ GameLib.D3.ComponentLookAt = function ComponentLookAt(
targetOffset, targetOffset,
rotationSpeed rotationSpeed
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -14,7 +14,7 @@ GameLib.D3.ComponentMeshPermutation = function ComponentMeshPermutation(
quaternionOffset, quaternionOffset,
scaleOffset scaleOffset
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
@ -23,9 +23,9 @@ GameLib.D3.ComponentMeshPermutation = function ComponentMeshPermutation(
this.parentEntity = null; this.parentEntity = null;
this.positionOffset = positionOffset || new GameLib.D3.Vector3(0, 0, 0); this.positionOffset = positionOffset || new GameLib.D3.API.Vector3(0, 0, 0);
this.quaternionOffset = quaternionOffset || new GameLib.D3.Vector4(0, 0, 0, 1); this.quaternionOffset = quaternionOffset || new GameLib.D3.API.Vector4(0, 0, 0, 1);
this.scaleOffset = scaleOffset || new GameLib.D3.Vector3(1, 1, 1); this.scaleOffset = scaleOffset || new GameLib.D3.API.Vector3(1, 1, 1);
// Todo: this should be executed somewhere in game-lib-z, so that we don't execute it on every construction of an object. // Todo: this should be executed somewhere in game-lib-z, so that we don't execute it on every construction of an object.
GameLib.D3.Utils.Extend(GameLib.D3.ComponentMeshPermutation, GameLib.D3.ComponentInterface); GameLib.D3.Utils.Extend(GameLib.D3.ComponentMeshPermutation, GameLib.D3.ComponentInterface);

View File

@ -2,7 +2,7 @@
* *
* @param id * @param id
* @param name * @param name
* @param axis {GameLib.D3.Vector3} * @param axis {GameLib.D3.API.Vector3}
* @param getOffsetFunc {function} * @param getOffsetFunc {function}
* @param userData {Object} * @param userData {Object}
* @constructor * @constructor
@ -14,7 +14,7 @@ GameLib.D3.ComponentOffsettor = function ComponentOffsettor(
getOffsetFunc, getOffsetFunc,
userData userData
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
@ -22,7 +22,7 @@ GameLib.D3.ComponentOffsettor = function ComponentOffsettor(
this.name = name; this.name = name;
this.parentEntity = null; this.parentEntity = null;
this.axis = axis || new GameLib.D3.Vector3(); this.axis = axis || new GameLib.D3.API.Vector3();
this.offset = 1; this.offset = 1;
var component = this; var component = this;
this.getOffsetFunc = getOffsetFunc || function(entity, component, userData){ return component.offset; }; this.getOffsetFunc = getOffsetFunc || function(entity, component, userData){ return component.offset; };

View File

@ -10,7 +10,7 @@ GameLib.D3.ComponentPathAI = function ComponentPathAI(
name, name,
sensorLength sensorLength
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -8,7 +8,7 @@ GameLib.D3.ComponentPathControls = function ComponentPathControls(
id, id,
name name
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -22,7 +22,7 @@ GameLib.D3.ComponentPathFollowing = function ComponentPathFollowing(
maxOffset, maxOffset,
steeringSpeed steeringSpeed
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
@ -37,16 +37,16 @@ GameLib.D3.ComponentPathFollowing = function ComponentPathFollowing(
this.maxSpeed = maxSpeed || 10.0; this.maxSpeed = maxSpeed || 10.0;
this.accel = accel || 2.0; this.accel = accel || 2.0;
this.baseOffset = baseOffset || new GameLib.D3.Vector3(); this.baseOffset = baseOffset || new GameLib.D3.API.Vector3();
this.maxOffset = maxOffset || new GameLib.D3.Vector3(10, 10, 10); this.maxOffset = maxOffset || new GameLib.D3.API.Vector3(10, 10, 10);
this.steeringSpeed = steeringSpeed || 1.0; this.steeringSpeed = steeringSpeed || 1.0;
// runtime code // runtime code
//#ifdef RUNTIME__ //#ifdef RUNTIME__
this.offset = new GameLib.D3.Vector3(); // this one is our destination offset this.offset = new GameLib.D3.API.Vector3(); // this one is our destination offset
this.currentOffset = new GameLib.D3.Vector3(); this.currentOffset = new GameLib.D3.API.Vector3();
this.currentPathValue = 0.0; this.currentPathValue = 0.0;
this.currentSpeed = 0.0; this.currentSpeed = 0.0;
this.direction = 0; this.direction = 0;

View File

@ -8,7 +8,7 @@ GameLib.D3.ComponentRaycastVehicleControls = function ComponentRaycastVehicleCon
maxForce, maxForce,
steering steering
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -2,7 +2,7 @@
* *
* @param id * @param id
* @param name * @param name
* @param axis {GameLib.D3.Vector3} * @param axis {GameLib.D3.API.Vector3}
* @param getRotationFunc {Function} * @param getRotationFunc {Function}
* @param userData {Object} * @param userData {Object}
* @constructor * @constructor
@ -14,7 +14,7 @@ GameLib.D3.ComponentRotator = function ComponentRotator(
getRotationFunc, getRotationFunc,
userData userData
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
@ -24,7 +24,7 @@ GameLib.D3.ComponentRotator = function ComponentRotator(
this.rotation = 0; this.rotation = 0;
var component = this; var component = this;
this.axis = axis || new GameLib.D3.Vector3(); this.axis = axis || new GameLib.D3.API.Vector3();
this.getRotationFunc = getRotationFunc || function(entity, component, userData){ return component.rotation; }; this.getRotationFunc = getRotationFunc || function(entity, component, userData){ return component.rotation; };
this.userData = userData; this.userData = userData;

View File

@ -13,7 +13,7 @@ GameLib.D3.ComponentTriggerBoxBox = function ComponentTriggerBoxBox(
) { ) {
console.log('triggerbox box!'); console.log('triggerbox box!');
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -11,7 +11,7 @@ GameLib.D3.ComponentTriggerBoxSphere = function ComponentTriggerBoxSphere(
onLeave, onLeave,
onSetParent onSetParent
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -21,7 +21,7 @@ GameLib.D3.ComponentTriggerSphereSphere = function ComponentTriggerSphereSphere(
onLeave, onLeave,
onSetParent onSetParent
) { ) {
this.id = id || GameLib.D3.Tools.RandomId(); this.id = id || GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;

View File

@ -10,7 +10,7 @@ GameLib.D3.ComponentVehicleAIObjectAvoidance = function(
name, name,
world world
) { ) {
this.id = id|| GameLib.D3.Tools.RandomId(); this.id = id|| GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
} }

View File

@ -14,7 +14,7 @@ GameLib.D3.ComponentVehicleAIPathSteering = function(
steeringSpeed, steeringSpeed,
maxSteerAngle maxSteerAngle
) { ) {
this.id = id|| GameLib.D3.Tools.RandomId(); this.id = id|| GameLib.D3.Utils.RandomId();
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = this.constructor.name; name = this.constructor.name;
} }

View File

@ -15,7 +15,7 @@ GameLib.D3.Helper = function Helper(
graphics graphics
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -76,7 +76,7 @@ GameLib.D3.Image = function(
contentType contentType
) { ) {
if (GameLib.D3.Utils.UndefinedOrNull(id)) { if (GameLib.D3.Utils.UndefinedOrNull(id)) {
id = GameLib.D3.Tools.RandomId(); id = GameLib.D3.Utils.RandomId();
} }
this.id = id; this.id = id;

View File

@ -14,40 +14,40 @@ GameLib.D3.Light = function Light(
} }
} }
this.color = new GameLib.D3.Runtime.Color( this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.color = new GameLib.D3.Color(
graphics, graphics,
this, this,
this.color, this.color,
0.01 0.01
); );
this.position = new GameLib.D3.Runtime.Vector3( this.position = new GameLib.D3.Vector3(
graphics, graphics,
this, this,
this.position this.position
); );
this.targetPosition = new GameLib.D3.Runtime.Vector3( this.targetPosition = new GameLib.D3.Vector3(
graphics, graphics,
this, this,
this.targetPosition this.targetPosition
); );
this.scale = new GameLib.D3.Runtime.Vector3( this.scale = new GameLib.D3.Vector3(
graphics, graphics,
this, this,
this.scale this.scale
); );
this.quaternion = new GameLib.D3.Runtime.Vector4( this.quaternion = new GameLib.D3.Vector4(
graphics, graphics,
this, this,
this.quaternion this.quaternion
); );
this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.instance = this.createInstance(); this.instance = this.createInstance();
}; };
@ -76,33 +76,21 @@ GameLib.D3.Light.prototype.createInstance = function(update) {
if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_AMBIENT) { if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_AMBIENT) {
instance = new this.graphics.instance.AmbientLight( instance = new this.graphics.instance.AmbientLight(
new this.graphics.instance.Color( this.color.instance,
this.color.r,
this.color.g,
this.color.b
),
this.intensity this.intensity
); );
} }
if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_DIRECTIONAL) { if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_DIRECTIONAL) {
instance = new this.graphics.instance.DirectionalLight( instance = new this.graphics.instance.DirectionalLight(
new this.graphics.instance.Color( this.color.instance,
this.color.r,
this.color.g,
this.color.b
),
this.intensity this.intensity
); );
} }
if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_POINT) { if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_POINT) {
instance = new this.graphics.instance.PointLight( instance = new this.graphics.instance.PointLight(
new this.graphics.instance.Color( this.color.instance,
this.color.r,
this.color.g,
this.color.b
),
this.intensity this.intensity
); );
instance.distance = this.distance; instance.distance = this.distance;
@ -111,11 +99,7 @@ GameLib.D3.Light.prototype.createInstance = function(update) {
if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_SPOT ) { if (this.lightType == GameLib.D3.Light.LIGHT_TYPE_SPOT ) {
instance = new this.graphics.instance.SpotLight( instance = new this.graphics.instance.SpotLight(
new this.graphics.instance.Color( this.color.instance,
this.color.r,
this.color.g,
this.color.b
),
this.intensity this.intensity
); );
instance.distance = this.distance; instance.distance = this.distance;
@ -134,24 +118,15 @@ GameLib.D3.Light.prototype.createInstance = function(update) {
instance.name = this.name; instance.name = this.name;
instance.position.x = this.position.x; instance.position.copy(this.position.instance);
instance.position.y = this.position.y;
instance.position.z = this.position.z;
instance.scale.x = this.scale.x; instance.scale.copy(this.scale.instance);
instance.scale.y = this.scale.y;
instance.scale.z = this.scale.z;
if (instance.target) { if (instance.target) {
instance.target.x = this.targetPosition.x; instance.target.position.copy(this.targetPosition.instance);
instance.target.y = this.targetPosition.y;
instance.target.z = this.targetPosition.z;
} }
instance.quaternion.x = this.quaternion.x; instance.quaternion.copy(this.quaternion.instance);
instance.quaternion.y = this.quaternion.y;
instance.quaternion.z = this.quaternion.z;
instance.quaternion.w = this.quaternion.w;
instance.intensity = this.intensity; instance.intensity = this.intensity;

View File

@ -16,27 +16,27 @@ GameLib.D3.Material = function Material(
} }
} }
this.specular = new GameLib.D3.Runtime.Color( this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.specular = new GameLib.D3.Color(
graphics, graphics,
this, this,
this.specular this.specular
); );
this.color = new GameLib.D3.Runtime.Color( this.color = new GameLib.D3.Color(
graphics, graphics,
this, this,
this.color this.color
); );
this.emissive = new GameLib.D3.Runtime.Color( this.emissive = new GameLib.D3.Color(
graphics, graphics,
this, this,
this.emissive this.emissive
); );
this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.instance = this.createInstance(); this.instance = this.createInstance();
this.needsUpdate = false; this.needsUpdate = false;
@ -150,10 +150,7 @@ GameLib.D3.Material.prototype.createInstance = function(update) {
instance = this.instance; instance = this.instance;
} }
if ( if (!instance) {
(!instance) ||
(instance && instance.type != this.materialType)
) {
if (this.materialType == GameLib.D3.Material.MATERIAL_TYPE_STANDARD) { if (this.materialType == GameLib.D3.Material.MATERIAL_TYPE_STANDARD) {
@ -177,20 +174,12 @@ GameLib.D3.Material.prototype.createInstance = function(update) {
overdraw: this.overdraw, overdraw: this.overdraw,
visible: this.visible, visible: this.visible,
side: this.side, side: this.side,
color: new this.graphics.instance.Color( color: this.color.instance,
this.color.r,
this.color.g,
this.color.b
),
roughness: this.roughness, roughness: this.roughness,
metalness: this.metalness, metalness: this.metalness,
lightMapIntensity: this.lightMapIntensity, lightMapIntensity: this.lightMapIntensity,
aoMapIntensity: this.aoMapIntensity, aoMapIntensity: this.aoMapIntensity,
emissive: new this.graphics.instance.Color( emissive: this.emissive.instance,
this.emissive.r,
this.emissive.g,
this.emissive.b
),
emissiveIntensity: this.emissiveIntensity, emissiveIntensity: this.emissiveIntensity,
bumpScale: this.bumpScale, bumpScale: this.bumpScale,
normalScale: this.normalScale, normalScale: this.normalScale,
@ -230,24 +219,12 @@ GameLib.D3.Material.prototype.createInstance = function(update) {
overdraw: this.overdraw, overdraw: this.overdraw,
visible: this.visible, visible: this.visible,
side: this.side, side: this.side,
color: new this.graphics.instance.Color( color: this.color.instance,
this.color.r, specular: this.specular.instance,
this.color.g,
this.color.b
),
specular: new this.graphics.instance.Color(
this.specular.r,
this.specular.g,
this.specular.b
),
shininess: this.shininess, shininess: this.shininess,
lightMapIntensity: this.lightMapIntensity, lightMapIntensity: this.lightMapIntensity,
aoMapIntensity: this.aoMapIntensity, aoMapIntensity: this.aoMapIntensity,
emissive: new this.graphics.instance.Color( emissive: this.emissive.instance,
this.emissive.r,
this.emissive.g,
this.emissive.b
),
emissiveIntensity: this.emissiveIntensity, emissiveIntensity: this.emissiveIntensity,
bumpScale: this.bumpScale, bumpScale: this.bumpScale,
normalScale: this.normalScale, normalScale: this.normalScale,
@ -287,11 +264,7 @@ GameLib.D3.Material.prototype.createInstance = function(update) {
overdraw: this.overdraw, overdraw: this.overdraw,
visible: this.visible, visible: this.visible,
side: this.side, side: this.side,
color: new this.graphics.instance.Color( color: this.color.instance,
this.color.r,
this.color.g,
this.color.b
),
size: this.pointSize, size: this.pointSize,
sizeAttenuation: this.pointSizeAttenuation, sizeAttenuation: this.pointSizeAttenuation,
vertexColors: GameLib.D3.Material.TYPE_NO_COLORS, vertexColors: GameLib.D3.Material.TYPE_NO_COLORS,
@ -319,7 +292,11 @@ GameLib.D3.Material.prototype.createInstance = function(update) {
this.hasOwnProperty(property) && this.hasOwnProperty(property) &&
instance.hasOwnProperty(property) instance.hasOwnProperty(property)
) { ) {
instance[property] = this[property]; if (instance[property] instanceof THREE.Color) {
instance[property].copy(this[property])
} else {
instance[property] = this[property];
}
} }
} }

View File

@ -20,25 +20,39 @@ GameLib.D3.Mesh = function Mesh(
this.graphics.isNotThreeThrow(); this.graphics.isNotThreeThrow();
this.position = new GameLib.D3.Vector3(
graphics,
this,
this.position
);
this.scale = new GameLib.D3.Vector3(
graphics,
this,
this.scale
);
this.up = new GameLib.D3.Vector3(
graphics,
this,
this.up
);
/**
* We don't do a Runtime rotation since it interferes with the quaternion update
*/
this.quaternion = new GameLib.D3.Vector4(
graphics,
this,
this.quaternion
);
this.computeNormals = computeNormals; this.computeNormals = computeNormals;
this.instance = this.createInstance(false); this.instance = this.createInstance(false);
this.needsUpdate = false; this.needsUpdate = false;
this.offsetRotation = new GameLib.D3.Runtime.Vector3(graphics, this, new GameLib.D3.API.Vector3(0,0,0));
delete this.offsetRotation.updateInstance;
// this.lookAtPoint = new GameLib.D3.Runtime.Vector3(graphics, this, new GameLib.D3.API.Vector3(0,0,0));
//
// delete this.offsetRotation.updateInstance;
//
// this.offsetRotation = new GameLib.D3.Runtime.Vector3(graphics, this, new GameLib.D3.API.Vector3(0,0,0));
//
// delete this.offsetRotation.updateInstance;
}; };
/** /**
@ -295,23 +309,16 @@ GameLib.D3.Mesh.prototype.createInstance = function(update) {
instance.gameLibObject = this; instance.gameLibObject = this;
instance.position.x = this.position.x; instance.position.copy(this.position.instance);
instance.position.y = this.position.y;
instance.position.z = this.position.z;
instance.scale.x = this.scale.x; instance.scale.copy(this.scale.instance);
instance.scale.y = this.scale.y;
instance.scale.z = this.scale.z;
// we don't do rotation since it interferes with the quaternion update instance.up.copy(this.up.instance);
// instance.rotation.x = this.rotation.x;
// instance.rotation.y = this.rotation.y;
// instance.rotation.z = this.rotation.z;
instance.quaternion.x = this.quaternion.x; /**
instance.quaternion.y = this.quaternion.y; * We don't do rotation - its dealt with by quaternion
instance.quaternion.z = this.quaternion.z; */
instance.quaternion.w = this.quaternion.w; instance.quaternion.copy(this.quaternion.instance);
return instance; return instance;
}; };
@ -320,303 +327,6 @@ GameLib.D3.Mesh.prototype.updateInstance = function() {
this.instance = this.createInstance(true); this.instance = this.createInstance(true);
}; };
GameLib.D3.prototype.invertWindingOrder = function(triangles) {
for (var i = 0; i < triangles.length; i++) {
var v1 = triangles[i].v1;
triangles[i].v1 = triangles[i].v2;
triangles[i].v2 = v1;
var backupUV = triangles[i].triangle.v1uv;
triangles[i].triangle.v1uv = triangles[i].triangle.v2uv;
triangles[i].triangle.v2uv = backupUV;
}
return triangles;
};
/**
* This function resets a the winding order of a mesh from a reference point V (the average center of the mesh)
*/
GameLib.D3.prototype.resetWindingOrder = function(faces, vertices) {
var vertexList = new GameLib.D3.API.Vector3.Points();
for (var v = 0; v < vertices.length; v++) {
vertexList.add(new GameLib.D3.API.Vector3(
vertices[v].position.x,
vertices[v].position.y,
vertices[v].position.z
));
}
var V = vertexList.average();
var triangles = [];
for (var s = 0; s < faces.length; s += 3) {
var v0 = faces[s];
var v1 = faces[s+1];
var v2 = faces[s+2];
triangles.push(
{
v0 : v0,
v1 : v1,
v2 : v2,
edges : [
{v0: v0, v1: v1},
{v0: v1, v1: v2},
{v0: v2, v1: v0}
],
winding : 0,
edgeIndex : -1,
processed : false
}
);
}
for (var i = 0; i < triangles.length; i++) {
if (
GameLib.D3.API.Vector3.clockwise(
vertices[triangles[i].v0].position,
vertices[triangles[i].v1].position,
vertices[triangles[i].v2].position,
V
)
) {
console.log('clockwise');
var bv1 = triangles[i].v1;
triangles[i].v1 = triangles[i].v2;
triangles[i].v2 = bv1;
} else {
console.log('not clockwise');
}
}
return triangles;
};
/**
* This function resets the winding order for triangles in faces, given an initial triangle and orientation edge
* used pseudocode from
* http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh
* We need to use a graph traversal algorithm,
* lets assume we have method that returns neighbor of triangle on given edge
*
* neighbor_on_egde( next_tria, edge )
*
* to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it
* processed = set of processed triangles; initial empty
*
* while to_process is not empty:
* next_tria, orientation_edge = to_process.pop()
* add next_tria in processed
* if next_tria is not opposite oriented than orientation_edge:
* change next_tria (ABC) orientation (B<->C)
* for each edge (AB) in next_tria:
* neighbor_tria = neighbor_on_egde( next_tria, edge )
* if neighbor_tria exists and neighbor_tria not in processed:
* to_process add (neighbor_tria, edge opposite oriented (BA))
* @param faces GameLib.D3.TriangleFace[]
* @param orientationEdge GameLib.D3.API.Vector2
* @returns {Array}
*/
GameLib.D3.fixWindingOrder = function(faces, orientationEdge) {
/**
* Checks if a TriangleFace belonging to a TriangleEdge has already been processed
* @param processed TriangleEdge[]
* @param triangle TriangleFace
* @returns {boolean}
*/
function inProcessed(processed, triangle) {
for (var i = 0; i < processed.length; i++) {
if (processed[i].triangle.equals(triangle)) {
return true;
}
}
return false;
}
/**
* Returns a neighbouring triangle on a specific edge - preserving the edge orientation
* @param edge GameLib.D3.API.Vector2
* @param faces GameLib.D3.TriangleFace[]
* @param currentTriangle
* @returns {*}
*/
function neighbourOnEdge(edge, faces, currentTriangle) {
for (var i = 0; i < faces.length; i++) {
if (
(faces[i].v0 == edge.x && faces[i].v1 == edge.y) ||
(faces[i].v1 == edge.x && faces[i].v2 == edge.y) ||
(faces[i].v2 == edge.x && faces[i].v0 == edge.y) ||
(faces[i].v0 == edge.y && faces[i].v1 == edge.x) ||
(faces[i].v1 == edge.y && faces[i].v2 == edge.x) ||
(faces[i].v2 == edge.y && faces[i].v0 == edge.x)
) {
var triangle = new GameLib.D3.TriangleFace(
faces[i].v0,
faces[i].v1,
faces[i].v2,
faces[i].materialIndex,
faces[i].v0uv,
faces[i].v1uv,
faces[i].v2uv
);
if (triangle.equals(currentTriangle)) {
continue;
}
return new GameLib.D3.TriangleEdge(
triangle,
edge
);
}
}
return null;
}
var toProcess = [
new GameLib.D3.TriangleEdge(
new GameLib.D3.TriangleFace(
faces[0].v0,
faces[0].v1,
faces[0].v2,
faces[0].materialIndex,
faces[0].v0uv,
faces[0].v1uv,
faces[0].v2uv
),
orientationEdge
)
];
var processed = [];
while (toProcess.length > 0) {
var triangleEdge = toProcess.pop();
/**
* If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed
* to have the same winding order)
*/
if (
(triangleEdge.triangle.v0 == triangleEdge.edge.x &&
triangleEdge.triangle.v1 == triangleEdge.edge.y) ||
(triangleEdge.triangle.v1 == triangleEdge.edge.x &&
triangleEdge.triangle.v2 == triangleEdge.edge.y) ||
(triangleEdge.triangle.v2 == triangleEdge.edge.x &&
triangleEdge.triangle.v0 == triangleEdge.edge.y)
) {
var backupV = triangleEdge.triangle.v1;
triangleEdge.triangle.v1 = triangleEdge.triangle.v2;
triangleEdge.triangle.v2 = backupV;
var backupUV = triangleEdge.triangle.v1uv;
triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv;
triangleEdge.triangle.v2uv = backupUV;
}
processed.push(triangleEdge);
var edges = [
new GameLib.D3.API.Vector2(
triangleEdge.triangle.v0,
triangleEdge.triangle.v1
),
new GameLib.D3.API.Vector2(
triangleEdge.triangle.v1,
triangleEdge.triangle.v2
),
new GameLib.D3.API.Vector2(
triangleEdge.triangle.v2,
triangleEdge.triangle.v0
)
];
for (var j = 0; j < edges.length; j++) {
var neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle);
if (neighbour && !inProcessed(processed, neighbour.triangle)) {
toProcess.push(neighbour);
}
}
}
/**
* In processed - we will have some duplicates - only add the unique ones
* @type {Array}
*/
var triangles = [];
for (var i = 0; i < processed.length; i++) {
var found = false;
for (var k = 0; k < triangles.length; k++) {
if (triangles[k].equals(processed[i].triangle)){
found = true;
break;
}
}
if (!found) {
triangles.push(processed[i].triangle);
}
}
return triangles;
};
/**
* This is a work-around function to fix polys which don't triangulate because
* they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around
* Z then Y axis
* @param verticesFlat []
* @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY
* @return []
*/
GameLib.D3.fixPolyZPlane = function(verticesFlat, grain) {
if ((verticesFlat.length % 3) != 0 && !(verticesFlat.length > 9)) {
console.log("The vertices are not in the right length : " + verticesFlat.length);
}
var vertices = [];
var points = new GameLib.D3.API.Vector4.Points();
for (var i = 0; i < verticesFlat.length; i += 3) {
points.add(new GameLib.D3.API.Vector3(
verticesFlat[i],
verticesFlat[i + 1],
verticesFlat[i + 2]
));
}
points.toOrigin();
points.maximizeXDistance(grain);
points.maximizeYDistance(grain);
for (i = 0; i < points.vectors.length; i++) {
vertices.push(
[
points.vectors[i].x,
points.vectors[i].y
]
);
}
return vertices;
};
GameLib.D3.Mesh.prototype.clone = function() { GameLib.D3.Mesh.prototype.clone = function() {
return _.cloneDeep(this); return _.cloneDeep(this);
}; };

View File

@ -14,7 +14,7 @@ GameLib.D3.RaycastVehicle = function(
this.engine = engine; this.engine = engine;
this.engine.isNotCannonThrow(); this.engine.isNotCannonThrow();
this.id = GameLib.D3.Tools.RandomId(); this.id = GameLib.D3.Utils.RandomId();
this.chassisBody = chassisBody; this.chassisBody = chassisBody;

View File

@ -30,7 +30,7 @@ GameLib.D3.RaycastWheel = function(
this.engine = engine; this.engine = engine;
this.engine.isNotCannonThrow(); this.engine.isNotCannonThrow();
this.id = GameLib.D3.Tools.RandomId(); this.id = GameLib.D3.Utils.RandomId();
if(typeof chassisConnectionPointLocal == 'undefined' || chassisConnectionPointLocal == null) { if(typeof chassisConnectionPointLocal == 'undefined' || chassisConnectionPointLocal == null) {
chassisConnectionPointLocal = new this.engine.instance.Vec3(); chassisConnectionPointLocal = new this.engine.instance.Vec3();

View File

@ -10,7 +10,7 @@ GameLib.D3.RigidBodyVehicle = function(
chassisBody, chassisBody,
wheels wheels
) { ) {
this.id = GameLib.D3.Tools.RandomId(); this.id = GameLib.D3.Utils.RandomId();
this.engine = engine; this.engine = engine;
this.engine.isNotCannonThrow(); this.engine.isNotCannonThrow();

View File

@ -39,7 +39,7 @@ GameLib.D3.RigidBody = function(
shape, shape,
kinematic kinematic
) { ) {
this.id = GameLib.D3.Tools.RandomId(); this.id = GameLib.D3.Utils.RandomId();
this.position = position || new GameLib.D3.API.Vector3(); this.position = position || new GameLib.D3.API.Vector3();
this.velocity = velocity || new GameLib.D3.API.Vector3(); this.velocity = velocity || new GameLib.D3.API.Vector3();
this.angularVelocity = angularVelocity || new GameLib.D3.API.Vector3(); this.angularVelocity = angularVelocity || new GameLib.D3.API.Vector3();

View File

@ -12,7 +12,7 @@ GameLib.D3.RigidWheel = function(
axis, axis,
direction direction
) { ) {
this.id = GameLib.D3.Tools.RandomId(); this.id = GameLib.D3.Utils.RandomId();
this.body = body; this.body = body;
this.position = position; this.position = position;
this.axis = axis; this.axis = axis;

View File

@ -27,6 +27,28 @@ GameLib.D3.Scene = function Scene(
this.graphics = graphics; this.graphics = graphics;
this.graphics.isNotThreeThrow(); this.graphics.isNotThreeThrow();
this.position = new GameLib.D3.Vector3(
graphics,
this,
this.position
);
this.scale = new GameLib.D3.Vector3(
graphics,
this,
this.scale
);
/**
* We don't do a Runtime rotation since it interferes with the quaternion update
*/
this.quaternion = new GameLib.D3.Vector4(
graphics,
this,
this.quaternion
);
if (GameLib.D3.Utils.UndefinedOrNull(meshIdToMesh)) { if (GameLib.D3.Utils.UndefinedOrNull(meshIdToMesh)) {
meshIdToMesh = {}; meshIdToMesh = {};
} }
@ -56,22 +78,11 @@ GameLib.D3.Scene.prototype.createInstance = function() {
instance.name = this.name; instance.name = this.name;
instance.position.x = this.position.x; instance.position = this.position.instance;
instance.position.y = this.position.y;
instance.position.z = this.position.z;
instance.rotation.x = this.rotation.x; instance.scale = this.scale.instance;
instance.rotation.y = this.rotation.y;
instance.rotation.z = this.rotation.z;
instance.scale.x = this.scale.x; instance.quaternion = this.quaternion.instance;
instance.scale.y = this.scale.y;
instance.scale.z = this.scale.z;
instance.quaternion.x = this.quaternion.x;
instance.quaternion.y = this.quaternion.y;
instance.quaternion.z = this.quaternion.z;
instance.quaternion.w = this.quaternion.w;
for (var im = 0; im < this.meshes.length; im++) { for (var im = 0; im < this.meshes.length; im++) {
instance.add(this.meshes[im].instance); instance.add(this.meshes[im].instance);
@ -396,37 +407,6 @@ GameLib.D3.Scene.LoadScene = function(
) )
); );
gameLibMesh.position = new GameLib.D3.Runtime.Vector3(
graphics,
gameLibMesh,
gameLibMesh.position
);
gameLibMesh.scale = new GameLib.D3.Runtime.Vector3(
graphics,
gameLibMesh,
gameLibMesh.scale
);
gameLibMesh.up = new GameLib.D3.Runtime.Vector3(
graphics,
gameLibMesh,
gameLibMesh.up
);
// we don't do rotation since it interferes with the quaternion update
// gameLibMesh.rotation = new GameLib.D3.Runtime.Vector3(
// graphics,
// gameLibMesh,
// gameLibMesh.rotation
// );
gameLibMesh.quaternion = new GameLib.D3.Runtime.Vector4(
graphics,
gameLibMesh,
gameLibMesh.quaternion
);
gameLibMeshes.push(gameLibMesh); gameLibMeshes.push(gameLibMesh);
meshIdToMesh[gameLibMesh.id] = gameLibMesh; meshIdToMesh[gameLibMesh.id] = gameLibMesh;

View File

@ -21,21 +21,21 @@ GameLib.D3.Texture = function Texture(
} }
} }
this.offset = new GameLib.D3.Runtime.Vector2( this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.offset = new GameLib.D3.Vector2(
graphics, graphics,
this, this,
this.offset this.offset
); );
this.repeat = new GameLib.D3.Runtime.Vector2( this.repeat = new GameLib.D3.Vector2(
graphics, graphics,
this, this,
this.repeat this.repeat
); );
this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.parentMaterial = parentMaterial; this.parentMaterial = parentMaterial;
this.parentMaterialInstanceMapId = parentMaterialInstanceMapId; this.parentMaterialInstanceMapId = parentMaterialInstanceMapId;
@ -173,10 +173,8 @@ GameLib.D3.Texture.prototype.createInstance = function(update) {
instance.flipY = this.flipY; instance.flipY = this.flipY;
instance.encoding = this.encoding; instance.encoding = this.encoding;
instance.flipY = this.flipY; instance.flipY = this.flipY;
instance.offset.x = this.offset.x; instance.offset.copy(this.offset.instance);
instance.offset.y = this.offset.y; instance.repeat.copy(this.repeat.instance);
instance.repeat.x = this.repeat.x;
instance.repeat.y = this.repeat.y;
instance.mipmaps = this.mipmaps; instance.mipmaps = this.mipmaps;
instance.unpackAlignment = this.unpackAlignment; instance.unpackAlignment = this.unpackAlignment;
instance.premultiplyAlpha = this.premultiplyAlpha; instance.premultiplyAlpha = this.premultiplyAlpha;

View File

@ -1,10 +0,0 @@
GameLib.D3.Tools = function(){};
/**
* Generates a random ID
* @returns {string}
* @constructor
*/
GameLib.D3.Tools.RandomId = function() {
return Math.random().toString(36).substr(2, 10);
};

View File

@ -24,3 +24,309 @@ GameLib.D3.Utils.Raycast = function (
) { ) {
console.log("not implemented yet"); console.log("not implemented yet");
}; };
/**
* Generates a random ID
* @returns {string}
* @constructor
*/
GameLib.D3.Utils.RandomId = function() {
return Math.random().toString(36).substr(2, 10);
};
GameLib.D3.Utils.InvertWindingOrder = function(triangles) {
for (var i = 0; i < triangles.length; i++) {
var v1 = triangles[i].v1;
triangles[i].v1 = triangles[i].v2;
triangles[i].v2 = v1;
var backupUV = triangles[i].triangle.v1uv;
triangles[i].triangle.v1uv = triangles[i].triangle.v2uv;
triangles[i].triangle.v2uv = backupUV;
}
return triangles;
};
/**
* This function resets a the winding order of a mesh from a reference point V (the average center of the mesh)
*/
GameLib.D3.Utils.ResetWindingOrder = function(faces, vertices) {
var vertexList = new GameLib.D3.API.Vector3.Points();
for (var v = 0; v < vertices.length; v++) {
vertexList.add(new GameLib.D3.API.Vector3(
vertices[v].position.x,
vertices[v].position.y,
vertices[v].position.z
));
}
var V = vertexList.average();
var triangles = [];
for (var s = 0; s < faces.length; s += 3) {
var v0 = faces[s];
var v1 = faces[s+1];
var v2 = faces[s+2];
triangles.push(
{
v0 : v0,
v1 : v1,
v2 : v2,
edges : [
{v0: v0, v1: v1},
{v0: v1, v1: v2},
{v0: v2, v1: v0}
],
winding : 0,
edgeIndex : -1,
processed : false
}
);
}
for (var i = 0; i < triangles.length; i++) {
if (
GameLib.D3.API.Vector3.clockwise(
vertices[triangles[i].v0].position,
vertices[triangles[i].v1].position,
vertices[triangles[i].v2].position,
V
)
) {
console.log('clockwise');
var bv1 = triangles[i].v1;
triangles[i].v1 = triangles[i].v2;
triangles[i].v2 = bv1;
} else {
console.log('not clockwise');
}
}
return triangles;
};
/**
* This function resets the winding order for triangles in faces, given an initial triangle and orientation edge
* used pseudocode from
* http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh
* We need to use a graph traversal algorithm,
* lets assume we have method that returns neighbor of triangle on given edge
*
* neighbor_on_egde( next_tria, edge )
*
* to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it
* processed = set of processed triangles; initial empty
*
* while to_process is not empty:
* next_tria, orientation_edge = to_process.pop()
* add next_tria in processed
* if next_tria is not opposite oriented than orientation_edge:
* change next_tria (ABC) orientation (B<->C)
* for each edge (AB) in next_tria:
* neighbor_tria = neighbor_on_egde( next_tria, edge )
* if neighbor_tria exists and neighbor_tria not in processed:
* to_process add (neighbor_tria, edge opposite oriented (BA))
* @param faces GameLib.D3.TriangleFace[]
* @param orientationEdge GameLib.D3.API.Vector2
* @returns {Array}
*/
GameLib.D3.Utils.FixWindingOrder = function(faces, orientationEdge) {
/**
* Checks if a TriangleFace belonging to a TriangleEdge has already been processed
* @param processed TriangleEdge[]
* @param triangle TriangleFace
* @returns {boolean}
*/
function inProcessed(processed, triangle) {
for (var i = 0; i < processed.length; i++) {
if (processed[i].triangle.equals(triangle)) {
return true;
}
}
return false;
}
/**
* Returns a neighbouring triangle on a specific edge - preserving the edge orientation
* @param edge GameLib.D3.API.Vector2
* @param faces GameLib.D3.TriangleFace[]
* @param currentTriangle
* @returns {*}
*/
function neighbourOnEdge(edge, faces, currentTriangle) {
for (var i = 0; i < faces.length; i++) {
if (
(faces[i].v0 == edge.x && faces[i].v1 == edge.y) ||
(faces[i].v1 == edge.x && faces[i].v2 == edge.y) ||
(faces[i].v2 == edge.x && faces[i].v0 == edge.y) ||
(faces[i].v0 == edge.y && faces[i].v1 == edge.x) ||
(faces[i].v1 == edge.y && faces[i].v2 == edge.x) ||
(faces[i].v2 == edge.y && faces[i].v0 == edge.x)
) {
var triangle = new GameLib.D3.TriangleFace(
faces[i].v0,
faces[i].v1,
faces[i].v2,
faces[i].materialIndex,
faces[i].v0uv,
faces[i].v1uv,
faces[i].v2uv
);
if (triangle.equals(currentTriangle)) {
continue;
}
return new GameLib.D3.TriangleEdge(
triangle,
edge
);
}
}
return null;
}
var toProcess = [
new GameLib.D3.TriangleEdge(
new GameLib.D3.TriangleFace(
faces[0].v0,
faces[0].v1,
faces[0].v2,
faces[0].materialIndex,
faces[0].v0uv,
faces[0].v1uv,
faces[0].v2uv
),
orientationEdge
)
];
var processed = [];
while (toProcess.length > 0) {
var triangleEdge = toProcess.pop();
/**
* If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed
* to have the same winding order)
*/
if (
(triangleEdge.triangle.v0 == triangleEdge.edge.x &&
triangleEdge.triangle.v1 == triangleEdge.edge.y) ||
(triangleEdge.triangle.v1 == triangleEdge.edge.x &&
triangleEdge.triangle.v2 == triangleEdge.edge.y) ||
(triangleEdge.triangle.v2 == triangleEdge.edge.x &&
triangleEdge.triangle.v0 == triangleEdge.edge.y)
) {
var backupV = triangleEdge.triangle.v1;
triangleEdge.triangle.v1 = triangleEdge.triangle.v2;
triangleEdge.triangle.v2 = backupV;
var backupUV = triangleEdge.triangle.v1uv;
triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv;
triangleEdge.triangle.v2uv = backupUV;
}
processed.push(triangleEdge);
var edges = [
new GameLib.D3.API.Vector2(
triangleEdge.triangle.v0,
triangleEdge.triangle.v1
),
new GameLib.D3.API.Vector2(
triangleEdge.triangle.v1,
triangleEdge.triangle.v2
),
new GameLib.D3.API.Vector2(
triangleEdge.triangle.v2,
triangleEdge.triangle.v0
)
];
for (var j = 0; j < edges.length; j++) {
var neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle);
if (neighbour && !inProcessed(processed, neighbour.triangle)) {
toProcess.push(neighbour);
}
}
}
/**
* In processed - we will have some duplicates - only add the unique ones
* @type {Array}
*/
var triangles = [];
for (var i = 0; i < processed.length; i++) {
var found = false;
for (var k = 0; k < triangles.length; k++) {
if (triangles[k].equals(processed[i].triangle)){
found = true;
break;
}
}
if (!found) {
triangles.push(processed[i].triangle);
}
}
return triangles;
};
/**
* This is a work-around function to fix polys which don't triangulate because
* they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around
* Z then Y axis
* @param verticesFlat []
* @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY
* @return []
*/
GameLib.D3.Utils.FixPolyZPlane = function(verticesFlat, grain) {
if ((verticesFlat.length % 3) != 0 && !(verticesFlat.length > 9)) {
console.log("The vertices are not in the right length : " + verticesFlat.length);
}
var vertices = [];
var points = new GameLib.D3.API.Vector4.Points();
for (var i = 0; i < verticesFlat.length; i += 3) {
points.add(new GameLib.D3.API.Vector3(
verticesFlat[i],
verticesFlat[i + 1],
verticesFlat[i + 2]
));
}
points.toOrigin();
points.maximizeXDistance(grain);
points.maximizeYDistance(grain);
for (i = 0; i < points.vectors.length; i++) {
vertices.push(
[
points.vectors[i].x,
points.vectors[i].y
]
);
}
return vertices;
};

View File

@ -6,7 +6,7 @@
* @param grain Number * @param grain Number
* @constructor * @constructor
*/ */
GameLib.D3.Runtime.Vector2 = function RuntimeVector2(graphics, parentObject, vector2, grain) { GameLib.D3.Vector2 = function RuntimeVector2(graphics, parentObject, vector2, grain) {
for (var property in vector2) { for (var property in vector2) {
if (vector2.hasOwnProperty(property)) { if (vector2.hasOwnProperty(property)) {
@ -14,7 +14,7 @@ GameLib.D3.Runtime.Vector2 = function RuntimeVector2(graphics, parentObject, vec
} }
} }
GameLib.D3.Utils.Extend(GameLib.D3.Runtime.Vector2, GameLib.D3.API.Vector2); GameLib.D3.Utils.Extend(GameLib.D3.Vector2, GameLib.D3.API.Vector2);
this.graphics = graphics; this.graphics = graphics;
@ -35,7 +35,7 @@ GameLib.D3.Runtime.Vector2 = function RuntimeVector2(graphics, parentObject, vec
* @param update * @param update
* @returns {*} * @returns {*}
*/ */
GameLib.D3.Runtime.Vector2.prototype.createInstance = function(update) { GameLib.D3.Vector2.prototype.createInstance = function(update) {
var instance = null; var instance = null;
@ -53,7 +53,7 @@ GameLib.D3.Runtime.Vector2.prototype.createInstance = function(update) {
/** /**
* Updates the instance vector, calls updateInstance on the parent object * Updates the instance vector, calls updateInstance on the parent object
*/ */
GameLib.D3.Runtime.Vector2.prototype.updateInstance = function() { GameLib.D3.Vector2.prototype.updateInstance = function() {
this.createInstance(true); this.createInstance(true);
@ -66,113 +66,108 @@ GameLib.D3.Runtime.Vector2.prototype.updateInstance = function() {
* Converts runtime vector to API Vector * Converts runtime vector to API Vector
* @returns {GameLib.D3.API.Vector2} * @returns {GameLib.D3.API.Vector2}
*/ */
GameLib.D3.Runtime.Vector2.prototype.toApiVector = function() { GameLib.D3.Vector2.prototype.toApiVector = function() {
return new GameLib.D3.API.Vector2( return new GameLib.D3.API.Vector2(
this.x, this.x,
this.y this.y
); );
}; };
GameLib.D3.Runtime.Vector2 = function Vector2(x, y) { GameLib.D3.Vector2.prototype.copy = function (v) {
this.x = x || 0;
this.y = y || 0;
};
GameLib.D3.Runtime.Vector2.prototype.copy = function (v) {
if (!GameLib.D3.Utils.UndefinedOrNull(v)) { if (!GameLib.D3.Utils.UndefinedOrNull(v)) {
this.x = v.x; this.x = v.x;
this.y = v.y; this.y = v.y;
return this; return this;
} else { } else {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x, this.x,
this.y this.y
); );
} }
}; };
GameLib.D3.Runtime.Vector2.prototype.equals = function(v) { GameLib.D3.Vector2.prototype.equals = function(v) {
return (((this.x == v.x) && return (((this.x == v.x) &&
(this.y == v.y)) || (this.y == v.y)) ||
((this.y == v.x) && ((this.y == v.x) &&
(this.x == v.y))); (this.x == v.y)));
}; };
GameLib.D3.Runtime.Vector2.prototype.add = function(v) { GameLib.D3.Vector2.prototype.add = function(v) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x + v.x, this.x + v.x,
this.y + v.y this.y + v.y
); );
}; };
GameLib.D3.Runtime.Vector2.prototype.subtract = function(v) { GameLib.D3.Vector2.prototype.subtract = function(v) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x - v.x, this.x - v.x,
this.y - v.y this.y - v.y
); );
}; };
GameLib.D3.Runtime.Vector2.prototype.multiply = function(v) { GameLib.D3.Vector2.prototype.multiply = function(v) {
if (v instanceof GameLib.D3.Runtime.Vector2) { if (v instanceof GameLib.D3.Vector2) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x * v.x, this.x * v.x,
this.y * v.y this.y * v.y
); );
} else if (isNumber(v)) { } else if (isNumber(v)) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x * v, this.x * v,
this.y * v this.y * v
); );
} }
}; };
GameLib.D3.Runtime.Vector2.prototype.divide = function(v) { GameLib.D3.Vector2.prototype.divide = function(v) {
if (v instanceof GameLib.D3.Runtime.Vector2) { if (v instanceof GameLib.D3.Vector2) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x * (1.0 / v.x), this.x * (1.0 / v.x),
this.y * (1.0 / v.y) this.y * (1.0 / v.y)
); );
} else if (isNumber(v)) { } else if (isNumber(v)) {
var invS = 1.0 / v; var invS = 1.0 / v;
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x * invS, this.x * invS,
this.y * invS this.y * invS
); );
} }
}; };
GameLib.D3.Runtime.Vector2.prototype.set = function(x, y) { GameLib.D3.Vector2.prototype.set = function(x, y) {
this.x = x; this.x = x;
this.y = y; this.y = y;
}; };
GameLib.D3.Runtime.Vector2.prototype.clamp = function(min, max) { GameLib.D3.Vector2.prototype.clamp = function(min, max) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
Math.max(min.x, Math.min(max.x, this.x)), Math.max(min.x, Math.min(max.x, this.x)),
Math.max(min.y, Math.min(max.y, this.y)) Math.max(min.y, Math.min(max.y, this.y))
); );
}; };
GameLib.D3.Runtime.Vector2.prototype.length = function() { GameLib.D3.Vector2.prototype.length = function() {
return Math.sqrt(this.x * this.x + this.y * this.y); return Math.sqrt(this.x * this.x + this.y * this.y);
}; };
GameLib.D3.Runtime.Vector2.prototype.dot = function(v) { GameLib.D3.Vector2.prototype.dot = function(v) {
return this.x * v.x + this.y * v.y; return this.x * v.x + this.y * v.y;
}; };
GameLib.D3.Runtime.Vector2.prototype.normalize = function() { GameLib.D3.Vector2.prototype.normalize = function() {
return this.multiply(1.0 / this.length()); return this.multiply(1.0 / this.length());
}; };
GameLib.D3.Runtime.Vector2.prototype.angle = function() { GameLib.D3.Vector2.prototype.angle = function() {
var angle = Math.atan2(this.y, this.x); var angle = Math.atan2(this.y, this.x);
if ( angle < 0 ) angle += 2 * Math.PI; if ( angle < 0 ) angle += 2 * Math.PI;
return angle; return angle;
}; };
GameLib.D3.Runtime.Vector2.prototype.lerp = function ( v, alpha ) { GameLib.D3.Vector2.prototype.lerp = function ( v, alpha ) {
return new GameLib.D3.Runtime.Vector2( return new GameLib.D3.Vector2(
this.x + ( v.x - this.x ) * alpha, this.x + ( v.x - this.x ) * alpha,
this.y + ( v.y - this.y ) * alpha this.y + ( v.y - this.y ) * alpha
); );

View File

@ -6,7 +6,7 @@
* @param grain Number * @param grain Number
* @constructor * @constructor
*/ */
GameLib.D3.Runtime.Vector3 = function RuntimeVector3(graphics, parentObject, vector3, grain) { GameLib.D3.Vector3 = function RuntimeVector3(graphics, parentObject, vector3, grain) {
for (var property in vector3) { for (var property in vector3) {
if (vector3.hasOwnProperty(property)) { if (vector3.hasOwnProperty(property)) {
@ -14,7 +14,7 @@ GameLib.D3.Runtime.Vector3 = function RuntimeVector3(graphics, parentObject, vec
} }
} }
GameLib.D3.Utils.Extend(GameLib.D3.Runtime.Vector3, GameLib.D3.API.Vector3); GameLib.D3.Utils.Extend(GameLib.D3.Vector3, GameLib.D3.API.Vector3);
this.graphics = graphics; this.graphics = graphics;
@ -35,7 +35,7 @@ GameLib.D3.Runtime.Vector3 = function RuntimeVector3(graphics, parentObject, vec
* @param update * @param update
* @returns {*} * @returns {*}
*/ */
GameLib.D3.Runtime.Vector3.prototype.createInstance = function(update) { GameLib.D3.Vector3.prototype.createInstance = function(update) {
var instance = null; var instance = null;
@ -54,7 +54,7 @@ GameLib.D3.Runtime.Vector3.prototype.createInstance = function(update) {
/** /**
* Updates the instance vector, calls updateInstance on the parent object * Updates the instance vector, calls updateInstance on the parent object
*/ */
GameLib.D3.Runtime.Vector3.prototype.updateInstance = function() { GameLib.D3.Vector3.prototype.updateInstance = function() {
this.createInstance(true); this.createInstance(true);
@ -67,7 +67,7 @@ GameLib.D3.Runtime.Vector3.prototype.updateInstance = function() {
* Converts runtime vector to API Vector * Converts runtime vector to API Vector
* @returns {GameLib.D3.API.Vector3} * @returns {GameLib.D3.API.Vector3}
*/ */
GameLib.D3.Runtime.Vector3.prototype.toApiVector = function() { GameLib.D3.Vector3.prototype.toApiVector = function() {
return new GameLib.D3.API.Vector3( return new GameLib.D3.API.Vector3(
this.x, this.x,
this.y, this.y,
@ -75,24 +75,24 @@ GameLib.D3.Runtime.Vector3.prototype.toApiVector = function() {
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.subtract = function (v) { GameLib.D3.Vector3.prototype.subtract = function (v) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x - v.x, this.x - v.x,
this.y - v.y, this.y - v.y,
this.z - v.z this.z - v.z
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.sub = function (v) { GameLib.D3.Vector3.prototype.sub = function (v) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x - v.x, this.x - v.x,
this.y - v.y, this.y - v.y,
this.z - v.z this.z - v.z
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.cross = function (v) { GameLib.D3.Vector3.prototype.cross = function (v) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.y * v.z - this.z * v.y, this.y * v.z - this.z * v.y,
this.z * v.x - this.x * v.z, this.z * v.x - this.x * v.z,
this.x * v.y - this.y * v.x this.x * v.y - this.y * v.x
@ -100,66 +100,66 @@ GameLib.D3.Runtime.Vector3.prototype.cross = function (v) {
}; };
GameLib.D3.Runtime.Vector3.clockwise = function (u, v, w, viewPoint) { GameLib.D3.Vector3.clockwise = function (u, v, w, viewPoint) {
var normal = GameLib.D3.Runtime.Vector3.normal(u, v, w); var normal = GameLib.D3.Vector3.normal(u, v, w);
var uv = u.copy(); var uv = u.copy();
var winding = normal.dot(uv.subtract(viewPoint)); var winding = normal.dot(uv.subtract(viewPoint));
return (winding > 0); return (winding > 0);
}; };
GameLib.D3.Runtime.Vector3.normal = function (u, v, w) { GameLib.D3.Vector3.normal = function (u, v, w) {
var vv = v.copy(); var vv = v.copy();
var wv = w.copy(); var wv = w.copy();
return vv.subtract(u).cross(wv.subtract(u)); return vv.subtract(u).cross(wv.subtract(u));
}; };
GameLib.D3.Runtime.Vector3.prototype.lookAt = function (at, up) { GameLib.D3.Vector3.prototype.lookAt = function (at, up) {
var lookAtMatrix = GameLib.D3.Matrix4.lookAt(this, at, up); var lookAtMatrix = GameLib.D3.Matrix4.lookAt(this, at, up);
return this.multiply(lookAtMatrix); return this.multiply(lookAtMatrix);
}; };
GameLib.D3.Runtime.Vector3.prototype.translate = function (v) { GameLib.D3.Vector3.prototype.translate = function (v) {
this.x += v.x; this.x += v.x;
this.y += v.y; this.y += v.y;
this.z += v.z; this.z += v.z;
return this; return this;
}; };
GameLib.D3.Runtime.Vector3.prototype.add = function (v) { GameLib.D3.Vector3.prototype.add = function (v) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x + v.x, this.x + v.x,
this.y + v.y, this.y + v.y,
this.z + v.z this.z + v.z
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.squared = function () { GameLib.D3.Vector3.prototype.squared = function () {
return this.x * this.x + this.y * this.y + this.z * this.z; return this.x * this.x + this.y * this.y + this.z * this.z;
}; };
GameLib.D3.Runtime.Vector3.prototype.copy = function () { GameLib.D3.Vector3.prototype.copy = function () {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x, this.x,
this.y, this.y,
this.z this.z
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.set = function (x, y, z) { GameLib.D3.Vector3.prototype.set = function (x, y, z) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
}; };
GameLib.D3.Runtime.Vector3.prototype.lerp = function ( v, alpha ) { GameLib.D3.Vector3.prototype.lerp = function ( v, alpha ) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x + ( v.x - this.x ) * alpha, this.x + ( v.x - this.x ) * alpha,
this.y + ( v.y - this.y ) * alpha, this.y + ( v.y - this.y ) * alpha,
this.z + ( v.z - this.z ) * alpha this.z + ( v.z - this.z ) * alpha
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.distanceTo = function(v) { GameLib.D3.Vector3.prototype.distanceTo = function(v) {
var dx = this.x - v.x, var dx = this.x - v.x,
dy = this.y - v.y, dy = this.y - v.y,
dz = this.z - v.z; dz = this.z - v.z;
@ -169,7 +169,7 @@ GameLib.D3.Runtime.Vector3.prototype.distanceTo = function(v) {
/** /**
* @return {number} * @return {number}
*/ */
GameLib.D3.Runtime.Vector3.AngleDirection = function(forward, directionToCheck, up) { GameLib.D3.Vector3.AngleDirection = function(forward, directionToCheck, up) {
var perp = forward.cross(directionToCheck); var perp = forward.cross(directionToCheck);
var dir = perp.dot(up); var dir = perp.dot(up);
@ -183,10 +183,10 @@ GameLib.D3.Runtime.Vector3.AngleDirection = function(forward, directionToCheck,
}; };
GameLib.D3.Runtime.Vector3.prototype.multiply = function (s) { GameLib.D3.Vector3.prototype.multiply = function (s) {
if (s instanceof GameLib.D3.Runtime.Vector3) { if (s instanceof GameLib.D3.Vector3) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x * s.x, this.x * s.x,
this.y * s.y, this.y * s.y,
this.z * s.z this.z * s.z
@ -198,7 +198,7 @@ GameLib.D3.Runtime.Vector3.prototype.multiply = function (s) {
var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z + s.rows[1].w; var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z + s.rows[1].w;
var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z + s.rows[2].w; var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z + s.rows[2].w;
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
x, x,
y, y,
z z
@ -210,7 +210,7 @@ GameLib.D3.Runtime.Vector3.prototype.multiply = function (s) {
var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z; var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z;
var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z; var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z;
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
x, x,
y, y,
z z
@ -218,7 +218,7 @@ GameLib.D3.Runtime.Vector3.prototype.multiply = function (s) {
} else if(!isNaN(parseFloat(s)) && isFinite(s)) { } else if(!isNaN(parseFloat(s)) && isFinite(s)) {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x * s, this.x * s,
this.y * s, this.y * s,
this.z * s this.z * s
@ -233,11 +233,11 @@ GameLib.D3.Runtime.Vector3.prototype.multiply = function (s) {
}; };
GameLib.D3.Runtime.Vector3.prototype.dot = function (v) { GameLib.D3.Vector3.prototype.dot = function (v) {
return (this.x * v.x) + (this.y * v.y) + (this.z * v.z); return (this.x * v.x) + (this.y * v.y) + (this.z * v.z);
}; };
GameLib.D3.Runtime.Vector3.prototype.normalize = function () { GameLib.D3.Vector3.prototype.normalize = function () {
var EPSILON = 0.000001; var EPSILON = 0.000001;
var v2 = this.squared(); var v2 = this.squared();
@ -246,22 +246,22 @@ GameLib.D3.Runtime.Vector3.prototype.normalize = function () {
} }
var invLength = 1.0 / Math.sqrt(v2); var invLength = 1.0 / Math.sqrt(v2);
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x * invLength, this.x * invLength,
this.y * invLength, this.y * invLength,
this.z * invLength this.z * invLength
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.clone = function () { GameLib.D3.Vector3.prototype.clone = function () {
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
this.x, this.x,
this.y, this.y,
this.z this.z
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.applyQuaternion = function(q) { GameLib.D3.Vector3.prototype.applyQuaternion = function(q) {
var x = this.x, y = this.y, z = this.z; var x = this.x, y = this.y, z = this.z;
var qx = q.x, qy = q.y, qz = q.z, qw = q.w; var qx = q.x, qy = q.y, qz = q.z, qw = q.w;
@ -274,14 +274,14 @@ GameLib.D3.Runtime.Vector3.prototype.applyQuaternion = function(q) {
// calculate result * inverse quat // calculate result * inverse quat
return new GameLib.D3.Runtime.Vector3( return new GameLib.D3.Vector3(
ix * qw + iw * - qx + iy * - qz - iz * - qy, ix * qw + iw * - qx + iy * - qz - iz * - qy,
iy * qw + iw * - qy + iz * - qx - ix * - qz, iy * qw + iw * - qy + iz * - qx - ix * - qz,
iz * qw + iw * - qz + ix * - qy - iy * - qx iz * qw + iw * - qz + ix * - qy - iy * - qx
); );
}; };
GameLib.D3.Runtime.Vector3.prototype.clamp = function(min, max) { GameLib.D3.Vector3.prototype.clamp = function(min, max) {
this.x = Math.max( min.x, Math.min( max.x, this.x ) ); this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) ); this.y = Math.max( min.y, Math.min( max.y, this.y ) );
this.z = Math.max( min.z, Math.min( max.z, this.z ) ); this.z = Math.max( min.z, Math.min( max.z, this.z ) );
@ -289,22 +289,22 @@ GameLib.D3.Runtime.Vector3.prototype.clamp = function(min, max) {
return this; return this;
}; };
GameLib.D3.Runtime.Vector3.prototype.negate = function() { GameLib.D3.Vector3.prototype.negate = function() {
this.x = -this.x; this.x = -this.x;
this.y = -this.y; this.y = -this.y;
this.z = -this.z; this.z = -this.z;
return this; return this;
}; };
GameLib.D3.Runtime.Vector3.prototype.length = function() { GameLib.D3.Vector3.prototype.length = function() {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
}; };
GameLib.D3.Runtime.Vector3.prototype.reflect = function(normal) { GameLib.D3.Vector3.prototype.reflect = function(normal) {
return this.sub( v1.copy( normal ).multiply( 2 * this.dot( normal ) ) ); return this.sub( v1.copy( normal ).multiply( 2 * this.dot( normal ) ) );
}; };
GameLib.D3.Runtime.Vector3.prototype.angleTo = function (v) { GameLib.D3.Vector3.prototype.angleTo = function (v) {
var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );
return Math.acos( exports.Math.clamp( theta, - 1, 1 ) ); return Math.acos( exports.Math.clamp( theta, - 1, 1 ) );
}; };

View File

@ -6,7 +6,7 @@
* @param grain Number * @param grain Number
* @constructor * @constructor
*/ */
GameLib.D3.Runtime.Vector4 = function RuntimeVector4(graphics, parentObject, vector4, grain) { GameLib.D3.Vector4 = function RuntimeVector4(graphics, parentObject, vector4, grain) {
for (var property in vector4) { for (var property in vector4) {
if (vector4.hasOwnProperty(property)) { if (vector4.hasOwnProperty(property)) {
@ -14,7 +14,7 @@ GameLib.D3.Runtime.Vector4 = function RuntimeVector4(graphics, parentObject, vec
} }
} }
GameLib.D3.Utils.Extend(GameLib.D3.Runtime.Vector4, GameLib.D3.API.Vector4); GameLib.D3.Utils.Extend(GameLib.D3.Vector4, GameLib.D3.API.Vector4);
this.graphics = graphics; this.graphics = graphics;
@ -35,7 +35,7 @@ GameLib.D3.Runtime.Vector4 = function RuntimeVector4(graphics, parentObject, vec
* @param update * @param update
* @returns {*} * @returns {*}
*/ */
GameLib.D3.Runtime.Vector4.prototype.createInstance = function(update) { GameLib.D3.Vector4.prototype.createInstance = function(update) {
var instance = null; var instance = null;
@ -55,7 +55,7 @@ GameLib.D3.Runtime.Vector4.prototype.createInstance = function(update) {
/** /**
* Updates the instance vector, calls updateInstance on the parent object * Updates the instance vector, calls updateInstance on the parent object
*/ */
GameLib.D3.Runtime.Vector4.prototype.updateInstance = function() { GameLib.D3.Vector4.prototype.updateInstance = function() {
this.createInstance(true); this.createInstance(true);
@ -68,7 +68,7 @@ GameLib.D3.Runtime.Vector4.prototype.updateInstance = function() {
* Converts runtime vector to API Vector * Converts runtime vector to API Vector
* @returns {GameLib.D3.API.Vector4} * @returns {GameLib.D3.API.Vector4}
*/ */
GameLib.D3.Runtime.Vector4.prototype.toApiVector = function() { GameLib.D3.Vector4.prototype.toApiVector = function() {
return new GameLib.D3.API.Vector4( return new GameLib.D3.API.Vector4(
this.x, this.x,
this.y, this.y,
@ -77,39 +77,15 @@ GameLib.D3.Runtime.Vector4.prototype.toApiVector = function() {
); );
}; };
GameLib.D3.Runtime.Vector4 = function Vector4(x, y, z, w) { GameLib.D3.Vector4.prototype.translate = function (v) {
this.x = 0;
this.y = 0;
this.z = 0;
this.w = 1;
if (x) {
this.x = x;
}
if (y) {
this.y = y;
}
if (z) {
this.z = z;
}
if (w) {
this.w = w;
}
};
GameLib.D3.Runtime.Vector4.prototype.translate = function (v) {
this.x += v.x; this.x += v.x;
this.y += v.y; this.y += v.y;
this.z += v.z; this.z += v.z;
return this; return this;
}; };
GameLib.D3.Runtime.Vector4.prototype.copy = function () { GameLib.D3.Vector4.prototype.copy = function () {
return new GameLib.D3.Runtime.Vector4( return new GameLib.D3.Vector4(
this.x, this.x,
this.y, this.y,
this.z, this.z,
@ -117,8 +93,8 @@ GameLib.D3.Runtime.Vector4.prototype.copy = function () {
); );
}; };
GameLib.D3.Runtime.Vector4.prototype.multiply = function (s) { GameLib.D3.Vector4.prototype.multiply = function (s) {
if (s instanceof GameLib.D3.API.Vector3) { if (s instanceof GameLib.D3.Vector3) {
this.x *= s.x; this.x *= s.x;
this.y *= s.y; this.y *= s.y;
this.z *= s.z; this.z *= s.z;
@ -138,7 +114,7 @@ GameLib.D3.Runtime.Vector4.prototype.multiply = function (s) {
}; };
GameLib.D3.Runtime.Vector4.prototype.normalize = function () { GameLib.D3.Vector4.prototype.normalize = function () {
// note - leave w untouched // note - leave w untouched
var EPSILON = 0.000001; var EPSILON = 0.000001;
@ -158,7 +134,7 @@ GameLib.D3.Runtime.Vector4.prototype.normalize = function () {
return this; return this;
}; };
GameLib.D3.Runtime.Vector4.prototype.subtract = function (v) { GameLib.D3.Vector4.prototype.subtract = function (v) {
if (v instanceof GameLib.D3.API.Vector3) { if (v instanceof GameLib.D3.API.Vector3) {
this.x -= v.x; this.x -= v.x;
@ -166,7 +142,7 @@ GameLib.D3.Runtime.Vector4.prototype.subtract = function (v) {
this.z -= v.z; this.z -= v.z;
} }
if (v instanceof GameLib.D3.Runtime.Vector4) { if (v instanceof GameLib.D3.Vector4) {
this.x -= v.x; this.x -= v.x;
this.y -= v.y; this.y -= v.y;
this.z -= v.z; this.z -= v.z;
@ -176,14 +152,14 @@ GameLib.D3.Runtime.Vector4.prototype.subtract = function (v) {
return this; return this;
}; };
GameLib.D3.Runtime.Vector4.Points = function () { GameLib.D3.Vector4.Points = function () {
this.vectors = []; this.vectors = [];
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.add = function (vector) { GameLib.D3.Vector4.Points.prototype.add = function (vector) {
if (vector instanceof GameLib.D3.API.Vector3) { if (vector instanceof GameLib.D3.API.Vector3) {
vector = new GameLib.D3.Runtime.Vector4( vector = new GameLib.D3.Vector4(
vector.x, vector.x,
vector.y, vector.y,
vector.z, vector.z,
@ -191,7 +167,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.add = function (vector) {
) )
} }
if (!vector instanceof GameLib.D3.Runtime.Vector4) { if (!vector instanceof GameLib.D3.Vector4) {
console.warn("Vector needs to be of type Vector4"); console.warn("Vector needs to be of type Vector4");
throw new Error("Vector needs to be of type Vector4"); throw new Error("Vector needs to be of type Vector4");
} }
@ -201,7 +177,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.add = function (vector) {
return this; return this;
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.copy = function () { GameLib.D3.Vector4.Points.prototype.copy = function () {
var vectors = []; var vectors = [];
@ -212,7 +188,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.copy = function () {
return vectors; return vectors;
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.maximizeXDistance = function (grain) { GameLib.D3.Vector4.Points.prototype.maximizeXDistance = function (grain) {
// console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2)); // console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2));
@ -257,7 +233,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.maximizeXDistance = function (grain)
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.maximizeYDistance = function (grain) { GameLib.D3.Vector4.Points.prototype.maximizeYDistance = function (grain) {
// console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2)); // console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2));
@ -302,7 +278,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.maximizeYDistance = function (grain)
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.lookAt = function (at, up) { GameLib.D3.Vector4.Points.prototype.lookAt = function (at, up) {
var polyCenter = this.average(); var polyCenter = this.average();
@ -310,9 +286,9 @@ GameLib.D3.Runtime.Vector4.Points.prototype.lookAt = function (at, up) {
var lookAtMatrix = new GameLib.D3.Matrix4().lookAt(polyCenter, at, up); var lookAtMatrix = new GameLib.D3.Matrix4().lookAt(polyCenter, at, up);
lookAtMatrix.rows[0] = new GameLib.D3.Runtime.Vector4(1, 0, 0, 0); lookAtMatrix.rows[0] = new GameLib.D3.Vector4(1, 0, 0, 0);
lookAtMatrix.rows[1] = new GameLib.D3.Runtime.Vector4(0, 0, 1, 0); lookAtMatrix.rows[1] = new GameLib.D3.Vector4(0, 0, 1, 0);
lookAtMatrix.rows[2] = new GameLib.D3.Runtime.Vector4(0, 1, 0, 0); lookAtMatrix.rows[2] = new GameLib.D3.Vector4(0, 1, 0, 0);
console.log("look at matrix : " + JSON.stringify(lookAtMatrix, null, 2)); console.log("look at matrix : " + JSON.stringify(lookAtMatrix, null, 2));
@ -323,7 +299,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.lookAt = function (at, up) {
} }
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.distances = function () { GameLib.D3.Vector4.Points.prototype.distances = function () {
var minX = this.vectors[0].x; var minX = this.vectors[0].x;
var minY = this.vectors[0].y; var minY = this.vectors[0].y;
@ -362,7 +338,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.distances = function () {
) )
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.average = function () { GameLib.D3.Vector4.Points.prototype.average = function () {
var averageX = 0; var averageX = 0;
var averageY = 0; var averageY = 0;
var averageZ = 0; var averageZ = 0;
@ -380,7 +356,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.average = function () {
); );
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.negate = function () { GameLib.D3.Vector4.Points.prototype.negate = function () {
for (var i = 0; i < this.vectors.length; i++) { for (var i = 0; i < this.vectors.length; i++) {
this.vectors[i].x *= -1; this.vectors[i].x *= -1;
@ -392,7 +368,7 @@ GameLib.D3.Runtime.Vector4.Points.prototype.negate = function () {
}; };
GameLib.D3.Runtime.Vector4.Points.prototype.toOrigin = function () { GameLib.D3.Vector4.Points.prototype.toOrigin = function () {
var distanceFromOrigin = this.average().negate(); var distanceFromOrigin = this.average().negate();

View File

@ -1,94 +0,0 @@
if (typeof GameLib === 'undefined') {
function GameLib() {}
}
if (typeof GameLib.D3 === 'undefined') {
GameLib.D3 = function() {};
}
if (typeof require != 'undefined') {
GameLib.D3.API.Bone = require('./game-lib-bone.js');
GameLib.D3.API.BoneWeight = require('./game-lib-bone-weight');
GameLib.D3.Broadphase = require('./game-lib-broadphase');
GameLib.D3.API.Color = require('./game-lib-color');
GameLib.D3.FlyControls = require('./game-lib-fly-controls');
GameLib.D3.Engine = require('./game-lib-engine');
GameLib.D3.Game = require('./game-lib-game');
GameLib.D3.Heightmap = require('./game-lib-heightmap');
GameLib.D3.Image = require('./game-lib-image');
GameLib.D3.Light = require('./game-lib-light');
GameLib.D3.Material = require('./game-lib-material');
GameLib.D3.Matrix3 = require('./game-lib-matrix-3');
GameLib.D3.Matrix4 = require('./game-lib-matrix-4');
GameLib.D3.Mesh = require('./game-lib-mesh');
GameLib.D3.Physics = require('./game-lib-physics');
GameLib.D3.PolyVertex = require('./game-lib-poly-vertex');
GameLib.D3.RaycastVehicle = require('./game-lib-raycast-vehicle');
GameLib.D3.RigidBody = require('./game-lib-rigid-body');
GameLib.D3.RigidBodyVehicle = require('./game-lib-rigid-body-vehicle');
GameLib.D3.Scene = require('./game-lib-scene');
GameLib.D3.Shape = require('./game-lib-shape');
GameLib.D3.Skeleton = require('./game-lib-skeleton');
GameLib.D3.SkyBox = require('./game-lib-sky-box');
GameLib.D3.Solver = require('./game-lib-solver');
GameLib.D3.Texture = require('./game-lib-texture');
GameLib.D3.TriangleEdge = require('./game-lib-triangle-edge');
GameLib.D3.TriangleFace = require('./game-lib-triangle-face');
GameLib.D3.API.Vector2 = require('./game-lib-vector-2');
GameLib.D3.API.Vector3 = require('./game-lib-vector-3');
GameLib.D3.API.Vector4 = require('./game-lib-vector-4');
GameLib.D3.API.Vector4.Points = require('./game-lib-vector-4-points');
GameLib.D3.Vertex = require('./game-lib-vertex');
GameLib.D3.World = require('./game-lib-world');
}
if (typeof module != 'undefined') {
module.exports = GameLib;
}
if (typeof module != 'undefined') {
module.exports = GameLib;
}