CHIPMUNK en bennu

Started by Prg, January 12, 2011, 04:27:44 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Prg

Chipmunk Bennu (mod_chipmunk)

aquí un video con lo que se puede lograr

http://www.youtube.com/watch?v=z_Sx9N39KHk&feature=player_embedded

abajo un ejemplo que he hecho en bennu (la librería y las pocas funciones que ya he puesto, corriendo en bennu).

Ahora las malas noticias:

¿alguien quiere ayudarme a pasar las funciones a bennu?

¿alguien sabe usar la librería, que tenga algunos ejemplos por ahí?


algunas dudas:

veo que existe un tipo de TYPE_STRUCT para el retorno de funciones en bennu, esto no funciona, o si?

las otras ya se me olvidaron XD... luego las pongo..

la licencia de esta librería parece adecuada para bennu,

QuoteCopyright (c) 2007 Scott Lembcke and Howling Moon Software

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Ejemplos y última versión:

última versión (1.61), adapta la versión 6.1.3 de Chipmunk
http://www.mediafire.com/?5uadq5zljhurzqv

saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Noivern

Esto sería genial para aprovechar el g-sensor de la caanoo :baba: ^¬^

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

Quote from: SplinterGU on January 12, 2011, 06:08:03 PM
fantastico prg...

oye, y sobre las dudas?
Quote
algunas dudas:

veo que existe un tipo dato de retorno llamdo  TYPE_STRUCT para el retorno de funciones en bennu, esto no funciona, o si?
chipmunk usa callbacks ¿esto se podría poner al alcance del código bennu?, ¿existe alguna forma?

seguramente tu puedes darme una buena orientación en eso
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

como retorno no, pero podes pasar un puntero a la estructura que tenes desde la funcion invocadora y llenarlo desde la funcion llamada.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

Quote from: SplinterGU on January 12, 2011, 08:18:59 PM
como retorno no, pero podes pasar un puntero a la estructura que tenes desde la funcion invocadora y llenarlo desde la funcion llamada.

