summaryrefslogtreecommitdiff
path: root/frontend/_rigidbody/circle.js
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/_rigidbody/circle.js')
-rw-r--r--frontend/_rigidbody/circle.js53
1 files changed, 51 insertions, 2 deletions
diff --git a/frontend/_rigidbody/circle.js b/frontend/_rigidbody/circle.js
index 194a772..35044e3 100644
--- a/frontend/_rigidbody/circle.js
+++ b/frontend/_rigidbody/circle.js
@@ -1,6 +1,16 @@
const BYTES_PER_FLOAT = 4;
-function circle(pGl, pRadius, pSegments, pColorList, pInitialPosition) {
+/**
+ * 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);
@@ -30,11 +40,12 @@ function circle(pGl, pRadius, pSegments, pColorList, pInitialPosition) {
return {
buffer: lBuffer,
vertexCount: vertexCount,
+ prevPos: vec2(),
position: pInitialPosition || vec2(),
velocity: vec2(),
force: vec2(),
torque: 0,
- mass: 1,
+ mass: pMass || 1,
rotationVelocity: 0,
rotationRadians: 0,
model: mat4(),
@@ -43,6 +54,7 @@ function circle(pGl, pRadius, pSegments, pColorList, pInitialPosition) {
}
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);
@@ -57,4 +69,41 @@ function renderCircle(pGl, pProgramInfo, pCircle) {
function getMomentOfInertia(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));
+
+ // TODO: Might be useful in the future?
+ 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)
+ );
+
+ const lSecondDeepestPointInFirst = (subVec2(pSecond.position, scaleVec2(lCollisionNormal, pSecond.radius)));
+ const lFirstDeepestPointInSecond = (addVec2(pFirst.position, scaleVec2(lCollisionNormal, pFirst.radius)));
+ const lLengthOfOverlapByTwo = length2(subVec2(lFirstDeepestPointInSecond, lSecondDeepestPointInFirst)) / 2.0;
+ const lMedianIntersectingPoint = addVec2(lSecondDeepestPointInFirst, scaleVec2(lCollisionNormal, lLengthOfOverlapByTwo));
+
+ return {
+ relativeVelocity: subVec2(pFirst.velocity, pSecond.velocity),
+ collisionNormal: lCollisionNormal,
+ firstPointOfApplication: subVec2(lMedianIntersectingPoint, pFirst.position),
+ secondPointOfApplication: subVec2(lMedianIntersectingPoint, pSecond.position)
+ }
} \ No newline at end of file