annotate trunk/chipmunkd/chipmunk.d @ 4:7ebbd4d05553

initial commit
author Extrawurst
date Thu, 02 Dec 2010 02:11:26 +0100
parents
children c03a41d47b60
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
1
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
2 // written in the D programming language
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
3
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
4 module chipmunkd.chipmunk;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
5 //#ifndef CHIPMUNK_HEADER
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
6 //#define CHIPMUNK_HEADER
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
7 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
8 //#ifdef __cplusplus
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
9 //extern "C" {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10 //#endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 //void cpMessage(const char *message, const char *condition, const char *file, int line, int isError);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13 //#ifdef NDEBUG
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 // #define cpAssertWarn(condition, message)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15 //#else
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 // #define cpAssertWarn(condition, message) if(!(condition)) cpMessage(message, #condition, __FILE__, __LINE__, 0)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 //#endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 debug
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 //TODO:
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22 //void cpAssertWarn(bool condition, string message){if(condition) cpMessage(message,condition,__FILE__,__LINE__, 0);}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 void cpAssertWarn(bool condition, string message){}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 else
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 void cpAssertWarn(bool condition, string message){}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 //#ifdef NDEBUG
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32 // #define cpAssert(condition, message)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 //#else
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 // #define cpAssert(condition, message) if(!(condition)) cpMessage(message, #condition, __FILE__, __LINE__, 1)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35 //#endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 import chipmunkd.chipmunk_types_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 import core.stdc.stdlib;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40 //#ifndef INFINITY
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41 // #ifdef _MSC_VER
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 // union MSVC_EVIL_FLOAT_HACK
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 // {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44 // unsigned __int8 Bytes[4];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 // float Value;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46 // };
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 // static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48 // #define INFINITY (INFINITY_HACK.Value)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49 // #endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51 // #ifdef __GNUC__
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52 // #define INFINITY (__builtin_inf())
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 // #endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 // #ifndef INFINITY
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 // #define INFINITY (1e1000)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 // #endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58 //#endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60 enum INFINITY = cpFloat.infinity;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 // Maximum allocated size for various Chipmunk buffer sizes
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63 enum CP_BUFFER_BYTES = (32*1024);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 alias core.stdc.stdlib.malloc cpmalloc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 alias core.stdc.stdlib.calloc cpcalloc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 alias core.stdc.stdlib.realloc cprealloc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 alias core.stdc.stdlib.free cpfree;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 public import chipmunkd.cpVect_h,chipmunkd.cpVect;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 public import chipmunkd.cpBB;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72 public import chipmunkd.cpArray;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 public import chipmunkd.cpHashSet;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74 public import chipmunkd.cpSpaceHash;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 public import chipmunkd.cpBody;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 public import chipmunkd.cpShape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 public import chipmunkd.cpPolyShape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 public import chipmunkd.cpArbiter;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 public import chipmunkd.cpCollision;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 public import chipmunkd.constraints.cpConstraint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 public import chipmunkd.cpSpace;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 public import chipmunkd.cpSpaceComponent;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 public import chipmunkd.cpSpaceQuery;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 public import chipmunkd.cpSpaceStep;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 public import chipmunkd.chipmunk_types_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 enum cpHashValue CP_HASH_COEF = cast(cpHashValue)(3344921057uL); // ulong to uint ??
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 static cpHashValue CP_HASH_PAIR(T)(T A, T B) {return (cast(cpHashValue)(A)*CP_HASH_COEF ^ cast(cpHashValue)(B)*CP_HASH_COEF);}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 cpMessage(string message, string condition, string file, int line, int isError)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 //TODO:
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 //fprintf(stderr, (isError ? "Aborting due to Chipmunk error: %s\n" : "Chipmunk warning: %s\n"), message);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100 //fprintf(stderr, "\tFailed condition: %s\n", condition);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 //fprintf(stderr, "\tSource:%s:%d\n", file, line);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 if(isError) abort();
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106 extern const char *cpVersionString;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 void cpInitChipmunk()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 cpInitCollisionFuncs();
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 Calculate the moment of inertia for a circle.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114 r1 and r2 are the inner and outer diameters. A solid circle has an inner diameter of 0.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 cpMomentForCircle(cpFloat m, cpFloat r1, cpFloat r2, cpVect offset)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119 return (1.0f/2.0f)*m*(r1*r1 + r2*r2) + m*cpvdot(offset, offset);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 Calculate the moment of inertia for a line segment.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123 Beveling radius is not supported.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 cpMomentForSegment(cpFloat m, cpVect a, cpVect b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
128 cpFloat length = cpvlength(cpvsub(b, a));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
129 cpVect offset = cpvmult(cpvadd(a, b), 1.0f/2.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
130
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
131 return m*length*length/12.0f + m*cpvdot(offset, offset);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
132 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
133
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
134 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
135 Calculate the moment of inertia for a solid polygon shape.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
136 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
137 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
138 cpMomentForPoly(cpFloat m, const int numVerts, cpVect *verts, cpVect offset)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
139 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
140 cpVect *tVerts = cast(cpVect *)cpcalloc(numVerts, cpVect.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
141 for(int i=0; i<numVerts; i++)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
142 tVerts[i] = cpvadd(verts[i], offset);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
143
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
144 cpFloat sum1 = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
145 cpFloat sum2 = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
146 for(int i=0; i<numVerts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
147 cpVect v1 = tVerts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
148 cpVect v2 = tVerts[(i+1)%numVerts];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
149
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
150 cpFloat a = cpvcross(v2, v1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
151 cpFloat b = cpvdot(v1, v1) + cpvdot(v1, v2) + cpvdot(v2, v2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
152
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
153 sum1 += a*b;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
154 sum2 += a;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
155 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
156
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
157 cpfree(tVerts);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
158 return (m*sum1)/(6.0f*sum2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
159 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
160
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
161 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
162 Calculate the moment of inertia for a solid box.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
163 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
164 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
165 cpMomentForBox(cpFloat m, cpFloat width, cpFloat height)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
166 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
167 return m*(width*width + height*height)/12.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
168 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
169
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
170 //#ifdef __cplusplus
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
171 //}
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
172 //#endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
173 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
174 //#endif