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

PathPt.c File Reference

#include <windows.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include "PathPt.h"
#include "_Bot.h"
#include "Track.h"

Go to the source code of this file.

Defines

#define WIN32_LEAN_AND_MEAN
#define SetRGB(t, rv, gv, bv)   ((t).r = (float)(rv), (t).g = (float)(gv), (t).b = (float)(bv))

Functions

geBoolean PathPoint_Frame2 (geWorld *World, const geXForm3d *XForm, geFloat DeltaTime)
geBoolean PathPoint_Frame3 (geWorld *World, const geXForm3d *XForm, geFloat DeltaTime)
void DrawLine3d (geWorld *World, const geXForm3d *M, const geVec3d *p1, const geVec3d *p2, int r, int g, int b, int r1, int g1, int b1)
geBoolean PathPt_Reset (geWorld *World)
geBoolean PathPoint_SetTexture (geWorld *World, geVFile *MainFS)
geBoolean PathPt_Startup (geWorld *World, geVFile *Fs)
geBoolean PathPt_Shutdown (void)
geBoolean PathPt_Frame (geWorld *World, const geXForm3d *XForm, geFloat DeltaTime)

Variables

geBitmapPathPointTexture


Define Documentation

#define SetRGB t,
rv,
gv,
bv   )     ((t).r = (float)(rv), (t).g = (float)(gv), (t).b = (float)(bv))
 

Definition at line 25 of file PathPt.c.

Referenced by DrawLine3d().

#define WIN32_LEAN_AND_MEAN
 

Definition at line 4 of file PathPt.c.


Function Documentation

void DrawLine3d geWorld World,
const geXForm3d M,
const geVec3d p1,
const geVec3d p2,
int  r,
int  g,
int  b,
int  r1,
int  g1,
int  b1
[static]
 

Definition at line 27 of file PathPt.c.

References GE_GOURAUD_POLY, GE_RENDER_DO_NOT_OCCLUDE_OTHERS, geFloat, geVec3d_CrossProduct(), geVec3d_Normalize(), geVec3d_Scale(), geVec3d_Subtract(), geWorld_AddPolyOnce(), geXForm3d_GetIn(), NULL, r, SetRGB, v, geVec3d::X, geVec3d::Y, and geVec3d::Z.

Referenced by PathPoint_Frame2(), and PathPoint_Frame3().

00035 {
00036         GE_LVertex      v[4];
00037         int                     i;
00038         geVec3d         perp;
00039         geVec3d         in;
00040 
00041         v[0].u = 0.0f;
00042         v[0].v = 0.0f;
00043         v[1].u = 1.0f;
00044         v[1].v = 0.0f;
00045         v[2].u = 1.0f;
00046         v[2].v = 1.0f;
00047         v[3].u = 0.0f;
00048         v[3].v = 1.0f;
00049 
00050         for     (i = 0; i < 4; i++)
00051         {
00052                 v[i].r = (geFloat)r;
00053                 v[i].g = (geFloat)g;
00054                 v[i].b = (geFloat)b;
00055                 v[i].a = 255.0f;
00056         }
00057 
00058         geVec3d_Subtract(p1, p2, &perp);
00059         geXForm3d_GetIn(M, &in);
00060         geVec3d_CrossProduct(&perp, &in, &perp);
00061         geVec3d_Normalize(&perp);
00062 //      geVec3d_Scale(&perp, 4.0f / 2.0f, &perp);
00063         geVec3d_Scale(&perp, 2.0f / 2.0f, &perp);
00064 
00065         v[0].X = p2->X - perp.X;
00066         v[0].Y = p2->Y - perp.Y;
00067         v[0].Z = p2->Z - perp.Z;
00068         v[1].X = p2->X + perp.X;
00069         v[1].Y = p2->Y + perp.Y;
00070         v[1].Z = p2->Z + perp.Z;
00071         v[2].X = p1->X + perp.X;
00072         v[2].Y = p1->Y + perp.Y;
00073         v[2].Z = p1->Z + perp.Z;
00074         v[3].X = p1->X - perp.X;
00075         v[3].Y = p1->Y - perp.Y;
00076         v[3].Z = p1->Z - perp.Z;
00077 
00078         SetRGB(v[0], r1, g1, b1);
00079         SetRGB(v[1], r1, g1, b1);
00080         SetRGB(v[2], r, g, b);
00081         SetRGB(v[3], r, g, b);
00082 
00083         geWorld_AddPolyOnce(World,
00084                                                 v,
00085                                                 4,
00086                                                 NULL,
00087                                                 GE_GOURAUD_POLY,
00088                                                 GE_RENDER_DO_NOT_OCCLUDE_OTHERS,
00089                                                 1.0f);
00090 }

