From 4ff2db1ef400b144b906d45acee8826dae6f77e2 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Thu, 2 Jul 2026 16:12:11 -0700 Subject: [PATCH] Add simulateShot query, cue strike and shot projection types Generated from backend strawberry definitions for the shot simulation feature (image -> pooltool scenario -> projected outcome). Backend PR: shot-simulation-stubs. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/index.tsx | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/schema.gql | 60 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) diff --git a/src/index.tsx b/src/index.tsx index 1b41a7f..03b3644 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -88,6 +88,12 @@ export type AppleIapSubscriptionOptionsGql = { productIds: Array; }; +export type BallTrajectoryGql = { + __typename?: "BallTrajectoryGQL"; + ballId: Scalars["Int"]["output"]; + points: Array; +}; + export type BankFeaturesGql = { __typename?: "BankFeaturesGQL"; bankAngle: Scalars["Float"]["output"]; @@ -268,6 +274,14 @@ export type CueObjectFeaturesGql = { spinType?: Maybe; }; +export type CueStrikeInputGql = { + a?: Scalars["Float"]["input"]; + b?: Scalars["Float"]["input"]; + phi: Scalars["Float"]["input"]; + theta?: Scalars["Float"]["input"]; + v0: Scalars["Float"]["input"]; +}; + export type DateRangeFilter = { greaterThan?: InputMaybe; greaterThanEqualTo?: InputMaybe; @@ -2888,6 +2902,7 @@ export type Query = { myVideoExports: Array; notifications: NotificationConnection; ruleSets: Array; + simulateShot: ShotProjectionGql; unreadNotificationCount: Scalars["Int"]["output"]; videoExportJob?: Maybe; videoPlayerClusters: Array; @@ -3077,6 +3092,10 @@ export type QueryNotificationsArgs = { offset?: Scalars["Int"]["input"]; }; +export type QuerySimulateShotArgs = { + simulationInput: SimulateShotInputGql; +}; + export type QueryVideoExportJobArgs = { jobId: Scalars["Int"]["input"]; }; @@ -3340,6 +3359,14 @@ export type ShotMoveInput = { shotId: Scalars["Int"]["input"]; }; +export type ShotProjectionGql = { + __typename?: "ShotProjectionGQL"; + events: Array; + finalState: Array; + pottedBallIds: Array; + trajectories: Array; +}; + export type ShotsOrderingComponent = | { difficulty: FloatOrdering; @@ -3390,6 +3417,42 @@ export type ShotsOrderingComponent = videoId: IntOrdering; }; +export type SimulateShotInputGql = { + b64Image?: InputMaybe; + balls?: InputMaybe>; + cueBallId: Scalars["Int"]["input"]; + strike: CueStrikeInputGql; + tableSize?: InputMaybe; + useHomography?: InputMaybe; +}; + +export type SimulationBallStateGql = { + __typename?: "SimulationBallStateGQL"; + ballId: Scalars["Int"]["output"]; + position: Array; +}; + +export type SimulationBallStateInputGql = { + ballId: Scalars["Int"]["input"]; + position: Array; +}; + +export type SimulationEventGql = { + __typename?: "SimulationEventGQL"; + ballIds: Array; + eventType: SimulationEventType; + position?: Maybe>; + time: Scalars["Float"]["output"]; +}; + +export enum SimulationEventType { + BallBall = "BALL_BALL", + BallCushion = "BALL_CUSHION", + BallPocket = "BALL_POCKET", + BallStop = "BALL_STOP", + StickBall = "STICK_BALL", +} + export type SpinTypeBreakdownGql = { __typename?: "SpinTypeBreakdownGQL"; center: Scalars["Int"]["output"]; @@ -3566,6 +3629,12 @@ export type TooManyProfileImageUploadsErr = { linksRequested: Scalars["Int"]["output"]; }; +export type TrajectoryPointGql = { + __typename?: "TrajectoryPointGQL"; + position: Array; + time: Scalars["Float"]["output"]; +}; + export type UpdateAnnotationInputGql = { name: Scalars["String"]["input"]; notes?: InputMaybe; diff --git a/src/schema.gql b/src/schema.gql index b636363..ae72e64 100644 --- a/src/schema.gql +++ b/src/schema.gql @@ -66,6 +66,7 @@ type Query { tableSize: Float = 100 useHomography: HomographyInputGQL = null ): TableStateGQL! + simulateShot(simulationInput: SimulateShotInputGQL!): ShotProjectionGQL! getOrderedShots( filterInput: FilterInput! ids: [Int!] = null @@ -970,6 +971,65 @@ input IntPoint2DInput { y: Int! } +type ShotProjectionGQL { + trajectories: [BallTrajectoryGQL!]! + events: [SimulationEventGQL!]! + finalState: [SimulationBallStateGQL!]! + pottedBallIds: [Int!]! +} + +type BallTrajectoryGQL { + ballId: Int! + points: [TrajectoryPointGQL!]! +} + +type TrajectoryPointGQL { + time: Float! + position: [Float!]! +} + +type SimulationEventGQL { + eventType: SimulationEventType! + time: Float! + ballIds: [Int!]! + position: [Float!] +} + +enum SimulationEventType { + STICK_BALL + BALL_BALL + BALL_CUSHION + BALL_POCKET + BALL_STOP +} + +type SimulationBallStateGQL { + ballId: Int! + position: [Float!]! +} + +input SimulateShotInputGQL { + cueBallId: Int! + strike: CueStrikeInputGQL! + balls: [SimulationBallStateInputGQL!] = null + b64Image: String = null + useHomography: HomographyInputGQL = null + tableSize: Float = null +} + +input CueStrikeInputGQL { + v0: Float! + phi: Float! + theta: Float! = 0 + a: Float! = 0 + b: Float! = 0 +} + +input SimulationBallStateInputGQL { + ballId: Int! + position: [Float!]! +} + type GetShotsResult { shots: [ShotGQL!]! count: Int -- 2.49.1