rendered paste bodyvoid deflect(object_t *obj1, object_t *obj2)
{
float impactnormal[2];
float velocitynorm[2];
float subtracted[2];
float dotproduct;
vector_subtract(subtracted, obj1->position, obj2->position);
vector_normalise(subtracted, impactnormal);
vector_normalise(obj1->velocity, velocitynorm);
dotproduct = vector_dotproduct(velocitynorm, impactnormal);
obj1->velocity[0] += impactnormal[0] * -dotproduct * 1.5;
obj1->velocity[1] += impactnormal[1] * -dotproduct * 1.5;
obj2->velocity[0] += impactnormal[0] * dotproduct * 1.5;
obj2->velocity[1] += impactnormal[1] * dotproduct * 1.5;
}
int spherecollide(object_t *obj1, object_t *obj2)
{
float relpos[1];
vector_subtract (relpos, obj1->position, obj2->position);
float dist = relpos[0] * relpos[0] + relpos[1] * relpos[1];
float minDist = 20 + 40;
return dist <= minDist * minDist;
return false;
}
=== main loop ===
obj->acceleration[0]= 0 / obj->mass;
obj->acceleration[1] = gravity / obj->mass;
obj->velocity[0] += obj->acceleration[0] * frametime;
obj->velocity[1] += obj->acceleration[1] * frametime;
obj2->acceleration[0]= 0 / obj2->mass;
obj2->acceleration[1] = gravity / obj2->mass;
obj2->velocity[0] += obj2->acceleration[0] * frametime;
obj2->velocity[1] += obj2->acceleration[1] * frametime;
if(spherecollide(obj, obj2))
{
deflect(obj, obj2);
}
obj->position[0] += obj->velocity[0] * frametime;
obj->position[1] += obj->velocity[1] * frametime;
obj2->position[0] += obj2->velocity[0] * frametime;
obj2->position[1] += obj2->velocity[1] * frametime;