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.

SplinterGU

ok, en un ratito te lo paso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#46
ummm...

al codigo que pusiste le falta... no puedo modificarlo si no se como lo vas a usar desde C...

intentare explicar...

vos declaras en C

int space;                      //que se pueda modificar desde bennu y desde aquí
float gravity_X;                //que se pueda modificar desde bennu y desde aquí
float gravity_Y;                //que se pueda modificar desde bennu y desde aquí
float bias_coef;                //que se pueda modificar desde bennu y desde aquí
float collision_slop;           //que se pueda modificar desde bennu y desde aquí
float contact_persistence;      //que se pueda modificar desde bennu y desde aquí

necesito el codigo en C donde lo vas a usar, por ejemplo...

int lala()
{
blah = gravity_x;
bleh = collision_slop;
}

necesito el codigo ya usando las variables, porque todo se basa en que no se declararan mas en C, y para acceder a estas variables desde C vas a tener que usar GLODWORD o la que dependa del tipo a accesar.

no se si me explico.

si vos solo me declaras las variables, no voy a poder ayudarte mucho porque voy a meter un cambio a medias, y lo mas complicado no lo voy a poder meter.

ademas, obviamente saber, cuales de esas variables seran globales y cuales locales
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

inicia en la linea 2715.

puse las variables y las funciones.

puedo usar el free de c para memoria reservada desde bennu vd? no habrá problemas de compatibilidad luego?
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

no hay problema con eso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

jejeje... no me logro explicar, porque ahora las declaraciones las volaste, supongo que siguen las mismas declaraciones, pero las usas en la ultima funcion...

bueno, voy a hacer lo que entiendo queres hacer...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

prg, me tenes en MSN o GMAIL?

hay un problema, si ya tenes las variables definidas en bennugd, no necesitas copiarlas a datos C, la podes usar directamente, veo que algunas variables, solo le das el uso de copiarla.

me gustaria verlo por msn o algo, asi lo resolvemos rapido,.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

hacemos mas facil... aca te pego la porcion de codigo desde las lineas que mencionaste... para mi, la funcion Update, asi como esta, carece de sentido... las variables las podes acceder directamente, con los defines que puse yo... no necesitas copiarlas a otras variables C, a menos claro que la fisica se ejecute en un thread y usen directamente las variables que estas llenando...

bueno, la porcion de codigo es esta, la update no la modique, porque no le veo sentido... y en el global_def te puse como accedes a las variables asi sea para escribirlas como para leerlas, por ejemplo para modificar gravity_x, haces lo siguiente:

*(FLOAT *)GLOADDR(libchipmunk,GLO_GRAVITY_X)) = 0.0;

para leerla

float_var = *(FLOAT *)GLOADDR(libchipmunk,GLO_GRAVITY_X));


//el uso est[a abajo
//int space;                 que se pueda modificar desde bennu y desde aquí
//float gravity_X;                //que se pueda modificar desde bennu y desde aquí
//float gravity_Y;                //que se pueda modificar desde bennu y desde aquí
//float bias_coef;                //que se pueda modificar desde bennu y desde aquí
//float collision_slop;           //que se pueda modificar desde bennu y desde aquí
//float contact_persistence;      //que se pueda modificar desde bennu y desde aquí

//int space;    //--------------Esta variable hay que ponerla en global

char * __bgdexport( libchipmunk, globals_def ) =
"int space;"                                                        /* Access and set with GLODWORD(libchipmunk,GLO_SPACE) */
"float gravity_X;"                                                  /* Access and set with *(FLOAT *)GLOADDR(libchipmunk,GLO_GRAVITY_X)) */
"float gravity_Y;"                                                  /* Access and set with *(FLOAT *)GLOADDR(libchipmunk,GLO_GRAVITY_Y)) */
"float bias_coef;"                                                  /* Access and set with *(FLOAT *)GLOADDR(libchipmunk,GLO_BIAS_COEF)) */
"float collision_slop;"                                             /* Access and set with *(FLOAT *)GLOADDR(libchipmunk,GLO_COLLISION_SLOP)) */
"float contact_persistence;"                                        /* Access and set with *(FLOAT *)GLOADDR(libchipmunk,GLO_CONTACT_PERSISTENCE)) */
;

DLVARFIXUP __bgdexport( libchipmunk, globals_fixup )[] =
{
{ "space", NULL, -1, -1 },
{ "gravity_X", NULL, -1, -1 },
{ "gravity_Y", NULL, -1, -1 },
{ "bias_coef", NULL, -1, -1 },
{ "collision_slop", NULL, -1, -1 },
{ "contact_persistence", NULL, -1, -1 },
{ NULL, NULL, -1, -1 }
};

#define GLO_SPACE                   0
#define GLO_GRAVITY_X               1
#define GLO_GRAVITY_Y               2
#define GLO_BIAS_COEF               3
#define GLO_COLLISION_SLOP          4
#define GLO_CONTACT_PERSISTENCE     5


static void  addDampedSpring(int id2,int id3,float x1,float y1, float x2,float y2,float x3,float y3,float z3){//la he tomado de mi codigo bennu, todavía hay que acomodar los parámetros. id2 e id3 son ids de procesos
int b1,b2;
cpConstraint z;
    cpSpace * espacio = GLODWORD(libchipmunk, GLO_SPACE );
if (id2<>0)
b1=id2.body;
else
b1 = espacio->staticBody;

if (id3<>0)
b2=id3.body;
else
b2 = espacio->staticBody;

cpSpaceAddConstraint(espacio, z=cpDampedSpringNew(b1,b2,cpv(x1,y1),cpv(x2,y2),x3,y3,z3));
addConstr(z);
return z;
}

