From 1cf3d78eacd10217b0ef95bd51dd8e6c973f67d5 Mon Sep 17 00:00:00 2001 From: SquidDev Date: Mon, 10 Jul 2017 22:20:07 +0100 Subject: [PATCH] Fix texture artifacts when rendering monitors - Adds a 1px margin around every glyph. This is generally empty, with the exception of teletext characters where it continues their pattern. - Uses GL_CLAMP with the font texture. Closes #300 --- .../client/gui/FixedWidthFontRenderer.java | 25 ++++++++++++------ .../render/TileEntityMonitorRenderer.java | 4 +-- .../computercraft/textures/gui/term_font.png | Bin 2910 -> 3809 bytes 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java b/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java index a44bc2962..4cf7fd716 100644 --- a/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java +++ b/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java @@ -20,7 +20,7 @@ import java.util.Arrays; public class FixedWidthFontRenderer { - public static ResourceLocation font = new ResourceLocation( "computercraft", "textures/gui/term_font.png" ); + private static ResourceLocation font = new ResourceLocation( "computercraft", "textures/gui/term_font.png" ); public static ResourceLocation background = new ResourceLocation( "computercraft", "textures/gui/term_background.png" ); public static int FONT_HEIGHT = 9; @@ -52,12 +52,15 @@ public class FixedWidthFontRenderer float g = (float)colour[1]; float b = (float)colour[2]; - renderer.pos( x, y, 0.0 ).tex( (double) (column * FONT_WIDTH) / 256.0, (double) (row * FONT_HEIGHT ) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); - renderer.pos( x, y + FONT_HEIGHT, 0.0 ).tex( (double) (column * FONT_WIDTH) / 256.0, (double) ((row + 1) * FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); - renderer.pos( x + FONT_WIDTH, y, 0.0 ).tex( (double) ((column + 1) * FONT_WIDTH) / 256.0, (double) (row * FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); - renderer.pos( x + FONT_WIDTH, y, 0.0 ).tex( (double) ((column + 1) * FONT_WIDTH) / 256.0, (double) (row * FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); - renderer.pos( x, y + FONT_HEIGHT, 0.0 ).tex( (double) (column * FONT_WIDTH) / 256.0, (double) ((row + 1) * FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); - renderer.pos( x + FONT_WIDTH, y + FONT_HEIGHT, 0.0 ).tex( (double) ((column + 1) * FONT_WIDTH) / 256.0, (double) ((row + 1) * FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); + int xStart = 1 + column * (FONT_WIDTH + 2); + int yStart = 1 + row * (FONT_HEIGHT + 2); + + renderer.pos( x, y, 0.0 ).tex( xStart / 256.0, yStart / 256.0 ).color( r, g, b, 1.0f ).endVertex(); + renderer.pos( x, y + FONT_HEIGHT, 0.0 ).tex( xStart / 256.0, (yStart + FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); + renderer.pos( x + FONT_WIDTH, y, 0.0 ).tex( (xStart + FONT_WIDTH) / 256.0, yStart / 256.0 ).color( r, g, b, 1.0f ).endVertex(); + renderer.pos( x + FONT_WIDTH, y, 0.0 ).tex( (xStart + FONT_WIDTH) / 256.0, yStart / 256.0 ).color( r, g, b, 1.0f ).endVertex(); + renderer.pos( x, y + FONT_HEIGHT, 0.0 ).tex( xStart / 256.0, (yStart + FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); + renderer.pos( x + FONT_WIDTH, y + FONT_HEIGHT, 0.0 ).tex( (xStart + FONT_WIDTH) / 256.0, (yStart + FONT_HEIGHT) / 256.0 ).color( r, g, b, 1.0f ).endVertex(); } private void drawQuad( VertexBuffer renderer, double x, double y, int color, double width, Palette p, boolean greyscale ) @@ -164,7 +167,7 @@ public class FixedWidthFontRenderer if( s != null && textColour != null ) { // Bind the font texture - m_textureManager.bindTexture( font ); + bindFont(); // Draw the quads drawStringTextPart( x, y, s, textColour, greyScale, p ); @@ -179,4 +182,10 @@ public class FixedWidthFontRenderer } return s.length() * FONT_WIDTH; } + + public void bindFont() + { + m_textureManager.bindTexture( font ); + GlStateManager.glTexParameteri( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP ); + } } diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java index 11411664b..0a77d0db5 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java @@ -179,7 +179,7 @@ public class TileEntityMonitorRenderer extends TileEntitySpecialRendererT+0OjF{5)<7D$56VsYkOmZ7-S;?7Qx#BKX! z?dr!p!cBdRU?@=GA!S?{z#A(Ytd?8e9RDv*oMG9K+6JpX<|4r;b7IfM4sevTpYIGPZk0-law%YZ2Dt z_b2c!J)IE@Fw;QApAr}XbMqZhzmaaI*)0U6Hjz+?kFwQC7qBw=X-EUEE9+KvvLU;! zW}_b7jWho!l9_#-vUX9XE@U6p>gV!?z1Y1*^LjI58us%xm>BYQb%S}Bup-woIVJzs zz=mXU=s+-lRFlwO>+d|>JuQpha$oL-PA%AM{a^(FuxS5`3esWC+wX54E)Z7qeFrSP zyjo&qQ5m1Kk3v&rd&$Hlev}4i8twPjq!4+o?VvakDBCPloEh*rk@$)#61eHDjPxz7 z`t&R*YhL1_L3w4fw4|q?^ZqH7zaPr-<`0Fk1SJ&)?LcD#oH2k}3j!hc0tM80_JI}ZPx&R+lzBJ;mXu2=_ z(-uWno?^V371nK8Uyk0O>7%!DN2gt5FGfm z%sh7QwIn1vPxZFx(N)#lT7-wGagxBC&Lq*Hs5F^MPPiaSnO2S$+gJz6$ z7)IBQ#Hyxyxt3+T1V>GF_>lEnc;w8IqlI~k#7;aX<2n8MO9g} zh44P$YiA5sXXpV|JC`OP#icU+FPrp`d)<@WziMJOJ`zB9Ywm-feobmaWC?jN+sH$Y z02bNqxI`WKG?d3Mz~-aQQ(J^POyPT^`sGq$56+m?rr*T4k9>=0;{!E94)`n+yLZ`7 z=t)2n(*B1WXNHG&l0=b@P1e53Gg{(C!e#9(g};{ec0A_5%$o%9x-(?X5Skg&&6rbP zq=+BQ8~Sy|He73l8K`T4yg&6iRuU7IxKEksE_nDTK0j9c0*EFA%+yMH!L#G-K)ZeG(0#qqEOSC&3c$M~d1 zac2ls0%P2>_L>@$#Lt3lmZtYth&kvpWyfQ?X%{geBj3oc&aC}qD`=Y3kd<|Ctt8WwROt_+4SesE*Y)%Y6K|pWaf7~G6J~0W z`=lrR#Yao@{3;*7p1=n0z0%*0ka<~leskZt*xMWm?&^2#9|n`@*Z6+RH-Qi~^FtMj z;^2>Hd(W}M5Q#lqE9_q1Cr+b=vfEjbj(?m+szj$pj1fw#>t%X!pAH;Rg0veW?a%LH z1<(y-l`_;s)T>s7M2igf>=gTkfgO+Naa-i0eX^rWFNgoZSBtg^61tjQYQ>-@iVomf zBJ5Yrz(nzBLU;H_Ic>Y5oytz|D(N})O4)_fLdB@*=JDR+{JB6~#H4qB+m98}_Ic1M z!D{bNfztD)wxa@S;Ha?bOZR-u&-Ssmfsnzk09NRs0WOl{91Z-Y# zEmymGgB*khudtg9q7gpjj&l^h^I8MFnD- zgfAIbYA?pQNxVdDpvc|=tn%w{+5Xhq8OhHo5~#DX^2hFJBreRT?_X$M5ZxX>xyN== z%U`wwW)h0X?HmUtQsfXFg@@H*d!nUx3MF4j-2A;4qC2_%pzCRp-rJ=V$Z$u71twjQ zD7c^j_+^qsLU_u*|2*t~8dHsMKh1~5nSPqLkpd}m!z{fS$pPOB2XEvIL3P#|H*D9}Yw^Qs~whcHX7r`W(;kysZ8E26^MI-xPv1Y$BaGr{5lf_hek-oeEpAY~|!p zSG%QsD~-n=314Y-$?f%o1UWpR1P|!I`%y&$F>N5q)8Ao{W~sXmim!wQZ+pY%R1qsX zT_*Gw0Rk{3dKfh$1}{;+ue+#)C82|^9^4CA`&k$xKPN9uAjYzAO$iXXoC+wQcrKe1 z`&&H0;6SVJQ$x-Ljmntm{y^Od=!O?ZWAe+{AiWp8=x?a*iz6j>9UnFcU&Y=SF#NDz zKXXoNxHNZ(f>Cesc3eSgD;;s}+Y~2sEZtmF7UJVJ@z=%FDySY|@TT_Cr-d1J^JA${ zGCz{i`xpJ=SMXs|E9WVUa1}^~el)5}Km4znoNYQ>`lTQ}AN{!0dH%_wV_LnGs}nV|zS|k@RD= z6uc#}n-n~Nw6~IaOekJx_vvFOfCgEG>xb)MqUKCUAhVI%*TOf)g;n)MPhr9^k0)=AH>umm>kD$8Mz*~NNGeeY z*yz4TL}XX>y1w}-1=f_Y&V6KTq#KP6+5b$M9Jgdr&PjROb1sf9AThhkKt4nHaVl{) w3BY^q-f=e`?9#kp7x@2AOR#I;t&KIstF=)P@9hsJ?EXN`Svy$KEq#;!2eQ^Bt^fc4 delta 2805 zcmVNklTZ~xBi&!g#&&Z~TPaBB@9dXSGw>sF9Bs!43C!I__1C4E#g znATAe)PyR160MpI+$G(al^q4BRH0{#GR*7*{JmDCv$A@PeTSgF0G15^PwJH&Q&KEY^u&i*Zx(TCP33EbuT=z)%={B9rIY^PZ3T9xZX=T*~ll`i zH>&nVnSUr77$Y)m{>NQD@ zdh=&Y5SsmcXuj~+8bDO~AI)?dndFnHc~moPW`ALkcLo4Y7LRTMWSa&1;E>JGX9Gy4 z36cq5t?SKvmjNCf0J0gPH+{A;+2?6B0GXdZ5iGKA{Pj8zXSLn$cu8oqsRAF@1jv-M zQSW{A{#T6xoDBdnKm3tE2ms6bzZY1}?C8^b`KI@}akOAaR01FU?y4=!THic+I^$D<|@76=vduuOqyjmhg=iXgn9?e#4rE$Nn zpc0>@YXH?Hwt8D%jh4LCxdi*qM90sRxU)a2^k=C6P|dKFi8s{=LT6tZx@xh{kZP$ZScYdZBk-1j1m`IeKs7l^j#5B_vG9x{3 zdzH5}0qCmZy()NRNU&0+@4bbX83t|bSukS%DCJq*SGKDCr#eO^WnMJ^ z9uokf2|F|U7FO-^fIr&=sJ!sgY7S(p<=HL3D%Jj8I`=Q-j9%wV$v$#l005ZpHEUu| z^t;xCpUOmcUMJavM;ix9S(gC3QfJPI6W=#+p&2*J}Rww&p&p!%69y3<;wOWFz~=}cjS7N-_P0=2p-=DutGqZQAN)5MR*MO^8p~5J{x6}-U>pQ zjS@jN+D8+WG9x8M0T2Kll+KY=g`#0k znV;nz_^8xtjdw@qAC-XF@%nchkJ33K08|2uK)`a<-OL1@?BtnNCV#nlO~7mwepV*W zE<_^pvy!iW|LXJQ_rqhq|BXu3tE=cELv*b*1V_@8SukZ}??JdyxG3mIW|*-i;C{#5 z>>{Q6^Lz6c-kkxDGQU8;GJOD*zJgX$qE!RP_8GLQ?ECYpZTMavK&yWvbDkyu9~}Um z*0*tWlSJkR1OguEm4A6qGh1V2`UPA+e|>m|FJA!&0DvaIwQb(Y@?qKISKsUM{{fl+ zr~v>100000a1|4Q7QH^agHAvY002#Z3z!I`34j^^AOHX>`F>{={fSMCr++`71^@^E zz=%X?2?FEx+Z6dnwKFuCAR`h-L0pD)QvCTNq<`?^n8EuXc z^^{jP)rjsN)iU-QjI?$l%BC4UCIIwG`fMgRY6`S=7TRXIGZ`()ywPq%`+HT=p!DbC z+WMI`{pjbj?SJ!3GvLeyrn5H*6$DsSxeC31pnFy2==|38qpEwgx;^@tk&pe=DQS2x^t! z5`90JOfIvty00?`^AV~6Pk&J05lw(-?)sS_vTOio-S2F3 zW!BW>chrVpsU|`z16JGX+4%vZ0U)a8kK8xYzVDqc^RuGzOu%ZDc(&|)TIp;p+A%T* zU}Vm~nRy2AG0l#slpHBJXN(w())2C9KYBxumAopMX=aHvy989C!h`!3fE%mgm2-L> zY?X2G>VL{V(Xp%3U!4Fox{d-os^p$Eac8tGJ}doKd`B`mtNY$RsJ*4Eqh9p=q?)Uj z%09DTN4CW7z0KHr%dvG2{S`c-M8D&BYvIpqU&5^8@4gS*S_63JL*JS{-0RhkmhG~6 z2NVOqYCGq&g2K^ftCN%Np3DSG1%TC?C)<98R)6!M*VaFKJnGvxdmI?-vj6}_OVrHn zIhjp0_SZbRN9)?XYt2b}F$uLg$J z%zwwDbGFCq7{pQmAiH?R3bmD^G~G3<)|;?oxQ|B!fNV*(Lgqh8)2f+F=4W-U*5sGW zuDb7>EtsjkzdJpZt!|Ar%#S!3;+00000NkvXX Hu0mjf7}