Public Member Functions |
virtual | ~Map () |
| Destruktor.
|
Zone * | getZone (int zoneID) |
void | calcLightMaps () |
| Berechnet alle Lightmaps Es wird fuer jede Tile eine statische Lightmap erzeugt. Das geschieht genau einmal waehrend der Startup-Phase der Engine, noch bevor das erste Frame gerendert wird. In einer Lightmap wird nicht nur die Lichtintensität eingebacken, sondern es werden auch Abschattungen von anderen Tiles mit hineingerechnet (Schatten ist nix anderes als die Abwesentheit von Licht). Es handelt sich also streng genommen um eine Light- und Shadowmap.
|
void | toggleAmbientLight () |
| Schaltet das Ambient Light ein oder aus.
|
void | toggleDirectionalLight () |
| Schaltet das Directional Light ein oder aus.
|
void | toggleLightMap () |
| Schaltet das Directional Light ein oder aus.
|
bool | isAmbientON () |
| Info ob AmbientLight ON oder OFF.
|
bool | isDirectionalON () |
| Info ob DirectionalLight ON oder OFF.
|
bool | isLightMapON () |
| Info ob LightMaps ON oder OFF.
|
void | calcGamma (float gamma) |
| Berechnet die Gamma-Rampe.
|
void | stepGamma (bool up) |
| Korrigiert den Gammawert.
|
void | loadLights (DataInputStream &dataIn) |
| Liest alle Lichteigenschaften und Pointlights aus dem Inputstream.
|
void | saveLights (DataOutputStream dataOut) |
| Serialisiert das Light-Objekt in den Outputstream.
|
void | dump () |
| Dump der Map.
|
Static Public Member Functions |
static Map * | getInstance () |
| Liefert die Singleton-Instanz.
|
Public Attributes |
std::vector< Zone * > | zoneList |
float | m_gamma |
int | m_gammaR [256] |
int | m_gammaG [256] |
int | m_gammaB [256] |
Protected Member Functions |
| Map () |
Private Member Functions |
void | addTile (Tile *tile) |
void | calcLightMap (Tile &tile) |
| Erzeugt aus der Lightmap-Grid eine vollauflˆsende Lightmap.
|
void | Tangentspace (Matrix &matWT, Matrix &matTR, float width, float height, Vertex &v0, Vertex &v1, Vertex &v3) |
| Tangentspace.
|
void | setLight (int zoneID, float ambient, float directionalMax, float pointMax) |
| Setzt die allgemeinen Lichteigenschaften einer Zone Es gilt: (ambientMax + directionalMax + pointMax) <= 1.0.
|
void | setDirectionalLight (int zoneID, float dirX, float dirY, float dirZ) |
| Setzt den DirectionalLight-Richtungsvektor fuer eine Zone.
|
void | addPointLight (int zoneID, float x, float y, float z, bool castShadows, float range, float intensity, float constant, float linear, float quadratic) |
| Fuegt ein PointLight hinzu.
|
float | calcDirectional (Tile &tile, Zone &le) |
| Berechnet die Lichtintensitaet fuer eine Tile. Weil das Directional Light unabhaengig von der Cameraposition ist, muss die Lichtintensitaet pro Tile nur einmal berechnet werden. Das passiert sinnvoller weise nachden die Richtung der Lichtquelle gesetzt wurde, und bevor die Map zum ersten mal transformiert, bzw. gerendert wird.
|
BYTE | biInterpolate (int A, int B, int C, int D, float w, float h) |
| Bilineare interpolation.
|
void | trimLine (Vec &start, Vec &end, float epsilon) |
| Verkuerzt eine Linie um epsilon.
|
void | TangentspaceTest (Matrix &matWT, Matrix &matTR, Tile &tile) |
| Dump der Map.
|
bool | isEqual (float a, float b) |
| Dump der Map.
|
Private Attributes |
char | m_mapfile [255] |
bool | m_AmbientON |
bool | m_DirectionalON |
bool | m_LightMapON |
Static Private Attributes |
static Map * | _instance = 0 |
void Map::calcLightMaps |
( |
| ) |
|
Berechnet alle Lightmaps Es wird fuer jede Tile eine statische Lightmap erzeugt. Das geschieht genau einmal waehrend der Startup-Phase der Engine, noch bevor das erste Frame gerendert wird. In einer Lightmap wird nicht nur die Lichtintensität eingebacken, sondern es werden auch Abschattungen von anderen Tiles mit hineingerechnet (Schatten ist nix anderes als die Abwesentheit von Licht). Es handelt sich also streng genommen um eine Light- und Shadowmap.
Bei einer naiven Herangehensweise wird von jeder Punktlichtquelle aus ein Strahl ausgesendet der eine Tile abtastet. Die Helligkeit ist dann umgekehrt (quadratisch) proportional zur Distanz. Befindet sich ein Hindernis zwischen Punktlicht und Tile, ist die auftreffende Lichtinensitaet gleich 0 (also Abschattung). Dort wirken nur noch Anteile vom Ambient- bzw. Directional Light. Dieser Vorgehensweise ist korrekt, aber zu langsam!! Dashalb wird folgender Algorithmus implementiert:
Ausgehend von einer Lichquelle wird ueber alle Tiles einer Zone iteriert. Mit den Vertices der Lichtquelle und einer Tile wird ein Frustum erzeugt. Alle (anderen) Tiles, die sich im Frustum befinden, koennen potentiell einen Schatten werfen und werden deshalb in eine Collisionlist eingetragen.
Im zweiten Schritt wird auf die zu beleuchtede Tile ein UV-Grid mit 32 mal 32 Stuetzstellen gespannt. Durch Berechnung von Binormal- Tangent- und Normalenvektor kann zu jeder UV-Koordinate die Raumkoordinate ermittelt werden. Zusammen mit der Postion der Punktlichquelle wird daruas ein Stahl konstuiert, dessen Läenge das Mass fuer die Lidhtintensitaet an der UV-GRID-Koordinate ist.
Vorher aber wird geprueft, ob der Stahl eine Tile aus der Collisionlist schneidet. Ist das der Fall, ist die Ausleuchtung gleich 0.
Im dritten und letzten Schritt, wird aus der UV-Grid die vollaufloesende Lightmap generiert. Hoehe und Breite der zugewiesenen Textur bestimmen dabei die Ausdehnung der Lightmap. Die Projektion der (kleinen) Gridmap auf die (grosse) Lightmap erfolgt durch bilineare Interpolation.