static void updatePhisc(){
    cpSpace * espacio = space;
    espacio->gravity.x=gravity_X;
    espacio->gravity.y=gravity_Y;
    cp_bias_coef=bias_coef;
    cp_collision_slop=collision_slop;
    cp_contact_persistence=contact_persistence;

}

void __bgdexport( libchipmunk, module_initialize )()
{
    cpInitChipmunk();
    GLODWORD(libchipmunk, GLO_SPACE ) = (int)cpSpaceNew();
cpSpaceInit(GLODWORD(libchipmunk, GLO_SPACE ));
//printf("%d\n",space234);
}


void __bgdexport( libchipmunk, module_finalize )()
{
    cpSpaceFreeChildren(GLODWORD(libchipmunk, GLO_SPACE ));
    cpSpaceFree(GLODWORD(libchipmunk, GLO_SPACE ));
  //  printf("Descargado");
}

HOOK __bgdexport (libwm , handler_hooks ) [] =
{
( 4700 , updatePhisc ),
( 0 , null ),
}


todas las variables son globales? no hay ninguna local a los procesos?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

lo del update es porque chipmunk usa internamente doubles, y tengo que hacer el vaciado de los floats a los doubles.

permíteme asimilar lo que has puesto y ponerlo a funcionar en bennu :)

una duda:

en
[code language="bennu"]static void  addDampedSpring(int id2,int id3,float x1,float y1, float x2,float y2,float x3,float y3,float z3){//la he tomado de mi codigo bennu, todavía hay que acomodar los parámetros. id2 e id3 son ids de procesos
int   b1,b2;
   cpConstraint z;
    cpSpace * espacio = GLODWORD(libchipmunk, GLO_SPACE );
   if (id2<>0)
      b1=id2.body;
   else
      b1 = espacio->staticBody;

   if (id3<>0)
      b2=id3.body;
   else
      b2 = espacio->staticBody;

   cpSpaceAddConstraint(espacio, z=cpDampedSpringNew(b1,b2,cpv(x1,y1),cpv(x2,y2),x3,y3,z3));
   addConstr(z);
   return z;
}
[/code]

body es local a id3, ahí cómo se accede?
id3 es el id de un proceso, y lo que hago es acceder a él como cuando hago father.graph o father.x
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

ahh, pero para eso la tenes que declarar en en una igual a global_defs, pero llamada local_defs, despues tenes que hacer un fixup igual y los defines desde 0, para indexar el fixup.

y usar en vez de GLO*, usas LOC*

te conviene ver el archivo dlvaracc.h
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

en el fixup de las locals pones

"body",NULL,-1,-1

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

Prg

ok, gracias. intentaré esto.

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

SplinterGU

no hay que agradecer...

pregunta si tienes problemas, no te atasques.

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

Prg

#57
ok  ;D

static int updatePhisc(INSTANCE * my, int * params){
   cpSpace * espacio = GLODWORD(libchipmunk,GLO_SPACE);
   espacio->gravity.x= *(float *)GLOADDR(libchipmunk,GLO_GRAVITY_X);
   espacio->gravity.y= *(float *)GLOADDR(libchipmunk,GLO_GRAVITY_Y);
   cp_bias_coef=*(float *)GLOADDR(libchipmunk,GLO_BIAS_COEF);
   cp_collision_slop=*(float *)GLOADDR(libchipmunk,GLO_COLLISION_SLOP);
   cp_contact_persistence=GLOADDR(libchipmunk,GLO_CONTACT_PERSISTENCE);
   cpSpaceStep(space, 1.0/25.0f);
return 0;
}

HOOK __bgdexport (libchipmunk , handler_hooks ) [] =
{
( 4700 , updatePhisc ),
( 0 , NULL )
};

sí lo necesito, ya que hay que modificar la estructura space que es la que el sistema usa para generar la física del mundo. además aquí quiero tener la lista de procesos para actualizar sus coordenadas y el ángulo

Lo tengo así, pero me marca error en la línea [code language="bennu" options="singleline"]( 4700 , updatePhisc ),[/code]  y dice:

initializer element is not constant|
(near initialization for 'libchipmunk_handler_hooks[0].prio')|
y en la siguiente
warning: left-hand operand of comma expression has no effect|
initializer element is not constant|
(near initialization for 'libchipmunk_handler_hooks[0].hook')|


_:____________
accerder a locales ya lo tengo (revisé el código de grproc y ahí aprendí cómo)

ya tengo una funcion accediendo a las locales de los procesos y usándolas.

sólo me falta la actualización de los valores del mundo y la actualización de los procesos desde la librería (actualmente lo hago con otro proceso desde bennu), esto lo haré con la parte que falta arriba.




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

SplinterGU

esas variables cp_* son de la libreria? si es asi, entonces entiendo.

es que deberias usar llaves en vez de parentesis en la inicializacion del hook.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#59
otra cosa, el prototipo de las funciones hook no puede ser cualquiera, esto no va:

static int updatePhisc(INSTANCE * my, int * params)

debe ir esto

static int updatePhisc()


cuidado cuando modificas las coordenadas del proceso, porque deberias tener en cuenta las modificaciones que el usuario haga, por ejemplo, mover un personaje, aunque este este afectado a un efecto fisico, tu efecto fisico deberia interactuar con esto.

quizas en estos casos deberias poner unas locales que indican como el objeto se mueve en ese frame, algun INCR_X, INCR_Y o DELTA_MOTION_X, DELTA_MOTION_Y, o incluso alguna que indique la fuerza que ejerce en ese movimiento (si corresponde), y esas variables seran responsabilidad del usuario/programador setear, asi a vos te es mas facil actualizar las coordenadas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2