Beispiel #1
0
    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);
                    }
                    ;
                }
            }
        }
    }
Beispiel #2
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;
        }