ok, gracias. Me imaginé  :-[

bueno, seguiré con la librerías

saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

prg, el ejemplo esta fantastico, estaria bueno intergrarlo mas nativamente, y que no necesites tener que poner

x = vect.x

y cosas asi.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

Quote from: SplinterGU on January 12, 2011, 08:38:19 PM
prg, el ejemplo esta fantastico, estaria bueno intergrarlo mas nativamente, y que no necesites tener que poner

x = vect.x

y cosas asi.

si, sin lugar a dudas, pero no conozco cómo hacerlo.

hay alguna fuente con información al respecto?

seguiré pasando las funciones a bennu, nunca sobran las funciones nativas (intento mantener el api original lo más posible, exceptuando lo que no se puede por compatibilidad con bennu), si además se logra integrarlo más nativamente, sería genial

además chipmunk corre en psp y iphone, lo que quiere decir que se podría usar en las consolas en las que bennu está presente... teóricamente se podría...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

desconozco el api chipmunk, como para recomendarte adecuadamente... la idea seria un callback que modifique directo las variables del proceso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

ok, como lo que estaba haciendo windgate para bennu 3d?

bueno, puedo experimentar...

saludos :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

josebita

Felicidades y ánimo. La licencia parece una BSD normalilla, así que yo diría que sí es compatible con la GPL de bennu.

Prg

#11
bueno, hasta el día de hoy ya tenemos todas estas funciones en bennu

   //Inicialización
   {"CPINITCHIPMUNK" , "",   TYPE_INT, modcpInitChipmunk},

   //Funciones matemáticas
   {"CPFLERP" , "FFF",   TYPE_FLOAT, modcpflerp},
   {"CPFCLAMP" , "FFF",   TYPE_FLOAT, modcpfclamp},
   {"CPFLERPCONST" , "FFF",   TYPE_FLOAT, modcpflerpconst},
   //{"CPV" , "FF",TYPE_, modcpv},

   //OPERACIONES CON VECTORES
   {"CPVEQL" , "PP",   TYPE_INT, modcpveql},
   {"CPVADD" , "PPP",   TYPE_INT, modcpvadd},
   {"CPVSUB" , "PPP",   TYPE_INT, modcpvsub},
   {"CPVNEG" , "PP",   TYPE_INT, modcpvneg},
   {"CPVMULT" , "PFP",   TYPE_INT, modcpvmult},
   {"CPVPERP" , "PP",   TYPE_INT, modcpvperp},
   {"CPVRPERP" , "PP",   TYPE_INT, modcpvrperp},
   {"CPVNORMALIZE" , "PP",   TYPE_INT, modcpvnormalize},
   {"CPVNORMALIZE_SAFE" , "PP",   TYPE_INT, modcpvnormalize_safe},
   {"CPVPROJECT" , "PPP",   TYPE_INT, modcpvproject},
   {"CPVROTATE" , "PPP",   TYPE_INT, modcpvrotate},
   {"CPVUNROTATE" , "PPP",   TYPE_INT, modcpvunrotate},
   {"CPVFORANGLE" , "FP",   TYPE_INT, modcpvforangle},
   {"CPVCLAMP" , "PFP",   TYPE_INT, modcpvclamp},
   {"CPVNORMALIZE" , "P",   TYPE_INT, modcpvnormalize},
   {"CPVLERP" , "PPFP",   TYPE_INT, modcpvlerp},
   {"CPVLERPCONST" , "PPFP",   TYPE_INT, modcpvlerpconst},
   {"CPVSLERP" , "PPFP",   TYPE_INT, modcpvslerp},
   {"CPVSLERPCONST" , "PPFP",   TYPE_INT, modcpvslerpconst},
   {"CPVNEAR" , "PPF",   TYPE_INT, modcpvnear},

   {"CPVDOT" , "PP",   TYPE_FLOAT, modcpvdot},
   {"CPVCROSS" , "PP",   TYPE_FLOAT, modcpvcross},
   {"CPVLENGTH" , "P",   TYPE_FLOAT, modcpvlength},
   {"CPVLENGTHSQ" , "P",   TYPE_FLOAT, modcpvlengthsq},
   {"CPVTOANGLE" , "P",   TYPE_FLOAT, modcpvtoangle},
   {"CPVDISTSQ" , "PP",   TYPE_FLOAT, modcpvdistsq},
   {"CPVDIST" , "PP",   TYPE_FLOAT, modcpvdist},

   {"CPVSTR" , "P",   TYPE_STRING, modcpvstr},


   //cpBB
   {"CPBBWRAPVECT" , "PPP",   TYPE_INT, modcpBBWrapVect},
   {"CPBBCLAMPVECT" , "PPP",   TYPE_INT, modcpBBClampVect},
   {"CPBBEXPAND" , "PPP",   TYPE_INT, modcpBBexpand},
   {"CPBBCONTAINSVECT" , "PP",   TYPE_INT, modcpBBcontainsVect},
   {"CPBBMERGE" , "PPP",   TYPE_INT, modcpBBmerge},
   {"CPBBCONTAINSBB" , "PP",   TYPE_INT, modcpBBcontainsBB},
   {"CPBBINTERSECTS" , "PP",   TYPE_INT, modcpBBintersects},
   {"CPBBNEW" , "FFFFP",   TYPE_INT, modcpBBNew},



   //cpBody
   {"DEFCPBODYP" , "IIP",   TYPE_INT, modDefcpBody},
   {"DEFCPBODYF" , "IIF",   TYPE_INT, modDefcpBody},
   {"DEFCPBODYI" , "III",   TYPE_INT, modDefcpBody},
   {"CPBODYNEW" , "PF",   TYPE_INT, modcpBodyNew},
   {"CPBODYNEW" , "P",   TYPE_INT, modcpBodyNewInfinity},
   {"CPBODYNEW" , "",   TYPE_INT, modcpBodyNewInfinityInf},
   {"GETBODY" , "P",   TYPE_INT, modgetBody},
   {"CPBODYLOCAL2WORLD" , "PPP",   TYPE_INT, modcpBodyLocal2World},
   {"MODGETECPBODY" , "II",   TYPE_FLOAT, modGetEcpBody},
   {"MODGETECPBODY" , "IIP",   TYPE_INT, modGetEcpBody},
   {"CPBODYALLOC" , "",   TYPE_INT, modcpBodyAlloc},
   {"CPBODYINIT" , "IFF",   TYPE_INT, modcpBodyInit},
   {"CPBODYDESTROY" , "I",   TYPE_INT, modcpBodyDestroy},
   {"CPBODYFREE" , "I",   TYPE_INT, modcpBodyFree},
   {"CPBODYINITSTATIC" , "I",   TYPE_INT, modcpBodyInitStatic},
   {"CPBODYNEWSTATIC" , "",   TYPE_INT, modcpBodyNewStatic},
   {"CPMOMENTFORCIRCLE" , "FFFP",   TYPE_FLOAT, modcpMomentForCircle},
   {"CPMOMENTFORSEGMENT" , "FPP",   TYPE_FLOAT, modcpMomentForSegment},
   {"CPMOMENTFORPOLY" , "FIPP",   TYPE_FLOAT, modcpMomentForPoly},
   {"CPMOMENTFORBOX" , "FFF",   TYPE_FLOAT, modcpMomentForBox},
   {"CPAREAFORCIRCLE" , "FF",   TYPE_FLOAT, modcpAreaForCircle},
   {"CPAREAFORSEGMENT" , "PPF",   TYPE_FLOAT, modcpAreaForSegment},
   {"CPAREAFORPOLY" , "IP",   TYPE_FLOAT, modcpAreaForPoly},
   {"CPBODYSETMASS" , "IF",   TYPE_INT, modcpBodySetMass},
   {"CPBODYSETMOMENT" , "IF",   TYPE_INT, modcpBodySetMoment},
   {"CPBODYSETANGLE" , "IF",   TYPE_INT, modcpBodySetAngle},
   {"CPBODYUPDATEPOSITION" , "IF",   TYPE_INT, modcpBodyUpdatePosition},
   {"CPBODYRESETFORCES" , "I",   TYPE_INT, modcpBodyResetForces},
   {"CPBODYISSLEEPING" , "I",   TYPE_INT, modcpBodyIsSleeping},
   {"CPBODYSLEEP" , "I",   TYPE_INT, modcpBodySleep},
   {"CPBODYACTIVATE" , "I",   TYPE_INT, modcpBodyActivate},
   {"CPBODYISSTATIC" , "I",   TYPE_INT, modcpBodyIsStatic},
   {"CPBODYISROGUE" , "I",   TYPE_INT, modcpBodyIsRogue},
   {"CPBODYSLEEPWITHGROUP" , "II",   TYPE_INT, modcpBodySleepWithGroup},
   {"CPBODYAPPLYFORCE" , "IPP",   TYPE_INT, modcpBodyApplyForce},
   {"CPBODYAPPLYIMPULSE" , "IPP",   TYPE_INT, modcpBodyApplyImpulse},
   {"CPBODYWORLD2LOCAL" , "IPP",   TYPE_INT, modcpBodyWorld2Local},
   {"CPBODYSLEW" , "IPF",   TYPE_INT, modcpBodySlew},
   {"CPBODYUPDATEVELOCITY" , "IPFF",   TYPE_INT, modcpBodyUpdateVelocity},


   //cpShape
   {"CPSEGMENTSHAPENEW" , "PPPF",   TYPE_INT, modcpSegmentShapeNew},
   {"DEFCPSHAPEI" , "III",   TYPE_INT, modDefcpShape},
   {"DEFCPSHAPEF" , "IIF",   TYPE_INT, modDefcpShape},
   {"DEFCPSHAPEP" , "IIP",   TYPE_INT, modDefcpShape},
   {"CPPOLYSHAPEGETVERT" , "PIP",   TYPE_INT, modcpPolyShapeGetVert},
   {"CPPOLYSHAPENEW" , "IIPP", TYPE_INT, modcpPolyShapeNew},
   {"CPCIRCLESHAPENEW" , "IFP", TYPE_INT, modcpCircleShapeNew},
   {"CPSEGMENTSHAPEINIT" , "IIPPF",   TYPE_INT, cpSegmentShapeInit},
   {"CPCIRCLESHAPEINIT" , "IIFP",   TYPE_INT, modcpCircleShapeInit},
   {"CPPOLYSHAPEINIT" , "IIIPP",   TYPE_INT, modcpPolyShapeInit},
   {"CPRECENTERPOLY" , "IP",   TYPE_INT, modcpRecenterPoly},
   {"CPCENTROIDFORPOLY" , "IPP",   TYPE_INT, modcpCentroidForPoly},
   {"CPSEGMENTSHAPEGETRADIUS" , "I",   TYPE_FLOAT, modcpSegmentShapeGetRadius},
   {"CPCIRCLESHAPEGETRADIUS" , "I",   TYPE_FLOAT, modcpCircleShapeGetRadius},
   {"CPSEGMENTSHAPEGETNORMAL" , "IP",   TYPE_INT, modcpSegmentShapeGetNormal},
   {"CPCIRCLESHAPEGETOFFSET" , "IP",   TYPE_INT, modcpCircleShapeGetOffset},
   {"CPSEGMENTSHAPEGETA" , "IP",   TYPE_INT, modcpSegmentShapeGetA},
   {"CPPOLYSHAPEALLOC" , "",   TYPE_INT, modcpPolyShapeAlloc},
   {"CPSEGMENTSHAPEALLOC" , "",   TYPE_INT, modcpSegmentShapeAlloc},
   {"CPCIRCLESHAPEALLOC" , "",   TYPE_INT, modcpCircleShapeAlloc},
   {"CPPOLYSHAPEGETNUMVERTS" , "I",   TYPE_INT, modcpPolyShapeGetNumVerts},
   {"CPSHAPECACHEBB" , "I",   TYPE_INT, modcpShapeCacheBB},
   {"CPRESETSHAPEIDCOUNTER" , "",   TYPE_INT, modcpResetShapeIdCounter},
   {"MODCPSHAPEFREE" , "I",   TYPE_INT, modcpShapeFree},
   {"CPSHAPEDESTROY" , "I",   TYPE_INT, modcpShapeDestroy},

   //cpSpace
   {"CPSPACEALLOC" , "",   TYPE_INT, modcpSpaceAlloc},
   {"CPSPACEINIT" , "P",   TYPE_INT, modcpSpaceInit},
   {"CPSPACEFREECHILDREN" , "P",   TYPE_INT, modcpSpaceFreeChildren},
   {"CPSPACEDESTROY" , "P",   TYPE_INT, modcpSpaceDestroy},
   {"CPSPACENEW" , "",   TYPE_INT, modcpSpaceNew},
   {"CPSPACEFREE" , "P",   TYPE_INT, modcpSpaceFree},
   {"DEFSPACEF" , "PIF",   TYPE_INT, modDefSpace},
   {"DEFSPACEI" , "PII",   TYPE_INT, modDefSpace},
   {"DEFSPACEP" , "PIP",   TYPE_INT, modDefSpace},
   {"CPSPACEADDSHAPE" , "II",   TYPE_INT, modcpSpaceAddShape},
   {"CPSPACEADDSTATICSHAPE" , "II",   TYPE_INT, modcpSpaceAddStaticShape},
   {"CPSPACEADDBODY" , "PP",   TYPE_INT, modcpSpaceAddBody},
   {"CPSPACESTEP" , "PF",   TYPE_INT, modcpSpaceStep},
   {"CPSPACEREHASHSTATIC" , "I",   TYPE_INT, modcpSpaceRehashStatic},
   {"CPSPACEREHASHSHAPE" , "II",   TYPE_INT, modcpSpaceRehashShape},

que funcionen adecuadamente es otra cosa XD

he modificado el ejemplo y le he agregado giro a la barra, y movimiento a la pelota, por si alguien quiere probar

el ejemplo se encuentre en la descarga del primer mensaje.

si todo va bien, quizá en una semana más tengamos toda la api en bennu... ojala!!  (queda como la mitad).

lo de la mayor integración con bennu lo vemos luego, cuando conozca un poco más la librería para ver cómo hacerlo. saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

muchas gracias!

Tremendo karma has ganado!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

lo probe, hay algo que no me gusta...

cuando la pelota esta sobre la barra, si vas girando la barra, llega un momento que la pelota atraviesa la barra, es como que no se actualiza muy rapido el tema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

#14
también lo ví.

según lo que he leído hay varios detallitos:

-los objetos se deben mover (preferentemente) aplicándoles fuerzas, de lo contrario pueden pasar cosas como las que observamos
-para mejorar la respuesta del motor hay que aumentar el número de iteraciones (la librería itera para encontrar la posición de los objetos), y también está una función que permite variar cómo la librería va


el api dice lo siguiente sobre moverlos (supongo que también se aplica al rotarlos)

   * Use forces to modify the rigid bodies if possible. This will be the most stable.
   * Modifying a body's velocity shouldn't necessarily be avoided, but applying large changes every frame can cause strange results in the simulation. Experiment freely, but be warned.
   * Don't modify a body's position every step unless you really know what you are doing. Otherwise you're likely to get the position/velocity badly out of sync.

y sobre la calidad de la simulación también está esto:

The number of iterations, and the size of the time step determine the quality of the simulation. More iterations, or smaller time steps increase the quality. Keep in mind that higher quality also means higher CPU usage.

también estoy rotando un objeto que se difinió como estático, no se si eso también afecte...

No conozco la librería mucho (de hecho poco), habrá que investigarse el tema mejor.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)