void RigidBody2D::SetMass(float mass, bool recomputeMoment) { if (m_mass > 0.f) { if (mass > 0.f) { m_world->RegisterPostStep(this, [mass, recomputeMoment](Nz::RigidBody2D* body) { cpBodySetMass(body->GetHandle(), mass); if (recomputeMoment) cpBodySetMoment(body->GetHandle(), body->GetGeom()->ComputeMomentOfInertia(mass)); }); } else m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) { cpBodySetType(body->GetHandle(), (body->IsStatic()) ? CP_BODY_TYPE_STATIC : CP_BODY_TYPE_KINEMATIC); } ); } else if (mass > 0.f) { m_world->RegisterPostStep(this, [mass, recomputeMoment](Nz::RigidBody2D* body) { if (cpBodyGetType(body->GetHandle()) != CP_BODY_TYPE_DYNAMIC) { cpBodySetType(body->GetHandle(), CP_BODY_TYPE_DYNAMIC); cpBodySetMass(body->GetHandle(), mass); if (recomputeMoment) cpBodySetMoment(body->GetHandle(), body->GetGeom()->ComputeMomentOfInertia(mass)); } }); } m_mass = mass; }
cpSpace* cpSpaceInit(cpSpace *space) { #ifndef NDEBUG static cpBool done = cpFalse; if(!done){ printf("Initializing cpSpace - Chipmunk v%s (Debug Enabled)\n", cpVersionString); printf("Compile with -DNDEBUG defined to disable debug mode and runtime assertion checks\n"); done = cpTrue; } #endif space->iterations = 10; space->gravity = cpvzero; space->damping = 1.0f; space->collisionSlop = 0.1f; space->collisionBias = cpfpow(1.0f - 0.1f, 60.0f); space->collisionPersistence = 3; space->locked = 0; space->stamp = 0; space->shapeIDCounter = 0; space->staticShapes = cpBBTreeNew((cpSpatialIndexBBFunc)cpShapeGetBB, NULL); space->dynamicShapes = cpBBTreeNew((cpSpatialIndexBBFunc)cpShapeGetBB, space->staticShapes); cpBBTreeSetVelocityFunc(space->dynamicShapes, (cpBBTreeVelocityFunc)ShapeVelocityFunc); space->allocatedBuffers = cpArrayNew(0); space->dynamicBodies = cpArrayNew(0); space->staticBodies = cpArrayNew(0); space->sleepingComponents = cpArrayNew(0); space->rousedBodies = cpArrayNew(0); space->sleepTimeThreshold = INFINITY; space->idleSpeedThreshold = 0.0f; space->arbiters = cpArrayNew(0); space->pooledArbiters = cpArrayNew(0); space->contactBuffersHead = NULL; space->cachedArbiters = cpHashSetNew(0, (cpHashSetEqlFunc)arbiterSetEql); space->constraints = cpArrayNew(0); space->usesWildcards = cpFalse; space->defaultHandler = cpCollisionHandlerDoNothing; space->collisionHandlers = cpHashSetNew(0, (cpHashSetEqlFunc)handlerSetEql); space->postStepCallbacks = cpArrayNew(0); space->skipPostStep = cpFalse; cpBody *staticBody = cpBodyInit(&space->_staticBody, 0.0f, 0.0f); cpBodySetType(staticBody, CP_BODY_TYPE_STATIC); cpSpaceSetStaticBody(space, staticBody); return space; }
void RigidBody2D::SetStatic(bool setStaticBody) { m_isStatic = setStaticBody; m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) { if (body->IsStatic()) { cpBodySetType(body->GetHandle(), CP_BODY_TYPE_STATIC); cpSpaceReindexShapesForBody(body->GetWorld()->GetHandle(), body->GetHandle()); } else if (cpBodyGetMass(body->GetHandle()) > 0.f) cpBodySetType(body->GetHandle(), CP_BODY_TYPE_KINEMATIC); else cpBodySetType(body->GetHandle(), CP_BODY_TYPE_DYNAMIC); }); }
void PhysicsBody::setDynamic(bool dynamic) { if (dynamic != _dynamic) { _dynamic = dynamic; if (dynamic) { cpBodySetType(_cpBody, CP_BODY_TYPE_DYNAMIC); internalBodySetMass(_cpBody, _mass); cpBodySetMoment(_cpBody, _moment); } else { cpBodySetType(_cpBody, CP_BODY_TYPE_KINEMATIC); } } }
cpBody* RigidBody2D::Create(float mass, float moment) { cpBody* handle = cpBodyNew(mass, moment); cpBodySetUserData(handle, this); if (mass <= 0.f) cpBodySetType(handle, CP_BODY_TYPE_KINEMATIC); cpSpaceAddBody(m_world->GetHandle(), handle); return handle; }
void menu_init(Entity *ent) { cpBodySetType(entity_body(ent), CP_BODY_TYPE_KINEMATIC); MenuEntityData *data = entity_data(ent); ALLEGRO_PATH *path = game_asset_path("logo.png"); data->logo = al_load_bitmap(al_path_cstr(path, ALLEGRO_NATIVE_PATH_SEP)); al_destroy_path(path); textbox_init(&data->server, 64); textbox_init(&data->port, 8); data->server.text_flags = TEXT_HALIGN_LEFT; data->server.caret_width = 0.1; data->server.font_size = MENU_FONT_SIZE; data->server.focus = true; data->port.text_flags = TEXT_HALIGN_LEFT; data->port.caret_width = 0.1; data->port.font_size = MENU_FONT_SIZE; game.camera_position = cpvzero; }