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; }