UP: Rendering job. NEW: MatrixStack, MIRROR_ASSERT

Ukończono renderowanie podstawowego trójkąta! :)
Przykładowy program pozwala na poruszanie kamerą i oglądanie wspaniałego
trójkąta (obracanie nie tutaj zbyt dobrze, ale to już szczegół w
porównaniu do całości). W celach implementacyjnych dodano klase
Mirror::MatrixStack obsługującą składanie przekształceń w macierzach 4x4
(Mirror::Matrix4d). Do użytkowania oddano również powiązaną z
Mirror::MatrixStack strukturę Mirror::MatrixStack::User oraz makro do
niej USE_MATRIX. Działanie obu rzeczy jest analogiczne do ich krewnych z
Mirror::GlContex; różnica polega na tym, że w przypadku stosu macierzy
nie blokujemy mutexem dostępu do nich (zakładam, że nikt nie będzie
używać macierzy poza funkcją renderującą, gdzie i tak inne wątki będ�
poblokowane przez Mirror::GlContex), a Mirror::Engine przechowuje
jedynie obecnie używany stos macierzy, do którego wskaźnik jest
kopiowany w momencie "podpięcia" użytkownika (tj. jeżeli dojdzie później
do zmiany stosu ustawionego w Mirror::Engine, nie będzie to miało wpływu
na stos pobrany przez USE_MATRIX. Generalnie Mirror::MatrixStack::User w
żadnen sposób nie wpływa na obecny stos macierzy w Mirror::Engine, a
jedynie pobiera aktualny w swoim konstruktorze.

Dodano i zaimplementowano własną asercje - domyślny assert z std jest
pusty w realeasie, a my nie chcemy do tego dopuścić; w wielu miejscach w
assertach umieszczone są funkcje, które powinny być wykonane zawsze.
Dodatkowo, własny assert jest bardziej szpanerski. ;d

Poprawiono konfiguracje budowania projektu dla Release'a, opcja
optymalizacji całego programu (Whole program optimalization), ustawiona
dla DLL'a powodowała unresolved symbole spowodowane obecnością tablicy
(jako szablon nie generuje symboli) tablic bytów (również nie generuje
symboli) [Array<BytesArray>] w Mirror::Shader::Handler. Tablice będące
zawrtością tablicy miały destruktor i inne zreferencowane
(zreferensowane?) funkcje zadeklarowane z przełącznikiem
__declspec(dllexport), których później brakowało prawdopodbnie z racji
tego, że Mirror::Array NIE eksportuje symboli. Niezależne budowanie
projektu mirror (optymalizacja, o której mowa, miesza nieco z
odwołaniami do funkcji; ostateczny rezultat zależy od innych projektów
itd., przez co nie jest niezależny) rozwiązało problem.

Kilka małych poprawek i zmian.