prosperon/scripts/physics.js

74 lines
1.8 KiB
JavaScript
Raw Normal View History

2024-02-25 17:31:48 -06:00
/* On collisions, entities are sent a 'hit' object, which looks like this:
var HIT = {
normal: "The normal of the collision point.",
2024-03-20 16:48:03 -05:00
obj: "The gameobject of the object that collided.",
sensor: "Boolean for if the colliding object was a sensor.",
velocity: "Velocity of the contact.",
pos: "Position in world space of the contact.",
depth: "Depth of the contact.",
};
2024-02-25 17:31:48 -06:00
*/
2024-03-19 14:39:19 -05:00
var pq = physics.pos_query;
physics.pos_query = function(pos,give) {
give ??= 25;
pq(pos,give);
}
physics.box_point_query = function(box,points) {
if (!box || !points) return [];
2024-04-01 17:58:29 -05:00
var bbox = bbox.fromcwh(box.pos,box.wh);
var inside = [];
for (var i in points)
if (bbox.pointin(bbox,points[i])) inside.push[i];
return inside;
2024-03-19 14:39:19 -05:00
}
2024-03-18 08:16:25 -05:00
Object.assign(physics, {
dynamic: 0,
kinematic: 1,
static: 2,
2023-11-29 12:40:13 -06:00
com(pos) {
2023-12-12 08:46:27 -06:00
if (!Array.isArray(pos)) return [0,0];
return pos.reduce((a,i) => a.add(i)).map(g => g/pos.length);
2023-11-29 12:40:13 -06:00
},
2024-03-18 08:16:25 -05:00
});
physics.doc = {};
physics.doc.pos_query = "Returns any object colliding with the given point.";
2024-04-01 17:58:29 -05:00
physics.doc.box_query = "Calls a given function on every shape object in the given bbox.";
physics.doc.box_point_query = "Returns the subset of points from a given list that are inside a given box.";
2024-02-25 17:31:48 -06:00
physics.collision = {
types: {},
2023-11-07 17:24:26 -06:00
num: 32,
set_collide(a, b, x) {
this.types[a][b] = x;
this.types[b][a] = x;
2023-11-07 17:24:26 -06:00
this.sync();
},
sync() {
for (var i = 0; i < this.num; i++)
2024-03-18 08:16:25 -05:00
physics.set_cat_mask(i,this.types[i]);
},
};
2024-02-25 17:31:48 -06:00
for (var i = 0; i < physics.collision.num; i++) {
physics.collision.types[i] = [];
for (var j = 0; j < physics.collision.num; j++)
physics.collision.types[i][j] = false;
};
2024-02-25 17:31:48 -06:00
physics.collision.sync();
2023-11-07 17:24:26 -06:00
2024-03-19 14:39:19 -05:00
physics.gravity = physics.make_gravity();
2024-03-09 18:22:06 -06:00
physics.gravity.mask = [true];
physics.gravity.strength = 500;
2024-03-19 14:39:19 -05:00
physics.damp = physics.make_damp();
2024-03-09 18:22:06 -06:00
physics.damp.mask = [true];
return {
physics
}