00001
00002
00003
00004 #ifndef ObjectArray_H
00005 #define ObjectArray_H
00006
00007 #include "util.h"
00008 #include "point3d.h"
00009 #include "object.h"
00010 #include "timer.h"
00011 #include <string.h>
00012 #include <stdio.h>
00013 #include "screen.h"
00014 #include "geometryreplicator.h"
00015
00016 class Object;
00017
00018 class ObjectArray
00019 {
00020 private:
00021 int numgroups;
00022 int numobjects;
00023 int numscreens;
00024 enum { maxobjects = 1000 };
00025 Object *objects_p[maxobjects];
00026
00027 enum { maxscreens = 100 };
00028 Screen *screens_p[maxscreens];
00029 int ScreenTrace[maxscreens];
00030
00031 Point3D min, max;
00032
00033 unsigned char** PatientScans;
00034 int numscan;
00035 char PatientName[40];
00036
00037 public:
00038 ObjectArray();
00039 ~ObjectArray();
00040 static const char* rcsid;
00041
00042 void reset(void);
00043 int getNumObjects(void);
00044 int getNumScreens(void);
00045 int getNumGroups(void);
00046
00047 void getScanBox(Screen* scr);
00048 unsigned char* getPatientScan(int i) { return PatientScans[i]; }
00049 void LoadPatient(char* filename, int *width, int* height, int* depth,
00050 Screen* scr = NULL);
00051 int getNumScan() { return numscan; }
00052 void RefreshPatient(int index);
00053
00054
00055
00056 static int debug;
00057
00058
00059 void computeStats();
00060 void getBoundingBox(Point3D* min_p, Point3D* max_p);
00061 Point3D getCenter();
00062
00063 int getIndex(Object* obj);
00064 int getIndexScreen(Screen* scr);
00065
00066
00067 int Read(char* filename);
00068 void Save(int format, ostream& os);
00069 friend ostream& operator<<(ostream& os, ObjectArray &oa);
00070
00071
00072 Object* addObject(char* name, int index=-1);
00073 void DeleteObject(Object* obj);
00074 Screen* addScreen(char* name);
00075 void DeleteScreen(Screen* scr);
00076 void DeleteAllObjects();
00077 Object* duplicateObject(Object* obj);
00078 Object* findObject(char* name);
00079 Object *getObject(int i);
00080 Screen *getScreen(int i);
00081
00082
00083 void Draw();
00084 void Update();
00085 void SetVisible(int on);
00086
00087
00088 void ConstructCollisions();
00089 void DestructCollisions();
00090 void ResetCollisions();
00091 void DetectCollisions();
00092 void MarkCollisions();
00093 void ResolveCollisions();
00094
00095 void printInfo(void);
00096
00097
00098 void HandleBehaviors();
00099 Node* FindClosestUnlinkedNode2(Point3D pt, double thresh = 1.0);
00100 Node* FindClosestUnlinkedNode(Point3D pt);
00101 void CreateArticulationsBetweenObjects(double dist_allowed);
00102 Object* TesselateSurface(Object* obj);
00103 void GeometryReplicate(GeometryReplicator* gr);
00104 };
00105
00106 inline int ObjectArray::getNumObjects(void)
00107 {return numobjects;}
00108
00109 inline void ObjectArray::getBoundingBox(Point3D* min_p, Point3D* max_p)
00110 { computeStats(); *min_p = min, *max_p = max; }
00111
00112 inline Object* ObjectArray::getObject(int i)
00113 { return(objects_p[i]); }
00114
00115 inline Point3D ObjectArray::getCenter()
00116 { return( (min+max)/2.0 ); }
00117
00118 inline int ObjectArray::getNumScreens(void)
00119 {return numscreens;}
00120
00121 inline Screen* ObjectArray::getScreen(int i)
00122 {return (screens_p[i]);}
00123
00124 inline int ObjectArray::getNumGroups(void)
00125 { return numgroups;}
00126
00127 #endif