public override void OnInspectorGUI() { SECTR_Member myMember = (SECTR_Member)target; serializedObject.Update(); if (!myMember.IsSector) { DrawProperty("PortalDetermined"); DrawProperty("ForceStartSector"); } if (!myMember.gameObject.isStatic) { DrawProperty("BoundsUpdateMode"); } DrawProperty("ExtraBounds"); DrawProperty("OverrideBounds"); DrawProperty("BoundsOverride"); if (SECTR_Modules.VIS) { DrawProperty("ChildCulling"); DrawProperty("DirShadowCaster"); DrawProperty("DirShadowDistance"); } serializedObject.ApplyModifiedProperties(); }
public static void MakeSharedChildrenMembers(SECTR_Sector sector, List <SECTR_Member.Child> sharedChildren, string undoName) { int numSharedChildren = sharedChildren.Count; for (int childIndex = 0; childIndex < numSharedChildren; ++childIndex) { SECTR_Member.Child child = sharedChildren[childIndex]; bool hasMemberParent = false; Transform parent = child.gameObject.transform; while (parent != null) { if (parent.gameObject != sector.gameObject && parent.GetComponent <SECTR_Member>()) { hasMemberParent = true; break; } else { parent = parent.parent; } } if (!hasMemberParent) { SECTR_Member newMember = child.gameObject.AddComponent <SECTR_Member>(); SECTR_Undo.Created(newMember, undoName); } } sector.ForceUpdate(true); }
void OnEnable() { cachedMember = GetComponent <SECTR_Member>(); if (FadeIn) { fadeTexture = new Texture2D(1, 1); fadeTexture.SetPixel(0, 0, FadeColor); fadeTexture.Apply(); } }
protected static Terrain GetTerrain(SECTR_Sector sector) { if (sector) { SECTR_Member realSector = sector.childProxy ? sector.childProxy : sector; return(realSector.GetComponentInChildren <Terrain>()); } else { return(null); } }
protected override void OnDisable() { // No need to loop through our portals, as they will null themselves out. List <SECTR_Member> originalMembers = new List <SECTR_Member>(members); int numMembers = originalMembers.Count; for (int memberIndex = 0; memberIndex < numMembers; ++memberIndex) { SECTR_Member member = originalMembers[memberIndex]; if (member) { member.SectorDisabled(this); } } allSectors.Remove(this); base.OnDisable(); }
void OnEnable() { allLODs.Add(this); cachedMember = GetComponent <SECTR_Member>(); SECTR_CullingCamera cullingCamera = SECTR_CullingCamera.All.Count > 0 ? SECTR_CullingCamera.All[0] : null; if (cullingCamera #if UNITY_EDITOR && EditorApplication.isPlaying #endif ) { SelectLOD(cullingCamera.GetComponent <Camera>()); } else { _ActivateLOD(0); } }
public void Init(GameObject gameObject, Renderer renderer, Light light, Terrain terrain, SECTR_Member member, bool dirShadowCaster, Vector3 shadowVec) { this.gameObject = gameObject; this.gameObjectHash = this.gameObject.GetInstanceID(); this.member = member; this.renderer = renderer && renderer.enabled ? renderer : null; this.light = (light && light.enabled && (light.type == LightType.Point || light.type == LightType.Spot)) ? light : null; this.terrain = (terrain && terrain.enabled) ? terrain : null; rendererBounds = this.renderer ? this.renderer.bounds : new Bounds(); lightBounds = this.light ? SECTR_Geometry.ComputeBounds(this.light) : new Bounds(); terrainBounds = this.terrain ? SECTR_Geometry.ComputeBounds(this.terrain) : new Bounds(); layer = gameObject.layer; if(SECTR_Modules.VIS) { this.renderHash = this.renderer ? this.renderer.GetInstanceID() : 0; this.lightHash = this.light ? this.light.GetInstanceID() : 0; this.terrainHash = this.terrain ? this.terrain.GetInstanceID() : 0; bool liveLightmaps; #if UNITY_4 liveLightmaps = LightmapSettings.lightmapsMode == LightmapsMode.Dual; #else liveLightmaps = true; #endif #if UNITY_4_0 || UNITY_4_1 shadowLight = this.light && light.shadows != LightShadows.None; #else shadowLight = this.light && light.shadows != LightShadows.None && (!light.alreadyLightmapped || liveLightmaps); #endif #if UNITY_4 rendererCastsShadows = this.renderer && renderer.castShadows && (renderer.lightmapIndex == -1 || liveLightmaps); #else rendererCastsShadows = this.renderer && renderer.shadowCastingMode != UnityEngine.Rendering.ShadowCastingMode.Off && (renderer.lightmapIndex == -1 || liveLightmaps); #endif terrainCastsShadows = this.terrain && terrain.castShadows && (terrain.lightmapIndex == -1 || liveLightmaps); if(dirShadowCaster) { if(rendererCastsShadows) { rendererBounds = SECTR_Geometry.ProjectBounds(rendererBounds, shadowVec); } if(terrainCastsShadows) { terrainBounds = SECTR_Geometry.ProjectBounds(terrainBounds, shadowVec); } } if(shadowLight) { shadowLightPosition = light.transform.position; shadowLightRange = light.range; shadowLightType = light.type; shadowCullingMask = light.cullingMask; } else { shadowLightPosition = Vector3.zero; shadowLightRange = 0; shadowLightType = LightType.Area; shadowCullingMask = 0; } } else { this.renderHash = 0; this.lightHash = 0; this.terrainHash = 0; shadowLight = false; rendererCastsShadows = false; terrainCastsShadows = false; shadowLightPosition = Vector3.zero; shadowLightRange = 0; shadowLightType = LightType.Area; shadowCullingMask = 0; } processed = true; }
public void Init(GameObject gameObject, Renderer renderer, Light light, Terrain terrain, SECTR_Member member, bool dirShadowCaster, Vector3 shadowVec) { this.gameObject = gameObject; this.gameObjectHash = this.gameObject.GetInstanceID(); this.member = member; this.renderer = renderer && (renderCulled || renderer.enabled) ? renderer : null; this.light = (light && (lightCulled || light.enabled) && (light.type == LightType.Point || light.type == LightType.Spot)) ? light : null; this.terrain = (terrain && (terrainCulled || terrain.enabled)) ? terrain : null; rendererBounds = this.renderer ? this.renderer.bounds : new Bounds(); lightBounds = this.light ? SECTR_Geometry.ComputeBounds(this.light) : new Bounds(); terrainBounds = this.terrain ? SECTR_Geometry.ComputeBounds(this.terrain) : new Bounds(); layer = gameObject.layer; if (SECTR_Modules.VIS) { this.renderHash = this.renderer ? this.renderer.GetInstanceID() : 0; this.lightHash = this.light ? this.light.GetInstanceID() : 0; this.terrainHash = this.terrain ? this.terrain.GetInstanceID() : 0; bool liveLightmaps; #if UNITY_4 liveLightmaps = LightmapSettings.lightmapsMode == LightmapsMode.Dual; #else liveLightmaps = true; #endif #if UNITY_2017_3_OR_NEWER shadowLight = this.light && light.shadows != LightShadows.None && (!light.bakingOutput.isBaked || liveLightmaps); #elif UNITY_5_4_OR_NEWER shadowLight = this.light && light.shadows != LightShadows.None && (!light.isBaked || liveLightmaps); #elif UNITY_4_0 || UNITY_4_1 shadowLight = this.light && light.shadows != LightShadows.None; #else shadowLight = this.light && light.shadows != LightShadows.None && (!light.alreadyLightmapped || liveLightmaps); #endif #if UNITY_4 rendererCastsShadows = this.renderer && renderer.castShadows && (renderer.lightmapIndex == -1 || liveLightmaps); #else rendererCastsShadows = this.renderer && renderer.shadowCastingMode != UnityEngine.Rendering.ShadowCastingMode.Off && (renderer.lightmapIndex == -1 || liveLightmaps); #endif terrainCastsShadows = this.terrain && terrain.castShadows && (terrain.lightmapIndex == -1 || liveLightmaps); if (dirShadowCaster) { if (rendererCastsShadows) { rendererBounds = SECTR_Geometry.ProjectBounds(rendererBounds, shadowVec); } if (terrainCastsShadows) { terrainBounds = SECTR_Geometry.ProjectBounds(terrainBounds, shadowVec); } } if (shadowLight) { shadowLightPosition = light.transform.position; shadowLightRange = light.range; shadowLightType = light.type; shadowCullingMask = light.cullingMask; } else { shadowLightPosition = Vector3.zero; shadowLightRange = 0; shadowLightType = LightType.Area; shadowCullingMask = 0; } } else { this.renderHash = 0; this.lightHash = 0; this.terrainHash = 0; shadowLight = false; rendererCastsShadows = false; terrainCastsShadows = false; shadowLightPosition = Vector3.zero; shadowLightRange = 0; shadowLightType = LightType.Area; shadowCullingMask = 0; } processed = true; }
/// Informs the Sector that a Member is in it. /// Should only be called by SECTR_Member. public void Register(SECTR_Member member) { members.Add(member); }
void OnEnable() { cachedMember = GetComponent <SECTR_Member>(); cachedMember.Changed += new SECTR_Member.MembershipChanged(_MembershipChanged); }
void OnEnable() { cachedMember = GetComponent <SECTR_Member>(); cachedMember.ChildCulling = CullEachChild ? SECTR_Member.ChildCullModes.Individual : SECTR_Member.ChildCullModes.Group; }
protected override void OnDisable() { base.OnDisable(); cachedMember = null; #if UNITY_EDITOR EditorApplication.update -= Update; #endif }
void OnEnable() { cachedMember = GetComponent<SECTR_Member>(); #if UNITY_EDITOR EditorApplication.update += Update; #endif }
void OnDisable() { allLODs.Remove(this); cachedMember = null; }
/// Exports the specific Sector into an external level file, deleting the current scene copy in the process. Safe to call from command line. /// <param name="sector">The Sector to export.</param> /// <returns>Returns true if Sector was successfully exported, false otherwise.</returns> public static bool ExportToChunk(SECTR_Sector sector) { if (string.IsNullOrEmpty(EditorApplication.currentScene)) { Debug.LogError("Scene must be saved befor export."); return(false); } if (sector == null) { Debug.LogError("Cannot export null Sector."); return(false); } if (!sector.gameObject.activeInHierarchy) { Debug.LogError("Cannot export inactive Sectors."); return(false); } if (!sector.gameObject.isStatic) { Debug.Log("Skipping export of dynamic sector" + sector.name + "."); return(true); } if (sector.Frozen) { // Already exported Debug.Log("Skipping frozen sector " + sector.name); return(true); } string sceneDir; string sceneName; string exportDir = SECTR_Asset.MakeExportFolder("Chunks", false, out sceneDir, out sceneName); if (string.IsNullOrEmpty(exportDir)) { Debug.LogError("Could not create Chunks folder."); return(false); } // Delete the previous export, if there is one. // Prevents duplicate names piling up. SECTR_Chunk oldChunk = sector.GetComponent <SECTR_Chunk>(); if (oldChunk) { AssetDatabase.DeleteAsset(oldChunk.NodeName); SECTR_VC.WaitForVC(); } // Sectors are not guaranteed to be uniquely named, so always generate a unique name. string originalSectorName = sector.name; string newAssetPath = AssetDatabase.GenerateUniqueAssetPath(exportDir + sceneName + "_" + originalSectorName + ".unity"); sector.name = newAssetPath; // Make sure the current scene is saved, preserving all changes. EditorApplication.SaveScene(); SECTR_VC.WaitForVC(); string originalScene = EditorApplication.currentScene; List <EditorBuildSettingsScene> sceneSettings = new List <EditorBuildSettingsScene>(EditorBuildSettings.scenes); // SaveScene can cause crashes w/ version control, so we work around it with a copy. AssetDatabase.CopyAsset(originalScene, newAssetPath); SECTR_VC.WaitForVC(); EditorApplication.OpenScene(newAssetPath); SECTR_VC.WaitForVC(); sector = _FindSectorByName(newAssetPath); // Make sure to force update all members so that membership info is correct. List <SECTR_Member> allMembers = FindAllOfType <SECTR_Member>(); for (int memberIndex = 0; memberIndex < allMembers.Count; ++memberIndex) { allMembers[memberIndex].ForceUpdate(true); } // Multi-sector members need to stay in the master scene. foreach (SECTR_Member member in allMembers) { if (member.Sectors.Count > 1 && member.transform.IsChildOf(sector.transform)) { bool unparentMember = true; // Only affect the first member in the hierarchy below the sector Transform parent = member.transform.parent; while (parent != sector.transform) { if (parent.GetComponent <SECTR_Member>() != null) { unparentMember = false; break; } parent = parent.parent; } if (unparentMember) { if (PrefabUtility.GetPrefabType(sector.gameObject) != PrefabType.None) { Debug.LogWarning("Export is unparenting shared member " + member.name + " from prefab Sector " + sector.name + ". This will break the prefab."); } member.transform.parent = null; } } } // Unparent the sector from anything sector.transform.parent = null; // Any children of this sector should be exported. // The rest should be destroyed. List <Transform> allXforms = FindAllOfType <Transform>(); #if !UNITY_STREAM_ENLIGHTEN List <int> referencedLightmaps = new List <int>(LightmapSettings.lightmaps.Length); #endif foreach (Transform transform in allXforms) { if (transform && transform.IsChildOf(sector.transform)) { #if !UNITY_STREAM_ENLIGHTEN Renderer childRenderer = transform.GetComponent <Renderer>(); if (childRenderer && childRenderer.lightmapIndex >= 0 && !referencedLightmaps.Contains(childRenderer.lightmapIndex)) { referencedLightmaps.Add(childRenderer.lightmapIndex); } Terrain childTerrain = transform.GetComponent <Terrain>();; if (childTerrain && childTerrain.lightmapIndex >= 0 && !referencedLightmaps.Contains(childTerrain.lightmapIndex)) { referencedLightmaps.Add(childTerrain.lightmapIndex); } #endif } else if (transform) { GameObject.DestroyImmediate(transform.gameObject); } } #if !UNITY_STREAM_ENLIGHTEN if (referencedLightmaps.Count > 0) { SECTR_LightmapRef newRef = sector.GetComponent <SECTR_LightmapRef>(); if (!newRef) { newRef = sector.gameObject.AddComponent <SECTR_LightmapRef>(); } newRef.ReferenceLightmaps(referencedLightmaps); } // Nuke global data like nav meshes and lightmaps // Lightmap indexes will be preserved on export. NavMeshBuilder.ClearAllNavMeshes(); #if !UNITY_4 SerializedObject serialObj = new SerializedObject(GameObject.FindObjectOfType <LightmapSettings>()); SerializedProperty snapshotProp = serialObj.FindProperty("m_LightmapSnapshot"); snapshotProp.objectReferenceValue = null; serialObj.ApplyModifiedProperties(); #endif LightmapSettings.lightmaps = new LightmapData[0]; LightmapSettings.lightProbes = new LightProbes(); #endif GameObject dummyParent = new GameObject(newAssetPath); SECTR_ChunkRef chunkRef = dummyParent.AddComponent <SECTR_ChunkRef>(); chunkRef.RealSector = sector.transform; sector.transform.parent = dummyParent.transform; // If the sector has a chunk marked for re-use, perform some special work. SECTR_Chunk originalChunk = sector.GetComponent <SECTR_Chunk>(); if (originalChunk && originalChunk.ExportForReuse) { chunkRef.Recentered = true; sector.transform.localPosition = Vector3.zero; sector.transform.localRotation = Quaternion.identity; sector.transform.localScale = Vector3.one; sector.gameObject.SetActive(false); } // Rename the real chunk root with a clear name. sector.name = originalSectorName + "_Chunk"; // Strip off any functional objects that will be preserved in the root scene. // Destroy the chunk first because it has dependencies on Sector. GameObject.DestroyImmediate(originalChunk); Component[] components = sector.GetComponents <Component>(); foreach (Component component in components) { if (component.GetType().IsSubclassOf(typeof(MonoBehaviour)) && component.GetType() != typeof(Terrain) && component.GetType() != typeof(SECTR_LightmapRef)) { GameObject.DestroyImmediate(component); } } // Re-add a member that will persist all of the references and save us work post load. SECTR_Member refMember = chunkRef.RealSector.gameObject.AddComponent <SECTR_Member>(); refMember.NeverJoin = true; refMember.BoundsUpdateMode = SECTR_Member.BoundsUpdateModes.Static; refMember.ForceUpdate(true); // Save scene and append it to the build settings. EditorApplication.SaveScene(); SECTR_VC.WaitForVC(); EditorBuildSettingsScene sectorSceneSettings = new EditorBuildSettingsScene(newAssetPath, true); bool sceneExists = false; foreach (EditorBuildSettingsScene oldScene in sceneSettings) { if (oldScene.path == newAssetPath) { sceneExists = true; oldScene.enabled = true; break; } } if (!sceneExists) { sceneSettings.Add(sectorSceneSettings); } string[] pathParts = newAssetPath.Split('/'); string sectorPath = pathParts[pathParts.Length - 1].Replace(".unity", ""); // Update the master scene with exported info. EditorApplication.OpenScene(originalScene); SECTR_VC.WaitForVC(); sector = _FindSectorByName(newAssetPath); sector.name = originalSectorName; DeleteExportedSector(sector); // Make sure Sectors has a Chunk SECTR_Chunk newChunk = sector.GetComponent <SECTR_Chunk>(); if (!newChunk) { newChunk = sector.gameObject.AddComponent <SECTR_Chunk>(); } newChunk.ScenePath = sectorPath; newChunk.NodeName = newAssetPath; newChunk.enabled = true; // Disable a TerrainComposer node if there is one. MonoBehaviour terrainNeighbors = sector.GetComponent("TerrainNeighbors") as MonoBehaviour; if (terrainNeighbors) { terrainNeighbors.enabled = false; } // Save off the accumulated build settings EditorBuildSettings.scenes = sceneSettings.ToArray(); AssetDatabase.Refresh(); EditorApplication.SaveScene(); SECTR_VC.WaitForVC(); return(true); }
void OnDisable() { cachedMember = null; fadeTexture = null; }
/// Informs the Sector that a Member is no longer part in it. /// Should only be called by SECTR_Member. public void Deregister(SECTR_Member member) { members.Remove(member); }
void OnEnable() { cachedMember = GetComponent <SECTR_Member>(); cachedMember.Changed += new SECTR_Member.MembershipChanged(_MembershipChanged); allOccluders.Add(this); }
void OnEnable() { cachedMember = GetComponent <SECTR_Member>(); }
void OnDisable() { allOccluders.Remove(this); cachedMember.Changed -= new SECTR_Member.MembershipChanged(_MembershipChanged); cachedMember = null; }
private void _SetupChunk() { _FindChunkRoot(); if (chunkRoot) { // Activate the root if inactive (due to backwards compat or recentering if (!chunkRoot.activeSelf) { chunkRoot.SetActive(true); } // Recenter chunk under ourselves if (recenterChunk) { Transform chunkTransform = chunkRoot.transform; chunkTransform.localPosition = Vector3.zero; chunkTransform.localRotation = Quaternion.identity; chunkTransform.localScale = Vector3.one; } // Hook up the child proxy SECTR_Member rootMember = chunkSector.GetComponent <SECTR_Member>(); if (!rootMember) { rootMember = chunkSector.gameObject.AddComponent <SECTR_Member>(); rootMember.BoundsUpdateMode = SECTR_Member.BoundsUpdateModes.Static; rootMember.ForceUpdate(true); } else if (recenterChunk) { rootMember.ForceUpdate(true); } cachedSector.ChildProxy = rootMember; // Unfreeze our sector cachedSector.Frozen = false; if (cachedSector.TopTerrain || cachedSector.BottomTerrain || cachedSector.LeftTerrain || cachedSector.RightTerrain) { cachedSector.ConnectTerrainNeighbors(); if (cachedSector.TopTerrain) { cachedSector.TopTerrain.ConnectTerrainNeighbors(); } if (cachedSector.BottomTerrain) { cachedSector.BottomTerrain.ConnectTerrainNeighbors(); } if (cachedSector.LeftTerrain) { cachedSector.LeftTerrain.ConnectTerrainNeighbors(); } if (cachedSector.RightTerrain) { cachedSector.RightTerrain.ConnectTerrainNeighbors(); } } // Remove the proxy if there is one if (proxy) { GameObject.Destroy(proxy); } loadState = LoadState.Active; } }