annotate trunk/chipmunkd/chipmunk.d @ 13:c03a41d47b60

- finished all constraints properties - implemented cpAssertWarn the mixin way
author Extrawurst
date Fri, 03 Dec 2010 21:38:01 +0100
parents 7ebbd4d05553
children df4ebc8add66
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;
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
5
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
6 import std.stdio;
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
7 import std.string:format;
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
8 import std.conv:to;
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
9
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
10 void
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
11 cpMessage(string message, string condition, string file, int line, bool isError)
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
12 {
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
13 stderr.writeln(.format("%s:%s", isError ? "Aborting due to Chipmunk error" : "Chipmunk warning", message));
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
14 stderr.writeln(.format("\tFailed condition: %s", condition));
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
15 stderr.writeln(.format("\tSource: %s(%s)", file, line));
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
16
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
17 if(isError) {debug{assert(false);}else{asm{int 3;}}}
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
18 }
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20 debug
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 {
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
22 template cpAssertWarn(string _condition, string message,string _f = __FILE__,int _l=__LINE__)
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
23 {
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
24 enum cpAssertWarn = "if(!("~_condition~"))"~
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
25 "cpMessage(\""~message~"\",\""~_condition~"\",r\""~_f~"\","~to!string(_l)~",false);";
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
26 }
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 else
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 {
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
30 template cpAssertWarn(string _condition, string message,string _f = __FILE__,int _l=__LINE__)
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
31 {
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
32 enum cpAssertWarn = "";
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
33 }
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
36 //TODO
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 //#ifdef NDEBUG
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 // #define cpAssert(condition, message)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 //#else
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40 // #define cpAssert(condition, message) if(!(condition)) cpMessage(message, #condition, __FILE__, __LINE__, 1)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41 //#endif
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 //
13
c03a41d47b60 - finished all constraints properties
Extrawurst
parents: 4
diff changeset
43
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44 import chipmunkd.chipmunk_types_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 import core.stdc.stdlib;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 enum INFINITY = cpFloat.infinity;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49 // Maximum allocated size for various Chipmunk buffer sizes
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 enum CP_BUFFER_BYTES = (32*1024);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52 alias core.stdc.stdlib.malloc cpmalloc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 alias core.stdc.stdlib.calloc cpcalloc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54 alias core.stdc.stdlib.realloc cprealloc;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 alias core.stdc.stdlib.free cpfree;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 public import chipmunkd.cpVect_h,chipmunkd.cpVect;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58 public import chipmunkd.cpBB;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59 public import chipmunkd.cpArray;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60 public import chipmunkd.cpHashSet;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 public import chipmunkd.cpSpaceHash;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63 public import chipmunkd.cpBody;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 public import chipmunkd.cpShape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 public import chipmunkd.cpPolyShape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67 public import chipmunkd.cpArbiter;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 public import chipmunkd.cpCollision;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 public import chipmunkd.constraints.cpConstraint;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 //
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72 public import chipmunkd.cpSpace;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 public import chipmunkd.cpSpaceComponent;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74 public import chipmunkd.cpSpaceQuery;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 public import chipmunkd.cpSpaceStep;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 public import chipmunkd.chipmunk_types_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79 enum cpHashValue CP_HASH_COEF = cast(cpHashValue)(3344921057uL); // ulong to uint ??
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 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
81
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82 extern const char *cpVersionString;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 void cpInitChipmunk()
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 cpInitCollisionFuncs();
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 Calculate the moment of inertia for a circle.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 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
91 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 cpMomentForCircle(cpFloat m, cpFloat r1, cpFloat r2, cpVect offset)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95 return (1.0f/2.0f)*m*(r1*r1 + r2*r2) + m*cpvdot(offset, offset);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 Calculate the moment of inertia for a line segment.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 Beveling radius is not supported.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102 cpMomentForSegment(cpFloat m, cpVect a, cpVect b)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 cpFloat length = cpvlength(cpvsub(b, a));
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 cpVect offset = cpvmult(cpvadd(a, b), 1.0f/2.0f);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 return m*length*length/12.0f + m*cpvdot(offset, offset);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111 Calculate the moment of inertia for a solid polygon shape.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114 cpMomentForPoly(cpFloat m, const int numVerts, cpVect *verts, cpVect offset)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116 cpVect *tVerts = cast(cpVect *)cpcalloc(numVerts, cpVect.sizeof);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 for(int i=0; i<numVerts; i++)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 tVerts[i] = cpvadd(verts[i], offset);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 cpFloat sum1 = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 cpFloat sum2 = 0.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 for(int i=0; i<numVerts; i++){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123 cpVect v1 = tVerts[i];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 cpVect v2 = tVerts[(i+1)%numVerts];
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 cpFloat a = cpvcross(v2, v1);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 cpFloat b = cpvdot(v1, v1) + cpvdot(v1, v2) + cpvdot(v2, v2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
128
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
129 sum1 += a*b;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
130 sum2 += a;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
131 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
132
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
133 cpfree(tVerts);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
134 return (m*sum1)/(6.0f*sum2);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
135 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
136
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
137 /**
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
138 Calculate the moment of inertia for a solid box.
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
139 */
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
140 cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
141 cpMomentForBox(cpFloat m, cpFloat width, cpFloat height)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
142 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
143 return m*(width*width + height*height)/12.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
144 }