Page 1 sur 2

C vers PB : wrapping super chiant

Publié : ven. 16/janv./2009 22:47
par eddy
Je suis entrain de wrapper la librairie Chipmunk ( moteur physique 2D )
Et je me rends compte que l'importation sous PB est limité.

Je suis obligé de faire des MACROs de malade et de parser le code dans tous les sens pour utiliser une simple fonction C

Il faudrait étendre la fonctionnalité ImportC.

Re: C vers PB : wrapping super chiant

Publié : ven. 16/janv./2009 22:56
par beauregard
eddy a écrit :Je suis entrain de wrapper la librairie Chipmunk ( moteur physique 2D )
Et je me rends compte que l'importation sous PB est limité.

Je suis obligé de faire des MACROs de malade et de parser le code dans tous les sens pour utiliser une

Il faudrait étendre la fonctionnalité ImportC.
il y a quelques mois j'ai fait mumuse avec Chipmunk :)

Publié : ven. 16/janv./2009 23:11
par eddy
Je vais fournir une nouvelle version à partir de la 4.1.0
Parce que la précédente version n'était pas de moi.

Elle sera plus proche du code original.
Par contre je ne sais pas si elle va marcher pour les 64bits :roll:

Publié : ven. 16/janv./2009 23:12
par Anonyme
Comment tu importes ? via une lib une dll ?

Publié : ven. 16/janv./2009 23:30
par eddy
une lib
J'ai ajouté un projet PelleC pour le compiler.

Publié : ven. 16/janv./2009 23:54
par Anonyme
C'est très simple , pas besoin de te faire chier avec des macro 8O
Chipmunk est OO ?

Fait voir un bout de ton wrapp pb.

Publié : sam. 17/janv./2009 0:04
par eddy
non c'est du C
C'est surtout le passage des structures en paramètre qui alourdit mon code.

Code : Tout sélectionner

Macro CONST : : EndMacro ;/// Unsigned Int
Macro UINT : l : EndMacro ;/// Constant
Macro _void_POINTER : i : EndMacro
Macro _cpShape_POINTER : i : EndMacro
Macro PARAM_cpVect(ParamName) : ParamName#_x.f, ParamName#_y.f : EndMacro
Macro READ_cpVect(ParamName) : ParamName\x, ParamName\y : EndMacro

Structure cpVect
	x.f: y.f
EndStructure

CompilerIf 0
	Procedure._cpShape_POINTER cpPolyShapeNew (*body.cpBody, numVerts.i, *verts.cpVect, offset.cpVect):EndProcedure 
CompilerEndif 



ImportC "..\Chipmunk\Chipmunk.lib"
	PrototypeC cpSpaceBodyIterator (*body.cpBody, *datas)
	cpInitChipmunk ()
	cpMomentForCircle.f (m.f, r1.f, r2.f, PARAM_cpVect(offset))
	cpMomentForPoly.f (m.f, CONST numVerts.i, *verts.cpVect, PARAM_cpVect(offset))
	cpSegmentShapeNew._cpShape_POINTER (*body.cpBody, PARAM_cpVect(a), PARAM_cpVect(b), r.f)
	cpvforangle (*RESULT.cpVect, CONST a.f)

....
EndImportC

Publié : sam. 17/janv./2009 0:25
par Anonyme
Bon , tu t'alourdis pour rien.
tu n'est pas obliger d'avoir les structures de Chipmunk dans pb.
tu va me dire , oui , mais comment je manipule les éléments de structure ?
tu fait des fonctions en c que tu exportes.

ex :
extern "C"
{

__declspec(dllexport) MaClass * CreateBody()
{
MaClass *A = new MaClass;
return A;
}


}
Cette fonction bidon (qui est en c++) te retourne une classe , comment la récuperer en PB ? très simple :

Code : Tout sélectionner

ImportC :
CreateBody.i ()
endImport
le principe est le même pour du c. bosse avec des pointeurs. créer des Accesseurs en c pour modifier le contenu des strutures.


EDIT :


Pour les paramètres c'est la même chose :
extern "C"
{

__declspec(dllexport) void FreeBody(MaClass *body)
{
delete(body);
}


Code : Tout sélectionner

ImportC :
FreeBody (body.i)
endImport
}

Publié : sam. 17/janv./2009 0:31
par eddy
C'est pas la voie que j'ai choisi
car si je suis ton idée il faut que fasse un wrapper mais du côté C/C++ (ce qui me paraît plus compliqué)

Ah.. Je dois préciser que j'ai codé un générateur d'INCLUDE pour PB.
Je suis pas fou... Il y a trop de fonctions pr faire ça à la main. :)
Il mettra à jour le wrapper pour chaque update de chipmunk.

Publié : sam. 17/janv./2009 2:05
par KarLKoX
La solution proposée par Cpl.Bator est celle que j'utilise et je peux te dire que c'est la meilleure aussi bien en terme de maintenabilité que d'utilisation et c'est plus dans l'esprit lorsque l'on importe une bibliothèque.

Publié : sam. 17/janv./2009 2:18
par eddy
Vous avez des moulinettes pour faire vos wrapper ?
Parce que le problème est que je ne vais me taper toutes les fonctions et structures à la main.

Publié : sam. 17/janv./2009 10:38
par KarLKoX
J'en avais codé une pour FMOD mais pour les autres, je les ai codé à la main.

Publié : sam. 17/janv./2009 11:20
par Anonyme
Pareil comme les romains :D , après tu passes plus de temps à codé une moulinette que wrappé :D

Publié : sam. 17/janv./2009 13:03
par eddy
c bon de toute façon j'ai fini :)

Publié : sam. 17/janv./2009 13:10
par Anonyme
Tu t'es embêter a importé les fonctions avec les structures ?

du genre :

Code : Tout sélectionner

FreeTruc ( *Objet.Truc )