rails-physics 1.3.1 → 1.3.3

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 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 = {
@@ -16,31 +17,39 @@ export const Rails = {
16
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
- let transverse_axis = Matter.Vector.create(1, 0);
26
- let slide_axis = Matter.Vector.create(0, 1);
27
- if(body.plugin.transverse_axis !== undefined) {
28
- transverse_axis = body.plugin.transverse_axis;
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.old_centre = Matter.Vector.rotate(body.plugin.centre_finder.centreOfMass(), body.angle);
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, body.deltaTime);
41
+ alignRailBody: function(body) {
40
42
  if(body.plugin.centre_finder !== undefined) {
41
- console.log("sigma");
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.1",
3
+ "version": "1.3.3",
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
- //test change
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
  }
@@ -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.density;
24
- __classPrivateFieldSet(this, _SegmentTree_raw, [{ mass: default_density * element_count, left: 0, right: element_count, parent: -1, waiting_changes: 0 }], "f");
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, waiting_changes: 0 });
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, waiting_changes: 0 });
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 = __classPrivateFieldGet(this, _SegmentTree_raw, "f")[0].mass / 2;
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(target, index, leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index]), __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].mass);
45
- if (__classPrivateFieldGet(this, _SegmentTree_raw, "f")[leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])].mass > target) {
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 -= __classPrivateFieldGet(this, _SegmentTree_raw, "f")[leftChild(__classPrivateFieldGet(this, _SegmentTree_raw, "f")[index])].mass;
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 && __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].mass > target) {
55
- center += (1.0 * target) / __classPrivateFieldGet(this, _SegmentTree_raw, "f")[index].mass;
103
+ if (target > 0 && this.resolve(index) > target) {
104
+ center += (1.0 * target) / this.resolve(index);
56
105
  }
57
- let result = Matter.Vector.mult(this.slide_axis, center / this.element_count);
58
- return Matter.Vector.add(result, this.transverse_axis);
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
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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
- return Slider;
18
- }());
19
- exports.default = Slider;
13
+ }
package/transform.js ADDED
@@ -0,0 +1,4 @@
1
+ import Matter from "matter-js";
2
+ export function mapToRail(scale, transverse_axis, slide_axis) {
3
+ return Matter.Vector.add(Matter.Vector.mult(slide_axis, scale), transverse_axis, Matter.Vector.create());
4
+ }