reze-engine 0.2.6 → 0.2.8

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/README.md CHANGED
@@ -14,37 +14,30 @@ A lightweight engine built with WebGPU and TypeScript for real-time 3D anime cha
14
14
  - MSAA 4x anti-aliasing
15
15
  - GPU-accelerated skinning
16
16
  - Bone rotation api
17
+ - VMD animation
17
18
 
18
19
  ## Usage
19
20
 
20
- ```typescript
21
- export default function Home() {
22
- const canvasRef = useRef<HTMLCanvasElement>(null)
23
- const engineRef = useRef<Engine | null>(null)
24
- const [engineError, setEngineError] = useState<string | null>(null)
25
- const [loading, setLoading] = useState(true)
26
- const [stats, setStats] = useState<EngineStats>({
27
- fps: 0,
28
- frameTime: 0,
29
- gpuMemory: 0,
30
- })
31
- const [progress, setProgress] = useState(0)
21
+ ```javascript
22
+ export default function Scene() {
23
+ const canvasRef = useRef < HTMLCanvasElement > null
24
+ const engineRef = useRef < Engine > null
32
25
 
33
26
  const initEngine = useCallback(async () => {
34
27
  if (canvasRef.current) {
35
- // Initialize engine
36
28
  try {
37
- const engine = new Engine(canvasRef.current)
29
+ const engine = new Engine(canvasRef.current, {
30
+ ambient: 1.0,
31
+ rimLightIntensity: 0.1,
32
+ bloomIntensity: 0.1,
33
+ })
38
34
  engineRef.current = engine
39
35
  await engine.init()
40
36
  await engine.loadModel("/models/塞尔凯特/塞尔凯特.pmx")
41
- setLoading(false)
42
37
 
43
- engine.runRenderLoop(() => {
44
- setStats(engine.getStats())
45
- })
38
+ engine.runRenderLoop(() => {})
46
39
  } catch (error) {
47
- setEngineError(error instanceof Error ? error.message : "Unknown error")
40
+ console.error(error)
48
41
  }
49
42
  }
50
43
  }, [])
@@ -54,7 +47,6 @@ export default function Home() {
54
47
  initEngine()
55
48
  })()
56
49
 
57
- // Cleanup on unmount
58
50
  return () => {
59
51
  if (engineRef.current) {
60
52
  engineRef.current.dispose()
@@ -62,43 +54,18 @@ export default function Home() {
62
54
  }
63
55
  }, [initEngine])
64
56
 
