コード例 #1
0
    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();
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    void OnEnable()
    {
        cachedMember = GetComponent <SECTR_Member>();

        if (FadeIn)
        {
            fadeTexture = new Texture2D(1, 1);
            fadeTexture.SetPixel(0, 0, FadeColor);
            fadeTexture.Apply();
        }
    }
コード例 #4
0
 protected static Terrain GetTerrain(SECTR_Sector sector)
 {
     if (sector)
     {
         SECTR_Member realSector = sector.childProxy ? sector.childProxy : sector;
         return(realSector.GetComponentInChildren <Terrain>());
     }
     else
     {
         return(null);
     }
 }
コード例 #5
0
    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();
    }
コード例 #6
0
    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);
        }
    }
コード例 #7
0
ファイル: SECTR_Member.cs プロジェクト: JesterJ/PGP2
		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;
		}
コード例 #8
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 && (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;
        }
コード例 #9
0
ファイル: SECTR_Sector.cs プロジェクト: Avatarchik/Off-Peak
	/// 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);
	}
コード例 #10
0
 /// 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);
 }
コード例 #11
0
 void OnEnable()
 {
     cachedMember          = GetComponent <SECTR_Member>();
     cachedMember.Changed += new SECTR_Member.MembershipChanged(_MembershipChanged);
 }
コード例 #12
0
 void OnEnable()
 {
     cachedMember = GetComponent <SECTR_Member>();
     cachedMember.ChildCulling = CullEachChild ? SECTR_Member.ChildCullModes.Individual : SECTR_Member.ChildCullModes.Group;
 }
コード例 #13
0
    protected override void OnDisable()
    {
        base.OnDisable();

        cachedMember = null;

        #if UNITY_EDITOR
        EditorApplication.update -= Update;
        #endif
    }
コード例 #14
0
    void OnEnable()
    {
        cachedMember = GetComponent<SECTR_Member>();

        #if UNITY_EDITOR
        EditorApplication.update += Update;
        #endif
    }
コード例 #15
0
 void OnDisable()
 {
     allLODs.Remove(this);
     cachedMember = null;
 }
コード例 #16
0
    /// 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);
    }
コード例 #17
0
 void OnDisable()
 {
     cachedMember = null;
     fadeTexture  = null;
 }
コード例 #18
0
 /// 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);
 }
コード例 #19
0
 void OnEnable()
 {
     cachedMember          = GetComponent <SECTR_Member>();
     cachedMember.Changed += new SECTR_Member.MembershipChanged(_MembershipChanged);
     allOccluders.Add(this);
 }
コード例 #20
0
 void OnEnable()
 {
     cachedMember = GetComponent <SECTR_Member>();
 }
コード例 #21
0
 void OnDisable()
 {
     allOccluders.Remove(this);
     cachedMember.Changed -= new SECTR_Member.MembershipChanged(_MembershipChanged);
     cachedMember          = null;
 }
コード例 #22
0
ファイル: SECTR_Sector.cs プロジェクト: Avatarchik/Off-Peak
	/// 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);
	}
コード例 #23
0
    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;
        }
    }