Exemplo n.º 1
0
        private void RenderHelper(IImageCombinerArg arg1, IImageCombinerArg arg2, IMaterial material, ITexture texture1, ITexture texture2)
        {
            Matrix32 transform1 = Matrix32.Scaling(arg1.Size) * arg1.CalcLocalToParentTransform();
            Matrix32 transform2 = Matrix32.Scaling(arg2.Size) * arg2.CalcLocalToParentTransform();
            // source rectangle
            int numCoords = 4;

            for (int i = 0; i < 4; i++)
            {
                coords[i] = rect[i] * transform1;
            }
            for (int i = 0; i < 4; i++)
            {
                stencil[i] = rect[i] * transform2;
            }
            bool clockwiseOrder = AreVectorsClockwiseOrdered(stencil[0], stencil[1], stencil[2]);

            // clip invisible parts
            for (int i = 0; i < 4; i++)
            {
                int     j  = (i < 3) ? i + 1 : 0;
                Vector2 v1 = clockwiseOrder ? stencil[j] : stencil[i];
                Vector2 v2 = clockwiseOrder ? stencil[i] : stencil[j];
                ClipPolygonByLine(coords, ref numCoords, v1, v2);
            }
            if (numCoords < 3)
            {
                return;
            }
            // Эти матрицы переводят координаты вершин изображения в текстурные координаты.
            Matrix32 uvTransform1 = transform1.CalcInversed();
            Matrix32 uvTransform2 = transform2.CalcInversed();
            Color4   color        = arg1.Color * arg2.Color * Parent.AsWidget.GlobalColor;

            for (int i = 0; i < numCoords; i++)
            {
                vertices[i].Pos   = coords[i];
                vertices[i].Color = color;
                var uv1 = coords[i] * uvTransform1 * arg1.UVTransform;
                var uv2 = coords[i] * uvTransform2 * arg2.UVTransform;
                texture1?.TransformUVCoordinatesToAtlasSpace(ref uv1);
                texture2?.TransformUVCoordinatesToAtlasSpace(ref uv2);
                vertices[i].UV1 = uv1;
                vertices[i].UV2 = uv2;
            }
            Renderer.DrawTriangleFan(material, vertices, numCoords);
        }
Exemplo n.º 2
0
 bool GetArgs(out IImageCombinerArg arg1, out IImageCombinerArg arg2)
 {
     if (Parent != null)
     {
         int index = Parent.Nodes.IndexOf(this);
         if (index < Parent.Nodes.Count - 2)
         {
             arg1 = Parent.Nodes[index + 1] as IImageCombinerArg;
             arg2 = Parent.Nodes[index + 2] as IImageCombinerArg;
             if (arg1 != null & arg2 != null)
             {
                 return(true);
             }
         }
     }
     arg1 = arg2 = null;
     return(false);
 }
Exemplo n.º 3
0
 private ImageCombinerItem(ImageCombiner combiner, IImageCombinerArg arg1, IImageCombinerArg arg2)
 {
     Combiner = combiner;
     Arg1     = arg1;
     Arg2     = arg2;
 }