65
- useEffect(() => {
66
- if (loading) {
67
- const interval = setInterval(() => {
68
- setProgress((prev) => {
69
- if (prev >= 100) {
70
- return 0
71
- }
72
- return prev + 1
73
- })
74
- }, 50)
57
+ return <canvas ref={canvasRef} className="w-full h-full" />
58
+ }
59
+ ```
75
60
 
76
- return () => clearInterval(interval)
77
- }
78
- }, [loading])
61
+ ## Projects Using This Engine
79
62
 
80
- return (
81
- <div
82
- className="fixed inset-0 w-full h-full overflow-hidden touch-none"
83
- style={{
84
- background:
85
- "radial-gradient(ellipse at center, rgba(35, 35, 45, 0.8) 0%, rgba(35, 35, 45, 0.8) 8%, rgba(8, 8, 12, 0.95) 65%, rgba(0, 0, 0, 1) 100%)",
86
- }}
87
- >
88
- <Header stats={stats} />
63
+ - **[MiKaPo](https://mikapo.vercel.app)** - Online real-time motion capture for MMD using webcam and MediaPipe
64
+ - **[Popo](https://popo.love)** - Fine-tuned LLM that generates MMD poses from natural language descriptions
65
+ - **[MPL](https://mmd-mpl.vercel.app)** - Semantic motion programming language for scripting MMD animations with intuitive syntax
89
66
 
90
- {engineError && (
91
- <div className="absolute inset-0 w-full h-full flex items-center justify-center text-white p-6">
92
- Engine Error: {engineError}
93
- </div>
94
- )}
95
- {loading && !engineError && (
96
- <div className="absolute inset-0 max-w-xs mx-auto w-full h-full flex items-center justify-center text-white p-6">
97
- <Progress value={progress} className="rounded-none" />
98
- </div>
99
- )}
100
- <canvas ref={canvasRef} className="absolute inset-0 w-full h-full touch-none z-1" />
101
- </div>
102
- )
103
- }
104
- ```
67
+ ## Tutorial
68
+
69
+ Learn WebGPU from scratch by building an anime character renderer in incremental steps. The tutorial covers the complete rendering pipeline from a simple triangle to fully textured, skeletal-animated characters.
70
+
71
+ [How to Render an Anime Character with WebGPU](https://reze.one/tutorial)
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/engine.js CHANGED
@@ -541,11 +541,14 @@ export class Engine {
541
541
  },
542
542
  ],
543
543
  },
544
- primitive: { cullMode: "none" },
544
+ primitive: { cullMode: "front" },
545
545
  depthStencil: {
546
546
  format: "depth24plus-stencil8",
547
- depthWriteEnabled: false, // Don't write depth
548
- depthCompare: "less", // Respect existing depth
547
+ depthWriteEnabled: true, // Write depth to occlude back of head
548
+ depthCompare: "less-equal", // More lenient to reduce precision conflicts
549
+ depthBias: -0.00005, // Reduced bias to minimize conflicts while still occluding back face
550
+ depthBiasSlopeScale: 0.0,
551
+ depthBiasClamp: 0.0,
549
552
  stencilFront: {
550
553
  compare: "always",
551
554
  failOp: "keep",
@@ -639,11 +642,14 @@ export class Engine {
639
642
  },
640
643
  ],
641
644
  },
642
- primitive: { cullMode: "none" },
645
+ primitive: { cullMode: "front" },
643
646
  depthStencil: {
644
647
  format: "depth24plus-stencil8",
645
648
  depthWriteEnabled: true,
646
- depthCompare: "less",
649
+ depthCompare: "less-equal", // Match the color pass compare mode for consistency
650
+ depthBias: 0.0,
651
+ depthBiasSlopeScale: 0.0,
652
+ depthBiasClamp: 0.0,
647
653
  },
648
654
  multisample: { count: this.sampleCount },
649
655
  });
@@ -692,11 +698,11 @@ export class Engine {
692
698
  },
693
699
  ],
694
700
  },
695
- primitive: { cullMode: "none" },
701
+ primitive: { cullMode: "front" },
696
702
  depthStencil: {
697
703
  format: "depth24plus-stencil8",
698
704
  depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
699
- depthCompare: "equal", // Only render where depth matches pre-pass
705
+ depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
700
706
  stencilFront: {
701
707
  compare: "equal", // Only render where stencil == 1 (over eyes)
702
708
  failOp: "keep",
@@ -757,11 +763,11 @@ export class Engine {
757
763
  },
758
764
  ],
759
765
  },
