cinematic-renderer2d 0.1.0
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/LICENSE +21 -0
- package/README.md +827 -0
- package/dist/angular.cjs +189 -0
- package/dist/angular.cjs.map +1 -0
- package/dist/angular.d.cts +577 -0
- package/dist/angular.d.ts +577 -0
- package/dist/angular.js +189 -0
- package/dist/angular.js.map +1 -0
- package/dist/cli/index.js +1243 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.cjs +182 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1663 -0
- package/dist/index.d.ts +1663 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/react.cjs +182 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +510 -0
- package/dist/react.d.ts +510 -0
- package/dist/react.js +182 -0
- package/dist/react.js.map +1 -0
- package/package.json +151 -0
package/README.md
ADDED
|
@@ -0,0 +1,827 @@
|
|
|
1
|
+
# cinematicRenderer2D
|
|
2
|
+
|
|
3
|
+
High-performance, framework-agnostic NPM library that renders cinematic experiences from JSON specifications targeting 60-120fps performance across web frameworks.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🚀 **High Performance**: Targets 60-120fps with optimized rendering backends and precompiled animations
|
|
8
|
+
- 🎯 **Framework Agnostic**: Works with React, Angular, Vue, Next.js, or plain JavaScript
|
|
9
|
+
- 🎨 **Multiple Backends**: DOM, Canvas2D rendering with future WebGL support
|
|
10
|
+
- 📱 **Adaptive Quality**: Automatic performance optimization based on device capabilities
|
|
11
|
+
- 🎵 **Audio Integration**: Synchronized audio tracks with fade effects and WebAudio API
|
|
12
|
+
- 🔧 **TypeScript**: Full type safety with comprehensive interfaces and definitions
|
|
13
|
+
- 📦 **Tree Shakeable**: ESM/CJS dual output with optimized bundles and tree-shaking
|
|
14
|
+
- 🎭 **Layer System**: Extensible plugin architecture for custom visual elements
|
|
15
|
+
- 🎬 **CLI Tools**: Validation and preview tools for development workflow
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install cinematic-renderer2d
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Documentation
|
|
24
|
+
|
|
25
|
+
📚 **[Complete Documentation](./docs/index.html)** - Interactive documentation landing page
|
|
26
|
+
|
|
27
|
+
### Quick Links
|
|
28
|
+
- 🚀 [Getting Started Guide](./docs/GETTING_STARTED.md) - Installation and quick start
|
|
29
|
+
- 📖 [API Reference](./docs/API.md) - Complete API documentation
|
|
30
|
+
- 💡 [Examples Guide](./docs/EXAMPLES.md) - Learn from example patterns
|
|
31
|
+
- ⚛️ [React Integration](./docs/REACT_INTEGRATION.md) - Using with React
|
|
32
|
+
- 🅰️ [Angular Integration](./docs/ANGULAR_INTEGRATION.md) - Using with Angular
|
|
33
|
+
- ⚡ [Performance Guide](./docs/PERFORMANCE.md) - Optimization tips
|
|
34
|
+
- 🎮 [Interactive Playground](./playground/index.html) - Try it live!
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
### Basic Usage
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { CinematicRenderer2D } from 'cinematic-renderer2d';
|
|
42
|
+
|
|
43
|
+
const renderer = new CinematicRenderer2D({
|
|
44
|
+
container: document.getElementById('cinematic-container'),
|
|
45
|
+
spec: {
|
|
46
|
+
schemaVersion: '1.0.0',
|
|
47
|
+
engine: {
|
|
48
|
+
targetFps: 60,
|
|
49
|
+
quality: 'auto',
|
|
50
|
+
debug: false
|
|
51
|
+
},
|
|
52
|
+
events: [{
|
|
53
|
+
id: 'intro',
|
|
54
|
+
name: 'Introduction',
|
|
55
|
+
scenes: ['scene1']
|
|
56
|
+
}],
|
|
57
|
+
scenes: [{
|
|
58
|
+
id: 'scene1',
|
|
59
|
+
name: 'Opening Scene',
|
|
60
|
+
duration: 5000,
|
|
61
|
+
layers: [{
|
|
62
|
+
id: 'background',
|
|
63
|
+
type: 'gradient',
|
|
64
|
+
zIndex: 1,
|
|
65
|
+
config: {
|
|
66
|
+
opacity: 1,
|
|
67
|
+
colors: ['#000000', '#333333']
|
|
68
|
+
},
|
|
69
|
+
animations: [{
|
|
70
|
+
property: 'opacity',
|
|
71
|
+
from: 0,
|
|
72
|
+
to: 1,
|
|
73
|
+
startMs: 0,
|
|
74
|
+
endMs: 1000,
|
|
75
|
+
easing: 'ease-in-out'
|
|
76
|
+
}]
|
|
77
|
+
}]
|
|
78
|
+
}]
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Mount and start playback
|
|
83
|
+
await renderer.mount();
|
|
84
|
+
renderer.play();
|
|
85
|
+
|
|
86
|
+
// Event handling
|
|
87
|
+
renderer.on('play', () => console.log('Playback started'));
|
|
88
|
+
renderer.on('pause', () => console.log('Playback paused'));
|
|
89
|
+
renderer.on('end', () => console.log('Playback completed'));
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Navigation and Control
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// Playback control
|
|
96
|
+
renderer.play();
|
|
97
|
+
renderer.pause();
|
|
98
|
+
renderer.stop();
|
|
99
|
+
|
|
100
|
+
// Navigation
|
|
101
|
+
renderer.seek(2500); // Seek to 2.5 seconds
|
|
102
|
+
renderer.goToEvent('intro');
|
|
103
|
+
renderer.goToScene('scene1');
|
|
104
|
+
|
|
105
|
+
// Quality control
|
|
106
|
+
renderer.setQuality('high'); // 'low', 'medium', 'high', 'ultra', 'auto'
|
|
107
|
+
|
|
108
|
+
// Cleanup
|
|
109
|
+
renderer.destroy();
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Framework Adapters
|
|
113
|
+
|
|
114
|
+
### React
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import { CinematicPlayer } from 'cinematic-renderer2d/react';
|
|
118
|
+
|
|
119
|
+
function App() {
|
|
120
|
+
const [isPlaying, setIsPlaying] = useState(false);
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
<CinematicPlayer
|
|
124
|
+
spec={cinematicSpec}
|
|
125
|
+
autoplay={true}
|
|
126
|
+
onPlay={() => setIsPlaying(true)}
|
|
127
|
+
onPause={() => setIsPlaying(false)}
|
|
128
|
+
onEnd={() => setIsPlaying(false)}
|
|
129
|
+
onError={(error) => console.error('Playback error:', error)}
|
|
130
|
+
/>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### React Props
|
|
136
|
+
|
|
137
|
+
| Prop | Type | Default | Description |
|
|
138
|
+
|------|------|---------|-------------|
|
|
139
|
+
| `spec` | `CinematicSpec` | required | JSON specification for the cinematic experience |
|
|
140
|
+
| `autoplay` | `boolean` | `false` | Start playback automatically when mounted |
|
|
141
|
+
| `quality` | `QualityLevel` | `'auto'` | Quality level: 'low', 'medium', 'high', 'ultra', 'auto' |
|
|
142
|
+
| `debug` | `boolean` | `false` | Enable debug overlay with performance metrics |
|
|
143
|
+
| `onPlay` | `() => void` | - | Called when playback starts |
|
|
144
|
+
| `onPause` | `() => void` | - | Called when playback pauses |
|
|
145
|
+
| `onStop` | `() => void` | - | Called when playback stops |
|
|
146
|
+
| `onEnd` | `() => void` | - | Called when playback completes |
|
|
147
|
+
| `onError` | `(error: Error) => void` | - | Called when an error occurs |
|
|
148
|
+
|
|
149
|
+
### Angular
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { CinematicPlayerComponent } from 'cinematic-renderer2d/angular';
|
|
153
|
+
|
|
154
|
+
@Component({
|
|
155
|
+
selector: 'app-root',
|
|
156
|
+
template: `
|
|
157
|
+
<cinematic-player
|
|
158
|
+
[spec]="cinematicSpec"
|
|
159
|
+
[autoplay]="true"
|
|
160
|
+
[quality]="'auto'"
|
|
161
|
+
[debug]="false"
|
|
162
|
+
(play)="onPlay()"
|
|
163
|
+
(pause)="onPause()"
|
|
164
|
+
(end)="onEnd()"
|
|
165
|
+
(error)="onError($event)">
|
|
166
|
+
</cinematic-player>
|
|
167
|
+
`
|
|
168
|
+
})
|
|
169
|
+
export class AppComponent {
|
|
170
|
+
cinematicSpec: CinematicSpec = {
|
|
171
|
+
// Your specification here
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
onPlay() { console.log('Playing'); }
|
|
175
|
+
onPause() { console.log('Paused'); }
|
|
176
|
+
onEnd() { console.log('Ended'); }
|
|
177
|
+
onError(error: Error) { console.error('Error:', error); }
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### Angular Inputs/Outputs
|
|
182
|
+
|
|
183
|
+
**Inputs:**
|
|
184
|
+
- `spec: CinematicSpec` - JSON specification (required)
|
|
185
|
+
- `autoplay: boolean` - Auto-start playback (default: false)
|
|
186
|
+
- `quality: QualityLevel` - Quality level (default: 'auto')
|
|
187
|
+
- `debug: boolean` - Enable debug mode (default: false)
|
|
188
|
+
|
|
189
|
+
**Outputs:**
|
|
190
|
+
- `play: EventEmitter<void>` - Playback started
|
|
191
|
+
- `pause: EventEmitter<void>` - Playback paused
|
|
192
|
+
- `stop: EventEmitter<void>` - Playback stopped
|
|
193
|
+
- `end: EventEmitter<void>` - Playback completed
|
|
194
|
+
- `error: EventEmitter<Error>` - Error occurred
|
|
195
|
+
|
|
196
|
+
## JSON Specification Format
|
|
197
|
+
|
|
198
|
+
### Schema Structure
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
interface CinematicSpec {
|
|
202
|
+
schemaVersion: string; // Currently '1.0.0'
|
|
203
|
+
engine: EngineConfig; // Engine configuration
|
|
204
|
+
events: CinematicEvent[]; // High-level sequences
|
|
205
|
+
scenes: CinematicScene[]; // Individual scenes
|
|
206
|
+
assets?: AssetDefinition[]; // Optional assets
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
interface EngineConfig {
|
|
210
|
+
targetFps?: number; // Target frame rate (default: 60)
|
|
211
|
+
quality?: QualityLevel; // Quality level (default: 'auto')
|
|
212
|
+
debug?: boolean; // Debug mode (default: false)
|
|
213
|
+
autoplay?: boolean; // Auto-start (default: false)
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Events and Scenes
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
interface CinematicEvent {
|
|
221
|
+
id: string; // Unique identifier
|
|
222
|
+
name: string; // Display name
|
|
223
|
+
scenes: string[]; // Scene IDs in order
|
|
224
|
+
transitions?: TransitionSpec[]; // Optional transitions
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
interface CinematicScene {
|
|
228
|
+
id: string; // Unique identifier
|
|
229
|
+
name: string; // Display name
|
|
230
|
+
duration: number; // Duration in milliseconds
|
|
231
|
+
layers: LayerSpec[]; // Visual layers
|
|
232
|
+
audio?: AudioTrackSpec[]; // Optional audio tracks
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Layers and Animations
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
interface LayerSpec {
|
|
240
|
+
id: string; // Unique identifier
|
|
241
|
+
type: LayerType; // Layer type (see Layer Types)
|
|
242
|
+
zIndex: number; // Rendering order
|
|
243
|
+
config: LayerConfig; // Layer-specific configuration
|
|
244
|
+
animations?: AnimationTrackSpec[]; // Optional animations
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
interface AnimationTrackSpec {
|
|
248
|
+
property: string; // Property to animate
|
|
249
|
+
from: any; // Starting value
|
|
250
|
+
to: any; // Ending value
|
|
251
|
+
startMs: number; // Start time in milliseconds
|
|
252
|
+
endMs: number; // End time in milliseconds
|
|
253
|
+
easing?: EasingType; // Easing function (default: 'ease')
|
|
254
|
+
loop?: boolean; // Loop animation (default: false)
|
|
255
|
+
yoyo?: boolean; // Reverse on loop (default: false)
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Layer Types
|
|
260
|
+
|
|
261
|
+
### DOM Layers
|
|
262
|
+
|
|
263
|
+
#### Gradient Layer
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"type": "gradient",
|
|
267
|
+
"config": {
|
|
268
|
+
"colors": ["#ff0000", "#0000ff"],
|
|
269
|
+
"direction": "to bottom",
|
|
270
|
+
"opacity": 1
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
#### Image Layer
|
|
276
|
+
```json
|
|
277
|
+
{
|
|
278
|
+
"type": "image",
|
|
279
|
+
"config": {
|
|
280
|
+
"src": "path/to/image.jpg",
|
|
281
|
+
"width": "100%",
|
|
282
|
+
"height": "100%",
|
|
283
|
+
"objectFit": "cover"
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
#### Text Block Layer
|
|
289
|
+
```json
|
|
290
|
+
{
|
|
291
|
+
"type": "textBlock",
|
|
292
|
+
"config": {
|
|
293
|
+
"text": "Hello World",
|
|
294
|
+
"fontSize": "24px",
|
|
295
|
+
"color": "#ffffff",
|
|
296
|
+
"textAlign": "center"
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
#### Vignette Layer
|
|
302
|
+
```json
|
|
303
|
+
{
|
|
304
|
+
"type": "vignette",
|
|
305
|
+
"config": {
|
|
306
|
+
"intensity": 0.5,
|
|
307
|
+
"color": "#000000",
|
|
308
|
+
"radius": "50%"
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Canvas2D Layers
|
|
314
|
+
|
|
315
|
+
#### Particles Layer
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"type": "particles",
|
|
319
|
+
"config": {
|
|
320
|
+
"count": 100,
|
|
321
|
+
"size": 2,
|
|
322
|
+
"color": "#ffffff",
|
|
323
|
+
"speed": 1,
|
|
324
|
+
"direction": "up"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### Starfield Layer
|
|
330
|
+
```json
|
|
331
|
+
{
|
|
332
|
+
"type": "starfield",
|
|
333
|
+
"config": {
|
|
334
|
+
"density": 0.5,
|
|
335
|
+
"twinkle": true,
|
|
336
|
+
"colors": ["#ffffff", "#ffffcc"]
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## Animation System
|
|
342
|
+
|
|
343
|
+
### Easing Functions
|
|
344
|
+
|
|
345
|
+
Supported easing functions:
|
|
346
|
+
- **Linear**: `linear`
|
|
347
|
+
- **Standard**: `ease`, `ease-in`, `ease-out`, `ease-in-out`
|
|
348
|
+
- **Sine**: `ease-in-sine`, `ease-out-sine`, `ease-in-out-sine`
|
|
349
|
+
- **Quadratic**: `ease-in-quad`, `ease-out-quad`, `ease-in-out-quad`
|
|
350
|
+
- **Cubic**: `ease-in-cubic`, `ease-out-cubic`, `ease-in-out-cubic`
|
|
351
|
+
- **Quartic**: `ease-in-quart`, `ease-out-quart`, `ease-in-out-quart`
|
|
352
|
+
- **Quintic**: `ease-in-quint`, `ease-out-quint`, `ease-in-out-quint`
|
|
353
|
+
- **Exponential**: `ease-in-expo`, `ease-out-expo`, `ease-in-out-expo`
|
|
354
|
+
- **Circular**: `ease-in-circ`, `ease-out-circ`, `ease-in-out-circ`
|
|
355
|
+
- **Back**: `ease-in-back`, `ease-out-back`, `ease-in-out-back`
|
|
356
|
+
- **Elastic**: `ease-in-elastic`, `ease-out-elastic`, `ease-in-out-elastic`
|
|
357
|
+
- **Bounce**: `ease-in-bounce`, `ease-out-bounce`, `ease-in-out-bounce`
|
|
358
|
+
- **Custom**: `cubic-bezier(x1,y1,x2,y2)`
|
|
359
|
+
|
|
360
|
+
### Animation Examples
|
|
361
|
+
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"animations": [
|
|
365
|
+
{
|
|
366
|
+
"property": "opacity",
|
|
367
|
+
"from": 0,
|
|
368
|
+
"to": 1,
|
|
369
|
+
"startMs": 0,
|
|
370
|
+
"endMs": 1000,
|
|
371
|
+
"easing": "ease-in-out"
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
"property": "transform.scale",
|
|
375
|
+
"from": 0.5,
|
|
376
|
+
"to": 1.2,
|
|
377
|
+
"startMs": 500,
|
|
378
|
+
"endMs": 1500,
|
|
379
|
+
"easing": "ease-out-back"
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"property": "config.color",
|
|
383
|
+
"from": "#ff0000",
|
|
384
|
+
"to": "#0000ff",
|
|
385
|
+
"startMs": 0,
|
|
386
|
+
"endMs": 2000,
|
|
387
|
+
"easing": "linear"
|
|
388
|
+
}
|
|
389
|
+
]
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## Audio System
|
|
394
|
+
|
|
395
|
+
### Audio Track Configuration
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
interface AudioTrackSpec {
|
|
399
|
+
id: string; // Unique identifier
|
|
400
|
+
type: AudioTrackType; // Track type
|
|
401
|
+
src: string; // Audio file path/URL
|
|
402
|
+
startMs: number; // Start time in milliseconds
|
|
403
|
+
endMs?: number; // End time (optional)
|
|
404
|
+
volume?: number; // Volume 0-1 (default: 1)
|
|
405
|
+
fadeIn?: number; // Fade in duration (default: 0)
|
|
406
|
+
fadeOut?: number; // Fade out duration (default: 0)
|
|
407
|
+
loop?: boolean; // Loop track (default: false)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
type AudioTrackType = 'voiceover' | 'ambience' | 'transition' | 'music' | 'sfx';
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Audio Example
|
|
414
|
+
|
|
415
|
+
```json
|
|
416
|
+
{
|
|
417
|
+
"audio": [
|
|
418
|
+
{
|
|
419
|
+
"id": "background-music",
|
|
420
|
+
"type": "ambience",
|
|
421
|
+
"src": "audio/ambient.mp3",
|
|
422
|
+
"startMs": 0,
|
|
423
|
+
"volume": 0.6,
|
|
424
|
+
"fadeIn": 1000,
|
|
425
|
+
"loop": true
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"id": "narrator",
|
|
429
|
+
"type": "voiceover",
|
|
430
|
+
"src": "audio/narration.mp3",
|
|
431
|
+
"startMs": 2000,
|
|
432
|
+
"volume": 1.0,
|
|
433
|
+
"fadeIn": 500,
|
|
434
|
+
"fadeOut": 500
|
|
435
|
+
}
|
|
436
|
+
]
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Performance Optimization
|
|
441
|
+
|
|
442
|
+
### Quality Levels
|
|
443
|
+
|
|
444
|
+
The library automatically adapts performance based on device capabilities:
|
|
445
|
+
|
|
446
|
+
- **Ultra**: Maximum quality, all effects enabled
|
|
447
|
+
- **High**: High quality with some optimizations
|
|
448
|
+
- **Medium**: Balanced quality and performance
|
|
449
|
+
- **Low**: Optimized for performance, reduced effects
|
|
450
|
+
- **Auto**: Automatically adjusts based on device performance
|
|
451
|
+
|
|
452
|
+
### Performance Guidelines
|
|
453
|
+
|
|
454
|
+
1. **Layer Count**: Keep layers under 20 per scene for optimal performance
|
|
455
|
+
2. **Animation Complexity**: Prefer transform and opacity animations over layout changes
|
|
456
|
+
3. **Asset Optimization**: Use compressed images and audio files
|
|
457
|
+
4. **Canvas Particles**: Limit particle count based on target devices
|
|
458
|
+
5. **Audio Tracks**: Use compressed audio formats (MP3, AAC)
|
|
459
|
+
|
|
460
|
+
### Device-Specific Optimizations
|
|
461
|
+
|
|
462
|
+
```typescript
|
|
463
|
+
// The library automatically detects and optimizes for:
|
|
464
|
+
// - Device pixel ratio for sharp rendering
|
|
465
|
+
// - Available memory for asset caching
|
|
466
|
+
// - CPU capabilities for animation complexity
|
|
467
|
+
// - Network conditions for asset loading
|
|
468
|
+
// - Battery status for power-efficient rendering
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
## CLI Tools
|
|
472
|
+
|
|
473
|
+
### Installation
|
|
474
|
+
|
|
475
|
+
The CLI is included with the package:
|
|
476
|
+
|
|
477
|
+
```bash
|
|
478
|
+
npx cinematic-cli --help
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Commands
|
|
482
|
+
|
|
483
|
+
#### Validate Specification
|
|
484
|
+
|
|
485
|
+
```bash
|
|
486
|
+
# Basic validation
|
|
487
|
+
npx cinematic-cli validate --file spec.json
|
|
488
|
+
|
|
489
|
+
# Verbose output with details
|
|
490
|
+
npx cinematic-cli validate --file spec.json --verbose
|
|
491
|
+
|
|
492
|
+
# Save validation report
|
|
493
|
+
npx cinematic-cli validate --file spec.json --output report.json
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
#### Generate Preview
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
# Generate HTML preview
|
|
500
|
+
npx cinematic-cli preview --file spec.json
|
|
501
|
+
|
|
502
|
+
# Save to specific file
|
|
503
|
+
npx cinematic-cli preview --file spec.json --output preview.html
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
## TypeScript Support
|
|
507
|
+
|
|
508
|
+
### Core Interfaces
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
import type {
|
|
512
|
+
CinematicRenderer2D,
|
|
513
|
+
CinematicSpec,
|
|
514
|
+
CinematicEvent,
|
|
515
|
+
CinematicScene,
|
|
516
|
+
LayerSpec,
|
|
517
|
+
AnimationTrackSpec,
|
|
518
|
+
AudioTrackSpec,
|
|
519
|
+
QualityLevel,
|
|
520
|
+
LayerType,
|
|
521
|
+
EasingType
|
|
522
|
+
} from 'cinematic-renderer2d';
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### Custom Layer Development
|
|
526
|
+
|
|
527
|
+
```typescript
|
|
528
|
+
import type { ICinematicLayer, LayerMountContext, FrameContext } from 'cinematic-renderer2d';
|
|
529
|
+
|
|
530
|
+
class CustomLayer implements ICinematicLayer {
|
|
531
|
+
id: string;
|
|
532
|
+
type: string;
|
|
533
|
+
zIndex: number;
|
|
534
|
+
|
|
535
|
+
constructor(config: any) {
|
|
536
|
+
this.id = config.id;
|
|
537
|
+
this.type = config.type;
|
|
538
|
+
this.zIndex = config.zIndex;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
mount(ctx: LayerMountContext): void {
|
|
542
|
+
// Initialize layer
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
update(ctx: FrameContext): void {
|
|
546
|
+
// Update layer per frame
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
destroy(): void {
|
|
550
|
+
// Cleanup resources
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
## Examples
|
|
556
|
+
|
|
557
|
+
### Complete Specification Example
|
|
558
|
+
|
|
559
|
+
```json
|
|
560
|
+
{
|
|
561
|
+
"schemaVersion": "1.0.0",
|
|
562
|
+
"engine": {
|
|
563
|
+
"targetFps": 60,
|
|
564
|
+
"quality": "auto",
|
|
565
|
+
"debug": false
|
|
566
|
+
},
|
|
567
|
+
"events": [
|
|
568
|
+
{
|
|
569
|
+
"id": "intro",
|
|
570
|
+
"name": "Introduction Sequence",
|
|
571
|
+
"scenes": ["fade-in", "title-reveal", "fade-out"]
|
|
572
|
+
}
|
|
573
|
+
],
|
|
574
|
+
"scenes": [
|
|
575
|
+
{
|
|
576
|
+
"id": "fade-in",
|
|
577
|
+
"name": "Fade In",
|
|
578
|
+
"duration": 2000,
|
|
579
|
+
"layers": [
|
|
580
|
+
{
|
|
581
|
+
"id": "background",
|
|
582
|
+
"type": "gradient",
|
|
583
|
+
"zIndex": 1,
|
|
584
|
+
"config": {
|
|
585
|
+
"colors": ["#000000", "#1a1a1a"],
|
|
586
|
+
"direction": "to bottom"
|
|
587
|
+
},
|
|
588
|
+
"animations": [
|
|
589
|
+
{
|
|
590
|
+
"property": "opacity",
|
|
591
|
+
"from": 0,
|
|
592
|
+
"to": 1,
|
|
593
|
+
"startMs": 0,
|
|
594
|
+
"endMs": 2000,
|
|
595
|
+
"easing": "ease-in-out"
|
|
596
|
+
}
|
|
597
|
+
]
|
|
598
|
+
}
|
|
599
|
+
]
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"id": "title-reveal",
|
|
603
|
+
"name": "Title Reveal",
|
|
604
|
+
"duration": 3000,
|
|
605
|
+
"layers": [
|
|
606
|
+
{
|
|
607
|
+
"id": "title",
|
|
608
|
+
"type": "textBlock",
|
|
609
|
+
"zIndex": 2,
|
|
610
|
+
"config": {
|
|
611
|
+
"text": "Welcome to CinematicRenderer2D",
|
|
612
|
+
"fontSize": "48px",
|
|
613
|
+
"color": "#ffffff",
|
|
614
|
+
"textAlign": "center"
|
|
615
|
+
},
|
|
616
|
+
"animations": [
|
|
617
|
+
{
|
|
618
|
+
"property": "transform.scale",
|
|
619
|
+
"from": 0.5,
|
|
620
|
+
"to": 1,
|
|
621
|
+
"startMs": 0,
|
|
622
|
+
"endMs": 1000,
|
|
623
|
+
"easing": "ease-out-back"
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
"property": "opacity",
|
|
627
|
+
"from": 0,
|
|
628
|
+
"to": 1,
|
|
629
|
+
"startMs": 0,
|
|
630
|
+
"endMs": 800,
|
|
631
|
+
"easing": "ease-out"
|
|
632
|
+
}
|
|
633
|
+
]
|
|
634
|
+
}
|
|
635
|
+
],
|
|
636
|
+
"audio": [
|
|
637
|
+
{
|
|
638
|
+
"id": "title-sound",
|
|
639
|
+
"type": "sfx",
|
|
640
|
+
"src": "audio/title-reveal.mp3",
|
|
641
|
+
"startMs": 500,
|
|
642
|
+
"volume": 0.8,
|
|
643
|
+
"fadeIn": 200
|
|
644
|
+
}
|
|
645
|
+
]
|
|
646
|
+
}
|
|
647
|
+
]
|
|
648
|
+
}
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
## Development
|
|
652
|
+
|
|
653
|
+
### Project Structure
|
|
654
|
+
|
|
655
|
+
```
|
|
656
|
+
src/
|
|
657
|
+
├── core/ # Core engine and interfaces
|
|
658
|
+
│ ├── CinematicRenderer2D.ts
|
|
659
|
+
│ ├── LayerRegistry.ts
|
|
660
|
+
│ ├── Scheduler.ts
|
|
661
|
+
│ └── interfaces/
|
|
662
|
+
├── types/ # TypeScript definitions
|
|
663
|
+
│ ├── CinematicSpec.ts
|
|
664
|
+
│ ├── CompiledSpec.ts
|
|
665
|
+
│ └── AssetTypes.ts
|
|
666
|
+
├── parsing/ # JSON specification parsing
|
|
667
|
+
│ └── SpecParser.ts
|
|
668
|
+
├── animation/ # Animation system
|
|
669
|
+
│ └── AnimationCompiler.ts
|
|
670
|
+
├── rendering/ # Rendering backends
|
|
671
|
+
│ ├── RenderBackend.ts
|
|
672
|
+
│ ├── dom/
|
|
673
|
+
│ └── canvas2d/
|
|
674
|
+
├── assets/ # Asset management
|
|
675
|
+
│ └── AssetManager.ts
|
|
676
|
+
├── audio/ # Audio system
|
|
677
|
+
│ └── AudioSystem.ts
|
|
678
|
+
├── performance/ # Performance monitoring
|
|
679
|
+
│ └── QualitySystem.ts
|
|
680
|
+
├── debug/ # Debug tools
|
|
681
|
+
│ └── DebugOverlay.ts
|
|
682
|
+
├── cli/ # CLI tools
|
|
683
|
+
│ └── index.ts
|
|
684
|
+
└── adapters/ # Framework adapters
|
|
685
|
+
├── react/
|
|
686
|
+
└── angular/
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### Available Scripts
|
|
690
|
+
|
|
691
|
+
```bash
|
|
692
|
+
npm run dev # Start development playground
|
|
693
|
+
npm run build # Build library for production
|
|
694
|
+
npm run build:check # Build and validate output
|
|
695
|
+
npm run test # Run test suite
|
|
696
|
+
npm run test:ui # Run tests with UI
|
|
697
|
+
npm run test:coverage # Run tests with coverage
|
|
698
|
+
npm run lint # Lint code
|
|
699
|
+
npm run lint:fix # Fix linting issues
|
|
700
|
+
npm run typecheck # Type checking
|
|
701
|
+
npm run preview # Preview built playground
|
|
702
|
+
npm run changeset # Create changeset for release
|
|
703
|
+
npm run version # Update version with changesets
|
|
704
|
+
npm run release # Publish to NPM
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
### Testing
|
|
708
|
+
|
|
709
|
+
The project uses comprehensive testing with:
|
|
710
|
+
- **Unit Tests**: Specific functionality testing
|
|
711
|
+
- **Property-Based Tests**: Universal behavior validation
|
|
712
|
+
- **Integration Tests**: End-to-end workflow testing
|
|
713
|
+
- **Build Tests**: Distribution package validation
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
# Run all tests
|
|
717
|
+
npm test
|
|
718
|
+
|
|
719
|
+
# Run specific test file
|
|
720
|
+
npm test -- src/core/Scheduler.test.ts
|
|
721
|
+
|
|
722
|
+
# Run tests in watch mode
|
|
723
|
+
npm test -- --watch
|
|
724
|
+
|
|
725
|
+
# Run with coverage
|
|
726
|
+
npm run test:coverage
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
## Browser Support
|
|
730
|
+
|
|
731
|
+
- **Modern Browsers**: Chrome 80+, Firefox 75+, Safari 13+, Edge 80+
|
|
732
|
+
- **Node.js**: 16.0.0+ (for CLI tools)
|
|
733
|
+
- **ES Modules**: Full ESM support with CJS fallback
|
|
734
|
+
- **TypeScript**: 4.5+ for full type support
|
|
735
|
+
|
|
736
|
+
## Performance Benchmarks
|
|
737
|
+
|
|
738
|
+
Typical performance on modern devices:
|
|
739
|
+
- **Desktop**: 120fps with 50+ layers
|
|
740
|
+
- **Mobile**: 60fps with 20+ layers
|
|
741
|
+
- **Bundle Size**: ~83KB minified + gzipped
|
|
742
|
+
- **Memory Usage**: <50MB for complex scenes
|
|
743
|
+
- **Startup Time**: <100ms initialization
|
|
744
|
+
|
|
745
|
+
## Troubleshooting
|
|
746
|
+
|
|
747
|
+
### Common Issues
|
|
748
|
+
|
|
749
|
+
**Build Errors**
|
|
750
|
+
```bash
|
|
751
|
+
# Clear node_modules and reinstall
|
|
752
|
+
rm -rf node_modules package-lock.json
|
|
753
|
+
npm install
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
**Type Errors**
|
|
757
|
+
```bash
|
|
758
|
+
# Ensure TypeScript is up to date
|
|
759
|
+
npm install typescript@latest --save-dev
|
|
760
|
+
npm run typecheck
|
|
761
|
+
```
|
|
762
|
+
|
|
763
|
+
**Performance Issues**
|
|
764
|
+
- Reduce layer count per scene
|
|
765
|
+
- Use 'low' or 'medium' quality settings
|
|
766
|
+
- Optimize asset file sizes
|
|
767
|
+
- Enable debug mode to monitor FPS
|
|
768
|
+
|
|
769
|
+
### Debug Mode
|
|
770
|
+
|
|
771
|
+
Enable debug mode to monitor performance:
|
|
772
|
+
|
|
773
|
+
```typescript
|
|
774
|
+
const renderer = new CinematicRenderer2D({
|
|
775
|
+
container: element,
|
|
776
|
+
spec: {
|
|
777
|
+
// ... your spec
|
|
778
|
+
engine: { debug: true }
|
|
779
|
+
}
|
|
780
|
+
});
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
Debug overlay shows:
|
|
784
|
+
- Current FPS and frame time
|
|
785
|
+
- Active layers and their status
|
|
786
|
+
- Memory usage statistics
|
|
787
|
+
- Quality level and adaptations
|
|
788
|
+
|
|
789
|
+
## Contributing
|
|
790
|
+
|
|
791
|
+
This project follows semantic versioning and uses changesets for release management.
|
|
792
|
+
|
|
793
|
+
### Development Setup
|
|
794
|
+
|
|
795
|
+
```bash
|
|
796
|
+
git clone https://github.com/rvshekhar10/cinematic-renderer2d.git
|
|
797
|
+
cd cinematic-renderer2d
|
|
798
|
+
npm install
|
|
799
|
+
npm run dev
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
### Creating Changes
|
|
803
|
+
|
|
804
|
+
```bash
|
|
805
|
+
# Make your changes
|
|
806
|
+
npm run changeset # Document your changes
|
|
807
|
+
npm run test # Ensure tests pass
|
|
808
|
+
npm run build # Verify build works
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
### Publishing to NPM
|
|
812
|
+
|
|
813
|
+
See our publishing guides:
|
|
814
|
+
- 🚀 [Quick Publish Guide](./QUICK_PUBLISH.md) - Fast 5-minute guide
|
|
815
|
+
- 📚 [Complete Publishing Guide](./PUBLISHING.md) - Detailed instructions
|
|
816
|
+
- ✅ [Publishing Checklist](./PUBLISH_CHECKLIST.md) - Step-by-step checklist
|
|
817
|
+
|
|
818
|
+
## License
|
|
819
|
+
|
|
820
|
+
MIT License - see [LICENSE](LICENSE) file for details.
|
|
821
|
+
|
|
822
|
+
## Support
|
|
823
|
+
|
|
824
|
+
- 📖 **Documentation**: This README and TypeScript definitions
|
|
825
|
+
- 🐛 **Issues**: [GitHub Issues](https://github.com/rvshekhar10/cinematic-renderer2d/issues)
|
|
826
|
+
- 💬 **Discussions**: [GitHub Discussions](https://github.com/rvshekhar10/cinematic-renderer2d/discussions)
|
|
827
|
+
- 📧 **Email**: support@cinematicrenderer2d.com
|