From 7b9961455c4fb19ca2e73d612369cb6848b09a98 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Tue, 5 Sep 2023 00:01:18 +0200 Subject: [PATCH] feat: added text rendering class --- Thesis/Thesis.tex | 47 +++++++++++++++++++++++++++++++-- Thesis/images/glyph_offset.png | Bin 0 -> 7459 bytes 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Thesis/images/glyph_offset.png diff --git a/Thesis/Thesis.tex b/Thesis/Thesis.tex index 8fe2666..a284b5c 100644 --- a/Thesis/Thesis.tex +++ b/Thesis/Thesis.tex @@ -1791,13 +1791,13 @@ void TextRenderer::Load(const std::string &font, unsigned int fontSize) \label{fig:loadingFont} \end{figure} -\paragraph{Loading characters} +\subsubsection{Loading characters} In order to preload ASCII characters we use a method loadCharacter from TextRenderer, it uses FreeType library to load character, then generates textures for a character (it needs to allign a texture to character), sets options for texture and adds the character object to characters array \begin{figure}[htp] \centering \begin{tikzpicture}[node distance=1.5cm] -\useasboundingbox (-5,0) rectangle (5, -13cm); % Set a custom bounding box +\useasboundingbox (-5,0) rectangle (5, -10cm); % Set a custom bounding box \node (start) [startstop] {Load character}; \node (pro1) [process, below of=start] {Load character using FreeType}; \draw [arrow] (start) -- (pro1); @@ -1822,6 +1822,49 @@ In order to preload ASCII characters we use a method loadCharacter from TextRend \label{fig:loadingCharacter} \end{figure} +\newpage +\paragraph{Texture options} + +\begin{itemize} + \item The first two lines set the wrapping mode of the texture in the S and T directions (usually the x and y axes) to \texttt{GL\_CLAMP\_TO\_EDGE}. This means if the texture coordinates go beyond [0,1], the texture will not repeat but instead clamp to the edge values. + \item The next two lines set the minification and magnification filter to \texttt{GL\_LINEAR}. This means when the texture is scaled down or up, it will use linear interpolation between the texture coordinates, resulting in a smoother texture appearance. +\end{itemize} + +\begin{lstlisting}[style=C++Style] +void TextRenderer::setTextureOptions() const { + // set texture options + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +} +\end{lstlisting} + +\newpage +\subsubsection{Rendering text} +We are given text as a C++ string and a position, method is supposed to automatically render text so that it fits in a position that was provided \\ +We achieve that by iterating through each character of a string and putting it next to each other at a gap equal to a previous character width and height + +\begin{figure}[htp] +\centering +\includegraphics[scale=1.00]{images/glyph_offset.png} +\caption{Glyph metrics from learnopengl} +\label{} +\end{figure} + +Calculating x and y positions of each character \\ +$x_{pos}$ and $y_{pos}$ is the final x/y position of character \\ +$x_{start}$ and $y_{start}$ is the position inputed to the method render text \\ +$x_{bearing}$ and $y_{bearing}$ is a parameter shown in image above \\ +$s$ is scale \\ +We calculate final bearing of $y_{pos}$ by subtracting bearing of "H" character from the bearing of actual character, we do it this way because "y" bearing of "H" character is highest \\ +\[ +x_{pos} = x_{start} + x_{bearing} * s +\] +\[ +y_{pos} = y_{start} + (H_{bearing} - y_{bearing}) * s +\] + \subsection{Dependency Management} There are several libraries: OpenGL, GLFW, stb\_image and freetype being integrated into engine, they are simply included at the top of any files that need them. diff --git a/Thesis/images/glyph_offset.png b/Thesis/images/glyph_offset.png new file mode 100644 index 0000000000000000000000000000000000000000..f66d27a13d380f273aae7bfa11883a25ba7f40e6 GIT binary patch literal 7459 zcmYkAWmHvPu)q&pf^^5FyDk@yu1j}GOI^A_K)NNRrAxZIE+rtsm6YxhkWfHrq#pmb z-iP<$oIPvytbNv=J!kgJFIG!K5f_^h8vp=YWhJN%03by^%MX~y&u@XKOp)gS%U#LH z3jlD4{(F#soIG*>z}9q-lhe|&cYEvRW$)$=QkIhgxqG_VIyl<^z`K=vT{}J9LsE(B zjSE@Tn9y`pHysj8kdAD8C~*o42R#Q5!_P{VO;Gt!kR3_sj7P3UP%#r39 z^vk9Ihe2L$osR=RQ3}cPZqFayP2$y0P6{Qq?*I8l{!=o1d3kSlcS&VP*2Hqu zAn4I<(7fN^!TB~={QmlKtM3O>7}zXK5%p$kaQs58jCv{+E7EH1XOiN52hP(y%`C%^ zvK8ErgLp@q&?6C=lW-0$V~CYaW&g@N^91{`$#sV!xhV)VI!Yo1q;OZ7S)*L3vf>-Q z?f-EN0B7B919NPcD53Td+f%+zr&14!Ma)2`t#Yad0K9=R@#u}VNR40u0JJEKqfv(H zVt|~hADwytZEXPO-a;r+mT72E7GD+{7E0}D!Co6K%l3Yvk%q&9cTSoH(ywj*KFuAE zXHdTrPs07>KTFJl0k)nnEL0f;CXprmN(_=!oFQW(CRujW4gG);Dq%bm=vxf2HiK%4 zpc21MoE}JDiRMhg6ImqMRG}+H3;}?{@89<*@~4M2YfH?%Xp@6i3R6ZZ6ytn{z2(nI zA}z}O?%7Hyks$PG|9g%7%atTaxe>np19A+3A!k0G;V-gHueh+%tjC%dYG2e0Q#QV? zMd^;cw4Q46MI{WA@5d5C^_2x#(#j|qsu^l5DOG}~nIHr!Si)E+k=lc-3~80Btt?#x zw?pJsVE$-BB`(GV!XzSI{D2s_Az>!MSUE5&JQ-QJsZ?)!_R?dI=(*%jEO+ND1;!Opjm_9(s4{lTU)>Zn4ohrb8eL$}ES%jlQn z=&V+5s?I?W78?w~ODQ4p-M)dfE`F~~YXTQvL(>LU3 z=LjT88O8pn@{#2u6$h_gRdspwMm3K9x&D}5Qq>#Xpn3&;0o|P{thtOD{px(JU%FJf zc2#1P(baa9ZhBIs!A1|U=tf`EzG%voY8N$`@AM3VaI7g>-f_`8;nuwO4ig+=X_{CL z^x^2vdZ6i!m#D7#BqArEB4E&>bDnN1g|U<6ag+B}18bkHBJ(^rZiD!g{RcZ$IYbT4 zZ)56IospSgSff;zT4<73{Pf6h1HZ*(JpBcEq`BkS$DkxyMk0* zLiDnpr`oBE>Qgt=_p@uoNmfDMo6rI^w~7tF-u-{nLA(!o4=(>IE)`!GqPM(YLSKC` zNiP0X(8EofhIeH3ueO}o7iqaN%a4|s+mR{oY4MVIg%1iZ6C8$3cbIluhFykBSkPJM zSya`J)K7AB)Zyjq#hWf^4Eedt{b<7Lhb=?&N6>yC-jhcc5yDyD@+rPC}bx<_!EupX0 zx4X0lS=w2V*>!xa|8kPnn-;YU8F&Dvm1In6M;wtYrk zYu*%ty2ZwhGT-WJ%TqGRD@o779mySW;SKPHk@>iAe+QytO!JFdfqB%XTnOV6?8*OW z8mI_mMzTYR4U-8oLB6~352XK`C?&dTbJe_jER#?Kmm!f!3a<;_8>pkVNBmB%qrcwI znoOB=z>CrfK3MpUVfoWC{!8!+)~M(xgZEO2?lFdx)BKr&zSC=RUYpQ=&xo`9S_&oYY{tuj;0J1Dz zgqgeFr^&&Ks0z|59zrhB3~99(jaTV^WbipENfVgQhV2JIMlr-i0tmgG!1 zXf@81IMn@9f2Z^a`Z0YKDC63LN3vEW_o(5jt>=mskmmS+T)+~dz5EfWDajtP)%5CV z?RH0YKW%-+YHgyLAHTZBckt4F#Q5gal3a^s#Eso9TYjKt%(lpZ(QId9VEcI@c2p#z zrhs$ec)VqFHCZ_CwD9SeaFB32wY}`UssT5R;m_V$N0DZ655HCH9TGIo_pi}w#XIBL zIb7y7YmN;v>w|k){MDVp-VBU}540gU{ld}5-ir$QwYGR{rfJA)wAp6)?|nX%BuQ*s zJ@G18CP~N=+uFN5s%W>-&)I9~tyMKcaM+aXjP2pi4ekOHyo~D1pP6{BxXUZ8xSOwA zk1wy}S9voh*jBqE+U4LSpT#?SY%0D@PKZhAmFivS{nHaVnOSeMT)c6eKA{Texq|$j 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 literal 0 HcmV?d00001