Tuesday, January 27, 2009

Postępy

No więc projekt oddany no i zaliczony :] a więc do przodu. Niestety albo stety podczas prac nad nim zmuszony byłem naruszyć kod zajmujący się grafiką 2D która teraz nie działa w 100% poprawnie. Dlatego postanowiłem, że dla równowagi na chwilę obecną będę główną wagę przyładał właśnie to tej części silnika. W końcu jakby nie patrzeć to w niej ma on swój początek i to ona na chwilę obecna jest podstawową jego częścią (najbardziej rozbudowaną). 

No ale koniec ględzenia a czas co nieco o pisaniu, ostatnio podczas gdy przeglądałem funkcje bulleta natrafiłem na ciekawy fragmencik kodu ( btBoxShape::getVertex(...) ) służący do pobierania wierzchołków sześcianu. Nic by nie było wtym dziwnego gdyby nie to, że zastosowano tam fajną sztuczkę z bitami. Wzorując się trochę na niej napisałem pobieranie wierzchołków BBox'ów w moim silniku. ogólnie zasada jest prosta mamy 8 wierzchołków ponumerowanych {0,1,..,7 } wykorzystuję fakt że zapis bitowy tych liczb to kolejno {0000,1000,0100,1100,0010,1010,0110,1110} a więc mamy tutaj wszystkie permutacje pierwszych 3 miejsc dla {0,1}. 

Korzystajac z tego przyjmuje, że bierwszy bit (bX) odpowiada za X , drógi bit (bY) za Y a trzeci (bZ) za Z apisujemy funkcje:

if (bX == 0 ) minX else maxX;
if (bY == 0 ) minY else maxY;
if (bZ == 0 ) minZ else maxZ;

Prosto krótko i jednocześnie wygodnie. U mnie kod wykorzystujący ten trik wygląda tak:

inline CVector3f &getPoint(IN unsigned int a_uiIndex)
{
return CVector3f((a_uiIndex&1 > 0)?max.getX():min.getX(),
(a_uiIndex&2 > 0)?max.getY():min.getY(),
(a_uiIndex&4 > 0)?max.getZ():min.getZ());
}

No comments:

Post a Comment