CommonLib 9.0
CommonLib Library, version 9.0, December 2009
CommonLib to uniwersalna biblioteka dla C++ zawierająca różnorodne elementy. Powstała przy okazji pisania silnika graficznego i różnych innych moich projektów. Obecna wersja jest pisana od wakacji 2006.
Właściwie od dziecka, odkąd tylko zacząłem programować (wtedy to był jeszcze Turbo Pascal pod DOS) zawsze rozwijałem jakąś swoją bibliotekę modułów bazowych, z którymi potem nigdy się nie rozstawałem pisząc swoje projekty. Teraz uważam, że nadal jest to potrzebne - szczególnie w C++, którego biblioteka standardowa - w przeciwieństwie do nowoczesnych języków i środowisk programowania takich jak Delphi, C# czy Java - jest bardzo uboga, a to co zawiera pozostawia wiele do życzenia.
- Jest to uniwersalna biblioteka do C++, chociaż pisana głównie z myślą o programowaniu gier.
- Jest przenośna na Windows i Linux.
- Używa tylko biblioteki standardowej C, C++ oraz API systemowego. Opcjonalnie współpracuje także z DirectX (D3DX), zlib i innymi bibliotekami.
- Do przechowywania wszelkich łańcuchów stosuje typ string/wstring z biblioteki C++.
- W systemie Windows może zostać przełączona w tryb pracy w Unicode.
- Do obsługi błędów stosowane są wyjątki własnych klas z modułu Error. Jedynie funkcje wykonujące proste obliczenia lub konwersje nigdy nie rzucają wyjątków.
- Nastawiona jest na maksymalną wydajność, ale nie kosztem kontroli błędów. Bardzo ważna jest też wygoda.
- Wymaga dobrego kompilatora C++, ponieważ używa zaawansowanych cech języka takich jak częściowa specjalizacja szablonów. Kompilacja była testowana na Visual C++ 2005/2008 (Windows) oraz GCC 4 (Linux).
- Wszystkie elementy zgromadzone są w przestrzeni nazw common.
- Komentarze w kodzie oraz dokumentacja są w większości po polsku, aczkolwiek nowe fragmenty są już pisane po angielsku. Identyfikatory w kodzie są po angielsku. Komunikaty błędów i inne łańcuchy są po angielsku.
- Nagłówki są udokumentowane za pomocą Doxygen.
- Pliki z kodem mają polskie znaki w kodowaniu Windows-1250 z końcami wiersza w formacie Windows
"\r\n". Biblioteka posiada funkcje do konwersji polskich znaków i końców wiersza.
- Polega na rozmiarze, a nawet budowie bitowej typów atomowych takich jak znaki, liczby całkowite i zmiennoprzecinkowe. Przez to nie nadaje się do kompilacji na platformach z inną endianowością czy 64-bitowych.
Biblioteka ma postać plików z kodem C++ - CPP i HPP. Możesz z tym kodem zrobić co chcesz. Najprościej jest po prostu skopiować te pliki i dodać do swojego projektu.
Poniżej opisana jest jedna z możliwości - przygotowanie kodu jako biblioteki LIB i jej użycie w projekcie w Visual C++ 2005. Niestety nie jest to tak banalne jak rozpakować i od razu zacząć używać. To nie moja wina - takie są uroki języka C++...
Aby przygotować bibliotekę LIB:
- Utwórz projekt Visual C++ lub otwórz istniejący, który znajdziesz w pliku Common.sln.
- Wejdź do opcji projektu i zmień:
- Configuration Properties / General / Character Set: zależnie czy chcesz używać Unicode, ustaw na "Not Set" lub "Use Unicode Character Set" (w obydwu konfiguracjach - Debug i Release).
- Configuration Properties / C/C++ / Code Generation / Runtime Library: zależnie jak będziesz kompilował kod swoich programów korzystających z CommonLib: jeśli chcesz aby nie musiały używać dodatkowych plików DLL z biblioteką standardową C (których część użytkowników nie ma), przestaw na "Multithreaded Debug" (konfiguracja Debug) i "Multithreaded" (konfiguracja Release). Jeśli wolisz otrzymywać mniejsze pliki EXE, wybierze "Multithreaded Debug DLL" (konfiguracja Debug) i "Multithreaded DLL" (konfiguracja Release).
- Configuration Properties / C/C++ / Preprocessor / Preprocessor Definitions: W obydwu konfiguracjach (w każdej osobno) dopisz wybrane makra odpowiednio do bibliotek, których będziesz używał w swoim kodzie: USE_DIRECTX, USE_SDL, USE_OPENGL, USE_FMOD, USE_WINSOCK, USE_DEVIL, USE_AVI_FILE
- Jeśli nie masz zainstalowanej biblioteki zlib, nie chcesz jej używać albo w ogóle nie wiesz co to jest, usuń z projektu pliki ZlibUtils.cpp i ZlibUtils.hpp.
- Skompiluj bibliotekę w obydwu konfiguracjach - Debug i Release.
- Załóz na swoim dysku jakiś katalog, gdzie umieścisz skompilowaną bibliotekę jako gotową do używania w projektach. Utwórz w nim podkatalog include i skopiuj do niego pliki HPP. Utwórz katalog lib i skopiuj do niego pliki Common.lib (który powstał w podkatalogu Release) i Common_d.lib (który powstał w katalogu Debug).
- Skonfiguruj ścieżki do katalogów w Visual C++. W tym celu wybierze polecenie z menu Tools / Options. Po lewej zaznacz Projects and Solutions / VC++ Directories. Do "Include files" dopisz ścieżkę do podkatalogu includes. Do "Library files" dopisz ścieżkę do podkatalogu lib.
Aby skorzystać z tak skompilowanej biblioteki w swoim projekcie:
- Utwórz lub otwórz istniejący projekt programu w Visual C++.
- Dołącz wybane nagłówki biblioeki w postaci takiej jak np.
include <Common/Base.hpp>. Jeśli używasz jakichkolwiek nagłówków CommonLib, musisz najpierw włączyć nagłówek Base.hpp.
- Wejdź do opcji projektu i zmień:
- Configuration Properties / General / Character Set: Tak jak wyżej.
- Configuration Properties / C/C++ / Code Generation / Runtime Library: Tak jak wyżej.
- Configuration Properties / C/C++ / Preprocessor / Preprocessor Definitions: Tak jak wyżej.
- Configuration Properties / Linker / Input / Additional Dependencies: Dopisz potrzebne biblioteki LIB. Musisz dopisać w konfiguracji Debug plik CommonLib_d.lib, a w konfiguracji Release plik CommonLib.lib. Dodatkowo zależnie od innych użytych bibliotek, listę plików należy uzupełnić o:
- Jeśli używasz USE_DIRECTX: d3d9.lib d3dx9.lib dxerr9.lib
- Jeśli używasz modułu ZlibUtils: zlibd.lib (Debug), zlib.lib (Release)
Module with lots of different, general functionality.
Documentation: Module_Base
Module elements: Base Module
Header: Base.hpp
- Podstawy:
- Włącza m.in.: <cassert>, <string>, <vector>
- Typy podstawowe, m.in.: uint1, uint2, uint4, uint8 int1, int2, int4, int8
- Miscellaneous small, useful macros and functions.
- Lots of simple mathematical functions.
- Operator dosłownej reinterpretacji bitowej common::absolute_cast
- Inteligentne wskaźnki i uchwyty
- Parametryzowane polityką zwalniania
- Z wyłączną własnością lub ze zliczaniem referencji
- Funkcje do operacji na znakach i łańcuchach, w tym oprócz prostych także:
- Konwersja między stronami kodowymi: Windows-1250, ISO-8859-2, IBM CP852, UTF-8
- Konwersja między łańcuchami ANSI i Unicode (tylko Windows)
- Dopasowanie do maski ze znakami wieloznacznymi
'*' i '?'
- Odległość edycyjna łańcuchów - Levenshtein Distance
- Porównywanie łańcuchów w tzw. porządku naturalnym
- Funkcje do operacji na ścieżkach do plików
- Działające zarówno dla ścieżek Windows jak i Linux
- Konwersje różnych typów do i z łańcucha znaków, w tym:
- Dokładny pomiar czasu i czekanie określony czas
- Podstawowe typy, stałe, makra i funkcje matematyczne, w tym oprócz prostych także:
- Funkcja wygładzająca metodą Critically Damped Smoothing
- Funkcje okresowe - sinus, trójkąta, prostokątna, piłokształtna, PWM
- Generator liczb pseudolosowych
- Bardzo szybki, deterministyczny
- Losowanie liczb różnych typów
- Generowanie losowych danych binarnych
- Losowanie liczb o rozkładzie normalnym (Gaussa)
- Generator unikatowych identyfikatorów
- Parser parametrów przekazanych z wiersza poleceń
- Szybki i prosty w użyciu
- Wsparcie zarówno dla main (
int argc, char **argv), jak i WinMain (char *CmdLine)
- Obsługuje opcje krótkie (jednoznakowe) i długie (wieloznakowe), w formatach:
- Linuksa:
-a -b -c -abc --długa -lARG -l ARG -l=ARG
- Windowsa:
/a /b /c /długa /lARG /l ARG /l=ARG
- Klasa bazowa dla wzorca projektowego Singleton
- common::CommonGUID class that represents 128-bit, globally unique identifier compliant with RFC 4122.
- Functions for endianess conversion/swap.
Object-oriented wrapper for Unicode string of type BSTR.
Documentation: Module_BstrString
Module elements: BstrString Module
Header: BstrString.hpp
Support for date and time.
Documentation: Module_DateTime
Module elements: DateTime Module
Header: DateTime.hpp
- Available types:
- Precise retrieval of current time.
- Conversion between date/time and string with arbitrary formats.
- Conversions between different date and time formats, including these from standard C library.
Klasy wyjątków do obsługi błędów
Documentation: Module_Error
Module elements: Error Module
Header: Error.hpp
- Ujednolicony mechanizm obsługi błędów w programie z użyciem wyjątków C++
- Wyjątek przechowuje stos komunikatów
- Makra ułatwiające obsługę błędów
- Wsparcie dla błędów zgłaszanych przez: errno, Win32API, SDL, OpenGL, DirectX, FMOD, WinSock, DevIL, AVIFile
Code for dealing with files and file system.
Documentation: Module_Files
Module elements: Files Module
Header: Files.hpp
- common::FileStream - klasa strumienia do zapisywania i odczytywania treści pliku
- common::DirLister - klasa do listowania zawartości katalogu
- Funkcje do operacji na systemie plików, w tym:
- Zapisywanie i odczytywanie całych plików
- Sprawdzanie, czy plik albo katalog istnieje
- Odczytywanie i zapisywanie daty modyfikacji, utworzenia i ostatniego dostępu
- Tworzenie, usuwanie, zmiana nazwy i przenoszenie plików i katalogów
- Zapisywanie i odczytywanie plików i strumieni tekstowych w różnym kodowaniu, w tym Unicode (tylko Windows).
Very fast memory allocator.
Documentation: Module_FreeList
Module elements: FreeList Module
Header: FreeList.hpp
Szablony klas common::FreeList oraz common::DynamicFreeList. Obiekty tych klas to napisane we własnym zakresie alokatory przeznaczone do alokowania dużych ilości zmiennych jednego wybranego typu, które działają znacząco szybciej niż standardowe operatory new i delete.
A code for logging messages.
Documentation: Module_Logger
Module elements: Logger Module
Header: Logger.hpp
- Bezpieczny wątkowo.
- Opcjonalnie logowaine odbywa się w osobnym wątku.
- Uogólnienie logów: Log to abstrakcyjny obiekt, którym może być plik, konsola i dowolne inne miejsce. Można pisać własne logi.
- Rozdzielenie komunikatów od logów: Zapisywane komunikaty trafiają do centralnego loggera, a stamtąd dopiero każdy jest mapowany na zero, jeden lub więcej logów.
- Uogólniony podział komunikatów: Komuniaty są opisywane przez maskę bitową, która może oznaczać kategorię, priorytet lub cokolwiek i którą można wykorzystać do mapowania na logi docelowe, na prefiksy, kolory i dowolne inne rzeczy zależnie od loga.
Mathematical structures and functions, especially for 2D and 3D geometry.
Documentation: Module_Math
Module elements: Math Module
Header: Math.hpp
- Support for geometrical objects:
- Functions for collision detection between many different 2D and 3D shapes.
- Arrys of random numbers with the "Progressive Poisson Disc Distribution".
- Functions supporting calculations on Catmull-Rom and quadratic/cubic Bezier curves.
Macros for creating doubly-linked list of objects.
Documentation: Module_ObjList
Module elements: ObjList Module
Header: ObjList.hpp
Classes for measuring time and performance.
Documentation: Module_Profiler
Module elements: Profile module
Header: Profiler.hpp
Stream class hierarchy.
Documentation: Module_Stream
Module elements: Stream Module
Header: Stream.hpp
Portable library for multithreading and synchronization.
Documentation: Module_Threads
Module elements: Threads Module
Header: Threads.hpp
Parser and writer for a syntax based on tokens, simiar to C/C++.
Documentation: Module_Tokenizer
Module elements: Tokenizer Module
Header: Tokenizer.hpp
Persistent DOM model for a format based on Tokenizer.
Documentation: Module_TokDoc
Module elements: TokDoc Module
Header: TokDoc.hpp
A convenient wrapper for zlib compression library.
Documentation: Module_ZlibUtils
Module elements: ZlibUtils Module
Header: ZlibUtils.hpp
If you use DirectX 9.0c with D3DX, you can integrate CommonLib with it to make math data structures compatible. Without D3DX integration, Math module defines its own structures: VEC2, VEC3, VEC4, PLANE, MATRIX, QUATERNION. Their interface is very similar to structures from D3DX and their data layout is identical.
To integrate CommonLib with D3DX, define macro USE_DIRECTX for the whole project. When defined, it makes Math to define types mentioned above as typedefs to types D3DXVECTOR2, D3DXVECTOR3, D3DXVECTOR3, D3DXPLANE, D3DXMATRIX, D3DXQUATERNION from D3DX instead of defining its own structures. It makes all math functions compatible with DirectX interface. Thanks to that you can mix DirectX type names with CommonLib type names freely, as well as use CommonLib math functions next to D3DX functions. For example, these two code samples do exactly the same thing:
Od wersji 8.0 biblioteka posiada w systemie Windows możliwość pracy ze znakami i łańcuchami Unicode. Aby przełączyć CommonLib w tryb pracy z Unicode, należy podjąć te same kroki, co podczas przełączania do tego trybu WinAPI i DirectX. Trzeba w tym celu zdefiniować dla całego projektu makra preprocesora UNICODE i _UNICODE. W przypadki Visual C++ można przestawić w opcjach projektu, na zakładce Configuration Properties / General, opcję Character Set na Use Unicode Character Set - wówczas to makro zostanie dodane automatycznie.
Przy starannym stosowaniu się do poniższych zaleceń można pisać kod programu korzystający z WinAPI, DirectX i CommonLib tak, aby kompilował się i działał zarówno ze znakami Unicode, jak i zwykłymi ANSI, bez jakichkolwiek zmian w kodzie (wystarczy zmiana opisanego wyżej ustawienia).
Moduł definiuje typ znakowy common::tchar jako alias do char lub wchar_t oraz typ łańcuchowy common::tstring jako alias do std::string lub std::wstring, zależnie od ustawienia. Prawie wszystkie klasy i funkcje CommonLib korzystają z tych typów, tak że automatycznie przełączają się na używanie znaków i łańcuchów Unicode zależnie od tego ustawienia.
Łańcuch znaków ANSI zapisuje się w kodzie C++, jak wiadomo, w taki sposób: "ABC". Łańcuch znaków Unicode zapisuje się tak: L"ABC". Moduł Base definiuje makro, którym należy obejmować wszystkie łańcuchy w kodzie, jeśli chcemy, aby zostały zamienione na odpowiednią postać (ANSI lub Unicode) zależnie od ustawienia. Przykład: _T("ABC").
Jeśli piszemy kod, który ma działać zarówno ze znakami ANSI jak i Unicode, jako makro oznaczające nazwę bieżącego pliku źródłowego (podawane do konstruktora klas wyjątków modułu Error) używać należy zdefiniowanego w module Base makra __TFILE__. Podobnie, makro przechowujące sygnatuję bieżącej funkcji to __TFUNCSIG__.
Do konwersji między standardami kodowania znaków użyj funkcji common::ConvertUnicodeToChars i common::ConvertCharsToUnicode. Działają one tylko w Windows. Są niezależne od ustawienia _UNICODE. Pozwalają zamieniać łańćuchy między kodowaniem UTF-16 (Unicode), UTF-8 i ANSI (np. Windows-1250 w przypadku języka polskiego).
Jeśli piszesz kod, który ma się kompilować bez zmian zarówno w ANSI jak i Unicode, przydatne będą funkcje konwertujące łańćuchy między kodowaniem ASNI (typ string) lub Unicode (typ wstring), a tym używanym zależnie od ustawienia (typ common::tstring). Te funkcje to: common::TstringToString, common::StringToTstring, common::TstringToWstring, common::WstringToTstring. Jak można się domyślić, połowa z nich (która, to zależy od ustawienia) nic nie robi, tylko zwraca podany łańcuch.
Do zapisywania i odczytywania plików tekstowych w różnym kodowaniu służą funkcje modułu Files: common::SaveUnicodeToFile, common::SaveUnicodeToStream, common::LoadUnicodeFromFile, common::LoadUnicodeFromStream. W razie potrzeby automatycznie konwertują kodowanie znaków. Obsługują kodowanie ANSI, UTF-16 LE i UTF-8. Funkcje zapisujące mogą dołączać nagłówek BOM. Funkcje odczytujące, na podstawie nagłówka i analizy treści, mogą automatycznie rozpoznać kodowanie.
Skąd taka nazwa?
W moim głównym kodzie, z którego biblioteka się wywodzi, mam w Visual C++ w Solution szereg projektów. Jednym z nich jest silnik graficzny, innym pomocnicze narzędzie konsolowe czy program testujący. Kod wspólny dla wszystkich projektów zgromadziłem w katalogu, który nazwałem Common i tak już zostało.
Skąd taka wersja?
Faktycznie nie było CommonLib 4 czy 5, a wersja 6.1 była tak różna od 6.0, że powinna się nazywać 7.0. Jednak chciałem zrównać numerację biblioteki z numeracją mojego głównego projektu - silnika graficznego, na potrzeby którego napisałem tą bibliotekę.
Nowe wydanie - CommonLib 8.0 - nie oznacza że zacząłem pisać od nowa swój silnik graficzny. Oznacza raczej, że biblioteka przeszła wielkie zmiany po tym, jak silnik w wersji 7 został uznany za skończony.
I've used CommonLib with all my C++ home projects in recent year, so many new ideas about changes and new features came to my mind. This version is just the implementation of some of them (these simpler and smaller ones :) I have also much more experience in programming because of my work in game development industry and then digital television industry.
This is a big release. Some completely new modules appeared. WARNING 1: This version is not fully compatible with the previous one, as some of elements have been deleted or significantly changed. WARNING 2: This version is tested only with Microsoft Visual C++ 2008 compiler and does not ensure compatiblity with Linux!
- General:
- I've started to write new comments and documentation in English not in Polish.
- Deleted global objects: common::g_Timer, common::g_Unique, common::g_Config, common::g_Profiler. Make your own in your main header (like StdAfx.h) if you need one.
- Completely new modules: BstrString, ObjList, TokDoc.
- Deleted whole modules: Dator, Config. You are encouraged to read about new TokDoc module and use it instead of Config.
- Some errors have been corrected, including these dealing with common::BOX_ZERO, common::FileStream::SetSize, common::ExcludeTrailingPathDelimiter.
- Some other small changes, corrections and improvements have been made that are not listed here.
- Base Module
- Added macros for C-style string and memory operations to make them more portable between Linux and Windows, as under Windows there are more "secure" versions ending with _s and they also may use Unicode: common_memzero, common_sprintf, common_memcpy, common_memmove, common_strcat, common_strncat, common_strchr, common_strrchr, common_strcmp, common_strncmp, common_stricmp, common_strnicmp, common_strcoll, common_strcpy, common_strncpy, common_strlen, common_strspn, common_strcspn, common_strpbrk, common_strstr, common_strxfrm.
- Deleted memory functions: common::ZeroMem, common::CopyMem, common::CmpMem, common::FillMem. You should now use: common_memzero, common_memcpy and standard memcmp, memset.
- Added functions with operations on C-style strings: common::StrIsEmpty, common::ClearStr, common::strnistr, common::StrBegins, common::StrEnds, common::StrErase, common::StrInsert, common::Trim, common::StrReplace.
- Added class common::CommonGUID.
- Deleted class common::TimeMeasurer and global object common::g_Timer. You should use new common::GameTime class from DateTime module instead.
- Added function for conversion between ANSI and Unicode string using C-style strings: common::UnicodeToChars_CalcBufLen, common::CharsToUnicode_CalcBufLen, common::ConvertUnicodeToChars, common::ConvertCharsToUnicode.
- Added functions for converting endianess: common::SwapEndian16, common::SwapEndian32, common::SwapEndian64, common::SwapEndian16_Array, common::SwapEndian32_Array, common::SwapEndian64_Array, common::SwapEndian16_Data, common::SwapEndian32_Data, common::SwapEndian64_Data, common::SwapEndian (overloaded for basic types).
- Added function common::saturate equivalent to minmax<float>(0.f, x, 1.f), overloaded for types: float, double (Base module) and VEC2, VEC3, VEC4, COLORF (Math module).
- Added macros REF_COUNTED_FIELDS, REF_COUNTED_METHODS, REF_COUNTED_CTOR to help with making your class reference counted and exposing methods AddRef and Release.
- Added common::RoundInterpolator template class that interpolates between some key values of any type according to 0..1 parameter with end connected to begin.
- Added version of void common::Lerp(float *out, float x, float y, float t) to make it compatible with other overloaded versions while dealing with atomic float type.
- Added function common::WangMix that hashes a 32-bit uint value to another 32-bit uint value.
- Added support for DEC3 concept - storing and retrieving for values encoded in single 32-bit unsigned number as 3 x 10-bit and 1 x 2-bit number. Functions: common::MakeDEC3, common::GetXFromDEC3, common::GetYFromDEC3, common::GetZFromDEC3, common::GetWFromDEC3.
- Added function template common::UniversalCmp that converts ability to compare some values with operator< (which is common in C++ ideology) to comparing with result of type int that is less, greater or equal to zero (which I believe is better).
- Added functions common::CalcLinearFactors, common::CalcQuadraticFactors that can calculate coefficients of linear/quadratic equation passing through given points.
- Added other functions: common::MakePathInPlace, common::AlignUp, common::AlignDown, common::Sort2, common::Sort3, common::StrBeginsI, common::StrEndsI, common::EvalQuadraticBezierCurve, common::round_div.
- Deleted common::SubStrEqual and common::SubStrEqualI. Added common::SubStrCmp and common::SubStrCmpI instead.
- Renamed common::StrLessCi to common::StrLessI, common::StrGreaterCi to common::StrGreaterI.
- Renamed common::DupeString to common::DuplicateString.
- Deleted function common::StrEqualI. You can use common::StrCmpI(...) == 0.
- Change in common::frac function - it now uses floor function, which makes it compatible with frac intrinsic function in HLSL/GLSL.
- Deleted pragmas for compiler warnings disabling. Code is now using "safe" C standard library functions like sprintf_s when compiled using Visual C++, so warning C4996 is not generated.
- Added method common::scoped_ptr::is_null and common::shared_ptr::is_null.
- Optimization: common::smart_ptr smart pointer no longer allocates and keeps reference counter when contains NULL pointer. Interface and behavior stays untouched.
- Math Module
- Added common::AFFINE2D structure that represents a 2D affine transform with 2x3 matrix, as well as lots of helper functions.
- Breaking changes in structures common::RECTI, common::RECTF and common::BOX. Rectangles now just like box have members Min and Max instead of left, top, right, bottom. Also lots of new methods, some new constants and more.
- Added new group of elements to deal with curve calculations: common::EvalCatmullRomCurve, common::EvalCatmullRomCurveDiff, common::EvalCubicBezierCurve, common::EvalCubicBezierCurveDiff, common::SplitCubicBezierCurve, common::CubicBezierCurveIntegral, common::CalcCubicBezierCurveLength, common::GetCubicBezierCurveArcLengthParam, common::IntersectCubicBezierCurve2DWithX.
- Added functions to calculate Manhattan and max norms: common::ManhattanDistance, common::MaxDistance, common::ManhattanLength, common::MaxLength, common::PointToRectManhattanDistance, common::PointToBoxManhattanDistance, common::RectToRectManhattanDistance, common::BoxToBoxManhattanDistance, common::PointToRectMaxDistance, common::PointToBoxMaxDistance, common::RectToRectMaxDistance, common::BoxToBoxMaxDistance.
- Added function common::Refract which works just like reflect intrinsic function from HLSL/GLSL.
- Added some functions for calculating collisions with cone (not tested yet!): common::RayToCone, common::PointInCone, common::SegmentIntersectsOrIsContainedInCone.
- Added Lerp function versions overloaded for RECTF and BOX types.
- Added functions common::OriginCircleBoundingPoints, common::OriginSphereBoundingPoints that find the smallest circle/sphere with center at origin (0,0,0) encosing given set of 2D/3D points.
- Added function common::SafeNormalize, which returns false if tried to normalize zero vector.
- Added functions common::ColorfToVec4, common::Vec4ToColorf to convert between (x,y,z,w) vector and (R,G,B,A) color.
- Added functions common::Mul3x3, common::Mul4x3 for efficient multiplication of matrices that we know about containing only linear/affine transform, instead of performing default, full 4x4 multiplication.
- Added other functions: common::CalcBillboardOrientation, common::Abs for vectors, common::PointInCircle, common::CircleToRect, common::ClosestPointInTriangle, common::PointToRectDistanceSq, common::RectToRectDistanceSq, common::BoxToBoxDistanceSq, common::GetBoxPlane, common::GetRectLine, common::GetLineNormal (analogy to common::GetPlaneNormal).
- Changes in overloaded functions common::Mul, common::Div.
- Error Module
- Added macros ALL_EXCEPTIONS_TRY, ALL_EXCEPTIONS_CATCH to help with catching any types of exceptions, converting and rethrowing them as common::Error exceptions. They provide separate catch clauses for common::Error, std::exception and other (...) exception types.
- Threads Module
- Profiler Module
- DateTime Module
- Stream Module
- Files Module
- Modified common::FileStream class by adding Windows-only method GetNativeHandle that returns native system handle to opened file, of type HANDLE.
- Tokenizer Module
- Added class common::TokenWriter to easily write token documents. Moved Escape static method from Tokenizer class to TokenWriter class.
- ZlibUtils Module
- FreeList Module
- Free lists now do not ensure that all allocated blocks have been freed before their destruction. Thanks to that you can write more efficient code by not freeing separate elements at all, only whole free lists.
Przez ostatnie miesiące biblioteka była rozwijana częściowo samodzielnie, a częściowo przy okazji różnych programów. Największym zmianom uległ moduł matematyczny, do którego dodane zostało wiele nowych funkcji do kolizji, napisanych głównie dzięki lekturze książki "Real-Time Collision Detection", Christer Ericson. Wersja 8.1 nie jest w pełni kompletna (wiele nowych możliwości jest w planach), ale stanowi zebranie tego, co zostało dotychczas dodane. Poprawieniu lub przepisaniu na bardziej optymalną wersję uległo wiele procedur. Poniższa lista zawiera tylko spis zmian w zewnętrznym interfejsie biblioteki.
- Moduł Base
- Dodane makro __TFUNCTION__, które przechowuje samą nazwę bieżącej funkcji (nie pełną sygnaturę, jak __TFUNCSIG__).
- Dodane makro ASSERT_INT3 (kompilowane zawsze) oraz ASSERT_INT3_DEBUG (kompilowane tylko w konfiguracji Debug), które używa przerwania int 3. Bez debuggera to powoduje wysyp programu, z debuggerem przerywa program tak jak postawiony w kodzie Breakpoint. [Tylko Windows]
- Dodane makro STATIC_ASSERT - asercja sprawdzana w czasie kompilacji. Jeśli niespełniona, kompilator zgłasza błąd.
- Dodane makro _countof, które zwraca na etapie kompilacji liczbę elementów statycznej tablicy. W Windows jest dostępne standardowo, dzięki zdefiniowaniu można go teraz używać także w Linuksie.
- Dodane funkcje matematyczno-bitowe: common::sign, common::MergeBits, common::CountBitsSet, common::CalcParity, common::SwapBitSequences, common::log10u, common::sincos, common::EaseCurve, common::EaseCurve2, common::smoothstep, common::CalcMeanAndVariance, common::next_pow2 (zamiast common::greater_power_of_2).
- Ulepszony generator liczb pseudolosowych. common::RandomGenerator::RandUint ma teraz nową, lepszą implementację. Stara, działająca szybciej, nosi nazwę common::RandomGenerator::RandUint_Fast.
- Nowy, lepszy ale wolniejszy generator liczb pseudolosowych: common::MersenneTwister.
- Moduł Error
- Moduł Math
- Dodane funkcje: common::ScalarTripleProduct, common::TriangleIsCW, common::BOX::CalcHalfSize
- Zmiany nazw funkcji: common::OverlapRect na common::RectToRect, common::OverlapBox na common::BoxToBox, common::RecalculatePlaneD na common::RecalcPlaneD, common::CalculateBarycentric na common::CalcBarycentric, common::IntersectLines na common::SegmentToSegment.
- Dodane struktury common::OBB, common::RECT3D.
- Dodane funkcje common::ColorToR5G6B5, common::R5G6B5ToColor.
- Dodane funkcje: common::TransformNormalByTranspose, common::Untransform, common::UntransformNormal.
- Dodane funkcje: common::MatrixSetTranslation, common::MatrixGetTranslation.
- Dodana nowa wersja funkcji common::Transpose.
- Dodana struktura common::MATRIX33.
- Dodane stałe związane z układem współrzędnych znanym jako "Half-Life 2 Basis": common::HL2_TO_TANGENT_MATRIX, common::TANGENT_TO_HL2_MATRIX, common::HL2_BASIS_VECTORS.
- Dodane funkcje: common::ClosestPointInRect, common::Orient2D, common::Orient3D, common::PointInTriangle, common::IsQuadConvex, common::ClosestPointSegmentSegment, common::PointToLineDistanceSq, common::PointToSegmentDistanceSq, common::ClosestPointOnSegment, common::ClosestPointOnRay, common::ClosestPointInObb, common::ClosestPointInRect3d, common::ClosestPointInTriangle, common::ClosestPointInTetrahedron, common::PointToBoxDistanceSq (zamiast common::PointToBoxDistance), common::PointToObbDistanceSq, common::RayToQuad, common::RayToCylinder, common::PointInConvexPolyhedron, common::RayToConvexPolyhedron, common::SphereToObb, common::SphereToTriangle, common::ClassifyBoxToPlane, common::ClassifyObbToPlane, common::CapsuleToPlane, common::SphereToCapsule, common::CapsuleToCapsule, common::PointInConvexPolygon, common::RayToConvexPolygon, common::ClosestPoint, common::FurthestPoint, common::FurthestPointForDir, common::RectBoundingPoints, common::BoxBoundingPoints, common::CircleBoundingPoints, common::CalcCentroid, common::CalcCovarianceMatrix, common::CalcEigenvaluesAndEigenvectors, klasa common::RayToTriangleCalc.
Biblioteka przeszła wielkie zmiany. Logicznie większość kodu jest nadal kompatybilna wstecz, ale tekstowo zmiany są tak duże, że praktycznie nie ma sensu robić Diff. Ogólne, duże nowości:
- W systemie Windows biblioteka może być teraz przełączona w tryb wsparcia dla Unicode (patrz Obsługa Unicode).
- Komentarze w nagłówkach zostały zamienione na format Doxygen, co umożliwiło automatyczne wygenerowanie niniejszej dokumentacji.
- Moduł Math: Kiedy zdefiniowane jest makro USE_DIRECTX, typy matematyczne są aliasami do typów z D3DX, więc nie jest juź potrzebna żadna konwersja. (VEC2 to D3DXVECTOR2, VEC3 to D3DXVECTOR3, VEC4 to D3DXVECTOR4, MATRIX to D3DXMATRIX, QUATERNION to D3DXQUATERNION, PLANE to D3DXPLANE.) W przeciwnym wypadku moduł definiuje własne struktury o takiej samej budowie bitowej i zbliżonej funkcjonalności.
- Wszystkie (prawie) łańcuchy w kodzie, w tym głównie komunikaty błędów, są teraz w języku angielskim.
Inne zmiany:
- Moduł Base
- Moduł Math
- Moduł Stream
- Moduł ZlibUtils
- Poprawiony błąd - strumienie dekompresji niepotrzebne rzucały asercją mimo że wszystko było OK.
- Inne drobne poprawki...
Biblioteka była przez ostatnie miesiące uzupełniana i poprawiana na bieżąco wraz z rozwojem silnika graficznego 3D, na potrzeby którego powstała.
- Moduł Base
- Moduł Error
- Dodane makra dla wygody: ERR_GUARD_BOOL, ERR_GUARD_DIRECTX, ERR_GUARD_BOOL_D, ERR_GUARD_DIRECTX_D
- Poprawiony błąd w funkcji common::MustStrToSth.
- Moduł Math
- Dodana funkcja common::PerpedicularVectors - oblicza dwa dowolne wektory prostopadłe do danego.
- Dodana funkcja common::ColorDistance - zwraca "odległość" dwóch kolorów.
- Dodana funkcja common::CapsuleVolume licząca objętość kapsuły.
- Dodane funkcje common::SphereInBox i common::BoxInSphere.
- Dodane funkcje do kolizji trójkąta z prostpadłościanem: common::TriangleInBox, common::TriangleToBox.
- Dodane funkcje do kolizji z płaskim wielokątem w 3D: common::PointInPolygon, common::RayToPolygon.
- Dodane funkcje do kolizji poruszających się obiektów: common::SweptSphereToSphere, common::SweptBoxToBox.
- Dodane funkcje do losowania punktów z wnętrza brył:common:: RandomPointInUnitSphere, common::RandomPointInUnitCircle, common::RandomPointInCapsule.
- Ulepszona funkcja common::RayToTriangle - teraz można wybrać czy ma być Backface Culling.
- Poprawione błędy w funkcjach: common::LinesIntersection, common::RotationYawPitchRoll, common::RotationYawPitchRollInv, common::Normalize (do kwaterninów), common::Log (do kwaternionów), common::ClosestPointOnLineSegment, common::RayToSphere.
- Moduł Stream
- Moduł Tokenizer
- Dodane metody do klasy common::Tokenizer czyniące parsowanie jeszcze wygodniejszym: common::Tokenizer::QueryToken, common::Tokenizer::QueryEOF, common::Tokenizer::QueryEOL, common::Tokenizer::QuerySymbol, common::Tokenizer::QueryIdentifier, common::Tokenizer::QueryKeyword, common::Tokenizer::AssertToken, common::Tokenizer::AssertIdentifier.
- Poprawiony błąd tokenizacji liczb.
- Poprawione metody GetUint*, GetInt*, MustGetUint*, MustGetInt*, GetFloat, GetDouble - w przypadku błędu zamiast wykonywać assert rzucają wyjątek błędu tokenizacji.
Od wersji 6.0 biblioteka zmieniła się właściwie nie do poznania. Dlatego nie ma sensu wypisywać zmian. Szczególnie, że pewnie nikt z niej wcześniej nie korzystał :P
Biblioteka dostępna jest na licencji GNU LGPL, co znaczy m.in., że masz dostęp do jej kodu źródłowego oraz że możesz używać jej za darmo w dowolnych swoich programach, także zamkniętych.
Adam Sawicki
E-mail: sawickiap@poczta.onet.pl
Homepage: http://regedit.gamedev.pl