@jucie-engine/painter 1.0.1
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 +21 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @jucie-engine/painter
|
|
2
|
+
|
|
3
|
+
Canvas painting service for `@jucie-engine/core`. This service provides a reactive rendering system for HTML5 canvas with support for multiple context types.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @jucie-engine/painter
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Refer to the main [README.md](../../README.md) for comprehensive usage examples and API reference.
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- **Reactive Rendering**: Automatically re-render when state changes using @jucie-state/core
|
|
18
|
+
- **Multiple Context Types**: Support for 2D, WebGL, and other canvas contexts
|
|
19
|
+
- **Canvas Management**: Handle canvas lifecycle and context creation
|
|
20
|
+
- **Engine Integration**: Seamlessly integrates with @jucie-engine/core services
|
|
21
|
+
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var $=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var k=(m,e)=>{for(var t in e)$(m,t,{get:e[t],enumerable:!0})},O=(m,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of D(e))!U.call(m,n)&&n!==t&&$(m,n,{get:()=>e[n],enumerable:!(s=P(e,n))||s.enumerable});return m};var j=m=>O($({},"__esModule",{value:!0}),m);var W={};k(W,{Painter:()=>S,defineBrush:()=>_,defineLayer:()=>A});module.exports=j(W);var F=require("@jucie-engine/core");var v={"2D":"2d",WEBGL:"webgl",WEBGL2:"webgl2",BITMAPRENDERER:"bitmaprenderer"};var R=require("@jucie-state/reactive"),p=require("@jucie-engine/core"),_=(0,p.createDefinition)("BRUSH",[Object]),A=(0,p.createDefinition)("LAYER",[Object]),S=class extends F.ServiceProvider{#s=new Map;#i=null;#t=new Map;#r=new Map;#h=new Map;#a=!1;#n=null;#b=!1;#c=!1;#f=!1;#e={lastFrameTime:0,deltaTime:0,elapsedTime:0,frameCount:0};#o={fps:0,frameTime:0,layerTimes:new Map,brushTimes:new Map,skippedFrames:0};static manifest={name:"Painter",namespace:"painter",version:"1.0.0",defaults:{targetFPS:60,fixedTimeStep:1e3/60,timeScale:1,debug:{enabled:!1,showFPS:!0,showBounds:!0,showLayerTiming:!0}}};actions(e){return{addLayer:t=>this.addLayer(t),addLayers:(...t)=>{for(let s of t)this.addLayer(s)},updateCanvas:t=>this.updateCanvas(t),setCanvas:t=>this.setCanvas(t),setAssets:t=>this.setAssets(t),removeLayer:t=>this.removeLayer(t),start:()=>this.start(),stop:()=>this.stop(),render:()=>this.render(),setTargetFPS:t=>this.setTargetFPS(t),setTimeScale:t=>this.setTimeScale(t),setFixedTimeStep:t=>this.setFixedTimeStep(t),setDebug:t=>this.setDebug(t),getMetrics:()=>this.getMetrics()}}setCanvas(e){this.#i=e,Object.values(v).forEach(t=>{try{let s=e.getContext(t);s&&this.#t.set(t,s)}catch{console.warn(`Context type ${t} not supported`)}})}updateCanvas(e){let t=e(this.#i);t&&(this.#i=t)}setAssets(e){this.#h=e}start(){this.#a||(this.#a=!0,this.#l())}stop(){this.#a&&(this.#a=!1,this.#n&&(cancelAnimationFrame(this.#n),this.#n=null))}addLayer(e){var a;if((0,p.definitionType)(e)!=="LAYER")throw new Error("Invalid layer definition");let t=e._name,s=e(this.useContext);if(s.data){let c=this.#d(`layer_${t}`,s.data);c&&this.#r.set(`layer_${t}`,c)}let n=s.children.map(c=>{var h;if((0,p.definitionType)(c)==="BRUSH"){let T=c._name,g=c(),x=this.#d(`brush_${T}`,g.data),w=(0,R.createReactor)(g.when,{immediate:!0,context:this.useContext("state")}),y={name:T,...g,dataReactor:x,whenReactor:w};if((h=y.lifecycle)!=null&&h.onMount)try{y.lifecycle.onMount(this.#t.get(y.context||s.context))}catch(E){console.error(`Error in brush "${y.name}" onMount:`,E)}return y}return this.addLayer(c)}),i={...s,name:t,brushes:n,context:this.#t.get(s.context)};if(this.#s.set(t,i),(a=i.lifecycle)!=null&&a.onMount)try{i.lifecycle.onMount(i.context)}catch(c){console.error(`Error in layer "${t}" onMount:`,c)}return i}removeLayer(e){var n;let t=this.#s.get(e);if(!t)return;if((n=t.lifecycle)!=null&&n.onUnmount)try{t.lifecycle.onUnmount(t.context)}catch(i){console.error(`Error in layer "${e}" onUnmount:`,i)}t.brushes.forEach(i=>{var c;if((c=i.lifecycle)!=null&&c.onUnmount)try{i.lifecycle.onUnmount(this.#t.get(i.context||t.context))}catch(h){console.error(`Error in brush "${i.name}" onUnmount:`,h)}let a=this.#r.get(`painter_brush_${i.name}`);a&&(a.unsubscribe(),a.reactor.destroy(),this.#r.delete(`painter_brush_${i.name}`))});let s=this.#r.get(`painter_layer_${e}`);s&&(s.unsubscribe(),s.reactor.destroy(),this.#r.delete(`painter_layer_${e}`)),this.#s.delete(e)}#l(){this.#f||this.#c||(this.#f=!0,this.#n=requestAnimationFrame(()=>{this.#f=!1,this.#n=null,this.#u()}))}async#u(){var e,t,s,n,i,a,c,h,T,g,x,w,y,E,L,C,M;if(this.#i){this.#c=!0;try{let z=(e=this.config.debug)!=null&&e.enabled?performance.now():0;this.#t.forEach(o=>{o.clearRect(0,0,this.#i.width,this.#i.height)});for(let o of this.#s.values()){let B=(t=this.config.debug)!=null&&t.enabled?performance.now():0;if(o.whenReactor){let r=(s=this.#r.get(`painter_layer_${o.name}`))==null?void 0:s.reactor;if(!o.when(r()))continue}let l=o.context;if(l){if((n=o.lifecycle)!=null&&n.beforeRender)try{o.lifecycle.beforeRender(l,this.#e)}catch(r){console.error(`Error in layer "${o.name}" beforeRender:`,r),(i=o.lifecycle)!=null&&i.onError&&o.lifecycle.onError(r)}l.save(),o.settings&&Object.entries(o.settings).forEach(([r,b])=>{typeof l[r]=="function"?l[r](...Array.isArray(b)?b:[b]):l[r]=b});for(let r of o.brushes){let b=(a=this.config.debug)!=null&&a.enabled?performance.now():0;if(r.whenReactor&&!r.whenReactor())continue;let d=r.context?this.#t.get(r.context):l;if(d){if((c=r.lifecycle)!=null&&c.beforeRender)try{r.lifecycle.beforeRender(d,this.#e)}catch(f){console.error(`Error in brush "${r.name}" beforeRender:`,f),(h=r.lifecycle)!=null&&h.onError&&r.lifecycle.onError(f);continue}d.save(),r.settings&&Object.entries(r.settings).forEach(([f,u])=>{typeof d[f]=="function"?d[f](...Array.isArray(u)?u:[u]):d[f]=u});try{let f={};if(r.assets)for(let u of r.assets)f[u]=this.#h.get(u);if(r.render(d,r.dataReactor(),f,this.#e),(T=r.lifecycle)!=null&&T.afterRender&&r.lifecycle.afterRender(d,this.#e),(g=this.config.debug)!=null&&g.enabled){let u=performance.now()-b;this.#o.brushTimes.set(r.name,u),(x=this.config.debug)!=null&&x.showBounds&&this.#m(d,r)}}catch(f){console.error(`Error in brush "${r.name}":`,f),(w=r.lifecycle)!=null&&w.onError&&r.lifecycle.onError(f)}finally{d.restore()}}}if(l.restore(),(y=o.lifecycle)!=null&&y.afterRender)try{o.lifecycle.afterRender(l,this.#e)}catch(r){console.error(`Error in layer "${o.name}" afterRender:`,r),(E=o.lifecycle)!=null&&E.onError&&o.lifecycle.onError(r)}if((L=this.config.debug)!=null&&L.enabled){let r=performance.now()-B;this.#o.layerTimes.set(o.name,r),(C=this.config.debug)!=null&&C.showBounds&&this.#y(l,o)}}}(M=this.config.debug)!=null&&M.enabled&&this.#g()}finally{this.#c=!1}}}#m(e,t){e.save(),e.strokeStyle="rgba(0, 255, 0, 0.5)",e.lineWidth=1,e.strokeRect(0,0,e.canvas.width,e.canvas.height),e.restore()}#y(e,t){e.save(),e.strokeStyle="rgba(255, 0, 0, 0.5)",e.lineWidth=2,e.strokeRect(0,0,e.canvas.width,e.canvas.height),e.restore()}#g(){var n,i;let e=this.#t.get(v["2D"]);if(!e)return;e.save(),e.resetTransform(),e.font="12px monospace",e.fillStyle="white",e.strokeStyle="black",e.lineWidth=3;let t=20,s=15;if((n=this.config.debug)!=null&&n.showFPS){let a=`FPS: ${Math.round(this.#o.fps)} (${this.#e.deltaTime.toFixed(2)}ms)`;e.strokeText(a,10,t),e.fillText(a,10,t),t+=s}if((i=this.config.debug)!=null&&i.showLayerTiming){e.fillText("Layer Times:",10,t),t+=s;for(let[a,c]of this.#o.layerTimes){let h=` ${a}: ${c.toFixed(2)}ms`;e.strokeText(h,10,t),e.fillText(h,10,t),t+=s}e.fillText(this.state.get(["_transitions","pointer","currentState"]),10,t)}e.restore()}handleResize(e,t){var s,n;for(let i of this.#s.values())if((s=i.lifecycle)!=null&&s.onResize)try{i.lifecycle.onResize(e,t,i.context)}catch(a){console.error(`Error in layer "${i.name}" onResize:`,a),(n=i.lifecycle)!=null&&n.onError&&i.lifecycle.onError(a)}}#d(e,t){let s=this.useContext("state"),n=(0,R.createReactor)(t,{immediate:!0,context:s}),i=(0,R.addEffect)(n,()=>this.#l());return this.#r.set(`painter_${e}`,{reactor:n,unsubscribe:i}),n}destroy(){this.stop();for(let e of this.#s.keys())this.removeLayer(e)}setTargetFPS(e){this.config.targetFPS=e,this.config.fixedTimeStep=1e3/e}setTimeScale(e){this.config.timeScale=Math.max(0,e)}setFixedTimeStep(e){this.config.fixedTimeStep=e}setDebug(e={}){this.config.debug||(this.config.debug={}),Object.assign(this.config.debug,e)}getMetrics(){return{...this.#o,deltaTime:this.#e.deltaTime,elapsedTime:this.#e.elapsedTime,frameCount:this.#e.frameCount}}};0&&(module.exports={Painter,defineBrush,defineLayer});
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/main.js", "../src/Painter.js", "../src/ContextTypes.js"],
|
|
4
|
+
"sourcesContent": ["export { Painter, defineLayer, defineBrush } from './Painter';\n", "import { ServiceProvider } from '@jucie-engine/core';\nimport { ContextTypes } from './ContextTypes.js';\nimport { createReactor, isReactor, addEffect } from '@jucie-state/reactive';\nimport { createDefinition, definitionType } from '@jucie-engine/core';\n\nexport const defineBrush = createDefinition('BRUSH', [Object]);\nexport const defineLayer = createDefinition('LAYER', [Object]);\n\nexport class Painter extends ServiceProvider {\n #layers = new Map();\n #canvas = null;\n #contexts = new Map();\n #reactors = new Map();\n #assets = new Map();\n #isRunning = false;\n #frameId = null;\n #renderNeeded = false;\n #isRendering = false;\n #renderScheduled = false;\n\n // Timing state\n #timing = {\n lastFrameTime: 0,\n deltaTime: 0,\n elapsedTime: 0,\n frameCount: 0\n };\n\n // Debug metrics\n #metrics = {\n fps: 0,\n frameTime: 0,\n layerTimes: new Map(),\n brushTimes: new Map(),\n skippedFrames: 0\n };\n\n static manifest = {\n name: 'Painter',\n namespace: 'painter',\n version: '1.0.0',\n defaults: {\n // Timing configuration\n targetFPS: 60,\n fixedTimeStep: 1000 / 60,\n timeScale: 1.0,\n // Debug configuration\n debug: {\n enabled: false,\n showFPS: true,\n showBounds: true,\n showLayerTiming: true\n }\n }\n };\n\n actions(context) {\n return {\n addLayer: (layerDef) => this.addLayer(layerDef),\n addLayers: (...layers) => {\n for (const layer of layers) {\n this.addLayer(layer);\n }\n },\n updateCanvas: (fn) => this.updateCanvas(fn),\n setCanvas: (canvas) => this.setCanvas(canvas),\n setAssets: (assets) => this.setAssets(assets),\n removeLayer: (name) => this.removeLayer(name),\n start: () => this.start(),\n stop: () => this.stop(),\n render: () => this.render(),\n setTargetFPS: (fps) => this.setTargetFPS(fps),\n setTimeScale: (scale) => this.setTimeScale(scale),\n setFixedTimeStep: (step) => this.setFixedTimeStep(step),\n setDebug: (options) => this.setDebug(options),\n getMetrics: () => this.getMetrics()\n };\n }\n\n setCanvas(canvas) {\n this.#canvas = canvas;\n \n // Create contexts for each type\n Object.values(ContextTypes).forEach(type => {\n try {\n const ctx = canvas.getContext(type);\n if (ctx) this.#contexts.set(type, ctx);\n } catch (e) {\n console.warn(`Context type ${type} not supported`);\n }\n });\n }\n\n updateCanvas(fn) {\n const result = fn(this.#canvas);\n if (result) {\n this.#canvas = result;\n }\n }\n\n setAssets(assets) {\n this.#assets = assets;\n }\n\n start() {\n if (!this.#isRunning) {\n this.#isRunning = true;\n this.#scheduleRender();\n }\n }\n\n stop() {\n if (this.#isRunning) {\n this.#isRunning = false;\n if (this.#frameId) {\n cancelAnimationFrame(this.#frameId);\n this.#frameId = null;\n }\n }\n }\n\n addLayer(layerDef) {\n if (definitionType(layerDef) !== 'LAYER') {\n throw new Error('Invalid layer definition');\n }\n\n const name = layerDef._name;\n const config = layerDef(this.useContext);\n \n // Set up layer reactor if it has data paths\n if (config.data) {\n const dataReactor = this.#createDataReactor(`layer_${name}`, config.data);\n if (dataReactor) {\n this.#reactors.set(`layer_${name}`, dataReactor);\n }\n }\n\n // Set up brush reactors and structure\n const brushes = config.children.map(child => {\n if (definitionType(child) === 'BRUSH') {\n const name = child._name;\n const brushConfig = child();\n const dataReactor = this.#createDataReactor(`brush_${name}`, brushConfig.data, );\n const whenReactor = createReactor(brushConfig.when, {\n immediate: true,\n context: this.useContext('state')\n })\n\n const brush = {\n name,\n ...brushConfig,\n dataReactor,\n whenReactor\n };\n\n // Call brush mount hook\n if (brush.lifecycle?.onMount) {\n try {\n brush.lifecycle.onMount(this.#contexts.get(brush.context || config.context));\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\" onMount:`, error);\n }\n }\n\n return brush;\n }\n // Handle nested layers recursively\n return this.addLayer(child);\n });\n\n const layer = {\n ...config,\n name,\n brushes,\n context: this.#contexts.get(config.context)\n };\n\n this.#layers.set(name, layer);\n\n // Call layer mount hook\n if (layer.lifecycle?.onMount) {\n try {\n layer.lifecycle.onMount(layer.context);\n } catch (error) {\n console.error(`Error in layer \"${name}\" onMount:`, error);\n }\n }\n\n return layer;\n }\n\n removeLayer(name) {\n const layer = this.#layers.get(name);\n if (!layer) return;\n\n // Call layer unmount hook\n if (layer.lifecycle?.onUnmount) {\n try {\n layer.lifecycle.onUnmount(layer.context);\n } catch (error) {\n console.error(`Error in layer \"${name}\" onUnmount:`, error);\n }\n }\n\n // Call brush unmount hooks and clean up reactors\n layer.brushes.forEach(brush => {\n if (brush.lifecycle?.onUnmount) {\n try {\n brush.lifecycle.onUnmount(\n this.#contexts.get(brush.context || layer.context)\n );\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\" onUnmount:`, error);\n }\n }\n // Clean up brush reactor and subscription\n const reactorData = this.#reactors.get(`painter_brush_${brush.name}`);\n if (reactorData) {\n reactorData.unsubscribe();\n reactorData.reactor.destroy();\n this.#reactors.delete(`painter_brush_${brush.name}`);\n }\n });\n\n // Clean up layer reactor and subscription\n const layerReactorData = this.#reactors.get(`painter_layer_${name}`);\n if (layerReactorData) {\n layerReactorData.unsubscribe();\n layerReactorData.reactor.destroy();\n this.#reactors.delete(`painter_layer_${name}`);\n }\n\n this.#layers.delete(name);\n }\n\n #scheduleRender() {\n if (this.#renderScheduled || this.#isRendering) return;\n \n this.#renderScheduled = true;\n \n this.#frameId = requestAnimationFrame(() => {\n this.#renderScheduled = false;\n this.#frameId = null;\n this.#render();\n });\n }\n\n async #render() {\n if (!this.#canvas) return;\n this.#isRendering = true;\n \n try { \n const renderStart = this.config.debug?.enabled ? performance.now() : 0;\n\n // Clear all contexts\n this.#contexts.forEach(ctx => {\n ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n });\n\n // Render layers in order\n for (const layer of this.#layers.values()) {\n const layerStart = this.config.debug?.enabled ? performance.now() : 0;\n\n // Check layer condition\n if (layer.whenReactor) {\n const layerReactor = this.#reactors.get(`painter_layer_${layer.name}`)?.reactor;\n if (!layer.when(layerReactor())) continue;\n }\n\n const ctx = layer.context;\n\n if (!ctx) continue;\n\n // Layer beforeRender hook\n if (layer.lifecycle?.beforeRender) {\n try {\n layer.lifecycle.beforeRender(ctx, this.#timing);\n } catch (error) {\n console.error(`Error in layer \"${layer.name}\" beforeRender:`, error);\n if (layer.lifecycle?.onError) layer.lifecycle.onError(error);\n }\n }\n\n // Apply layer settings\n ctx.save();\n if (layer.settings) {\n Object.entries(layer.settings).forEach(([key, value]) => {\n if (typeof ctx[key] === 'function') {\n ctx[key](...(Array.isArray(value) ? value : [value]));\n } else {\n ctx[key] = value;\n }\n });\n }\n\n // Render brushes\n for (const brush of layer.brushes) {\n const brushStart = this.config.debug?.enabled ? performance.now() : 0;\n\n if (brush.whenReactor && !brush.whenReactor()) continue;\n\n\n const brushCtx = brush.context ? \n this.#contexts.get(brush.context) : \n ctx;\n\n if (!brushCtx) continue;\n\n // Brush beforeRender hook\n if (brush.lifecycle?.beforeRender) {\n try {\n brush.lifecycle.beforeRender(brushCtx, this.#timing);\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\" beforeRender:`, error);\n if (brush.lifecycle?.onError) brush.lifecycle.onError(error);\n continue;\n }\n }\n\n brushCtx.save();\n \n if (brush.settings) {\n Object.entries(brush.settings).forEach(([key, value]) => {\n if (typeof brushCtx[key] === 'function') {\n brushCtx[key](...(Array.isArray(value) ? value : [value]));\n } else {\n brushCtx[key] = value;\n }\n });\n }\n \n try {\n const requiredAssets = {};\n if (brush.assets) {\n for (const key of brush.assets) {\n requiredAssets[key] = this.#assets.get(key);\n }\n }\n brush.render(brushCtx, brush.dataReactor(), requiredAssets, this.#timing);\n\n // Brush afterRender hook\n if (brush.lifecycle?.afterRender) {\n brush.lifecycle.afterRender(brushCtx, this.#timing);\n }\n\n if (this.config.debug?.enabled) {\n const brushTime = performance.now() - brushStart;\n this.#metrics.brushTimes.set(brush.name, brushTime);\n\n if (this.config.debug?.showBounds) {\n this.#renderBrushBounds(brushCtx, brush);\n }\n }\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\":`, error);\n if (brush.lifecycle?.onError) brush.lifecycle.onError(error);\n } finally {\n brushCtx.restore();\n }\n }\n\n ctx.restore();\n\n // Layer afterRender hook\n if (layer.lifecycle?.afterRender) {\n try {\n layer.lifecycle.afterRender(ctx, this.#timing);\n } catch (error) {\n console.error(`Error in layer \"${layer.name}\" afterRender:`, error);\n if (layer.lifecycle?.onError) layer.lifecycle.onError(error);\n }\n }\n\n if (this.config.debug?.enabled) {\n const layerTime = performance.now() - layerStart;\n this.#metrics.layerTimes.set(layer.name, layerTime);\n\n if (this.config.debug?.showBounds) {\n this.#renderLayerBounds(ctx, layer);\n }\n }\n }\n\n // Render debug overlay if enabled\n if (this.config.debug?.enabled) {\n this.#renderDebugOverlay();\n }\n \n } finally {\n this.#isRendering = false;\n }\n }\n\n #renderBrushBounds(ctx, brush) {\n ctx.save();\n ctx.strokeStyle = 'rgba(0, 255, 0, 0.5)';\n ctx.lineWidth = 1;\n ctx.strokeRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.restore();\n }\n\n #renderLayerBounds(ctx, layer) {\n ctx.save();\n ctx.strokeStyle = 'rgba(255, 0, 0, 0.5)';\n ctx.lineWidth = 2;\n ctx.strokeRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.restore();\n }\n\n #renderDebugOverlay() {\n const ctx = this.#contexts.get(ContextTypes['2D']);\n if (!ctx) return;\n\n ctx.save();\n ctx.resetTransform();\n ctx.font = '12px monospace';\n ctx.fillStyle = 'white';\n ctx.strokeStyle = 'black';\n ctx.lineWidth = 3;\n\n let y = 20;\n const lineHeight = 15;\n\n if (this.config.debug?.showFPS) {\n const text = `FPS: ${Math.round(this.#metrics.fps)} (${this.#timing.deltaTime.toFixed(2)}ms)`;\n ctx.strokeText(text, 10, y);\n ctx.fillText(text, 10, y);\n y += lineHeight;\n }\n\n if (this.config.debug?.showLayerTiming) {\n ctx.fillText('Layer Times:', 10, y);\n y += lineHeight;\n\n for (const [name, time] of this.#metrics.layerTimes) {\n const text = ` ${name}: ${time.toFixed(2)}ms`;\n ctx.strokeText(text, 10, y);\n ctx.fillText(text, 10, y);\n y += lineHeight;\n }\n\n ctx.fillText(this.state.get(['_transitions', 'pointer', 'currentState']), 10, y);\n }\n\n ctx.restore();\n }\n\n handleResize(width, height) {\n // Call onResize hooks for all layers\n for (const layer of this.#layers.values()) {\n if (layer.lifecycle?.onResize) {\n try {\n layer.lifecycle.onResize(width, height, layer.context);\n } catch (error) {\n console.error(`Error in layer \"${layer.name}\" onResize:`, error);\n if (layer.lifecycle?.onError) layer.lifecycle.onError(error);\n }\n }\n }\n }\n\n #createDataReactor(id, data) {\n const state = this.useContext('state');\n\n const reactor = createReactor(data, {\n immediate: true,\n context: state\n });\n\n const unsubscribe = addEffect(reactor, () => this.#scheduleRender());\n\n this.#reactors.set(`painter_${id}`, {\n reactor,\n unsubscribe\n });\n\n return reactor;\n }\n\n destroy() {\n this.stop();\n // Clean up all layers and reactors\n for (const name of this.#layers.keys()) {\n this.removeLayer(name);\n }\n }\n\n setTargetFPS(fps) {\n this.config.targetFPS = fps;\n this.config.fixedTimeStep = 1000 / fps;\n }\n\n setTimeScale(scale) {\n this.config.timeScale = Math.max(0, scale);\n }\n\n setFixedTimeStep(step) {\n this.config.fixedTimeStep = step;\n }\n\n setDebug(options = {}) {\n if (!this.config.debug) {\n this.config.debug = {};\n }\n Object.assign(this.config.debug, options);\n }\n\n getMetrics() {\n return {\n ...this.#metrics,\n deltaTime: this.#timing.deltaTime,\n elapsedTime: this.#timing.elapsedTime,\n frameCount: this.#timing.frameCount\n };\n }\n}", "export const ContextTypes = {\n '2D': '2d',\n 'WEBGL': 'webgl',\n 'WEBGL2': 'webgl2',\n 'BITMAPRENDERER': 'bitmaprenderer'\n};"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["main_exports", "__export", "Painter", "defineBrush", "defineLayer", "__toCommonJS", "import_core", "ContextTypes", "import_reactive", "import_core", "defineBrush", "defineLayer", "Painter", "#layers", "#canvas", "#contexts", "#reactors", "#assets", "#isRunning", "#frameId", "#renderNeeded", "#isRendering", "#renderScheduled", "#timing", "#metrics", "context", "layerDef", "layers", "layer", "fn", "canvas", "assets", "name", "fps", "scale", "step", "options", "ContextTypes", "type", "ctx", "result", "#scheduleRender", "_a", "config", "dataReactor", "#createDataReactor", "brushes", "child", "brushConfig", "whenReactor", "brush", "error", "reactorData", "layerReactorData", "#render", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "renderStart", "layerStart", "layerReactor", "key", "value", "brushStart", "brushCtx", "requiredAssets", "brushTime", "#renderBrushBounds", "layerTime", "#renderLayerBounds", "#renderDebugOverlay", "y", "lineHeight", "text", "time", "width", "height", "id", "data", "state", "reactor", "unsubscribe"]
|
|
7
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ServiceProvider as F}from"@jucie-engine/core";var x={"2D":"2d",WEBGL:"webgl",WEBGL2:"webgl2",BITMAPRENDERER:"bitmaprenderer"};import{createReactor as v,addEffect as _}from"@jucie-state/reactive";import{createDefinition as C,definitionType as L}from"@jucie-engine/core";var A=C("BRUSH",[Object]),B=C("LAYER",[Object]),w=class extends F{#s=new Map;#i=null;#t=new Map;#r=new Map;#h=new Map;#a=!1;#n=null;#b=!1;#c=!1;#f=!1;#e={lastFrameTime:0,deltaTime:0,elapsedTime:0,frameCount:0};#o={fps:0,frameTime:0,layerTimes:new Map,brushTimes:new Map,skippedFrames:0};static manifest={name:"Painter",namespace:"painter",version:"1.0.0",defaults:{targetFPS:60,fixedTimeStep:1e3/60,timeScale:1,debug:{enabled:!1,showFPS:!0,showBounds:!0,showLayerTiming:!0}}};actions(e){return{addLayer:t=>this.addLayer(t),addLayers:(...t)=>{for(let i of t)this.addLayer(i)},updateCanvas:t=>this.updateCanvas(t),setCanvas:t=>this.setCanvas(t),setAssets:t=>this.setAssets(t),removeLayer:t=>this.removeLayer(t),start:()=>this.start(),stop:()=>this.stop(),render:()=>this.render(),setTargetFPS:t=>this.setTargetFPS(t),setTimeScale:t=>this.setTimeScale(t),setFixedTimeStep:t=>this.setFixedTimeStep(t),setDebug:t=>this.setDebug(t),getMetrics:()=>this.getMetrics()}}setCanvas(e){this.#i=e,Object.values(x).forEach(t=>{try{let i=e.getContext(t);i&&this.#t.set(t,i)}catch{console.warn(`Context type ${t} not supported`)}})}updateCanvas(e){let t=e(this.#i);t&&(this.#i=t)}setAssets(e){this.#h=e}start(){this.#a||(this.#a=!0,this.#l())}stop(){this.#a&&(this.#a=!1,this.#n&&(cancelAnimationFrame(this.#n),this.#n=null))}addLayer(e){var a;if(L(e)!=="LAYER")throw new Error("Invalid layer definition");let t=e._name,i=e(this.useContext);if(i.data){let c=this.#d(`layer_${t}`,i.data);c&&this.#r.set(`layer_${t}`,c)}let o=i.children.map(c=>{var h;if(L(c)==="BRUSH"){let b=c._name,y=c(),p=this.#d(`brush_${b}`,y.data),T=v(y.when,{immediate:!0,context:this.useContext("state")}),m={name:b,...y,dataReactor:p,whenReactor:T};if((h=m.lifecycle)!=null&&h.onMount)try{m.lifecycle.onMount(this.#t.get(m.context||i.context))}catch(R){console.error(`Error in brush "${m.name}" onMount:`,R)}return m}return this.addLayer(c)}),s={...i,name:t,brushes:o,context:this.#t.get(i.context)};if(this.#s.set(t,s),(a=s.lifecycle)!=null&&a.onMount)try{s.lifecycle.onMount(s.context)}catch(c){console.error(`Error in layer "${t}" onMount:`,c)}return s}removeLayer(e){var o;let t=this.#s.get(e);if(!t)return;if((o=t.lifecycle)!=null&&o.onUnmount)try{t.lifecycle.onUnmount(t.context)}catch(s){console.error(`Error in layer "${e}" onUnmount:`,s)}t.brushes.forEach(s=>{var c;if((c=s.lifecycle)!=null&&c.onUnmount)try{s.lifecycle.onUnmount(this.#t.get(s.context||t.context))}catch(h){console.error(`Error in brush "${s.name}" onUnmount:`,h)}let a=this.#r.get(`painter_brush_${s.name}`);a&&(a.unsubscribe(),a.reactor.destroy(),this.#r.delete(`painter_brush_${s.name}`))});let i=this.#r.get(`painter_layer_${e}`);i&&(i.unsubscribe(),i.reactor.destroy(),this.#r.delete(`painter_layer_${e}`)),this.#s.delete(e)}#l(){this.#f||this.#c||(this.#f=!0,this.#n=requestAnimationFrame(()=>{this.#f=!1,this.#n=null,this.#u()}))}async#u(){var e,t,i,o,s,a,c,h,b,y,p,T,m,R,E,S,$;if(this.#i){this.#c=!0;try{let D=(e=this.config.debug)!=null&&e.enabled?performance.now():0;this.#t.forEach(n=>{n.clearRect(0,0,this.#i.width,this.#i.height)});for(let n of this.#s.values()){let M=(t=this.config.debug)!=null&&t.enabled?performance.now():0;if(n.whenReactor){let r=(i=this.#r.get(`painter_layer_${n.name}`))==null?void 0:i.reactor;if(!n.when(r()))continue}let l=n.context;if(l){if((o=n.lifecycle)!=null&&o.beforeRender)try{n.lifecycle.beforeRender(l,this.#e)}catch(r){console.error(`Error in layer "${n.name}" beforeRender:`,r),(s=n.lifecycle)!=null&&s.onError&&n.lifecycle.onError(r)}l.save(),n.settings&&Object.entries(n.settings).forEach(([r,g])=>{typeof l[r]=="function"?l[r](...Array.isArray(g)?g:[g]):l[r]=g});for(let r of n.brushes){let g=(a=this.config.debug)!=null&&a.enabled?performance.now():0;if(r.whenReactor&&!r.whenReactor())continue;let d=r.context?this.#t.get(r.context):l;if(d){if((c=r.lifecycle)!=null&&c.beforeRender)try{r.lifecycle.beforeRender(d,this.#e)}catch(f){console.error(`Error in brush "${r.name}" beforeRender:`,f),(h=r.lifecycle)!=null&&h.onError&&r.lifecycle.onError(f);continue}d.save(),r.settings&&Object.entries(r.settings).forEach(([f,u])=>{typeof d[f]=="function"?d[f](...Array.isArray(u)?u:[u]):d[f]=u});try{let f={};if(r.assets)for(let u of r.assets)f[u]=this.#h.get(u);if(r.render(d,r.dataReactor(),f,this.#e),(b=r.lifecycle)!=null&&b.afterRender&&r.lifecycle.afterRender(d,this.#e),(y=this.config.debug)!=null&&y.enabled){let u=performance.now()-g;this.#o.brushTimes.set(r.name,u),(p=this.config.debug)!=null&&p.showBounds&&this.#m(d,r)}}catch(f){console.error(`Error in brush "${r.name}":`,f),(T=r.lifecycle)!=null&&T.onError&&r.lifecycle.onError(f)}finally{d.restore()}}}if(l.restore(),(m=n.lifecycle)!=null&&m.afterRender)try{n.lifecycle.afterRender(l,this.#e)}catch(r){console.error(`Error in layer "${n.name}" afterRender:`,r),(R=n.lifecycle)!=null&&R.onError&&n.lifecycle.onError(r)}if((E=this.config.debug)!=null&&E.enabled){let r=performance.now()-M;this.#o.layerTimes.set(n.name,r),(S=this.config.debug)!=null&&S.showBounds&&this.#y(l,n)}}}($=this.config.debug)!=null&&$.enabled&&this.#g()}finally{this.#c=!1}}}#m(e,t){e.save(),e.strokeStyle="rgba(0, 255, 0, 0.5)",e.lineWidth=1,e.strokeRect(0,0,e.canvas.width,e.canvas.height),e.restore()}#y(e,t){e.save(),e.strokeStyle="rgba(255, 0, 0, 0.5)",e.lineWidth=2,e.strokeRect(0,0,e.canvas.width,e.canvas.height),e.restore()}#g(){var o,s;let e=this.#t.get(x["2D"]);if(!e)return;e.save(),e.resetTransform(),e.font="12px monospace",e.fillStyle="white",e.strokeStyle="black",e.lineWidth=3;let t=20,i=15;if((o=this.config.debug)!=null&&o.showFPS){let a=`FPS: ${Math.round(this.#o.fps)} (${this.#e.deltaTime.toFixed(2)}ms)`;e.strokeText(a,10,t),e.fillText(a,10,t),t+=i}if((s=this.config.debug)!=null&&s.showLayerTiming){e.fillText("Layer Times:",10,t),t+=i;for(let[a,c]of this.#o.layerTimes){let h=` ${a}: ${c.toFixed(2)}ms`;e.strokeText(h,10,t),e.fillText(h,10,t),t+=i}e.fillText(this.state.get(["_transitions","pointer","currentState"]),10,t)}e.restore()}handleResize(e,t){var i,o;for(let s of this.#s.values())if((i=s.lifecycle)!=null&&i.onResize)try{s.lifecycle.onResize(e,t,s.context)}catch(a){console.error(`Error in layer "${s.name}" onResize:`,a),(o=s.lifecycle)!=null&&o.onError&&s.lifecycle.onError(a)}}#d(e,t){let i=this.useContext("state"),o=v(t,{immediate:!0,context:i}),s=_(o,()=>this.#l());return this.#r.set(`painter_${e}`,{reactor:o,unsubscribe:s}),o}destroy(){this.stop();for(let e of this.#s.keys())this.removeLayer(e)}setTargetFPS(e){this.config.targetFPS=e,this.config.fixedTimeStep=1e3/e}setTimeScale(e){this.config.timeScale=Math.max(0,e)}setFixedTimeStep(e){this.config.fixedTimeStep=e}setDebug(e={}){this.config.debug||(this.config.debug={}),Object.assign(this.config.debug,e)}getMetrics(){return{...this.#o,deltaTime:this.#e.deltaTime,elapsedTime:this.#e.elapsedTime,frameCount:this.#e.frameCount}}};export{w as Painter,A as defineBrush,B as defineLayer};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/Painter.js", "../src/ContextTypes.js"],
|
|
4
|
+
"sourcesContent": ["import { ServiceProvider } from '@jucie-engine/core';\nimport { ContextTypes } from './ContextTypes.js';\nimport { createReactor, isReactor, addEffect } from '@jucie-state/reactive';\nimport { createDefinition, definitionType } from '@jucie-engine/core';\n\nexport const defineBrush = createDefinition('BRUSH', [Object]);\nexport const defineLayer = createDefinition('LAYER', [Object]);\n\nexport class Painter extends ServiceProvider {\n #layers = new Map();\n #canvas = null;\n #contexts = new Map();\n #reactors = new Map();\n #assets = new Map();\n #isRunning = false;\n #frameId = null;\n #renderNeeded = false;\n #isRendering = false;\n #renderScheduled = false;\n\n // Timing state\n #timing = {\n lastFrameTime: 0,\n deltaTime: 0,\n elapsedTime: 0,\n frameCount: 0\n };\n\n // Debug metrics\n #metrics = {\n fps: 0,\n frameTime: 0,\n layerTimes: new Map(),\n brushTimes: new Map(),\n skippedFrames: 0\n };\n\n static manifest = {\n name: 'Painter',\n namespace: 'painter',\n version: '1.0.0',\n defaults: {\n // Timing configuration\n targetFPS: 60,\n fixedTimeStep: 1000 / 60,\n timeScale: 1.0,\n // Debug configuration\n debug: {\n enabled: false,\n showFPS: true,\n showBounds: true,\n showLayerTiming: true\n }\n }\n };\n\n actions(context) {\n return {\n addLayer: (layerDef) => this.addLayer(layerDef),\n addLayers: (...layers) => {\n for (const layer of layers) {\n this.addLayer(layer);\n }\n },\n updateCanvas: (fn) => this.updateCanvas(fn),\n setCanvas: (canvas) => this.setCanvas(canvas),\n setAssets: (assets) => this.setAssets(assets),\n removeLayer: (name) => this.removeLayer(name),\n start: () => this.start(),\n stop: () => this.stop(),\n render: () => this.render(),\n setTargetFPS: (fps) => this.setTargetFPS(fps),\n setTimeScale: (scale) => this.setTimeScale(scale),\n setFixedTimeStep: (step) => this.setFixedTimeStep(step),\n setDebug: (options) => this.setDebug(options),\n getMetrics: () => this.getMetrics()\n };\n }\n\n setCanvas(canvas) {\n this.#canvas = canvas;\n \n // Create contexts for each type\n Object.values(ContextTypes).forEach(type => {\n try {\n const ctx = canvas.getContext(type);\n if (ctx) this.#contexts.set(type, ctx);\n } catch (e) {\n console.warn(`Context type ${type} not supported`);\n }\n });\n }\n\n updateCanvas(fn) {\n const result = fn(this.#canvas);\n if (result) {\n this.#canvas = result;\n }\n }\n\n setAssets(assets) {\n this.#assets = assets;\n }\n\n start() {\n if (!this.#isRunning) {\n this.#isRunning = true;\n this.#scheduleRender();\n }\n }\n\n stop() {\n if (this.#isRunning) {\n this.#isRunning = false;\n if (this.#frameId) {\n cancelAnimationFrame(this.#frameId);\n this.#frameId = null;\n }\n }\n }\n\n addLayer(layerDef) {\n if (definitionType(layerDef) !== 'LAYER') {\n throw new Error('Invalid layer definition');\n }\n\n const name = layerDef._name;\n const config = layerDef(this.useContext);\n \n // Set up layer reactor if it has data paths\n if (config.data) {\n const dataReactor = this.#createDataReactor(`layer_${name}`, config.data);\n if (dataReactor) {\n this.#reactors.set(`layer_${name}`, dataReactor);\n }\n }\n\n // Set up brush reactors and structure\n const brushes = config.children.map(child => {\n if (definitionType(child) === 'BRUSH') {\n const name = child._name;\n const brushConfig = child();\n const dataReactor = this.#createDataReactor(`brush_${name}`, brushConfig.data, );\n const whenReactor = createReactor(brushConfig.when, {\n immediate: true,\n context: this.useContext('state')\n })\n\n const brush = {\n name,\n ...brushConfig,\n dataReactor,\n whenReactor\n };\n\n // Call brush mount hook\n if (brush.lifecycle?.onMount) {\n try {\n brush.lifecycle.onMount(this.#contexts.get(brush.context || config.context));\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\" onMount:`, error);\n }\n }\n\n return brush;\n }\n // Handle nested layers recursively\n return this.addLayer(child);\n });\n\n const layer = {\n ...config,\n name,\n brushes,\n context: this.#contexts.get(config.context)\n };\n\n this.#layers.set(name, layer);\n\n // Call layer mount hook\n if (layer.lifecycle?.onMount) {\n try {\n layer.lifecycle.onMount(layer.context);\n } catch (error) {\n console.error(`Error in layer \"${name}\" onMount:`, error);\n }\n }\n\n return layer;\n }\n\n removeLayer(name) {\n const layer = this.#layers.get(name);\n if (!layer) return;\n\n // Call layer unmount hook\n if (layer.lifecycle?.onUnmount) {\n try {\n layer.lifecycle.onUnmount(layer.context);\n } catch (error) {\n console.error(`Error in layer \"${name}\" onUnmount:`, error);\n }\n }\n\n // Call brush unmount hooks and clean up reactors\n layer.brushes.forEach(brush => {\n if (brush.lifecycle?.onUnmount) {\n try {\n brush.lifecycle.onUnmount(\n this.#contexts.get(brush.context || layer.context)\n );\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\" onUnmount:`, error);\n }\n }\n // Clean up brush reactor and subscription\n const reactorData = this.#reactors.get(`painter_brush_${brush.name}`);\n if (reactorData) {\n reactorData.unsubscribe();\n reactorData.reactor.destroy();\n this.#reactors.delete(`painter_brush_${brush.name}`);\n }\n });\n\n // Clean up layer reactor and subscription\n const layerReactorData = this.#reactors.get(`painter_layer_${name}`);\n if (layerReactorData) {\n layerReactorData.unsubscribe();\n layerReactorData.reactor.destroy();\n this.#reactors.delete(`painter_layer_${name}`);\n }\n\n this.#layers.delete(name);\n }\n\n #scheduleRender() {\n if (this.#renderScheduled || this.#isRendering) return;\n \n this.#renderScheduled = true;\n \n this.#frameId = requestAnimationFrame(() => {\n this.#renderScheduled = false;\n this.#frameId = null;\n this.#render();\n });\n }\n\n async #render() {\n if (!this.#canvas) return;\n this.#isRendering = true;\n \n try { \n const renderStart = this.config.debug?.enabled ? performance.now() : 0;\n\n // Clear all contexts\n this.#contexts.forEach(ctx => {\n ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height);\n });\n\n // Render layers in order\n for (const layer of this.#layers.values()) {\n const layerStart = this.config.debug?.enabled ? performance.now() : 0;\n\n // Check layer condition\n if (layer.whenReactor) {\n const layerReactor = this.#reactors.get(`painter_layer_${layer.name}`)?.reactor;\n if (!layer.when(layerReactor())) continue;\n }\n\n const ctx = layer.context;\n\n if (!ctx) continue;\n\n // Layer beforeRender hook\n if (layer.lifecycle?.beforeRender) {\n try {\n layer.lifecycle.beforeRender(ctx, this.#timing);\n } catch (error) {\n console.error(`Error in layer \"${layer.name}\" beforeRender:`, error);\n if (layer.lifecycle?.onError) layer.lifecycle.onError(error);\n }\n }\n\n // Apply layer settings\n ctx.save();\n if (layer.settings) {\n Object.entries(layer.settings).forEach(([key, value]) => {\n if (typeof ctx[key] === 'function') {\n ctx[key](...(Array.isArray(value) ? value : [value]));\n } else {\n ctx[key] = value;\n }\n });\n }\n\n // Render brushes\n for (const brush of layer.brushes) {\n const brushStart = this.config.debug?.enabled ? performance.now() : 0;\n\n if (brush.whenReactor && !brush.whenReactor()) continue;\n\n\n const brushCtx = brush.context ? \n this.#contexts.get(brush.context) : \n ctx;\n\n if (!brushCtx) continue;\n\n // Brush beforeRender hook\n if (brush.lifecycle?.beforeRender) {\n try {\n brush.lifecycle.beforeRender(brushCtx, this.#timing);\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\" beforeRender:`, error);\n if (brush.lifecycle?.onError) brush.lifecycle.onError(error);\n continue;\n }\n }\n\n brushCtx.save();\n \n if (brush.settings) {\n Object.entries(brush.settings).forEach(([key, value]) => {\n if (typeof brushCtx[key] === 'function') {\n brushCtx[key](...(Array.isArray(value) ? value : [value]));\n } else {\n brushCtx[key] = value;\n }\n });\n }\n \n try {\n const requiredAssets = {};\n if (brush.assets) {\n for (const key of brush.assets) {\n requiredAssets[key] = this.#assets.get(key);\n }\n }\n brush.render(brushCtx, brush.dataReactor(), requiredAssets, this.#timing);\n\n // Brush afterRender hook\n if (brush.lifecycle?.afterRender) {\n brush.lifecycle.afterRender(brushCtx, this.#timing);\n }\n\n if (this.config.debug?.enabled) {\n const brushTime = performance.now() - brushStart;\n this.#metrics.brushTimes.set(brush.name, brushTime);\n\n if (this.config.debug?.showBounds) {\n this.#renderBrushBounds(brushCtx, brush);\n }\n }\n } catch (error) {\n console.error(`Error in brush \"${brush.name}\":`, error);\n if (brush.lifecycle?.onError) brush.lifecycle.onError(error);\n } finally {\n brushCtx.restore();\n }\n }\n\n ctx.restore();\n\n // Layer afterRender hook\n if (layer.lifecycle?.afterRender) {\n try {\n layer.lifecycle.afterRender(ctx, this.#timing);\n } catch (error) {\n console.error(`Error in layer \"${layer.name}\" afterRender:`, error);\n if (layer.lifecycle?.onError) layer.lifecycle.onError(error);\n }\n }\n\n if (this.config.debug?.enabled) {\n const layerTime = performance.now() - layerStart;\n this.#metrics.layerTimes.set(layer.name, layerTime);\n\n if (this.config.debug?.showBounds) {\n this.#renderLayerBounds(ctx, layer);\n }\n }\n }\n\n // Render debug overlay if enabled\n if (this.config.debug?.enabled) {\n this.#renderDebugOverlay();\n }\n \n } finally {\n this.#isRendering = false;\n }\n }\n\n #renderBrushBounds(ctx, brush) {\n ctx.save();\n ctx.strokeStyle = 'rgba(0, 255, 0, 0.5)';\n ctx.lineWidth = 1;\n ctx.strokeRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.restore();\n }\n\n #renderLayerBounds(ctx, layer) {\n ctx.save();\n ctx.strokeStyle = 'rgba(255, 0, 0, 0.5)';\n ctx.lineWidth = 2;\n ctx.strokeRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.restore();\n }\n\n #renderDebugOverlay() {\n const ctx = this.#contexts.get(ContextTypes['2D']);\n if (!ctx) return;\n\n ctx.save();\n ctx.resetTransform();\n ctx.font = '12px monospace';\n ctx.fillStyle = 'white';\n ctx.strokeStyle = 'black';\n ctx.lineWidth = 3;\n\n let y = 20;\n const lineHeight = 15;\n\n if (this.config.debug?.showFPS) {\n const text = `FPS: ${Math.round(this.#metrics.fps)} (${this.#timing.deltaTime.toFixed(2)}ms)`;\n ctx.strokeText(text, 10, y);\n ctx.fillText(text, 10, y);\n y += lineHeight;\n }\n\n if (this.config.debug?.showLayerTiming) {\n ctx.fillText('Layer Times:', 10, y);\n y += lineHeight;\n\n for (const [name, time] of this.#metrics.layerTimes) {\n const text = ` ${name}: ${time.toFixed(2)}ms`;\n ctx.strokeText(text, 10, y);\n ctx.fillText(text, 10, y);\n y += lineHeight;\n }\n\n ctx.fillText(this.state.get(['_transitions', 'pointer', 'currentState']), 10, y);\n }\n\n ctx.restore();\n }\n\n handleResize(width, height) {\n // Call onResize hooks for all layers\n for (const layer of this.#layers.values()) {\n if (layer.lifecycle?.onResize) {\n try {\n layer.lifecycle.onResize(width, height, layer.context);\n } catch (error) {\n console.error(`Error in layer \"${layer.name}\" onResize:`, error);\n if (layer.lifecycle?.onError) layer.lifecycle.onError(error);\n }\n }\n }\n }\n\n #createDataReactor(id, data) {\n const state = this.useContext('state');\n\n const reactor = createReactor(data, {\n immediate: true,\n context: state\n });\n\n const unsubscribe = addEffect(reactor, () => this.#scheduleRender());\n\n this.#reactors.set(`painter_${id}`, {\n reactor,\n unsubscribe\n });\n\n return reactor;\n }\n\n destroy() {\n this.stop();\n // Clean up all layers and reactors\n for (const name of this.#layers.keys()) {\n this.removeLayer(name);\n }\n }\n\n setTargetFPS(fps) {\n this.config.targetFPS = fps;\n this.config.fixedTimeStep = 1000 / fps;\n }\n\n setTimeScale(scale) {\n this.config.timeScale = Math.max(0, scale);\n }\n\n setFixedTimeStep(step) {\n this.config.fixedTimeStep = step;\n }\n\n setDebug(options = {}) {\n if (!this.config.debug) {\n this.config.debug = {};\n }\n Object.assign(this.config.debug, options);\n }\n\n getMetrics() {\n return {\n ...this.#metrics,\n deltaTime: this.#timing.deltaTime,\n elapsedTime: this.#timing.elapsedTime,\n frameCount: this.#timing.frameCount\n };\n }\n}", "export const ContextTypes = {\n '2D': '2d',\n 'WEBGL': 'webgl',\n 'WEBGL2': 'webgl2',\n 'BITMAPRENDERER': 'bitmaprenderer'\n};"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ServiceProvider", "ContextTypes", "createReactor", "addEffect", "createDefinition", "definitionType", "defineBrush", "defineLayer", "Painter", "ServiceProvider", "#layers", "#canvas", "#contexts", "#reactors", "#assets", "#isRunning", "#frameId", "#renderNeeded", "#isRendering", "#renderScheduled", "#timing", "#metrics", "context", "layerDef", "layers", "layer", "fn", "canvas", "assets", "name", "fps", "scale", "step", "options", "ContextTypes", "type", "ctx", "result", "#scheduleRender", "_a", "config", "dataReactor", "#createDataReactor", "brushes", "child", "brushConfig", "whenReactor", "brush", "error", "reactorData", "layerReactorData", "#render", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "renderStart", "layerStart", "layerReactor", "key", "value", "brushStart", "brushCtx", "requiredAssets", "brushTime", "#renderBrushBounds", "layerTime", "#renderLayerBounds", "#renderDebugOverlay", "y", "lineHeight", "text", "time", "width", "height", "id", "data", "state", "reactor", "unsubscribe"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jucie-engine/painter",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Canvas painting service for @jucie-engine/core with reactive rendering support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "node ../../scripts/build-package.js services/painter",
|
|
16
|
+
"test": "vitest",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"painter",
|
|
21
|
+
"canvas",
|
|
22
|
+
"rendering",
|
|
23
|
+
"reactive",
|
|
24
|
+
"engine-service"
|
|
25
|
+
],
|
|
26
|
+
"author": "Adrian Miller",
|
|
27
|
+
"license": "SEE LICENSE IN ../../LICENSE",
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/adrianjonmiller/engine.git",
|
|
34
|
+
"directory": "services/painter"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"@jucie-engine/core": "^1.0.0",
|
|
38
|
+
"@jucie-state/reactive": "^1.0.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@jucie-state/core": "^1.0.39"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"vitest": "^3.2.4"
|
|
45
|
+
}
|
|
46
|
+
}
|