Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

Water.c File Reference

#include <Assert.h>
#include <Stdlib.h>
#include <Math.h>
#include "Procedural.h"
#include "String.h"
#include "Bitmap.h"
#include "Ram.h"

Go to the source code of this file.

Compounds

struct  Procedural

Typedefs

typedef Procedural Procedural

Functions

ProceduralWater_Create (geBitmap **Bitmap, const char *StrParms)
void Water_Destroy (Procedural *Water)
geBoolean Water_Animate (Procedural *Water, float ElapsedTime)
geBoolean Water_ApplyToBitmap (Procedural *Water)
void Water_Update (Procedural *Water, float Time)
void Water_BuildRGBLuts (Procedural *Water, float RScale, float GScale, float BScale)
void CalcRippleData (int16 *Src, int16 *Dest, int16 Density, int32 W, int32 H)
float FloatMod (float In, float Wrap)
Procedural_TableWater_GetProcedural_Table (void)

Variables

Procedural_Table Water_Table


Typedef Documentation

typedef struct Procedural Procedural
 


Function Documentation

void CalcRippleData int16 Src,
int16 Dest,
int16  Density,
int32  W,
int32  H
[static]
 

Definition at line 314 of file Water.c.

References Dest, int16, and int32.

Referenced by Water_Update().

00315 {
00316         int32   i,j;
00317         int16   Val;
00318 
00319         //Bottom = W * (H-1);
00320 
00321         for(i=0; i< H; i++)
00322         {
00323                 for(j=0; j< W; j++)
00324                 {
00325                         if (i > 0)                                                      // Get top
00326                                 Val = *(Dest - W);
00327                         else
00328                                 Val = *(Dest + W * (H-1));
00329 
00330                         if (i < H-1)                                            // Get bottom
00331                                 Val += *(Dest + W);
00332                         else
00333                                 Val += *(Dest - W * (H-1));
00334 
00335                         if (j > 0)                                                      // Get left
00336                                 Val += *(Dest - 1);
00337                         else
00338                                 Val += *(Dest + (W-1));
00339 
00340                         if (j < W-1)                                            // Get right
00341                                 Val += *(Dest + 1);
00342                         else
00343                                 Val += *(Dest - (W-1));
00344 
00345                         Val >>= 1;
00346                         Val -= *Src;
00347                         Val -= (Val >> Density);
00348                         /*
00349                         if (Val > 255)
00350                                 Val = 255;
00351                         else if (Val < -255)
00352                                 Val = -255;
00353                         */
00354                         *Src = Val;
00355 
00356                         Src++;
00357                         Dest++;
00358 
00359                 }
00360         }
00361 }

float FloatMod float  In,
float  Wrap
[static]
 

Definition at line 367 of file Water.c.

Referenced by Water_Update().

00368 {
00369         Wrap = (float)floor(fabs(In)/Wrap)*Wrap - Wrap;
00370 
00371         if (In > 0)
00372                 In -= Wrap;
00373         else if (In < 0)
00374                 In += Wrap;
00375 
00376         return In;
00377 }

geBoolean Water_Animate Procedural Water,
float  ElapsedTime
 

Definition at line 187 of file Water.c.

References GE_FALSE, GE_TRUE, geBoolean, Water, Water_ApplyToBitmap(), and Water_Update().

00188 {
00189         if (!Water->Bitmap)
00190                 return GE_TRUE;
00191 
00192         Water_Update(Water, ElapsedTime);
00193 
00194         if (!Water_ApplyToBitmap(Water))
00195                 return GE_FALSE;
00196 
00197         return GE_TRUE;
00198 }

geBoolean Water_ApplyToBitmap Procedural Water  ) 
 

Definition at line 202 of file Water.c.

References Dest, geBitmap_Info::Format, GE_FALSE, GE_PIXELFORMAT_16BIT_565_RGB, GE_TRUE, geBitmap_GetBits(), geBitmap_GetInfo(), geBitmap_LockForWrite(), geBitmap_LockForWriteFormat(), geBitmap_UnLock(), geBoolean, geBitmap_Info::Height, int16, int32, geBitmap_Info::MaximumMip, NULL, r, geBitmap_Info::Stride, uint16, uint8, Water, geBitmap_Info::Width, and y.

Referenced by Water_Animate().

