@nice2dev/game-engine 0.1.0 → 1.0.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.
Files changed (112) hide show
  1. package/CHANGELOG.md +193 -1
  2. package/dist/cjs/audio/AudioBridge.js +454 -0
  3. package/dist/cjs/audio/AudioBridge.js.map +1 -0
  4. package/dist/cjs/devtools/GameplayAnalytics.js +651 -0
  5. package/dist/cjs/devtools/GameplayAnalytics.js.map +1 -0
  6. package/dist/cjs/dialogue/DialogueSystem.js +1023 -0
  7. package/dist/cjs/dialogue/DialogueSystem.js.map +1 -0
  8. package/dist/cjs/editor/NiceGameEditor.js +569 -71
  9. package/dist/cjs/editor/NiceGameEditor.js.map +1 -1
  10. package/dist/cjs/engine/SaveSystemV2.js +494 -0
  11. package/dist/cjs/engine/SaveSystemV2.js.map +1 -0
  12. package/dist/cjs/i18n/useTranslation.js +11 -11
  13. package/dist/cjs/index.js +90 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/input/GamepadNavigation.js +21 -21
  16. package/dist/cjs/input/useGamepads.js +6 -6
  17. package/dist/cjs/integration/IconSprite.js +281 -0
  18. package/dist/cjs/integration/IconSprite.js.map +1 -0
  19. package/dist/cjs/inventory/InventorySystem.js +930 -0
  20. package/dist/cjs/inventory/InventorySystem.js.map +1 -0
  21. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
  22. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
  23. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
  24. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
  25. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
  26. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
  27. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
  28. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
  29. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
  30. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
  31. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
  32. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
  33. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
  34. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
  35. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
  36. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
  37. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
  38. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
  39. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
  40. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
  41. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
  42. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
  43. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
  44. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
  45. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
  46. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
  47. package/dist/cjs/quest/QuestSystem.js +924 -0
  48. package/dist/cjs/quest/QuestSystem.js.map +1 -0
  49. package/dist/cjs/rendering/WebGPURenderPipeline.js +658 -0
  50. package/dist/cjs/rendering/WebGPURenderPipeline.js.map +1 -0
  51. package/dist/cjs/xr/ARVR.js.map +1 -1
  52. package/dist/esm/audio/AudioBridge.js +446 -0
  53. package/dist/esm/audio/AudioBridge.js.map +1 -0
  54. package/dist/esm/devtools/GameplayAnalytics.js +639 -0
  55. package/dist/esm/devtools/GameplayAnalytics.js.map +1 -0
  56. package/dist/esm/dialogue/DialogueSystem.js +1008 -0
  57. package/dist/esm/dialogue/DialogueSystem.js.map +1 -0
  58. package/dist/esm/editor/NiceGameEditor.js +556 -58
  59. package/dist/esm/editor/NiceGameEditor.js.map +1 -1
  60. package/dist/esm/engine/SaveSystemV2.js +487 -0
  61. package/dist/esm/engine/SaveSystemV2.js.map +1 -0
  62. package/dist/esm/index.js +11 -3
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/integration/IconSprite.js +266 -0
  65. package/dist/esm/integration/IconSprite.js.map +1 -0
  66. package/dist/esm/inventory/InventorySystem.js +924 -0
  67. package/dist/esm/inventory/InventorySystem.js.map +1 -0
  68. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
  69. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
  70. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
  71. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
  72. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
  73. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
  74. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
  75. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
  76. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
  77. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
  78. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
  79. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
  80. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
  81. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
  82. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
  83. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
  84. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
  85. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
  86. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
  87. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
  88. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
  89. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
  90. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
  91. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
  92. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
  93. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
  94. package/dist/esm/quest/QuestSystem.js +916 -0
  95. package/dist/esm/quest/QuestSystem.js.map +1 -0
  96. package/dist/esm/rendering/WebGPURenderPipeline.js +642 -0
  97. package/dist/esm/rendering/WebGPURenderPipeline.js.map +1 -0
  98. package/dist/esm/xr/ARVR.js.map +1 -1
  99. package/dist/types/__tests__/setup.d.ts +1 -1
  100. package/dist/types/audio/AudioBridge.d.ts +199 -0
  101. package/dist/types/devtools/GameplayAnalytics.d.ts +279 -0
  102. package/dist/types/dialogue/DialogueSystem.d.ts +326 -0
  103. package/dist/types/dialogue/index.d.ts +2 -0
  104. package/dist/types/editor/NiceGameEditor.d.ts +12 -1
  105. package/dist/types/engine/SaveSystemV2.d.ts +155 -0
  106. package/dist/types/index.d.ts +19 -3
  107. package/dist/types/integration/IconSprite.d.ts +196 -0
  108. package/dist/types/inventory/InventorySystem.d.ts +336 -0
  109. package/dist/types/performance/WebGPUCompute.d.ts +0 -10
  110. package/dist/types/quest/QuestSystem.d.ts +287 -0
  111. package/dist/types/rendering/WebGPURenderPipeline.d.ts +255 -0
  112. package/package.json +7 -1