760
- primitive: { cullMode: "none" },
766
+ primitive: { cullMode: "front" },
761
767
  depthStencil: {
762
768
  format: "depth24plus-stencil8",
763
769
  depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
764
- depthCompare: "equal", // Only render where depth matches pre-pass
770
+ depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
765
771
  stencilFront: {
766
772
  compare: "not-equal", // Only render where stencil != 1 (over non-eyes)
767
773
  failOp: "keep",
@@ -1860,10 +1866,6 @@ export class Engine {
1860
1866
  intensityData[0] = this.bloomIntensity;
1861
1867
  this.device.queue.writeBuffer(this.bloomIntensityBuffer, 0, intensityData);
1862
1868
  const encoder = this.device.createCommandEncoder();
1863
- const width = this.canvas.width;
1864
- const height = this.canvas.height;
1865
- const bloomWidth = Math.floor(width / this.BLOOM_DOWNSCALE_FACTOR);
1866
- const bloomHeight = Math.floor(height / this.BLOOM_DOWNSCALE_FACTOR);
1867
1869
  // Extract bright areas
1868
1870
  const extractPass = encoder.beginRenderPass({
1869
1871
  label: "bloom extract",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reze-engine",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "A WebGPU-based MMD model renderer",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
package/src/engine.ts CHANGED
@@ -641,11 +641,14 @@ export class Engine {
641
641
  },
642
642
  ],
643
643
  },
644
- primitive: { cullMode: "none" },
644
+ primitive: { cullMode: "front" },
645
645
  depthStencil: {
646
646
  format: "depth24plus-stencil8",
647
- depthWriteEnabled: false, // Don't write depth
648
- depthCompare: "less", // Respect existing depth
647
+ depthWriteEnabled: true, // Write depth to occlude back of head
648
+ depthCompare: "less-equal", // More lenient to reduce precision conflicts
649
+ depthBias: -0.00005, // Reduced bias to minimize conflicts while still occluding back face
650
+ depthBiasSlopeScale: 0.0,
651
+ depthBiasClamp: 0.0,
649
652
  stencilFront: {
650
653
  compare: "always",
651
654
  failOp: "keep",
@@ -741,11 +744,14 @@ export class Engine {
741
744
  },
742
745
  ],
743
746
  },
744
- primitive: { cullMode: "none" },
747
+ primitive: { cullMode: "front" },
745
748
  depthStencil: {
746
749
  format: "depth24plus-stencil8",
747
750
  depthWriteEnabled: true,
748
- depthCompare: "less",
751
+ depthCompare: "less-equal", // Match the color pass compare mode for consistency
752
+ depthBias: 0.0,
753
+ depthBiasSlopeScale: 0.0,
754
+ depthBiasClamp: 0.0,
749
755
  },
750
756
  multisample: { count: this.sampleCount },
751
757
  })
@@ -795,11 +801,11 @@ export class Engine {
795
801
  },
796
802
  ],
797
803
  },
798
- primitive: { cullMode: "none" },
804
+ primitive: { cullMode: "front" },
799
805
  depthStencil: {
800
806
  format: "depth24plus-stencil8",
801
807
  depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
802
- depthCompare: "equal", // Only render where depth matches pre-pass
808
+ depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
803
809
  stencilFront: {
804
810
  compare: "equal", // Only render where stencil == 1 (over eyes)
805
811
  failOp: "keep",
@@ -861,11 +867,11 @@ export class Engine {
861
867
  },
862
868
  ],
863
869
  },
864
- primitive: { cullMode: "none" },
870
+ primitive: { cullMode: "front" },
865
871
  depthStencil: {
866
872
  format: "depth24plus-stencil8",
867
873
  depthWriteEnabled: false, // Don't write depth (already written in pre-pass)
868
- depthCompare: "equal", // Only render where depth matches pre-pass
874
+ depthCompare: "less-equal", // More lenient than "equal" to avoid precision issues with MSAA
869
875
  stencilFront: {
870
876
  compare: "not-equal", // Only render where stencil != 1 (over non-eyes)
871
877
  failOp: "keep",
@@ -2117,10 +2123,6 @@ export class Engine {
2117
2123
  this.device.queue.writeBuffer(this.bloomIntensityBuffer, 0, intensityData)
2118
2124
 
2119
2125
  const encoder = this.device.createCommandEncoder()
2120
- const width = this.canvas.width
2121
- const height = this.canvas.height
2122
- const bloomWidth = Math.floor(width / this.BLOOM_DOWNSCALE_FACTOR)
2123
- const bloomHeight = Math.floor(height / this.BLOOM_DOWNSCALE_FACTOR)
2124
2126
 
2125
2127
  // Extract bright areas
2126
2128
  const extractPass = encoder.beginRenderPass({