TODO: prioritize aggresively

Goal: we want to minimize code which we have to maintain ourseleves. If we could easily
replace certain functinoalities with standard library or some external libraries which
do (almost) what we want.

When adding new functionalities consider first if they are worth it. If you add 40KB of code
to simplify 20 lines into 10, maybe it's not worth it...

- Option to mark Ptrs that they are non-null? New type like RVImageView?
- Consider replacing mechanism for updating descriptors so that it won't require
  update_after_bind (does it affect performance?)
- FilePath() should be empty; FilePath::empty() always returns false;
  This class could be modernized or maybe even replaced with std::filesystem;
  Make a wrapper over std::filesystem with Expected?
- Replace freetype with stb_truetype
- Handle vulkan device lost (repro: resize window to side by side and wait)
- Wrong DPI on ubuntu 24.04
- Why VBufferSpan has sizes as u32? Is this a mistake or by design?
- remove min_size from Span<>
- disable/remove backtraces?
- drobny błąd przy wyświetlaniu perfanalyzera: jak sie zmniejszy okno, to ostatnia linia moze byc czasami
  maksymalnie widoczna tylko do polowy
- wykomentowane PASSERTy w vulkan_storage
- roznice w countLeadingZeros (i podobnych) między linuxem a windowsem?
- optimize perf vulkan queries (now we have 3 queries in one point...)
- remove min_size from span
- add warning/error when initializing variable with self (WTF is it not an error by default?!?)
- maybe it would be better to hash in u64 and only at the end convert to desired type?
- fix countLeadingZeros, etc. add findFirstBit/findLastBit
- nextPow2 -> ceil2
- Use DIP (device independent pixel) in Gui system
- ASSERT -> FWK_ASSERT?
- ordering of values in .xml file in AnyConfig
- strange bug with PASSERT in perf/analyzer.cpp:327 firing
- problem when drawing IRects in Renderer2D: bottom left corner is invisible
- limit stored frames in perf manager
- Jest jakiś dziwny problem w trans rendererze: jak próbuję przechować dane buforów z jednej klatki do drugiej,
  to chyba są zamazywane; Cholera go wie czemu
- Przydałaby się klasa dyskretnego interwału ? (offset + size), (min + max trochę nie ma w tej sytuacji sensu)
- może subSpan byłby lepszy z offset+size a nie min+max ? ale tak samo trzebaby zrobić w intervalu
  i też w boxie ?
- some functions for nicer text formatting of tables / arrays / etc.
- imgui shouldn't be active when we're over a different window?
- Image::resize shouldn't be in place ?
- consistent naming: Flags -> Opts ? A może Opt -> Flag ? Opt to skrót...
- przenies rect pack do libfwk?
- interfejs do tworzenia GlTexture jest troche gowniany
- mozliwosc odbindowania texture image-a
- posprzataj balagan w gl format (oddzielenie input type od internal type,
  dodac wiecej typow, poprawic nazwy, wydzielic typy skompresowane)
- better way to change/pass texture parameters, expose more of them
- nextPow2: lepsza nazwa ?
- zliczanie ile pamieci GPU zajmujemy
- zła identyfikacja shadera (zawsze mam DEFINITIONS)
- lepsze opcje do dumpowania shaderów
- drobny bug w perf analyzerze: wyswietlanie duzych wartosci (7000sec zamiast 7sec)
- NoInit support for vector instead of PodVector ?
- Rename ShaderCombiner to ProgramCombiner ?
- Add asserts support to shaders
- input: pressed powinno też być włączone jak jest down? Jeśli polegamy na tym, to w wielu przypadkach
  zależy nam też na wyłapaniu pierwszej klatki w jakiej jest pressed

- Dziwny bug przy ładowaniu Modeli na MingW (frontier w debug, libfwk w devel):
  src/assets.cpp:134: While loading file: data/models/animals/buffalo.model
  Last XML node: 'node' at: line:3 col:3
  src/gfx/model.cpp:55: Assert failed: root->name == "" && root->trans == AffineTrans() && root->mesh_id == -1
  (u64)root:174797840 root->name.size():0 root->mesh_id:3403468

- span można skonstruować z referencji do 1 obiektu?

- PollVector mógłby być po prostu otagowanym wektorem, który nie ma konwersji na zwykły wektor?
  albo przy konwersji  tworzy nowy wektor odpowiednio zaalokowany?
  Jaki był sens robienia pooli wewn. normalnego wektora?