geBoolean PathPoint_Frame2 geWorld World,
const geXForm3d XForm,
geFloat  DeltaTime
[static]
 

Definition at line 352 of file PathPt.c.

References GE_LVertex::a, GE_LVertex::b, BIT, DrawLine3d(), TrackPt::Flags, GE_LVertex::g, GE_COLLIDE_MODELS, GE_CONTENTS_CANNOT_OCCUPY, GE_FALSE, GE_RENDER_DO_NOT_OCCLUDE_OTHERS, GE_RENDER_DO_NOT_OCCLUDE_SELF, GE_TEXTURED_POINT, GE_TRUE, geBoolean, geFloat, geVec3d_Length(), geWorld_AddPolyOnce(), geWorld_Collision(), NULL, PathPointTexture, Track::PointCount, Track::PointList, TrackPt::Pos, GE_LVertex::r, TEST, TrackCount, TrackList, geXForm3d::Translation, GE_LVertex::u, GE_LVertex::v, TrackPt::WatchPos, geVec3d::X, GE_LVertex::X, geVec3d::Y, GE_LVertex::Y, geVec3d::Z, and GE_LVertex::Z.

Referenced by PathPt_Frame().

00353 {
00354         GE_Collision                    Collision;
00355         int                                             i;
00356         geBoolean       Visible;
00357         geFloat         DistanceToCorona;
00358         geVec3d         Delta;
00359 
00360         if      (!World)
00361                 return GE_TRUE;
00362  
00363         // Now walk the track list, drawing lines to connect them all.  Draw red
00364         // lines to things that are being watched.
00365 
00366         for     (i = 0; i < TrackCount; i++)
00367         {
00368                 int             j;
00369                 Track * T;
00370 
00371                 T = &TrackList[i];
00372                 assert(T->PointCount > 0);
00373 
00374                 for     (j = 0; j < T->PointCount; j++)
00375                 {
00376                         GE_LVertex      Vert;
00377                         float Radius;
00378 
00379                         DistanceToCorona = geVec3d_Length(&Delta);
00380 
00381                         if      (!geWorld_Collision(World,
00382                                                                         NULL,
00383                                                                         NULL,
00384                                                                         T->PointList[j].Pos,
00385                                                                         &XForm->Translation,
00386                                                                         GE_CONTENTS_CANNOT_OCCUPY,
00387                                                                         GE_COLLIDE_MODELS,
00388                                                                         0xffffffff, NULL, NULL, 
00389                                                                         &Collision) &&
00390                                  (DistanceToCorona < 2000.0f))//C->MaxVisibleDistance))
00391                                 {
00392                                 Visible = GE_TRUE;
00393                                 }
00394                         else
00395                                 {
00396                                 Visible = GE_FALSE;
00397                                 }
00398 
00399                         
00400                         if (Visible)
00401                                 {
00402                                 Vert.X = T->PointList[j].Pos->X;
00403                                 Vert.Y = T->PointList[j].Pos->Y;
00404                                 Vert.Z = T->PointList[j].Pos->Z;
00405 
00406                                 if (j != 0 && TEST(T->PointList[j].Flags, BIT(0)))
00407                                         {
00408                                         Vert.g = 0.0f;
00409                                         Vert.b = 0.0f;
00410                                         Radius = 5.0f;
00411                                         }
00412                                 else
00413                                         {
00414                                         Vert.g = 255.0f;
00415                                         Vert.b = 255.0f;
00416                                         Radius = 1.0f;
00417                                         }
00418 
00419                                 Vert.r = 255.0f;
00420                                 Vert.a = 255.0f;
00421                                 Vert.u = Vert.v = 0.0f;
00422 
00423                                 geWorld_AddPolyOnce(World,
00424                                                                         &Vert,
00425                                                                         1,
00426                                                                         PathPointTexture,
00427                                                                         GE_TEXTURED_POINT,
00428                                                                         GE_RENDER_DO_NOT_OCCLUDE_OTHERS | GE_RENDER_DO_NOT_OCCLUDE_SELF,
00429                                                                         Radius);
00430                                 }
00431 
00432 
00433                         if (j < T->PointCount - 1)
00434                                 {
00435                                 DrawLine3d(World,
00436                                                    XForm, 
00437                                                    T->PointList[j].Pos,
00438                                                    T->PointList[j + 1].Pos,
00439                                                    255, 255, 255,
00440                                                    0, 255, 0);
00441                                 }
00442 
00443                         if      (T->PointList[j].WatchPos)
00444                                 {
00445                                 DrawLine3d(World,
00446                                                    XForm, 
00447                                                    T->PointList[j].Pos,
00448                                                    T->PointList[j].WatchPos,
00449                                                    255, 255, 255,
00450                                                    255, 0, 0);
00451                                 }
00452                 }
00453         }
00454 
00455         return GE_TRUE;
00456 }

