-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathephys.idl
363 lines (277 loc) · 9.49 KB
/
ephys.idl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
// spec: https://webidl.spec.whatwg.org/
// notes:
// - by default, objects are taken as pointers
// use [Value] to indicate the object itself
// - int is a long (32 bits)
// - use [NoDelete] for abstract classes as they do not have a destructor
//////// Math ////////
[Prefix="ephys::"]
interface Vec2 {
attribute float x;
attribute float y;
void Vec2();
void Vec2([Const] float x, [Const] float y);
void Vec2([Const, Ref] Vec2 x);
void set([Const] float x, [Const] float y);
float norm();
float norm2();
[Ref] Vec2 normalize();
[Operator="+=", Ref] Vec2 add([Const, Ref] Vec2 v);
[Operator="-=", Ref] Vec2 sub([Const, Ref] Vec2 v);
[Operator="*=", Ref] Vec2 mult(float k);
};
[Prefix="ephys::"]
interface Mat2 {
attribute float[] data;
void Mat2();
void Mat2(float d11, float d12,
float d21, float d22);
void Mat2([Const, Ref] Mat2 m);
[Value] static Mat2 zero();
[Value] static Mat2 identity();
float at(unsigned long m, unsigned long n);
void set(unsigned long m, unsigned long n, float val);
[Operator="+=", Ref] Mat2 add([Const, Ref] Mat2 m);
[Operator="-=", Ref] Mat2 sub([Const, Ref] Mat2 m);
[Operator="*=", Ref] Mat2 mult([Const, Ref] Mat2 m);
float determinant();
[Value] Mat2 inverse();
[Ref] Mat2 invert();
[Value] Mat2 transpose();
};
[Prefix="ephys::"]
interface Mat3 {
void Mat3();
void Mat3(float d11, float d12, float d13,
float d21, float d22, float d23);
void Mat3([Const, Ref] Mat3 m);
[Value] static Mat3 identity();
float at(unsigned long m, unsigned long n);
void set(unsigned long m, unsigned long n, float val);
float determinant();
[Value] Mat3 inverse();
[Ref] Mat3 invert();
};
//////// Collider Base Class ////////
[Prefix="ephys::", NoDelete]
interface Collider {
[Value] Vec2 origin();
Rigidbody getBody();
[Value] Mat3 getTransform();
[Value] Mat3 getInvTransform();
void setTransform([Const, Ref] Mat3 transform);
void setInvTransform([Const, Ref] Mat3 invTransform);
[Value] Vec2 collider2Object([Const, Ref] Vec2 v);
[Value] Vec2 object2Collider([Const, Ref] Vec2 v);
[Value] Vec2 rotCollider2Object([Const, Ref] Vec2 v);
[Value] Vec2 rotObject2Collider([Const, Ref] Vec2 v);
};
//////// Rigidbodies ////////
[Prefix="ephys::"]
interface Rigidbody {
void Rigidbody();
[Value] Vec2 getPos();
[Value] Vec2 getVel();
[Value] Vec2 getAcc();
float getAngle();
float getAngVel();
float getMass();
float getInvMass();
float getInertia();
float getInvInertia();
float getLinearDamping();
float getAngularDamping();
Collider getCollider();
float getRestitution();
[Value] Mat3 getTransform();
[Value] Mat3 getInvTransform();
boolean getStatic();
void setPos([Const, Ref] Vec2 pos);
void setVel([Const, Ref] Vec2 vel);
void setAcc([Const, Ref] Vec2 acc);
void setAngle(float angle);
void setAngVel(float angVel);
void setMass(float mass);
void setInvMass(float invMass);
void setInertia(float inertia);
void setInvInertia(float invInertia);
void setLinearDamping(float linearDamping);
void setAngularDamping(float angularDamping);
void setCollider([Ref] Collider collider);
void setRestitution(float restitution);
void setStatic(float isStatic);
[Value] Vec2 world2Local([Const, Ref] Vec2 pos);
[Value] Vec2 local2World([Const, Ref] Vec2 pos);
void addForce([Const, Ref] Vec2 force);
void addForceAt([Const, Ref] Vec2 force, [Const, Ref] Vec2 point);
void addForceAtLocal([Const, Ref] Vec2 force, [Const, Ref] Vec2 point);
void addTorque(float torque);
void clearAccums();
void step(float dt);
};
//////// Contacts ////////
[NoDelete]
interface ContactList {};
[Prefix="ephys::", NoDelete]
interface ContactGenerator {
[Ref] ContactList generateContacts();
};
//////// Collision ////////
[Prefix="ephys::"]
interface CircleCollider : Collider {
attribute float radius;
void CircleCollider(float radius, [Ref] Rigidbody body, [Const, Ref] optional Mat3 transform);
[Value] Vec2 origin();
Rigidbody getBody();
[Value] Mat3 getTransform();
[Value] Mat3 getInvTransform();
void setTransform([Const, Ref] Mat3 transform);
void setInvTransform([Const, Ref] Mat3 invTransform);
[Value] Vec2 collider2Object([Const, Ref] Vec2 v);
[Value] Vec2 object2Collider([Const, Ref] Vec2 v);
[Value] Vec2 rotCollider2Object([Const, Ref] Vec2 v);
[Value] Vec2 rotObject2Collider([Const, Ref] Vec2 v);
};
[Prefix="ephys::"]
interface BoxCollider : Collider {
[Value] attribute Vec2 halfSize;
void BoxCollider([Const, Ref] Vec2 halfSize, [Ref] Rigidbody body, [Const, Ref] optional Mat3 transform);
[Value] Vec2 origin();
Rigidbody getBody();
[Value] Mat3 getTransform();
[Value] Mat3 getInvTransform();
void setTransform([Const, Ref] Mat3 transform);
void setInvTransform([Const, Ref] Mat3 invTransform);
[Value] Vec2 collider2Object([Const, Ref] Vec2 v);
[Value] Vec2 object2Collider([Const, Ref] Vec2 v);
[Value] Vec2 rotCollider2Object([Const, Ref] Vec2 v);
[Value] Vec2 rotObject2Collider([Const, Ref] Vec2 v);
};
[Prefix="ephys::", NoDelete]
interface IntersectionDetector {
static boolean circleCircle([Const, Ref] CircleCollider c1, [Const, Ref] CircleCollider c2);
static boolean boxCircle([Const, Ref] BoxCollider bc, [Const, Ref] CircleCollider cc);
static boolean boxBox([Const, Ref] BoxCollider b1, [Const, Ref] BoxCollider b2);
};
//////// Force Generators ////////
[Prefix="ephys::", NoDelete]
interface ForceGenerator {
void updateForce([Ref] Rigidbody body, float dt);
};
[Prefix="ephys::"]
interface Gravity : ForceGenerator {
void Gravity([Const, Ref] Vec2 gravity);
void updateForce([Ref] Rigidbody body, float dt);
};
[Prefix="ephys::"]
interface Spring : ForceGenerator {
attribute float k;
attribute float length;
void Spring([Ref] Rigidbody end, [Const, Ref] Vec2 anchor, [Const, Ref] Vec2 endAnchor, float k, float length);
[Value] Rigidbody getEnd();
void setEnd([Const, Ref] Rigidbody body);
void updateForce([Ref] Rigidbody body, float dt);
};
//////// Physics World ////////
[Prefix="ephys::"]
interface World {
void World();
void addBody([Ref] Rigidbody body);
void removeBody([Ref] Rigidbody body);
void addFGen([Ref] ForceGenerator fgen, [Ref] Rigidbody body);
void removeFGen([Ref] ForceGenerator fgen, [Ref] Rigidbody body);
void addContactGen([Ref] ContactGenerator cgen);
void removeContactGen([Ref] ContactGenerator cgen);
void step(float dt);
};
//////// Particles ////////
[Prefix="ephys::"]
interface Particle {
void Particle(optional float mass, optional float damping);
[Value] Vec2 getPos();
[Value] Vec2 getVel();
[Value] Vec2 getAcc();
float getMass();
float getInvMass();
float getDamping();
void setPos([Const, Ref] Vec2 pos);
void setVel([Const, Ref] Vec2 vel);
void setAcc([Const, Ref] Vec2 acc);
void setMass(float mass);
void setInvMass(float mass);
void setDamping(float damping);
void addForce([Const, Ref] Vec2 force);
void addImpulse([Const, Ref] Vec2 impulse);
void clearForceAccum();
void setStatic();
boolean isStatic();
void step(float dt);
};
//////// Particle Force Generators ////////
[Prefix="ephys::", NoDelete]
interface ParticleForceGenerator {
void updateForce([Ref] Particle particle, float dt);
};
[Prefix="ephys::"]
interface ParticleGravity : ParticleForceGenerator {
void ParticleGravity([Const, Ref] Vec2 gravity);
void updateForce([Ref] Particle particle, float dt);
};
[Prefix="ephys::"]
interface ParticleDrag : ParticleForceGenerator {
void ParticleDrag(float k1, float k2);
void updateForce([Ref] Particle particle, float dt);
};
[Prefix="ephys::"]
interface ParticleSpring : ParticleForceGenerator {
attribute float k;
attribute float length;
void ParticleSpring([Ref] Particle end, float k, float length);
void setEnd([Const, Ref] Particle particle);
[Value] Particle getEnd();
void updateForce([Ref] Particle particle, float dt);
};
//////// Particle Contacts ////////
[NoDelete]
interface PContactList {};
[Prefix="ephys::", NoDelete]
interface ParticleContactGenerator {
[Ref] PContactList generateContacts();
};
//////// Particle Links ////////
[Prefix="ephys::", NoDelete]
interface ParticleLink : ParticleContactGenerator {
void setParticle(unsigned long index, [Ref] Particle particle);
[Ref] Particle getParticle(unsigned long index);
[Ref] PContactList generateContacts();
};
[Prefix="ephys::"]
interface ParticleCable : ParticleLink {
attribute float length;
attribute float restitution;
void ParticleCable(float length, float restitution);
void setParticle(unsigned long index, [Ref] Particle particle);
[Ref] Particle getParticle(unsigned long index);
[Ref] PContactList generateContacts();
};
[Prefix="ephys::"]
interface ParticleRod : ParticleLink {
attribute float length;
void ParticleRod(float length);
void setParticle(unsigned long index, [Ref] Particle particle);
[Ref] Particle getParticle(unsigned long index);
[Ref] PContactList generateContacts();
};
//////// Particle World ////////
[Prefix="ephys::"]
interface ParticleWorld {
void ParticleWorld(optional unsigned long iterations);
void addParticle([Ref] Particle particle);
void removeParticle([Ref] Particle particle);
void addPFGen([Ref] Particle particle, [Ref] ParticleForceGenerator fgen);
void removePFGen([Ref] Particle particle, [Ref] ParticleForceGenerator fgen);
void addPContactGenerator([Ref] ParticleContactGenerator pcg);
void removePContactGenerator([Ref] ParticleContactGenerator pcg);
[Ref] PContactList generateContacts();
void step(float dt);
};