void Body::SetActive(bool flag) { assert(m_world->IsLocked() == false); if (flag == IsActive()) { return; } if (flag) { m_flags |= activeFlag; // Create all proxies. BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; for (Fixture* f = m_fixtureList; f; f = f->m_next) { f->CreateProxies(broadPhase, m_xf); } // Contacts are created the next time step. } else { m_flags &= ~activeFlag; // Destroy all proxies. BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; for (Fixture* f = m_fixtureList; f; f = f->m_next) { f->DestroyProxies(broadPhase); } // Destroy the attached contacts. ContactEdge* ce = m_contactList; while (ce) { ContactEdge* ce0 = ce; ce = ce->next; m_world->m_contactManager.Destroy(ce0->contact); } m_contactList = NULL; } }
Fixture* Body::CreateFixture(const FixtureDef* def) { assert(m_world->IsLocked() == false); if (m_world->IsLocked() == true) { return NULL; } BlockAllocator* allocator = &m_world->m_blockAllocator; void* memory = allocator->Allocate(sizeof(Fixture)); Fixture* fixture = new (memory) Fixture; fixture->Create(allocator, this, def); if (m_flags & activeFlag) { BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; fixture->CreateProxies(broadPhase, m_xf); } fixture->m_next = m_fixtureList; m_fixtureList = fixture; ++m_fixtureCount; fixture->m_body = this; // Adjust mass properties if needed. if (fixture->m_density > 0.0f) { ResetMassData(); } // Let the world know we have a new fixture. This will cause new contacts // to be created at the beginning of the next time step. m_world->m_flags |= World::newFixture; return fixture; }