#include "visman.h"

class KDTreeNodeIntersectVis : public Vis {
protected:
  const LogEntry *_start;

public:
  KDTreeNodeIntersectVis (const Vis *parent, const LogEntry *someevent);

  void Display (const LogEntry *upto) const; 

  char *StatusLine (const LogEntry *ours) const;

  const LogEntry *GetStartEntry (void) const {return _start;}

  int IsOurs (const LogEntry *en) const {return (IsStartEvent (en) ||
						 en->_event == KDTreeNodeIntersect_NewBest ||
						 en->_event == KDTreeNodeIntersect_Obj ||
						 IsEndEvent (en));}
  int IsStartEvent (const LogEntry *en) const {return (en->_event == KDTreeNodeIntersect_Start);}
  int IsEndEvent (const LogEntry *en) const {return (en->_event == KDTreeNodeIntersect_End);}
};


class KDTreeNodeNewIntersectVis : public Vis {
    const LogEntry *_start;
public:
  KDTreeNodeNewIntersectVis (const Vis *parent, const LogEntry *someevent) : Vis (parent, someevent) {strcpy (_type, "KDTreeNodeNewIntersectVis"); _start = VisManager::FindVisStart (this, someevent);}

  void Display (const LogEntry *current) const {
    KDTreeNodeNewIntersect_Start_Entry *s = (KDTreeNodeNewIntersect_Start_Entry*)_start->_data;

    // draw start node in hilited wireframe
    glColor3f(1.0,0.6,0.0);  // orange
    s->_cell->_bounds.drawWireFrame();
  }
  
  char *StatusLine (const LogEntry *ours) const  {
    char *scratch;
    scratch = new char [200];
    if (IsStartEvent (ours))
      {
	KDTreeNodeNewIntersect_Start_Entry *s;
	s = (KDTreeNodeNewIntersect_Start_Entry *)ours->_data;
	sprintf (scratch, "frustum-culled intersect of ray %d, %d with %d objs", s->_x, s->_y, s->_num_objs);
	return scratch;
      }
    else if (IsEndEvent (ours))
      {
	KDTreeNodeNewIntersect_End_Entry *e;
	e = (KDTreeNodeNewIntersect_End_Entry *)ours->_data;
	sprintf (scratch, "finished frustum-culled intersect of ray %d, %d", e->_x, e->_y);
	if (e->_got_hit)
	  strcat (scratch, ", got some sort of hit.");
	else
	  strcat (scratch, ", still no hit");
	return scratch;
      }
    else
      return NULL;
  }
  
  const LogEntry *GetStartEntry (void) const {return _start;}

  int IsOurs (const LogEntry *en) const {return (IsStartEvent (en) || IsEndEvent (en));}
  int IsStartEvent (const LogEntry *en) const {return (en->_event == KDTreeNodeNewIntersect_Start);}
  int IsEndEvent (const LogEntry *en) const {return (en->_event == KDTreeNodeNewIntersect_End);}

};