- przy odpalaniu convertera jest backtrace przy blender-2.79
- lepsze interfejsy do strumieni? Na razie chyba to nie potrzebne
- rename load/save stream to input/output ?
- PodVector mozna wywalić i dodać obsługę no_init do vectora?
- odróżnić indexOf ze Sprase spana (intruzywny?) od normalnego indexOf który przegląda wartości
- asPod -> asFlat ?

- MinGW backtraces could use libdwarf

- Z jakiegoś powodu checker nie wyłapuje EXCEPTów z delegowanego konstruktora, chyba że
  implementacja jest wewn. klasy; Przykład: CellEdge(CXmlNode)
- Wyjaśnić, czy trzeba dawać EXPECT_CATCH przed EXPECT czy nie
- Kod z Expected jest dość syfiasty; może dałoby się coś tutaj poprawić?

- make could generate file last_build_mode.txt
- children to zle okreslenie na potomstwo!!!!
- post increment mozna zrobic templatem na bazie preincrementa
- wrzucić niektóre funkcje z algorithm wewnątrz klas (np. wektorów?)
- intRange, indexRange -> inds ? wrappedPairs -> pairIndexRange ?

- dodać funkcję reinterpretExact (lub jakos inaczej) dla typów o tej samej wielkości
- na początku odpalania programu, odpalić jakieś gdb na wątku ?

- release-paranoid -> paranoid ? debug -> full-debug, release-paranoid -> debug i dodać
  trochę flag typu no-omit, etc ?

- emplace_back -> append ?
- Besides asserts add different kinds of warnings which can be placesd all around code
  and enabled or disabled (with levels, like 0: disabled, 9:all enabled)?
- Przydałby się akcesor pairs(range) który zwraca pary elementów (a nie pary indeksów)
- libfwk configuration in header file?

- FpsCamera -> FppCamera
- Rename Camera to GenericCamera?
- Jak ma działać CamControl ? W różnych programach chcę w różny sposób kontrolować kamerę
  może lepiej zrobić tak, żeby kamera miała abstrakcyjny typ bazowy ?
- używanie OrbitingCamera w model viewerze

- W trybie debug, spany mogłyby wykrywać, czy wskazywana przez nich pamięć nie została
  zwolniona? Lub, czy kontener na jaki wskazują nie został zreallocowany?
  Np. Poprzez wskaźnik na licznik update-ów;
  Coś w rodzaju modCountera? Span może być zinvalidowany; Problem: span może być zakopany
  głęboko...

- edgeIds(), etc. czy te funkcje działają jak dodajemy / usuwamy elementy ?
  Może tez powinny zwracać vector<> ?
 
- menu -> ui ?
- przenies menu_imgui, menu_imgui_in do menu/ ?

- ON_FAIL przy EXPECT_CATCH?
- używanie kamer w model viewerze; może lepiej nie: lepiej obracać obiekt a nie kamerę
- przywrócenie visualizerow w geomie 
- przenesienie investigatorow ?
- EnumTypeInfo
- TypeInfo: drop volatile
- TypeInfoData can be optimized (it takes 40 bytes)
- isnt reserve & emplace_back with if stupid?
- funkcja indices() w wektorach ?
- parser: support dla escape-characterów, parsowanie większej ilości typów z math?
- czy wykrywanie jakiegoś tekstu na koncu parsera podczas fromString ma sens?
- Str: nullptr -> "" ?

- Zabezpieczenie, żeby użytkownik przez przypadek nie marnował puli przeznaczonej na dane tymczasowe?
  niebezpieczeństwo jest jak poolvector jest przesuwany; Dodać poolMove() ?
  Jak się pojawią problemy z wydajnością to łatwo będzie to poprawić? Po prostu wyszukać odpowiedni tag

- DualMap: vector<Pair<V1, V2>> + vector<V1 hashes + indices> + vector<V2 hashes + indices>

- Jeszcze mocniejsze połączenie Expected<> i wyjątków? zmiana nazwy na Ex<>, wywalenie Expected?

- Obsługa NANów:
  A) narzędzia do jak najwcześniejszego wykrywania Nanów (tak, żeby można było odpowiednio poprawić kod/dane)
  B) odpowiednio napisane funkcje liczące przecięcia (jeszcze jakieś?) tak, żeby w przypadku NANa po prostu przecięcia nie było
  C) wyraźne oddzielenie kodu na intach od kodu na floatach (bo zachowuje się w różny sposób)?

