void Grid::FillGrid(std::vector<PhysicsObject>& objects) { // Clear the grid for (uint i = 0; i < numCellsX; ++i) { for (uint j = 0; j < numCellsZ; ++j) { grid[i][j].Clear(); } } // Fill the grid uint n = objects.size(); for (uint i = 0; i < n; ++i) { Transform* t = objects[i].collider->GetGameObject()->GetTransform(); Vector3 pos = t->GetLocalPosition(); int x = (int)(pos.x * inverseCellWidth) + 2; int z = (int)(pos.z * -inverseCellWidth) + 2; if (x > numCellsX - 1) x = numCellsX - 1; if (x < 0) x = 0; if (z > numCellsZ - 1) z = numCellsZ - 1; if (z < 0) z = 0; grid[x][z].Add(&objects[i]); } }
void GameObject::SetParent(GameObject *newParent, bool keepWorldTransform) { if (keepWorldTransform) Debug_Log("Set parent of " << this << " to " << newParent); if (m_parent != newParent) { if (m_parent) { m_parent->m_children.Remove(this); } if (keepWorldTransform) { // TODO: Not working yet (sometimes scaling breaks) Matrix4 oldParentToWorld; parent->transform->GetLocalToWorldMatrix(&oldParentToWorld); //Debug_Log("LOCAL TO WORLD: " << Transform::FromTransformMatrix(oldParentToWorld)); Matrix4 worldToNewParent; if (newParent) { newParent->transform->GetLocalToWorldMatrix(&worldToNewParent); worldToNewParent = worldToNewParent.Inversed(); //Debug_Log("WORLD TO NEW PARENT: " << Transform::FromTransformMatrix(worldToNewParent)); } Matrix4 keepWorldTransformMatrix = worldToNewParent * oldParentToWorld * transform->GetLocalToParentMatrix(); //Debug_Log("LOCALTOPARENT: " << // Quaternion::EulerAngles( // Transform::GetRotationFromMatrix4(transform->GetLocalToParentMatrix()))); //Debug_Log("KEEPWORLDMATRIX: " << Transform::FromTransformMatrix(keepWorldTransformMatrix)); Transform t = Transform::FromTransformMatrix(keepWorldTransformMatrix); transform->SetLocalPosition(t.GetLocalPosition()); transform->SetLocalRotation(t.GetLocalRotation()); transform->SetLocalScale (t.GetLocalScale()); } m_parent = newParent; if (m_parent) { m_parent->m_children.PushBack(this); } } }