@remix-gg/three 0.1.1 → 0.1.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/dist/camera.d.ts CHANGED
@@ -27,6 +27,15 @@ export type PortraitRigOptions = {
27
27
  * so the design box's height is exactly what `fov` covers at the design aspect.
28
28
  */
29
29
  export declare function portraitRig(options?: PortraitRigOptions): CameraRig;
30
+ export type LandscapeRigOptions = PortraitRigOptions;
31
+ /**
32
+ * `portraitRig`'s landscape complement, for desktop-target games on the
33
+ * 1280x720 `LANDSCAPE_DESIGN` box: same frustum math, but a lower, farther
34
+ * camera with a narrower vertical FOV, so a short-and-wide frame composes
35
+ * horizontally instead of stacking depth into a tall column. Not the default —
36
+ * `createGame` still assumes portrait; pass it explicitly as `camera`.
37
+ */
38
+ export declare function landscapeRig(options?: LandscapeRigOptions): CameraRig;
30
39
  export type OrthoRigOptions = {
31
40
  /** World units visible vertically across the design box. */
32
41
  frustumHeight?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAa,kBAAkB,EAAE,iBAAiB,EAAU,OAAO,EAAE,MAAM,OAAO,CAAA;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAA;AAE/D;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,SAAS,CAwBvE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,SAAS,CA2BjE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAuCzF;AAED,qEAAqE;AACrE,KAAK,YAAY,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC7B,IAAI,CA0BN"}
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAa,kBAAkB,EAAE,iBAAiB,EAAU,OAAO,EAAE,MAAM,OAAO,CAAA;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAA;AAE/D;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAoCD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,SAAS,CAMvE;AAED,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAEpD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAMzE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,SAAS,CA2BjE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAuCzF;AAED,qEAAqE;AACrE,KAAK,YAAY,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC7B,IAAI,CA0BN"}
package/dist/camera.js CHANGED
@@ -1,12 +1,13 @@
1
1
  import { MathUtils, OrthographicCamera, PerspectiveCamera, Sphere, Vector3 } from 'three';
2
2
  /**
3
- * The default: a perspective camera looking slightly down at the origin, framed
4
- * so the design box's height is exactly what `fov` covers at the design aspect.
3
+ * Shared machinery of the fixed perspective rigs: frame the design box's height
4
+ * with exactly `fov` at the design aspect, then let `resize` absorb any other
5
+ * aspect. Orientation lives entirely in the defaults the public rigs pick.
5
6
  */
6
- export function portraitRig(options = {}) {
7
- const fov = options.fov ?? 50;
8
- const position = options.position ?? new Vector3(0, 6, 14);
9
- const target = options.lookAt ?? new Vector3(0, 1.5, 0);
7
+ function perspectiveRig(options, defaults) {
8
+ const fov = options.fov ?? defaults.fov;
9
+ const position = options.position ?? defaults.position;
10
+ const target = options.lookAt ?? defaults.lookAt;
10
11
  const camera = new PerspectiveCamera(fov, 1, options.near ?? 0.1, options.far ?? 300);
11
12
  camera.position.copy(position);
12
13
  camera.lookAt(target);
@@ -25,6 +26,31 @@ export function portraitRig(options = {}) {
25
26
  update() { },
26
27
  };
27
28
  }
29
+ /**
30
+ * The default: a perspective camera looking slightly down at the origin, framed
31
+ * so the design box's height is exactly what `fov` covers at the design aspect.
32
+ */
33
+ export function portraitRig(options = {}) {
34
+ return perspectiveRig(options, {
35
+ fov: 50,
36
+ position: new Vector3(0, 6, 14),
37
+ lookAt: new Vector3(0, 1.5, 0),
38
+ });
39
+ }
40
+ /**
41
+ * `portraitRig`'s landscape complement, for desktop-target games on the
42
+ * 1280x720 `LANDSCAPE_DESIGN` box: same frustum math, but a lower, farther
43
+ * camera with a narrower vertical FOV, so a short-and-wide frame composes
44
+ * horizontally instead of stacking depth into a tall column. Not the default —
45
+ * `createGame` still assumes portrait; pass it explicitly as `camera`.
46
+ */
47
+ export function landscapeRig(options = {}) {
48
+ return perspectiveRig(options, {
49
+ fov: 40,
50
+ position: new Vector3(0, 5, 18),
51
+ lookAt: new Vector3(0, 1, 0),
52
+ });
53
+ }
28
54
  /** Orthographic rig. Isometric is this rig with `heading: Math.PI / 4`. */
29
55
  export function orthoRig(options = {}) {
30
56
  const frustumHeight = options.frustumHeight ?? 14;
package/dist/index.d.ts CHANGED
@@ -10,8 +10,8 @@
10
10
  */
11
11
  export { createGame, type RemixGame, type RemixGameOptions } from './game.js';
12
12
  export { stepClock, MAX_FRAME_DELTA, type StepResult } from './loop.js';
13
- export { createViewport, fitFrustum, safeRectOf, DEFAULT_DESIGN, type DesignBox, type FitMode, type FrustumFit, type Rect, type Viewport, } from './viewport.js';
14
- export { fitBounds, followRig, orthoRig, portraitRig, type CameraRig, type FollowRigOptions, type GameCamera, type OrthoRigOptions, type PortraitRigOptions, } from './camera.js';
13
+ export { createViewport, fitFrustum, safeRectOf, DEFAULT_DESIGN, LANDSCAPE_DESIGN, type DesignBox, type FitMode, type FrustumFit, type Rect, type Viewport, } from './viewport.js';
14
+ export { fitBounds, followRig, landscapeRig, orthoRig, portraitRig, type CameraRig, type FollowRigOptions, type GameCamera, type LandscapeRigOptions, type OrthoRigOptions, type PortraitRigOptions, } from './camera.js';
15
15
  export { createGestureState, reduceGestures, DEFAULT_THRESHOLDS, type GestureEvent, type GestureEventMap, type GestureState, type GestureThresholds, type PointerSample, } from './input/gestures.js';
16
16
  export type { DragEvent, Input, PinchEvent, Pointer, SwipeDirection, SwipeEvent, TapEvent, } from './input/index.js';
17
17
  export { createAssets, type AssetManifest, type Assets } from './assets.js';
@@ -26,5 +26,5 @@ export { applyLighting, blobShadow, type BlobShadow, type Lighting, type Lightin
26
26
  export { createHud, type Hud, type HudAnchor, type HudBanner, type HudChip, type HudScore, } from './hud/index.js';
27
27
  export { HUD_CSS } from './hud/styles.js';
28
28
  export { awaitSdk, createPlatform, type Platform } from './platform/index.js';
29
- export type { FarcadeSDKGlobal, GameInfo, GameState, HapticFeedbackType, InventoryItem, Player, SafeAreaInset, ShopItem, ViewContext, } from './platform/sdk-contract.js';
29
+ export type { FarcadeSDKGlobal, GameInfo, GamePresentation, GameState, HapticFeedbackType, InventoryItem, Player, PresentationInput, PresentationOrientation, PresentationTarget, SafeAreaInset, ShopItem, ViewContext, } from './platform/sdk-contract.js';
30
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,8 +10,8 @@
10
10
  */
11
11
  export { createGame } from './game.js';
12
12
  export { stepClock, MAX_FRAME_DELTA } from './loop.js';
13
- export { createViewport, fitFrustum, safeRectOf, DEFAULT_DESIGN, } from './viewport.js';
14
- export { fitBounds, followRig, orthoRig, portraitRig, } from './camera.js';
13
+ export { createViewport, fitFrustum, safeRectOf, DEFAULT_DESIGN, LANDSCAPE_DESIGN, } from './viewport.js';
14
+ export { fitBounds, followRig, landscapeRig, orthoRig, portraitRig, } from './camera.js';
15
15
  export { createGestureState, reduceGestures, DEFAULT_THRESHOLDS, } from './input/gestures.js';
16
16
  export { createAssets } from './assets.js';
17
17
  export { createEscalatingChance, createPityTimer, createShuffleBag, seededRandom, } from './random.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAsB,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EAGb,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAC1C,YAAY,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,GACT,MAAM,eAAe,CAAA;AAEtB;;;;;;GAMG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACjG,oFAAoF;IACpF,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,YAAY,EAAE,CAAA;IACpE,8EAA8E;IAC9E,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAA;IAChF,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACxC,CAAA;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,QAAQ,EACf,OAAO,GAAE,YAAiB,GACzB,KAAK,CAyHP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAsB,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EAGb,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAC1C,YAAY,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,GACT,MAAM,eAAe,CAAA;AAEtB;;;;;;GAMG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACjG,oFAAoF;IACpF,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,YAAY,EAAE,CAAA;IACpE,8EAA8E;IAC9E,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAA;IAChF,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACxC,CAAA;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,QAAQ,EACf,OAAO,GAAE,YAAiB,GACzB,KAAK,CA4IP"}
@@ -28,13 +28,32 @@ export function createInput(canvas, viewport, rig, scene, options = {}) {
28
28
  viewport.toDesign(event.clientX, event.clientY, design);
29
29
  return { id: event.pointerId, x: design.x, y: design.y, time: event.timeStamp, phase };
30
30
  }
31
+ function capture(pointerId) {
32
+ try {
33
+ canvas.setPointerCapture?.(pointerId);
34
+ }
35
+ catch {
36
+ // Desktop's emulated cross-origin preview recreates the pointer event in
37
+ // the game document. Chromium correctly refuses native capture for that
38
+ // synthetic id, but the preview host already owns the real capture and
39
+ // continues forwarding the stream, so tracking must still begin here.
40
+ }
41
+ }
42
+ function releaseCapture(pointerId) {
43
+ try {
44
+ canvas.releasePointerCapture?.(pointerId);
45
+ }
46
+ catch {
47
+ // Losing capture is already the requested end state.
48
+ }
49
+ }
31
50
  const onDown = (event) => {
32
51
  if (!enabled)
33
52
  return;
34
53
  event.preventDefault();
35
54
  // Capture so a finger that slides off the canvas keeps reporting; without
36
55
  // it a drag that leaves the edge sticks forever in the "down" state.
37
- canvas.setPointerCapture?.(event.pointerId);
56
+ capture(event.pointerId);
38
57
  dispatch(sampleOf(event, 'down'));
39
58
  };
40
59
  const onMove = (event) => {
@@ -45,7 +64,7 @@ export function createInput(canvas, viewport, rig, scene, options = {}) {
45
64
  const onUp = (event) => {
46
65
  if (!enabled)
47
66
  return;
48
- canvas.releasePointerCapture?.(event.pointerId);
67
+ releaseCapture(event.pointerId);
49
68
  dispatch(sampleOf(event, 'up'));
50
69
  };
51
70
  const onCancel = (event) => {
@@ -29,10 +29,10 @@ export type Platform = {
29
29
  /**
30
30
  * Resolves `window.FarcadeSDK`, rAF-polling until it appears.
31
31
  *
32
- * The poll is not paranoia: remix-dev's dev-init installs its SDK mock
33
- * asynchronously, so the global is genuinely absent at module-eval time in the
34
- * dev dashboard. Resolves `null` past the deadline rather than rejecting a
35
- * game opened as a bare file has no host and must still boot.
32
+ * The staged SDK module runs before the authored game module in Desktop, but
33
+ * published hosts may still attach the global asynchronously. Resolve `null`
34
+ * past the deadline rather than rejecting so a game opened as a bare file can
35
+ * still boot.
36
36
  */
37
37
  export declare function awaitSdk(timeoutMs?: number): Promise<FarcadeSDKGlobal | null>;
38
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,SAAS,EAEd,KAAK,kBAAkB,EACvB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAA;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,4EAA4E;IAC5E,KAAK,IAAI,IAAI,CAAA;IACb,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACjC,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACvC,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACtD,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACpD,MAAM,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CAClC,CAAA;AAaD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAc3E;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,GAAG,QAAQ,CAsHrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,SAAS,EAEd,KAAK,kBAAkB,EACvB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAA;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,4EAA4E;IAC5E,KAAK,IAAI,IAAI,CAAA;IACb,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACjC,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACvC,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACtD,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACpD,MAAM,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CAClC,CAAA;AAaD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAc3E;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,GAAG,QAAQ,CA2GrE"}
@@ -11,10 +11,10 @@ const STANDALONE_INFO = {
11
11
  /**
12
12
  * Resolves `window.FarcadeSDK`, rAF-polling until it appears.
13
13
  *
14
- * The poll is not paranoia: remix-dev's dev-init installs its SDK mock
15
- * asynchronously, so the global is genuinely absent at module-eval time in the
16
- * dev dashboard. Resolves `null` past the deadline rather than rejecting a
17
- * game opened as a bare file has no host and must still boot.
14
+ * The staged SDK module runs before the authored game module in Desktop, but
15
+ * published hosts may still attach the global asynchronously. Resolve `null`
16
+ * past the deadline rather than rejecting so a game opened as a bare file can
17
+ * still boot.
18
18
  */
19
19
  export function awaitSdk(timeoutMs = 2000) {
20
20
  const global = globalThis;
@@ -75,25 +75,10 @@ export function createPlatform(sdk) {
75
75
  const handleGameStateUpdated = (data) => {
76
76
  state = data ? data.gameState : null;
77
77
  };
78
- // remix-dev 1.8.1 implements the generic event API but predates these
79
- // named helpers. Prefer the production helpers and fall back without making
80
- // a freshly scaffolded game crash before its first frame.
81
- if (typeof sdk.onPlayAgain === 'function')
82
- sdk.onPlayAgain(handlePlayAgain);
83
- else
84
- sdk.on?.('play_again', handlePlayAgain);
85
- if (typeof sdk.onToggleMute === 'function')
86
- sdk.onToggleMute(handleToggleMute);
87
- else
88
- sdk.on?.('toggle_mute', handleToggleMute);
89
- if (typeof sdk.onGameInfo === 'function')
90
- sdk.onGameInfo(handleGameInfo);
91
- else
92
- sdk.on?.('game_info', handleGameInfo);
93
- if (typeof sdk.onGameStateUpdated === 'function')
94
- sdk.onGameStateUpdated(handleGameStateUpdated);
95
- else
96
- sdk.on?.('game_state_updated', handleGameStateUpdated);
78
+ sdk.onPlayAgain(handlePlayAgain);
79
+ sdk.onToggleMute(handleToggleMute);
80
+ sdk.onGameInfo(handleGameInfo);
81
+ sdk.onGameStateUpdated(handleGameStateUpdated);
97
82
  }
98
83
  const purchasedItems = () => info?.player.purchasedItems ?? [];
99
84
  return {
@@ -152,11 +137,7 @@ export function createPlatform(sdk) {
152
137
  onToggleMute: (cb) => subscribe(listeners.toggleMute, cb),
153
138
  onGameInfo: (cb) => subscribe(listeners.gameInfo, cb),
154
139
  haptic(type) {
155
- const actions = sdk?.singlePlayer.actions;
156
- if (actions?.hapticFeedback)
157
- actions.hapticFeedback(type);
158
- else
159
- sdk?.hapticFeedback?.(type);
140
+ sdk?.singlePlayer.actions.hapticFeedback(type);
160
141
  },
161
142
  hasItem: (slug) => purchasedItems().includes(slug),
162
143
  itemCount: (slug) => purchasedItems().filter((item) => item === slug).length,
@@ -167,11 +148,7 @@ export function createPlatform(sdk) {
167
148
  },
168
149
  reportError(error) {
169
150
  const err = error instanceof Error ? error : new Error(String(error));
170
- const actions = sdk?.singlePlayer.actions;
171
- if (actions?.reportError)
172
- actions.reportError({ message: err.message, error: err });
173
- else
174
- sdk?.reportError?.({ message: err.message, error: err });
151
+ sdk?.singlePlayer.actions.reportError({ message: err.message, error: err });
175
152
  },
176
153
  };
177
154
  }
@@ -43,12 +43,32 @@ export type ShopItem = {
43
43
  iconUrl?: string | null;
44
44
  tier?: number | null;
45
45
  };
46
+ export type PresentationTarget = 'mobile' | 'desktop';
47
+ export type PresentationOrientation = 'portrait' | 'landscape';
48
+ export type PresentationInput = 'touch' | 'keyboard' | 'pointer';
49
+ /**
50
+ * How the host is presenting the game: which surface it targets, which way it
51
+ * is oriented, and what input the player actually has. Sourced from the game's
52
+ * own declaration (`remix.json` → the platform), echoed back by the host.
53
+ */
54
+ export type GamePresentation = {
55
+ target: PresentationTarget;
56
+ orientation: PresentationOrientation;
57
+ /** e.g. `'16:9'`. Advisory — hosts may letterbox or expand around it. */
58
+ preferredAspectRatio?: string;
59
+ input: PresentationInput[];
60
+ };
46
61
  export type GameInfo = {
47
62
  players: Player[];
48
63
  player: Player;
49
64
  shopItems?: ShopItem[];
50
65
  viewContext: ViewContext;
51
66
  contentSafeAreaInset: SafeAreaInset;
67
+ /**
68
+ * Absent on hosts that predate the desktop target. Absence means the
69
+ * platform default: mobile, portrait, touch.
70
+ */
71
+ presentation?: GamePresentation;
52
72
  initialGameState: {
53
73
  id: string;
54
74
  gameState: GameState;
@@ -73,25 +93,16 @@ export type GameErrorData = {
73
93
  colno?: number;
74
94
  error?: Error;
75
95
  };
76
- export type FarcadeSDKEventMap = {
77
- play_again: Record<string, never>;
78
- toggle_mute: ToggleMuteData;
79
- game_info: GameInfo;
80
- game_state_updated: GameStateUpdatedData;
81
- };
82
96
  /** The subset of `window.FarcadeSDK` this SDK actually calls. */
83
97
  export type FarcadeSDKGlobal = {
84
98
  ready: () => Promise<GameInfo>;
85
99
  purchase: (data: {
86
100
  item: string;
87
101
  }) => Promise<PurchaseCompleteData>;
88
- reportError?: (data: GameErrorData) => void;
89
- hapticFeedback?: (type?: HapticFeedbackType) => void;
90
- on?: <Event extends keyof FarcadeSDKEventMap>(event: Event, cb: (data: FarcadeSDKEventMap[Event]) => void) => void;
91
- onPlayAgain?: (cb: () => void) => void;
92
- onToggleMute?: (cb: (data: ToggleMuteData) => void) => void;
93
- onGameInfo?: (cb: (data: GameInfo) => void) => void;
94
- onGameStateUpdated?: (cb: (data: GameStateUpdatedData) => void) => void;
102
+ onPlayAgain: (cb: () => void) => void;
103
+ onToggleMute: (cb: (data: ToggleMuteData) => void) => void;
104
+ onGameInfo: (cb: (data: GameInfo) => void) => void;
105
+ onGameStateUpdated: (cb: (data: GameStateUpdatedData) => void) => void;
95
106
  readonly gameInfo?: GameInfo;
96
107
  readonly gameState?: GameState | null;
97
108
  readonly shopItems: ShopItem[];
@@ -105,8 +116,8 @@ export type FarcadeSDKGlobal = {
105
116
  saveGameState: (data: {
106
117
  gameState: GameState;
107
118
  }) => void;
108
- reportError?: (data: GameErrorData) => void;
109
- hapticFeedback?: (type?: HapticFeedbackType) => void;
119
+ reportError: (data: GameErrorData) => void;
120
+ hapticFeedback: (type?: HapticFeedbackType) => void;
110
121
  };
111
122
  };
112
123
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-contract.d.ts","sourceRoot":"","sources":["../../src/platform/sdk-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk-contract.d.ts","sourceRoot":"","sources":["../../src/platform/sdk-contract.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,16 @@
1
1
  import { Vector2 } from 'three';
2
2
  import { type SafeAreaInset } from './platform/sdk-contract.js';
3
3
  /**
4
- * Portrait model: the canvas FILLS the viewport and the frustum expands along
5
- * whichever axis has surplus, so the 720x1080 design box is always fully
6
- * visible and backgrounds bleed into the overscan. This is the platform's own
7
- * documented contract — letterboxing to a fixed 2:3 canvas wastes ~30% of a
4
+ * The design-box model: the canvas FILLS the viewport and the frustum expands
5
+ * along whichever axis has surplus, so the design box is always fully visible
6
+ * and backgrounds bleed into the overscan. This is the platform's own
7
+ * documented contract — letterboxing to a fixed-aspect canvas wastes ~30% of a
8
8
  * real phone screen (the dev dashboard previews at 390x844, aspect 0.462,
9
- * against the box's 0.667).
9
+ * against the portrait box's 0.667).
10
+ *
11
+ * The math is orientation-agnostic; only the boxes are opinionated:
12
+ * `DEFAULT_DESIGN` (720x1080) for portrait mobile games, `LANDSCAPE_DESIGN`
13
+ * (1280x720) for desktop-target landscape games.
10
14
  */
11
15
  export type FitMode = 'expand' | 'crop';
12
16
  export type DesignBox = {
@@ -14,6 +18,8 @@ export type DesignBox = {
14
18
  height: number;
15
19
  };
16
20
  export declare const DEFAULT_DESIGN: DesignBox;
21
+ /** The landscape design box for desktop-target games. Pair with `landscapeRig()`. */
22
+ export declare const LANDSCAPE_DESIGN: DesignBox;
17
23
  export type Rect = {
18
24
  x: number;
19
25
  y: number;
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"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"}
package/dist/viewport.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { Vector2 } from 'three';
2
2
  import { ZERO_SAFE_AREA_INSET } from './platform/sdk-contract.js';
3
3
  export const DEFAULT_DESIGN = { width: 720, height: 1080 };
4
+ /** The landscape design box for desktop-target games. Pair with `landscapeRig()`. */
5
+ export const LANDSCAPE_DESIGN = { width: 1280, height: 720 };
4
6
  /**
5
7
  * The reference density: the design box rendered on a 393 CSS-px-wide phone.
6
8
  * The HUD scales against this so 16px reads as 16px on the target device and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remix-gg/three",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "The Remix Three.js SDK for portrait mobile games.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {