unsafe bool DidChangeInternal(World world, IEnumerable <GameObject> targets, IEnumerable <int> selectedComponentTypes) { if (world != m_LastWorld) { m_LastWorld = world; return(true); } if (m_LastConversionData == EntityConversionData.Null) { // @TODO Handle multiple targets correctly. m_LastConversionData = EntityConversionUtility.GetConversionData(targets, world).FirstOrDefault(); if (m_LastConversionData == EntityConversionData.Null) { return(false); } m_LastChunk = world.EntityManager.GetChunk(m_LastConversionData.PrimaryEntity); return(true); } var chunk = world.EntityManager.GetChunk(m_LastConversionData.PrimaryEntity); if (null == chunk.m_Chunk || chunk != m_LastChunk) { m_LastChunk = chunk; return(true); } foreach (var typeIndex in selectedComponentTypes) { var typeIndexInArchetype = ChunkDataUtility.GetIndexInTypeArray(m_LastChunk.m_Chunk->Archetype, typeIndex); if (typeIndexInArchetype == -1) { continue; } var typeChangeVersion = m_LastChunk.m_Chunk->GetChangeVersion(typeIndexInArchetype); if (ChangeVersionUtility.DidChange(typeChangeVersion, m_LastGlobalSystemVersion)) { m_LastGlobalSystemVersion = world.EntityManager.GlobalSystemVersion; return(true); } } return(false); }
/// <summary> /// Called to implement custom controls in the preview window. /// </summary> public override void OnPreviewGUI(Rect r, GUIStyle background) { if (Event.current.type == EventType.Repaint) { m_PreviewRect = r; } using (var conversionDataPooledList = EntityConversionUtility.GetConversionData(m_GameObjectTargets, GetCurrentlySelectedWorld()).ToPooledList()) using (new GUILayout.AreaScope(m_PreviewRect, string.Empty, Styles.EntityConversionComponentArea)) using (new EditorGUILayout.VerticalScope()) { const string liveConversion = "Unity.Entities.Streaming.SubScene.LiveLinkEnabledInEditMode"; if (!EditorPrefs.GetBool(liveConversion, false)) { GUILayout.Label(EditorGUIUtility.TrTempContent("Live Conversion is disabled. Enable it in the DOTS file menu to see conversion preview."), Styles.EntityConversionWarningMessage); return; } var conversionData = conversionDataPooledList.List; if (m_GameObjectTargets.Count != conversionData.Count) { GUILayout.Label(EditorGUIUtility.TrTempContent("Entity conversion can only be previewed for GameObjects converted by a SubScene."), Styles.EntityConversionWarningMessage); return; } if (!ValidateGameObjectConversionData(conversionData, out var errorMessage)) { GUILayout.Label(EditorGUIUtility.TrTempContent(errorMessage), Styles.EntityConversionWarningMessage); return; } var primary = conversionData[0]; var isSingleSelection = conversionData.Count == 1; var additionalEntitiesCount = primary.AdditionalEntities.Count - 1; var hasAdditionalEntities = isSingleSelection && additionalEntitiesCount > 0; var entityName = isSingleSelection ? $"{primary.EntityManager.GetName(primary.PrimaryEntity)} (Entity)" : $"{EditorGUIBridge.mixedValueContent.text}({conversionData.Count} entities)"; if (m_State.AdditionalEntityIndex > additionalEntitiesCount) { m_State.AdditionalEntityIndex = additionalEntitiesCount; } if (hasAdditionalEntities) { m_State.ShowAdditionalEntities = EditorGUILayout.Foldout(m_State.ShowAdditionalEntities, EditorGUIUtility.TrTextContentWithIcon($"{entityName} + {additionalEntitiesCount} {(additionalEntitiesCount > 1 ? "Entities" : "Entity")}", EditorIcons.Entity), new GUIStyle(EditorStyles.foldout) { fixedWidth = 650.0f, fontStyle = FontStyle.Bold }); GUILayout.Space(4); if (m_State.ShowAdditionalEntities) { using (var scroll = new EditorGUILayout.ScrollViewScope(m_ScrollHeaderPosition, GUILayout.ExpandWidth(true), GUILayout.Height(56))) { m_ScrollHeaderPosition = scroll.scrollPosition; var additionalEntityLabel = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight + 3f); additionalEntityLabel.height -= 3.0f; additionalEntityLabel.x = 4.0f; for (var i = 1; i < primary.AdditionalEntities.Count; ++i) { var entity = primary.AdditionalEntities[i]; if (ShowAdditionalEntityToggle(ref additionalEntityLabel, i == m_State.AdditionalEntityIndex, primary.EntityManager, entity)) { m_State.AdditionalEntityIndex = i; } else if (i == m_State.AdditionalEntityIndex) { m_State.AdditionalEntityIndex = -1; } } } GUILayout.Space(8); } } else { EditorGUILayout.LabelField(EditorGUIUtility.TrTextContentWithIcon(entityName, EditorIcons.Entity), EditorStyles.boldLabel); GUILayout.Space(4); } using (var scroll = new EditorGUILayout.ScrollViewScope(m_ScrollPosition)) using (var inspectorTargets = GetInspectorTargets(conversionData, m_State).ToPooledList()) using (var commonComponentTypes = GetCommonComponentTypes(inspectorTargets.List).ToPooledList()) { m_ScrollPosition = scroll.scrollPosition; var labelRect = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight + 3f); labelRect.x = 4f; labelRect.height = EditorGUIUtility.singleLineHeight; for (var i = 0; i < commonComponentTypes.List.Count; i++) { var componentType = commonComponentTypes.List[i]; var isSelected = m_State.SelectedComponentTypes.Contains(componentType.TypeIndex); var isSelectedInUi = ShowComponentTypeToggle(ref labelRect, isSelected, componentType); HandleComponentSelection(commonComponentTypes, componentType, i, isSelected, isSelectedInUi); } GUILayout.Space(6); m_RuntimeComponentsDrawer.SetTargets(inspectorTargets.List); m_RuntimeComponentsDrawer.SetComponentTypes(m_State.SelectedComponentTypes); if (m_State.SelectedComponentTypes.Count > 0 && commonComponentTypes.List.Count(type => m_State.SelectedComponentTypes.Contains(type.TypeIndex)) > 0) { using (new WideModeScope(338)) { m_RuntimeComponentsDrawer.OnGUI(); } } GUILayout.Space(4); if (!isSingleSelection) { GUILayout.Label(EditorGUIUtility.TrTempContent("Components that are only on some of the converted entities are not shown."), Styles.EntityConversionCommonComponentMessage); } } } }