예제 #1
0
        public override void Init()
        {
            shadowInfo = new ShadowInfo(Position, this.Angles.Forward(), Resource.GetTexture("effects/flashlight.png"), 1.0f );
            shadowInfo.Linear = 0.01f;
            cheapLight = new SpotLight();
            cheapLight.Linear = 0.01f;

            ShadowTechnique.SetLights += new Action(ShadowTechnique_SetLights);

            AmbientIntensity = 0.0f;
            DiffuseIntensity = 1.0f;

            this.Enabled = true;
            this.ExpensiveShadows = true;
            this.ShouldDraw = false;
        }
예제 #2
0
    public object?Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values?.Length != 4)
        {
            return(Binding.DoNothing);
        }

        if (values[0] is not double ||
            values[1] is not double ||
            values[2] is not ShadowDepth ||
            values[3] is not ShadowEdges)
        {
            return(Binding.DoNothing);
        }

        double width  = (double)values[0];
        double height = (double)values[1];

        if (double.IsNaN(width) || double.IsInfinity(width) || double.IsNaN(height) || double.IsInfinity(height))
        {
            return(Binding.DoNothing);
        }

        DropShadowEffect?dropShadow = ShadowInfo.GetDropShadow((ShadowDepth)values[2]);

        if (dropShadow is null)
        {
            return(null);
        }

        ShadowEdges edges      = (ShadowEdges)values[3];
        double      blurRadius = dropShadow.BlurRadius;

        var rect = new Rect(0, 0, width, height);

        if (edges.HasFlag(ShadowEdges.Left))
        {
            rect = new Rect(rect.X - blurRadius, rect.Y, rect.Width + blurRadius, rect.Height);
        }

        if (edges.HasFlag(ShadowEdges.Top))
        {
            rect = new Rect(rect.X, rect.Y - blurRadius, rect.Width, rect.Height + blurRadius);
        }

        if (edges.HasFlag(ShadowEdges.Right))
        {
            rect = new Rect(rect.X, rect.Y, rect.Width + blurRadius, rect.Height);
        }

        if (edges.HasFlag(ShadowEdges.Bottom))
        {
            rect = new Rect(rect.X, rect.Y, rect.Width, rect.Height + blurRadius);
        }

        var size = new GeometryDrawing(new SolidColorBrush(Colors.White), new Pen(), new RectangleGeometry(rect));

        return(new DrawingBrush(size)
        {
            Stretch = Stretch.None,
            TileMode = TileMode.None,
            Viewport = rect,
            ViewportUnits = BrushMappingMode.Absolute,
            Viewbox = rect,
            ViewboxUnits = BrushMappingMode.Absolute
        });
    }
예제 #3
0
 public override DropShadowEffect?ConvertValue(ShadowDepth value, Type targetType, object parameter, CultureInfo culture)
 {
     return(Clone(ShadowInfo.GetDropShadow(value)));
 }
예제 #4
0
    void CopyModel()
    {
        GameObject objShadow = new GameObject();

        objShadow.transform.position = pos;
        objShadow.transform.rotation = quat;
        objShadow.transform.SetParent(null);
        ShadowModel shadowModel = new ShadowModel();

        shadowModel.alpha = 1;
        SkinnedMeshRenderer[]         msrChild   = GetComponentsInChildren <SkinnedMeshRenderer>();
        MeshRenderer[]                mrChild    = GetComponentsInChildren <MeshRenderer>();
        Dictionary <Mesh, ShadowInfo> ShadowMesh = new Dictionary <Mesh, ShadowInfo>();//静态的mesh 武器挂载点要设置坐标

        //objShadow.AddComponent<MeshRenderer>();
        for (int i = 0; i < msrChild.Length; i++)
        {
            if (!msrChild[i].enabled)
            {
                continue;
            }
            Mesh ms = new Mesh();
            msrChild[i].BakeMesh(ms);
            ShadowInfo      info = new ShadowInfo();
            List <Material> mat  = new List <Material>();
            for (int j = 0; j < msrChild[i].materials.Length; j++)
            {
                mat.Add(Instantiate(msrChild[i].materials[j]));
            }
            info.mat        = mat.ToArray();
            info.attach     = msrChild[i].transform;
            info.normalMesh = false;
            ShadowMesh.Add(ms, info);
        }

        for (int i = 0; i < mrChild.Length; i++)
        {
            if (!mrChild[i].enabled)
            {
                continue;
            }
            Mesh            ms   = mrChild[i].GetComponent <MeshFilter>().mesh;
            ShadowInfo      info = new ShadowInfo();
            List <Material> mat  = new List <Material>();
            for (int j = 0; j < mrChild[i].materials.Length; j++)
            {
                mat.Add(Instantiate(mrChild[i].materials[j]));
            }
            info.mat        = mat.ToArray();
            info.attach     = mrChild[i].transform;
            info.normalMesh = true;
            ShadowMesh.Add(ms, info);
        }



        foreach (var each in ShadowMesh)
        {
            GameObject subMesh = new GameObject();
            subMesh.name = each.Value.attach.name;
            MeshFilter mf = subMesh.AddComponent <MeshFilter>();
            mf.mesh = each.Key;
            MeshRenderer mr = subMesh.AddComponent <MeshRenderer>();
            mr.materials = each.Value.mat;
            subMesh.transform.SetParent(objShadow.transform);

            if (each.Value.normalMesh)
            {
                subMesh.transform.rotation = each.Value.attach.transform.rotation;
                subMesh.transform.position = each.Value.attach.transform.position;
            }
            else
            {
                subMesh.transform.localPosition = Vector3.zero;
                subMesh.transform.localRotation = Quaternion.identity;
            }

            for (int i = 0; i < mr.materials.Length; i++)
            {
                mr.materials[i].SetFloat("_Alpha", alphaInitialize);
                mr.materials[i].SetColor("_TintColor", colorMul);
            }
            //mr.material.SetFloat("_Alpha", shadowModel.alpha);
        }
        shadowModel.shadowLast = shadowLast;
        copyedModel.Add(objShadow, shadowModel);
    }