private static void _GetRoots(bool includeStatic, bool includeDynamic, List <Transform> rootTransforms, List <Bounds> rootBounds) { if (includeStatic || includeDynamic) { Transform[] allTransforms = (Transform[])GameObject.FindObjectsOfType(typeof(Transform)); foreach (Transform transform in allTransforms) { if (transform.parent == null && ((transform.gameObject.isStatic && includeStatic) || !transform.gameObject.isStatic && includeDynamic)) { Bounds aggregateBounds = new Bounds(); bool initBounds = false; Renderer[] childRenderers = transform.GetComponentsInChildren <Renderer>(); foreach (Renderer renderer in childRenderers) { Bounds renderBounds = renderer.bounds; // Particle bounds are unreliable in editor, so use a unit sized box as a proxy. if (renderer.GetType() == typeof(ParticleSystemRenderer) #if UNITY_OLD_PARTICLES || renderer.GetType() == typeof(ParticleRenderer) #endif ) { renderBounds = new Bounds(transform.position, Vector3.one); } if (!initBounds) { aggregateBounds = renderBounds; initBounds = true; } else { aggregateBounds.Encapsulate(renderBounds); } } Light[] childLights = transform.GetComponentsInChildren <Light>(); foreach (Light light in childLights) { if (!initBounds) { aggregateBounds = SECTR_Geometry.ComputeBounds(light); initBounds = true; } else { aggregateBounds.Encapsulate(SECTR_Geometry.ComputeBounds(light)); } } if (initBounds) { rootTransforms.Add(transform); rootBounds.Add(aggregateBounds); } ; } } } }
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; }