From dd779233add30b365aa37a1bd13236afa51200b3 Mon Sep 17 00:00:00 2001 From: Marcin Jerzak Date: Thu, 23 Nov 2023 22:25:13 +0100 Subject: [PATCH 1/2] basic generator should be working now --- .../04-instanced-sprite-building.mdx | 32 +++- .../src/routes/instanced-sprite/Scene.svelte | 24 +-- .../routes/instanced-sprite/spriteBuilder.ts | 178 ----------------- packages/instanced-sprite-mesh/src/index.ts | 1 + .../src/spriteBuilder.ts | 179 ++++++++++++++++++ 5 files changed, 220 insertions(+), 194 deletions(-) delete mode 100644 apps/playground/src/routes/instanced-sprite/spriteBuilder.ts create mode 100644 packages/instanced-sprite-mesh/src/spriteBuilder.ts diff --git a/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx b/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx index f1936a7..88e973e 100644 --- a/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx +++ b/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx @@ -15,4 +15,34 @@ https://luizmelo.itch.io/monsters-creatures-fantasy 1. load images 2. 1 img file = 1 animation 3. Name animations and Combine img files into one spritesheet via html canvas so there's only one texture -4. Generate meta \ No newline at end of file +4. Generate meta + +```ts + +const g = createSpritesheet() + .add('fly', '/Monsters_Creatures_Fantasy/Flying_eye/Flight.png', { + type: 'rowColumn', + w: 8, + h: 1, + rowMajor: true + }) + .add('attack', '/Monsters_Creatures_Fantasy/Flying_eye/Attack.png', { + type: 'rowColumn', + w: 8, + h: 1, + rowMajor: true + }) + .add('death', '/Monsters_Creatures_Fantasy/Flying_eye/Death.png', { + type: 'rowColumn', + w: 4, + h: 1, + rowMajor: true + }) + .add('hit', '/Monsters_Creatures_Fantasy/Flying_eye/Hit.png', { + type: 'rowColumn', + w: 4, + h: 1, + rowMajor: true + }) + .build(); +``` \ No newline at end of file diff --git a/apps/playground/src/routes/instanced-sprite/Scene.svelte b/apps/playground/src/routes/instanced-sprite/Scene.svelte index 50bf753..211a7eb 100644 --- a/apps/playground/src/routes/instanced-sprite/Scene.svelte +++ b/apps/playground/src/routes/instanced-sprite/Scene.svelte @@ -4,37 +4,31 @@ import PlayerUpdater from './PlayerUpdater.svelte'; import { DEG2RAD } from 'three/src/math/MathUtils.js'; import AnimatedInstancedSprite from './AnimatedInstancedSprite.svelte'; - import { SpriteBuilder } from './spriteBuilder'; import FlyerUpdater from './FlyerUpdater.svelte'; + import { createSpritesheet } from '@threejs-kit/instanced-sprite-mesh'; const count = 50000; - const monster = new SpriteBuilder(); - - const g = monster + const spritesheet = createSpritesheet() .add('fly', '/textures/sprites/Monsters_Creatures_Fantasy/Flying_eye/Flight.png', { - type: 'rowColumn', - w: 8, - h: 1, - rowMajor: true + type: 'frameSize', + w: 150, + h: 150 }) .add('attack', '/textures/sprites/Monsters_Creatures_Fantasy/Flying_eye/Attack.png', { type: 'rowColumn', w: 8, - h: 1, - rowMajor: true + h: 1 }) .add('death', '/textures/sprites/Monsters_Creatures_Fantasy/Flying_eye/Death.png', { type: 'rowColumn', w: 4, - h: 1, - rowMajor: true + h: 1 }) .add('hit', '/textures/sprites/Monsters_Creatures_Fantasy/Flying_eye/Hit.png', { type: 'rowColumn', w: 4, - h: 1, - rowMajor: true + h: 1 }) .build(); @@ -55,7 +49,7 @@ --> -{#await g then { spritesheet, texture }} +{#await spritesheet then { spritesheet, texture }} diff --git a/apps/playground/src/routes/instanced-sprite/spriteBuilder.ts b/apps/playground/src/routes/instanced-sprite/spriteBuilder.ts deleted file mode 100644 index 3a94aaa..0000000 --- a/apps/playground/src/routes/instanced-sprite/spriteBuilder.ts +++ /dev/null @@ -1,178 +0,0 @@ -import type { SpritesheetFormat } from '@threejs-kit/instanced-sprite-mesh'; -import { - CanvasTexture, - ImageLoader, - NearestFilter, - RepeatWrapping, - SRGBColorSpace, - Texture -} from 'three'; - -type AnimationDefitinion = { - name: string; - imageUrl: string; - custom?: SpritesheetFormat['frames']; - auto?: { - type: 'rowColumn' | 'frame'; - w: number; - h: number; - rowMajor: boolean; - }; -}; - -export class SpriteBuilder { - private imageLoader: ImageLoader; - private animations: AnimationDefitinion[]; - - constructor() { - this.imageLoader = new ImageLoader(); - this.animations = []; - // - } - - add( - name: string = 'default', - imageUrl: string, - config: { - type: 'rowColumn' | ' frame'; - w: number; - h: number; - rowMajor: boolean; - } - ) { - const animation: AnimationDefitinion = { - name, - imageUrl - }; - - if (config.type == 'rowColumn') { - animation['auto'] = { - type: 'rowColumn', - w: config.w, - h: config.h, - rowMajor: config.rowMajor - }; - } - - this.animations.push(animation); - return this; - } - - async build() { - const imgLoader = new ImageLoader(); - - console.log(this.animations); - - const generatedSpritesheet: SpritesheetFormat = { - frames: [], - animations: {}, - sheetSize: [0, 0], - animationLengths: [] - }; - - let texture = new Texture(); - - const images: { img: HTMLImageElement; w: number; h: number }[] = []; - - let generatedWidth = 0; - let generatedHeight = 0; - - for (const anim of this.animations) { - const img = await imgLoader.loadAsync(anim.imageUrl); - const w = img.width; - const h = img.height; - generatedWidth = Math.max(generatedWidth, w); - generatedHeight += h; - images.push({ - img, - w, - h - }); - } - - if (this.animations.length === 0) { - // texture.image = images[0].img; - } else { - // - } - - const canvas = document.createElement('canvas'); - canvas.width = generatedWidth; - canvas.height = generatedHeight; - - const debugDiv = document.createElement('div'); - debugDiv.style.backgroundColor = 'grey'; - debugDiv.style.position = 'fixed'; - debugDiv.style.top = '0px'; - debugDiv.style.left = '0px'; - debugDiv.style.zIndex = '50'; - debugDiv.style.transform = 'scale(0.5,0.5)'; - debugDiv.style.transformOrigin = 'left'; - // debugDiv.style.scale = '50%'; - - debugDiv.appendChild(canvas); - document.body.appendChild(debugDiv); - - const context = canvas.getContext('2d'); - - let y = 0; - for (const { img, h } of images) { - context?.drawImage(img, 0, y, img.width, img.height); - y += h; - } - - texture = new CanvasTexture(canvas); - - // texture.image = img; - texture.needsUpdate = true; - - let animIndex = 0; - let frameCounter = 0; - let accumulatedHeight = 0; - - for (const a of this.animations) { - const img = images[animIndex]; - - let framesCount = 0; - - const imgPartialW = img.w; - const imgPartialH = img.h; - - if (a.auto) { - if (a.auto.type == 'rowColumn') { - accumulatedHeight += imgPartialH; - framesCount = a.auto.w * a.auto.h; - generatedSpritesheet.animations[a.name] = []; - for (let x = 0; x < a.auto.w; x++) { - for (let y = 0; y < a.auto.h; y++) { - generatedSpritesheet.frames.push([ - ((img.w / framesCount) * x) / generatedWidth, - 1 - accumulatedHeight / generatedHeight, - imgPartialW / framesCount / generatedWidth, - imgPartialH / generatedHeight - ]); - generatedSpritesheet.animations[a.name].push([frameCounter, 1]); - frameCounter++; - } - } - } - - generatedSpritesheet.animationLengths.push(framesCount); - } - animIndex++; - } - - texture.matrixAutoUpdate = false; - texture.generateMipmaps = false; - texture.premultiplyAlpha = false; - texture.wrapS = texture.wrapT = RepeatWrapping; - texture.magFilter = texture.minFilter = NearestFilter; - texture.colorSpace = SRGBColorSpace; - - generatedSpritesheet.sheetSize = [generatedWidth, generatedHeight]; - - console.log({ generatedSpritesheet }); - - return { spritesheet: generatedSpritesheet, texture }; - } -} diff --git a/packages/instanced-sprite-mesh/src/index.ts b/packages/instanced-sprite-mesh/src/index.ts index 1c7b122..019b9a7 100644 --- a/packages/instanced-sprite-mesh/src/index.ts +++ b/packages/instanced-sprite-mesh/src/index.ts @@ -1,5 +1,6 @@ export { InstancedSpriteMesh } from "./InstancedSpriteMesh"; export { makeDataTexture, parseAseprite } from "./material"; +export { createSpritesheet } from "./spriteBuilder"; export type { SpritesheetFormat } from "./material"; diff --git a/packages/instanced-sprite-mesh/src/spriteBuilder.ts b/packages/instanced-sprite-mesh/src/spriteBuilder.ts new file mode 100644 index 0000000..fb93f10 --- /dev/null +++ b/packages/instanced-sprite-mesh/src/spriteBuilder.ts @@ -0,0 +1,179 @@ +import { + CanvasTexture, + ImageLoader, + NearestFilter, + RepeatWrapping, + SRGBColorSpace, + Texture, +} from "three"; +import { SpritesheetFormat } from "./material"; + +type AnimationDefitinion = { + name: string; + imageUrl: string; + custom?: SpritesheetFormat["frames"]; + auto?: { + type: "rowColumn" | "frameSize"; + w: number; + h: number; + // rowMajor: boolean; + }; +}; + +export const createSpritesheet = () => { + return new SpriteBuilder(); +}; + +class SpriteBuilder { + private animations: AnimationDefitinion[]; + + constructor() { + this.animations = []; + // + } + + add( + name: string = "default", + imageUrl: string, + config: { + type: "rowColumn" | "frameSize"; + w: number; + h: number; + // rowMajor: boolean; + } + ) { + const animation: AnimationDefitinion = { + name, + imageUrl, + }; + + if (config.type == "rowColumn") { + animation["auto"] = { + type: "rowColumn", + w: config.w, + h: config.h, + }; + } + + this.animations.push(animation); + return this; + } + + async build() { + const imgLoader = new ImageLoader(); + + console.log(this.animations); + + const spritesheet: SpritesheetFormat = { + frames: [], + animations: {}, + sheetSize: [0, 0], + animationLengths: [], + }; + + let texture = new Texture(); + + const images: { img: HTMLImageElement; w: number; h: number }[] = []; + + let generatedWidth = 0; + let generatedHeight = 0; + + for (const anim of this.animations) { + const img = await imgLoader.loadAsync(anim.imageUrl); + const w = img.width; + const h = img.height; + generatedWidth = Math.max(generatedWidth, w); + generatedHeight += h; + images.push({ + img, + w, + h, + }); + } + + if (this.animations.length === 0) { + // texture.image = images[0].img; + } else { + // + } + + const canvas = document.createElement("canvas"); + canvas.width = generatedWidth; + canvas.height = generatedHeight; + + const context = canvas.getContext("2d"); + + let y = 0; + for (const { img, h } of images) { + context?.drawImage(img, 0, y, img.width, img.height); + y += h; + } + + texture = new CanvasTexture(canvas); + + // texture.image = img; + texture.needsUpdate = true; + + let animIndex = 0; + let frameCounter = 0; + let accumulatedHeight = 0; + + for (const a of this.animations) { + const img = images[animIndex]; + + let framesCount = 0; + + const imgPartialW = img.w; + const imgPartialH = img.h; + + if (a.auto) { + let rows = 0; + let columns = 0; + + if (a.auto.type == "frameSize") { + columns = img.w / a.auto.w; + rows = img.h / a.auto.h; + } + if (a.auto.type == "rowColumn") { + columns = a.auto.w; + rows = a.auto.h; + } + + // TODO ROW MAJOR / COLUMN MAJOR STUFF + + accumulatedHeight += imgPartialH; + framesCount = rows * columns; + spritesheet.animations[a.name] = []; + + for (let x = 0; x < columns; x++) { + for (let y = 0; y < rows; y++) { + spritesheet.frames.push([ + ((img.w / framesCount) * x) / generatedWidth, + 1 - accumulatedHeight / generatedHeight, + imgPartialW / framesCount / generatedWidth, + imgPartialH / generatedHeight, + ]); + spritesheet.animations[a.name].push([frameCounter, 1]); + frameCounter++; + } + } + + spritesheet.animationLengths.push(framesCount); + } + animIndex++; + } + + texture.matrixAutoUpdate = false; + texture.generateMipmaps = false; + texture.premultiplyAlpha = false; + texture.wrapS = texture.wrapT = RepeatWrapping; + texture.magFilter = texture.minFilter = NearestFilter; + texture.colorSpace = SRGBColorSpace; + + spritesheet.sheetSize = [generatedWidth, generatedHeight]; + + console.log({ generatedSpritesheet: spritesheet }); + + return { spritesheet, texture }; + } +} From a29f9011277579f215c4fa61c980752e5646a0d9 Mon Sep 17 00:00:00 2001 From: Marcin Jerzak Date: Thu, 23 Nov 2023 23:11:01 +0100 Subject: [PATCH 2/2] - changeset - createSpritesheet docs --- .changeset/tall-socks-agree.md | 5 + .../All Characters.png | Bin 0 -> 6901 bytes .../Flying_eye/Attack.png | Bin 0 -> 3492 bytes .../Flying_eye/Death.png | Bin 0 -> 2242 bytes .../Flying_eye/Flight.png | Bin 0 -> 3508 bytes .../Flying_eye/Hit.png | Bin 0 -> 2104 bytes .../Goblin/Attack.png | Bin 0 -> 4967 bytes .../Goblin/Death.png | Bin 0 -> 2935 bytes .../Goblin/Idle.png | Bin 0 -> 2573 bytes .../Monsters_Creatures_Fantasy/Goblin/Run.png | Bin 0 -> 4883 bytes .../Goblin/Take Hit.png | Bin 0 -> 3039 bytes .../Mushroom/Attack.png | Bin 0 -> 3937 bytes .../Mushroom/Death.png | Bin 0 -> 2490 bytes .../Mushroom/Idle.png | Bin 0 -> 1737 bytes .../Mushroom/Run.png | Bin 0 -> 3415 bytes .../Mushroom/Take Hit.png | Bin 0 -> 2333 bytes .../Skeleton/Attack.png | Bin 0 -> 5605 bytes .../Skeleton/Death.png | Bin 0 -> 3513 bytes .../Skeleton/Idle.png | Bin 0 -> 2767 bytes .../Skeleton/Shield.png | Bin 0 -> 2510 bytes .../Skeleton/Take Hit.png | Bin 0 -> 3425 bytes .../Skeleton/Walk.png | Bin 0 -> 2793 bytes .../04-instanced-sprite-building.mdx | 92 ++++++++++++++---- 23 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 .changeset/tall-socks-agree.md create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/All Characters.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Attack.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Death.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Flight.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Hit.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Attack.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Death.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Idle.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Run.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Take Hit.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Attack.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Death.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Idle.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Run.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Take Hit.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Attack.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Death.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Idle.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Shield.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Take Hit.png create mode 100644 apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Walk.png diff --git a/.changeset/tall-socks-agree.md b/.changeset/tall-socks-agree.md new file mode 100644 index 0000000..190e4cd --- /dev/null +++ b/.changeset/tall-socks-agree.md @@ -0,0 +1,5 @@ +--- +"@threejs-kit/instanced-sprite-mesh": minor +--- + +createSpritesheet utility function for combining multiple image files into one and generating metadata for instancing diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/All Characters.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/All Characters.png new file mode 100644 index 0000000000000000000000000000000000000000..2921d3e09ed1a653ffa7e57e13395e7e3ab8e340 GIT binary patch literal 6901 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 C@a#YU literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Attack.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Attack.png new file mode 100644 index 0000000000000000000000000000000000000000..1865f4894f4c337350214fb252c9f14ccb041e26 GIT binary patch literal 3492 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 W&hV#-JkkcwZf;_2jJtaK-hTm0G$PUf literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Death.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Death.png new file mode 100644 index 0000000000000000000000000000000000000000..cd631da23b90a4db93cc32439c2681034f7b67d2 GIT binary patch literal 2242 zcmd5-`CHOiAN{H&?xqc|WXpupHdyY7reqRsHD!vRn1VKxrsnS8u9;hwVU|u=>YI&` zin#A6n#s6KLsCd3YNRIQLaE5OVDt5#c%S$FaG(3!=icYs^ZA@}?#&D5oix?-)c^p{ zbaBSG1Aw9zxGq#t24}_HE2aRTa?=H4?-BcWeyr#09>PAzSN;&13F~o87%0 zt;c@>Zq+tz3@h~c+_n3`&?ZFbI*M~J%V(u%6qClkoSjGB^FwBgSApvDKYCgrQI#k% zk>*}F=38v}n`hF=9l!i>0)MG|0?CpkNHRd!|D$m#?5uh&IX=?hVaa1>#u^a-*yHjJ z!-3@~OntMhv5&$jRk^S->?1Y@_ms##dd$M;*gpbRM}EkBr&iUihGG(Fgs%uN9Ot*r z5WE8qK>j=|9It*<%t6I&FbgT?RN#%SoXkzi&R*Py&kJr39z9euPC?QCk|_d%3^OPl z_PBY4m<5YmnDBL3L^z9gSRRcN2Fd%9k0pfxr>s4m1(~6&@4l?`XqQ#+=oCg=Yu!$? zihoRmWn+;v3d%63?>V-YQO}~RjRUFQJO}JiHEm2DJu7RsP4W117&9l64x`ueD(St* zuyg8)r(AH6sjNULv5H`)cY96K+re|&mrljh#Y(})623a`tR*?-;woiWvUk0@thH$P z?SA0CYq_$_{sr#-0#8lon|CH%IWkXAd@Cg*mpiJ6rm^G8$8br-#SJ1}eGz zJrFuDEP2)pR5nWu)04Hd z^lk){YD$xTZds>z=7Xf4B*o)r1GF2(12+#eAusB->{RfJ#+9WNG&jC>E(z^agEQ6f zaY^pqmgFlJ=EK6YSB-wIT0Yb)lQ0g*J#YNhG&emwo_N%G##ME=~S)RUAr<%_ix^JrrE2wpEhz1XF#Eg@Q!0_irv8Tgg=iC-Ah z3}n)mBW$X#pf+YpQ?x;B!usf_aJHtaHZ3ozzGF3DdM~D{*|wBigX>X*B^8Kz+BK*p zw(6whF4*ScjQD(ij*`fj)ztf8G0}j0w@|N=TT1P*>%0^mB@+o|y}d8t%ZjwMM%nZHSP22bPxbxED<|+O3TMPgTC}B&w$8Q<1c`t!`4oI^H{_jx;L^JjgRl{kGpv zS~2?hPF+!Lv+aa+T0pR*3F}#X0aHb4X%PU0`@e%ulw0cdBq7+tc@qOtzry z?>skD!lo-_V^1ib$XR<3!1jPUlq2b#w`X_R#RZhCJOyRkG1jiL6%M?<_l)Zm;07p1 z)!?C}f%%c#aLLH4T2Rr-@(+_|?yUnByO&JstK9t`)E8v7j{VXS{H8#;-yCHkTA2rMA{H6@xZEITi6%FFm-Ttjo7WsGt7Jz*gD4JH04mpMUO6s#n9?S9)q-YjT4tNcySDFI_TqTWBD*iTpUUxFU!KdCL^i5;ZLjb#4UuOa6_ya=ahNwZh$=I#(7@xf z{!y}iHBr8^^lc1!9i;cVHTl@C=%XE?q$3hkNS=Ii5YwHeb730!1TloK`jqN5m9q98 zd#F7_8pV{9bRm78z2Oj5PndEA(~V@&5fMkmk5H_H@0tMX`uz175cgY-I zIMe?Fy!)^v(j3Z`dKJx$6X47$D-&<_^sb@M?;i<@|MOq^%=Gu2vyeR({&{g_3){uv KJcfbxOZyiDR_~es literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Flight.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Flight.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6d5de12b083ea15567adb42c94e0a6b4b0d0ad GIT binary patch literal 3508 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Hit.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Hit.png new file mode 100644 index 0000000000000000000000000000000000000000..ca18caa90bcbdd9511f4e34519433286f3dba319 GIT binary patch literal 2104 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Death.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Death.png new file mode 100644 index 0000000000000000000000000000000000000000..2d91ef672aa7b8015d88821464edb667dfbb6996 GIT binary patch literal 2935 zcmd5;iB}TX8b_OSav6s)G_}!*veeYFQgb27P$qSxry!W3sEzxQOW}e`nMsr?LE)b&ule1H{8^F8skXRT z_VSm}vv)7Ul@yIRFHcgL^O`D?>SG*}00M+}@9*$jo zfi4(qn|!6|>ykM8y z^)$_)CalLjF)=v##*D^Au4b2s$1|_n#y)dYw02tBVRNa}3FfMSj_yo0xxz^~tUon~ zZ30``6Ck#X$oKMzZd3&HsQ?>TJD*-Ji}{V4Yq4o>vI=+fD7~JJ(sz8@$y_5-wVbLKc=zIr$40Da@2iC0Vg^R)1H<|wvhwo z1+S%p>zmXgd#MJpg)K}c*~01Q2}e1A5ppcaQS8!JyYTmFJ(GOzO8jR}dvSM@fLoX` z?q`>1l)O9eu~n7);HWbak^Uncz$xgSlzd!Q1LhA?iQmBB5uVJ#N$k7~XfBb6cH0F@ zg(JPQ-rgJRrRb;Tt8w$6w`>gRsZ?r1+OcqKY9fiyV#~n8t`Yamud_vr#1;fC2~(I;8Vo7Ev2G^(4-^uA6(4@Yg00@ z(;0&hl03Fwm%=R5?1AqOZjacMeRPO=_FR8U#95y<$(>q?Y}X`ptVOg-=f8wV6HFHT zBv%RV_=hs76?xwNm+iayZmamM@{|2 zGiN%!Z51C_?nFw*pR!msWrf$8#dB{^sR3-L{`QTY)G89e>%#8U_7#EqGsSM6qpLMm_+F4tL-cR*BHKJnI?*U2y5w*%y*;h!kO4hO zZxse(2cEFkTg8?xI@9T~hTkf2%FEiP09y9p0DF?QBAqNYzj2>AlG z!5!V(#|yHva^KACpAYcCc9gtbW+hcD^bJ6J2Rc)#1H8S*MuO};S?ed|DdT#V^iAnK zZfDdmHhM*Hiv3fs(vE)WZ_Nigh zGmrNlcz&gc8FYFqmm27e{H~#x;?J<@$VL@Q7 zX2O{3f9&tHjiUu5)BZ8{X}lbI?@I*9-!@IW++k;o$@pf&gI0>AeLz7{soP4_B$OI7 zDSjK;rooaXF88PSMMsoh>j^;mWi1Z=_Pr|4;2i`R?OGUfCfr-jF9jSX#gJBUL$Z*! zS*Pt+Dvqnju6d}%_>EEzsc|=U89u%weBDjPOh?<4!@pcAgGH_?4SGV2)@hk~6- zB8@POkAoCMTgfTFm+#7w^zh?}WklaFb@{ znSn%qZeTM0s{UJ~tNd}3W&=*AM%6=37d_& z8Uc)S6n*qzyI&BJv!Ae%~D1z+kO`2e`SqQX9sm#QoOhw%MrBB@p;M<04 z@2EA|svl_m7u*rUVK942cfS zj(ZgOueUCUpSNRgj*%@#-7w(lYeC`YHfhxEON&HpsLqI6&>`IGQ+?=0oW=a9(8}#l z1#)tOXN#^rOJ5cvNs5qu%_YKhXLA~}%%Z%{t45;BO0795n6m|;>B*HzAME;jrEjoa z^4!1rxu#z3fGfqo2x?F0kYpE85^84mp?jK;{A})brWhp+$V;;1+*FEDh=oBJgyxkR z;mZEHGS8fXfaLN8BKbR?+uY_2P7Wb~lyzSlQBH!`FV&uwQ`#Ka$TtZvxjLNWaK4wp z_v%1%qw%XOQ(4KtiMkg6v%D=<>GplYwty9iB zCFNh9?CjpN3^L}TnisE+1dTCi{P2&Ax(A}N>u;L$XXP46txR5LK`&rjh7y$bjFanH zTi3eSRlpeh5DXHkg}WkLoS&+%f8}Q@6;#1z3|OLeF$VB5* zxp?LmX8c9felgVIprBe*+f-+%*-%94#k-;$m|vxa;6+5qsOayExzZ^glUi;-j2Wt} zBy{18JX4fS>Ee0g$+jEkt8Q9y20oUxLf}L*VS+E literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Idle.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Goblin/Idle.png new file mode 100644 index 0000000000000000000000000000000000000000..47e42648efb4d0a540e34c455c1473521e50aa30 GIT binary patch literal 2573 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 ORovRb&YW!K5&vJE|F?ty literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Attack.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Attack.png new file mode 100644 index 0000000000000000000000000000000000000000..df07e60257b5f6ed6337d14e5ac709e0dd19bc0b GIT binary patch literal 3937 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Idle.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Idle.png new file mode 100644 index 0000000000000000000000000000000000000000..672efbf7d9b64a3ab8c6654af0c1dae8c0b2a45a GIT binary patch literal 1737 zcmd5+`7;{`6i&@b)t23~LLGJWP}NnmR4cWsWW`amL4pukM;y@+RdF>fts_AZXX9Av zD2W6uk|3&;D(W6AQaT~d)jC2b(M|t}oqg|{H}97>-#6d9_fni3tmR}?WB~wxoDIzC zHUJ=nl=QhWKuMKS-8KXOfEhMc7S8y>)lc=I3J3+@=h@`LZ-zOK&d6R-JX=PRf~r3v z0xQB$$Dp>v%jK|41sjX-k11W5@0ckw1ENKoeZ*|Mpz$viNe_hmhE0R%XA4hY8Dxg7T+)%aZk zYa!ln4KT<;ojGR>inlh#N=T`;YJw?5;tVm1Njh2~PlOk(E00a6n5=+VCoT(D$RzW} zq$b#3@{aG}8gUT)Hy2oA;1zIOz#o;``kulgv5U(+BeYo)SL>^eN#E<)wC>{>Q)LN> zHOtYB5*f-Hr|mj|2Ahz^aV2S)ZVHjpO57qpH-_S+o%qI>*w?p1zX~+5wDd};aJ-Ru zB;ixNQ=dyiNEl%&6!JGB;bXw5az~(CukyYz5)_~`+ZSDdkhkA`@C_4fpBOCK!BiC1 zvY}OlC2TdhxX1j~%7}_3_ra)PksBki_M7Nl+j0`YS&oiY2ahC~McxC8zFx;0xv+ce zPrQWp!#x8Td)Exx%KFD9zm+pmT0%gEMb*jNajFbUMX13^+Y>eEfIu_mu_r;Gb}T_9 z=9l8mqLyajp6kJc2r_It&NmlI6DK6*8DWt9pBWv`7nbK6M?4q<91i6RA-ogE*nGMmyLa>oT5PZxzKhJS za_6m>zcVTp*L#M<3exIYEpDieQMtNE@J+wK&7M9}{2s)F!Mngo)R%~E0A-Q4YRsgm zPiHj5mm~H*uWp8S$tb-#_hqh(NwzdbfX1kF1zJ{6{wmt=@Ge%HyrQ9lo@h~}|d0>`H z%Hyu~>0KGXX5pY@KVlZD$gm^Gso2W`&7M1da>Yd}!k*Xd<4X6h4{(6jIgCDi(VN}j z4?D@yPV(E(gkN4dbsQJ*X9w|>Mt>fLFSMZJ(Y_?LxuC1Eu3Soj*p#=|G9tQP05h;B z&B;E`Pt8g|Z3VAM2M1&0vP?KQ=C(RyX&?C(I&4iJetQ;?U67jfu7PEQ$v4@F&v|$# zX!7VUqJ#7_vyz+Q`Q0dbsF$9}Ks#q%7`j8RdNj zSl=Ie@xEw4F&aYA1c?Rbv57e7lN7Tk$pn=$K3C(rCauTc_s8Rn($NR|VWr!}>H(si z4+DoR=!-=uW>@o>3#HyglgN`?YUFH=!pn;U>~~7XjKuU>@n}o^&5XB3tn*|&ZHYIQ z^bO|yA)U2S*vR7zV7~1LEm(2ba7Mg82>g)EMl}lfe#?cqt2UhzzCy;=$ZKei9Chm` zojbcIm&BtuudqS^J{ZYJ>vRv zyp_BzVgp(-iJAm>x-r=By7^zv;xhDb20ogH-P}{-jV&ooQ8_RK4l4fxji%$?F6GU6 zt{3kx9$LwOS4RakDX5`bRAvHdsAVP3nq1qs)xFjGqFWp@MHV^`EAN(=PwS?~l`M33 zLFpe#brGVkSjQR-9MofsdVtrl>6YB`+?ubND)ogaM0p^V8kl!i*@UHi_y?r^^OwCi Y)c$N=inN9s<^ABcfjU^xZ+OT53yKl+oB#j- literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Run.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Run.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7d5a138efd8160be98f4b876137fe4bd8444be GIT binary patch literal 3415 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Take Hit.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Mushroom/Take Hit.png new file mode 100644 index 0000000000000000000000000000000000000000..7846e5caef6a085d41a5f4d03f5788ccd6a68c0d GIT binary patch literal 2333 zcmd6oiB}TX7sttR$wKLeXd^NxWw{Vpu2YVhN$I#yDX!r%xi6WGk~c>4>Js z1r>44(A2~w$26B*5C+E#&A|=#9hV>e6TkC&=iGPRx#zum?_0i~mvYPQCQw#c761SM ztt>6>000us;_+)4DRD0W-M9n*$b7f5xaJU^2)b@Ybo;=KP44b|Kll?wpqc#MA5c6m7&zrSbr zKJUy|%Y=Sa*te73J#Is{uoj~197B+2AMa$il!33lbyfF}qTgii(aeGX>8nKO(6rXw zqXY`-8*0+5{!*8qm=U9zoLhCS;yu8a2Jc5ScaBuGB68*D8P_M{vw&g(#u+lG;y zw{2VKo*c>5G#{4&y#DEvwPhzN=<=G%A8*{8tcvzAiXx$8Yy{V(-(*JYyK?g_#iiWf zHe?R&duJu0fUY~I$qLVK+Z&3+m|c^7lY`iOXJIg&aAgs^Rls$3?`m*X;Z8|hM>Wq| zC=rS&tNh(pNo7Xda`zt;9m{Xrya$oF@oz(<_tbY0H`(sTe+wlio7yZngWOy!4(H^Z?cn*4p-7!A3lIhf8r9L;2 z0%wxV*|Q^T5Mk5TOEY+^DLxR;qdR?Do%xnd_6v3!U;J?5(A*3w;TZ6J957VzbsIHF zUC6ku_@3k6IM>$Zpc--6-zV&se|y{RL~i>FwlWN#YajRW(qxo}l0fEMc~)U%lItb! z5R}{r)89KbAZ?8p)A6VMED=(`J^$h0xtn7^Rzxo`YCfLoSJb7)?_j<+>iLR9CS{lk zZQjHXBGaI|skp|l&n#VCE8<9d@n(=m!B|A`radV@raQxFm0hwcF`TcJ-VKQ|2l;%B zSCQX;w_0c4U&PlUf!vM9^PpI_`CND&cp}=(1J>7@9N7v*N8&QseiIQI#6q${FptpIwl%cJ2Cy}o#V;RslsuB!-$T20~4E|R3bY^I)=EFwHvfbXqWR_X~;4$0OBwb7t#!}N5^-KG$)In zS2Hg5+WTdB7LnQT>MX3|i)j2KL(MrUbdXB)KFABYV>`9CA^5-%rDV(nq2t#A+Xa7gK zIA^!{^EE91-$zF8QJRw5yImX#^` zC*n?H2j^&0&r<&q-)05wxq1udw?ChJ6hCAg9s%Z9S78uuJK*S;z#L42NLMqV_f;Jc?o%H>Gqrzmo z8WI$a?(%k?=y&Qz!>bNe`0FR~kpMB4%4ssIByICs0r^+AuT{+>3bC!-s+M4h*v*p? z=U0?$W46}fCn*(EV&w-_iHUGmiBv)od!n5!->xeD6H1JDRoIA1VM7@}!7u$c}uyj9<`Gt7qWnF^vFRu}HEqjKdlhQ?X_hT`LXr^Q7LJF^mJP=HZU~&;S4M>4WCG^I#`!@Tf_9)JJ< literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Attack.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Attack.png new file mode 100644 index 0000000000000000000000000000000000000000..c855a326aca416c1e5043474b2ad83f301c3adfd GIT binary patch literal 5605 zcmds5`8$+-)K{K(9!ou*vSq80WGQ8jjLL`zS!S^_){woin@S2L$(~SlGsZGVmZ6Yk z>@*l_vhRkmjBVa~^#1t%1@BzfJ=c9*_kDlQ_nh-NpL4#S$cOq`oNVXWn3$M2?`uPh zn3(=50qzt3W&!@YQoVMVn79k?L++UPe_R>!aJHNaVO^iV-5QV<<=@8i{G{ZI#>DHe zkG=ke{0-7zz9zqI)015Sf0pv-*IoWFE}~U(FM&>b|`zIYXAFpqqjlP}+ zzQ~_Hu-rLA-p@(ICe!}xj@jk#0}CO`F{!bj?wj!Holx*Yq%PiDFeGTzr+$uh_5`q@ z|3ANnJslkn6y@aNR;W*|Bc`JyTe%4!S0;Jmkp*@pJ{0ZFUgTNv(Ikm*3&T@YnQ(i~ zr}wNlm{8C3Sr-k|52?B0{nj)he6*i@yD0y;MX%IYB0`q+dh%%N2~;eKWvP>8Hu8i@ zXDc`Kom5~>97uPTiDgg=wRe&UktCAb-O*uhY%E?@P!P9$;`6^%nQY#g#jWQXFG)G) z6^mfXo$_Ru5Kcr@E?4F)YI%Tx#WQo!cQ8f=B%uLsy88wrlcU^Jvq z?a|wa$HJHKzLo1#;nbQ3eMD_jzX|C}W5$dhK8)4GTYZ6oPlXU0MXMvNh$ z#Qov3jqoYMFPpu?Z(T1mEBc;`#?gyi%E&gNvUyMk&KH^F2FsukwJtfEe zP}9jl0*@hiR1N>bR`}k;6x@SO4_Z|fa0jo*&qDPA3}zC@@G!f_pF*#g2XFE+0>W2A zuX9#JywX3$6|sD5*Co{UroNs~`z$Yy#%#WhsaT`_$K-<6VZz=`I3fF+WaQR1q;SIj znuUKrV@n3GJQ*bh3k+1QFA+os9vFa-SK)R$6TI-Ex)IXWm0}j%&|gP5j|0m$WAsu4 zV3mtv`(_Mn&A4X&kxP5ez)5^T8iiziFf%cr4z4e`;RAdu0Ps&F6#F`F@Me8VZt4mcz>F|S=Fl}>pK&g%=PU~`q+o!94 zU=g&{P&s8MLZ8}OOS-p;OF{ro@c>|nMr;L0kIXxW?{=4AH@r!su&VRJC$YWZ>@pta z$TaYw$pAtbQrKN9nHBsA{n(GW+H-Pd@2MK-_kpg=JxEh;w;B%@7pn(BNLO^ny;VQ2 zoizd8xY7`w~s83^5*$Nf2d25>+Cg;=-92>cMMWUtP6S%RR$cc6%&!`toZC+tl zl@Q&?8E?VSN^ubQO(dl>nQy|{qkAMo1y>950IH*-t8LRP2?dH9Ges2X~6&^WcOC@DO&mrw%gXjlvnZHF34Bz1a|l+cl~Pw)o4 z!}l-iS*^SCp4Jr&vO@+-gOH8vcKo`mqUX2{vs1U)X(xR{>R(no=#-Hjd|jx|CY{1B zJ*Izk)gE`NQHw#ghT;0n@JCfPO~YSrMdMb3*FPJzEO5lYXf@RbuwW!zTq)QMtB2pD z>Be0Ifx7CcgppUAkPz;B#XAy`W;S9vh1;AOMZ})MCRt`z_N(pKh=^WhuFCPZVUl5foC4ElPiYds%%sj1_lI2@-SrOA!BI^B+?#^*Xu_MD!9qFr_he1?Y<)i+%Z z?@ta(7t%J>qxjU`C7QSqzo*DK;UgmA#0>_7`C^twtI8TN^%Ti^1-AG5TNR%KhRlQkw;}~l-KbA*>AEVss632(G0{dm%St*E_TtRE9 znvL~?OX+b!NgQn`vBeAVoDM5_3i$xuX%?K8&qzfpC;Ks;^S*)j4Hy5MRK3u$-mUJO zuoFB>VkE!~GA*f&cdd4_efQ^XZ?ZMw4Y^9UVqrm!ap8gV652#x;i)el17T_+&g?Ne z&2W#oNb{+Xmer6)7p|8vzlyVX(j|-#YGu8ke%5ux$1c3Ca>K<_K~?YfcK`Rz=-v5e z5ee<3B_;pP%@zIZ`>(-K4(B*`t&M}}di;mzV$eXd7A>R%1ag!a&;Ow*P-$F*QXJ}9 zi~YzJZjyh`ePSeSG^?|)V9ep6HJAjT8+tK#YrY=SWz>a*MrZgKXxS%lE+zDncC~OziC=V0@&rOmdIOL_z!=_ zJ-4fmd4Ip?_$~$?dvweG_A~Ak0^hxIbLGOc(Dw}+9aOTJio&&qHm^o|Z2u(?QX|yJ z(7{D@%y~zcCGD7p&Q*|h7b%Ub_^(^3UlsAFlY`&Q2StUys@5#MjrE_bFA}gb)FzIz z%cQ$X=`Kl046whXZ7!9$o`)lro80)zic#YiW-&S%1l9qV%+pRq)%Na}ZM>&D)0eZw zUIIJ@rGo)q^>HkVw7b3=t&r{ANoIkg!7_IH3-UD?ZCsjdjM0kNqg!>s* zHfSn6#7_&-MCo2mxG~)4A5#qw0tMwa#Ssbf6jPTF(#eD;L3D!CB@()8vL3^a(Du`4v&W+2z4dFL0LOL0K`0d4)1c8 zRSU^Y%-|Wul)(sf+%4*5N}E4ZP{%zx zYTiEhiPq}Q&S-V1ZSa$pwFCFy^(AX)AdcfLuhlKM>d{b^=~T<`;bx2o_?_kJGosv_ zG;W>+HRN#U<&fGWaeK)kRP(1f4E$x?x2T~5a@%}R1}`bnycPi4esc& z#E@H@{VM{A!A`XzKv&sWF`amE#>`oI;%eJxjz5j8HKwH>p@s|zezFo~P65Je8u*LD zd?6bVF?6f0er|ie*;Ul9g)ztMjC-!^TUoTby2oS^eG0w~2ZSYKF$%M&dA7oXxQ~v^ z`TDsPdAvk@HdgT#&SGr4#}6SauPAcr!cy1Z5pH2H=s&%wxVh{xCG=W|Czk4(Nk7gW zib$HN{7uL>R0ir{nv1Lc(Ty)gR)*nitgBr`xbb`$xZXC{UwXTFIQv!ehCDY1VJJh} zi+2;LrqyS#xpq`JasD0|0toog0TchaZbD~>9dYB(^Fi< zd1Em~zxh3ncpw`>>CLn@!2k+^i-`?5({boS9msQ=8ZXwB!Nfs+J&Vk}!oAl!M zE4db1W<)PAoUQO9;MwC314%N1@0)q=hcl0~buS0e>7dmEoKP*_%LakDj2J$l=twVS z6j2mza;In>CLTn-TWn!YV5A_@*AxCmIHH$wxYd0I>7}`al7-i_JJR(Xf4b<(WIxsF)!<`;c>!n=PZA$FH2!77+mFBe()*1<42eClj@ni z#ZG^qEi~;HA6^21>W&QPR_ZxNMRbChPTM;LLuwF@?KU)kVNA1(4Ci7itcDqQ3Rj~a zZ$m#gR6rwhJU^v0PZ>JAz*t&_N~Pbbm65Z_dvI*iJ%>UHQs4KIj$R(4(wwYKaccX- z#g|H83A=|m@|4L+k%O|`Ir^@{M>K6KBBBCaWU;zP_~tH!Jugv=fom3_u&^0u)4OXI z-70#Wegdu;4zwZ%F4u4pY{Cw;YINvopeIyjl3*lXXK=8gexQ3e*b*Z$LEW00 z@K-wYh65A!m0}`X9v-$X_h`$Hk9ZPmIK`1tiy~sluayS2+s+F`M?@HFiEL*oPk&JX zDR7%`ad|E6<#wwF_*;K58Oyoxbi?B$8oi~i6x{VR&HWg&QS;Ql_Z;K1O~ev7I@ws} z2TEpKYRKUl<~Di;83i*Lzt4r-`3Shg!|MSdBtJa~kUj|nl6xxNwsxX#_b(OlBG~bp zzTBS@G*y?aBjh~OF(Q5$>qx$%_;*<_3Y%F)#7i%=WEiLps+FIDL4tCip(ql-S1ty^ zBODza6>G&!tPEeu z`j9-tU^RoPKTp9%++{f3X4)F}@#U*v&RQ#LgyMQ;4rAuCMvQvbvy=hqgUycism2m+ zSiqr46!kU6oAg!Cqw;83MPlURT|}v|af@u;LQkuNGWEmRI>tP9s_G;PdsbZkr~XG} z!~G5GkkCAtoH>_D;AqW}X*J_g`O%*2&zUx@^Nf_Mzm3#3p6>spYkJ4({F};}cx0$; zFOx9S1@U@1RMif1DH`{tTf!w-NBReJjVcQ#NS2!&235Buh`kURUX2*PbX9Dbs+sV8 zu=8o#h1as#4h38SNnj1GTCfOkPf#>|c0*Ik>?7-krU(`Bs%dtT>}~^L0MI3X+oAvL^D3 z>73=>K<#}X$~vPnLP2nIW1EW4^YV6Lf8AHQsp7vB2;s9SH5}Z@9{nVA{!d>@Y=$@_ zAbJX5Shu|@-}yOLk#pV^YNrMi*<{8xez!iRoh0Ios<);mLrf(VYG&&o%*P@?0-F=N ziabyaT4&<+Kl{$VauxLTCh?yd;HkbU*q5OS*b*FdO1&}gM0H43+b%AF+hh4k#_{18 zBH)phpUTT*v!z(SJmSzD{NHx+|Hj7cCb$Lym;2wvTMo+BKE>#`VHk zR^qVR$!e8^er&&J%DhMDMU|M-bOw9;YRv&nz1v-vIW3gQl zC1%>Tl4e#C_1d>2?3H4*fKw=tB5lROcM-p*+{l>%nm$Qi{*G1On8v6n4n6wy4~N4N zie`gdW9&!AFn-G9?lFtx;)zoGHl+!ULH}r)_^A8D2nu^cKk_5=&IQ=IaqB#ljrX$V z|H&&~eGGx8p-E_KMDt-QOaamg1&H&b_?fkKVjzY&K$De1e8|K!pC&oMdw%4MOqJxl zXV6&Nzt8lv+|ydBFMsj8@3`MfUT097bWn3o6<+QJ)(rT6OBLm)h7Gv8(vgf(<~Ej=;&<&nI(uFMINAJF0Sqe87uSkz0p)uc&^TYQ~IG@Mk{ds&I@Av2Z{=6>F*Yo-MqEs`zhFY5NI4ajs!fYO}$Lig`-hy4p zJpqZuUuDTYrSG{i`a2Iniu-o-xi&?I9F=s{%J}Um!Hi&)fZgBE8AxAson}lY_b<8v zw*2eYVRQ-2;pX_2$VkhO6frwZwS@!nIt)>4;hJJf{x}FakncDq(gcAzYST8AjE6a{30s5W6l=?zlt$r#OH5NP%*q+r zL4Id_#MfN1v>TLBTB)N*PmekjrUicz|NDh~R9ioHZVzu}k~k`0YdtP$)obe`pKZ^; z4Le*b3l8g;nWPvSRhhCS#@D=S6`?rkr7hUmi$orAQIql~>B|E?f4$w2b-V!C{5`Ln zD1Un9>Q!8cDE`;_s3mH+6tgLnhU!Y?IoSW#gNj}$V{hz=K7@dEw64uMa=I7RE2olq z-#l{F(Q)$xrdjkW*BORVfy@3EiG&IKB5*!%k~dHgw&gZhvl? z-npW?+aQC)AX^^Q(|BtNbGqxq1>Oj%>S`u3*$BO7#UCs7XC6%1%}g*(bO;*&5xuBT z7_H@??fDK&J6D3*|JtH^KI1jur#J@#+{pIG<94xJ6 z2czhQsh|Dgc~}i=^Cqm^!ezu|xCilBKixI+Aph=|grhO#d~UZLHuT=jo+VW8kv14LI-Q)ogS!#X7a{)K56#*l_2dDC@7xtk-YEw3~Yz)lfnG zMToKkB)G4Qa3coW&>Hx-$yl-DS8)Rar{=ACXqLu}K@<04wE8>mhMQ!)X80KV6BM(L z>Y`PnB`Y*jxk3V=!F8%ueJb93N_x=a*&z`Z<|~zGXoR0_<_|BS>&!}lDDEVZ!Yt5!v$YHcDREN1l-S9&sTQBm4w+&bY=XI7Ml-v9;V+;Xax2DMbV z@lwattKoTE)$y+H%_P#*k^sEJ)$0@CH$3HfH0D-RjRfV}QXoYoJ~?y(6rZFLr!zS? zSaPs!!;kU^o~Mg>@$Q}=B(mYJy1@83evD#;O0|~DjUu*^e{4-SPLc~w5TXH z!eS#3cH7X$;&iTa@|NhaP4}7!t6n>M`LGTfYLWacS0qJ^Lr7qbx``V{VFE9-Ewnem z++Uy}ciZh?3RlDn#Ce8Nn*fZJ?xlITz{FX~)FQ*(20eP&t~KzLCTl4{$SpZND(^3} zL)qGDck`$VoU#j)G;^Opk*Y;i5>)@fKPS{WxA_c&%^~#YgzD&&sd+kYVkI~PamvGd zrw+8`VH$P4K{4+kzr7N#d*_pgx1=2L5bv1IuJCY?p?`+TuE?XCxTFMf`Q~6<7_VA!s_p&(BNn$K1sP5rL~o#Av-%fc9pG=oBaF^|dQue=tkg(K zWoAEoymXpJmggQQuxWmNq?3EPE@7~ZCA8xZcJVRm{qZ{z?T%K4u~vd*sKkTdx7k$# z+WS^sv)-m^;mL|`&pg#tXq9(A%Fja>^4x2V?8sxqm_EoKVmOW#kWQ+Look;l#n6CL zsyWm72K4zxmL+|!wFMqh4=kNp|J**5z_qwYg?3Pb{4!AeO}jKS$amBoN~_a8oqMJC zY{NSIB7qgOuR@28M3j~C-`+y>CbZ_^5dd>hvYwk}OWDcLazWmH8fNOE{#GLS7LV-l z^cN;h>biQR*erNppwaMc!B{)5>#JAh&+46ahKKS#o^b->(x?O~ntbPJHmR$0tKCl! ztiZd{fcS9Kw?wpj|8w<^lTV)hR)~f=+k`MfuL~y|;{H0yLHt^_8!gz_F3`Z zy;}1$Ia19$4~WXgdO7b4{K3f)u?*|74@(Q&fh#+B267vqkihkuLBmOB0ch{P#ION? z5K_9p_#PvBh)4X~e4DBX_6u2&|DV37*{EDuNSj?;YiPFHd!ppoFh0$cU9>@rJpJTm z@LXSEOTSCRl8ALKzJqM9WNctfKIYL9{$N zytcSh#c5ssd+ypnB*&Z@tC{LYv!(T%#TJpQYC#I(!ZduBkylR+m8h^%ibGA-QxAx0CoJp?>~05Mv?bG!}nh3 z=}`%`eh)9Qo?($kXr6uzf9>^#fjMXx7FDHvGjw{S>y`{YS$-i^@8YP%iMq?iLwYDc zS88V}SkO(lUqVhix|?+ekdn)=YZVEv=I<#QQN2?w(BhE4PTL4**@o`ih+j|4!B_Ob z4dbu@W~A1A=@}}|*foE_1=c~FefoML5c){(1#~uxx>fGW(yVOIg-w~JWCDt40gz(U zX?5qivGIAx$87V3OLNbs*!N%XV^u@yJaR0KB;xjFfkzF#ujhwoS*?wjVx~CGjjOT0 zt=z>f)+?@$1;h!ZL9UcJ^gZr5`nldC*MOjEgYv0EzcbvhY-fuJfM-A z4KPC1-s}#iNdEpo`6UPcC5@6Rp$~18_cRy|R;Q=vr6h<~NTlV0vfYAU9bH(OoxLle zfsu^K0uo(s-+x8!>uTjZ3^ZkUQDS1QQ8tymdWTNAP?<53RCgXRGCr0PU$O~DGi66V z5!=fy!;U|q3$1l&<&|IN;b$oZ@?!?RjHh@1&JxBwj*E!7r;cR)V3(J@@|O44_jDJa z%y#%QBo}>2(;UTdg=l0JKmYNVAXwQa{EU>VTmPrNG{-KRx?x8imG}6zP86mLJN3db z+6?SJ5gqtWf)-v1G($J~QzCe#(Uj2lhHg`zdvOL)w51?z9pj#IW{%XLiwT5yOi)(ny== zMeA`6(2`Qf-&WRPf<-%vgk`MEf^kaV(Uy^CfDnd9PelS8p%&)MRrm%ZG);51cPxU9 zP0xqa94IY?-r)3WzoT^BOu+GO*V>btK+jY+ss6ivB7eV> Yr+7M3y!{X#>NdXY?gEF=PhxNV4`-0aZ2$lO literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Idle.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Idle.png new file mode 100644 index 0000000000000000000000000000000000000000..f70c60c2cc5e8c8c8011946e7c423c5c3418f605 GIT binary patch literal 2767 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Shield.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Shield.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf9d6f0d7b194a6075dad970000856c6440f422 GIT binary patch literal 2510 zcmc&$`#%%vA18e|b;Mb@&!whvEk(|f+c%e3WXV0Ul1r|+O=xQ!JGn)O6`5s}TQf!z zVUkO(+i{rNM#(T^gWA;ro4lcwWyB@8|P*zn}N>e4bCrbqAXxhm{VCh=?44 z*jn8X5jo&4T)+55TsR*9Zk!hpIfQ{&U3QMeawnk4Se~N9kAOxCav*teST+L4_7}q} z9iPW19q|}5l`$Doe%E{$GyCm?Ek0KB6j;kB_7^VRElPLAhm`qNCq2{hRA1@~0>j7W zYEk0_pR~Vq2isT$O$OW4zD9%PeE94x;w)q`uPN?UiwVu3g-^2*lK8)lyForJ(uF+^ zugxad%$QXcWFI=3Jy;4wjW=*v-PvCm8F%mOlsV-DV%H4i_5sD3I?gE(hva8^m54_Z zbrat@IF>}vM!*}}LKU6;V%ta&7cyyuMp-s`xWOBa-rrekQ4j>;zQcP5NOz%74MCQQ z_a=;nZq6Ad)PDy_7J>UyU6=lY!60ctd7Z_a%FEneWCABL!mTC^x&-EI* zZ@-~DGUP0{71y0(jBo61Jwcj)t~drfd$ir?#up?jXmDiwl=z7Bz8j1(V>k!XxwDf2 z`aT)Qnt6Lu9dvW5q6(ItoU9=)*SHjr^TI~U`=v5c39vG)o>X#wf0;x?xy7(;gw$Mm zM{Jc@^%sR9u2@+et%kKAKp@bpG_r+dZW_OGdF#N+GLcaTfV=o zhq_0(Xe7IqiGaEa#I(9C*KlMNC(b(EEznUaikZ;oeR15z7ZCX`aXoBFPA&zl&1>xZ(}rrA<y@AUrLN z@Hw06Fo)g(`6liB)HH)otiD?F(e<^h63i97=ykgCOkby+2CmynRb}S!c`QNMX zhL?w@>bsc2#0k%J^;E)c?9R&B&mKRUMjRV<=LAwR4Zg~nQ3#+R6~@_ z^)Wi<<|boW9N!RvJzoypb|4F-xSD8PcSj`{N zdtY~|BiQ^|`oMsm&2FMD`xLYw;qpA1E9q`|bN8D+qv6|vCwThb%+#OQ(8k@4xrgJ+ z7wwl>{2!Ltp(tw409Vh9hEX5GJK+$g`d65ZjE1WFS%#qX)-Yj=o>!gV4@>P#Dmj~kqc-O+MXirLz$sj`tg(F2P!QZ7ATv?v1n3_$ZCi92 zuCV!s@F;U#>^vB`Jo$&`%d>S9x#Lw)_nQm>=eGup1#qI$dXHn3xTdi$1WYD`Oni(c z2|~zud1aNlG04%ouLuL_W}_GMv%ihF1k~CkX@^EdR`8l5stV!^Mrga6wdSE*<3qq{ zoxmU-FFltrMnym;mAj<^=P%L8S3)NOrQA6(58p`pujM9!`unV+1Jlq7s%Bg=}%C2o3Dx*t>IWU{y6u^KnEU@MZ5Lw-!_4$Mlu#AJ@Qt0H~Tj=VK zF>yr#vPf32pdhF_Kc%67TMwW2={g$6HB_I!bQ;FOOZyw#K5{4X@yV$K@4ak7+p;#@RBjtib7S9dgespI(T9w1C8{Vw3@}3}a7v8vLC7F%p3#+noU`kFa z&$EN$74}jie%`Pt!0#GG(@A!#P&C*!t~93Wd6*ZZ6*5=O$iz%~!@ibTk$hr3;yBQ-a8Wcbuv-M2568{M)ZL9*pb|^9ovxv=l=+jM zz5^0#qy(}A>>&RIstGO;Qs7r|{al$kDZ;3Ubtb4gdh97EGqKp}p zNXc!wOj^nCvGz1p){MDuuXib+L16@;N0>y?^=`NdSa?9dTjqmE{nW5h@!U zZ0(P(aE1oGSXzqu7}E-u$iaIOQ+3Zy-z;Mj)8hS}$RfjIiLIRCGA&~rLaHm=L$>gq zi#y;pij78-5-|8$!4cr&nYV4}^$+KsK>ws;44q|f5z25y3m7i|URtj8uxsLYkIw?% z`rvIicU4%Ib6lRLF7(l>$HuW(rL9~Ar1gkS1IR*6H$j#lDZHJo^+7rV3SVqCqxLab z@A|vT@i=@3J6orxP+E#6t!p{wCMv^|5q^8ZoDu3i{w06y>MOBQ^}A&KGIjpvEz08q ZJ8E;#6JlCF77qPP4zYHyB3j%|_z!Q+pauW{ literal 0 HcmV?d00001 diff --git a/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Take Hit.png b/apps/docs/src/assets/sprite/Monsters_Creatures_Fantasy/Skeleton/Take Hit.png new file mode 100644 index 0000000000000000000000000000000000000000..707370f06d1d6f28ac3cf1ad2b044e38111a4ddf GIT binary patch literal 3425 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx b/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx index 88e973e..b21df2a 100644 --- a/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx +++ b/apps/docs/src/content/docs/instancedSprite/04-instanced-sprite-building.mdx @@ -3,46 +3,100 @@ title: Making spritesheet from images description: InstancedSpriteMesh --- +import { Image } from "astro:assets"; -### InstancedSpriteMesh -tutorial on how to make spritesheet metadata with just images: -Sprites from -https://luizmelo.itch.io/monsters-creatures-fantasy +### `createSpritesheet` utility +The `createSpritesheet` is a helper function that facilitates the creation of spritesheet metadata and a `Texture` which are essential for configuring +`InstancedSpriteMesh`. The process involves the following steps: -1. load images -2. 1 img file = 1 animation -3. Name animations and Combine img files into one spritesheet via html canvas so there's only one texture -4. Generate meta +1. *Initialization:* Begin by invoking the `createSpritesheet` function. This function is the starting point for creating your spritesheet. +2. *Adding Images*: For each image you wish to include in the spritesheet, call the `add` function on the created spritesheet. This function requires specific parameters: + - `name`: A string identifier for the image. By default, this is set to "default". + - `imageUrl`: The URL or path to the image file. + - `config` object consiting of: + - `type` - choose whether you're providing how many rows and columns are in an image `"rowColumn"` or giving the size of a single frame for the builder to interpolate from `"frameSize"` + - `w` and `h` refer to either `column` and `row` or `imageWidth` and `imageHeight` depending on what you chose in `type` + ```ts + /* The configuration object is structured as follows: */ + config: { + type: "rowColumn" | "frameSize"; + w: number; + h: number; + } + ``` +3. *Build*: After adding all of the animations, call `build()`. The `createSpritesheet` function returns a promise. This promise resolves to an object containing a `texture: THREE.Texture`, which can be applied as the map property of a material, and a `spritesheet` for use in the InstancedSpriteMesh. + + +**Important Note:** The utility currently supports only the rowMajor layout. This means the frames in the spritesheet are ordered from left to right and top to bottom, progressing row by row. Adjustments to support different frame sequencing may be added in future updates. + + + + +## Example + +This example shows how to create a spritesheet using the Flying Eye character +from the collection available at https://luizmelo.itch.io/monsters-creatures-fantasy. +The Flying Eye character includes four separate animation files. The goal is to merge these +files into a single texture and establish the necessary metadata for it. + +import attack from "@assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Attack.png"; +import flight from "@assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Flight.png"; +import death from "@assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Death.png"; +import hit from "@assets/sprite/Monsters_Creatures_Fantasy/Flying_eye/Hit.png"; + + +**Attack.png** +
+ attack +
+**Flight.png** +
+ attack +
+**Death.png** +
+ attack +
+**Hit.png** +
+ attack +
+ + +### example code + +We call `createSpritesheet` and start defining metadata for each of the sprite files. +- first `add` a `Flight.png` file - we name the animation as `fly` and use `rowColumn` type. We then provide `w` of 8 - because there are 8 columns (frames left to right) and `h` of 1 - because there is only one row of animation +- for the second animation - `attack` - I'm going to use a `frameSize` type. So now we provide `w` and `h` in pixels of how big each frame is, then the builder calculates columsn and rows internally. +- Then I add `death` and `hit` animations, just like I did the first one. Notice that these animations have a different number of columns, but that's fine. Each of your animations can have different column and row numbers. ```ts -const g = createSpritesheet() +import { createSpritesheet } from '@threejs-kit/instanced-sprite-mesh'; + +const {spritesheet, texture} = await createSpritesheet() .add('fly', '/Monsters_Creatures_Fantasy/Flying_eye/Flight.png', { type: 'rowColumn', w: 8, - h: 1, - rowMajor: true + h: 1 }) .add('attack', '/Monsters_Creatures_Fantasy/Flying_eye/Attack.png', { - type: 'rowColumn', - w: 8, - h: 1, - rowMajor: true + type: 'frameSize', + w: 150, + h: 150 }) .add('death', '/Monsters_Creatures_Fantasy/Flying_eye/Death.png', { type: 'rowColumn', w: 4, - h: 1, - rowMajor: true + h: 1 }) .add('hit', '/Monsters_Creatures_Fantasy/Flying_eye/Hit.png', { type: 'rowColumn', w: 4, - h: 1, - rowMajor: true + h: 1 }) .build(); ``` \ No newline at end of file