annotate trunk/tests/ChipmunkDemos/samples/MagnetsElectric.d @ 25:5497d518b428

fixed memory corruption bug
author Extrawurst
date Mon, 13 Dec 2010 02:31:53 +0100
parents af2f61a96318
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
1
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
2 // written in the D programming language
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4 module samples.MagnetsElectric;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6 import chipmunkd.chipmunk;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8 import samples.ChipmunkDemo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10 import std.math;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11 import core.stdc.string:strcmp;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 import core.stdc.stdio:sprintf;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 enum WIDTH = 600;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 enum HEIGHT = 400;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 enum SINGMAX = 10; // Maximum number of singularities per body
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 enum NMAG = 10; // Number of magnets
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 enum NCHG = 10; // Number of charged bodies
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 enum NMIX = 10; // Number of charged magnets
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 enum COU_MKS = 8.987551787e9; // Some physical constants
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 enum MAG_MKS = 1e-7;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 // Prototypes
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 alias void function(DataforForce* data)SingForceFunc;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 // Structures
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 // Singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 struct ActorSingularity{
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 // Number of singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 int Nsing;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 // Value of the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 cpFloat value[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 // Type of the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 char type[SINGMAX][100];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 // Global position of the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 cpVect Gpos[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 // Local position of the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 cpVect position[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 // Angle of the singularities measured in the body axes
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 cpFloat angle[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 // Angle of the singularities measured from x
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 cpFloat Gangle[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 // Force function
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 SingForceFunc force_func[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 // Force function
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 SingForceFunc torque_func[SINGMAX];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 alias ActorSingularity Sing;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 // Data for the force functions
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 struct DataforForce{
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 //Everything in global coordinates
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 // Position of the source
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 cpVect p0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 // Observed position
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 cpVect p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 // Relative position source-observed
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 cpVect relp;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 // distance, disntace^2, ditance ^3
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 cpFloat r[3];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 // angle of the source
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 cpFloat ang0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 // angle of the observed singularity
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 cpFloat ang;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 // Foce value
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 cpVect F;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 // Torque value
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 cpFloat T;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 alias DataforForce ForceData;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 // Global Varibales
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 // **** Forces ****** //
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 // Calculate the forces between two bodies. all this functions requieres
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 // a pointer to an structure with the necessary fields.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 // forces between charges
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 CoulombForce(ForceData* data){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 data.F=cpvmult(cpvnormalize(data.relp),COU_MKS/data.r[1]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 // forces between magnets
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 MagDipoleForce(ForceData* data){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 static cpFloat phi,alpha,beta,Fr,Fphi;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 // Angle of the relative position vector
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 phi=cpvtoangle(data.relp);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 alpha=data.ang0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 beta=data.ang;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 alpha =phi - alpha;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 beta = phi - beta;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 // Components in polar coordinates
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103 Fr=(2.0e0*cos(alpha)*cos(beta) - sin(alpha)*sin(beta));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 Fphi=sin(alpha+beta);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 // printf("%g %g %g %g %g\n",phi,alpha,beta,Fphi);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 // Cartesian coordinates
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 data.F=cpv(Fr*cos(phi)-Fphi*sin(phi),Fr*sin(phi)+Fphi*cos(phi));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 data.F=cpvmult(data.F,-3.e0*MAG_MKS/(data.r[1]*data.r[1]));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 MagDipoleTorque(ForceData* data){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 static cpFloat phi,alpha,beta;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116 phi=cpvtoangle(data.relp);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 alpha=data.ang0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 beta=data.ang;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119 alpha =phi - alpha;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 beta = phi - beta;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122 // Torque. Though we could use a component of F to save some space,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 // we use another variables for the sake of clarity.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 data.T=(MAG_MKS/data.r[2])*(3.0e0*cos(alpha)*sin(beta) + sin(alpha-beta));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 // ******* //
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129 // This function fills the data structure for the force functions
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 // The structure Sing has the information about the singularity (charge or magnet)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 FillForceData(Sing* source,int inds, Sing* obs,int indo, ForceData* data)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 // Global Position and orientation of the source singularity
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135 data.p0=source.Gpos[inds];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136 data.ang0=source.Gangle[inds];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
137
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
138 // Global Position and orientation of the observed singularity
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
139 data.p=obs.Gpos[indo];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
140 data.ang=obs.Gangle[indo];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
141
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
142 // Derived magnitudes
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
143 data.relp=cpvsub(data.p,data.p0); //Relative position
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
144 data.r[0]=cpvlength(data.relp); // Distance
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
145 data.r[1]=cpvlengthsq(data.relp); // Square Distance
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
146 data.r[2]=data.r[0]*data.r[1]; // Cubic distance
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
147
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
148 source.force_func[inds](data); // The value of the force
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
149 data.F= cpvmult(data.F,source.value[inds]*obs.value[indo]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
150 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
151
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
152 // Calculation of the interaction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
153 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
154 LRangeForceApply(cpBody *a, cpBody *b){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
155
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
156 Sing* aux = cast(Sing*)a.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
157 Sing* aux2 = cast(Sing*)b.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
158 cpVect delta;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
159 // General data needed to calculate interaction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
160 static ForceData fdata;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
161 fdata.F=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
162
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
163 // Calculate the forces between the charges of different bodies
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
164 for (int i=0; i<aux.Nsing; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
165 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
166 for (int j=0; j<aux2.Nsing; j++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
167 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
168 if(!strcmp(aux.type[i].ptr,aux2.type[j].ptr))
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
169 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
170 //printf("%s %s\n",aux.type[i],aux2.type[j]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
171 FillForceData (aux2,j,aux,i,&fdata);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
172
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
173 //Force applied to body A
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
174 delta=cpvsub(aux.Gpos[i], a.p);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
175 cpBodyApplyForce(a,fdata.F, delta);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
176
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
177 if(aux.torque_func[i] != null)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
178 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
179 //Torque on A
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
180 aux.torque_func[i](&fdata);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
181 a.t += aux.value[i]*aux2.value[j]*fdata.T;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
182
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
183 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
184 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
185 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
186 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
187 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
188
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
189 // function for the integration of the positions
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
190 // The following functions are variations to the starndrd integration in Chipmunk
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
191 // you can go ack to the standard ones by doing the appropiate changes.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
192 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
193 ChargedBodyUpdatePositionVerlet(cpBody *_body, cpFloat dt)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
194 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
195 // Long range interaction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
196 cpArray *bodies = space.bodies;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
197 static cpBody* B;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
198 Sing* aux=cast(Sing*)_body.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
199 Sing* aux2;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
200
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
201 // General data needed to calculate interaction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
202 static ForceData fdata;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
203 fdata.F=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
204
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
205 for(int i=0; i< bodies.num; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
206 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
207 B=cast(cpBody*)bodies.arr[i];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
208 aux2=cast(Sing*)B.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
209
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
210 if(B != _body)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
211 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
212 // Calculate the forces between the singularities of different bodies
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
213 LRangeForceApply(_body, B);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
214 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
215 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
216
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
217 cpVect dp = cpvmult(cpvadd(_body.v, _body.v_bias), dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
218 dp = cpvadd(dp,cpvmult(cpvmult(_body.f, _body.m_inv), 0.5e0*dt*dt));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
219 _body.p = cpvadd(_body.p, dp);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
220
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
221 cpBodySetAngle(_body, cast(float)(_body.a + (_body.w + _body.w_bias)*dt
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
222 + 0.5*_body.t*_body.i_inv*dt*dt));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
223
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
224 // Update position of the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
225 aux = cast(Sing*)_body.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
226 for (int i=0; i<aux.Nsing; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
227 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
228 aux.Gpos[i]=cpvadd(_body.p,cpvrotate(cpv(aux.position[i].x,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
229 aux.position[i].y), _body.rot));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
230 aux.Gangle[i]= aux.angle[i] + _body.a;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
231 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
232
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
233
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
234 _body.v_bias = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
235 _body.w_bias = 0.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
236 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
237
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
238 // function for the integration of the velocities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
239 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
240 ChargedBodyUpdateVelocityVerlet(cpBody *_body, cpVect gravity, cpFloat damping, cpFloat dt)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
241 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
242 _body.v = cpvadd(_body.v, cpvmult(cpvadd(gravity, cpvmult(_body.f, _body.m_inv)), 0.5e0*dt));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
243 _body.w = _body.w + _body.t*_body.i_inv*0.5e0*dt;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
244
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
245 _body.f = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
246 _body.t = 0.0e0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
247
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
248 // Long range interaction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
249 cpArray *bodies = space.bodies;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
250 static cpBody* B;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
251
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
252 // General data needed to calculate interaction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
253 static ForceData fdata;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
254 fdata.F=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
255
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
256 for(int i=0; i< bodies.num; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
257 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
258 B=cast(cpBody*)bodies.arr[i];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
259
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
260 if(B != _body)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
261 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
262 // Calculate the forces between the singularities of different bodies
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
263 LRangeForceApply(_body, B);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
264 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
265 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
266 _body.v = cpvadd(cpvmult(_body.v,damping), cpvmult(cpvadd(gravity, cpvmult(_body.f, _body.m_inv)), 0.5e0*dt));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
267 _body.w = _body.w*damping + _body.t*_body.i_inv*0.5e0*dt;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
268 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
269
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
270 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
271 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
272 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
273 enum int steps = 10;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
274 enum cpFloat dt = 1.0/60.0/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
275
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
276 cpArray *bodies = space.bodies;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
277
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
278 for(int i=0; i< bodies.num; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
279 cpBodyResetForces(cast(cpBody*)bodies.arr[i]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
280
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
281 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
282 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
283 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
284
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
285 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
286
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
287 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
288 make_mag(cpVect p, cpFloat ang, cpFloat mag)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
289 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
290 int nverts=6;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
291 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
292 cpv(-10,-10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
293 cpv(-10, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
294 cpv( 10, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
295 cpv( 15, 5),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
296 cpv( 15, -5),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
297 cpv( 10,-10)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
298 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
299
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
300 cpBody *_body = cpBodyNew(1.0, cpMomentForPoly(1.0f, nverts, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
301 _body.p = p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
302 _body.v = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
303 cpBodySetAngle(_body, ang);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
304 _body.w = 0.0e0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
305
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
306 // Load the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
307 Sing *magnet=cast(Sing*)cpmalloc(Sing.sizeof);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
308 magnet.Nsing=1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
309 magnet.value[0]=mag;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
310 sprintf(magnet.type[0].ptr,"magdipole");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
311
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
312 // The position and angle could be different form the one of the body
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
313 magnet.position[0]=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
314 magnet.Gpos[0]=cpvadd(p,magnet.position[0]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
315 magnet.angle[0]=0.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
316 magnet.Gangle[0]=ang;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
317
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
318 magnet.force_func[0]=&MagDipoleForce;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
319 magnet.torque_func[0]=&MagDipoleTorque;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
320
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
321 _body.data=magnet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
322
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
323 _body.position_func=&ChargedBodyUpdatePositionVerlet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
324 _body.velocity_func=&ChargedBodyUpdateVelocityVerlet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
325 cpSpaceAddBody(space, _body);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
326
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
327 cpShape *shape = cpPolyShapeNew(_body, nverts, verts.ptr, cpvzero);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
328 shape.e = 0.0; shape.u = 0.7;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
329 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
330 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
331
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
332 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
333 make_charged(cpVect p, cpFloat chg)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
334 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
335 int nverts=4;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
336 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
337 cpv(-10,-10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
338 cpv(-10, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
339 cpv( 10, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
340 cpv( 10,-10)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
341 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
342
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
343 cpBody *_body = cpBodyNew(1.0, cpMomentForPoly(1.0, nverts, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
344 _body.p = p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
345 _body.v = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
346 cpBodySetAngle(_body, 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
347 _body.w = 0.0e0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
348
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
349 // Load the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
350 Sing *charge=cast(Sing*)cpmalloc(Sing.sizeof);;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
351 charge.Nsing=1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
352 charge.value[0]=chg;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
353 sprintf(charge.type[0].ptr,"electrical\0");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
354
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
355 // The position and angle could be different form the one of the body
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
356 charge.position[0]=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
357 charge.Gpos[0]=cpvadd(p,charge.position[0]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
358 charge.Gangle[0]=0;
25
5497d518b428 fixed memory corruption bug
Extrawurst
parents: 16
diff changeset
359 charge.angle[0]=0.0f;
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
360
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
361 charge.force_func[0]=&CoulombForce;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
362 charge.torque_func[0]=null;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
363
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
364 _body.data=charge;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
365
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
366 _body.position_func=&ChargedBodyUpdatePositionVerlet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
367 _body.velocity_func=&ChargedBodyUpdateVelocityVerlet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
368 cpSpaceAddBody(space, _body);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
369
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
370 cpShape *shape = cpPolyShapeNew(_body, nverts, verts.ptr, cpvzero);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
371 shape.e = 0.0; shape.u = 0.7;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
372 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
373 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
374 void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
375 make_mix(cpVect p, cpFloat ang, cpFloat mag,cpFloat chg)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
376 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
377 int nverts=5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
378 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
379 cpv(-10,-10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
380 cpv(-10, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
381 cpv( 10, 10),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
382 cpv( 20, 0),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
383 cpv( 10,-10)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
384 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
385
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
386 cpBody *_body = cpBodyNew(1.0, cpMomentForPoly(1.0, nverts, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
387 _body.p = p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
388 _body.v = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
389 cpBodySetAngle(_body, ang);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
390 _body.w = 0.0e0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
391
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
392 // Load the singularities
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
393 Sing *mix=cast(Sing*)cpmalloc(Sing.sizeof);;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
394 mix.Nsing=2;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
395 mix.value[0]=mag;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
396 mix.value[1]=chg;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
397 sprintf(mix.type[0].ptr,"magdipole\0");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
398 sprintf(mix.type[1].ptr,"electrical\0");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
399
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
400 // The position and angle could be different form the one of the body
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
401 mix.position[0]=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
402 mix.Gpos[0]=cpvadd(p,mix.position[0]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
403 mix.position[1]=cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
404 mix.Gpos[1]=cpvadd(p,mix.position[1]);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
405 mix.Gangle[0]=ang;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
406 mix.Gangle[1]=ang;
25
5497d518b428 fixed memory corruption bug
Extrawurst
parents: 16
diff changeset
407 mix.angle[0]=0.0f;
5497d518b428 fixed memory corruption bug
Extrawurst
parents: 16
diff changeset
408 mix.angle[1]=0.0f;
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
409
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
410 mix.force_func[0]=&MagDipoleForce;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
411 mix.force_func[1]=&CoulombForce;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
412 mix.torque_func[0]=&MagDipoleTorque;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
413 mix.torque_func[1]=null;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
414
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
415 _body.data=mix;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
416
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
417 _body.position_func=&ChargedBodyUpdatePositionVerlet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
418 _body.velocity_func=&ChargedBodyUpdateVelocityVerlet;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
419 cpSpaceAddBody(space, _body);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
420
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
421 cpShape *shape = cpPolyShapeNew(_body, nverts, verts.ptr, cpvzero);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
422 shape.e = 0.0; shape.u = 0.7;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
423 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
424 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
425
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
426
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
427 static cpSpace*
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
428 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
429 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
430 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
431 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
432 space.iterations = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
433 space.gravity = cpvzero; //cpv(0,-100);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
434
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
435 cpSpaceResizeActiveHash(space, 30.0, 2999);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
436
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
437 // Screen border
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
438 /* shape = cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(-320,240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
439 shape.e = 1.0; shape.u = 1.0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
440 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
441
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
442 shape = cpSegmentShapeNew(staticBody, cpv(320,-240), cpv(320,240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
443 shape.e = 1.0; shape.u = 1.0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
444 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
445
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
446 shape = cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(320,-240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
447 shape.e = 1.0; shape.u = 1.0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
448 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
449
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
450 // Reference line
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
451 // Does not collide with other objects, we just want to draw it.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
452 shape = cpSegmentShapeNew(staticBody, cpv(-320,0), cpv(320,0), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
453 shape.collision_type = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
454 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
455 // Add a collision pair function to filter collisions
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
456 cpSpaceAddCollisionPairFunc(space, 0, 1, null, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
457 */
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
458
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
459 //srand(cast(uint) time(null));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
460 cpVect p;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
461 cpFloat ang;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
462
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
463 // Create magnets
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
464 for(int i=0; i<NMAG; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
465 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
466 p.x=(2.0e0*frand() - 1.0e0)*WIDTH/2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
467 p.y=(2.0e0*frand() - 1.0e0)*HEIGHT/2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
468 ang=(2.0e0*frand() - 1.0e0)*3.1415;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
469 make_mag(p, ang,1.0e7);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
470 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
471
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
472 // Create charged objects
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
473 for(int i=0; i<NCHG; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
474 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
475 p.x=(2.0e0*frand() - 1.0e0)*WIDTH/2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
476 p.y=(2.0e0*frand() - 1.0e0)*HEIGHT/2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
477 ang=(2.0e0*frand() - 1.0e0)*3.1415;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
478 make_charged(p,1.0e-3*pow(-1.0,i%2));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
479 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
480
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
481 // Create charged magnets objects
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
482 for(int i=0; i<NMIX; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
483 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
484 p.x=(2.0e0*frand() - 1.0e0)*WIDTH/2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
485 p.y=(2.0e0*frand() - 1.0e0)*HEIGHT/2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
486 ang=(2.0e0*frand() - 1.0e0)*3.1415;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
487 make_mix(p, ang,1.0e7*pow(-1.0,i%2), 1.0e-3*pow(-1.0,i%2));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
488 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
489
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
490 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
491 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
492
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
493 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
494 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
495 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
496 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
497 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
498 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
499
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
500 chipmunkDemo MagnetsElectric = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
501 "Magnets and Electric Charges (By: Juan Pablo Carbajal)",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
502 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
503 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
504 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
505 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
506 };