- checker mógłby też zbierać różnego rodzaju informacje o kodzie, i zapisywac je do pliku w jakiejś
  prostej formie, z tym można by pewnie zrobić wiele fajnych rzeczy
  - tool: program który wypisuje wielkości różnych struktur (pogrupowanych po name-spacach); Z dodatkową opcją filtrowania
  - tool: podgląd wszystkich instancjacji i wszystkich wartości constexpr
  - czy dałoby się użyć tego narzędzia do lepszego generowania perf pointów?
- consistency with try, find, get, etc. function prefixes
- Expected<> checker zle rozpoznaje (ale Ex<> juz tak)
- bloki try, tylko w których mogą występować wyjątki ?
- konwersja pointera na Dynamic nie musi byc explicit ?

- Jak się wywoła funkcję przekazaną parametrem i ta funkcja jest except, to ta która ją wywołuje
  też powinna być! A teraz chyba nie jest?

- builtin_rotateleft, etc.

- operacja shiftowania bitów (zamknięta)
- dot<PT>, cross<PT> powodują problemy na GCC (cholera go wie czemu) (regresja w GCC 8.2, w *.3 powinno działać...)
- span z wymaganiem na minimalną wielkośc zastąpić static_spanem ?

- uporządkować inRange
- StaticSpan + Array (z checkami na indeksach) ?
- ccwSide, cwSide -> leftSide, rightSide ? A może niech zwraca left|right|on_line ?
- vector concept and algorithms for it (downsize, upsize, shrinkToFit, etc.)
  SmallVectorBase, PodVectorBase, VectorBase:
  PodVector: public VectorInterface<PodVectorBase> ?

- Formatting math objects first to expression, then to string (expression handles special chars, parentheses, additions, etc.)
- konstruktory dla vec2, vec3, vec4? 
- vec2, vec3: unie i możliwość używania złożonych typów jako parametrów (boost int128) wymagają
  customowego destruktora, przez co vec2<> nie jest typem literalnym i nie można go używać w wyrażeniach constexpr
- boost::debug::attach_debugger();
- zdefiniować, I, F, D, S, LL, ULL, US; Chyba lepiej I8, U8...
- transform który jest w stanie rozbić krotkę na argumenty
- add #define TVAR(...) template <__VA_ARGS__> static constexpr ?
- when formatting values for assert, use structured mode ?
- tied support in format (with priorities?)
- Maybe w przypadku obiektów które mają niepoprawne wartości mogłoby też mieć szybsze porównania
  tylko, że none nie byłoby zawsze < niż dowolna wartość...
- transformSmall, transformArray, transformStatic
  transform czasami jest w stanie się zmapować na powyższe ?
- resize-able GlBuffer (similar to Vector)
- formatowanie any powoduje konwersję na const char * :D
- nazwy dla tied-memberów (podobnie jak w enumach) dla automatycznej serializacji xml?
- transform(array<>>) nie dziala za dobrze dla typow ktore nie mają domyślnego konstruktora

- funkcja extract member  albo transform to member ?
- jakieś narzędzie/klasa do przekazywania zmiennych przez makro definicje do shaderów
- przydałoby się jakies narzędzie do wglądu do danych (mini debugger, żeby nie trzeba było co chwila robić
  printów w różnych miejscach); Razem z perfem mógłbym rejestrowac typy i referencje do nich i z poziomu
  perf analizera mogłbym się wpinać w dane konkretnych wektorów, etc.?
  Podobnie można by podglądać w danym momencie teksturki, bufory, etc.
  Ale kluczowy tutaj byłby sposób wypisywania tych danych

- 2D span bazujący na liniowym spanie
- resize -> recreate w PodVectorze ?
- check do FWK_CHECK_OPENGL jest jakis zjebany...
- Triangle: containment test ?
- problemy z kompilacją jak się nie używa clang+-6.0 (undefined symbol s_internal w GlStorage)
- Maybe<T, invalid_value>

- przydałby się lepszy listnode...
- mozliwosc dodatkowych checków w BaseVectorze na początku i koncu bufora (wykrywanie pisania po pamieci)
- new type: not-null GlRef ?

- vector should be able to perform assignment of object which cannot
  be assigned by destruction & reconstruction

TODO: which OpenGL version are we targeting ?
- Opengl 3.3
- Opengl ES 2.0 ?
- Opengl 4.5 ?
- check emscripten

- vec2<>, vec3<>, should support unsigned types ?
  maybe add uvec2<> ?
  może to się jakoś inaczej powinno nazywać ?
