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); }
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); }
private ImageCombinerItem(ImageCombiner combiner, IImageCombinerArg arg1, IImageCombinerArg arg2) { Combiner = combiner; Arg1 = arg1; Arg2 = arg2; }