types.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. export type ObjectType =
  2. | "box"
  3. | "sphere"
  4. | "cylinder"
  5. | "cone"
  6. | "torus"
  7. | "plane"
  8. | "capsule"
  9. | "tetrahedron"
  10. | "octahedron"
  11. | "dodecahedron"
  12. | "icosahedron"
  13. | "knot"
  14. | "tube"
  15. | "extrude"
  16. | "shape"
  17. | "mesh"
  18. | "light"
  19. | "model"
  20. | "character"
  21. | "sound"
  22. | "player"
  23. | "image"
  24. | "video";
  25. export type TransformMode = "select" | "translate" | "rotate" | "scale";
  26. export type ColliderType = "cuboid" | "ball" | "capsule" | "none";
  27. export type LightType = "ambient" | "directional" | "point" | "spot";
  28. export type ViewMode = "first-person" | "third-person";
  29. export interface Material {
  30. color: string;
  31. metalness: number;
  32. roughness: number;
  33. emissive: string;
  34. emissiveIntensity: number;
  35. }
  36. export interface Physics {
  37. mass: number;
  38. isStatic: boolean;
  39. restitution: number;
  40. friction: number;
  41. colliderType: ColliderType | "none";
  42. }
  43. export interface Character {
  44. role: string;
  45. }
  46. export interface Sound {
  47. url: string;
  48. loop: boolean;
  49. volume: number;
  50. positional: boolean;
  51. distance: number;
  52. }
  53. export interface Media {
  54. url: string;
  55. type: string;
  56. loop?: boolean;
  57. autoplay?: boolean;
  58. muted?: boolean;
  59. }
  60. export interface Damage {
  61. amount: number;
  62. enabled: boolean;
  63. }
  64. export interface ShapeData {
  65. points: [number, number][];
  66. holes: [number, number][][];
  67. }
  68. export interface MeshData {
  69. vertices: number[];
  70. indices: number[];
  71. normals?: number[];
  72. uvs?: number[];
  73. }
  74. export interface SceneSettings {
  75. grid: {
  76. visible: boolean;
  77. size: number;
  78. divisions: number;
  79. color: string;
  80. secondaryColor: string;
  81. fadeDistance: number;
  82. fadeStrength: number;
  83. };
  84. fog: {
  85. enabled: boolean;
  86. color: string;
  87. near: number;
  88. far: number;
  89. };
  90. }
  91. export interface EnvironmentSettings {
  92. preset: string;
  93. customHdri: string | null;
  94. intensity: number;
  95. blur: number;
  96. }
  97. export interface SceneObject {
  98. id: string;
  99. name: string;
  100. description?: string;
  101. type: ObjectType;
  102. position: [number, number, number];
  103. rotation: [number, number, number];
  104. scale: [number, number, number];
  105. material: Material;
  106. physics: Physics;
  107. visible: boolean;
  108. intensity?: number;
  109. distance?: number;
  110. decay?: number;
  111. angle?: number;
  112. penumbra?: number;
  113. modelUrl?: string;
  114. character?: Character;
  115. sound?: Sound;
  116. media?: Media;
  117. damage?: Damage;
  118. lightType?: LightType;
  119. isPlayer?: boolean;
  120. shapeData?: ShapeData;
  121. meshData?: MeshData;
  122. // Geometry props (preserved through spec round-trip)
  123. width?: number;
  124. height?: number;
  125. depth?: number;
  126. radius?: number;
  127. radiusTop?: number;
  128. radiusBottom?: number;
  129. radialSegments?: number;
  130. tube?: number;
  131. tubularSegments?: number;
  132. widthSegments?: number;
  133. heightSegments?: number;
  134. length?: number;
  135. p?: number;
  136. q?: number;
  137. }
  138. export interface Scene {
  139. id: string;
  140. name: string;
  141. description?: string;
  142. isDefault?: boolean;
  143. objects: SceneObject[];
  144. sceneSettings: SceneSettings;
  145. environmentSettings: EnvironmentSettings;
  146. }
  147. export interface HistoryState {
  148. past: Scene[][];
  149. future: Scene[][];
  150. }
  151. export interface EditorState {
  152. scenes: Scene[];
  153. activeSceneId: string;
  154. selectedObjectId: string | null;
  155. transformMode: TransformMode;
  156. isPlaying: boolean;
  157. isLoading: boolean;
  158. viewMode: ViewMode;
  159. isPromptOpen: boolean;
  160. health: number;
  161. shield: number;
  162. maxHealth: number;
  163. maxShield: number;
  164. lastDamageTime: number | null;
  165. damageCooldown: number;
  166. history: HistoryState;
  167. canUndo: boolean;
  168. canRedo: boolean;
  169. // Computed
  170. activeScene: Scene | undefined;
  171. activeSceneObjects: SceneObject[];
  172. // Scene actions
  173. createScene: (name?: string) => void;
  174. deleteScene: (id: string) => void;
  175. duplicateScene: (id: string) => void;
  176. setActiveScene: (id: string) => void;
  177. updateSceneName: (id: string, name: string) => void;
  178. updateSceneDescription: (id: string, description: string) => void;
  179. // Object actions
  180. addObject: (type: ObjectType) => void;
  181. createCustomObject: (
  182. type: ObjectType,
  183. properties: Partial<SceneObject>,
  184. ) => void;
  185. removeObject: (id: string) => void;
  186. replaceSceneObjects: (objects: SceneObject[]) => void;
  187. initializePlayer: () => void;
  188. // Updates
  189. selectObject: (id: string | null) => void;
  190. updateObjectTransform: (
  191. id: string,
  192. transform: Partial<Pick<SceneObject, "position" | "rotation" | "scale">>,
  193. ) => void;
  194. updateObjectMaterial: (id: string, material: Partial<Material>) => void;
  195. updateObjectPhysics: (id: string, physics: Partial<Physics>) => void;
  196. updateCharacter: (id: string, character: Partial<Character>) => void;
  197. updateSound: (id: string, sound: Partial<Sound>) => void;
  198. updateMedia: (id: string, media: Partial<Media>) => void;
  199. updateDamage: (id: string, damage: Partial<Damage>) => void;
  200. updateSceneSettings: (settings: Partial<SceneSettings>) => void;
  201. updateEnvironmentSettings: (settings: Partial<EnvironmentSettings>) => void;
  202. updateObjectGeneral: (id: string, updates: Partial<SceneObject>) => void;
  203. toggleObjectVisibility: (id: string) => void;
  204. // UI state
  205. setTransformMode: (mode: TransformMode) => void;
  206. setIsPlaying: (playing: boolean) => void;
  207. setIsLoading: (loading: boolean) => void;
  208. setViewMode: (mode: ViewMode) => void;
  209. setIsPromptOpen: (open: boolean) => void;
  210. // History
  211. saveToHistory: () => void;
  212. undo: () => void;
  213. redo: () => void;
  214. // Health
  215. setHealth: (health: number) => void;
  216. setShield: (shield: number) => void;
  217. takeDamage: (amount: number) => void;
  218. }