Exemplo n.º 1
0
 public bool HitTest(Matrix32 worldTransform, Vector2 point, out int tag)
 {
     point = worldTransform.CalcInversed().TransformVector(point);
     foreach (var s in items)
     {
         if (s.HitTest(point, out tag))
         {
             return(true);
         }
     }
     tag = -1;
     return(false);
 }
Exemplo n.º 2
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.º 3
0
            public override void Render()
            {
                // source rectangle
                int numCoords = 4;

                for (int i = 0; i < 4; i++)
                {
                    coords[i]  = rect[i] * Arg1Transform;
                    stencil[i] = rect[i] * Arg2Transform;
                }
                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;
                }
                // Эти матрицы переводят координаты вершин изображения в текстурные координаты.
                var uvTransform1 = Arg1Transform.CalcInversed();
                var uvTransform2 = Arg2Transform.CalcInversed();

                for (int i = 0; i < numCoords; i++)
                {
                    vertices[i].Pos   = coords[i];
                    vertices[i].Color = Color;
                    var uv1 = coords[i] * uvTransform1 * Arg1UVTransform;
                    var uv2 = coords[i] * uvTransform2 * Arg2UVTransform;
                    vertices[i].UV1 = uv1;
                    vertices[i].UV2 = uv2;
                }
                Renderer.Transform1 = LocalToWorldTransform;
                Renderer.DrawTriangleFan(Arg1Texture, Arg2Texture, Material, vertices, numCoords);
            }
Exemplo n.º 4
0
        private static Rectangle CalcLocalScissorAABB(Matrix32 transform)
        {
            // Get the scissor rectangle in 0,0 - 1,1 coordinate space
            var vp = new Rectangle {
                A = new Vector2(viewport.X, viewport.Y),
                B = new Vector2(viewport.X + viewport.Width, viewport.Y + viewport.Height)
            };
            var r           = (Rectangle)(IntRectangle)scissorState.Bounds;
            var scissorRect = new Rectangle {
                A = (r.A - vp.A) / vp.Size,
                B = (r.B - vp.A) / vp.Size
            };

            // Transform it to the normalized OpenGL space
            scissorRect.A = scissorRect.A * 2 - Vector2.One;
            scissorRect.B = scissorRect.B * 2 - Vector2.One;
            // Get the unprojected coordinates
            var invProjection = FixupWVP(Projection).CalcInverted();
            var v0            = invProjection.ProjectVector(scissorRect.A);
            var v1            = invProjection.ProjectVector(new Vector2(scissorRect.B.X, scissorRect.A.Y));
            var v2            = invProjection.ProjectVector(scissorRect.B);
            var v3            = invProjection.ProjectVector(new Vector2(scissorRect.A.X, scissorRect.B.Y));
            // Get coordinates in the widget space
            var invTransform = transform.CalcInversed();

            v0 = invTransform.TransformVector(v0);
            v1 = invTransform.TransformVector(v1);
            v2 = invTransform.TransformVector(v2);
            v3 = invTransform.TransformVector(v3);
            var aabb = new Rectangle {
                A = v0, B = v0
            }.
            IncludingPoint(v1).
            IncludingPoint(v2).
            IncludingPoint(v3);

            return(aabb);
        }
Exemplo n.º 5
0
 void EnumerateMagnets()
 {
     numMagnets = 0;
     if (Parent == null)
     {
         return;
     }
     foreach (Node node in Parent.Nodes)
     {
         ParticlesMagnet magnet = node as ParticlesMagnet;
         if (magnet != null)
         {
             if (numMagnets >= MaxMagnets)
             {
                 break;
             }
             Matrix32 transform   = magnet.CalcLocalToParentTransform();
             Widget   basicWidget = GetBasicWidget();
             if (basicWidget != null)
             {
                 for (Node n = Parent; n != basicWidget; n = n.Parent)
                 {
                     if (n.AsWidget != null)
                     {
                         transform *= n.AsWidget.CalcLocalToParentTransform();
                     }
                 }
             }
             magnets[numMagnets++] = new MagnetData {
                 Magnet = magnet,
                 PrecalcTransitionMatrix    = transform.CalcInversed(),
                 PrecalcInvTransitionMatrix = transform
             };
         }
     }
 }
Exemplo n.º 6
0
            public override void Render()
            {
                arg12CommonArea.Clear();
                arg2Area.Clear();
                for (int i = 0; i < 4; i++)
                {
                    arg12CommonArea.Add(rect[i] * Arg1Transform);
                    arg2Area.Add(rect[i] * Arg2Transform);
                }
                arg1RemainedAreaCount = 0;
                var clockwiseOrder = AreVectorsClockwiseOrdered(arg2Area[0], arg2Area[1], arg2Area[2]);

                for (int i = 0; i < 4; i++)
                {
                    int j  = (i < 3) ? i + 1 : 0;
                    var v1 = clockwiseOrder ? arg2Area[j] : arg2Area[i];
                    var v2 = clockwiseOrder ? arg2Area[i] : arg2Area[j];
                    if (Operation == ImageCombinerOperation.Multiply)
                    {
                        SplitPolygon(arg12CommonArea, splitResult1, splitResult2, v1, v2);
                        Toolbox.Swap(ref arg12CommonArea, ref splitResult1);
                    }
                    else if (Operation == ImageCombinerOperation.CutOut)
                    {
                        SplitPolygon(arg12CommonArea, splitResult1, splitResult2, v1, v2);
                        Toolbox.Swap(ref arg12CommonArea, ref splitResult1);
                        if (splitResult2.Count > 0)
                        {
                            Toolbox.Swap(ref splitResult2, ref arg1RemainedAreas[arg1RemainedAreaCount++]);
                            if (splitResult2 == null)
                            {
                                splitResult2 = new Polygon();
                            }
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
                // Following matrices transform vertices into texture coordinates.
                var uvTransform1 = Arg1Transform.CalcInversed() * Arg1UVTransform;
                var uvTransform2 = Arg2Transform.CalcInversed() * Arg2UVTransform;

                Renderer.Transform1 = LocalToWorldTransform;
                if (Operation == ImageCombinerOperation.Multiply)
                {
                    PrepareVertices(arg12CommonArea);
                    Renderer.DrawTriangleFan(Arg1Texture, Arg2Texture, Arg12CommonMaterial, vertices, arg12CommonArea.Count);
                }
                else
                {
                    for (int i = 0; i < arg1RemainedAreaCount; i++)
                    {
                        PrepareVertices(arg1RemainedAreas[i]);
                        Renderer.DrawTriangleFan(Arg1Texture, null, Arg1Material, vertices, arg1RemainedAreas[i].Count);
                    }
                    PrepareVertices(arg12CommonArea);
                    Renderer.DrawTriangleFan(Arg1Texture, Arg2Texture, Arg12CommonMaterial, vertices, arg12CommonArea.Count);
                }

                void PrepareVertices(Polygon polygon)
                {
                    for (int i = 0; i < polygon.Count; i++)
                    {
                        vertices[i].Pos   = polygon[i];
                        vertices[i].Color = Color;
                        var uv1 = polygon[i] * uvTransform1;
                        var uv2 = polygon[i] * uvTransform2;
                        vertices[i].UV1 = uv1;
                        vertices[i].UV2 = uv2;
                    }
                }
            }