00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_LIGHT_H__
00020 #define __CS_LIGHT_H__
00021
00022 #include "csgeom/transfrm.h"
00023 #include "csutil/csobject.h"
00024 #include "csutil/cscolor.h"
00025 #include "csutil/flags.h"
00026 #include "csutil/csvector.h"
00027 #include "csutil/nobjvec.h"
00028 #include "csengine/lview.h"
00029 #include "iengine/light.h"
00030 #include "iengine/statlght.h"
00031 #include "iengine/dynlight.h"
00032
00033 class csLightMap;
00034 class csDynLight;
00035 class csLightPatchPool;
00036 class csHalo;
00037 class csPolygon3D;
00038 class csCurve;
00039 class csSector;
00040 struct iMeshWrapper;
00041
00047 #define CS_LIGHT_THINGSHADOWS 0x00000001
00048
00054 #define CS_LIGHT_ACTIVEHALO 0x80000000
00055
00082 class csLight : public csObject
00083 {
00084 private:
00086 unsigned long light_id;
00088 static unsigned long last_light_id;
00089
00090 protected:
00092 csSector* sector;
00094 csVector3 center;
00096 float dist;
00098 float sqdist;
00100 float inv_dist;
00102 csColor color;
00104 csHalo *halo;
00105
00107 int attenuation;
00108
00109 public:
00111 csFlags flags;
00112
00113 public:
00115 static int ambient_red;
00117 static int ambient_green;
00119 static int ambient_blue;
00120
00121 public:
00127 csLight (float x, float y, float z, float dist,
00128 float red, float green, float blue);
00129
00136 virtual ~csLight ();
00137
00139 unsigned long GetLightID () { return light_id; }
00140
00144 virtual void SetSector (csSector* sector) { csLight::sector = sector; }
00145
00149 csSector* GetSector () const { return sector; }
00150
00154 void SetCenter (const csVector3& v) { center = v; }
00155
00159 const csVector3& GetCenter () { return center; }
00160
00164 float GetRadius () const { return dist; }
00165
00169 float GetSquaredRadius () const { return sqdist; }
00170
00174 float GetInverseRadius () const { return inv_dist; }
00175
00179 void SetRadius (float radius)
00180 { dist = radius; sqdist = dist*dist; inv_dist = 1 / dist; }
00181
00185 csColor& GetColor () { return color; }
00186
00194 virtual void SetColor (const csColor& col) { color = col; }
00195
00199 csHalo *GetHalo () { return halo; }
00200
00204 void SetHalo (csHalo *Halo);
00205
00209 int GetAttenuation () {return attenuation;}
00210
00214 void SetAttenuation (int a) {attenuation = a;}
00215
00219 float GetBrightnessAtDistance (float d);
00220
00221
00222 SCF_DECLARE_IBASE_EXT (csObject);
00223
00224 struct Light : public iLight
00225 {
00226 SCF_DECLARE_EMBEDDED_IBASE (csLight);
00227 virtual csLight* GetPrivateObject ();
00228 virtual unsigned long GetLightID ();
00229 virtual iObject *QueryObject();
00230 virtual const csVector3& GetCenter ();
00231 virtual void SetCenter (const csVector3& pos);
00232 virtual iSector *GetSector ();
00233 virtual void SetSector (iSector* sector);
00234 virtual float GetRadius ();
00235 virtual float GetSquaredRadius ();
00236 virtual float GetInverseRadius ();
00237 virtual void SetRadius (float r);
00238 virtual const csColor& GetColor ();
00239 virtual void SetColor (const csColor& col);
00240 virtual int GetAttenuation ();
00241 virtual void SetAttenuation (int a);
00242 virtual float GetBrightnessAtDistance (float d);
00243 virtual iCrossHalo* CreateCrossHalo (float intensity, float cross);
00244 virtual iNovaHalo* CreateNovaHalo (int seed, int num_spokes,
00245 float roundness);
00246 virtual iFlareHalo* CreateFlareHalo ();
00247 } scfiLight;
00248 };
00249
00257 class csStatLight : public csLight
00258 {
00259 private:
00266 bool dynamic;
00267
00269 csVector lightmaps;
00270
00271 public:
00279 csStatLight (float x, float y, float z, float dist,
00280 float red, float green, float blue,
00281 bool dynamic);
00288 virtual ~csStatLight ();
00289
00293 bool IsDynamic () { return dynamic; }
00294
00305 virtual void SetColor (const csColor& col);
00306
00312 void RegisterLightMap (csLightMap* lmap);
00313
00321 void CalculateLighting ();
00322
00329 void CalculateLighting (iMeshWrapper* mesh);
00330
00331
00332 SCF_DECLARE_IBASE_EXT (csLight);
00333
00334 struct eiStaticLight : public iStatLight
00335 {
00336 SCF_DECLARE_EMBEDDED_IBASE (csStatLight);
00337
00339 virtual csStatLight *GetPrivateObject ()
00340 { return scfParent; }
00341 virtual iObject *QueryObject ()
00342 { return scfParent; }
00343 virtual iLight *QueryLight ()
00344 { return &scfParent->scfiLight; }
00345 } scfiStatLight;
00346 friend struct eiStaticLight;
00347 };
00348
00357 class csLightPatch
00358 {
00359 friend class csLightPatchPool;
00360
00361 private:
00362 csLightPatch* next_poly;
00363 csLightPatch* prev_poly;
00364 csLightPatch* next_light;
00365 csLightPatch* prev_light;
00366
00368 csVector3* vertices;
00370 int num_vertices;
00372 int max_vertices;
00373
00375 csPolygon3D* polygon;
00377 csCurve* curve;
00378
00380 csDynLight* light;
00381
00383 csShadowBlock shadows;
00384
00386 csFrustum *light_frustum;
00387
00388 public:
00392 csLightPatch ();
00393
00398 ~csLightPatch ();
00399
00404 void Initialize (int n);
00405
00409 void RemovePatch ();
00410
00414 csPolygon3D* GetPolygon () { return polygon; }
00415
00419 csCurve* GetCurve () { return curve; }
00420
00424 csDynLight* GetLight () { return light; }
00425
00427 csShadowBlock& GetShadowBlock () { return shadows; }
00428
00430 int GetVertexCount () { return num_vertices; }
00432 csVector3* GetVertices () { return vertices; }
00433
00435 csVector3& GetVertex (int i)
00436 {
00437 CS_ASSERT (vertices != NULL);
00438 CS_ASSERT (i >= 0 && i < num_vertices);
00439 return vertices[i];
00440 }
00441
00446 csLightPatch* GetNextPoly () { return next_poly; }
00447
00452 csLightPatch* GetNextLight () { return next_light; }
00453
00455 void SetPolyCurve (csPolygon3D* pol) { polygon = pol; curve = NULL; }
00457 void SetPolyCurve (csCurve* c) { curve = c; polygon = NULL; }
00459 void SetLight (csDynLight* l) { light = l; }
00461 void AddPolyList (csLightPatch*& first)
00462 {
00463 next_poly = first;
00464 prev_poly = NULL;
00465 if (first)
00466 first->prev_poly = this;
00467 first = this;
00468 }
00470 void RemovePolyList (csLightPatch*& first)
00471 {
00472 if (next_poly) next_poly->prev_poly = prev_poly;
00473 if (prev_poly) prev_poly->next_poly = next_poly;
00474 else first = next_poly;
00475 prev_poly = next_poly = NULL;
00476 polygon = NULL;
00477 curve = NULL;
00478 }
00480 void AddLightList (csLightPatch*& first)
00481 {
00482 next_light = first;
00483 prev_light = NULL;
00484 if (first)
00485 first->prev_light = this;
00486 first = this;
00487 }
00489 void RemoveLightList (csLightPatch*& first)
00490 {
00491 if (next_light) next_light->prev_light = prev_light;
00492 if (prev_light) prev_light->next_light = next_light;
00493 else first = next_light;
00494 prev_light = next_light = NULL;
00495 light = NULL;
00496 }
00497
00499 void SetLightFrustum (csFrustum* lf) { light_frustum = lf; }
00501 csFrustum* GetLightFrustum () { return light_frustum; }
00502 };
00503
00509 class csDynLight : public csLight
00510 {
00511 private:
00512 csDynLight* next;
00513 csDynLight* prev;
00514
00516 csLightPatch* lightpatches;
00517
00518 public:
00525 csDynLight (float x, float y, float z, float dist,
00526 float red, float green, float blue);
00527
00532 virtual ~csDynLight ();
00533
00541 void Setup ();
00542
00547 virtual void SetColor (const csColor& col);
00548
00554 void UnlinkLightpatch (csLightPatch* lp);
00555
00559 void AddLightpatch (csLightPatch* lp);
00560
00562 void SetNext (csDynLight* n) { next = n; }
00564 void SetPrev (csDynLight* p) { prev = p; }
00566 csDynLight* GetNext () { return next; }
00568 csDynLight* GetPrev () { return prev; }
00569
00570
00571 SCF_DECLARE_IBASE_EXT (csLight);
00572
00573 struct eiDynLight : public iDynLight
00574 {
00575 SCF_DECLARE_EMBEDDED_IBASE (csDynLight);
00576
00578 virtual csDynLight* GetPrivateObject ()
00579 { return scfParent; }
00580 virtual void Setup ()
00581 { scfParent->Setup (); }
00582 virtual iObject *QueryObject ()
00583 { return scfParent; }
00584 virtual iLight *QueryLight ()
00585 { return &(scfParent->scfiLight); }
00586 virtual iDynLight* GetNext ()
00587 { return &(scfParent->GetNext())->scfiDynLight; }
00588 } scfiDynLight;
00589 friend struct eiDynLight;
00590 };
00591
00592
00593 CS_DECLARE_OBJECT_VECTOR (csLightListHelper, iLight);
00594
00598 class csLightList : public csLightListHelper
00599 {
00600 public:
00601 SCF_DECLARE_IBASE;
00602
00604 csLightList ();
00605
00607 iLight *FindByID (unsigned long id) const;
00608
00609 class LightList : public iLightList
00610 {
00611 SCF_DECLARE_EMBEDDED_IBASE (csLightList);
00612 virtual int GetCount () const;
00613 virtual iLight *Get (int n) const;
00614 virtual int Add (iLight *obj);
00615 virtual bool Remove (iLight *obj);
00616 virtual bool Remove (int n);
00617 virtual void RemoveAll ();
00618 virtual int Find (iLight *obj) const;
00619 virtual iLight *FindByName (const char *Name) const;
00620 virtual iLight *FindByID (unsigned long id) const;
00621 } scfiLightList;
00622 };
00623
00624 #endif // __CS_LIGHT_H__