From 4eb954e7598983136540b79b46b052a0500f04b3 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Nov 2018 13:30:15 +0100 Subject: [PATCH] view: remove support for non-power-of-2 sprites again Sprites with unusual dimensions must be padded with transparency. By only supporting power-of-two sprites, the anchor point can always be specified accurately. --- dist/resources/sprite/entity/red_ellipse.png | Bin 255 -> 1700 bytes src/view/entity.ts | 5 +++-- src/view/util/image.ts | 14 +++++--------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/dist/resources/sprite/entity/red_ellipse.png b/dist/resources/sprite/entity/red_ellipse.png index 48fc2c08ec65ac90df36f5bf1d89e82887b45029..9acf873e294610e8c97068ffe57865a23ac14bb6 100644 GIT binary patch delta 1697 zcmV;S244C90i+FoiBL{Q4GJ0x0000DNk~Le0000$0000W2nGNE0HU3Kga7~qetJ|` zbW&k=AaHVTW@&6?Aar?fWgumEX=VTbc-pO3ZFVFl4E)b2as-3`q2mA&@8t$LehPY~ z{juJ)Coh9Nv}r)7N-E*t|NOneU-(dKDdZxpYON8UtXWfk$3u&6AAj`M7{z?PpC5XB zQ+WU4UY{_+==u6n@?)GI7|rnil^BR+oDvbL6A z-t}AoL%p23OoZn)m^gqEpJf$I@LTXKrzu*CJxYgv|&`{@B8I z6MoXxnh_WgZ7|z~70#8?=7BbhyuUFGgwT5MRt~_=c7MVB7A0^ zW!5QwvrV1dlCfngR!yv#T6c1UQt<4>tBW^R?+dZEc;!`AU9#HJ)o<1wtp3toV2vKE zrNh*oCpT*t71W&i=5HfOO>&S^8ZIg6T*6(!-2WpiT`d!Pym zvr{UIZtmWg`!R0;SbxV``U!JkQ};hGmxA+uC*Hnb&9)NG!`PLD8`H?hKD_tVQ|kab zT@SDHJ{LCelh85trjX8%;~AX2?Y@E7QasjEvzAML!E!DdY?cLY~jo|^M@#17c^Q+Uy<-}d)LU}?)buOaME2v@Km$^++r zF6urV?ntM$qp&r+e6d)(({k&224c5OIa=r*;B^8z_g$5O41)v-gRWxBVp zB!_NzDQgb4(Pm|vs~dc(U2S2@pp5u`?*wPHIyS-&r~EqH;d-zRoWZrj(8#iSUP=gg zLp)VMyeP)o%6(u>w;^$VH>8Zwq62u^Ssq6nxwqG-UiQF~o^ z0BJN`0jQ|&C0eg&9GTk-&OWydUwW;UOD_n0_ypP0l?rmsl1tUY8$^A4q%!=3>o?As z3XFZ_bl6_QTgbE?Z=wA_JlPO`AFntYJ`W(cuyoEXD#+HcqaC8s%w?$^QR&r?Z0u8z zm&O%GC=|RfqAD&F8mrCh8QobQ^#6(TcYP4mo$i;vP#VB(G-ktn^CWvV(+NRq(sz*a zoF~Y0uFwESkW)Rrgts97Pa=B>D=@$%;#(NDO_alhq|3XOgO|<#X0H8zkIdXf`D_#w zrOapZbaem#wdiOOHjj_X>LpYxu0R;}Y2&DV>f&>M2ia&`A)`07c}M zaA$C$AqfyS@z5@9{Snwu)*aPd%gDRJK<;)Ssaspae;3zp0`ghc*{^yFAW`40dRrf5 z{q|e0G}&HRorbhUl?uSI(=33FOk}1{Z}&qcE-LCG;D_AE&yzo9&y~xKNRi&pXt7Av*B$c0YaK@qUH+#OmO)z%zXTfjR(M@F);qhi3;r z0RbfdA>mg*z;5B$5U^u-CIs`E$O_Lo+q~5m(UH;tnbl``unSb*<;ixgK4Qa*jpAwm z4S+M8q{`#vUjPs+Cc<9>svwl1j;vNB961M=TQ00000NkvXXu0mjftB5L% literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3HGb?#A2&Qk(@Ik;M!Q+`=Ht$S`Y;1W<6J zr;B4q#NoF$Y`Gc?cvutS*FAsr;-gHgZTwx9?Au@LIcMzs@|g4K(bPb@44e0E_nX5m zY|J~!{JYfbZg-Fb`=evbi$!nnhHbT-U#_3K$FE<+&Ih6+= zU2L5kW8ir5OA=eqjCaJqH-4F4Opo-0Z(*?%)SC06{XN#fP~#r7)VfBPDx zDUlalFBwN}_Ynybo_hbtrIe(%CYyJ3|NRwUZyx>JM~f+7c^1&|44$rjF6*2UngGv! BV{`xj diff --git a/src/view/entity.ts b/src/view/entity.ts index 7600826..83cd955 100644 --- a/src/view/entity.ts +++ b/src/view/entity.ts @@ -14,9 +14,10 @@ export async function loadEntity( const sprites: SpriteView[] = []; for (let frame = 0; frame < data.frames; frame++) { - const [texture, size, coords] = mkTexture(r, tile, frame, data.frames); + const [texture, coords] = mkTexture(r, tile, frame, data.frames); - const offset = vec2.mul(vec2.create(), data.anchor, size); + const offset = vec2.fromValues(coords[2] - coords[0], coords[3] - coords[1]); + vec2.mul(offset, offset, data.anchor); r.snapToGrid(offset, offset); const anchorCoords: SpriteCoords = [ diff --git a/src/view/util/image.ts b/src/view/util/image.ts index 7baeccc..4c5e386 100644 --- a/src/view/util/image.ts +++ b/src/view/util/image.ts @@ -16,18 +16,17 @@ export function mkTexture( src: HTMLCanvasElement|HTMLImageElement, frame: number = 0, total: number = 1, -): [WebGLTexture, [number, number], SpriteCoords] { +): [WebGLTexture, SpriteCoords] { const gl = r.getContext(); const texture = gl.createTexture(); if (!texture) throw new Error('unable to create texture'); const w = src.width, h = src.height / total; - const w2 = nextPowerOf2(w), h2 = nextPowerOf2(h); const canvas = document.createElement('canvas'); - canvas.width = w2; - canvas.height = h2; + canvas.width = w; + canvas.height = h; const ctx = canvas.getContext('2d') as CanvasRenderingContext2D; ctx.drawImage(src, 0, frame * h, w, h, 0, 0, w, h); @@ -39,12 +38,9 @@ export function mkTexture( gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const size: [number, number] = [ - w / r.coordScale, h / r.coordScale, - ]; const coords: SpriteCoords = [ - 0, 0, w2 / r.coordScale, h2 / r.coordScale, + 0, 0, w / r.coordScale, h / r.coordScale, ]; - return [texture, size, coords]; + return [texture, coords]; }