rails-physics 1.3.2 → 1.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +22 -13
- package/package.json +3 -2
- package/ranges/segment.js +16 -1
- package/ranges/segmenttree.js +66 -17
- package/sliders/slider.js +3 -9
- package/transform.js +4 -0
package/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import {SegmentTree} from "./ranges/segmenttree.js";
|
|
4
|
+
import {mapToRail} from "./transform.js";
|
|
4
5
|
import Matter from "matter-js";
|
|
5
6
|
|
|
6
7
|
export const Rails = {
|
|
@@ -13,34 +14,42 @@ export const Rails = {
|
|
|
13
14
|
Rails.Body.createRail(this);
|
|
14
15
|
});
|
|
15
16
|
|
|
16
|
-
base.before("Body.update", function(body
|
|
17
|
+
base.before("Body.update", function(body) {
|
|
17
18
|
Rails.Body.alignRailBody(body);
|
|
18
19
|
});
|
|
20
|
+
|
|
21
|
+
base.after("Body.update", function(body) {
|
|
22
|
+
Rails.Body.prepareRailBody(body);
|
|
23
|
+
});
|
|
19
24
|
},
|
|
20
25
|
|
|
21
26
|
Body: {
|
|
22
27
|
createRail: function(body) {
|
|
23
28
|
console.log(body);
|
|
24
29
|
if(body.plugin.rails_granularity !== undefined) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
if(body.plugin.slide_axis !== undefined) {
|
|
31
|
-
slide_axis = body.plugin.slide_axis;
|
|
32
|
-
}
|
|
30
|
+
body.plugin.transverse_axis = body.plugin.transverse_axis ?? Matter.Vector.create(1, 0);
|
|
31
|
+
body.plugin.slide_axis = body.plugin.slide_axis ?? Matter.Vector.create(0, 1);
|
|
32
|
+
let transverse_axis = body.plugin.transverse_axis;
|
|
33
|
+
let slide_axis = body.plugin.slide_axis;
|
|
33
34
|
body.plugin.centre_finder = new SegmentTree(body, body.plugin.rails_granularity, transverse_axis, slide_axis);
|
|
34
|
-
body.plugin.
|
|
35
|
+
body.plugin.old_offset_multiplier = body.plugin.centre_finder.centreOfMass();
|
|
36
|
+
|
|
37
|
+
body.plugin.test_start = (1 << 16) - 1;
|
|
35
38
|
}
|
|
36
39
|
},
|
|
37
40
|
|
|
38
|
-
alignRailBody: function(body
|
|
39
|
-
console.log(body.deltaTime, time);
|
|
41
|
+
alignRailBody: function(body) {
|
|
40
42
|
if(body.plugin.centre_finder !== undefined) {
|
|
41
|
-
|
|
43
|
+
let upcoming_offset_multiplier = body.plugin.centre_finder.centreOfMass();
|
|
44
|
+
let old_offset = mapToRail(body.plugin.old_offset_multiplier, transverse_axis, slide_axis);
|
|
45
|
+
let upcoming_offset = mapToRail(upcoming_offset_multiplier, transverse_axis, slide_axis);
|
|
46
|
+
Matter.Body.setCentre(body, Matter.Vector.add(Matter.Vector.sub(body.position, old_offset, Matter.Vector.create()), upcoming_offset, Matter.Vector.create()));
|
|
47
|
+
body.plugin.old_offset_multiplier = upcoming_offset_multiplier;
|
|
48
|
+
body.plugin.centre_finder.update((1 << 16), body.plugin.test_start, 0.001);
|
|
49
|
+
body.plugin.test_start = Math.max(body.plugin.test_start - 1, 0);
|
|
42
50
|
}
|
|
43
51
|
}
|
|
52
|
+
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rails-physics",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.4",
|
|
4
4
|
"description": "A plugin for the matter-js physics library designed to efficiently simulate objects moving in a one-dimensional space whose projection onto the 2-dimensional space of the screen changes over time",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"ranges/segment.js",
|
|
27
27
|
"ranges/segmenttree.js",
|
|
28
28
|
"rails-physics.d.ts",
|
|
29
|
-
"sliders/slider.js"
|
|
29
|
+
"sliders/slider.js",
|
|
30
|
+
"transform.js"
|
|
30
31
|
],
|
|
31
32
|
"directories": {
|
|
32
33
|
"test": "tests"
|
package/ranges/segment.js
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
export function updateMass(segment, frame_number, mass_change = 0) {
|
|
2
|
+
var _a, _b, _c, _d, _e;
|
|
3
|
+
segment.waiting_left = (_a = segment.waiting_left) !== null && _a !== void 0 ? _a : 0;
|
|
4
|
+
segment.waiting_right = (_b = segment.waiting_right) !== null && _b !== void 0 ? _b : 0;
|
|
5
|
+
if (segment.frame_number != frame_number) {
|
|
6
|
+
segment.my_change = 0;
|
|
7
|
+
segment.waiting_left = 0;
|
|
8
|
+
segment.waiting_right = 0;
|
|
9
|
+
}
|
|
10
|
+
segment.my_change = ((_c = segment.my_change) !== null && _c !== void 0 ? _c : 0) + mass_change;
|
|
11
|
+
segment.frame_number = frame_number;
|
|
12
|
+
let left_size = centre(segment) - segment.left;
|
|
13
|
+
let right_size = segment.right - centre(segment);
|
|
14
|
+
segment.waiting_left = ((_d = segment.waiting_left) !== null && _d !== void 0 ? _d : 0) + (mass_change / (left_size + right_size)) * left_size;
|
|
15
|
+
segment.waiting_right = ((_e = segment.waiting_right) !== null && _e !== void 0 ? _e : 0) + (mass_change / (left_size + right_size)) * right_size;
|
|
16
|
+
}
|
|
2
17
|
export function centre(segment) {
|
|
3
18
|
return segment.left + ((segment.right - segment.left) >> 1); // + ((segment.right - segment.left) & 1);
|
|
4
19
|
}
|
package/ranges/segmenttree.js
CHANGED
|
@@ -10,52 +10,101 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _SegmentTree_raw;
|
|
13
|
-
import { centre, leftChild, rightChild, isLeaf } from "./segment.js";
|
|
13
|
+
import { centre, leftChild, rightChild, isLeaf, updateMass } from "./segment.js";
|
|
14
14
|
import Matter from "matter-js";
|
|
15
|
+
const ROOT = -1;
|
|
15
16
|
//Implement a segment tree for O(log(n)) updates and O(log(n)) location of center of mass
|
|
16
17
|
export class SegmentTree {
|
|
17
|
-
constructor(container, element_count, transverse_axis, slide_axis) {
|
|
18
|
+
constructor(container, element_count, transverse_axis, slide_axis, gravity = Matter.Vector.create(0, 0)) {
|
|
18
19
|
_SegmentTree_raw.set(this, void 0);
|
|
20
|
+
this.frame_number = 0;
|
|
21
|
+
this.air_resistance = container.frictionAir;
|
|
22
|
+
this.static_friction = container.frictionStatic;
|
|
23
|
+
this.dynamic_friction = container.friction;
|
|
24
|
+
this.gravity = gravity;
|
|
19
25
|
this.element_count = element_count;
|
|
20
26
|
this.slide_axis = slide_axis;
|
|
21
27
|
this.transverse_axis = transverse_axis;
|
|
22
28
|
element_count = Math.abs(Math.round(element_count));
|
|
23
|
-
let default_density = container.
|
|
24
|
-
__classPrivateFieldSet(this, _SegmentTree_raw, [{ mass: default_density * element_count, left: 0, right: element_count, parent:
|
|
29
|
+
let default_density = container.mass / element_count;
|
|
30
|
+
__classPrivateFieldSet(this, _SegmentTree_raw, [{ mass: default_density * element_count, left: 0, right: element_count, parent: ROOT }], "f");
|
|
25
31
|
let index = 0;
|
|
26
32
|
while (index < __classPrivateFieldGet(this, _SegmentTree_raw, "f").length) {
|
|
27
|
-
if (index < 20) {
|
|
28
|
-
console.log(index, __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left, __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right, __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].mass, default_density);
|
|
29
|
-
}
|
|
30
33
|
if (!isLeaf(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])) {
|
|
31
34
|
let middle = centre(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]);
|
|
32
35
|
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left_child = __classPrivateFieldGet(this, _SegmentTree_raw, "f").length;
|
|
33
|
-
__classPrivateFieldGet(this, _SegmentTree_raw, "f").push({ mass: default_density * (middle - __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left), left: __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left, right: middle, parent: index
|
|
36
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f").push({ mass: default_density * (middle - __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left), left: __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left, right: middle, parent: index });
|
|
34
37
|
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right_child = __classPrivateFieldGet(this, _SegmentTree_raw, "f").length;
|
|
35
|
-
__classPrivateFieldGet(this, _SegmentTree_raw, "f").push({ mass: default_density * (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right - middle), left: middle, right: __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right, parent: index
|
|
38
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f").push({ mass: default_density * (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right - middle), left: middle, right: __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right, parent: index });
|
|
36
39
|
}
|
|
37
40
|
index++;
|
|
38
41
|
}
|
|
39
42
|
}
|
|
43
|
+
resolve(index) {
|
|
44
|
+
var _a;
|
|
45
|
+
if (!isLeaf(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]) && __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].frame_number == this.frame_number) {
|
|
46
|
+
updateMass(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])], this.frame_number, __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].waiting_left);
|
|
47
|
+
updateMass(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[rightChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])], this.frame_number, __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].waiting_right);
|
|
48
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].waiting_left = 0;
|
|
49
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].waiting_right = 0;
|
|
50
|
+
}
|
|
51
|
+
let base = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].mass;
|
|
52
|
+
if (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].frame_number == this.frame_number) {
|
|
53
|
+
base += (_a = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].my_change) !== null && _a !== void 0 ? _a : 0;
|
|
54
|
+
}
|
|
55
|
+
return __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].mass;
|
|
56
|
+
}
|
|
57
|
+
propagate(index, leaf_change) {
|
|
58
|
+
var _a;
|
|
59
|
+
if (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].parent != ROOT) {
|
|
60
|
+
let parent = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].parent;
|
|
61
|
+
if ((__classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].frame_number) != __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].frame_number) {
|
|
62
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].my_change = 0;
|
|
63
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].waiting_left = 0;
|
|
64
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].waiting_right = 0;
|
|
65
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].frame_number = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].frame_number;
|
|
66
|
+
}
|
|
67
|
+
__classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].my_change = ((_a = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[parent].my_change) !== null && _a !== void 0 ? _a : 0) + leaf_change;
|
|
68
|
+
this.propagate(parent, leaf_change);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
update(start, end, amount, index = 0) {
|
|
72
|
+
if (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left == start && (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].right - 1) == end) {
|
|
73
|
+
updateMass(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index], this.frame_number, amount * (end - start));
|
|
74
|
+
this.propagate(index, amount * (end - start));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
let half = centre(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]);
|
|
78
|
+
if (start < half) {
|
|
79
|
+
this.update(start, Math.min(half, end), amount, leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]));
|
|
80
|
+
}
|
|
81
|
+
if (end > half) {
|
|
82
|
+
this.update(Math.max(half, start), end, amount, rightChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//Get centre of mass and reset effects of slider
|
|
40
87
|
centreOfMass() {
|
|
41
|
-
let target =
|
|
88
|
+
let target = this.resolve(0) / 2;
|
|
42
89
|
let index = 0;
|
|
43
90
|
while (!isLeaf(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])) {
|
|
44
|
-
console.log(
|
|
45
|
-
if (
|
|
91
|
+
console.log(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]);
|
|
92
|
+
if (this.resolve(leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])) > target) {
|
|
46
93
|
index = leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]);
|
|
47
94
|
}
|
|
48
95
|
else {
|
|
49
|
-
target -=
|
|
96
|
+
target -= this.resolve(leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]));
|
|
50
97
|
index = rightChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]);
|
|
98
|
+
this.resolve(index);
|
|
51
99
|
}
|
|
52
100
|
}
|
|
101
|
+
console.log(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]);
|
|
53
102
|
let center = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].left;
|
|
54
|
-
if (target > 0 &&
|
|
55
|
-
center += (1.0 * target) /
|
|
103
|
+
if (target > 0 && this.resolve(index) > target) {
|
|
104
|
+
center += (1.0 * target) / this.resolve(index);
|
|
56
105
|
}
|
|
57
|
-
|
|
58
|
-
return
|
|
106
|
+
this.frame_number++;
|
|
107
|
+
return center / this.element_count;
|
|
59
108
|
}
|
|
60
109
|
}
|
|
61
110
|
_SegmentTree_raw = new WeakMap();
|
package/sliders/slider.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var Slider = /** @class */ (function () {
|
|
4
|
-
function Slider(mass, length_below, length_above, air_resistance, static_friction, dynamic_friction, initial_velocity, position) {
|
|
5
|
-
if (initial_velocity === void 0) { initial_velocity = 0; }
|
|
6
|
-
if (position === void 0) { position = 0; }
|
|
1
|
+
export default class Slider {
|
|
2
|
+
constructor(mass, length_below, length_above, air_resistance, static_friction, dynamic_friction, initial_velocity = 0, position = 0) {
|
|
7
3
|
this.mass = mass;
|
|
8
4
|
this.length_below = length_below;
|
|
9
5
|
this.length_above = length_above;
|
|
@@ -14,6 +10,4 @@ var Slider = /** @class */ (function () {
|
|
|
14
10
|
this.dynamic_friction = dynamic_friction;
|
|
15
11
|
this.position = position;
|
|
16
12
|
}
|
|
17
|
-
|
|
18
|
-
}());
|
|
19
|
-
exports.default = Slider;
|
|
13
|
+
}
|
package/transform.js
ADDED