@@ -0,0 +1,287 @@
1
+ import type { EntityId } from '../core/types';
2
+ import { EventBus } from '../core/EventBus';
3
+ import React from 'react';
4
+ /** Quest categories */
5
+ export type QuestType = 'main' | 'side' | 'daily' | 'weekly' | 'achievement' | 'tutorial' | 'hidden';
6
+ /** Quest status */
7
+ export type QuestStatus = 'locked' | 'available' | 'active' | 'completed' | 'failed' | 'expired';
8
+ /** Objective types */
9
+ export type ObjectiveType = 'collect' | 'kill' | 'interact' | 'reach' | 'escort' | 'defend' | 'survive' | 'craft' | 'talk' | 'discover' | 'score' | 'custom';
10
+ /** Reward types */
11
+ export type RewardType = 'experience' | 'currency' | 'item' | 'skill' | 'reputation' | 'unlock' | 'achievement' | 'custom';
12
+ /** Difficulty levels */
13
+ export type QuestDifficulty = 'trivial' | 'easy' | 'normal' | 'hard' | 'legendary';
14
+ export interface QuestObjective {
15
+ id: string;
16
+ type: ObjectiveType;
17
+ description: string;
18
+ /** Current progress */
19
+ current: number;
20
+ /** Target value to complete */
21
+ target: number;
22
+ /** Whether this objective is optional */
23
+ optional?: boolean;
24
+ /** Whether this objective is hidden until progress is made */
25
+ hidden?: boolean;
26
+ /** Order for sequential objectives */
27
+ order?: number;
28
+ /** Custom data for objective tracking */
29
+ trackingData?: {
30
+ itemId?: string;
31
+ enemyType?: string;
32
+ entityId?: EntityId;
33
+ locationId?: string;
34
+ npcId?: string;
35
+ [key: string]: unknown;
36
+ };
37
+ /** Completion status */
38
+ completed: boolean;
39
+ }
40
+ export interface QuestReward {
41
+ id: string;
42
+ type: RewardType;
43
+ /** Display name */
44
+ name: string;
45
+ /** Icon URL or icon key */
46
+ icon?: string;
47
+ /** Reward amount (for currency, experience) */
48
+ amount?: number;
49
+ /** Item ID (for item rewards) */
50
+ itemId?: string;
51
+ /** Quantity of items */
52
+ quantity?: number;
53
+ /** Skill ID (for skill unlocks) */
54
+ skillId?: string;
55
+ /** Reputation faction and amount */
56
+ reputation?: {
57
+ factionId: string;
58
+ amount: number;
59
+ };
60
+ /** What gets unlocked */
61
+ unlockId?: string;
62
+ /** Custom reward data */
63
+ customData?: Record<string, unknown>;
64
+ }
65
+ export interface QuestPrerequisite {
66
+ type: 'quest' | 'level' | 'item' | 'reputation' | 'skill' | 'time' | 'custom';
67
+ /** Quest ID that must be completed */
68
+ questId?: string;
69
+ /** Minimum level required */
70
+ level?: number;
71
+ /** Item that must be possessed */
72
+ itemId?: string;
73
+ /** Minimum reputation with faction */
74
+ reputation?: {
75
+ factionId: string;
76
+ amount: number;
77
+ };
78
+ /** Skill that must be unlocked */
79
+ skillId?: string;
80
+ /** Time window (for daily/weekly quests) */
81
+ timeWindow?: {
82
+ start: number;
83
+ end: number;
84
+ };
85
+ /** Custom condition key */
86
+ customKey?: string;
87
+ }
88
+ export interface Quest {
89
+ id: string;
90
+ /** Display name */
91
+ name: string;
92
+ /** Short description shown in quest list */
93
+ summary: string;
94
+ /** Full description with story/context */
95
+ description: string;
96
+ /** Quest category */
97
+ type: QuestType;
98
+ /** Difficulty rating */
99
+ difficulty: QuestDifficulty;
100
+ /** Quest icon */
101
+ icon?: string;
102
+ /** Quest giver NPC ID */
103
+ giverNpcId?: string;
104
+ /** Quest turn-in NPC ID */
105
+ turnInNpcId?: string;
106
+ /** Location hint */
107
+ locationHint?: string;
108
+ /** Level recommendation */
109
+ recommendedLevel?: number;
110
+ /** Objectives to complete */
111
+ objectives: QuestObjective[];
112
+ /** Rewards on completion */
113
+ rewards: QuestReward[];
114
+ /** Bonus rewards for optional objectives */
115
+ bonusRewards?: QuestReward[];
116
+ /** Prerequisites to unlock */
117
+ prerequisites: QuestPrerequisite[];
118
+ /** Quests that follow this one */
119
+ followUpQuests?: string[];
120
+ /** Tags for filtering */
121
+ tags?: string[];
122
+ /** Time limit in seconds (0 = no limit) */
123
+ timeLimit?: number;
124
+ /** Can quest be abandoned? */
125
+ canAbandon?: boolean;
126
+ /** Can quest be repeated? */
127
+ repeatable?: boolean;
128
+ /** Cooldown between repeats (ms) */
129
+ repeatCooldown?: number;
130
+ /** Custom quest data */
131
+ metadata?: Record<string, unknown>;
132
+ }
133
+ export interface QuestState {
134
+ questId: string;
135
+ status: QuestStatus;
136
+ objectives: QuestObjective[];
137
+ /** When quest was accepted */
138
+ startedAt?: number;
139
+ /** When quest was completed/failed */
140
+ endedAt?: number;
141
+ /** Time remaining (for timed quests) */
142
+ timeRemaining?: number;
143
+ /** Number of times completed (for repeatable) */
144
+ completionCount: number;
145
+ /** Last completion timestamp */
146
+ lastCompletedAt?: number;
147
+ }
148
+ export interface QuestJournal {
149
+ activeQuests: QuestState[];
150
+ completedQuests: QuestState[];
151
+ failedQuests: QuestState[];
152
+ trackedQuestId?: string;
153
+ }
154
+ export type QuestEventType = 'quest:unlocked' | 'quest:accepted' | 'quest:objective-progress' | 'quest:objective-completed' | 'quest:completed' | 'quest:failed' | 'quest:abandoned' | 'quest:reward-claimed' | 'quest:tracked';
155
+ export interface QuestEvent {
156
+ type: QuestEventType;
157
+ questId: string;
158
+ objectiveId?: string;
159
+ data?: unknown;
160
+ timestamp: number;
161
+ }
162
+ export declare class QuestManager {
163
+ private quests;
164
+ private journal;
165
+ private events;
166
+ private playerLevel;
167
+ private playerItems;
168
+ private playerSkills;
169
+ private reputation;
170
+ private customConditions;
171
+ constructor(events?: EventBus);
172
+ registerQuest(quest: Quest): void;
173
+ registerQuests(quests: Quest[]): void;
174
+ unregisterQuest(questId: string): void;
175
+ getQuest(questId: string): Quest | undefined;
176
+ getAllQuests(): Quest[];
177
+ setPlayerLevel(level: number): void;
178
+ addPlayerItem(itemId: string): void;
179
+ removePlayerItem(itemId: string): void;
180
+ addPlayerSkill(skillId: string): void;
181
+ setReputation(factionId: string, amount: number): void;
182
+ addReputation(factionId: string, amount: number): void;
183
+ registerCustomCondition(key: string, condition: () => boolean): void;
184
+ getQuestState(questId: string): QuestState | undefined;
185
+ getQuestStatus(questId: string): QuestStatus;
186
+ getActiveQuests(): QuestState[];
187
+ getCompletedQuests(): QuestState[];
188
+ getAvailableQuests(): Quest[];
189
+ getJournal(): QuestJournal;
190
+ canUnlockQuest(questId: string): boolean;
191
+ private checkPrerequisite;
192
+ acceptQuest(questId: string): boolean;
193
+ abandonQuest(questId: string): boolean;
194
+ updateObjectiveProgress(questId: string, objectiveId: string, amount: number): boolean;
195
+ setObjectiveProgress(questId: string, objectiveId: string, value: number): boolean;
196
+ completeObjective(questId: string, objectiveId: string): boolean;
197
+ private checkQuestCompletion;
198
+ completeQuest(questId: string): boolean;
199
+ failQuest(questId: string): boolean;
200
+ private checkQuestUnlocks;
201
+ private checkFollowUpQuests;
202
+ getQuestRewards(questId: string): {
203
+ main: QuestReward[];
204
+ bonus: QuestReward[];
205
+ } | null;
206
+ claimRewards(questId: string): QuestReward[] | null;
207
+ trackQuest(questId: string): void;
208
+ untrackQuest(): void;
209
+ getTrackedQuest(): QuestState | undefined;
210
+ update(deltaMs: number): void;
211
+ saveState(): QuestJournal;
212
+ loadState(journal: QuestJournal): void;
213
+ private emitEvent;
214
+ subscribe(eventType: QuestEventType, handler: (event: QuestEvent) => void): () => void;
215
+ }
216
+ export declare class QuestBuilder {
217
+ private quest;
218
+ private objectiveCounter;
219
+ private rewardCounter;
220
+ constructor(id: string, name: string);
221
+ summary(summary: string): this;
222
+ description(description: string): this;
223
+ type(type: QuestType): this;
224
+ difficulty(difficulty: QuestDifficulty): this;
225
+ icon(icon: string): this;
226
+ giver(npcId: string): this;
227
+ turnIn(npcId: string): this;
228
+ location(hint: string): this;
229
+ level(level: number): this;
230
+ timeLimit(seconds: number): this;
231
+ cannotAbandon(): this;
232
+ repeatable(cooldownMs?: number): this;
233
+ tags(tags: string[]): this;
234
+ followUp(questIds: string[]): this;
235
+ requireQuest(questId: string): this;
236
+ requireLevel(level: number): this;
237
+ requireItem(itemId: string): this;
238
+ requireReputation(factionId: string, amount: number): this;
239
+ requireSkill(skillId: string): this;
240
+ requireCustom(customKey: string): this;
241
+ private addObjective;
242
+ collect(itemId: string, amount: number, description: string, optional?: boolean): this;
243
+ kill(enemyType: string, amount: number, description: string, optional?: boolean): this;
244
+ interact(entityId: EntityId, description: string, optional?: boolean): this;
245
+ reach(locationId: string, description: string, optional?: boolean): this;
246
+ escort(npcId: string, locationId: string, description: string, optional?: boolean): this;
247
+ defend(seconds: number, description: string, optional?: boolean): this;
248
+ survive(seconds: number, description: string, optional?: boolean): this;
249
+ craft(itemId: string, amount: number, description: string, optional?: boolean): this;
250
+ talk(npcId: string, description: string, optional?: boolean): this;
251
+ discover(locationId: string, description: string, optional?: boolean): this;
252
+ score(threshold: number, description: string, optional?: boolean): this;
253
+ customObjective(type: string, target: number, description: string, data?: Record<string, unknown>, optional?: boolean): this;
254
+ private generateRewardId;
255
+ rewardXP(amount: number, name?: string): this;
256
+ rewardCurrency(amount: number, currencyName?: string): this;
257
+ rewardItem(itemId: string, name: string, quantity?: number, icon?: string): this;
258
+ rewardSkill(skillId: string, name: string, icon?: string): this;
259
+ rewardReputation(factionId: string, amount: number, factionName: string): this;
260
+ rewardUnlock(unlockId: string, name: string, icon?: string): this;
261
+ rewardAchievement(achievementId: string, name: string, icon?: string): this;
262
+ bonusXP(amount: number, name?: string): this;
263
+ bonusItem(itemId: string, name: string, quantity?: number, icon?: string): this;
264
+ build(): Quest;
265
+ }
266
+ export interface QuestListProps {
267
+ quests: QuestState[];
268
+ questDefinitions: Map<string, Quest>;
269
+ trackedId?: string;
270
+ onSelect?: (questId: string) => void;
271
+ onTrack?: (questId: string) => void;
272
+ filter?: QuestType[];
273
+ className?: string;
274
+ style?: React.CSSProperties;
275
+ }
276
+ export declare const QuestList: React.FC<QuestListProps>;
277
+ export interface QuestTrackerProps {
278
+ state: QuestState;
279
+ quest: Quest;
280
+ showOptional?: boolean;
281
+ className?: string;
282
+ style?: React.CSSProperties;
283
+ }
284
+ export declare const QuestTracker: React.FC<QuestTrackerProps>;
285
+ export declare function createEmptyQuest(id: string, name: string): Quest;
286
+ export declare const DIFFICULTY_COLORS: Record<QuestDifficulty, string>;
287
+ export declare const DIFFICULTY_XP_MULTIPLIERS: Record<QuestDifficulty, number>;
@@ -0,0 +1,255 @@
1
+ export type GPUTextureFormatType = 'bgra8unorm' | 'rgba8unorm' | 'rgba16float' | 'rgba32float' | 'depth24plus' | 'depth32float' | 'depth24plus-stencil8';
2
+ export type GPUBlendModeType = 'opaque' | 'alpha-blend' | 'additive' | 'multiply' | 'premultiplied';
3
+ export type ToneMappingMode = 'none' | 'reinhard' | 'aces' | 'filmic' | 'uncharted2';
4
+ export type MaterialType = 'pbr' | 'unlit' | 'sprite' | 'particle' | 'custom';
5
+ export type RenderPassType = 'depth-prepass' | 'shadow' | 'color' | 'transparent' | 'post-process' | 'ui-overlay';
6
+ export type LightCategory = 'directional' | 'point' | 'spot' | 'area';
7
+ export type PostEffectType = 'bloom' | 'fxaa' | 'taa' | 'ssao' | 'motion-blur' | 'chromatic-aberration' | 'vignette' | 'color-grading' | 'dof' | 'film-grain';
8
+ export interface VertexAttribute {
9
+ name: string;
10
+ format: string;
11
+ offset: number;
12
+ shaderLocation: number;
13
+ }
14
+ export interface VertexBufferLayout {
15
+ arrayStride: number;
16
+ stepMode: 'vertex' | 'instance';
17
+ attributes: VertexAttribute[];
18
+ }
19
+ /** Standard vertex layout: position(3) + normal(3) + uv(2) + tangent(4) */
20
+ export declare const STANDARD_VERTEX_LAYOUT: VertexBufferLayout;
21
+ /** Instance data layout: model matrix (4x4) + color (4) */
22
+ export declare const INSTANCE_LAYOUT: VertexBufferLayout;
23
+ export interface GPUTextureRef {
24
+ id: string;
25
+ uri?: string;
26
+ width: number;
27
+ height: number;
28
+ format: GPUTextureFormatType;
29
+ mipLevels: number;
30
+ }
31
+ export interface PBRMaterial {
32
+ type: 'pbr';
33
+ albedo: [number, number, number, number];
34
+ albedoTexture?: GPUTextureRef;
35
+ metallic: number;
36
+ roughness: number;
37
+ metallicRoughnessTexture?: GPUTextureRef;
38
+ normalTexture?: GPUTextureRef;
39
+ normalScale: number;
40
+ occlusionTexture?: GPUTextureRef;
41
+ occlusionStrength: number;
42
+ emissive: [number, number, number];
43
+ emissiveTexture?: GPUTextureRef;
44
+ emissiveIntensity: number;
45
+ alphaMode: 'opaque' | 'mask' | 'blend';
46
+ alphaCutoff: number;
47
+ doubleSided: boolean;
48
+ }
49
+ export interface UnlitMaterial {
50
+ type: 'unlit';
51
+ color: [number, number, number, number];
52
+ texture?: GPUTextureRef;
53
+ alphaMode: 'opaque' | 'mask' | 'blend';
54
+ alphaCutoff: number;
55
+ }
56
+ export interface SpriteMaterial {
57
+ type: 'sprite';
58
+ texture: GPUTextureRef;
59
+ tint: [number, number, number, number];
60
+ uvRect: [number, number, number, number];
61
+ pixelPerfect: boolean;
62
+ }
63
+ export interface CustomMaterial {
64
+ type: 'custom';
65
+ shaderCode: string;
66
+ uniforms: Record<string, number | number[] | GPUTextureRef>;
67
+ blendMode: GPUBlendModeType;
68
+ }
69
+ export type RenderMaterial = PBRMaterial | UnlitMaterial | SpriteMaterial | CustomMaterial;
70
+ export declare const DEFAULT_PBR: PBRMaterial;
71
+ export interface GPULight {
72
+ category: LightCategory;
73
+ color: [number, number, number];
74
+ intensity: number;
75
+ /** World-space position (point/spot/area) */
76
+ position?: [number, number, number];
77
+ /** Direction (directional/spot) */
78
+ direction?: [number, number, number];
79
+ /** Range for point/spot (0 = infinite) */
80
+ range?: number;
81
+ /** Inner/outer cone angle in radians (spot only) */
82
+ innerConeAngle?: number;
83
+ outerConeAngle?: number;
84
+ /** Cast shadows */
85
+ castShadow: boolean;
86
+ shadowMapSize?: number;
87
+ shadowBias?: number;
88
+ }
89
+ export interface RenderBatch {
90
+ id: string;
91
+ vertexData: Float32Array;
92
+ indexData: Uint32Array;
93
+ instanceCount: number;
94
+ instanceData?: Float32Array;
95
+ material: RenderMaterial;
96
+ layer: number;
97
+ castShadow: boolean;
98
+ receiveShadow: boolean;
99
+ }
100
+ export interface ClusteredLightConfig {
101
+ tileCountX: number;
102
+ tileCountY: number;
103
+ sliceCount: number;
104
+ maxLightsPerCluster: number;
105
+ }
106
+ export interface ShadowConfig {
107
+ enabled: boolean;
108
+ mapSize: number;
109
+ cascadeCount: number;
110
+ cascadeSplitLambda: number;
111
+ bias: number;
112
+ normalBias: number;
113
+ pcfRadius: number;
114
+ }
115
+ export interface PostProcessConfig {
116
+ enabled: boolean;
117
+ effects: PostEffectSettings[];
118
+ hdrEnabled: boolean;
119
+ toneMapping: ToneMappingMode;
120
+ exposure: number;
121
+ gamma: number;
122
+ }
123
+ export interface PostEffectSettings {
124
+ type: PostEffectType;
125
+ enabled: boolean;
126
+ intensity: number;
127
+ params: Record<string, number>;
128
+ }
129
+ export interface WebGPURenderConfig {
130
+ canvasFormat: GPUTextureFormatType;
131
+ sampleCount: number;
132
+ maxLights: number;
133
+ clusteredLighting: ClusteredLightConfig;
134
+ shadows: ShadowConfig;
135
+ postProcess: PostProcessConfig;
136
+ maxInstances: number;
137
+ depthPrepassEnabled: boolean;
138
+ frustumCulling: boolean;
139
+ occlusionCulling: boolean;
140
+ sortTransparents: boolean;
141
+ }
142
+ export declare const DEFAULT_RENDER_CONFIG: WebGPURenderConfig;
143
+ export interface GPUResourceHandle {
144
+ id: string;
145
+ type: 'buffer' | 'texture' | 'sampler' | 'pipeline' | 'bind-group';
146
+ }
147
+ export interface GPUStats {
148
+ drawCalls: number;
149
+ triangles: number;
150
+ instances: number;
151
+ textureMegabytes: number;
152
+ bufferMegabytes: number;
153
+ pipelineSwitches: number;
154
+ frameTimeMs: number;
155
+ gpuTimeMs: number;
156
+ }
157
+ /** Track GPU resource allocations */
158
+ export declare class GPUResourceTracker {
159
+ private resources;
160
+ private totalBytes;
161
+ register(id: string, type: string, sizeBytes: number, label?: string): void;
162
+ release(id: string): void;
163
+ getStats(): {
164
+ count: number;
165
+ totalMB: number;
166
+ byType: Record<string, number>;
167
+ };
168
+ clear(): void;
169
+ }
170
+ export interface RenderPassDescriptor {
171
+ type: RenderPassType;
172
+ label: string;
173
+ enabled: boolean;
174
+ order: number;
175
+ }
176
+ /** Collects batches, sorts, and generates draw calls per pass */
177
+ export declare class RenderPipelineManager {
178
+ private config;
179
+ private passes;
180
+ private batches;
181
+ private lights;
182
+ private stats;
183
+ private resourceTracker;
184
+ constructor(config?: Partial<WebGPURenderConfig>);
185
+ private initDefaultPasses;
186
+ getConfig(): Readonly<WebGPURenderConfig>;
187
+ updateConfig(patch: Partial<WebGPURenderConfig>): void;
188
+ submitBatch(batch: RenderBatch): void;
189
+ submitLight(light: GPULight): void;
190
+ clearFrame(): void;
191
+ /** Sort and organize batches for rendering */
192
+ preparePasses(): Map<RenderPassType, RenderBatch[]>;
193
+ private isOpaque;
194
+ /** Generate draw statistics */
195
+ computeStats(): GPUStats;
196
+ getLights(): readonly GPULight[];
197
+ getPasses(): readonly RenderPassDescriptor[];
198
+ getResourceTracker(): GPUResourceTracker;
199
+ }
200
+ export interface WebGPURendererState {
201
+ initialized: boolean;
202
+ supported: boolean;
203
+ adapterInfo: string;
204
+ deviceLimits: Record<string, number>;
205
+ }
206
+ /** High-level WebGPU renderer that manages device, pipelines, and frame submission */
207
+ export declare class WebGPURenderer {
208
+ private pipeline;
209
+ private state;
210
+ private frameCallback;
211
+ constructor(config?: Partial<WebGPURenderConfig>);
212
+ /** Check WebGPU support */
213
+ isSupported(): boolean;
214
+ /** Initialize the WebGPU device */
215
+ initialize(): Promise<boolean>;
216
+ /** Submit a renderable batch */
217
+ submit(batch: RenderBatch): void;
218
+ /** Submit a light */
219
+ addLight(light: GPULight): void;
220
+ /** Execute full render frame */
221
+ renderFrame(): GPUStats;
222
+ /** Register frame callback */
223
+ onFrame(cb: (stats: GPUStats) => void): void;
224
+ getState(): Readonly<WebGPURendererState>;
225
+ getPipeline(): RenderPipelineManager;
226
+ /** Get available shader sources for debug/customization */
227
+ getShaderSources(): Record<string, string>;
228
+ destroy(): void;
229
+ }
230
+ export interface PostProcessPass {
231
+ type: PostEffectType;
232
+ enabled: boolean;
233
+ intensity: number;
234
+ params: Record<string, number>;
235
+ }
236
+ export declare const BLOOM_DEFAULTS: PostProcessPass;
237
+ export declare const FXAA_DEFAULTS: PostProcessPass;
238
+ export declare const SSAO_DEFAULTS: PostProcessPass;
239
+ export declare const DOF_DEFAULTS: PostProcessPass;
240
+ export declare const COLOR_GRADING_DEFAULTS: PostProcessPass;
241
+ /** Manage ordered post-process stack */
242
+ export declare class PostProcessStack {
243
+ private passes;
244
+ add(pass: PostProcessPass): void;
245
+ remove(type: PostEffectType): void;
246
+ setEnabled(type: PostEffectType, enabled: boolean): void;
247
+ setIntensity(type: PostEffectType, intensity: number): void;
248
+ getActive(): PostProcessPass[];
249
+ getAll(): readonly PostProcessPass[];
250
+ reorder(order: PostEffectType[]): void;
251
+ clear(): void;
252
+ }
253
+ export type QualityPreset = 'low' | 'medium' | 'high' | 'ultra';
254
+ export declare const QUALITY_PRESET_CONFIGS: Record<QualityPreset, Partial<WebGPURenderConfig>>;
255
+ export declare function applyQualityPreset(preset: QualityPreset): WebGPURenderConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nice2dev/game-engine",
3
- "version": "0.1.0",
3
+ "version": "1.0.2",
4
4
  "description": "Nice2Dev Game Engine — No-code game engine and editor for React",
5
5
  "author": "NiceToDev <contact@nicetodev.com>",
6
6
  "license": "MIT",
@@ -59,11 +59,17 @@
59
59
  "nicetodev"
60
60
  ],
61
61
  "peerDependencies": {
62
+ "@nice2dev/icons-gaming": "*",
62
63
  "@nice2dev/ui": "^1.0.0",
63
64
  "@nice2dev/ui-graphics": "^1.0.0",
64
65
  "react": ">=17.0.0",
65
66
  "react-dom": ">=17.0.0"
66
67
  },
68
+ "peerDependenciesMeta": {
69
+ "@nice2dev/icons-gaming": {
70
+ "optional": true
71
+ }
72
+ },
67
73
  "devDependencies": {
68
74
  "@microsoft/signalr": "^10.0.0",
69
75
  "@rollup/plugin-commonjs": "^28.0.0",