// Migrate state data for all devices from a previous set of buffers to the current set of buffers. // Copies all state from their old locations to their new locations and bakes the new offsets into // the control hierarchies of the given devices. // NOTE: When having oldBuffers, this method only works properly if the only alteration compared to the // new buffers is that either devices have been removed or devices have been added. Cannot be // a mix of the two. Also, new devices MUST be added to the end and cannot be inserted in the middle. // NOTE: Also, state formats MUST not change from before. A device that has changed its format must // be treated as a newly device that didn't exist before. public void MigrateAll(InputDevice[] devices, int deviceCount, InputStateBuffers oldBuffers) { // If we have old data, perform migration. if (oldBuffers.totalSize > 0) { MigrateDoubleBuffer(m_PlayerStateBuffers, devices, deviceCount, oldBuffers.m_PlayerStateBuffers); #if UNITY_EDITOR MigrateDoubleBuffer(m_EditorStateBuffers, devices, deviceCount, oldBuffers.m_EditorStateBuffers); #endif MigrateSingleBuffer(defaultStateBuffer, devices, deviceCount, oldBuffers.defaultStateBuffer); MigrateSingleBuffer(noiseMaskBuffer, devices, deviceCount, oldBuffers.noiseMaskBuffer); MigrateSingleBuffer(resetMaskBuffer, devices, deviceCount, oldBuffers.resetMaskBuffer); } // Assign state blocks. This is where devices will receive their updates state offsets. Up // until now we've left any previous m_StateBlocks alone. var newOffset = 0u; for (var i = 0; i < deviceCount; ++i) { var device = devices[i]; var oldOffset = device.m_StateBlock.byteOffset; if (oldOffset == InputStateBlock.InvalidOffset) { // Device is new and has no offset yet baked into it. device.m_StateBlock.byteOffset = 0; if (newOffset != 0) { device.BakeOffsetIntoStateBlockRecursive(newOffset); } } else { // Device is not new and still has its old offset baked into it. We could first unbake the old offset // and then bake the new one but instead just bake a relative offset. var delta = newOffset - oldOffset; if (delta != 0) { device.BakeOffsetIntoStateBlockRecursive(delta); } } Debug.Assert(device.m_StateBlock.byteOffset == newOffset, "Device state offset not set correctly"); newOffset = NextDeviceOffset(newOffset, device); } }
// Migrate state data for all devices from a previous set of buffers to the current set of buffers. // Copies all state from their old locations to their new locations and bakes the new offsets into // the control hierarchies of the given devices. // NOTE: oldDeviceIndices is only required if devices have been removed; otherwise it can be null. public void MigrateAll(InputDevice[] devices, int deviceCount, uint[] newStateBlockOffsets, InputStateBuffers oldBuffers, int[] oldDeviceIndices) { // If we have old data, perform migration. // Note that the enabled update types don't need to match between the old set of buffers // and the new set of buffers. if (oldBuffers.totalSize > 0) { MigrateDoubleBuffer(m_DynamicUpdateBuffers, devices, deviceCount, newStateBlockOffsets, oldBuffers.m_DynamicUpdateBuffers, oldDeviceIndices); MigrateDoubleBuffer(m_FixedUpdateBuffers, devices, deviceCount, newStateBlockOffsets, oldBuffers.m_FixedUpdateBuffers, oldDeviceIndices); #if UNITY_EDITOR MigrateDoubleBuffer(m_EditorUpdateBuffers, devices, deviceCount, newStateBlockOffsets, oldBuffers.m_EditorUpdateBuffers, oldDeviceIndices); #endif MigrateSingleBuffer(defaultStateBuffer, devices, deviceCount, newStateBlockOffsets, oldBuffers.defaultStateBuffer); MigrateSingleBuffer(noiseMaskBuffer, devices, deviceCount, newStateBlockOffsets, oldBuffers.noiseMaskBuffer); } // Assign state blocks. for (var i = 0; i < deviceCount; ++i) { var newOffset = newStateBlockOffsets[i]; var device = devices[i]; var oldOffset = device.m_StateBlock.byteOffset; if (oldOffset == InputStateBlock.InvalidOffset) { device.m_StateBlock.byteOffset = 0; if (newOffset != 0) { device.BakeOffsetIntoStateBlockRecursive(newOffset); } } else { var delta = newOffset - oldOffset; if (delta != 0) { device.BakeOffsetIntoStateBlockRecursive(delta); } } } }
// Switch the current set of buffers used by the system. public static void SwitchTo(InputStateBuffers buffers, InputUpdateType update) { s_CurrentBuffers = buffers.GetDoubleBuffersFor(update); }