
\hyphenation{ray-lib ray-libu knihov-ny ukáz-ka}

\def\malnazev{$\textrm{Raylib}+\textrm{R}=\textrm{Raylib}\times\textrm{R}=\textrm{RaylibR}$}%

\gdef\mujnazevCS{\malnazev: Ahoj, světe!}
\gdef\mujnazevEN{\malnazev: Hello, World!}
\gdef\mujnazevPR{\mujnazevCS}
\gdef\mujnazevDR{\mujnazevEN}

\gdef\mujauthor{Pavel Stříž}
\bonushyper

\nazev{\mujnazevCS}

\nazev{\mujnazevEN}

\author{\mujauthor}

\Email{pavel@striz.cz}

\Abstrakt{Článek stručně odkazuje na instalaci Raylibu (prostředí pro 2D a~3D grafiku napsaný primárně v~programovacím jazyce C), ale též na mnohem důležitější RaylibR. Jedná se o~most mezi Raylibem a~výpočetním prostředí R. Užívá k~tomu eRkový balíček \texttt{Rcpp}. Byl to do určité míry boj, který však stál za to.}
\smallskip
\KlicovaSlova{Raylib, R, RaylibR, Rcpp}

\Abstract{The article briefly refers to an installation of Raylib (an environment for 2D and 3D graphics written primarily in the C programming language), but most importantly to an installation of RaylibR. That's a~wrapper of the Raylib environment for the R environment written with the help of the \texttt{Rcpp} package.  It was a~bit of struggle, but it paid its dividends in the end.}
\smallskip
\KeyWords{Raylib, R, RaylibR, Rcpp}


\section{Jak jsem do toho spadl}

Musím se přiznat, že nejsem Céčkař (nedejbůh Cépépéčkař, zatím) ani eRkař, aspoň se tak necítím, učím se za pochodu. Během programování sudoku s~překryvy (angl. multi-sudoku puzzle; multi-grid sudoku; overlapping sudoku) jsem měl nápad udělat si 2D a~3D vizualizaci ze zadání do řešení. Ve stylu arkádovek 80. let, či aspoň nějak podobně. \TeX\ umí hodně věcí, ale tohle není jeho doména, resp. má doména v~\TeX u, tak jsem hledal alternativu.

Rudolf Blaško má hezké výstupy přes Asymptote, ale na ten jsem rezignoval, potřeboval jsem ještě větší flexibilitu (myšleno programátorskou svobodu). Na vlastní prostředí jsem to také neviděl.

Zkusil jsem tedy řadu existujících grafických prostředí pro C, moc se mi líbí (od X11, FLTK, ImGui, GTK+ přes Qt, Cairo, SFML až po SDL2), objevil jsem i~malé projekty typu Olive.c a~v~tom čase jsem narazil na Raylib od Ramona Santamarie. Užívá GLFW a~OpenGL. Zrovna na YouTube slavil 10 let existence projektu. Objev byl učiněn hlavně díky tomuto videu \url{https://www.youtube.com/watch?v=0To1aYglVHE}, kde uživatel Tsoding Daily zkoumá uložení projektu do videa.

Prošel jsem webové stránky a~zjistil, že by to mělo běžet na většině operačních systémů, platforem a~ve všech známějších programovacích jazycích. Ani jsem nepomyslel na Python, hned jsem skočil po nativní verzi v~C. Za pomoci seznamu příkazů, \url{https://www.raylib.com/cheatsheet/cheatsheet.html}, a~několika videí na YouTube, to začalo běžet.

Přikládám dvě ukázky. Není tam běhající či létající panáček či panenka, bylo potřeba se držet svých mantinelů. Sudoku generuje Lua, to jsou mé experimenty do Vánoce 2023, a~Python3, to jsou nové pokusy od povánočních svátků dál. 2D rozkres krychle, viz zadání na str.\,\pageref{3dzadani} a řešení na str.\,\pageref{3dreseni}.%
\smallskip

\noindent
\includegraphics[width=0.49\textwidth]{ukazka1.png}\hfill
\includegraphics[width=0.49\textwidth]{ukazka2.png}%




\section{Instalace knihovny Raylib}

Co byl pro mne problém byla instalace, jak pracuji záměrně na starém notebooku, protože co mi běží na něm, poběží i~na rychlejších strojích, toť základní idea. Hlavní zádrhel byl, že nemám OpenGL verzi 3.3, ale nižší (v2.1), tedy se to při instalaci knihovny a~ukázek musí nastavovat. Svou verzi zjistíte na Linuxu přes knihovnu \texttt{mesa-utils}:

\begin{verbatim}
$ glxinfo | grep "OpenGL version"
\end{verbatim}

V~principu jsem následoval návod, přes \texttt{sudo make install} mám knihovny pro Desktop verzi, lokálně pak pro Web verzi (tu používám minimálně). Tím nenápadně naznačuji, že Raylib umí generovat své výstupy pro webové prohlížeče~-- za pomocí WebAssembly.

Když mé náhledy videoukázek viděl Aleš Kozubík vznesl dotaz, jestli by nebylo možné Raylib aktivovat v~R, že by se jim tam něco takového hodilo. Na první dvě kola jsem R v~seznamu jazyků na Raylibu na mobilu přehlédl, užil jsem RaylibRS, jak je v~logu písmeno R, to bylo však pro Rust. Pak jsem si očistil brýle a~na normálním monitoru to našel! Ve vyhledávači jsem se přímo zeptal na RaylibR.



\section{Instalace RaylibR}

Instalovat Raylib sólově netřeba, jen si stačí pobrat závislé balíčky. 

\begin{verbatim}
sudo apt install build-essential git cmake libasound2-dev 
  libx11-dev libxrandr-dev libxi-dev libgl1-mesa-dev 
  libglu1-mesa-dev libxcursor-dev libxinerama-dev
\end{verbatim}



Zkusil jsem v~R:

\begin{verbatim}
> install.packages("Rcpp")
> install.packages("remotes")
> remotes::install_github("jeroenjanssens/raylibr")
\end{verbatim}

Ale instalace mi zkolabovala, neb nemůže najít \texttt{R\_ext/Error.h}. Začal mi trochu boj. Podezříval jsem \texttt{Rcpp}, ale nebylo to tím. Na GitHubu v~\textit{Open Issues} je tento problém jako jediný otevřený (k~datu 17.\,2.\,2024), ale tipy na řešení mi nezabraly, tak jsem zkoumal. Našel jsem dvě cesty.

První, byť druhá v~pořadí vzniku, je tato. Soubor mi v~počítači existuje, jen v~trochu jiné složce. Jestli je to dané tím, že jsem R instaloval z~linuxového repozitáře versus přímo verzi ze CRANu, nevím. V~\texttt{$\sim$/.bashrc} jsem si přidal:

\begin{verbatim}
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/share/R/include
\end{verbatim}

Je to vlastně snadné, když člověk ví, co hledat. Má první cesta byla o~něco bojovnější. Stáhl jsem si z~GitHubu RaylibR. Rozbalil jsem \texttt{raylibr-main.zip}. Nic s~termínem \texttt{Error.h} jsem nenašel. Po hlubším zkoumání jsem zjistil, že Raylib je přítomen ve složce \texttt{inst/} jako \texttt{raylib-4.0.0-modified. tar.gz}, rozbalil jsem jej, a~pak už to bylo \uv{snadné}. Ve složce \texttt{src/} je \texttt{Makefile}, do kterého jsem zasáhl. V~mém případě na řádku 207 odkomentováním:

\begin{verbatim}
GRAPHICS = GRAPHICS_API_OPENGL_21 
\end{verbatim}

Ale co je důležitější, přidal jsem na řádku 379 na konec parametr na mou cestu s~žádaným souborem, do tvaru:

{\small
\begin{verbatim}
INCLUDE_PATHS = -I. -Iexternal/glfw/include -Iexternal/glfw/deps/mingw 
  -I$(R_HOME)/include -I/usr/share/R/include 
\end{verbatim}
}

Zabalil jsem složku \texttt{raylib-4.0.0-modified} do \texttt{tar.gz}. A~chybí už jen jeden krok, jít o~dvě úrovně výš a~zabalit složku \texttt{raylibr-main} do souboru \texttt{raylibr-main.tar.gz}. Pozor, R (zatím) neumí pracovat se \texttt{zip} soubory.

V~R už to pak bylo přímočaré:

\begin{verbatim}
> install.packages("raylibr-main.tar.gz",repo=NULL)
\end{verbatim}

Radost to byla veliká, byť takto psané mi to přijde vše jasné, stručné a~logické. Své dva objevy jsem připsal autorovi na GitHub, je velká šance, že i~tato chyba bude uzavřena.



\section{Několik ukázek}

Seznam ukázek získáme v~R přes:
\begin{verbatim}
> library(raylibr)
> demo(package="raylibr")
\end{verbatim}

Zkusit si jednu z~nich, \textit{Hello,\,World!}, můžeme takto:
\begin{verbatim}
> demo("helloworld",package="raylibr") # nebo
> demo(raylibr::helloworld) # či dokonce jen demo(helloworld)
\end{verbatim}

Alternativa zobrazení dostupných ukázek v~R je:
\begin{verbatim}
> help.start()
  Vybrat: Packages --> raylibr --> Code demos.
\end{verbatim}

Ukončení R je příkazem \texttt{q()} nebo \texttt{quit()}. Volíme ano (y) či ne (n), chceme-li si uložit pracovní prostředí, nechceme-li práci zatím přerušit volíme pokračovat (c).

V~krátké přednášce na YouTube Jeroen Janssens, autor RaylibR, zmínil své dva vzorky~-- \texttt{raylibr::stroop} v~úvodu povídání a~\texttt{raylibr::beatbox} v~jejím závěru.

A~mj. ty ukázky jsou interaktivní, takže toho hada si můžete zahrát, v~tom bludišti skutečně můžete chodit ap. Více ukázek (přes sto) hledejte přímo na stránkách Raylibu, v~RaylibR jich je \uv{jen} jedenáct. Po instalaci jsem \texttt{*.R} našel v~$\sim$\verb|/R/x86_64-pc-linux-gnu-library/4.3/raylibr/demo/|. 

Pro úplnost článku uvádím i~zdrojový kód pro R.

{\small
\begin{verbatim}
library(raylibr)
init_window(600,400,"R & Raylib: Hello, World!")
while (!window_should_close()) {
  alpha<-abs(sin(get_time()))
  begin_drawing()
  clear_background("black")
  draw_circle(300,200,seq(150,10,by=-10),c("red","white"))
  draw_text(c("Hello,","World!"),225,c(120,220),64,fade("black",alpha))
  draw_fps(10,10)
  end_drawing()
  }
close_window()
\end{verbatim}
}

Soubor se jmenuje \texttt{helloworld.R} a~spustíme si jej z~příkazového řádku přes:

\begin{verbatim}
$ Rscript helloworld.R
\end{verbatim}

Okno s~Raylibem se zavře přes klávesu Escape.



\section{Závěrem}

Asi by byla pro mne zajímavá výzva zkusit své \uv{arkádové} pokusy (Raylib+C) překlopit do Raylib+R a~podat o~zkušenostech s~konverzí zprávu, ale nejdu do toho. Jsou další úkoly. Možná by šel udělat automat na konverzi, nechávám jako otevřený problém.

Musím se přiznat, že to byl pro mne boj, i~Raylib i~poté RaylibR, ale zvítězil jsem. Těším se, až nahodím silnější stroj s~OpenGL~v3.3 a~zkusím si instalace ještě jednou. O~tom možná pár slov na konferenci OSSConf, do termínu uzávěrky sborníku testy skoro určitě nestihnu. Hlavně se těším na ukázky v~Raylibu (speciálně složka \texttt{shaders/}), ne všechny mi plně jely. Možná to bude tím, že pro v2.0 a~v2.1 není podpora ve složce \texttt{examples/shaders/ resources/shaders/}, ale jen pro starší OpenGL v1.0, v1.2, a~pak až pro novější v3.3\ldots

Držím s~instalacemi palce, nenechte se odradit, pokud vám něco na prvních deset pokusů nejede!

Zde jsou mé oblíbené 
%grafické 
ukázky: \texttt{raylibr::balls} za 2D a~\texttt{raylibr::cubes} za 3D grafiku, už běžící přes RaylibR.%
\smallskip

\noindent
\includegraphics[height=25.5mm]{ukazka4.png}\hfill
\includegraphics[height=25.5mm]{ukazka5.png}\hfill
\includegraphics[height=25.5mm]{ukazka5-julia-sets.png}%


\section{Post Scriptum}

Mohu shrnout zkušenosti z novějšího notebooku s Xubuntu a OpenGL~v4.3. Instalace Raylibu byla vzorná dle návodu, předvolená je verze 3.2 OpenGL, nebylo tedy potřeba zasahovat. Po přidání zmíněného řádku do $\sim$\texttt{/.bashrc} mi šla i~instalace RaylibR přímo v~R. Poznámka: v~pozadí RaylibR bere Raylib verze~4.0, je však již verze~5.0. Je stále co zlepšovat!

Zde je drobný dávkový soubor, který vám spustí všechny zkompilované ukázky, jednu za druhou. Napočítal jsem jich 146+1\,šablona. Soubor mám uložený ve složce \texttt{raylib-master/}.

{\small
\begin{verbatim}
# Prázdný řetězec pro všechny, či vybranou složku z:
# audio core models others shaders shapes text textures
malkde=""
cd examples/$malkde
for soubor in `find . -type f -executable | sort`; do
echo "Spouštím $soubor..."
./$soubor # tichý režim: ./$soubor 1>/dev/null 2>/dev/null
done
\end{verbatim}
}

Ukázky jsou výtečné, minimálně animovaná \texttt{raylibr::julia} v~R či ukázka \texttt{shaders\_julia\_set} v~Raylibu je neokoukaná (obrázky výš, vpravo).%

Pro potěšení oka, z~těch dalších, které mi v~Raylib~v5.0 na staříčkovi nejely, zmíním ze složky \texttt{examples/shaders/}, prefix \texttt{shaders\_}, tyto ukázky: 
%\texttt{julia\_set,} 
\texttt{write\_depth,} \texttt{simple\_mask}, \texttt{shadowmap} na prvním řádku,
\texttt{raymarching,}
\texttt{basic\_pbr,}
\texttt{texture\_outline} na 2. řádku a~na 3. řádku z~\texttt{postprocessing}, speciálně cross\_hatching, predator\_view a sobel.
\ifx\relax
basic_lighting
custom_uniform
- deferred_render
- eratosthenes
- fog
-- spotlight
\fi
\medskip

\noindent
\includegraphics[width=0.325\textwidth]{ukazka6-write-depth-buffer.png}\hfill
\includegraphics[width=0.325\textwidth]{ukazka7-simple-shader-mask.png}\hfill
\includegraphics[width=0.325\textwidth]{ukazka8-shadowmap.png}%
\smallskip

\noindent
\includegraphics[width=0.325\textwidth]{ukazka-new1.png}\hfill
\includegraphics[width=0.325\textwidth]{ukazka-new2.png}\hfill
\includegraphics[width=0.325\textwidth]{ukazka-new3.png}%
\smallskip

\noindent
\includegraphics[width=0.325\textwidth]{ukazka-post1.png}\hfill
\includegraphics[width=0.325\textwidth]{ukazka-post2.png}\hfill
\includegraphics[width=0.325\textwidth]{ukazka-post3.png}%



\section{Symbolická poznámka}

Název článku má být \uv{pomsta} za ten boj s~instalacemi. Při $x+y=x\cdot y$, tedy $y=x/(x-1)$ či $x=y/(y-1)$, ani jeden z~programů nemůže být sám o~sobě jedničkou. Raylib je skvělý na hry, ale o~světě R neví nic. Naopak R má na vizualizaci tohoto typu ještě dost velké rezervy. Ale oba programy mohou být zároveň nula, to byl ten případ, kdy se nedařilo nainstalovat Raylib ani RaylibR, ze začátku to nešlo a~nešlo\ldots

Držím palce, ať je vždy $x+y>1$! Třeba dvě dvojky, nemusí to být hned jedničky s hvězdičkou.

\ifx\relax
x+y=x y
x=xy-y
x=y(x-1) / :(x-1)
y=x/(x-1), x \noteq 1
\fi

