2008-03-25 10:02:13 +00:00
|
|
|
|
|
|
|
#ifndef __DSC_H
|
|
|
|
#define __DSC_H
|
|
|
|
|
2008-04-08 12:54:53 +00:00
|
|
|
typedef unsigned __int64 QWORD;
|
2008-03-25 10:02:13 +00:00
|
|
|
typedef unsigned long DWORD;
|
|
|
|
typedef unsigned char BYTE;
|
|
|
|
|
2008-03-28 10:00:37 +00:00
|
|
|
class Vector {
|
|
|
|
public:
|
2008-03-25 10:02:13 +00:00
|
|
|
double x, y, z;
|
2008-03-27 09:53:51 +00:00
|
|
|
|
2008-04-01 10:48:44 +00:00
|
|
|
Vector Plus(Vector b);
|
|
|
|
Vector Minus(Vector b);
|
|
|
|
Vector Negated(void);
|
2008-03-27 09:53:51 +00:00
|
|
|
Vector Cross(Vector b);
|
2008-04-01 10:48:44 +00:00
|
|
|
double Dot(Vector b);
|
|
|
|
Vector Normal(int which);
|
2008-03-27 09:53:51 +00:00
|
|
|
Vector RotatedAbout(Vector axis, double theta);
|
|
|
|
double Magnitude(void);
|
|
|
|
Vector ScaledBy(double v);
|
|
|
|
|
2008-03-28 10:00:37 +00:00
|
|
|
};
|
2008-04-01 10:48:44 +00:00
|
|
|
void glVertex3v(Vector u);
|
|
|
|
|
2008-03-25 10:02:13 +00:00
|
|
|
|
2008-03-28 10:00:37 +00:00
|
|
|
class Point2d {
|
|
|
|
public:
|
2008-03-27 09:53:51 +00:00
|
|
|
double x, y;
|
2008-03-28 10:00:37 +00:00
|
|
|
};
|
2008-03-27 09:53:51 +00:00
|
|
|
|
2008-03-28 10:00:37 +00:00
|
|
|
template <class T, class H>
|
|
|
|
class IdList {
|
|
|
|
public:
|
2008-03-26 09:18:12 +00:00
|
|
|
typedef struct {
|
|
|
|
T v;
|
2008-03-28 10:00:37 +00:00
|
|
|
H h;
|
2008-03-26 09:18:12 +00:00
|
|
|
int tag;
|
|
|
|
} Elem;
|
|
|
|
|
2008-03-28 10:00:37 +00:00
|
|
|
Elem *elem;
|
2008-03-26 09:18:12 +00:00
|
|
|
int elems;
|
|
|
|
int elemsAllocated;
|
|
|
|
|
2008-04-08 12:54:53 +00:00
|
|
|
H AddAndAssignId(T *v) {
|
|
|
|
H ht;
|
|
|
|
ht.v = 0;
|
|
|
|
return AddAndAssignId(v, ht);
|
|
|
|
}
|
|
|
|
|
|
|
|
H AddAndAssignId(T *v, H ht) {
|
2008-03-28 10:00:37 +00:00
|
|
|
int i;
|
2008-04-08 12:54:53 +00:00
|
|
|
QWORD id = 0;
|
2008-03-28 10:00:37 +00:00
|
|
|
|
|
|
|
for(i = 0; i < elems; i++) {
|
2008-04-08 12:54:53 +00:00
|
|
|
id = max(id, (elem[i].h.v & 0xfff));
|
2008-03-28 10:00:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
H h;
|
2008-04-08 12:54:53 +00:00
|
|
|
h.v = (id + 1) | ht.v;
|
2008-03-28 10:00:37 +00:00
|
|
|
AddById(v, h);
|
2008-04-08 12:54:53 +00:00
|
|
|
|
|
|
|
return h;
|
2008-03-28 10:00:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void AddById(T *v, H h) {
|
|
|
|
if(elems >= elemsAllocated) {
|
|
|
|
elemsAllocated = (elemsAllocated + 32)*2;
|
|
|
|
elem = (Elem *)realloc(elem, elemsAllocated*sizeof(elem[0]));
|
|
|
|
if(!elem) oops();
|
|
|
|
}
|
|
|
|
|
|
|
|
elem[elems].v = *v;
|
|
|
|
elem[elems].h = h;
|
|
|
|
elem[elems].tag = 0;
|
|
|
|
elems++;
|
|
|
|
}
|
2008-04-08 12:54:53 +00:00
|
|
|
|
|
|
|
T *FindById(H h) {
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < elems; i++) {
|
|
|
|
if(elem[i].h.v == h.v) {
|
|
|
|
return &(elem[i].v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dbp("failed to look up item %16lx, searched %d items", h.v);
|
|
|
|
oops();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ClearTags(void) {
|
|
|
|
int i;
|
|
|
|
for(i = 0; i < elems; i++) {
|
|
|
|
elem[i].tag = 0;
|
|
|
|
}
|
|
|
|
}
|
2008-03-28 10:00:37 +00:00
|
|
|
|
|
|
|
void RemoveTagged(void) {
|
|
|
|
int src, dest;
|
|
|
|
dest = 0;
|
|
|
|
for(src = 0; src < elems; src++) {
|
|
|
|
if(elem[src].tag) {
|
|
|
|
// this item should be deleted
|
|
|
|
} else {
|
|
|
|
if(src != dest) {
|
|
|
|
elem[dest] = elem[src];
|
|
|
|
}
|
|
|
|
dest++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
elems = dest;
|
2008-04-08 12:54:53 +00:00
|
|
|
// and elemsAllocated is untouched, because we didn't resize
|
2008-03-28 10:00:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Clear(void) {
|
|
|
|
elemsAllocated = elems = 0;
|
|
|
|
if(elem) free(elem);
|
|
|
|
}
|
2008-03-26 09:18:12 +00:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2008-04-08 12:54:53 +00:00
|
|
|
class NameStr {
|
|
|
|
public:
|
|
|
|
char str[20];
|
|
|
|
|
|
|
|
inline void strcpy(char *in) {
|
|
|
|
memcpy(str, in, min(strlen(in)+1, sizeof(str)));
|
|
|
|
str[sizeof(str)-1] = '\0';
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2008-03-25 10:02:13 +00:00
|
|
|
#endif
|