00203 {
00204         geBitmap                *Dest;
00205         uint8                   *pBlendLut;
00206 
00207         assert(Water->Bitmap);
00208 
00209 #if 0 //@@ CB BUG Fix!
00210         {
00211         geBitmap_Info   MainInfo, Secondary;
00212         //if (!geBitmap_GetInfo(Water->Bitmap, &Secondary, &MainInfo))
00213         if (!geBitmap_GetInfo(Water->Bitmap, &MainInfo, &Secondary))
00214                 return GE_FALSE;
00215 
00216         assert(MainInfo.MaximumMip == 0);
00217 
00218         if (MainInfo.Format != GE_PIXELFORMAT_16BIT_565_RGB)
00219                 return GE_TRUE;                 // Oh well...
00220         
00221         if (!geBitmap_LockForWrite(Water->Bitmap, &Dest, 0, 0))
00222                 return GE_FALSE;
00223         }
00224 #else
00225         if (!geBitmap_LockForWriteFormat(Water->Bitmap, &Dest, 0, 0, GE_PIXELFORMAT_16BIT_565_RGB))
00226                 return GE_FALSE;
00227                 
00228 #endif
00229 
00230         pBlendLut = &Water->BlendLut[0][0];
00231         
00232         {
00233                 uint16                  *pSrc16, *pDest16;
00234                 int16                   *pWSrc16, *pOriginalWSrc16;
00235                 int32                   w, h, Extra, WMask, HMask;
00236                 geBitmap_Info   Info;
00237 
00238         //      if (!geBitmap_GetInfo(Dest, &Secondary, &Info)) // CB BUG Fix!
00239                 if (!geBitmap_GetInfo(Dest, &Info, NULL))
00240                         return GE_FALSE;
00241                 
00242                 assert(Info.Format == GE_PIXELFORMAT_16BIT_565_RGB);
00243 
00244                 Extra = Info.Stride - Info.Width;
00245 
00246                 WMask = Info.Width - 1;
00247                 HMask = Info.Height - 1;
00248                 
00249                 pSrc16 = Water->OriginalBits;
00250                 pOriginalWSrc16 = pWSrc16 = Water->WaterData[Water->NPage];
00251                 pDest16 = geBitmap_GetBits(Dest);
00252 
00253                 // For the love of God, write this in assembly
00254                 for (h=0; h< Info.Height; h++)
00255                 {
00256                         for (w=0; w< Info.Width; w++)
00257                         {
00258                                 int32   x, y, Val;
00259                                 uint16  r, g, b;
00260                                 uint16  Color;
00261 
00262                                 Val = pWSrc16[w];
00263                                  
00264                                 if (h < Info.Height-1)
00265                                         y = Val - pWSrc16[w+Info.Stride];
00266                                 else
00267                                         y = Val - pOriginalWSrc16[w];
00268 
00269                                 x = Val - pWSrc16[(w+1)&WMask];
00270                         #if 1
00271                                 Val = 127 - (y<<4);
00272 
00273                                 if (Val < 0) 
00274                                         Val = 0;
00275                                 else if (Val > 255) 
00276                                         Val = 255;
00277 
00278                                 Val >>= 3;
00279                                 Val <<= 5;
00280                         #endif
00281                                 
00282                                 x >>= 4;         
00283                                 y >>= 4;
00284 
00285                                 Color = pSrc16[((h+y)&HMask)*Info.Stride + ((w+x)&WMask)];
00286                                 
00287                         #if 1
00288                                 r = (uint16)pBlendLut[Val+((Color>>11)&31)];
00289                                 g = (uint16)pBlendLut[Val+((Color>>6)&31)];
00290                                 b = (uint16)pBlendLut[Val+(Color&31)];
00291                                 
00292                                 *pDest16++ = (r<<11) | (g<<6) | b;
00293                         #else
00294                                 *pDest16++ = Color;
00295                         #endif
00296 
00297                         }
00298 
00299                         pDest16 += Extra;
00300                         pWSrc16 += Info.Stride;//Extra;
00301                 }
00302                 
00303                 if (!geBitmap_UnLock(Dest))
00304                 {
00305                         return GE_FALSE;
00306                 }
00307         }
00308 
00309         return GE_TRUE;
00310 }

void Water_BuildRGBLuts Procedural Water,
float  RScale,
float  GScale,
float  BScale
 

Definition at line 453 of file Water.c.

References int32, uint8, and Water.

Referenced by Water_Create().

