summaryrefslogtreecommitdiff
path: root/_shared/math
diff options
context:
space:
mode:
Diffstat (limited to '_shared/math')
-rw-r--r--_shared/math/circle.js112
-rw-r--r--_shared/math/collision.js26
-rw-r--r--_shared/math/line2.js63
-rw-r--r--_shared/math/mat4.js63
-rw-r--r--_shared/math/point2.js16
-rw-r--r--_shared/math/rectangle.js32
-rw-r--r--_shared/math/rigidbody2.js57
-rw-r--r--_shared/math/vec2.js64
8 files changed, 0 insertions, 433 deletions
diff --git a/_shared/math/circle.js b/_shared/math/circle.js
deleted file mode 100644
index ba33021..0000000
--- a/_shared/math/circle.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/// <reference path="mat4.js" />
-/// <reference path="vec2.js" />
-
-const BYTES_PER_FLOAT = 4;
-
-/**
- * Initializes a new circle object for the WebGL context.
- *
- * @param {WebGLRenderingContext} pGl
- * @param {number} pRadius
- * @param {number} pSegments
- * @param {Array<Vector4>} pColorList
- * @param {vec2} pInitialPosition
- * @param {number} pMass
- */
-function circle(pGl, pRadius, pSegments, pColorList, pInitialPosition, pMass) {
- const lBuffer = pGl.createBuffer();
-
- pGl.bindBuffer(pGl.ARRAY_BUFFER, lBuffer);
-
- var lBufferedData = [];
- vertexCount = 0;
-
- const lAngleIncrements = (360.0 / pSegments) * (Math.PI / 180.0);
- for (let lSegIdx = 0; lSegIdx < pSegments; lSegIdx++) {
- const lAngle = lAngleIncrements * lSegIdx,
- lNextAngle = lAngleIncrements * (lSegIdx + 1),
- lColorIndex = Math.floor(pColorList.length * (lSegIdx / pSegments)),
- lColor = pColorList[lColorIndex]; // TODO: Calculate which one to use
-
- lBufferedData = lBufferedData.concat([
- 0, 0, lColor.x, lColor.y, lColor.z, lColor.w,
- pRadius * Math.sin(lAngle), pRadius * Math.cos(lAngle), lColor.x, lColor.y, lColor.z, lColor.w,
- pRadius * Math.sin(lNextAngle), pRadius * Math.cos(lNextAngle), lColor.x, lColor.y, lColor.z, lColor.w
- ]);
-
- vertexCount += 3;
- }
-
- pGl.bufferData(pGl.ARRAY_BUFFER, new Float32Array(lBufferedData), pGl.STATIC_DRAW)
- pGl.bindBuffer(pGl.ARRAY_BUFFER, undefined);
-
- return {
- buffer: lBuffer,
- vertexCount: vertexCount,
- prevPos: vec2(),
- position: pInitialPosition || vec2(),
- prevVelocity: vec2(),
- velocity: vec2(),
- force: vec2(),
- torque: 0,
- mass: pMass === undefined ? 1 : pMass,
- rotationVelocity: 0,
- rotationRadians: 0,
- model: translateMatrix(mat4(), pInitialPosition ? pInitialPosition.x : 0, pInitialPosition ? pInitialPosition.y : 0, 0),
- radius: pRadius
- };
-}
-
-function renderCircle(pGl, pProgramInfo, pCircle) {
- pGl.uniformMatrix4fv(pProgramInfo.uniformLocations.model, false, pCircle.model);
- pGl.bindBuffer(pGl.ARRAY_BUFFER, pCircle.buffer);
- {
- pGl.enableVertexAttribArray(pProgramInfo.attributeLocations.position);
- pGl.vertexAttribPointer(pProgramInfo.attributeLocations.position, 2, pGl.FLOAT, false, BYTES_PER_FLOAT * 6, 0);
-
- pGl.enableVertexAttribArray(pProgramInfo.attributeLocations.color);
- pGl.vertexAttribPointer(pProgramInfo.attributeLocations.color, 4, pGl.FLOAT, false, BYTES_PER_FLOAT * 6, BYTES_PER_FLOAT * 2);
- }
-
- pGl.drawArrays(pGl.TRIANGLE_STRIP, 0, pCircle.vertexCount);
-}
-
-function getCircleMomentOfInertia(pCircle) {
- return (Math.PI * Math.pow(pCircle.radius, 4)) / 4;
-}
-
-function doCirclesIntersect(pFirst, pSecond) {
- const lDistanceBetween = Math.pow(pFirst.position.x - pSecond.position.x, 2)
- + Math.pow(pFirst.position.y - pSecond.position.y, 2)
- return lDistanceBetween <= Math.pow(pFirst.radius + pSecond.radius, 2);
-}
-
-/**
- * Returns intersection information about the intersecting circles.
- *
- * Warning! Only use this if doCirclesIntersect returned true for these circles.
- *
- * @param {circle} pFirst
- * @param {circle} pSecond
- */
-function getIntersectionDataForCircles(pFirst, pSecond) {
- // The collision normal is simply the difference between the two current positions
- const lCollisionNormal = normalize2(subVec2(pFirst.position, pSecond.position));
- const lCollisionPoint = vec2(
- ((pFirst.position.x * pSecond.radius) + (pSecond.position.x * pFirst.radius)) / (pFirst.radius + pSecond.radius),
- ((pFirst.position.y * pSecond.radius) + (pSecond.position.y * pFirst.radius)) / (pFirst.radius + pSecond.radius)
- );
-
- return {
- relativeVelocity: subVec2(pFirst.velocity, pSecond.velocity),
- collisionNormal: lCollisionNormal,
- //firstPointOfApplication: addVec2(scaleVec2(normalize2(pFirst.velocity), pFirst.radius), pFirst.position),
- //secondPointOfApplication: addVec2(scaleVec2(normalize2(pSecond.velocity), pSecond.radius), pSecond.position)
- firstPointOfApplication: subVec2(lCollisionPoint, pFirst.position),
- secondPointOfApplication: subVec2(lCollisionPoint, pSecond.position)
- }
-}
-
-function freeCircle(pGl, pCircle) {
- pGl.deleteBuffer(pCircle.buffer);
-} \ No newline at end of file
diff --git a/_shared/math/collision.js b/_shared/math/collision.js
deleted file mode 100644
index 8e4be7d..0000000
--- a/_shared/math/collision.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/// <reference path="vec2.js" />
-/// <reference path="line2.js" />
-/// <reference path="circle.js" />
-/// <reference path="mat4.js" />
-/// <reference path="point2.js" />
-
-/**
- *
- * @param {circle} pCircle
- * @param {line2} pLine
- */
-function lineCircleCollision2(pCircle, pLine) {
- return distanceFromPoint2ToLine2(pCircle.position, pLine) <= pCircle.radius;
-}
-
-function getLineCircleCollison2Data(pCircle, pLine) {
- const lCollisionNormal = pLine.normal,
- lCollisionPoint = addVec2(pCircle.position, scaleVec2(negate2(lCollisionNormal), pCircle.radius));
-
- return {
- relativeVelocity: subVec2(pCircle.velocity, pLine.velocity),
- collisionNormal: lCollisionNormal,
- firstPointOfApplication: subVec2(lCollisionPoint, pCircle.position),
- secondPointOfApplication: subVec2(lCollisionPoint, pLine.start)
- }
-} \ No newline at end of file
diff --git a/_shared/math/line2.js b/_shared/math/line2.js
deleted file mode 100644
index 8b30c1c..0000000
--- a/_shared/math/line2.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/// <reference path="vec2.js" />
-/// <reference path="mat4.js" />
-
-/**
- * Creates a new line object
- * @param {vec2} pStart
- * @param {vec2} pEnd
- * @param {WebGLRenderingContext} pGl
- */
-function line2(pStart, pEnd, pGl, pColor, pMass) {
- const lDiffVector = subVec2(pEnd, pStart);
-
- const lBuffer = pGl.createBuffer();
- pGl.bindBuffer(pGl.ARRAY_BUFFER, lBuffer);
-
- var lBufferedData = [
- pStart.x, pStart.y, pColor.x, pColor.y, pColor.z, pColor.w,
- pEnd.x, pEnd.y, pColor.x, pColor.y, pColor.z, pColor.w
- ];
-
- pGl.bufferData(pGl.ARRAY_BUFFER, new Float32Array(lBufferedData), pGl.STATIC_DRAW)
- pGl.bindBuffer(pGl.ARRAY_BUFFER, undefined);
-
- var lSlope = (pEnd.y - pStart.y) / (pEnd.x - pStart.x);
-
- return {
- buffer: lBuffer,
- start: pStart,
- end: pEnd,
- slope: lSlope,
- normal: normalize2(getPerp2(lDiffVector)),
- length: length2(lDiffVector),
- mass: pMass,
- direction: normalize2(lDiffVector),
- velocity: vec2(0, 0),
- position: vec2()
- };
-}
-
-function getLine2MomentOfInertia(pLine) {
- return (1.0 / 12.0) * pLine.mass * Math.pow(pLine.length, 2);
-}
-
-function getLine2MidPoint(pLine) {
- return {
- x: (pLine.end.x + pLine.start.x) / 2.0,
- y: (pLine.end.y + pLine.start.y) / 2.0
- }
-}
-
-function renderLine2(pGl, pProgramInfo, pLine) {
- pGl.uniformMatrix4fv(pProgramInfo.uniformLocations.model, false, mat4()); // Model on a line is always default matrix
- pGl.bindBuffer(pGl.ARRAY_BUFFER, pLine.buffer);
- {
- pGl.enableVertexAttribArray(pProgramInfo.attributeLocations.position);
- pGl.vertexAttribPointer(pProgramInfo.attributeLocations.position, 2, pGl.FLOAT, false, BYTES_PER_FLOAT * 6, 0);
-
- pGl.enableVertexAttribArray(pProgramInfo.attributeLocations.color);
- pGl.vertexAttribPointer(pProgramInfo.attributeLocations.color, 4, pGl.FLOAT, false, BYTES_PER_FLOAT * 6, BYTES_PER_FLOAT * 2);
- }
-
- pGl.drawArrays(pGl.LINES, 0, 2);
-} \ No newline at end of file
diff --git a/_shared/math/mat4.js b/_shared/math/mat4.js
deleted file mode 100644
index d31a20e..0000000
--- a/_shared/math/mat4.js
+++ /dev/null
@@ -1,63 +0,0 @@
-function mat4() {
- return [
- 1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1
- ]
-}
-
-function orthographic(pLeft, pRight, pBottom, pTop) {
- const lResult = mat4();
- lResult[0] = 2.0 / (pRight - pLeft);
- lResult[5] = 2.0 / (pTop - pBottom);
- lResult[10] = 1.0;
- lResult[12] = -(pRight + pLeft) / (pRight - pLeft);
- lResult[13] = -(pTop + pBottom) / (pTop - pBottom);
- return lResult;
-}
-
-function translateMatrix(m, x, y, z) {
- m = [...m];
- m[12] += x;
- m[13] += y;
- m[14] += z;
- return m;
-}
-
-function rotateMatrix2d(m, angle) {
- m = [...m];
- m[0] = Math.cos(angle);
- m[1] = -Math.sin(angle);
- m[4] = Math.sin(angle);
- m[5] = Math.cos(angle);
- return m;
-}
-
-function scaleMatrix(m, x, y, z) {
- m = [...m];
- m[0] = m[0] * x;
- m[5] = m[5] * y;
- m[10] = m[10] * z;
- return m;
-}
-
-function multMat4ByVec2(matrix, vec) {
- var lInnerVec = {...vec};
- lInnerVec.z = 0.0;
- lInnerVec.w = 1.0;
-
- return {
- x: lInnerVec.x * matrix[0] + lInnerVec.y * matrix[4] + lInnerVec.z * matrix[8] + lInnerVec.w * matrix[12],
- y: lInnerVec.x * matrix[1] + lInnerVec.y * matrix[5] + lInnerVec.z * matrix[9] + lInnerVec.w * matrix[13]
- };
-}
-
-function multMat4ByVec4(matrix, vec) {
- return {
- x: vec.x * matrix[0] + vec.y * matrix[4] + vec.z * matrix[8] + vec.w * matrix[12],
- y: vec.x * matrix[1] + vec.y * matrix[5] + vec.z * matrix[9] + vec.w * matrix[13],
- z: vec.x * matrix[2] + vec.y * matrix[6] + vec.z * matrix[10] + vec.w * matrix[14],
- w: vec.x * matrix[3] + vec.y * matrix[7] + vec.z * matrix[11] + vec.w * matrix[15]
- };
-} \ No newline at end of file
diff --git a/_shared/math/point2.js b/_shared/math/point2.js
deleted file mode 100644
index eeacd91..0000000
--- a/_shared/math/point2.js
+++ /dev/null
@@ -1,16 +0,0 @@
-function point2(x = 0, y = 0) {
- return { x: x, y: y };
-}
-
-function distanceFromPoint2ToLine2(pPoint, pLine) {
- // Check out this wikapedia article for more information:
- // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line
- var x0 = pPoint.x,
- y0 = pPoint.y,
- x1 = pLine.start.x,
- y1 = pLine.start.y,
- x2 = pLine.end.x,
- y2 = pLine.end.y;
-
- return Math.abs((x2 - x1) * (y1 - y0) - (x1 - x0) * (y2 - y1)) / Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
-} \ No newline at end of file
diff --git a/_shared/math/rectangle.js b/_shared/math/rectangle.js
deleted file mode 100644
index 012c460..0000000
--- a/_shared/math/rectangle.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/// <reference path="rigidbody2.js" />
-
-function rectangle(pGl, pData) {
- var lBuffer = pGl.createBuffer(),
- lColor = pData.color || { x: 1, y: 0, z: 0, w: 1 };
-
- pGl.bindBuffer(pGl.ARRAY_BUFFER, lBuffer);
-
- var lBufferedData = [
- -pData.width / 2.0, -pData.height / 2.0, lColor.x, lColor.y, lColor.z, lColor.w,
- -pData.width / 2.0, pData.height / 2.0, lColor.x, lColor.y, lColor.z, lColor.w,
- pData.width / 2.0, pData.height / 2.0, lColor.x, lColor.y, lColor.z, lColor.w,
- pData.width / 2.0, pData.height /2.0, lColor.x, lColor.y, lColor.z, lColor.w,
- pData.width / 2.0, -pData.height / 2.0, lColor.x, lColor.y, lColor.z, lColor.w,
- -pData.width / 2.0, -pData.height / 2.0, lColor.x, lColor.y, lColor.z, lColor.w
- ];
-
- pGl.bufferData(pGl.ARRAY_BUFFER, new Float32Array(lBufferedData), pGl.STATIC_DRAW)
- pGl.bindBuffer(pGl.ARRAY_BUFFER, undefined);
-
- pData.getMomentOfInertia = function() {
- return (1.0 / 12.0) * pData.mass * (pData.height * pData.height + pData.width * pData.width);
- };
-
- return makeRigidBody2({
- vertexCount: 6,
- buffer: lBuffer,
- width: pData.width,
- height: pData.height,
- model: translateMatrix(mat4(), pData.position ? pData.position.x : 0, pData.position ? pData.position.y : 0, 0),
- }, pData);
-} \ No newline at end of file
diff --git a/_shared/math/rigidbody2.js b/_shared/math/rigidbody2.js
deleted file mode 100644
index 0b18d0c..0000000
--- a/_shared/math/rigidbody2.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/// <reference path="vec2.js" />
-/// <reference path="mat4.js" />
-/// <reference path="circle.js" />
-/// <reference path="line2.js" />
-/// <reference path="collision.js" />
-
-const GRAVITY = 9.8;
-const BYTES_PER_FLOAT = 4;
-
-/**
- *
- * @param {Shape} pObject a 2D shape like a circle, rectangle, or line
- * @param {Object} pData initial data for the rigidboy
- */
-function makeRigidBody2(pObject, pData) {
- pObject.velocity = vec2();
- pObject.prevVelocity = pObject.velocity;
- pObject.position = pData.position || vec2();
- pObject.prevPosition = pObject.position;
- pObject.force = vec2();
- pObject.rotationVelocity = 0;
- pObject.rotationRadians = 0;
- pObject.torque = 0;
- pObject.mass = pData.mass !== undefined ? pData.mass : 1.0;
- pObject.getMomentOfInertia = pData.getMomentOfInertia;
-
- return pObject;
-}
-
-function updateRigidBody2(pRigidbody, pDeltaTimeSeconds) {
- applyForceRigidbody2(pRigidbody, vec2(0, -1.0 * (pRigidbody.mass * GRAVITY)));
- const lCurrentAcceleration = scaleVec2(pRigidbody.force, 1.0 / pRigidbody.mass);
- pRigidbody.prevVelocity = pRigidbody.velocity;
- pRigidbody.velocity = addVec2(pRigidbody.velocity, scaleVec2(lCurrentAcceleration, pDeltaTimeSeconds));
- pRigidbody.prevPos = { ...pRigidbody.position };
- pRigidbody.position = addVec2(pRigidbody.position, scaleVec2(pRigidbody.velocity, pDeltaTimeSeconds));
- pRigidbody.force = vec2();
-
- const lMomentOfInertia = pRigidbody.getMomentOfInertia(pRigidbody);
- const lAngularAcceleration = pRigidbody.torque / lMomentOfInertia;
- pRigidbody.rotationVelocity += lAngularAcceleration * pDeltaTimeSeconds;
- pRigidbody.rotationRadians += pRigidbody.rotationVelocity * pDeltaTimeSeconds;
- pRigidbody.torque = 0;
-
- pRigidbody.model = rotateMatrix2d(translateMatrix(mat4(), pRigidbody.position.x, pRigidbody.position.y, 0), pRigidbody.rotationRadians);
-}
-
-function applyForceRigidbody2(pRigidbody, pForceVector, pPointOfApplication) {
- if (pPointOfApplication !== undefined) {
- const lOriginToPointOfApp = subVec2(vec2(), pPointOfApplication),
- lPerpVec = vec2(-lOriginToPointOfApp.y, lOriginToPointOfApp.x);
-
- pRigidbody.torque += TORQUE_MULTIPLIER * dot2(lPerpVec, pForceVector);
- }
-
- pRigidbody.force = addVec2(pRigidbody.force, pForceVector);
-}
diff --git a/_shared/math/vec2.js b/_shared/math/vec2.js
deleted file mode 100644
index 11e71cd..0000000
--- a/_shared/math/vec2.js
+++ /dev/null
@@ -1,64 +0,0 @@
-function vec2(x = 0, y = 0) {
- return { x: x, y: y};
-}
-
-function addVec2(v1, v2) {
- return {
- x: v1.x + v2.x,
- y: v1.y + v2.y
- };
-}
-
-function subVec2(v1, v2) {
- return {
- x: v1.x - v2.x,
- y: v1.y - v2.y
- };
-}
-
-function scaleVec2(v, s) {
- return {
- x: v.x * s,
- y: v.y * s
- };
-}
-
-function dot2(v1, v2) {
- return v1.x * v2.x + v1.y * v2.y;
-}
-
-function length2(v) {
- return Math.sqrt(v.x * v.x + v.y * v.y);
-}
-
-function normalize2(v) {
- const lLength = length2(v);
- const lInverseLength = lLength === 0 ? 1.0 : 1.0 / length2(v);
- return { x: v.x * lInverseLength, y: v.y * lInverseLength };
-}
-
-function vec2str(v) {
- return `(${v.x.toFixed(2)}, ${v.y.toFixed(2)})`;
-}
-
-function getPerp2(v) {
- return {
- x: -v.y,
- y: v.x
- };
-}
-
-function negate2(v) {
- return {
- x: -v.x,
- y: -v.y
- };
-}
-
-// Algorithm plucked from: https://matthew-brett.github.io/teaching/rotation_2d.html
-function rotateAboutOrigin2(v, angle) {
- return {
- x: v.x * Math.cos(angle) - v.y * Math.sin(angle),
- y: v.x * Math.sin(angle) + v.y * Math.cos(angle),
- };
-} \ No newline at end of file