Пример #1
0
 public bool IsObjectLighted(LightInfo.ObjectLightedFlag type)
 {
     if (li != null)
     {
         return(li.IsObjectLighted(type));
     }
     else if (liROM != null)
     {
         return(true);
     }
     else
     {
         return(true);
     }
 }
Пример #2
0
    public void ApplySectorLighting(SectorComponent sector, GameObject gao, LightInfo.ObjectLightedFlag objectType)
    {
        if (objectType == LightInfo.ObjectLightedFlag.None)
        {
            if (gao)
            {
                List <Renderer> rs = gao.GetComponents <Renderer>().ToList();
                foreach (Renderer r in rs)
                {
                    if (r.sharedMaterial.shader.name.Contains("Gouraud") || r.sharedMaterial.shader.name.Contains("Texture Blend"))
                    {
                        r.material.SetFloat("_DisableLightingLocal", 1);
                    }
                }
                rs = gao.GetComponentsInChildren <Renderer>(true).ToList();
                foreach (Renderer r in rs)
                {
                    if (r.sharedMaterial.shader.name.Contains("Gouraud") || r.sharedMaterial.shader.name.Contains("Texture Blend"))
                    {
                        r.material.SetFloat("_DisableLightingLocal", 1);
                    }
                }
            }
        }
        else
        {
            if (sector == null)
            {
                return;
            }

            /*Sector s = sector.sector;
             * if (s == null) return;*/
            if (sector.lights != null)
            {
                Vector4?       fogColor          = null;
                Vector4?       fogParams         = null;
                Vector4        ambientLight      = Vector4.zero;
                List <Vector4> staticLightPos    = new List <Vector4>();
                List <Vector4> staticLightDir    = new List <Vector4>();
                List <Vector4> staticLightCol    = new List <Vector4>();
                List <Vector4> staticLightParams = new List <Vector4>();
                for (int i = 0; i < sector.lights.Length; i++)
                {
                    LightBehaviour lb = sector.lights[i];
                    //LightInfo li = lb.li;
                    //if (li == null) continue;
                    //if (!li.IsObjectLighted(objectType)) continue;
                    //if (li.turnedOn == 0x0) continue;
                    switch (lb.Type)
                    {
                    case 4:
                        ambientLight += lb.Color;
                        staticLightPos.Add(new Vector4(lb.transform.position.x, lb.transform.position.y, lb.transform.position.z, lb.Type));
                        staticLightDir.Add(lb.transform.TransformVector(Vector3.back));
                        staticLightCol.Add(lb.Color);
                        staticLightParams.Add(new Vector4(lb.Near, lb.Far, lb.PaintingLightFlag, lb.AlphaLightFlag));
                        break;

                    case 6:
                        if (!fogColor.HasValue)
                        {
                            fogColor  = lb.Color;
                            fogParams = new Vector4(lb.FogBlendNear / 255f, lb.FogBlendFar / 255f, lb.Near, lb.Far);
                        }
                        break;

                    default:
                        staticLightPos.Add(new Vector4(lb.transform.position.x, lb.transform.position.y, lb.transform.position.z, lb.Type));
                        staticLightDir.Add(lb.transform.TransformVector(Vector3.back));
                        staticLightCol.Add(lb.Color);
                        Vector3 scale    = lb.transform.localScale;
                        float   maxScale = Mathf.Max(scale.x, scale.y, scale.z);
                        staticLightParams.Add(new Vector4(lb.Near * maxScale, lb.Far * maxScale, lb.PaintingLightFlag, lb.AlphaLightFlag));
                        break;
                    }
                }
                Vector4[] staticLightPosArray    = staticLightPos.ToArray();
                Vector4[] staticLightDirArray    = staticLightDir.ToArray();
                Vector4[] staticLightColArray    = staticLightCol.ToArray();
                Vector4[] staticLightParamsArray = staticLightParams.ToArray();
                //print(staticLightPosArray.Length + " - " + objectType);
                if (gao)
                {
                    List <Renderer> rs = gao.GetComponents <Renderer>().ToList();
                    foreach (Renderer r in rs)
                    {
                        if (r.sharedMaterial.shader.name.Contains("Gouraud") || r.sharedMaterial.shader.name.Contains("Texture Blend"))
                        {
                            MaterialPropertyBlock props = new MaterialPropertyBlock();
                            r.GetPropertyBlock(props);
                            if (fogColor.HasValue)
                            {
                                props.SetVector("_SectorFog", fogColor.Value);
                            }
                            if (fogParams.HasValue)
                            {
                                props.SetVector("_SectorFogParams", fogParams.Value);
                            }
                            //r.material.SetVector("_SectorAmbient", ambientLight);
                            props.SetFloat("_StaticLightCount", staticLightPosArray.Length);
                            if (staticLightPosArray.Length > 0)
                            {
                                props.SetVectorArray("_StaticLightPos", staticLightPosArray);
                                props.SetVectorArray("_StaticLightDir", staticLightDirArray);
                                props.SetVectorArray("_StaticLightCol", staticLightColArray);
                                props.SetVectorArray("_StaticLightParams", staticLightParamsArray);
                            }
                            r.SetPropertyBlock(props);
                        }
                    }
                    rs = gao.GetComponentsInChildren <Renderer>(true).ToList();
                    foreach (Renderer r in rs)
                    {
                        if (r.sharedMaterial != null &&
                            (r.sharedMaterial.shader.name.Contains("Gouraud") || r.sharedMaterial.shader.name.Contains("Texture Blend")))
                        {
                            MaterialPropertyBlock props = new MaterialPropertyBlock();
                            r.GetPropertyBlock(props);
                            if (fogColor.HasValue)
                            {
                                props.SetVector("_SectorFog", fogColor.Value);
                            }
                            if (fogParams.HasValue)
                            {
                                props.SetVector("_SectorFogParams", fogParams.Value);
                            }
                            //r.material.SetVector("_SectorAmbient", ambientLight);
                            props.SetFloat("_StaticLightCount", staticLightPosArray.Length);
                            if (staticLightPosArray.Length > 0)
                            {
                                props.SetVectorArray("_StaticLightPos", staticLightPosArray);
                                props.SetVectorArray("_StaticLightDir", staticLightDirArray);
                                props.SetVectorArray("_StaticLightCol", staticLightColArray);
                                props.SetVectorArray("_StaticLightParams", staticLightParamsArray);
                            }
                            r.SetPropertyBlock(props);
                        }
                    }
                }
            }
        }
    }