Google

Main Page   Class Hierarchy   Compound List   File List   Compound Members  

polytext.h

00001 /*
00002     Copyright (C) 1998-2001 by Jorrit Tyberghein
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public
00015     License along with this library; if not, write to the Free
00016     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 */
00018 
00019 #ifndef __CS_POLYTEXT_H__
00020 #define __CS_POLYTEXT_H__
00021 
00022 #include "csgeom/math3d.h"
00023 #include "csutil/csvector.h"
00024 #include "csutil/cscolor.h"
00025 #include "imesh/thing/polygon.h"
00026 #include "iengine/light.h"
00027 
00028 struct iFrustumView;
00029 struct iMaterialHandle;
00030 struct iPolygon3D;
00031 struct iLight;
00032 struct csRGBpixel;
00033 class csPolygon3D;
00034 class csPolyTexture;
00035 class csLightMap;
00036 class csLightPatch;
00037 class csFrustumContext;
00038 class csFrustumView;
00039 class csLight;
00040 class csMatrix3;
00041 class csVector3;
00042 class csVector2;
00043 class csColor;
00044 
00045 SCF_VERSION (csLightingPolyTexQueue, 0, 0, 1);
00046 
00053 struct csLightingPolyTexQueue : public iLightingProcessInfo
00054 {
00055 private:
00056   // Vector containing csPolygonTexture pointers.
00057   csVector polytxts;
00058   // Light.
00059   csLight* light;
00060   // Gouraud shading alone.
00061   bool gouraud_only;
00062   // For dynamic lighting.
00063   bool dynamic;
00064   // Current lighting color.
00065   csColor color;
00066 
00067 public:
00068   csLightingPolyTexQueue (csLight* light, bool dynamic, bool gouraud_only);
00069   virtual ~csLightingPolyTexQueue ();
00070 
00074   csLight* GetCsLight () const { return light; }
00075   virtual iLight* GetLight () const;
00076 
00080   virtual bool GetGouraudOnly () const { return gouraud_only; }
00081 
00085   virtual bool IsDynamic () const { return dynamic; }
00086 
00090   virtual void SetColor (const csColor& col) { color = col; }
00091 
00095   virtual const csColor& GetColor () const { return color; }
00096 
00102   void AddPolyTexture (csPolyTexture* pt);
00103 
00107   void UpdateMaps (csLight* light, const csVector3& lightpos,
00108         const csColor& lightcolor);
00109 
00110   SCF_DECLARE_IBASE;
00111 };
00112 
00118 class csShadowBitmap
00119 {
00120 private:
00121   char* light;          // Light bitmap.
00122   char* shadow;         // Shadow bitmap.
00123   int lm_w, lm_h;       // Original lightmap size.
00124   int sb_w, sb_h;       // Shadow bitmap size.
00125   int quality;          // Quality factor.
00126   int cnt_unshadowed;   // Number of bits still unshadowed in 'shadow' array.
00127   int cnt_unlit;        // Number of bits still unlit in 'light' array.
00128   int default_light;    // Default value to use initially for light map.
00129 
00130 private:
00136   float GetLighting (int lm_u, int lm_v);
00137 
00138   /*
00139    * For csAntialiasedPolyFill().
00140    */
00141   static void LightPutPixel (int x, int y, float area, void *arg);
00142   static void LightDrawBox (int x, int y, int w, int h, void *arg);
00143   static void ShadowPutPixel (int x, int y, float area, void *arg);
00144   static void ShadowDrawBox (int x, int y, int w, int h, void *arg);
00145   void _LightPutPixel (int x, int y, float area);
00146   void _LightDrawBox (int x, int y, int w, int h);
00147   void _ShadowPutPixel (int x, int y, float area);
00148   void _ShadowDrawBox (int x, int y, int w, int h);
00149 
00150 public:
00160   csShadowBitmap (int lm_w, int lm_h, int quality, int default_light);
00161 
00165   ~csShadowBitmap () { delete[] shadow; delete[] light; }
00166 
00174   void RenderPolygon (csVector2* poly, int num_vertices, int val);
00175 
00180   void RenderTotal (int val);
00181 
00199   void UpdateLightMap (csRGBpixel* lightmap,
00200         int lightcell_shift,
00201         float shf_u, float shf_v,
00202         float mul_u, float mul_v,
00203         const csMatrix3& m_t2w, const csVector3& v_t2w,
00204         csLight* light, const csVector3& lightpos,
00205         const csColor& lightcolor,
00206         const csVector3& poly_normal,
00207         float cosfact);
00208 
00224   void UpdateShadowMap (unsigned char* shadowmap,
00225         int lightcell_shift,
00226         float shf_u, float shf_v,
00227         float mul_u, float mul_v,
00228         const csMatrix3& m_t2w, const csVector3& v_t2w,
00229         csLight* light, const csVector3& lightpos,
00230         const csVector3& poly_normal,
00231         float cosfact);
00232 
00236   bool IsFullyShadowed () const
00237   {
00238     return cnt_unshadowed == 0;
00239   }
00240 
00244   bool IsFullyUnlit () const
00245   {
00246     return cnt_unlit == sb_w * sb_h;
00247   }
00248 
00252   bool IsFullyLit () const
00253   {
00254     return cnt_unlit == 0 && (cnt_unshadowed == sb_w * sb_h);
00255   }
00256 };
00257 
00258 
00262 class csPolyTexture : public iPolygonTexture
00263 {
00264   friend class csPolygon3D;
00265   friend class csPolygon2D;
00266 
00267 private:
00269   csPolygon3D* polygon;
00271   iPolygon3D* ipolygon;
00272 
00274   iMaterialHandle* mat_handle;
00275 
00281   int Imin_u, Imin_v, Imax_u, Imax_v;
00282 
00283   //@@@Fmin... Fmax... is the same for all four csPolyTexture.
00284   //SHARE!
00286   float Fmin_u, Fmin_v, Fmax_u, Fmax_v;
00287 
00289   uint16 shf_u;
00291   uint16 and_u;
00292 
00293   /*
00294    * New texture data with lighting added. This is an untiled texture
00295    * so it is more efficient to draw. This texture data is allocated
00296    * and maintained by the texture cache. If a PolyTexture is in the
00297    * cache it will be allocated, otherwise it won't.
00298    */
00299 
00301   int w;
00302 
00304   int h;
00305 
00307   int w_orig;
00308 
00310   float fdu;
00312   float fdv;
00313 
00315   csLightMap* lm;
00319   csShadowBitmap* shadow_bitmap;
00320 
00322   void *cache_data [4];
00323 
00324 public:
00333   static float cfg_cosinus_factor;
00334 
00336   csPolyTexture ();
00338   virtual ~csPolyTexture ();
00339 
00343   void SetPolygon (csPolygon3D* p);
00344 
00348   csPolygon3D *GetCSPolygon () { return polygon; }
00349 
00355   void SetLightMap (csLightMap* lightmap);
00356 
00358   csLightMap *GetCSLightMap() { return lm; }
00359 
00361   void SetMaterialHandle (iMaterialHandle* th) { mat_handle = th; }
00362 
00366   void CreateBoundingTextureBox ();
00367 
00371   void InitLightMaps ();
00372 
00379   void FillLightMap (csFrustumView* lview, bool vis, csPolygon3D* subpoly);
00380 
00385   void UpdateFromShadowBitmap (csLight* light, const csVector3& lightpos,
00386         const csColor& lightcolor);
00387 
00389   void MakeDirtyDynamicLights ();
00390 
00395   void ShineDynLightMap (csLightPatch* lp);
00396 
00397   //--------------------- iPolygonTexture implementation ---------------------
00398   SCF_DECLARE_IBASE;
00400   virtual iMaterialHandle *GetMaterialHandle () { return mat_handle; }
00402   virtual float GetFDU () { return fdu; }
00404   virtual float GetFDV () { return fdv; }
00406   virtual int GetWidth () { return w; }
00408   virtual int GetHeight () { return h; }
00410   virtual int GetShiftU () { return shf_u; }
00412   virtual int GetIMinU () { return Imin_u; }
00414   virtual int GetIMinV () { return Imin_v; }
00416   virtual void GetTextureBox (float& fMinU, float& fMinV,
00417         float& fMaxU, float& fMaxV);
00419   virtual int GetOriginalWidth () { return w_orig; }
00420 
00422   virtual iPolygon3D *GetPolygon ()
00423   {
00424     return ipolygon;
00425   }
00427   virtual bool DynamicLightsDirty ();
00434   virtual bool RecalculateDynamicLights ();
00435 
00437   virtual iLightMap *GetLightMap ();
00439   virtual int GetLightCellSize ();
00441   virtual int GetLightCellShift ();
00442 
00444   virtual void *GetCacheData (int idx) { return cache_data[idx]; }
00446   virtual void SetCacheData (int idx, void *d) { cache_data[idx] = d; }
00447 };
00448 
00449 #endif // __CS_POLYTEXT_H__

Generated for Crystal Space by doxygen 1.2.5 written by Dimitri van Heesch, ©1997-2000