- max/min wartości openglowe łatwo pobieralne
- nazwy rozszerzen (enumow) dokladnie tak jak w oglu (i nie trzeba mapy nazw)
- więcej funkcji do enclose ?
- lepsze interfajsy do wejścia
- transform może konwertować do tego samego typu kontenera (array, vector, smallvector)?

- translacja nazw debugowych ? jakaś możliwość rejestracji template-ów?
- nie da się rozszerzać parsera o typy których nie da się domyślnie konstruować...
- konieczność konwersji flag na boola jest słaba... może explicit nie jest potrzbeny?
- funkcje haszujące nie powinny być w jednym pliku, ale w poszczególnych klasach;
  Można zrobić podobnie jak z formaterami, że się overloaduje jakąś funkcję i już

- DrawCalls should have command_id index ?
- Remove Renderer2D (use RenderList); better control over which shader is being used ?

- ElementBuffer::bbox is causing problems if data is broken in some way; What should we do about it?
- problem: asserty cały czas dają za mało informacji (trzeba często dodawać printfy)
  może po prostu znajdź jakiś sensowny debugger? pod visualem jak kod jest zoptymalizowany
  to też nie działa...
- wyciagnij implementacje << z formatu do math_base / box
- add .clang-format ?
- Box: setSize -> resize
- Odpalanie plugina do RTTI w trakcie kompilacji; Ale to co ten plugin wygenerował
  też trzeba będzie skompilować i w jakiś sposób podlinkować;
  Powiedzmy, że miałbym ...

- nie przesadzaj z enkapsulacją? Czy zdażyło ci się chociaż raz spowodować buga
  przez dostęp do zmiennej z implementacji? TODO: zastanow sie

- Better error merging?
- Problem: w ASSERTACH chcemy zawrzeć jak najwęcej informacji a z drugiej strony,
  chcemy, żeby kod był jak najprostszy, czyli np. używamy funkcji valid(id), która
  wszystko chowa..
- maybe xml
- filter w miejscu; niemutowalne może być bardzokosztowne (np. kopiuje cały VoxelMap)

- DEFINE_ENUM_MEMBER doesnt work with EnumFlags<>
- DEFINE_ENUM in private namespace under gcc (no linkage)
- use DEFINE_ENUM for input key ? two functions would have to be provided: one for normal keys and one for specials
- implicit conversion to bool for enum flags ?

- insertBack with move ?

- Problem with FwdMember: what happens when we're compiling with WPO ?
- FwdMember const refs to Base type ?
- sprawdz wersje gcc / clang na poczatku
- A lot of functions can run in two modes:
  - assuming that everything will succeeed (fails on CHECK / ASSERT if it doesnt)
  - allows for failure, returns Expected<>
  - Expected<>.checked(): better name ?
  Consistent solution for that would be useful...
- We could define Size<> for different classes and use it for example in CSpan<T>
  without defining it; Think if this would be useful?
- type_info do assertów ?
- make RandomSeed not unsigned
- execCommand doesn't retturn error status sometimes?
- Objects could keep information whether they own the data or not
  ref-counting is not required (user is till responsible for not releasing string is some CString
  is still pointing to it)
- Stream guard podobnie jak XMLGuard ?
- SpanBase<> for all types with different min_sizes
- XML should assert that string is owned or static...
- use type trai primitives __is_trivially_assignable ...
- Range instead of loops with XMLNode::next()
- Zastanów sie gdzie jeszcze warto by było dodać specyfikacje memberów (&, &&, const &)
- lastModificationTime is not related to getTime
- Vector::reinterpret moves ?!?!?; change it to ink ?
- assert shouldnt print itself in backtrace
- std format in ASSERT, FAILED & CHECK ?
- fix parsing ? strtol is used for ints, strtoll for unsigned ints..
- example Makefile for test/window which uses Makefile.include ?
- try using -fsignaling-nans ?
- anyOf (and others) should be able to accept function pointer ?
- Rename test files to t_vector, t_stuff ? or lower priority to test in docplugin ?
- Wstrict-overflow
- proper FIFO support for streams
- fix interval::valid

- function arguments could have invariants in them:
  T Segment::at(Checked<double, [](double v) { return v >= 0.0 && v <= 1.0; })> {}

- Still more advanced asserts would be useful?
- check if gdb is already attached and behave properly in such cases