geBoolean PathPoint_Frame3 geWorld World,
const geXForm3d XForm,
geFloat  DeltaTime
[static]
 

Definition at line 459 of file PathPt.c.

References DrawLine3d(), GE_TRUE, geBoolean, Track::PointCount, Track::PointList, TrackPt::Pos, TrackCount, TrackList, v, Track::Vis, and Track::VisFlag.

Referenced by PathPt_Frame().

00460 {
00461         int     i,v;
00462 
00463         geVec3d *sp, *ep, *ep2, *sp2;
00464 
00465         if      (!World)
00466                 return GE_TRUE;
00467  
00468         // Now walk the track list, drawing lines to connect them all.  Draw red
00469         // lines to things that are being watched.
00470 
00471         for     (i = 0; i < TrackCount; i++)
00472             {
00473                 Track * T;
00474 
00475                 T = &TrackList[i];
00476                 assert(T->PointCount > 0);
00477 
00478                 sp = T->PointList[0].Pos;
00479                 ep = T->PointList[T->PointCount - 1].Pos;
00480 
00481         for (v = 0; T->Vis[v]; v++)
00482             {
00483                         sp2 = T->Vis[v]->PointList[0].Pos;
00484                         ep2 = T->Vis[v]->PointList[T->Vis[v]->PointCount - 1].Pos;
00485 
00486                         switch(T->VisFlag[v])
00487                                 {
00488                                 case 1:
00489                                         DrawLine3d(World,
00490                                                            XForm, 
00491                                                            sp,
00492                                                            sp2,
00493                                                            255, 255, 255,
00494                                                            0, 0, 255);
00495                                         break;
00496                                 case 2:
00497                                         DrawLine3d(World,
00498                                                            XForm, 
00499                                                            sp,
00500                                                            ep2,
00501                                                            255, 255, 255,
00502                                                            0, 0, 255);
00503                                         break;
00504                                 case 3:
00505                                         DrawLine3d(World,
00506                                                            XForm, 
00507                                                            ep,
00508                                                            ep2,
00509                                                            255, 255, 255,
00510                                                            0, 0, 255);
00511                                         break;
00512                                 case 4:
00513                                         DrawLine3d(World,
00514                                                            XForm, 
00515                                                            ep,
00516                                                            sp2,
00517                                                            255, 255, 255,
00518                                                            0, 0, 255);
00519                                         break;
00520                                 }
00521             }
00522         }
00523 
00524         return GE_TRUE;
00525 }

geBoolean PathPoint_SetTexture geWorld World,
geVFile MainFS
[static]
 

Definition at line 103 of file PathPt.c.

References GE_FALSE, GE_TRUE, geBitmap_CreateFromFileName(), geBitmap_Destroy(), geBitmap_SetAlpha(), geBoolean, geWorld_AddBitmap(), geWorld_GetEntitySet(), MainFS, NULL, and PathPointTexture.

Referenced by PathPt_Startup().

00104 {
00105         geEntity_EntitySet      *Set;
00106         geBitmap                        *ABitmap;
00107 
00108         ABitmap = NULL;
00109 
00110         if      (World == NULL)
00111                 return GE_TRUE;
00112 
00113         Set = geWorld_GetEntitySet(World, "PathPoint");
00114         if      (Set == NULL)
00115                 return GE_TRUE;
00116 
00117         PathPointTexture = geBitmap_CreateFromFileName(MainFS, "Bmp\\Corona.Bmp");
00118 
00119         if (!PathPointTexture)
00120         {
00121                 goto ExitWithError;
00122         }
00123 
00124         ABitmap = geBitmap_CreateFromFileName(MainFS, "Bmp\\Corona.Bmp");
00125 
00126         if (!ABitmap)
00127         {
00128                 goto ExitWithError;
00129         }
00130 
00131         if (!geBitmap_SetAlpha(PathPointTexture, ABitmap))
00132         {
00133                 goto ExitWithError;
00134         }
00135 
00136         geBitmap_Destroy(&ABitmap);
00137         ABitmap = NULL;
00138 
00139         if (!geWorld_AddBitmap(World, PathPointTexture))
00140         {
00141                 goto ExitWithError;
00142         }
00143 
00144         return GE_TRUE;
00145 
00146         // Error clean up
00147         ExitWithError:
00148         {
00149                 if (PathPointTexture)
00150                 {
00151                         geBitmap_Destroy(&PathPointTexture);
00152                         PathPointTexture = NULL;
00153                 }
00154 
00155                 if (ABitmap)
00156                 {
00157                         geBitmap_Destroy(&ABitmap);
00158                         ABitmap = NULL;
00159                 }
00160 
00161                 return GE_FALSE;
00162         }
00163 }

