diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 5cf212b..b10439b 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -443,6 +443,30 @@ class BuiltinFunction color.setDefaultValue(p.graphic.gcolor); p.graphic.gpaint(p.graphic.useGRP, x, y, cast(int)color); } + static void GPUTCHR(PetitComputer p, int x, int y, int str) + { + GPUTCHR(p, x, y, str, 1, 1, p.graphic.gcolor); + } + static void GPUTCHR(PetitComputer p, int x, int y, int str, int scalex, int scaley) + { + GPUTCHR(p, x, y, str, scalex, scaley, p.graphic.gcolor); + } + static void GPUTCHR(PetitComputer p, int x, int y, int str, int scalex, int scaley, int color) + { + p.graphic.gputchr(p.graphic.useGRP, x, y, str, scalex, scaley, color); + } + static void GPUTCHR(PetitComputer p, int x, int y, wstring str) + { + GPUTCHR(p, x, y, str, 1, 1, p.graphic.gcolor); + } + static void GPUTCHR(PetitComputer p, int x, int y, wstring str, int scalex, int scaley) + { + GPUTCHR(p, x, y, str, scalex, scaley, p.graphic.gcolor); + } + static void GPUTCHR(PetitComputer p, int x, int y, wstring str, int scalex, int scaley, int color) + { + p.graphic.gputchr(p.graphic.useGRP, x, y, str, scalex, scaley, color); + } static void BGMPLAY(PetitComputer p, int music) { } diff --git a/SMILEBASIC/graphic.d b/SMILEBASIC/graphic.d index f68cd12..3d5224f 100644 --- a/SMILEBASIC/graphic.d +++ b/SMILEBASIC/graphic.d @@ -17,31 +17,45 @@ enum DrawType TRI, PAINT, CLIPWRITE, + PUTCHR, } struct Circle { short r, startr, endr; short flag; -} +} +struct Character +{ + int scalex; + int scaley; + wstring text; +} struct DrawMessage { DrawType type; byte page; byte display; + uint color; short x; short y; union { - short x2; - short w; + struct + { + union + { + short x2; + short w; + } + union + { + short y2; + short h; + } + Circle circle; + } + Character character; } - union - { - short y2; - short h; - } - uint color; - Circle circle; // } class Graphic @@ -273,6 +287,31 @@ class Graphic } glEnd(); } + void drawText(wstring text) + { + int x; + foreach (c; text) + { + drawCharacter(x, 0, c); + x += 8; + } + } + void drawCharacter(int x, int y, wchar character) + { + auto rect = petitcom.console.fontTable[character]; + float tx1 = (rect.x) / 512f - 1; + float ty1 = (rect.y + 8) / 512f - 1; + float tx2 = (rect.x + 8) / 512f - 1; + float ty2 = (rect.y) / 512f - 1; + glTexCoord2f(tx1 , ty1); + glVertex3i(x, y + 8, 0); + glTexCoord2f(tx1, ty2); + glVertex3i(x, y, 0); + glTexCoord2f(tx2, ty2); + glVertex3i(x + 8, y, 0); + glTexCoord2f(tx2, ty1); + glVertex3i(x + 8, y + 8, 0); + } void draw() { if(!drawMessageLength) return; @@ -388,6 +427,23 @@ class Graphic drawCircle(dm.x, dm.y, dm.circle.r, dm.circle.startr, dm.circle.endr, dm.circle.flag); } break; + case DrawType.PUTCHR: + { + glColor4ubv(cast(ubyte*)&dm.color); + glEnable(GL_TEXTURE_2D); + glEnable(GL_ALPHA_TEST); + glBindTexture(GL_TEXTURE_2D, petitcom.console.GRPF.glTexture); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(dm.x, dm.y, 0); + glScalef(dm.character.scalex, dm.character.scaley, 1); + glBegin(GL_QUADS); + drawText(dm.character.text); + glEnd(); + glPopMatrix(); + glDisable(GL_ALPHA_TEST); + glDisable(GL_TEXTURE_2D); + } default: } if(SDL_GetTicks() - start >= 16 && i != len - 1) @@ -508,6 +564,25 @@ class Graphic dm.display = cast(byte)petitcom.displaynum; sendDrawMessage(dm); } + void gputchr(int page, int x, int y, int text, int scalex, int scaley, uint color) + { + import std.conv : to; + gputchr(page, x, y, (cast(wchar)text).to!wstring, scalex, scaley, color); + } + void gputchr(int page, int x, int y, wstring text, int scalex, int scaley, uint color) + { + DrawMessage dm; + dm.page = cast(byte)page; + dm.x = cast(short)x; + dm.y = cast(short)y; + dm.character.scalex = scalex; + dm.character.scaley = scaley; + dm.character.text = text; + dm.color = color; + dm.type = DrawType.PUTCHR; + dm.display = cast(byte)petitcom.displaynum; + sendDrawMessage(dm); + } int gprio; void render(int display, int w, int h) {