Mercurial > projects > chipmunkd
view trunk/chipmunkd/constraints/cpConstraint.d @ 6:707dd4e10c28
ported rest of the constraints (chipmunk 5.3.2)
author | Extrawurst |
---|---|
date | Thu, 02 Dec 2010 22:26:04 +0100 |
parents | 7ebbd4d05553 |
children | c03a41d47b60 |
line wrap: on
line source
// 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; public import chipmunkd.constraints.cpSlideJoint; public import chipmunkd.constraints.cpPivotJoint; public import chipmunkd.constraints.cpGrooveJoint; public import chipmunkd.constraints.cpDampedSpring; public import chipmunkd.constraints.cpDampedRotarySpring; public import chipmunkd.constraints.cpRotaryLimitJoint; public import chipmunkd.constraints.cpRatchetJoint; public import chipmunkd.constraints.cpGearJoint; public import chipmunkd.constraints.cpSimpleMotor; 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; }