geBoolean PathPt_Frame geWorld World,
const geXForm3d XForm,
geFloat  DeltaTime
 

Definition at line 295 of file PathPt.c.

References GE_TRUE, geBoolean, geEntity_EntitySetGetNextEntity(), geEntity_GetUserData(), geVec3d_Add(), geVec3d_Subtract(), geWorld_GetEntitySet(), geWorld_GetModelRotationalCenter(), geWorld_GetModelXForm(), geXForm3d_Transform(), PathPoint::MoveWithModel, MultiPathLight, NULL, PathPoint::origin, PathLight, PathPoint_Frame2(), PathPoint_Frame3(), and PathPoint::Pos.

00296 {
00297         geEntity_EntitySet *    Set;
00298         geEntity *                              Entity;
00299 
00300         PathPoint *     P;
00301         geVec3d         Pos;
00302         geVec3d Center;
00303         extern geBoolean PathLight;
00304         extern geBoolean MultiPathLight;
00305 
00306         if      (!World)
00307                 return GE_TRUE;
00308  
00309         Set = geWorld_GetEntitySet(World, "PathPoint");
00310 
00311         if      (Set == NULL)
00312                 return GE_TRUE;
00313 
00314         Entity = NULL;
00315 
00316         while   (1)
00317         {
00318                 Entity = geEntity_EntitySetGetNextEntity(Set, Entity);
00319 
00320                 if (!Entity)
00321                         break;
00322 
00323                 P = geEntity_GetUserData(Entity);
00324 
00325                 if      (P->MoveWithModel)
00326                 {
00327                         geXForm3d       XForm;
00328 
00329                         geWorld_GetModelXForm(World, P->MoveWithModel, &XForm);
00330 
00331                         Pos = P->origin;
00332 
00333                         geWorld_GetModelRotationalCenter(World, P->MoveWithModel, &Center);
00334                         geVec3d_Subtract(&Pos, &Center, &Pos);
00335                         geXForm3d_Transform(&XForm, &Pos, &Pos);
00336                         geVec3d_Add(&Pos, &Center, &P->Pos);
00337                 }
00338         }
00339 
00340         if (XForm)
00341         {
00342                 if (PathLight)
00343                         PathPoint_Frame2(World, XForm, DeltaTime);
00344                 if (MultiPathLight)
00345                         PathPoint_Frame3(World, XForm, DeltaTime);
00346         }
00347 
00348 
00349         return GE_TRUE;
00350 }

geBoolean PathPt_Reset geWorld World  ) 
 

Definition at line 92 of file PathPt.c.

References GE_TRUE, geBoolean, MAX_TRACKS, TrackCount, and TrackList.

Referenced by PathPt_Startup().

00093 {
00094         if      (!World)
00095                 return GE_TRUE;
00096 
00097         memset(TrackList,0,sizeof(TrackList[0])*MAX_TRACKS);
00098         TrackCount = 0;
00099 
00100         return GE_TRUE;
00101 }

geBoolean PathPt_Shutdown void   ) 
 

Definition at line 282 of file PathPt.c.

References GE_TRUE, geBitmap_Destroy(), geBoolean, NULL, and PathPointTexture.

Referenced by ShutdownWorldCB().

00283 {
00284         if (PathPointTexture)
00285         {
00286                 // NOTE - We really should remove it from the world, but when the world is destroyed
00287                 // it removes all leftover bitmaps, so we are free to just let that happen...
00288                 geBitmap_Destroy(&PathPointTexture);
00289                 PathPointTexture = NULL;
00290         }
00291 
00292         return GE_TRUE;
00293 }

geBoolean PathPt_Startup geWorld World,
geVFile Fs
 

Definition at line 166 of file PathPt.c.

References TrackPt::Action, TrackPt::ActionDir, PathPoint::ActionType, BIT, PathPoint::Direction, TrackPt::Dist, PathPoint::Dist, TrackPt::Flags, GE_FALSE, GE_TRUE, geBoolean, geEntity_EntitySetGetNextEntity(), geEntity_GetUserData(), geWorld_GetEntitySet(), MAX_TRACK_POINTS, MAX_TRACKS, PathPoint::Next, NULL, PathPoint::origin, PathPoint_SetTexture(), PathPt_Reset(), PathPoint::PathType, POINT_TYPE_WAIT_POINT_VISIBLE, PathPoint::Pos, TrackPt::Pos, SET, TrackPt::Time, PathPoint::Time, Track_LinkTracks(), TRACK_TYPE_TRAVERSE_DOOR, TrackCount, TrackList, TrackPt::VelocityScale, PathPoint::VelocityScale, PathPoint::WatchPoint, and TrackPt::WatchPos.

