@pix3/cli 1.6.0 → 1.6.3

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 (126) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +788 -754
  3. package/dist/index.js +208 -203
  4. package/dist/runtime-types.json +1 -1
  5. package/dist/smoke/prebuilt/{chunk-J2SJVMDO.mjs → chunk-CBFYKDS7.mjs} +1 -1
  6. package/dist/smoke/prebuilt/chunk-VJHJ5BCO.mjs +239 -0
  7. package/dist/smoke/prebuilt/runtime.mjs +1 -1
  8. package/dist/smoke/prebuilt/smoke-worker.mjs +1 -1
  9. package/dist/smoke/prebuilt/tree-defaults.mjs +1 -1
  10. package/dist/validate/prebuilt/bundle-main.js +13 -13
  11. package/dist/validate/prebuilt/chunk-CFQFEI52.js +239 -0
  12. package/dist/validate/prebuilt/runtime.js +1 -1
  13. package/kit/files/.claude/skills/pix3-nodes/SKILL.md +210 -210
  14. package/kit/files/.claude/skills/pix3-nodes/reference.md +39 -24
  15. package/kit/files/.claude/skills/pix3-scene-format/SKILL.md +238 -235
  16. package/kit/files/.claude/skills/pix3-scene-format/reference.md +43 -28
  17. package/kit/files/.claude/skills/pix3-scripts/SKILL.md +285 -281
  18. package/kit/files/.claude/skills/pix3-scripts/reference.md +69 -52
  19. package/kit/files/.claude/skills/pix3-verify/SKILL.md +298 -256
  20. package/kit/files/.claude/skills/pix3-verify/reference.md +21 -21
  21. package/kit/files/AGENTS.md +203 -203
  22. package/kit/files/CLAUDE.md +1 -1
  23. package/kit/kit.json +2 -2
  24. package/package.json +54 -54
  25. package/templates/empty-2d/files/README.md +20 -20
  26. package/templates/empty-2d/files/scenes/main.pix3scene +68 -68
  27. package/templates/empty-2d/template.yaml +7 -7
  28. package/templates/empty-3d/files/README.md +20 -20
  29. package/templates/empty-3d/files/scenes/main.pix3scene +108 -108
  30. package/templates/empty-3d/template.yaml +7 -7
  31. package/templates/idea-blank/files/README.md +22 -22
  32. package/templates/idea-blank/files/scenes/main.pix3scene +37 -37
  33. package/templates/idea-blank/template.yaml +10 -10
  34. package/templates/minigame-2d/files/README.md +44 -44
  35. package/templates/minigame-2d/files/design/tests/reachability.json +1 -1
  36. package/templates/minigame-2d/files/design/tests/routines/mute-music.json +44 -44
  37. package/templates/minigame-2d/files/scenes/main.pix3scene +84 -84
  38. package/templates/minigame-2d/files/scenes/menu.pix3scene +118 -118
  39. package/templates/minigame-2d/files/scenes/ui/settings-window.pix3scene +138 -138
  40. package/templates/minigame-2d/files/scripts/GameFlow.ts +133 -133
  41. package/templates/minigame-2d/files/scripts/MenuFlow.ts +217 -217
  42. package/templates/minigame-2d/files/scripts/SettingsWindow.ts +198 -198
  43. package/templates/minigame-2d/template.yaml +10 -10
  44. package/templates/playable-2d/files/README.md +30 -30
  45. package/templates/playable-2d/files/design/recipe.md +83 -83
  46. package/templates/playable-2d/files/design/tests/reachability.json +4 -4
  47. package/templates/playable-2d/files/design/tests/routines/intro-to-cta.json +32 -32
  48. package/templates/playable-2d/files/scenes/main.pix3scene +111 -111
  49. package/templates/playable-2d/files/scenes/ui/end-screen.pix3scene +91 -91
  50. package/templates/playable-2d/files/scenes/ui/intro.pix3scene +65 -65
  51. package/templates/playable-2d/files/scripts/GameFlow.ts +256 -256
  52. package/templates/playable-2d/template.yaml +9 -9
  53. package/templates/playable-3d/files/README.md +32 -32
  54. package/templates/playable-3d/files/design/recipe.md +127 -127
  55. package/templates/playable-3d/files/design/tests/reachability.json +4 -4
  56. package/templates/playable-3d/files/design/tests/routines/intro-to-cta.json +32 -32
  57. package/templates/playable-3d/files/scenes/main.pix3scene +230 -230
  58. package/templates/playable-3d/files/scenes/ui/end-screen.pix3scene +91 -91
  59. package/templates/playable-3d/files/scenes/ui/intro.pix3scene +65 -65
  60. package/templates/playable-3d/files/scripts/GameFlow.ts +309 -309
  61. package/templates/playable-3d/files/scripts/GameRules.ts +290 -290
  62. package/templates/playable-3d/files/scripts/ScoreHud.ts +113 -113
  63. package/templates/playable-3d/template.yaml +9 -9
  64. package/templates/recipe-arena-2d/files/README.md +48 -48
  65. package/templates/recipe-arena-2d/files/design/recipe.md +127 -127
  66. package/templates/recipe-arena-2d/files/scenes/main.pix3scene +292 -292
  67. package/templates/recipe-arena-2d/files/scenes/menu.pix3scene +100 -100
  68. package/templates/recipe-arena-2d/files/scenes/prefabs/hazard.pix3scene +42 -42
  69. package/templates/recipe-arena-2d/files/scenes/prefabs/pickup.pix3scene +45 -45
  70. package/templates/recipe-arena-2d/files/scenes/ui/result.pix3scene +85 -85
  71. package/templates/recipe-arena-2d/files/scripts/GameRules.ts +368 -368
  72. package/templates/recipe-arena-2d/files/scripts/MenuFlow.ts +106 -106
  73. package/templates/recipe-arena-2d/files/scripts/PlayerController.ts +151 -151
  74. package/templates/recipe-arena-2d/files/scripts/ScoreHud.ts +94 -94
  75. package/templates/recipe-arena-2d/files/scripts/Spawner.ts +214 -214
  76. package/templates/recipe-arena-2d/files/scripts/TouchRules.ts +174 -174
  77. package/templates/recipe-arena-2d/template.yaml +10 -10
  78. package/templates/recipe-blank-2d/files/README.md +61 -61
  79. package/templates/recipe-blank-2d/files/design/recipe.md +148 -148
  80. package/templates/recipe-blank-2d/files/design/tests/reachability.json +4 -4
  81. package/templates/recipe-blank-2d/files/design/tests/routines/restart.json +27 -27
  82. package/templates/recipe-blank-2d/files/scenes/main.pix3scene +224 -224
  83. package/templates/recipe-blank-2d/files/scenes/ui/result.pix3scene +85 -85
  84. package/templates/recipe-blank-2d/files/scripts/GameRules.ts +350 -350
  85. package/templates/recipe-blank-2d/files/scripts/ScoreHud.ts +110 -110
  86. package/templates/recipe-blank-2d/template.yaml +10 -10
  87. package/templates/recipe-bouncer-2d/files/README.md +81 -81
  88. package/templates/recipe-bouncer-2d/files/design/recipe.md +146 -146
  89. package/templates/recipe-bouncer-2d/files/scenes/main.pix3scene +615 -615
  90. package/templates/recipe-bouncer-2d/files/scenes/menu.pix3scene +191 -191
  91. package/templates/recipe-bouncer-2d/files/scenes/ui/result.pix3scene +87 -87
  92. package/templates/recipe-bouncer-2d/files/scripts/BallBody.ts +298 -298
  93. package/templates/recipe-bouncer-2d/files/scripts/GameRules.ts +377 -377
  94. package/templates/recipe-bouncer-2d/files/scripts/MenuFlow.ts +109 -109
  95. package/templates/recipe-bouncer-2d/files/scripts/PaddleController.ts +112 -112
  96. package/templates/recipe-bouncer-2d/files/scripts/ScoreHud.ts +94 -94
  97. package/templates/recipe-bouncer-2d/files/scripts/TouchRules.ts +263 -263
  98. package/templates/recipe-bouncer-2d/files/scripts/ball-collision.ts +307 -307
  99. package/templates/recipe-bouncer-2d/template.yaml +10 -10
  100. package/templates/recipe-grid-3d/files/README.md +22 -22
  101. package/templates/recipe-grid-3d/files/design/recipe.md +110 -110
  102. package/templates/recipe-grid-3d/files/scenes/main.pix3scene +169 -169
  103. package/templates/recipe-grid-3d/files/scenes/menu.pix3scene +100 -100
  104. package/templates/recipe-grid-3d/files/scenes/ui/result.pix3scene +105 -105
  105. package/templates/recipe-grid-3d/files/scripts/GridBoard.ts +319 -319
  106. package/templates/recipe-grid-3d/files/scripts/GridRules.ts +278 -278
  107. package/templates/recipe-grid-3d/files/scripts/MenuFlow.ts +106 -106
  108. package/templates/recipe-grid-3d/files/scripts/ScoreHud.ts +94 -94
  109. package/templates/recipe-grid-3d/template.yaml +10 -10
  110. package/templates/recipe-tapper-2d/files/README.md +39 -39
  111. package/templates/recipe-tapper-2d/files/design/recipe.md +132 -132
  112. package/templates/recipe-tapper-2d/files/design/tests/reachability.json +4 -4
  113. package/templates/recipe-tapper-2d/files/design/tests/routines/terminal-retry.json +23 -23
  114. package/templates/recipe-tapper-2d/files/scenes/main.pix3scene +269 -269
  115. package/templates/recipe-tapper-2d/files/scenes/menu.pix3scene +100 -100
  116. package/templates/recipe-tapper-2d/files/scenes/prefabs/hazard.pix3scene +42 -42
  117. package/templates/recipe-tapper-2d/files/scenes/prefabs/target.pix3scene +45 -45
  118. package/templates/recipe-tapper-2d/files/scenes/ui/result.pix3scene +85 -85
  119. package/templates/recipe-tapper-2d/files/scripts/GameRules.ts +368 -368
  120. package/templates/recipe-tapper-2d/files/scripts/MenuFlow.ts +106 -106
  121. package/templates/recipe-tapper-2d/files/scripts/ScoreHud.ts +94 -94
  122. package/templates/recipe-tapper-2d/files/scripts/Spawner.ts +214 -214
  123. package/templates/recipe-tapper-2d/files/scripts/TouchRules.ts +192 -192
  124. package/templates/recipe-tapper-2d/template.yaml +10 -10
  125. package/dist/smoke/prebuilt/chunk-OJXQXIIQ.mjs +0 -239
  126. package/dist/validate/prebuilt/chunk-BS2OZM7U.js +0 -239
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __pix3CreateRequire } from 'node:module'; const require = __pix3CreateRequire(import.meta.url);
2
- import{$ as _,$a as $o,$b as $r,$c as $e,$d as om,$e as op,A as z,Aa as Ao,Ab as Ar,Ac as Ae,Ad as Bf,Ae as Bm,Af as Bp,B as A,Ba as Bo,Bb as Br,Bc as Be,Bd as Cf,Be as Cm,Bf as Cp,C as B,Ca as Co,Cb as Cr,Cc as Ce,Cd as Df,Ce as Dm,Cf as Dp,D as C,Da as Do,Db as Dr,Dc as De,Dd as Ef,De as Em,Df as Ep,E as D,Ea as Eo,Eb as Er,Ec as Ee,Ed as Ff,Ee as Fm,Ef as Fp,F as E,Fa as Fo,Fb as Fr,Fc as Fe,Fd as Gf,Fe as Gm,Ff as Gp,G as F,Ga as Go,Gb as Gr,Gc as Ge,Gd as Hf,Ge as Hm,Gf as Hp,H as G,Ha as Ho,Hb as Hr,Hc as He,Hd as If,He as Im,Hf as Ip,I as H,Ia as Io,Ib as Ir,Ic as Ie,Id as Jf,Ie as Jm,If as Jp,J as I,Ja as Jo,Jb as Jr,Jc as Je,Jd as Kf,Je as Km,Jf as Kp,K as J,Ka as Ko,Kb as Kr,Kc as Ke,Kd as Lf,Ke as Lm,Kf as Lp,L as K,La as Lo,Lb as Lr,Lc as Le,Ld as Mf,Le as Mm,Lf as Mp,M as L,Ma as Mo,Mb as Mr,Mc as Me,Md as Nf,Me as Nm,Mf as Np,N as M,Na as No,Nb as Nr,Nc as Ne,Nd as Of,Ne as Om,Nf as Op,O as N,Oa as Oo,Ob as Or,Oc as Oe,Od as Pf,Oe as Pm,Of as Pp,P as O,Pa as Po,Pb as Pr,Pc as Pe,Pd as Qf,Pe as Qm,Pf as Qp,Q as P,Qa as Qo,Qb as Qr,Qc as Qe,Qd as Rf,Qe as Rm,Qf as Rp,R as Q,Ra as Ro,Rb as Rr,Rc as Re,Rd as Sf,Re as Sm,Rf as Sp,S as R,Sa as So,Sb as Sr,Sc as Se,Sd as Tf,Se as Tm,T as S,Ta as To,Tb as Tr,Tc as Te,Td as Uf,Te as Um,U as T,Ua as Uo,Ub as Ur,Uc as Ue,Ud as Vf,Ue as Vm,V as U,Va as Vo,Vb as Vr,Vc as Ve,Vd as Wf,Ve as Wm,W as V,Wa as Wo,Wb as Wr,Wc as We,Wd as Xf,We as Xm,X as W,Xa as Xo,Xb as Xr,Xc as Xe,Xd as Yf,Xe as Ym,Y as X,Ya as Yo,Yb as Yr,Yc as Ye,Yd as Zf,Ye as Zm,Z as Y,Za as Zo,Zb as Zr,Zc as Ze,Zd as _f,Ze as _m,_ as Z,_a as _o,_b as _r,_c as _e,_d as $f,_e as $m,aa as $,ab as or,ac as oe,ad as of,ae as rm,af as rp,b as o,ba as oo,bb as rr,bc as re,bd as rf,be as em,bf as ep,c as r,ca as ro,cb as er,cc as ee,cd as ef,ce as fm,cf as fp,d as e,da as eo,db as fr,dc as fe,dd as ff,de as mm,df as mp,e as f,ea as fo,eb as mr,ec as me,ed as mf,ee as pm,ef as pp,f as m,fa as mo,fb as pr,fc as pe,fd as pf,fe as tm,ff as tp,g as p,ga as po,gb as tr,gc as te,gd as tf,ge as xm,gf as xp,h as t,ha as to,hb as xr,hc as xe,hd as xf,he as am,hf as ap,i as x,ia as xo,ib as ar,ic as ae,id as af,ie as bm,if as bp,j as a,ja as ao,jb as br,jc as be,jd as bf,je as cm,jf as cp,k as b,ka as bo,kb as cr,kc as ce,kd as cf,ke as dm,kf as dp,l as c,la as co,lb as dr,lc as de,ld as df,le as gm,lf as gp,m as d,ma as go,mb as gr,mc as ge,md as gf,me as hm,mf as hp,n as g,na as ho,nb as hr,nc as he,nd as hf,ne as im,nf as ip,o as h,oa as io,ob as ir,oc as ie,od as jf,oe as jm,of as jp,p as i,pa as jo,pb as jr,pc as je,pd as kf,pe as km,pf as kp,q as j,qa as ko,qb as kr,qc as ke,qd as lf,qe as lm,qf as lp,r as k,ra as lo,rb as lr,rc as le,rd as nf,re as nm,rf as np,s as l,sa as no,sb as nr,sc as ne,sd as qf,se as qm,sf as qp,t as n,ta as qo,tb as qr,tc as qe,td as sf,te as sm,tf as sp,u as q,ua as so,ub as sr,uc as se,ud as uf,ue as um,uf as up,v as s,va as uo,vb as ur,vc as ue,vd as vf,ve as vm,vf as vp,w as u,wa as vo,wb as vr,wc as ve,wd as wf,we as wm,wf as wp,x as v,xa as wo,xb as wr,xc as we,xd as yf,xe as ym,xf as yp,y as w,ya as yo,yb as yr,yc as ye,yd as zf,ye as zm,yf as zp,z as y,za as zo,zb as zr,zc as ze,zd as Af,ze as Am,zf as Ap}from"./chunk-BS2OZM7U.js";import"./chunk-6ACT6FNV.js";export{Ke as AO_MODES,up as ATLAS_MANIFEST_PATH,oo as ATLAS_REGION_KEY,vp as ATLAS_SHEET_DIR,$ as ATLAS_SHEET_SCHEME,ro as ATLAS_SIZE_KEY,ko as AUDIO_BUS_NAMES,Hr as AmbientLightNode,hr as AnimatedSprite2D,Qr as AnimatedSprite3D,rp as AnimationPlayerBehavior,jo as AssetLoader,Im as AudioApi,ve as AudioPlayer,lo as AudioService,fr as BATCHABLE_2D_KEY,Jo as BLEND_MODES_2D,Ko as BLEND_MODE_2D_OPTIONS,Vo as BUILTIN_SHADER_EFFECTS,wm as BURST_MAX_PARTICLES,ae as Bar2D,mr as Batch2DSystem,Gp as BurstOnSignalBehavior,te as Button2D,Ar as CAMERA2D_DEFAULTS,Sf as CONTACT_MARGIN,Xe as CURRENT_SCENE_FORMAT_VERSION,Br as Camera2D,Ee as Camera3D,ep as CameraBrainBehavior,Dr as CanvasLayer2D,be as Checkbox2D,Lp as Collider2DBehavior,Rf as Collision2DService,kr as ColorRect2D,fp as CutsceneApi,Vm as DEFAULT_CLIP_DURATION,gp as DEFAULT_FIXED_DELTA_SEC,ye as DEFAULT_GEOMETRY_MATERIAL_TYPE,ip as DEFAULT_RUNTIME_TIME_CONFIG,k as DIRECTION_AXES_ENABLED_KEY,Er as DirectionalLightNode,Fe as EASING_NAMES,bp as ECSService,ff as EMOJI_GUARDED_TEXT_PROPERTIES,Cp as FadeBehavior,zm as FloatText2D,r as GAME_DEBUG_GLOBAL_KEY,ze as GEOMETRY_KINDS,we as GEOMETRY_MATERIAL_TYPES,sm as GameCommandRegistry,qm as GameTime,Ae as GeometryMesh,wr as Group2D,Or as HemisphereLightNode,Jp as Hitbox2DBehavior,ef as INSTANCE_TRANSFORM_KEYS,nf as InputService,Be as InstancedMesh3D,ce as InventorySlot2D,Wr as Joystick2D,Cm as JuiceApi,Ir as KNOWN_SCENE_NODE_TYPES,ie as LABEL_AUTO_SIZE_BLEED,je as LABEL_GLOW_STRENGTH_LIMIT,de as LABEL_H_ALIGN_VALUES,he as LABEL_LINE_HEIGHT_FACTOR,ge as LABEL_V_ALIGN_VALUES,ue as Label2D,mp as LocalizationService,Zf as MAX_NET_KIND,sf as MAX_POLYGON_VERTICES,hp as MAX_TICKS_PER_FRAME,Um as MIN_CLIP_DURATION,qf as MIN_POLYGON_VERTICES,L as MeshInstance,xm as NET_APP_FLAGS_SHIFT,tm as NET_OWNERSHIP_MASK,_f as NetKindTable,im as NetRoomVars,gm as NetworkConnectError,nm as NetworkNodeBinder,jm as NetworkService,dm as NetworkSpawnError,Op as NetworkedNodeBehavior,Po as Node2D,G as Node3D,F as NodeBase,re as OVERLAY_2D_FLAG,h as PHYSICS_DEBUG_ENABLED_KEY,c as PHYSICS_DEBUG_GLOBAL_KEY,Oe as POST_PROCESS_DEFAULTS,Le as PROJECT_AO_MODES,xf as PROJECT_SCRIPT_DIRECTORIES,af as PROJECT_SCRIPT_ENTRY_PATTERN,S as PROJECT_TEXTURE_FILTERING_MODES,ym as ParticleBurst2D,Rr as Particles3D,Xf as Physics2DService,Kp as PhysicsBody2DBehavior,Mp as PhysicsWorld2DBehavior,Bp as PinToNodeBehavior,Ep as PlaySoundBehavior,Fr as PointLightNode,vm as PopInBehavior,Pe as PostProcess,xp as PostProcessingPipeline,um as PunchScaleBehavior,x as RUNTIME_PROPERTY_SINK_GLOBAL_KEY,m as RUNTIME_SCENE_GLOBAL_KEY,Dp as RadialProgressBehavior,Yf as RejectCode,Pp as ReplicatedTransformBehavior,o as ResourceManager,Np as RevoluteJoint2DBehavior,yp as RotateBehavior,sp as RuntimeRenderer,_e as SCENE_COMPONENT_DEFINITION_KEYS,$e as SCENE_DISK_FORMAT_TYPES,Ye as SCENE_DOCUMENT_KEYS,Ze as SCENE_NODE_DEFINITION_KEYS,u as SCRIPT_ERROR_SINK_GLOBAL_KEY,me as SEMANTIC_POINTER_ID,Em as SFX_PRESETS,E as SHARED_UNIT_QUAD_GEOMETRY,y as SIGNAL_EMIT_SINK_GLOBAL_KEY,Te as SceneLoader,lf as SceneManager,qp as SceneRunner,kf as SceneSaver,pp as SceneService,Se as SceneValidationError,qo as Script,no as ScriptRegistry,fe as ScrollContainer2D,Fp as SfxOnSignalBehavior,Hm as SfxSynth,or as ShaderEffectStack,yr as ShakeBehavior,zp as SimpleMoveBehavior,Ap as SineBehavior,xe as Slider2D,jr as SpineSkeleton2D,ir as SpineSkeletonView,Gr as SpotLightNode,ar as Sprite2D,Pr as Sprite3D,Ce as TARGET_DISTANCE,q as TEST_COMPONENT_TYPE_PREFIX,Am as TRAIL_MAX_POINTS,vr as TiledSprite2D,Bm as Trail2D,Dm as TweenApi,pe as UIControl2D,bf as USER_SCRIPT_ID_PREFIX,Ie as VIRTUAL_CAMERA_DEFAULTS,Je as VirtualCamera3D,mm as WS_CLOSE_NORMAL,fm as WS_CLOSE_PROTOCOL_VIOLATION,pm as WsTransport,nr as ZERO_SLICE_BORDER,Oo as Z_INDEX_LIMIT,De as aimCameraNodeAt,Qe as aoModeUsesSSAO,No as applyBlendMode2DToMaterial,Tm as applyClipAtTime,He as applyEasing,ap as applyLocaleToTree,$r as applyTextStyle,Y as applyTextureRegionToTexture,ee as assign2DRenderOrder,K as assignWithoutSchemaRefresh,fo as atlasSizeOf,Ao as attachComponentDefinitions,eo as baseRegionOf,Mo as blendingForMode2D,Ef as boxPolygon,ur as buildSkinGeometry,lr as buildTiledSpriteGeometry,Gf as capsulePolygon,Jf as circleIntersectsPolygon,Ff as circlePolygon,Gm as clampSfxPitch,Af as cleanPolygon,Ym as coerceKeyframeValue,er as coerceTextureResource,Ro as coerceToPropertyType,Mm as collectAudioKeysInRange,P as collectClipPointNames,Co as collectComponentDefinitions,Nm as collectEventKeysInRange,Ue as collectRenderabilityIssues,Lm as collectTimedKeysInRange,Uf as collideCirclePolygon,Tf as collideCircles,Vf as collidePolygons,Zo as composeEffectShaders,Z as composeTextureRegion,W as configure2DTexture,Bf as convexHull,Mf as convexPolygonsIntersect,po as copyAtlasMetadata,to as createAtlasResolver,Sm as createClipBindings,$m as createDefaultClip,_m as createEmptyAnimationSet,Zr as cssFont,Xr as cssFontFamily,Yr as cssFontWeight,lm as decodeSignalPayload,Of as decomposeConvex,So as defineGroup,Qo as defineProperty,uo as describeFontFace,hm as describeRejectCode,D as describeThrown,Nr as describeUnknownNodeType,If as distanceToPolygonBoundary,_r as drawStyledText,Uo as effectSupportsTarget,km as encodeSignalPayload,zf as ensureCounterClockwise,Cr as findActiveCamera2D,R as findAnimationClip,O as findAnimationFramePoint,tf as findEmojiArtInSceneYaml,op as findKeyframeClip,Om as fireEventKey,Qm as fromSchemaValue,Xm as generateTrackId,tr as getActiveLocalization,Yo as getAllShaderEffectTypes,M as getAnimationFrameTexturePath,zo as getComponentSchemaProperties,f as getGameDebug,$f as getNetKindTable,Do as getNodePropertySchema,g as getPhysicsDebugSource,Ne as getProjectAODefault,V as getProjectTextureFiltering,Eo as getPropertiesByGroup,Fo as getPropertyDefinition,Go as getPropertyDisplayValue,b as getRuntimeLivePropertySink,t as getRuntimeSceneRoot,of as getSceneNodeDiskFormat,w as getScriptErrorSink,Xo as getShaderEffectType,A as getSignalEmitSink,wp as installAtlasFromManifest,I as installReactiveSchemaProperties,Jm as interpolateValue,n as isDirectionAxesEnabled,mf as isEmojiOnlyText,wo as isFontFaceRegistered,Re as isHighEndDevice,We as isInertNode,Sr as isInteractive,Ge as isKeyframeEasing,Lr as isKnownSceneNodeType,cm as isNetTeleport,j as isPhysicsDebugEnabled,yf as isPolygonConvex,gf as isProjectScriptEntry,df as isProjectScriptPath,_ as isSameTextureRegion,so as isScriptComponent,hf as isScriptComponentClass,N as isSequenceAnimationFrame,Fm as isSfxPreset,$o as isShaderEffectHost,sr as isSliceBorderEmpty,ao as isSpineModuleAvailable,s as isTestHarnessComponentType,pf as isTextProperty,rr as isTextureResourceRef,Wm as isTrackValueType,ne as labelDecorationPadding,ke as labelGlowBlurPx,le as labelGlowPasses,qe as layoutLabelText,yo as loadProjectFonts,io as loadSpineAsset,bo as loadSpineModule,H as makeSchemaPropertyReactive,To as mergeSchemas,bm as netFlagsByte,am as netOwnershipOf,Q as normalizeAnimationResource,Lo as normalizeBlendMode2D,Zm as normalizeKeyframeAnimationSet,Jr as normalizeNodeTypeName,Hp as normalizePolygonConfig,T as normalizeProjectTextureFiltering,qr as normalizeSliceBorder,se as paintLabelCanvas,br as parseEventArgs,ho as parseSpineAtlasPageNames,np as playable,Hf as pointInPolygon,vf as polygonArea,Cf as polygonBounds,wf as polygonCentroid,uf as polygonSignedArea,Rp as property,Qf as quaternionToRotationZ,J as reactiveSchemaPropertyNames,Ur as readBooleanArg,Tr as readNumberArg,Vr as readStringArg,Pf as readWorldTransform2D,Lf as rectIntersectsConvexPolygon,Kf as rectIntersectsPolygon,Qp as registerBuiltInScripts,e as registerGameDebug,rm as registerNetworkPrefab,d as registerPhysicsDebugSource,jf as registerProjectScriptExports,a as registerRuntimeLivePropertySink,p as registerRuntimeSceneRoot,v as registerScriptErrorSink,Wo as registerShaderEffect,z as registerSignalEmitSink,C as reportScriptError,B as reportSignalEmit,em as resetNetKindTable,vo as resetProjectFontRegistry,cr as resolveAnimatedSpriteFrameLayout,dr as resolveFramePointToLocal,gr as resolveFramePolygonToLocal,xr as resolveLocalizedText,Bo as resolvePendingComponents,jp as resolveRuntimeTimeConfig,rf as resolveSceneDiskKey,Kr as resolveSceneNodeType,go as resolveSpinePagePath,Rm as resolveTrackTarget,Km as sampleTrack,X as sanitizeTextureRegion,Nf as segmentPolygonT,Ip as serializePolygonConfig,pr as setActiveLocalization,lp as setDefaultStoreUrl,l as setDirectionAxesEnabled,om as setNetworkPrefabTable,Io as setNodePropertyValue,i as setPhysicsDebugEnabled,kp as setPlayableAdapter,tp as setPostprocessingModuleLoader,Me as setProjectAODefault,U as setProjectTextureFiltering,xo as setSpineModuleLoader,_o as shaderEffectsCacheKey,zr as shakeNoise,co as spineAssetKey,mo as stampAtlasView,Sp as state,oe as styledTextPadding,Mr as suggestSceneNodeType,Ve as summarizeRenderabilityIssues,Wf as sweepCircleAgainstPolygon,Pm as toSchemaValue,Df as transformPolygon,cf as userScriptComponentId,Ho as validatePropertyValue,cp as worldToCanvasLogical,dp as worldToCanvasThroughCamera};
2
+ import{$ as _,$a as $o,$b as $r,$c as $e,$d as om,$e as op,A as z,Aa as Ao,Ab as Ar,Ac as Ae,Ad as Bf,Ae as Bm,Af as Bp,B as A,Ba as Bo,Bb as Br,Bc as Be,Bd as Cf,Be as Cm,Bf as Cp,C as B,Ca as Co,Cb as Cr,Cc as Ce,Cd as Df,Ce as Dm,Cf as Dp,D as C,Da as Do,Db as Dr,Dc as De,Dd as Ef,De as Em,Df as Ep,E as D,Ea as Eo,Eb as Er,Ec as Ee,Ed as Ff,Ee as Fm,Ef as Fp,F as E,Fa as Fo,Fb as Fr,Fc as Fe,Fd as Gf,Fe as Gm,Ff as Gp,G as F,Ga as Go,Gb as Gr,Gc as Ge,Gd as Hf,Ge as Hm,Gf as Hp,H as G,Ha as Ho,Hb as Hr,Hc as He,Hd as If,He as Im,Hf as Ip,I as H,Ia as Io,Ib as Ir,Ic as Ie,Id as Jf,Ie as Jm,If as Jp,J as I,Ja as Jo,Jb as Jr,Jc as Je,Jd as Kf,Je as Km,Jf as Kp,K as J,Ka as Ko,Kb as Kr,Kc as Ke,Kd as Lf,Ke as Lm,Kf as Lp,L as K,La as Lo,Lb as Lr,Lc as Le,Ld as Mf,Le as Mm,Lf as Mp,M as L,Ma as Mo,Mb as Mr,Mc as Me,Md as Nf,Me as Nm,Mf as Np,N as M,Na as No,Nb as Nr,Nc as Ne,Nd as Of,Ne as Om,Nf as Op,O as N,Oa as Oo,Ob as Or,Oc as Oe,Od as Pf,Oe as Pm,Of as Pp,P as O,Pa as Po,Pb as Pr,Pc as Pe,Pd as Qf,Pe as Qm,Pf as Qp,Q as P,Qa as Qo,Qb as Qr,Qc as Qe,Qd as Rf,Qe as Rm,Qf as Rp,R as Q,Ra as Ro,Rb as Rr,Rc as Re,Rd as Sf,Re as Sm,Rf as Sp,S as R,Sa as So,Sb as Sr,Sc as Se,Sd as Tf,Se as Tm,Sf as Tp,T as S,Ta as To,Tb as Tr,Tc as Te,Td as Uf,Te as Um,Tf as Up,U as T,Ua as Uo,Ub as Ur,Uc as Ue,Ud as Vf,Ue as Vm,V as U,Va as Vo,Vb as Vr,Vc as Ve,Vd as Wf,Ve as Wm,W as V,Wa as Wo,Wb as Wr,Wc as We,Wd as Xf,We as Xm,X as W,Xa as Xo,Xb as Xr,Xc as Xe,Xd as Yf,Xe as Ym,Y as X,Ya as Yo,Yb as Yr,Yc as Ye,Yd as Zf,Ye as Zm,Z as Y,Za as Zo,Zb as Zr,Zc as Ze,Zd as _f,Ze as _m,_ as Z,_a as _o,_b as _r,_c as _e,_d as $f,_e as $m,aa as $,ab as or,ac as oe,ad as of,ae as rm,af as rp,b as o,ba as oo,bb as rr,bc as re,bd as rf,be as em,bf as ep,c as r,ca as ro,cb as er,cc as ee,cd as ef,ce as fm,cf as fp,d as e,da as eo,db as fr,dc as fe,dd as ff,de as mm,df as mp,e as f,ea as fo,eb as mr,ec as me,ed as mf,ee as pm,ef as pp,f as m,fa as mo,fb as pr,fc as pe,fd as pf,fe as tm,ff as tp,g as p,ga as po,gb as tr,gc as te,gd as tf,ge as xm,gf as xp,h as t,ha as to,hb as xr,hc as xe,hd as xf,he as am,hf as ap,i as x,ia as xo,ib as ar,ic as ae,id as af,ie as bm,if as bp,j as a,ja as ao,jb as br,jc as be,jd as bf,je as cm,jf as cp,k as b,ka as bo,kb as cr,kc as ce,kd as cf,ke as dm,kf as dp,l as c,la as co,lb as dr,lc as de,ld as df,le as gm,lf as gp,m as d,ma as go,mb as gr,mc as ge,md as gf,me as hm,mf as hp,n as g,na as ho,nb as hr,nc as he,nd as hf,ne as im,nf as ip,o as h,oa as io,ob as ir,oc as ie,od as jf,oe as jm,of as jp,p as i,pa as jo,pb as jr,pc as je,pd as kf,pe as km,pf as kp,q as j,qa as ko,qb as kr,qc as ke,qd as lf,qe as lm,qf as lp,r as k,ra as lo,rb as lr,rc as le,rd as nf,re as nm,rf as np,s as l,sa as no,sb as nr,sc as ne,sd as qf,se as qm,sf as qp,t as n,ta as qo,tb as qr,tc as qe,td as sf,te as sm,tf as sp,u as q,ua as so,ub as sr,uc as se,ud as uf,ue as um,uf as up,v as s,va as uo,vb as ur,vc as ue,vd as vf,ve as vm,vf as vp,w as u,wa as vo,wb as vr,wc as ve,wd as wf,we as wm,wf as wp,x as v,xa as wo,xb as wr,xc as we,xd as yf,xe as ym,xf as yp,y as w,ya as yo,yb as yr,yc as ye,yd as zf,ye as zm,yf as zp,z as y,za as zo,zb as zr,zc as ze,zd as Af,ze as Am,zf as Ap}from"./chunk-CFQFEI52.js";import"./chunk-6ACT6FNV.js";export{Ke as AO_MODES,up as ATLAS_MANIFEST_PATH,oo as ATLAS_REGION_KEY,vp as ATLAS_SHEET_DIR,$ as ATLAS_SHEET_SCHEME,ro as ATLAS_SIZE_KEY,ko as AUDIO_BUS_NAMES,Hr as AmbientLightNode,hr as AnimatedSprite2D,Qr as AnimatedSprite3D,rp as AnimationPlayerBehavior,jo as AssetLoader,Im as AudioApi,ve as AudioPlayer,lo as AudioService,fr as BATCHABLE_2D_KEY,Jo as BLEND_MODES_2D,Ko as BLEND_MODE_2D_OPTIONS,Vo as BUILTIN_SHADER_EFFECTS,wm as BURST_MAX_PARTICLES,ae as Bar2D,mr as Batch2DSystem,Gp as BurstOnSignalBehavior,te as Button2D,Ar as CAMERA2D_DEFAULTS,Op as CHARACTER_STATE_FINISHED_SIGNAL,Sf as CONTACT_MARGIN,Xe as CURRENT_SCENE_FORMAT_VERSION,Br as Camera2D,Ee as Camera3D,ep as CameraBrainBehavior,Dr as CanvasLayer2D,Pp as CharacterVisual2DBehavior,be as Checkbox2D,Lp as Collider2DBehavior,Rf as Collision2DService,kr as ColorRect2D,fp as CutsceneApi,Vm as DEFAULT_CLIP_DURATION,gp as DEFAULT_FIXED_DELTA_SEC,ye as DEFAULT_GEOMETRY_MATERIAL_TYPE,ip as DEFAULT_RUNTIME_TIME_CONFIG,k as DIRECTION_AXES_ENABLED_KEY,Er as DirectionalLightNode,Fe as EASING_NAMES,bp as ECSService,ff as EMOJI_GUARDED_TEXT_PROPERTIES,Cp as FadeBehavior,zm as FloatText2D,r as GAME_DEBUG_GLOBAL_KEY,ze as GEOMETRY_KINDS,we as GEOMETRY_MATERIAL_TYPES,sm as GameCommandRegistry,qm as GameTime,Ae as GeometryMesh,wr as Group2D,Or as HemisphereLightNode,Jp as Hitbox2DBehavior,ef as INSTANCE_TRANSFORM_KEYS,nf as InputService,Be as InstancedMesh3D,ce as InventorySlot2D,Wr as Joystick2D,Cm as JuiceApi,Ir as KNOWN_SCENE_NODE_TYPES,ie as LABEL_AUTO_SIZE_BLEED,je as LABEL_GLOW_STRENGTH_LIMIT,de as LABEL_H_ALIGN_VALUES,he as LABEL_LINE_HEIGHT_FACTOR,ge as LABEL_V_ALIGN_VALUES,ue as Label2D,mp as LocalizationService,Zf as MAX_NET_KIND,sf as MAX_POLYGON_VERTICES,hp as MAX_TICKS_PER_FRAME,Um as MIN_CLIP_DURATION,qf as MIN_POLYGON_VERTICES,L as MeshInstance,xm as NET_APP_FLAGS_SHIFT,tm as NET_OWNERSHIP_MASK,_f as NetKindTable,im as NetRoomVars,gm as NetworkConnectError,nm as NetworkNodeBinder,jm as NetworkService,dm as NetworkSpawnError,Qp as NetworkedNodeBehavior,Po as Node2D,G as Node3D,F as NodeBase,re as OVERLAY_2D_FLAG,h as PHYSICS_DEBUG_ENABLED_KEY,c as PHYSICS_DEBUG_GLOBAL_KEY,Oe as POST_PROCESS_DEFAULTS,Le as PROJECT_AO_MODES,xf as PROJECT_SCRIPT_DIRECTORIES,af as PROJECT_SCRIPT_ENTRY_PATTERN,S as PROJECT_TEXTURE_FILTERING_MODES,ym as ParticleBurst2D,Rr as Particles3D,Xf as Physics2DService,Kp as PhysicsBody2DBehavior,Mp as PhysicsWorld2DBehavior,Bp as PinToNodeBehavior,Ep as PlaySoundBehavior,Fr as PointLightNode,vm as PopInBehavior,Pe as PostProcess,xp as PostProcessingPipeline,um as PunchScaleBehavior,x as RUNTIME_PROPERTY_SINK_GLOBAL_KEY,m as RUNTIME_SCENE_GLOBAL_KEY,Dp as RadialProgressBehavior,Yf as RejectCode,Rp as ReplicatedTransformBehavior,o as ResourceManager,Np as RevoluteJoint2DBehavior,yp as RotateBehavior,sp as RuntimeRenderer,_e as SCENE_COMPONENT_DEFINITION_KEYS,$e as SCENE_DISK_FORMAT_TYPES,Ye as SCENE_DOCUMENT_KEYS,Ze as SCENE_NODE_DEFINITION_KEYS,u as SCRIPT_ERROR_SINK_GLOBAL_KEY,me as SEMANTIC_POINTER_ID,Em as SFX_PRESETS,E as SHARED_UNIT_QUAD_GEOMETRY,y as SIGNAL_EMIT_SINK_GLOBAL_KEY,Te as SceneLoader,lf as SceneManager,qp as SceneRunner,kf as SceneSaver,pp as SceneService,Se as SceneValidationError,qo as Script,no as ScriptRegistry,fe as ScrollContainer2D,Fp as SfxOnSignalBehavior,Hm as SfxSynth,or as ShaderEffectStack,yr as ShakeBehavior,zp as SimpleMoveBehavior,Ap as SineBehavior,xe as Slider2D,jr as SpineSkeleton2D,ir as SpineSkeletonView,Gr as SpotLightNode,ar as Sprite2D,Pr as Sprite3D,Ce as TARGET_DISTANCE,q as TEST_COMPONENT_TYPE_PREFIX,Am as TRAIL_MAX_POINTS,vr as TiledSprite2D,Bm as Trail2D,Dm as TweenApi,pe as UIControl2D,bf as USER_SCRIPT_ID_PREFIX,Ie as VIRTUAL_CAMERA_DEFAULTS,Je as VirtualCamera3D,mm as WS_CLOSE_NORMAL,fm as WS_CLOSE_PROTOCOL_VIOLATION,pm as WsTransport,nr as ZERO_SLICE_BORDER,Oo as Z_INDEX_LIMIT,De as aimCameraNodeAt,Qe as aoModeUsesSSAO,No as applyBlendMode2DToMaterial,Tm as applyClipAtTime,He as applyEasing,ap as applyLocaleToTree,$r as applyTextStyle,Y as applyTextureRegionToTexture,ee as assign2DRenderOrder,K as assignWithoutSchemaRefresh,fo as atlasSizeOf,Ao as attachComponentDefinitions,eo as baseRegionOf,Mo as blendingForMode2D,Ef as boxPolygon,ur as buildSkinGeometry,lr as buildTiledSpriteGeometry,Gf as capsulePolygon,Jf as circleIntersectsPolygon,Ff as circlePolygon,Gm as clampSfxPitch,Af as cleanPolygon,Ym as coerceKeyframeValue,er as coerceTextureResource,Ro as coerceToPropertyType,Mm as collectAudioKeysInRange,P as collectClipPointNames,Co as collectComponentDefinitions,Nm as collectEventKeysInRange,Ue as collectRenderabilityIssues,Lm as collectTimedKeysInRange,Uf as collideCirclePolygon,Tf as collideCircles,Vf as collidePolygons,Zo as composeEffectShaders,Z as composeTextureRegion,W as configure2DTexture,Bf as convexHull,Mf as convexPolygonsIntersect,po as copyAtlasMetadata,to as createAtlasResolver,Sm as createClipBindings,$m as createDefaultClip,_m as createEmptyAnimationSet,Zr as cssFont,Xr as cssFontFamily,Yr as cssFontWeight,lm as decodeSignalPayload,Of as decomposeConvex,So as defineGroup,Qo as defineProperty,uo as describeFontFace,hm as describeRejectCode,D as describeThrown,Nr as describeUnknownNodeType,If as distanceToPolygonBoundary,_r as drawStyledText,Uo as effectSupportsTarget,km as encodeSignalPayload,zf as ensureCounterClockwise,Cr as findActiveCamera2D,R as findAnimationClip,O as findAnimationFramePoint,tf as findEmojiArtInSceneYaml,op as findKeyframeClip,Om as fireEventKey,Qm as fromSchemaValue,Xm as generateTrackId,tr as getActiveLocalization,Yo as getAllShaderEffectTypes,M as getAnimationFrameTexturePath,zo as getComponentSchemaProperties,f as getGameDebug,$f as getNetKindTable,Do as getNodePropertySchema,g as getPhysicsDebugSource,Ne as getProjectAODefault,V as getProjectTextureFiltering,Eo as getPropertiesByGroup,Fo as getPropertyDefinition,Go as getPropertyDisplayValue,b as getRuntimeLivePropertySink,t as getRuntimeSceneRoot,of as getSceneNodeDiskFormat,w as getScriptErrorSink,Xo as getShaderEffectType,A as getSignalEmitSink,wp as installAtlasFromManifest,I as installReactiveSchemaProperties,Jm as interpolateValue,n as isDirectionAxesEnabled,mf as isEmojiOnlyText,wo as isFontFaceRegistered,Re as isHighEndDevice,We as isInertNode,Sr as isInteractive,Ge as isKeyframeEasing,Lr as isKnownSceneNodeType,cm as isNetTeleport,j as isPhysicsDebugEnabled,yf as isPolygonConvex,gf as isProjectScriptEntry,df as isProjectScriptPath,_ as isSameTextureRegion,so as isScriptComponent,hf as isScriptComponentClass,N as isSequenceAnimationFrame,Fm as isSfxPreset,$o as isShaderEffectHost,sr as isSliceBorderEmpty,ao as isSpineModuleAvailable,s as isTestHarnessComponentType,pf as isTextProperty,rr as isTextureResourceRef,Wm as isTrackValueType,ne as labelDecorationPadding,ke as labelGlowBlurPx,le as labelGlowPasses,qe as layoutLabelText,yo as loadProjectFonts,io as loadSpineAsset,bo as loadSpineModule,H as makeSchemaPropertyReactive,To as mergeSchemas,bm as netFlagsByte,am as netOwnershipOf,Q as normalizeAnimationResource,Lo as normalizeBlendMode2D,Zm as normalizeKeyframeAnimationSet,Jr as normalizeNodeTypeName,Hp as normalizePolygonConfig,T as normalizeProjectTextureFiltering,qr as normalizeSliceBorder,se as paintLabelCanvas,br as parseEventArgs,ho as parseSpineAtlasPageNames,np as playable,Hf as pointInPolygon,vf as polygonArea,Cf as polygonBounds,wf as polygonCentroid,uf as polygonSignedArea,Tp as property,Qf as quaternionToRotationZ,J as reactiveSchemaPropertyNames,Ur as readBooleanArg,Tr as readNumberArg,Vr as readStringArg,Pf as readWorldTransform2D,Lf as rectIntersectsConvexPolygon,Kf as rectIntersectsPolygon,Sp as registerBuiltInScripts,e as registerGameDebug,rm as registerNetworkPrefab,d as registerPhysicsDebugSource,jf as registerProjectScriptExports,a as registerRuntimeLivePropertySink,p as registerRuntimeSceneRoot,v as registerScriptErrorSink,Wo as registerShaderEffect,z as registerSignalEmitSink,C as reportScriptError,B as reportSignalEmit,em as resetNetKindTable,vo as resetProjectFontRegistry,cr as resolveAnimatedSpriteFrameLayout,dr as resolveFramePointToLocal,gr as resolveFramePolygonToLocal,xr as resolveLocalizedText,Bo as resolvePendingComponents,jp as resolveRuntimeTimeConfig,rf as resolveSceneDiskKey,Kr as resolveSceneNodeType,go as resolveSpinePagePath,Rm as resolveTrackTarget,Km as sampleTrack,X as sanitizeTextureRegion,Nf as segmentPolygonT,Ip as serializePolygonConfig,pr as setActiveLocalization,lp as setDefaultStoreUrl,l as setDirectionAxesEnabled,om as setNetworkPrefabTable,Io as setNodePropertyValue,i as setPhysicsDebugEnabled,kp as setPlayableAdapter,tp as setPostprocessingModuleLoader,Me as setProjectAODefault,U as setProjectTextureFiltering,xo as setSpineModuleLoader,_o as shaderEffectsCacheKey,zr as shakeNoise,co as spineAssetKey,mo as stampAtlasView,Up as state,oe as styledTextPadding,Mr as suggestSceneNodeType,Ve as summarizeRenderabilityIssues,Wf as sweepCircleAgainstPolygon,Pm as toSchemaValue,Df as transformPolygon,cf as userScriptComponentId,Ho as validatePropertyValue,cp as worldToCanvasLogical,dp as worldToCanvasThroughCamera};
@@ -1,210 +1,210 @@
1
- ---
2
- name: pix3-nodes
3
- description: Compact property reference for the Pix3 2D node types used by the recipes — Group2D, ColorRect2D, Sprite2D, Label2D, Button2D, Bar2D, CanvasLayer2D, PostProcess — plus the Node2D base properties, anchor layout and paint order; the full per-node reference (every 2D and 3D node) is reference.md beside it. Use when adding a node to a .pix3scene, choosing which node type to use, or checking a property name/type before writing it.
4
- ---
5
-
6
- <!-- Pix3 agent kit 1.6.0 -->
7
- # 2D nodes — compact reference
8
-
9
- Property names below are the exact YAML keys under `properties:`. A misspelled key is kept
10
- silently and does nothing, so copy them from here or from an existing node in the project
11
- (`pix3 check` flags unknown keys). Every node type, 2D and 3D, is in `reference.md` beside
12
- this file — grep `### <NodeName>` there instead of reading it whole.
13
-
14
- ## Which node
15
-
16
- | Need | Node |
17
- | --- | --- |
18
- | Scene root, a panel, a spawn band, any sized container | `Group2D` |
19
- | Solid rectangle; the honest placeholder | `ColorRect2D` |
20
- | An image (PNG/JPG/WebP) | `Sprite2D` |
21
- | A nine-slice panel / tiled background | `TiledSprite2D` |
22
- | Text | `Label2D` |
23
- | Tappable button | `Button2D` |
24
- | Health / progress bar | `Bar2D` |
25
- | Fixed HUD layer that ignores the 2D camera and is never post-processed | `CanvasLayer2D` |
26
- | Bloom / vignette | `PostProcess` (no transform; set `affect2D: true` in a 2D scene) |
27
- | Bare transform, no size | `Node2D` |
28
-
29
- Other 2D types exist (`AnimatedSprite2D`, `Slider2D`, `Checkbox2D`, `Joystick2D`,
30
- `ScrollContainer2D`, `InventorySlot2D`, `Camera2D`, `SpineSkeleton2D`); do not guess their
31
- keys — read their section in `reference.md` first. `Layout2D` is removed and fails the load.
32
-
33
- ## Node2D — every 2D node has these
34
-
35
- | Key | Type | Default | Notes |
36
- | --- | --- | --- | --- |
37
- | `transform` | block | — | `{ position: [x, y], scale: [sx, sy], rotation: degrees }` — centre of the node, Y up, positive rotation = counter-clockwise |
38
- | `visible` | bool | true | On an overlay **instance**: editor-only hide (see pix3-scene-format) |
39
- | `initiallyVisible` | bool | — | Applied when play mode starts; authored on an overlay file's root |
40
- | `opacity` | number | 1 | 0..1, multiplies into children |
41
- | `zIndex` | int | 0 | -4096..4096; higher draws on top; ties = tree order |
42
- | `zAsRelative` | bool | true | Add to the parent's z instead of absolute |
43
- | `blendMode` | enum | normal | `normal`, `additive` (glow/VFX), `multiply`, `subtract`; not inherited |
44
- | `layout` | block | — | `{ enabled, horizontalAlign: left/center/right/stretch, verticalAlign: top/center/bottom/stretch }` |
45
- | `flow` | block | — | `{ enabled, direction: vertical/horizontal, gap, paddingX, paddingY, align: start/center/end, autoSize }` |
46
-
47
- Paint order = tree order (later sibling / deeper node on top) unless `zIndex` says otherwise.
48
- Shader `effects` exist only on `Sprite2D`, `AnimatedSprite2D` and `Button2D`.
49
-
50
- ## Group2D
51
-
52
- Sized container; draws nothing. Use it as the scene root (sized to `viewportBaseSize` from
53
- `pix3project.yaml` — `width: 1080, height: 1920` in the recipes — `layout` stretch/stretch) and for any panel whose children anchor or flow against it.
54
-
55
- | Key | Type | Default |
56
- | --- | --- | --- |
57
- | `width` | number | 100 |
58
- | `height` | number | 100 |
59
-
60
- ## ColorRect2D
61
-
62
- The only untextured 2D fill. Build the game from these first, swap to sprites later.
63
-
64
- | Key | Type | Default | Notes |
65
- | --- | --- | --- | --- |
66
- | `width` | number | 100 | |
67
- | `height` | number | 100 | |
68
- | `color` | colour | "#ffffff" | Quoted hex. Alpha via `opacity`, not the colour |
69
-
70
- ## Sprite2D
71
-
72
- | Key | Type | Default | Notes |
73
- | --- | --- | --- | --- |
74
- | `texture` | texture | — | `{ type: 'texture', url: 'res://sprites/x.png' }` (a bare `texturePath` string is only read for compatibility) |
75
- | `width` | number | texture width | Display size; the image is scaled to it (64 until the texture loads) |
76
- | `height` | number | texture height | |
77
- | `anchor` | vector2 | [0.5, 0.5] | Pivot the image is positioned around |
78
- | `aspectRatioLocked` | bool | false | Keep the texture's aspect while resizing |
79
- | `effects` | list | — | `[{ type: core:tint, params: { color: "#hex", amount: 1 } }]` — how a near-white placeholder gets its colour |
80
-
81
- There is no tint property: colour a sprite with a `core:tint` effect. Recipe placeholders are
82
- near-white `sprites/ph-*.png` + `effects: [{ type: core:tint, params: { color, amount: 1 } }]`.
83
-
84
- ### An SVG you write as a sprite
85
-
86
- A `.svg` in `sprites/` works as a `Sprite2D` / `Button2D` texture in the editor, in play mode and
87
- in the single-file export — **when a browser `<img>` would decode it**, because that is how every
88
- texture loads. The browser rasterises it once, at its own `width`/`height`, and the GPU scales that
89
- bitmap. So:
90
-
91
- ```xml
92
- <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
93
- <circle cx="64" cy="64" r="56" fill="#ffcf33" stroke="#8a5a00" stroke-width="8"/>
94
- </svg>
95
- ```
96
-
97
- - `xmlns="http://www.w3.org/2000/svg"` on the root — without it nothing renders.
98
- - `width` and `height` in px **and** a matching `viewBox`. Without a size the browser invents a
99
- 300x150 box (art letterboxed or cropped, the sprite auto-sizes to 300x150).
100
- - Make `width`/`height` the size the node draws it at (the node's `width`/`height`), or larger —
101
- a 32px SVG drawn at 256px is a blurry bitmap, not crisp vectors.
102
- - Self-contained: no `<image href="http…">`, no `<use href="other.svg#…">`, no CSS `url(file)`,
103
- no `@import`, no webfonts — none of them load when an SVG is an image (only `#id` and `data:`
104
- do). Text only with generic families (`font-family="sans-serif"`); better, draw shapes.
105
-
106
- `pix3 validate` checks every `.svg` a scene references: `E_SVG_INVALID` (no `<svg>` root or no
107
- xmlns), `E_SVG_NO_SIZE`, `W_SVG_VIEWBOX_ONLY`, `W_SVG_EXTERNAL_REF`.
108
-
109
- ## Label2D
110
-
111
- | Key | Type | Default | Notes |
112
- | --- | --- | --- | --- |
113
- | `label` | string | "" | The text; `\n` breaks lines. Never only emoji |
114
- | `labelFontSize` | number | 16 | px |
115
- | `labelColor` | colour | "#ffffff" | |
116
- | `labelFontFamily` | string | Arial | A family the project ships in `fonts/`, else a system face |
117
- | `labelFontWeight` | number | 400 | 400 / 700 / 900 … |
118
- | `labelAlign` | enum | center | `left`, `center`, `right` |
119
- | `labelVAlign` | enum | middle | `top`, `middle`, `bottom` |
120
- | `width` / `height` | number | 0 | 0 = auto-size, no wrap. Set `width` to word-wrap |
121
- | `glowColor` / `glowStrength` | colour / 0–4 | "#ffffff" / 0 | Canvas-drawn neon glow; 2–3 reads as neon |
122
- | `outlineColor` / `outlineWidth` | colour / px | "#000000" / 0 | Contrast outline |
123
- | `labelShadowColor`, `labelShadowOffsetX/Y`, `labelLetterSpacing`, `typewriterSpeed` | | | see `reference.md` |
124
-
125
- Scripts: `label.setText('SCORE 5')`.
126
-
127
- ## Button2D
128
-
129
- | Key | Type | Default | Notes |
130
- | --- | --- | --- | --- |
131
- | `width` / `height` | number | 100 / 40 | |
132
- | `label` | string | "" | Caption; `labelFontSize` (16), `labelColor` ("#ffffff"), `labelAlign` as on Label2D |
133
- | `backgroundColor` | colour | "#4a4a4a" | Flat idle colour |
134
- | `hoverColor` | colour | "#5a5a5a" | |
135
- | `pressedColor` | colour | "#3a3a3a" | |
136
- | `buttonAction` | string | "Submit" | Free identifier for scripts |
137
- | `enabled` | bool | true | A disabled button takes no input |
138
- | `textureNormal` / `textureHover` / `texturePressed` / `textureDisabled` | texture | — | Skin sprites; a set slot replaces the flat colour |
139
- | `sliceBorderLeft/Right/Top/Bottom` | number | 0 | Nine-slice insets in source pixels |
140
- | `effects` | list | — | Shader effects on the skin |
141
-
142
- Signals: `pressed` (finger/button went down inside it), `released`, `click` (down **and** up
143
- inside it — a completed tap; sliding off cancels it), `pointerdown`, `pointerup`. The recipes
144
- wire `pressed` for an instant response; use `click` where an accidental touch must be
145
- cancellable (menus, purchases). `button.connect('click', this, handler)`.
146
-
147
- ## Bar2D
148
-
149
- | Key | Type | Default | Notes |
150
- | --- | --- | --- | --- |
151
- | `width` / `height` | number | 150 / 20 | |
152
- | `minValue` / `maxValue` / `value` | number | 0 / 100 / 100 | Fill = value within the range (clamped) |
153
- | `barColor` | colour | "#ff4444" | Fill colour |
154
- | `backBackgroundColor` | colour | "#333333" | Trough colour |
155
- | `showBorder` / `borderColor` / `borderWidth` | bool / colour / px | true / "#000000" / 2 | The recipes set `showBorder: false` |
156
- | `textureTrough` / `textureFill` | texture | — | Skin sprites |
157
- | `sliceBorderLeft/Right/Top/Bottom` | number | 0 | Nine-slice insets of the skins |
158
-
159
- Scripts: `bar.maxValue = n; bar.setValue(v)`.
160
-
161
- ## CanvasLayer2D
162
-
163
- A HUD band: rendered after post-processing (never blooms) with a fixed camera. Same keys as
164
- `Group2D` (`width`, `height`, transform, layout). Put score/time/lives/buttons under it.
165
- Its ancestors' transform, opacity and visibility still apply.
166
-
167
- ## PostProcess
168
-
169
- No transform — keys sit flat in `properties`. The first active one in the tree wins.
170
-
171
- | Key | Type | Default | Notes |
172
- | --- | --- | --- | --- |
173
- | `affect2D` | bool | true | Apply to the 2D layer too |
174
- | `bloomEnabled` / `bloomIntensity` / `bloomThreshold` | bool / number / number | true / 1 / 0.9 | Bloom lifts only what is already bright |
175
- | `bloomSmoothing` / `bloomRadius` | number | | |
176
- | `vignetteEnabled` / `vignetteOffset` / `vignetteDarkness` | bool / number / number | | |
177
- | `chromaticAberrationEnabled` / `chromaticAberrationOffset` | bool / number | | |
178
-
179
- Brighten the colour or lower `bloomThreshold` rather than raising `bloomIntensity`. The
180
- opposite for a pastel or light look: a pale ground sits above a low threshold and the whole
181
- screen blooms — **raise** `bloomThreshold` (0.85–0.95) so only the accents glow.
182
-
183
- ## Example — a new HUD label anchored top-right
184
-
185
- ```yaml
186
- - id: combo-label
187
- type: Label2D
188
- name: Combo Label
189
- properties:
190
- label: ""
191
- labelFontSize: 40
192
- labelColor: "#f5ae39"
193
- labelAlign: right
194
- transform:
195
- position: [340, 790]
196
- scale: [1, 1]
197
- rotation: 0
198
- layout:
199
- enabled: true
200
- horizontalAlign: right
201
- verticalAlign: top
202
- children: []
203
- ```
204
-
205
- ## Known gaps
206
-
207
- - On a **cloud** project (opened from the Pix3 server, not a folder or `pix3 serve`) an `.svg`
208
- sprite renders on first load and then goes blank: the local cache hands SVGs back as
209
- `text/plain`, which no browser decodes as an image. Folder and `pix3 serve` projects are fine;
210
- on cloud, use a PNG.
1
+ ---
2
+ name: pix3-nodes
3
+ description: Compact property reference for the Pix3 2D node types used by the recipes — Group2D, ColorRect2D, Sprite2D, Label2D, Button2D, Bar2D, CanvasLayer2D, PostProcess — plus the Node2D base properties, anchor layout and paint order; the full per-node reference (every 2D and 3D node) is reference.md beside it. Use when adding a node to a .pix3scene, choosing which node type to use, or checking a property name/type before writing it.
4
+ ---
5
+
6
+ <!-- Pix3 agent kit 1.6.3 -->
7
+ # 2D nodes — compact reference
8
+
9
+ Property names below are the exact YAML keys under `properties:`. A misspelled key is kept
10
+ silently and does nothing, so copy them from here or from an existing node in the project
11
+ (`pix3 check` flags unknown keys). Every node type, 2D and 3D, is in `reference.md` beside
12
+ this file — grep `### <NodeName>` there instead of reading it whole.
13
+
14
+ ## Which node
15
+
16
+ | Need | Node |
17
+ | --- | --- |
18
+ | Scene root, a panel, a spawn band, any sized container | `Group2D` |
19
+ | Solid rectangle; the honest placeholder | `ColorRect2D` |
20
+ | An image (PNG/JPG/WebP) | `Sprite2D` |
21
+ | A nine-slice panel / tiled background | `TiledSprite2D` |
22
+ | Text | `Label2D` |
23
+ | Tappable button | `Button2D` |
24
+ | Health / progress bar | `Bar2D` |
25
+ | Fixed HUD layer that ignores the 2D camera and is never post-processed | `CanvasLayer2D` |
26
+ | Bloom / vignette | `PostProcess` (no transform; set `affect2D: true` in a 2D scene) |
27
+ | Bare transform, no size | `Node2D` |
28
+
29
+ Other 2D types exist (`AnimatedSprite2D`, `Slider2D`, `Checkbox2D`, `Joystick2D`,
30
+ `ScrollContainer2D`, `InventorySlot2D`, `Camera2D`, `SpineSkeleton2D`); do not guess their
31
+ keys — read their section in `reference.md` first. `Layout2D` is removed and fails the load.
32
+
33
+ ## Node2D — every 2D node has these
34
+
35
+ | Key | Type | Default | Notes |
36
+ | --- | --- | --- | --- |
37
+ | `transform` | block | — | `{ position: [x, y], scale: [sx, sy], rotation: degrees }` — centre of the node, Y up, positive rotation = counter-clockwise |
38
+ | `visible` | bool | true | On an overlay **instance**: editor-only hide (see pix3-scene-format) |
39
+ | `initiallyVisible` | bool | — | Applied when play mode starts; authored on an overlay file's root |
40
+ | `opacity` | number | 1 | 0..1, multiplies into children |
41
+ | `zIndex` | int | 0 | -4096..4096; higher draws on top; ties = tree order |
42
+ | `zAsRelative` | bool | true | Add to the parent's z instead of absolute |
43
+ | `blendMode` | enum | normal | `normal`, `additive` (glow/VFX), `multiply`, `subtract`; not inherited |
44
+ | `layout` | block | — | `{ enabled, horizontalAlign: left/center/right/stretch, verticalAlign: top/center/bottom/stretch }` |
45
+ | `flow` | block | — | `{ enabled, direction: vertical/horizontal, gap, paddingX, paddingY, align: start/center/end, autoSize }` |
46
+
47
+ Paint order = tree order (later sibling / deeper node on top) unless `zIndex` says otherwise.
48
+ Shader `effects` exist only on `Sprite2D`, `AnimatedSprite2D` and `Button2D`.
49
+
50
+ ## Group2D
51
+
52
+ Sized container; draws nothing. Use it as the scene root (sized to `viewportBaseSize` from
53
+ `pix3project.yaml` — `width: 1080, height: 1920` in the recipes — `layout` stretch/stretch) and for any panel whose children anchor or flow against it.
54
+
55
+ | Key | Type | Default |
56
+ | --- | --- | --- |
57
+ | `width` | number | 100 |
58
+ | `height` | number | 100 |
59
+
60
+ ## ColorRect2D
61
+
62
+ The only untextured 2D fill. Build the game from these first, swap to sprites later.
63
+
64
+ | Key | Type | Default | Notes |
65
+ | --- | --- | --- | --- |
66
+ | `width` | number | 100 | |
67
+ | `height` | number | 100 | |
68
+ | `color` | colour | "#ffffff" | Quoted hex. Alpha via `opacity`, not the colour |
69
+
70
+ ## Sprite2D
71
+
72
+ | Key | Type | Default | Notes |
73
+ | --- | --- | --- | --- |
74
+ | `texture` | texture | — | `{ type: 'texture', url: 'res://sprites/x.png' }` (a bare `texturePath` string is only read for compatibility) |
75
+ | `width` | number | texture width | Display size; the image is scaled to it (64 until the texture loads) |
76
+ | `height` | number | texture height | |
77
+ | `anchor` | vector2 | [0.5, 0.5] | Pivot the image is positioned around |
78
+ | `aspectRatioLocked` | bool | false | Keep the texture's aspect while resizing |
79
+ | `effects` | list | — | `[{ type: core:tint, params: { color: "#hex", amount: 1 } }]` — how a near-white placeholder gets its colour |
80
+
81
+ There is no tint property: colour a sprite with a `core:tint` effect. Recipe placeholders are
82
+ near-white `sprites/ph-*.png` + `effects: [{ type: core:tint, params: { color, amount: 1 } }]`.
83
+
84
+ ### An SVG you write as a sprite
85
+
86
+ A `.svg` in `sprites/` works as a `Sprite2D` / `Button2D` texture in the editor, in play mode and
87
+ in the single-file export — **when a browser `<img>` would decode it**, because that is how every
88
+ texture loads. The browser rasterises it once, at its own `width`/`height`, and the GPU scales that
89
+ bitmap. So:
90
+
91
+ ```xml
92
+ <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
93
+ <circle cx="64" cy="64" r="56" fill="#ffcf33" stroke="#8a5a00" stroke-width="8"/>
94
+ </svg>
95
+ ```
96
+
97
+ - `xmlns="http://www.w3.org/2000/svg"` on the root — without it nothing renders.
98
+ - `width` and `height` in px **and** a matching `viewBox`. Without a size the browser invents a
99
+ 300x150 box (art letterboxed or cropped, the sprite auto-sizes to 300x150).
100
+ - Make `width`/`height` the size the node draws it at (the node's `width`/`height`), or larger —
101
+ a 32px SVG drawn at 256px is a blurry bitmap, not crisp vectors.
102
+ - Self-contained: no `<image href="http…">`, no `<use href="other.svg#…">`, no CSS `url(file)`,
103
+ no `@import`, no webfonts — none of them load when an SVG is an image (only `#id` and `data:`
104
+ do). Text only with generic families (`font-family="sans-serif"`); better, draw shapes.
105
+
106
+ `pix3 validate` checks every `.svg` a scene references: `E_SVG_INVALID` (no `<svg>` root or no
107
+ xmlns), `E_SVG_NO_SIZE`, `W_SVG_VIEWBOX_ONLY`, `W_SVG_EXTERNAL_REF`.
108
+
109
+ ## Label2D
110
+
111
+ | Key | Type | Default | Notes |
112
+ | --- | --- | --- | --- |
113
+ | `label` | string | "" | The text; `\n` breaks lines. Never only emoji |
114
+ | `labelFontSize` | number | 16 | px |
115
+ | `labelColor` | colour | "#ffffff" | |
116
+ | `labelFontFamily` | string | Arial | A family the project ships in `fonts/`, else a system face |
117
+ | `labelFontWeight` | number | 400 | 400 / 700 / 900 … |
118
+ | `labelAlign` | enum | center | `left`, `center`, `right` |
119
+ | `labelVAlign` | enum | middle | `top`, `middle`, `bottom` |
120
+ | `width` / `height` | number | 0 | 0 = auto-size, no wrap. Set `width` to word-wrap |
121
+ | `glowColor` / `glowStrength` | colour / 0–4 | "#ffffff" / 0 | Canvas-drawn neon glow; 2–3 reads as neon |
122
+ | `outlineColor` / `outlineWidth` | colour / px | "#000000" / 0 | Contrast outline |
123
+ | `labelShadowColor`, `labelShadowOffsetX/Y`, `labelLetterSpacing`, `typewriterSpeed` | | | see `reference.md` |
124
+
125
+ Scripts: `label.setText('SCORE 5')`.
126
+
127
+ ## Button2D
128
+
129
+ | Key | Type | Default | Notes |
130
+ | --- | --- | --- | --- |
131
+ | `width` / `height` | number | 100 / 40 | |
132
+ | `label` | string | "" | Caption; `labelFontSize` (16), `labelColor` ("#ffffff"), `labelAlign` as on Label2D |
133
+ | `backgroundColor` | colour | "#4a4a4a" | Flat idle colour |
134
+ | `hoverColor` | colour | "#5a5a5a" | |
135
+ | `pressedColor` | colour | "#3a3a3a" | |
136
+ | `buttonAction` | string | "Submit" | Free identifier for scripts |
137
+ | `enabled` | bool | true | A disabled button takes no input |
138
+ | `textureNormal` / `textureHover` / `texturePressed` / `textureDisabled` | texture | — | Skin sprites; a set slot replaces the flat colour |
139
+ | `sliceBorderLeft/Right/Top/Bottom` | number | 0 | Nine-slice insets in source pixels |
140
+ | `effects` | list | — | Shader effects on the skin |
141
+
142
+ Signals: `pressed` (finger/button went down inside it), `released`, `click` (down **and** up
143
+ inside it — a completed tap; sliding off cancels it), `pointerdown`, `pointerup`. The recipes
144
+ wire `pressed` for an instant response; use `click` where an accidental touch must be
145
+ cancellable (menus, purchases). `button.connect('click', this, handler)`.
146
+
147
+ ## Bar2D
148
+
149
+ | Key | Type | Default | Notes |
150
+ | --- | --- | --- | --- |
151
+ | `width` / `height` | number | 150 / 20 | |
152
+ | `minValue` / `maxValue` / `value` | number | 0 / 100 / 100 | Fill = value within the range (clamped) |
153
+ | `barColor` | colour | "#ff4444" | Fill colour |
154
+ | `backBackgroundColor` | colour | "#333333" | Trough colour |
155
+ | `showBorder` / `borderColor` / `borderWidth` | bool / colour / px | true / "#000000" / 2 | The recipes set `showBorder: false` |
156
+ | `textureTrough` / `textureFill` | texture | — | Skin sprites |
157
+ | `sliceBorderLeft/Right/Top/Bottom` | number | 0 | Nine-slice insets of the skins |
158
+
159
+ Scripts: `bar.maxValue = n; bar.setValue(v)`.
160
+
161
+ ## CanvasLayer2D
162
+
163
+ A HUD band: rendered after post-processing (never blooms) with a fixed camera. Same keys as
164
+ `Group2D` (`width`, `height`, transform, layout). Put score/time/lives/buttons under it.
165
+ Its ancestors' transform, opacity and visibility still apply.
166
+
167
+ ## PostProcess
168
+
169
+ No transform — keys sit flat in `properties`. The first active one in the tree wins.
170
+
171
+ | Key | Type | Default | Notes |
172
+ | --- | --- | --- | --- |
173
+ | `affect2D` | bool | true | Apply to the 2D layer too |
174
+ | `bloomEnabled` / `bloomIntensity` / `bloomThreshold` | bool / number / number | true / 1 / 0.9 | Bloom lifts only what is already bright |
175
+ | `bloomSmoothing` / `bloomRadius` | number | | |
176
+ | `vignetteEnabled` / `vignetteOffset` / `vignetteDarkness` | bool / number / number | | |
177
+ | `chromaticAberrationEnabled` / `chromaticAberrationOffset` | bool / number | | |
178
+
179
+ Brighten the colour or lower `bloomThreshold` rather than raising `bloomIntensity`. The
180
+ opposite for a pastel or light look: a pale ground sits above a low threshold and the whole
181
+ screen blooms — **raise** `bloomThreshold` (0.85–0.95) so only the accents glow.
182
+
183
+ ## Example — a new HUD label anchored top-right
184
+
185
+ ```yaml
186
+ - id: combo-label
187
+ type: Label2D
188
+ name: Combo Label
189
+ properties:
190
+ label: ""
191
+ labelFontSize: 40
192
+ labelColor: "#f5ae39"
193
+ labelAlign: right
194
+ transform:
195
+ position: [340, 790]
196
+ scale: [1, 1]
197
+ rotation: 0
198
+ layout:
199
+ enabled: true
200
+ horizontalAlign: right
201
+ verticalAlign: top
202
+ children: []
203
+ ```
204
+
205
+ ## Known gaps
206
+
207
+ - On a **cloud** project (opened from the Pix3 server, not a folder or `pix3 serve`) an `.svg`
208
+ sprite renders on first load and then goes blank: the local cache hands SVGs back as
209
+ `text/plain`, which no browser decodes as an image. Folder and `pix3 serve` projects are fine;
210
+ on cloud, use a PNG.
@@ -1,14 +1,14 @@
1
- <!-- Pix3 agent kit 1.6.0 — generated from docs/node-types-reference.md. Do not edit: pix3 kit --update regenerates it. -->
2
- # Pix3 node reference
3
-
4
- Every node type the loader knows, with its properties. **Grep `### <NodeName>`** for one node
5
- instead of reading this file. Keys are YAML keys under `properties:`; `position` / `rotation` /
6
- `scale` go in the `transform:` block, `flow.*` in the `flow:` block, and the anchor keys in
7
- `layout:` (see `pix3-scene-format`). Where a row says "not saved", the key does nothing in a file.
8
- Source paths quoted here (`src/…`, `packages/…`) are files of the Pix3 engine repository, not of this project.
9
-
10
- ## Quick reference
11
-
1
+ <!-- Pix3 agent kit 1.6.3 — generated from docs/node-types-reference.md. Do not edit: pix3 kit --update regenerates it. -->
2
+ # Pix3 node reference
3
+
4
+ Every node type the loader knows, with its properties. **Grep `### <NodeName>`** for one node
5
+ instead of reading this file. Keys are YAML keys under `properties:`; `position` / `rotation` /
6
+ `scale` go in the `transform:` block, `flow.*` in the `flow:` block, and the anchor keys in
7
+ `layout:` (see `pix3-scene-format`). Where a row says "not saved", the key does nothing in a file.
8
+ Source paths quoted here (`src/…`, `packages/…`) are files of the Pix3 engine repository, not of this project.
9
+
10
+ ## Quick reference
11
+
12
12
  | Node Type | Key Properties |
13
13
  | -------------------- | ---------------------------------------------------------------------------------------------------- |
14
14
  | NodeBase | id, name, type, visible, locked |
@@ -43,10 +43,10 @@ Source paths quoted here (`src/…`, `packages/…`) are files of the Pix3 engin
43
43
  | InventorySlot2D | width, height, quantity, showQuantity, backdropColor, selectionColor |
44
44
  | AudioPlayer | audioTrack, autoplay, loop, volume, bus, pitchVariation, volumeVariation |
45
45
  | PostProcess | affect2D, bloom*, vignette*, chromaticAberration*, aoMode, ssao*, lut\* |
46
- | Group | NodeBase only — an organisational container |
47
-
48
- ## Choosing the right node
49
-
46
+ | Group | NodeBase only — an organisational container |
47
+
48
+ ## Choosing the right node
49
+
50
50
  #### For 2D Projects:
51
51
 
52
52
  1. **Start with a Group2D** as your scene root (the game viewport size comes from project settings; use anchor layout for responsiveness)
@@ -67,8 +67,8 @@ Source paths quoted here (`src/…`, `packages/…`) are files of the Pix3 engin
67
67
  5. Add **PointLightNode** or **SpotLightNode** for localized lighting
68
68
  6. Add **AmbientLightNode** or **HemisphereLightNode** as fill so unlit faces are not black
69
69
  7. For cinematics / dynamic framing, add **VirtualCamera3D** nodes and a **Camera Brain** (`core:CameraBrain`) on the Camera3D to blend between them by priority
70
- 8. For bloom / vignette / colour grading, add one **PostProcess** node anywhere in the tree
71
-
70
+ 8. For bloom / vignette / colour grading, add one **PostProcess** node anywhere in the tree
71
+
72
72
  ## 2D Nodes
73
73
 
74
74
  All 2D nodes operate in screen space and are rendered using an orthographic camera. They use a left-handed coordinate system where X increases to the right and Y increases upward.
@@ -153,12 +153,14 @@ mistake it exists to prevent: build the whole game out of coloured rects, then s
153
153
  | `width` | number | 100 | Width in design pixels |
154
154
  | `height` | number | 100 | Height in design pixels |
155
155
  | `color` | color | #ffffff | Fill colour (authored sRGB hex) |
156
+ | `blocksPointerInput` | boolean | false | Block hover and presses on UI controls behind this visible rectangle |
156
157
 
157
158
  **Usage Notes:**
158
159
 
159
160
  - Centred on its own origin, like every 2D node — `position` is the rect's centre, not a corner.
160
161
  - `opacity` comes from `Node2D` and multiplies the fill; there is no separate alpha property.
161
162
  - No texture, no nine-slice: for a panel with a border use `TiledSprite2D` in `nine-slice` mode.
163
+ - Set `blocksPointerInput: true` on a modal's full-screen dim backdrop. Controls painted above it still respond; controls below it cannot hover or activate. A hidden backdrop (including a hidden ancestor) blocks nothing. Opacity does not affect blocking, so opening and closing fades keep the modal isolated.
162
164
 
163
165
  ---
164
166
 
@@ -252,6 +254,14 @@ node, use the `core:AnimationPlayer` behaviour.
252
254
  `fps` property here, unlike AnimatedSprite3D.
253
255
  - `freeOnFinish` + a one-shot clip is the whole "spawn an explosion" pattern: no script needed.
254
256
  - `sizeMode: native` is what you want for a trimmed spritesheet whose frames differ in size.
257
+ - **Scripts switch clips with `play(name?, { restart? })`**, not by writing `currentClip`. It
258
+ returns `false` (and changes nothing) for a clip the loaded resource does not have — no silent
259
+ fallback to the first clip. A different clip starts at frame 0; the current clip keeps its
260
+ position unless `restart: true`, which is also how a finished one-shot (`isPlaying` went false on
261
+ its last frame) is played again — a repeated `attack` must begin at frame 0. `getClipNames()`
262
+ lists the resource's clips once it has loaded.
263
+ - Sequence frames are keyed by their `texturePath`, so clips are independent: `attack[0]` and
264
+ `idle[0]` are different files and never share a texture slot.
255
265
 
256
266
  ---
257
267
 
@@ -390,6 +400,11 @@ added to its `package.json` on the same condition.
390
400
 
391
401
  An interactive button control for 2D user interfaces. Responds to pointer clicks and provides visual feedback.
392
402
 
403
+ Physical presses target the topmost enabled, visible interactive control in paint
404
+ order. The gesture stays with that target until release/cancel: a button that opens
405
+ a modal cannot also press its newly visible close button. The next press can close
406
+ the modal immediately. Labels and bars are display-only and do not block buttons.
407
+
393
408
  **Type String:** `Button2D`
394
409
 
395
410
  **Properties:**
@@ -758,8 +773,8 @@ A Godot-style `CanvasLayer` — a clean UI overlay band. Its subtree renders on
758
773
  - Content under a CanvasLayer2D is pinned in design-space coordinates regardless of the active Camera2D, and its pointer hit-tests stay correct while the world camera pans.
759
774
  - Multiple CanvasLayer2D nodes stack by scene-tree order (like ordinary 2D draw order).
760
775
  - Unlike Godot, inheritance is **not** broken: an ancestor's transform, opacity, and visibility still flow into the overlay subtree — only the render camera differs. Author at the scene root for a fully independent layer.
761
- - Runtime overlay behavior is play-mode only; in the editor it renders as a normal Group2D container.
762
-
776
+ - Runtime overlay behavior is play-mode only; in the editor it renders as a normal Group2D container.
777
+
763
778
  ## 3D Nodes
764
779
 
765
780
  All 3D nodes operate in world space using a perspective camera by default. They use a right-handed coordinate system where X is right, Y is up, and Z is toward the viewer.
@@ -1226,8 +1241,8 @@ world-space; there is no migration — the field finally does what its label say
1226
1241
  `emissionRate: 0` so it only fires from bursts. Bursts are deferred to after the
1227
1242
  simulation loop, so self-reference and any tick order are safe (≤1 frame latency).
1228
1243
  - Trail material is additive and untextured in v1.
1229
- - All new fields are flat scalars, so they are keyframe-animatable from the timeline.
1230
-
1244
+ - All new fields are flat scalars, so they are keyframe-animatable from the timeline.
1245
+
1231
1246
  ## Post-processing
1232
1247
 
1233
1248
  ### PostProcess
@@ -1266,8 +1281,8 @@ and builds a composer from it; with no such node the plain two-pass path runs an
1266
1281
  apply.
1267
1282
  - The whole stack is one lazily-created composer. Every effect off = no composer at all.
1268
1283
  - In a single-file playable export, `postprocessing` is pulled in through a generated
1269
- `virtual:runtime-*` module — using this node is fine for an export, it just adds weight.
1270
-
1284
+ `virtual:runtime-*` module — using this node is fine for an export, it just adds weight.
1285
+
1271
1286
  ## Audio
1272
1287
 
1273
1288
  ### AudioPlayer
@@ -1328,4 +1343,4 @@ authored mix.
1328
1343
  automatically blends to `'muffled'` and back on return to normal speed. This is
1329
1344
  driven by the slow-mo base scale, **not** the frozen scale — a `hitstop(…)`
1330
1345
  freeze does **not** muffle audio (otherwise every micro-freeze would pump the
1331
- filter).
1346
+ filter).