- Math:
	- length_sq in ISegment ?
	- Box<T, N> as other classes ?
	- segment, box::empty -> degenerate ?
	- isnan checks in all math classes (paranoid in vectors as well ?)
	- ujednolicić: Ray3F, IBox
	-  make Triangle it modifiable? some other classes don't keep any invariants either?
	   but on the other hand, we could add some checks for nans and infinities...
	   add type: FiniteFloat (float which is not a nan and is not an infinity)
	- Box & EnableInDimension doesn't support 4th dimension
	- box ranges...
	- intersection -> intersect ?
	- inset & enlarge na zewnątrz ?
	- minimize use of asRay(), check all places
	- fix isNormalized, areClose ?
	- Think about accuracy of different math functions. Some of tem could be easily improved
	- encloseTransformed wrong order
	- naming: rotateVector(pos)
	- isDegenerate w trójkątach, segmentach, etc.
	- mulPoint, mulNormal: better names

- Kolorki:
	- konwersja kolor na bool (!= ColorId::transparent)
	- wolna konwersja kolorów z ColorId
	- cleanup colors (where ICOLOR, where FColor should be used); Conversion ColorId -> IColor
	  FCOLOr sux (operations only on alpha part or only on color part)

	Mouse grabbing doesnt work
	- Mouse Position should be -1/-1 or none when mouse is outside of window ?

- fwk_assert powinno być ogólno dostępne, tak żeby wszędzie z tego korzystać
- DASSERTY często nie wystarczają; chcielibyśmy mieć dokładniesze informacje (jakie dane konkretnie są zepsute?)
- możliwość dodania suffixa do ścieżki FilePath (+em?)
- można robić struktury drzewiaste bazujące na wektorach! (tak jak robiłeś listę bazując na dwóch wektorach, tak samo
  możesz zrobić z drzewem)

- Promienie bazujące na intach mogą być zaprezentowane za pomocą segmentów; dzięki temu nie
  potrzebne są Rationale

- attach GDB on Ctrl-C
- move SerializeAsPod to namespace detail
- make default serialize_as_pod be based on is_trivially_copyable / etc.
  or maybe not (pointers...)
- change order in FWK_ORDER_BY for vectors ?
- move box to fwk_box ?

- profiler sux; fix it?
- same algorithms on top of dynamic or static structure: ImmutableGraph, MutableGraph share with shared interface ?
- remove math.h, etc from includes for ; On the other hand: they will end up in PCH anyway
- operator== for CRanges ?

- ref(vector) returns vector<> with reference flag acts as a reference to a vector
  keeping ref(vector) in local context can be more efficient than keeping reference
  that would require keeping ref_count in vector ?

- TaggedId<Type>: id for accessing vector<Type> ? generalize it somehow ?
- Tagged Value, Tagged Pair
- Tagged Type

- Improve assertions (they should give more information when breaking)...
  But how to do it properly?

- check if double constants are correct
- printing for Variant ?

- SERIALIZE_AS_POD cathces fwk namespace
- model_viewer.exe displays models in different order (findFiles function must be working differently)

- better std::pair ?
- better tests for vector? Use tests from libc++ or something?
- Make custom string class (not a template)
- separate vector allocator specialized with element size
  this allocator could also store some data before first element
- dodać irange do vector-a
- vector[-1] indeksuje od konca?
- shrink_to_fit dla vectora?

- support for multiple armatures in exporter; support for animation without armatures
- make AnimaedMesh similar to AnimatedModel
- add class VertexArraySpec and use it to verify drawcalls
- saving/loading Mesh colors to XML
- Separate model matrix from view matrix in MatrixStack?
- MemorySaver should increase it's size if necessary
- add StrongBaseType<> class
- think about usefulness of const correctness; in some cases were just wasting time
- separate align function for fonts
- Hide HAlign, VAlign inside fontstyle?
- removeIndicies should use materialset
- make makeUnique not use resize (use erase)
- setscissorrect should check if rect is empty or not

- more todos in the code
- Saver, Loader -> SaveStream, LoadStream or similar
- normalize -> normalized

- clamp doesn't work properly when max < min

- Fix satTest (when edges from two objects are the same, you will get 0 normals)

- VSYNC under windows
- use A-buffer for rendering transparent objects (will be useful for SSAO as well)

- Optimize kerning loop in font_factory.cpp
- Fix TODO in filesystem_linux (regarding links).
- In fact, just fix all TODOs
- Think about moving globla functions to classes / namespaces (especially functions in fwk_profile.h)
- scanf's are slow compared to strto*, maybe we should change printfs as well in text printer?

- tools/model_viewer crashes when wrong path is passed (for example folder instead of path to .model file)

- When LLDB is attached, make it catch all throws automatically
- Serialization of floats to XML isn't accurate; fix it