Referenced by SetupWorldCB().

00167 {
00168         void                            *ClassData;
00169         geEntity_EntitySet      *ClassSet;
00170         geEntity                        *Entity;
00171         PathPoint                       *Point;
00172         
00173         int pointnum=0;
00174         TrackPt *track_pt;
00175 
00176         if      (!World)
00177                 return GE_TRUE;
00178 
00179         PathPt_Reset(World);
00180 
00181         // Look for the class name in the world
00182         ClassSet = geWorld_GetEntitySet(World, "PathPoint");
00183 
00184     if (!ClassSet)
00185         return GE_TRUE;
00186 
00187         Entity = NULL;
00188 
00189         while (1)
00190         {
00191                 Entity = geEntity_EntitySetGetNextEntity(ClassSet, Entity);
00192 
00193                 if (!Entity)
00194                         break;
00195 
00196                 ClassData = geEntity_GetUserData(Entity);
00197                 Point = (PathPoint*)ClassData;
00198 
00199                 assert(Point);
00200 
00201                 // initialize translated position
00202                 Point->Pos = Point->origin;
00203 
00204                 if (Point->PathType <= 0)
00205                         continue;
00206 
00207                 //save off header info
00208                 TrackList[TrackCount].Type = Point->PathType;
00209         pointnum = 0;
00210 
00211                 //move through points setting up the list
00212                 do
00213                 {
00214                         //save off point info
00215                         track_pt = &TrackList[TrackCount].PointList[pointnum];
00216                         // initialize translated position
00217                         Point->Pos = Point->origin;
00218                         track_pt->Pos = &Point->Pos;
00219                         if (Point->WatchPoint)
00220                                 track_pt->WatchPos = &Point->WatchPoint->origin;
00221 
00222                         track_pt->Action = Point->ActionType;
00223                         track_pt->Time = Point->Time;
00224             track_pt->ActionDir = Point->Direction;
00225                         track_pt->Dist = Point->Dist;
00226                         track_pt->VelocityScale = Point->VelocityScale;
00227 
00228                         // automatic setup for doors
00229                         if (TrackList[TrackCount].Type == TRACK_TYPE_TRAVERSE_DOOR)
00230                                 {
00231                                 if (pointnum == 0)
00232                                         {
00233                                         track_pt->ActionDir = 1;
00234                                         track_pt->Action = POINT_TYPE_WAIT_POINT_VISIBLE;
00235                                         track_pt->WatchPos = &Point->Next->origin;
00236                                         }
00237                                 else
00238                                 if (pointnum == 1)
00239                                         {
00240                                         track_pt->ActionDir = -1;
00241                                         track_pt->Action = POINT_TYPE_WAIT_POINT_VISIBLE;
00242                                         track_pt->WatchPos = (track_pt-1)->Pos;
00243                                         }
00244                                 }
00245 
00246                         pointnum++;
00247                         TrackList[TrackCount].PointCount = pointnum;
00248 
00249             assert(pointnum < MAX_TRACK_POINTS);
00250 
00251                         Point = Point->Next;
00252 
00253                         // Found a type
00254                         if (Point && Point->PathType >= 0)
00255                                 {
00256                                 track_pt = &TrackList[TrackCount].PointList[pointnum];
00257                                 SET(track_pt->Flags, BIT(0));
00258                                 }
00259 
00260                 }while(Point && Point != (PathPoint*)ClassData);
00261 
00262                 TrackCount++;
00263                 assert(TrackCount < MAX_TRACKS);
00264         }
00265 
00266         Entity = NULL;
00267 
00268         {
00269                 void Track_LinkTracks(geWorld *World);
00270                 Track_LinkTracks(World);
00271         }
00272 
00273         if (Fs)
00274         {
00275                 if (!PathPoint_SetTexture(World, Fs))
00276                         return GE_FALSE;
00277         }
00278 
00279         return GE_TRUE;
00280 }


Variable Documentation

geBitmap* PathPointTexture [static]
 

Definition at line 23 of file PathPt.c.

Referenced by PathPoint_Frame2(), PathPoint_SetTexture(), and PathPt_Shutdown().


Generated on Tue Sep 30 12:37:51 2003 for GTestAndEngine by doxygen 1.3.2