#ifndef _LOGENTRY_H
#define _LOGENTRY_H
#include <string.h>

#ifndef bool
#ifndef _WINDOWS
typedef int bool;
#endif
#endif

#define KDTREE_LOG_ON 1
#define BOUNDS_LOG_ON (1 << 1)
#define RT_LOG_ON (1 << 2)
#define RW_LOG_ON (1 << 3)
#define WR_LOG_ON (1 << 4)
#define I_LOG_ON (1 << 5)
#define SCENE_LOG_ON (1 << 6)
#define KDTREE_FINDPOINT_LOG_ON (1 << 7)

enum LogEvent {
  Log_Start = 0,
  Log_End,

  SceneReadFile_Start,
  SceneReadFile_End,

  KDTreeCreate_Start,
  KDTreeCreate_End,

  KDTreeSubdivide_Start,
  KDTreeSubdivide_Reject,
  KDTreeSubdivide_TryPlane,
  KDTreeSubdivide_End,

  KDTreeFindPoint,

  KDTreeStep_Start,
  KDTreeStep_Ascend,
  KDTreeStep_End,
  KDTreeStep_ToSibling,

  KDTreeIntersect_Start,
  KDTreeIntersect_End,

  KDTreeNodeIntersect_Start,
  KDTreeNodeIntersect_NewBest,
  KDTreeNodeIntersect_Obj,
  KDTreeNodeIntersect_End,

  KDTreeFindStartCell_Start,
  KDTreeFindStartCell_End,

  BoundsWhereLeft_Start,
  BoundsWhereLeft_Face_Project,
  BoundsWhereLeft_End,

  BoundsWhereEntered_Start,
  BoundsWhereEntered_Face_Project,
  BoundsWhereEntered_End,
 
  BoundsIncludesPt_Start,  
  BoundsIncludesPt_Face_Check,
  
  //Render_Thread events
  RT_NewFrame,
  
  RT_NewRootFrustum_Start,
  RT_NewRootFrustum_End,
  
  RT_SampleFourCorners_Start,
  RT_SampleFourCorners_End,
  
  RT_Rendering_Start,
  RT_Rendering_End,
  
  RW_UseKDTree_Start,
  RW_UseKDTree_End,
  
  RW_DoOneRayFC_Start,
  RW_DoOneRayFC_End,
  
  RW_Work_Start,
  RW_Work_CastRay,
  RW_Work_ConfirmRay,
  RW_Work_End,
  
  RT_Stats,
  
  WR_FrustumSubdivided,
  WR_FrustumWalked,
  WR_EatCurCell,
  
  WR_FindNextCells_Start,
  WR_FindNextCells_End,
  
  WR_FloodYes,
  WR_FloodNo,
  
  Int_ObjList_Start,
  Int_ObjList_End,
  Int_Avoided,
  Int_Obj,
  
  KDTreeNodeNewIntersect_Start,
  KDTreeNodeNewIntersect_End,
};

class LogEntry {
public:
  LogEntry (LogEvent event, char *name, void *data) : _event (event), _data (data), _next (NULL), _prev (NULL), _num(-1)  {if (name) strcpy (_name, name); else _name[0] = 0;}

  void Place (LogEntry *prev) {
     _prev = prev;
     if (prev)
       prev->_next = this;
  }

  int _num; //our offset in the log
  
  char _name [100]; //for our convenience

  //actual log data
  LogEvent _event; //the actual event 
  void *_data; //event-specific data

  //lets you traverse the entries
  LogEntry *_prev; 
  LogEntry *_next;
};

#endif



