public void OnSelectionChange() { MeshRenderer renderer; Terrain terrain = null; // if the active object in the selection is a renderer or a terrain, we're interested in it's lightmapIndex if (Selection.activeGameObject == null || ((renderer = Selection.activeGameObject.GetComponent <MeshRenderer>()) == null && (terrain = Selection.activeGameObject.GetComponent <Terrain>()) == null)) { m_ActiveGameObjectLightmapIndex = -1; m_ActiveGameObjectTextureHash = new Hash128(); return; } if (isRealtimeLightmap) { Hash128 inputSystemHash; if ((renderer != null && Lightmapping.GetInputSystemHash(renderer.GetInstanceID(), out inputSystemHash)) || (terrain != null && Lightmapping.GetInputSystemHash(terrain.GetInstanceID(), out inputSystemHash))) { m_ActiveGameObjectTextureHash = inputSystemHash; } else { m_ActiveGameObjectTextureHash = new Hash128(); } } else { m_ActiveGameObjectLightmapIndex = renderer != null ? renderer.lightmapIndex : terrain.lightmapIndex; } m_ShouldScrollToLightmapIndex = true; }
void ShowRealtimeLMGUI(Terrain terrain) { Hash128 inputSystemHash; if (terrain == null || !Lightmapping.GetInputSystemHash(terrain.GetInstanceID(), out inputSystemHash) || inputSystemHash == new Hash128()) { return; // early return since we don't have any lightmaps for it } if (!UpdateRealtimeTexture(inputSystemHash, terrain.GetInstanceID())) { return; } m_ShowRealtimeLM.value = EditorGUILayout.Foldout(m_ShowRealtimeLM.value, Styles.realtimeLM, true); if (!m_ShowRealtimeLM.value) { return; } EditorGUI.indentLevel += 1; GUILayout.BeginHorizontal(); DrawLightmapPreview(m_CachedRealtimeTexture.texture, true, terrain.GetInstanceID()); GUILayout.BeginVertical(); // Resolution of the system. int width, height; int numChunksInX, numChunksInY; if (Lightmapping.GetTerrainSystemResolution(terrain, out width, out height, out numChunksInX, out numChunksInY)) { var str = width + "x" + height; if (numChunksInX > 1 || numChunksInY > 1) { str += string.Format(" ({0}x{1} chunks)", numChunksInX, numChunksInY); } GUILayout.Label(Styles.realtimeLMResolution.text + ": " + str); } GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); EditorGUI.indentLevel -= 1; GUILayout.Space(5); }
private void UpdateActiveGameObjectSelection() { MeshRenderer renderer = null; Terrain terrain = null; // if the selected active object (also active in the hierarchy) is a renderer or a terrain, we check its index etc. // otherwise bail if (Selection.activeGameObject == null || !Selection.activeGameObject.activeInHierarchy || (!Selection.activeGameObject.TryGetComponent(out renderer) && !Selection.activeGameObject.TryGetComponent(out terrain))) { m_ActiveGameObjectLightmapIndex = -1; m_ActiveGameObjectInstanceId = -1; m_ActiveGameObjectTextureHash = new Hash128(); return; } if (isRealtimeLightmap) { Hash128 inputSystemHash; if ((renderer != null && Lightmapping.GetInputSystemHash(renderer.GetInstanceID(), out inputSystemHash)) || (terrain != null && Lightmapping.GetInputSystemHash(terrain.GetInstanceID(), out inputSystemHash))) { m_ActiveGameObjectTextureHash = inputSystemHash; } else { m_ActiveGameObjectTextureHash = new Hash128(); } } else { m_ActiveGameObjectLightmapIndex = renderer != null ? renderer.lightmapIndex : terrain.lightmapIndex; m_ActiveGameObjectInstanceId = renderer != null?renderer.GetInstanceID() : terrain.GetInstanceID(); } }
void ShowRealtimeLMGUI(Renderer renderer) { Hash128 inputSystemHash; if (renderer == null || !Lightmapping.GetInputSystemHash(renderer.GetInstanceID(), out inputSystemHash) || inputSystemHash == new Hash128()) { return; // early return since we don't have any lightmaps for it } if (!UpdateRealtimeTexture(inputSystemHash, renderer.GetInstanceID())) { return; } m_ShowRealtimeLM.value = EditorGUILayout.Foldout(m_ShowRealtimeLM.value, Styles.realtimeLM, true); if (!m_ShowRealtimeLM.value) { return; } EditorGUI.indentLevel += 1; GUILayout.BeginHorizontal(); DrawLightmapPreview(m_CachedRealtimeTexture.texture, true, renderer.GetInstanceID()); GUILayout.BeginVertical(); int instWidth, instHeight; if (Lightmapping.GetInstanceResolution(renderer, out instWidth, out instHeight)) { GUILayout.Label(Styles.realtimeLMInstanceResolution.text + ": " + instWidth + "x" + instHeight); } int width, height; if (Lightmapping.GetSystemResolution(renderer, out width, out height)) { GUILayout.Label(Styles.realtimeLMResolution.text + ": " + width + "x" + height); } GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); if (Unsupported.IsDeveloperMode()) { Hash128 instanceHash; if (Lightmapping.GetInstanceHash(renderer, out instanceHash)) { EditorGUILayout.LabelField(Styles.realtimeLMInstanceHash, GUIContent.Temp(instanceHash.ToString())); } Hash128 geometryHash; if (Lightmapping.GetGeometryHash(renderer, out geometryHash)) { EditorGUILayout.LabelField(Styles.realtimeLMGeometryHash, GUIContent.Temp(geometryHash.ToString())); } EditorGUILayout.LabelField(Styles.realtimeLMInputSystemHash, GUIContent.Temp(inputSystemHash.ToString())); } EditorGUI.indentLevel -= 1; GUILayout.Space(5); }
private void UpdateCachedTexture(GITextureType textureType) { if (isIndexBased) { if (isRealtimeLightmap) { Hash128[] mainHashes = Lightmapping.GetMainSystemHashes(); if (!m_RealtimeTextureHash.isValid || !mainHashes.Contains(m_RealtimeTextureHash)) { m_RealtimeTextureHash = mainHashes.ElementAtOrDefault(m_LightmapIndex); } } } else // instance based { if (isRealtimeLightmap) { Hash128 systemHash; if (!Lightmapping.GetInputSystemHash(m_InstanceID, out systemHash)) { m_CachedTexture.textureAvailability = GITextureAvailability.GITextureNotAvailable; return; } m_RealtimeTextureHash = systemHash; } else { int lightmapIndex; if (!Lightmapping.GetLightmapIndex(m_InstanceID, out lightmapIndex)) { m_CachedTexture.textureAvailability = GITextureAvailability.GITextureNotAvailable; return; } m_LightmapIndex = lightmapIndex; } } Hash128 contentHash = isRealtimeLightmap ? LightmapVisualizationUtility.GetRealtimeGITextureHash(m_RealtimeTextureHash, textureType) : LightmapVisualizationUtility.GetBakedGITextureHash(m_LightmapIndex, m_InstanceID, textureType); // if we need to fetch a new texture if (m_CachedTexture.texture == null || m_CachedTexture.type != textureType || m_CachedTexture.contentHash != contentHash || m_CachedTexture.contentHash == new Hash128()) { m_CachedTexture = isRealtimeLightmap ? LightmapVisualizationUtility.GetRealtimeGITexture(m_RealtimeTextureHash, textureType) : LightmapVisualizationUtility.GetBakedGITexture(m_LightmapIndex, m_InstanceID, textureType); } if (!m_ShowUVOverlay) { return; // if we don't wanna show any overlay } if (m_CachedTexture.texture == null || m_CachedTexture.textureAvailability == GITextureAvailability.GITextureNotAvailable || m_CachedTexture.textureAvailability == GITextureAvailability.GITextureUnknown) { return; // if we dont have a texture } // fetch Renderers if (isRealtimeLightmap) { m_CachedTextureObjects = LightmapVisualizationUtility.GetRealtimeGITextureRenderers(m_RealtimeTextureHash); } else if (LightmapVisualizationUtility.IsAtlasTextureType(textureType)) { m_CachedTextureObjects = LightmapVisualizationUtility.GetBakedGITextureRenderers(m_LightmapIndex); } else // if it's an instance based baked lightmap, we only have 1 object in it { m_CachedTextureObjects = new GameObject[] {} }; }