vimp-engine 0.33.0 → 0.33.2

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/core/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "vimp-engine-core"
3
- version = "0.15.0"
3
+ version = "0.19.0"
4
4
  edition = "2024"
5
5
  description = "VIMP — движковый каркас симуляции (физика, карта, снапшот-фрейминг, интерполяция/предикт/raycast-примитивы, нав-утилиты). Без wasm-bindgen — обёртки для WASM-ABI собирает game-crate."
6
6
  license = "MIT"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vimp-engine",
3
- "version": "0.33.0",
3
+ "version": "0.33.2",
4
4
  "description": "VIMP — движок-приложение (мастер, P2P-транспорт, Worker-хост, мета, MVC-каркас клиента)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,6 +36,12 @@ export default class CanvasManagerView {
36
36
  // уже несёт и смещение, и масштаб последнего updateCoords, а
37
37
  // getBoundingClientRect закрывает случай, когда CSS растянул полотно
38
38
  // не один к одному с его буфером.
39
+ //
40
+ // Единицы — `renderer.screen`, а не пиксели буфера полотна: трансформ
41
+ // сцены живёт именно в них, а `canvas.width` умножен на `resolution`
42
+ // рендерера. Сегодня она равна единице, и числа совпадают, но стоит
43
+ // включить resolution/autoDensity — и указатель промахнётся ровно во
44
+ // столько же раз (та же причина, что у updateCoords ниже)
39
45
  toWorld(id, clientX, clientY) {
40
46
  const app = this._apps[id];
41
47
 
@@ -49,8 +55,9 @@ export default class CanvasManagerView {
49
55
  return null;
50
56
  }
51
57
 
52
- const px = ((clientX - rect.left) * app.canvas.width) / rect.width;
53
- const py = ((clientY - rect.top) * app.canvas.height) / rect.height;
58
+ const screen = app.renderer.screen;
59
+ const px = ((clientX - rect.left) * screen.width) / rect.width;
60
+ const py = ((clientY - rect.top) * screen.height) / rect.height;
54
61
  const { position, scale } = app.stage;
55
62
 
56
63
  if (!scale.x || !scale.y) {
@@ -63,15 +70,30 @@ export default class CanvasManagerView {
63
70
  };
64
71
  }
65
72
 
66
- // вычисляет координаты для отображения и обновляет полотно
73
+ // Вычисляет координаты для отображения и двигает сцену.
74
+ //
75
+ // Размер берётся у `renderer.screen`, а не у `canvas`: сцену двигают в
76
+ // ЕЁ единицах, а буфер полотна умножен на `resolution` рендерера.
77
+ // Совпадают они только пока resolution равен единице, и промах здесь
78
+ // тихий — он не ломает картинку, а уводит центр камеры, который по
79
+ // трансформу сцены восстанавливают части игры (проекция высоты 2.5D в
80
+ // `vimp-tanks`).
81
+ //
82
+ // Отрисовки здесь НЕТ. Полотно рисует тикер — `TickerPlugin` держит
83
+ // `app.render` на `Ticker.shared` с приоритетом LOW, то есть после
84
+ // `renderTick` движка, когда кадр применён целиком. Собственный
85
+ // `app.render()` означал бы отрисовку на КАЖДЫЙ кадр камеры (за тик их
86
+ // два и больше: сперва камера дискретного кадра, следом предсказанная),
87
+ // то есть два-три полных обхода сцены на один видимый кадр — и, что
88
+ // хуже, промежуточные состояния кадра, на которых части считают своё
89
+ // `onRender`.
67
90
  updateCoords({ id, coords, scale }) {
68
91
  const app = this._apps[id];
69
- const { width, height } = app.canvas;
92
+ const { width, height } = app.renderer.screen;
70
93
  const x = width / 2 - coords.x * scale;
71
94
  const y = height / 2 - coords.y * scale;
72
95
 
73
96
  app.stage.position.set(x, y);
74
97
  app.stage.scale.set(scale);
75
- app.render();
76
98
  }
77
99
  }
@@ -642,8 +642,12 @@ function applyMapData(data, { notifyHost = true } = {}) {
642
642
  const staticData = {};
643
643
  let staticIndex = 0;
644
644
 
645
- // мировых единиц на уровень: партам нужен для параллакса слоёв и
646
- // экструзии объёмов. 0/undefined движок подставил размер тайла
645
+ // мировых единиц на уровень величина ФИЗИКИ: по ней ядро считает
646
+ // уклон рампы и падение. Вертикальный масштаб КАРТИНКИ задаёт игра
647
+ // (у танков — `parallax.shear`) и намеренно не зависит от карты, иначе
648
+ // слои разных карт разъезжались бы по виду. Поле едет в парт как есть —
649
+ // партам, которые мерят высоту в мировых единицах.
650
+ // 0/undefined — движок подставил размер тайла
647
651
  const levelHeight = (Number(data.levelHeight) || step) * scale;
648
652
 
649
653
  const pushLayers = (levelLayers, levelMap, level, solid, floor, volumes) => {