00454 {
00455         int32           i, j;
00456 
00457         for (i=0; i<32; i++)            // Shade
00458         {
00459                 for (j=0; j<32; j++)    // Color
00460                 {
00461                         int32   Val;
00462 
00463                         Val = (int32)(((float)(31 - i)/14) * (float)j);
00464 
00465                         //Val <<= 2;
00466                         
00467                         if (Val > 31)
00468                                 Val = 31;
00469 
00470                         Water->BlendLut[i][j] = (uint8)Val;
00471                 }
00472         }
00473 
00474 }

Procedural * Water_Create geBitmap **  Bitmap,
const char *  StrParms
 

Definition at line 55 of file Water.c.

References geBitmap_Info::Format, GE_FALSE, GE_PIXELFORMAT_16BIT_565_RGB, GE_RAM_ALLOCATE_ARRAY, GE_RAM_ALLOCATE_STRUCT, GE_TRUE, geBitmap_ClearMips(), geBitmap_CreateRef(), geBitmap_GetBits(), geBitmap_GetInfo(), geBitmap_LockForRead(), geBitmap_SetFormat(), geBitmap_UnLock(), gePixelFormat, geBitmap_Info::Height, int16, int32, NULL, uint16, Water, Water_BuildRGBLuts(), Water_Destroy(), and geBitmap_Info::Width.

00056 {
00057         Procedural      *Water;
00058 
00059         assert(Bitmap);
00060         //assert(ParmStart);    // Unremark this when implemented!!!!!
00061 
00062         Water = GE_RAM_ALLOCATE_STRUCT(Procedural);
00063 
00064         if (!Water)
00065                 goto ExitWithError;
00066 
00067         memset(Water, 0, sizeof(*Water));
00068 
00069         if (*Bitmap)
00070         {
00071                 Water->Bitmap = *Bitmap;
00072 
00073                 geBitmap_CreateRef(Water->Bitmap);
00074         }
00075         else
00076         {
00077                 // Must make bitmap for tha caller!!!
00078                 goto ExitWithError;
00079         }
00080 
00081         // We need this to be only 1 miplevel!!!
00082         if (!geBitmap_ClearMips(Water->Bitmap))
00083                 goto ExitWithError;
00084         
00085         {
00086                 // We need to change the format of this bitmap to a 565 in the world (hope he doesn't mind ;)
00087                 gePixelFormat   Format;
00088                 geBitmap_Info   Info;
00089                 int32                   i;
00090 
00091                 Format = GE_PIXELFORMAT_16BIT_565_RGB;
00092 
00093                 if (!geBitmap_SetFormat(Water->Bitmap, Format, GE_FALSE, 0, NULL))
00094                         goto ExitWithError;
00095 
00096                 if (!geBitmap_GetInfo(Water->Bitmap, &Info, NULL))
00097                         goto ExitWithError;
00098 
00099                 Water->Width = Info.Width;
00100                 Water->Height = Info.Height;
00101                 Water->Size = Water->Width*Water->Height;
00102 
00103                 Water->OriginalBits = GE_RAM_ALLOCATE_ARRAY(uint16, Water->Size);
00104 
00105                 if (!Water->OriginalBits)
00106                         goto ExitWithError;
00107 
00108                 for (i=0; i<2; i++)
00109                 {
00110                         Water->WaterData[i] = GE_RAM_ALLOCATE_ARRAY(int16, Water->Size);
00111 
00112                         if (!Water->WaterData[i])
00113                                 goto ExitWithError;
00114 
00115                         memset(Water->WaterData[i], 0, sizeof(int16)*Water->Size);
00116                 }
00117 
00118         }
00119 
00120         // Get the original bits...
00121         {
00122                 geBitmap                *Src;
00123                 uint16                  *pSrc16;
00124                 int32                   i;
00125                 geBitmap_Info   Info;
00126 
00127                 if (!geBitmap_GetInfo(Water->Bitmap, &Info, NULL))
00128                         goto ExitWithError;
00129 
00130                 if (!geBitmap_LockForRead(Water->Bitmap, &Src, 0, 0, Info.Format, GE_TRUE, 255))
00131                         goto ExitWithError;
00132                 
00133                 pSrc16 = geBitmap_GetBits(Src);
00134 
00135                 for (i=0; i<Water->Size; i++)
00136                         Water->OriginalBits[i] = pSrc16[i];
00137 
00138                 if (!geBitmap_UnLock(Src))
00139                         goto ExitWithError;
00140                 
00141         }
00142 
00143         Water_BuildRGBLuts(Water, 1.0f, 1.0f, 1.0f);
00144 
00145         return Water;
00146 
00147         ExitWithError:
00148         {
00149                 if (Water)
00150                         Water_Destroy(Water);
00151 
00152                 return NULL;
00153         }
00154 }

