mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-12-05 03:55:39 +00:00
228 lines
9.1 KiB
HLSL
228 lines
9.1 KiB
HLSL
|
#ifndef _DRAWTEXT_H_
|
||
|
#define _DRAWTEXT_H_
|
||
|
|
||
|
#define _DRAWTEXT_GRID_X 14.0
|
||
|
#define _DRAWTEXT_GRID_Y 7.0
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// //
|
||
|
// DrawText.fxh by kingreic1992 ( update: Sep.28.2019 ) //
|
||
|
// //
|
||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
|
||
|
// //
|
||
|
// Available functions: //
|
||
|
// DrawText_String( offset, text size, xy ratio, input coord, string array, array size, output) //
|
||
|
// float2 offset = top left corner of string, screen hight pixel unit. //
|
||
|
// float text size = text size, screen hight pixel unit. //
|
||
|
// float xy ratio = xy ratio of text. //
|
||
|
// float2 input coord = current texture coord. //
|
||
|
// int string array = string data in float2 array format, ex: "Demo Text" //
|
||
|
// int String0[9] = { __D, __e, __m, __o, __Space, __T, __e, __x, __t}; //
|
||
|
// int string size = size of the string array. //
|
||
|
// float output = output. //
|
||
|
// //
|
||
|
// DrawText_Digit( offset, text size, xy ratio, input coord, precision after dot, data, output) //
|
||
|
// float2 offset = same as DrawText_String. //
|
||
|
// float text size = same as DrawText_String. //
|
||
|
// float xy ratio = same as DrawText_String. //
|
||
|
// float2 input coord = same as DrawText_String. //
|
||
|
// int precision = digits after dot. //
|
||
|
// float data = input float. //
|
||
|
// float output = output. //
|
||
|
// //
|
||
|
// float2 DrawText_Shift(offset, shift, text size, xy ratio) //
|
||
|
// float2 offset = same as DrawText_String. //
|
||
|
// float2 shift = shift line(y) and column. //
|
||
|
// float text size = same as DrawText_String. //
|
||
|
// float xy ratio = same as DrawText_String. //
|
||
|
// //
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
//Sample Usage
|
||
|
|
||
|
/*
|
||
|
|
||
|
#include "DrawText.fxh"
|
||
|
|
||
|
float4 main_fragment( float4 position : POSITION,
|
||
|
float2 txcoord : TEXCOORD) : COLOR {
|
||
|
float res = 0.0;
|
||
|
|
||
|
int line0[9] = { __D, __e, __m, __o, __Space, __T, __e, __x, __t }; //Demo Text
|
||
|
int line1[15] = { __b, __y, __Space, __k, __i, __n, __g, __e, __r, __i, __c, __1, __9, __9, __2 }; //by kingeric1992
|
||
|
int line2[6] = { __S, __i, __z, __e, __Colon, __Space }; // Size: %d.
|
||
|
|
||
|
DrawText_String(float2(100.0 , 100.0), 32, 1, txcoord, line0, 9, res);
|
||
|
DrawText_String(float2(100.0 , 134.0), textSize, 1, txcoord, line1, 15, res);
|
||
|
DrawText_String(DrawText_Shift(float2(100.0 , 134.0), int2(0, 1), textSize, 1), 18, 1, txcoord, line2, 6, res);
|
||
|
DrawText_Digit(DrawText_Shift(DrawText_Shift(float2(100.0 , 134.0), int2(0, 1), textSize, 1), int2(8, 0), 18, 1),
|
||
|
18, 1, txcoord, 0, textSize, res);
|
||
|
return res;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
//Text display
|
||
|
//Character indexing
|
||
|
#define __Space 0 // (space)
|
||
|
#define __Exclam 1 // !
|
||
|
#define __Quote 2 // "
|
||
|
#define __Pound 3 // #
|
||
|
#define __Dollar 4 // $
|
||
|
#define __Percent 5 // %
|
||
|
#define __And 6 // &
|
||
|
#define __sQuote 7 // '
|
||
|
#define __rBrac_O 8 // (
|
||
|
#define __rBrac_C 9 // )
|
||
|
#define __Asterisk 10 // *
|
||
|
#define __Plus 11 // +
|
||
|
#define __Comma 12 // ,
|
||
|
#define __Minus 13 // -
|
||
|
|
||
|
#define __Dot 14 // .
|
||
|
#define __Slash 15 // /
|
||
|
#define __0 16 // 0
|
||
|
#define __1 17 // 1
|
||
|
#define __2 18 // 2
|
||
|
#define __3 19 // 3
|
||
|
#define __4 20 // 4
|
||
|
#define __5 21 // 5
|
||
|
#define __6 22 // 6
|
||
|
#define __7 23 // 7
|
||
|
#define __8 24 // 8
|
||
|
#define __9 25 // 9
|
||
|
#define __Colon 26 // :
|
||
|
#define __sColon 27 // ;
|
||
|
|
||
|
#define __Less 28 // <
|
||
|
#define __Equals 29 // =
|
||
|
#define __Greater 30 // >
|
||
|
#define __Question 31 // ?
|
||
|
#define __at 32 // @
|
||
|
#define __A 33 // A
|
||
|
#define __B 34 // B
|
||
|
#define __C 35 // C
|
||
|
#define __D 36 // D
|
||
|
#define __E 37 // E
|
||
|
#define __F 38 // F
|
||
|
#define __G 39 // G
|
||
|
#define __H 40 // H
|
||
|
#define __I 41 // I
|
||
|
|
||
|
#define __J 42 // J
|
||
|
#define __K 43 // K
|
||
|
#define __L 44 // L
|
||
|
#define __M 45 // M
|
||
|
#define __N 46 // N
|
||
|
#define __O 47 // O
|
||
|
#define __P 48 // P
|
||
|
#define __Q 49 // Q
|
||
|
#define __R 50 // R
|
||
|
#define __S 51 // S
|
||
|
#define __T 52 // T
|
||
|
#define __U 53 // U
|
||
|
#define __V 54 // V
|
||
|
#define __W 55 // W
|
||
|
|
||
|
#define __X 56 // X
|
||
|
#define __Y 57 // Y
|
||
|
#define __Z 58 // Z
|
||
|
#define __sBrac_O 59 // [
|
||
|
#define __Backslash 60 // \..
|
||
|
#define __sBrac_C 61 // ]
|
||
|
#define __Caret 62 // ^
|
||
|
#define __Underscore 63 // _
|
||
|
#define __Punc 64 // `
|
||
|
#define __a 65 // a
|
||
|
#define __b 66 // b
|
||
|
#define __c 67 // c
|
||
|
#define __d 68 // d
|
||
|
#define __e 69 // e
|
||
|
|
||
|
#define __f 70 // f
|
||
|
#define __g 71 // g
|
||
|
#define __h 72 // h
|
||
|
#define __i 73 // i
|
||
|
#define __j 74 // j
|
||
|
#define __k 75 // k
|
||
|
#define __l 76 // l
|
||
|
#define __m 77 // m
|
||
|
#define __n 78 // n
|
||
|
#define __o 79 // o
|
||
|
#define __p 80 // p
|
||
|
#define __q 81 // q
|
||
|
#define __r 82 // r
|
||
|
#define __s 83 // s
|
||
|
|
||
|
#define __t 84 // t
|
||
|
#define __u 85 // u
|
||
|
#define __v 86 // v
|
||
|
#define __w 87 // w
|
||
|
#define __x 88 // x
|
||
|
#define __y 89 // y
|
||
|
#define __z 90 // z
|
||
|
#define __cBrac_O 91 // {
|
||
|
#define __vBar 92 // |
|
||
|
#define __cBrac_C 93 // }
|
||
|
#define __Tilde 94 // ~
|
||
|
#define __tridot 95 // (...)
|
||
|
#define __empty0 96 // (null)
|
||
|
#define __empty1 97 // (null)
|
||
|
//Character indexing ends
|
||
|
|
||
|
texture Texttex < source = "FontAtlas.png"; > {
|
||
|
Width = 512;
|
||
|
Height = 512;
|
||
|
};
|
||
|
|
||
|
sampler samplerText {
|
||
|
Texture = Texttex;
|
||
|
};
|
||
|
|
||
|
//accomodate for undef array size.
|
||
|
#define DrawText_String( pos, size, ratio, tex, array, arrSize, output ) \
|
||
|
{ float text = 0.0; \
|
||
|
float2 uv = (tex * float2(BUFFER_WIDTH, BUFFER_HEIGHT) - pos) / size; \
|
||
|
uv.y = saturate(uv.y); \
|
||
|
uv.x *= ratio * 2.0; \
|
||
|
float id = array[int(trunc(uv.x))]; \
|
||
|
if(uv.x <= arrSize && uv.x >= 0.0) \
|
||
|
text = tex2D(samplerText, (frac(uv) + float2( id % 14.0, trunc(id / 14.0))) \
|
||
|
/ float2( _DRAWTEXT_GRID_X, _DRAWTEXT_GRID_Y) ).x; \
|
||
|
output += text; }
|
||
|
|
||
|
float2 DrawText_Shift( float2 pos, int2 shift, float size, float ratio ) {
|
||
|
return pos + size * shift * float2(0.5, 1.0) / ratio;
|
||
|
}
|
||
|
|
||
|
void DrawText_Digit( float2 pos, float size, float ratio, float2 tex, int digit, float data, inout float res) {
|
||
|
int digits[13] = {
|
||
|
__0, __1, __2, __3, __4, __5, __6, __7, __8, __9, __Minus, __Space, __Dot
|
||
|
};
|
||
|
|
||
|
float2 uv = (tex * float2(BUFFER_WIDTH, BUFFER_HEIGHT) - pos) / size;
|
||
|
uv.y = saturate(uv.y);
|
||
|
uv.x *= ratio * 2.0;
|
||
|
|
||
|
float t = abs(data);
|
||
|
int radix = floor(t)? ceil(log2(t)/3.32192809):0;
|
||
|
|
||
|
//early exit:
|
||
|
if(uv.x > digit+1 || -uv.x > radix+1) return;
|
||
|
|
||
|
float index = t;
|
||
|
if(floor(uv.x) > 0)
|
||
|
for(int i = ceil(-uv.x); i<0; i++) index *= 10.;
|
||
|
else
|
||
|
for(int i = ceil(uv.x); i<0; i++) index /= 10.;
|
||
|
|
||
|
index = (uv.x >= -radix-!radix)? index%10 : (10+step(0, data)); //adding sign
|
||
|
index = (uv.x > 0 && uv.x < 1)? 12:index; //adding dot
|
||
|
index = digits[(uint)index];
|
||
|
|
||
|
res += tex2D(samplerText, (frac(uv) + float2( index % 14.0, trunc(index / 14.0))) /
|
||
|
float2( _DRAWTEXT_GRID_X, _DRAWTEXT_GRID_Y)).x;
|
||
|
}
|
||
|
|
||
|
#endif
|