Mercurial > projects > chipmunkd
diff trunk/chipmunkd/constraints/cpConstraint.d @ 4:7ebbd4d05553
initial commit
author | Extrawurst |
---|---|
date | Thu, 02 Dec 2010 02:11:26 +0100 |
parents | |
children | 707dd4e10c28 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/chipmunkd/constraints/cpConstraint.d Thu Dec 02 02:11:26 2010 +0100 @@ -0,0 +1,146 @@ + +// written in the D programming language + +module chipmunkd.constraints.cpConstraint; + +import chipmunkd.chipmunk; +import chipmunkd.chipmunk_types_h; +import chipmunkd.cpVect,chipmunkd.cpVect_h; +import chipmunkd.cpBody; + +alias void function(cpConstraint *constraint, cpFloat dt, cpFloat dt_inv) cpConstraintPreStepFunction; +alias void function(cpConstraint *constraint) cpConstraintApplyImpulseFunction; +alias cpFloat function(cpConstraint *constraint) cpConstraintGetImpulseFunction; + +struct cpConstraintClass { + cpConstraintPreStepFunction preStep; + cpConstraintApplyImpulseFunction applyImpulse; + cpConstraintGetImpulseFunction getImpulse; +} + + + +struct cpConstraint { + cpConstraintClass *klass; + + cpBody *a; + cpBody *b; + cpFloat maxForce; + cpFloat biasCoef; + cpFloat maxBias; + + cpDataPointer data; +} + +//#ifdef CP_USE_DEPRECATED_API_4 +//typedef cpConstraint cpJoint; +//#endif + +//void cpConstraintDestroy(cpConstraint *constraint); +//void cpConstraintFree(cpConstraint *constraint); + +static void +cpConstraintActivateBodies(cpConstraint *constraint) +{ + cpBody *a = constraint.a; if(a) cpBodyActivate(a); + cpBody *b = constraint.b; if(b) cpBodyActivate(b); +} + +static cpFloat +cpConstraintGetImpulse(cpConstraint *constraint) +{ + return constraint.klass.getImpulse(constraint); +} + +template cpConstraintCheckCast(string constraint, string _struct) +{ + enum cpConstraintCheckCast = + "assert("~constraint~".klass == "~_struct~"GetClass(), \"Constraint is not a "~_struct~"\");"; +} + +//#define cpConstraintCheckCast(constraint, struct) \ +// cpAssert(constraint->klass == struct##GetClass(), "Constraint is not a "#struct); + +template CP_DefineConstraintGetter(string _struct,string type,string member,string name) +{ + enum CP_DefineConstraintGetter = + "static "~type~" "~_struct~"Get"~name~"(cpConstraint *constraint){"~ + cpConstraintCheckCast!("constraint",_struct)~ + "cpConstraintActivateBodies(constraint);"~ + "return (cast("~_struct~"*)constraint)."~member~";"~ + "}"; +} + +//#define CP_DefineConstraintGetter(struct, type, member, name) \ +//static inline type \ +//struct##Get##name(const cpConstraint *constraint){ \ +// cpConstraintCheckCast(constraint, struct); \ +// return ((struct *)constraint)->member; \ +//} \ + +template CP_DefineConstraintSetter(string _struct,string type,string member,string name) +{ + enum CP_DefineConstraintSetter = + "static void "~_struct~"Set"~name~"(cpConstraint *constraint,"~type~" value){"~ + cpConstraintCheckCast!("constraint",_struct)~ + "cpConstraintActivateBodies(constraint);"~ + "(cast("~_struct~"*)constraint)."~member~" = value;"~ + "}"; +} + +//#define CP_DefineConstraintSetter(struct, type, member, name) \ +//static inline void \ +//struct##Set##name(cpConstraint *constraint, type value){ \ +// cpConstraintCheckCast(constraint, struct); \ +// cpConstraintActivateBodies(constraint); \ +// ((struct *)constraint)->member = value; \ +//} \ + +template CP_DefineConstraintProperty(string _struct,string type,string member,string name) +{ + enum CP_DefineConstraintProperty = + CP_DefineConstraintGetter!(_struct,type,member,name)~CP_DefineConstraintSetter!(_struct,type,member,name); + +} + +//#define CP_DefineConstraintProperty(struct, type, member, name) \ +//CP_DefineConstraintGetter(struct, type, member, name) \ +//CP_DefineConstraintSetter(struct, type, member, name) +//TODO: +//// Built in Joint types +public import chipmunkd.constraints.cpPinJoint; +//#include "cpSlideJoint.h" +public import chipmunkd.constraints.cpPivotJoint; +//#include "cpGrooveJoint.h" +public import chipmunkd.constraints.cpDampedSpring; +//#include "cpDampedRotarySpring.h" +//#include "cpRotaryLimitJoint.h" +//#include "cpRatchetJoint.h" +//#include "cpGearJoint.h" +//#include "cpSimpleMotor.h" + + +cpFloat cp_constraint_bias_coef = 0.1f; + +void cpConstraintDestroy(cpConstraint *constraint){} + +void +cpConstraintFree(cpConstraint *constraint) +{ + if(constraint){ + cpConstraintDestroy(constraint); + cpfree(constraint); + } +} + +void +cpConstraintInit(cpConstraint *constraint, /+const+/ cpConstraintClass *klass, cpBody *a, cpBody *b) +{ + constraint.klass = klass; + constraint.a = a; + constraint.b = b; + + constraint.maxForce = cast(cpFloat)INFINITY; + constraint.biasCoef = cp_constraint_bias_coef; + constraint.maxBias = cast(cpFloat)INFINITY; +}