void Water_Destroy Procedural Water  ) 
 

Definition at line 159 of file Water.c.

References geBitmap_Destroy(), geRam_Free, NULL, and Water.

Referenced by Water_Create().

00160 {
00161         assert(Water);
00162 
00163         if (Water->Bitmap)
00164         {
00165                 geBitmap_Destroy(&Water->Bitmap);
00166                 Water->Bitmap = NULL;
00167         }
00168         
00169         if (Water->OriginalBits)
00170                 geRam_Free(Water->OriginalBits);
00171         Water->OriginalBits = NULL;
00172 
00173         if (Water->WaterData[0])
00174                 geRam_Free(Water->WaterData[0]);
00175         Water->WaterData[0] = NULL;
00176 
00177         if (Water->WaterData[1])
00178                 geRam_Free(Water->WaterData[1]);
00179         Water->WaterData[1] = NULL;
00180 
00181         geRam_Free(Water);
00182 }

Procedural_Table* Water_GetProcedural_Table void   ) 
 

Definition at line 498 of file Water.c.

References Water_Table.

00499 {
00500         return &Water_Table; 
00501 }

void Water_Update Procedural Water,
float  Time
 

Definition at line 382 of file Water.c.

References CalcRippleData(), FloatMod(), int16, int32, and Water.

Referenced by Water_Animate().

00383 {
00384         int16           *Page1, *Page2, *Page3;
00385 
00386         Page1 = Water->WaterData[Water->NPage];
00387         Page2 = Water->WaterData[!Water->NPage];
00388 
00389         Page3 = Page2;
00390 
00391         Water->TimeToSplashWater += Time;
00392 #if 1
00393         if (Water->TimeToSplashWater > 0.8f)
00394         {
00395                 int32   px, py, cx, cy, c;
00396                 //int32         w, h;
00397                 
00398                 Water->TimeToSplashWater = 0.0f;
00399                 
00400                 
00401                 for (c=0; c< 2; c++)
00402                 {
00403                         px=(1+(rand()%(Water->Width-1-10)));
00404                         py=(1+(rand()%(Water->Height-1-10)));
00405 
00406                         for(cy=py; cy< (py+8); cy++)
00407                                 for(cx=px; cx< (px+8); cx++)
00408                                         Water->WaterData[!Water->NPage][cy * Water->Width + cx]=255;
00409                 }
00410                 /*
00411                 for (h=0; h<10; h++)
00412                         for (w=0; w<10; w++)
00413                                 Water->WaterData[!Water->NPage][(((int32)Water->PosY+h)%Water->Height)*Water->Width + (((int32)Water->PosX+w)%Water->Width)] = 255;
00414 
00415                 Water->PosX += 8.0f;
00416                 Water->PosY += 2.0f;
00417                 */
00418 
00419         }
00420 #else
00421         if (Water->TimeToSplashWater > 0.09f)
00422         {
00423                 int32           w, h;
00424 
00425                 Water->TimeToSplashWater = 0.0f;
00426                 
00427                 Water->PosX += (float)cos(Water->Angle)*16.0f;
00428                 Water->PosY += (float)sin(Water->Angle)*16.0f;
00429 
00430                 Water->Angle += ((float)rand()/RAND_MAX) * 0.5f - 0.1f;
00431 
00432                 Water->Angle = FloatMod(Water->Angle, 3.14159f);
00433 
00434                 Water->PosX = FloatMod(Water->PosX, (float)Water->Width);
00435                 Water->PosY = FloatMod(Water->PosY, (float)Water->Height);
00436 
00437                 //Water->WaterData[!Water->NPage][(int32)Water->PosY * Water->Width + (int32)Water->PosX]=255;
00438         
00439                 for (h=0; h<10; h++)
00440                         for (w=0; w<10; w++)
00441                                 Water->WaterData[!Water->NPage][(((int32)Water->PosY+h)%Water->Height)*Water->Width + (((int32)Water->PosX+w)%Water->Width)] = 255;
00442         }
00443 #endif
00444 
00445         CalcRippleData(Page1, Page2, 4, Water->Width, Water->Height);
00446 
00447         Water->NPage = !Water->NPage;
00448 }


Variable Documentation

Procedural_Table Water_Table [static]
 

Initial value:

Definition at line 478 of file Water.c.

Referenced by Water_GetProcedural_Table().


Generated on Tue Sep 30 12:38:23 2003 for GTestAndEngine by doxygen 1.3.2