Пример #1
0
    // Given a sprite model, generate the internal VBO mesh
    private __SpriteModel GenerateMesh(Sprite SpriteObj)
    {
        // A square mesh should always be defined in this way:
        //  ^  2 ___ 3     Triangle 1: 0, 2, 1 (turns into the screen)
        //  |   |\  |      Triangle 2: 2, 3, 1
        // y+  0|_\|1
        // x+ ----->
        __SpriteModel Model = new __SpriteModel();

        // 0. Get default color
        Model.UniformColor = SpriteObj.GetColor();

        // 1. Apply size (so we can scale first)
        Model.Vertices[0] = new Vector2(0, 0);
        Model.Vertices[1] = new Vector2(SpriteObj.GetGeometrySize().x, 0);
        Model.Vertices[2] = new Vector2(0, SpriteObj.GetGeometrySize().y);
        Model.Vertices[3] = new Vector2(SpriteObj.GetGeometrySize().x, SpriteObj.GetGeometrySize().y);

        // 2. Rotate
        float Theta = SpriteObj.GetRotation();
        for(int i = 0; i < 4; i++)
        {
            Vector2 Point = new Vector2(Model.Vertices[i].x, Model.Vertices[i].y);
            Point -= SpriteObj.GetRotationCenter();
            Model.Vertices[i].x = Point.x * Mathf.Cos(Theta) - Point.y * Mathf.Sin(Theta);
            Model.Vertices[i].y = Point.y * Mathf.Cos(Theta) + Point.x * Mathf.Sin(Theta);
        }

        // 3. Translate to position
        for(int i = 0; i < 4; i++)
            Model.Vertices[i] += new Vector3(SpriteObj.GetPosition().x, SpriteObj.GetPosition().y, SpriteObj.GetDepth());

        // 4. Copy over the UV values
        // Normalize the frame and offset values
        Vector2 TextureSize = SpriteObj.GetTextureSize();
        Vector2 NormalizedFrame = new Vector2(SpriteObj.GetSpriteSize().x / TextureSize.x, SpriteObj.GetSpriteSize().y / TextureSize.y);
        Vector2 NormalizedPos = new Vector2(SpriteObj.GetSpritePos().x / TextureSize.x, SpriteObj.GetSpritePos().y / TextureSize.y);

        // ***We need to take image coordinaes (top-left origin) and transform them to bottom-left origin

        // UV origin is from the bottom-left
        NormalizedPos.y = 1 - NormalizedPos.y;
        NormalizedPos.y -= NormalizedFrame.y;

        // Compute final UVs
        Model.UVs[0] = new Vector2(NormalizedPos.x, NormalizedPos.y);
        Model.UVs[1] = new Vector2(NormalizedPos.x + NormalizedFrame.x, NormalizedPos.y);
        Model.UVs[2] = new Vector2(NormalizedPos.x, NormalizedPos.y + NormalizedFrame.y);
        Model.UVs[3] = new Vector2(NormalizedPos.x + NormalizedFrame.x, NormalizedPos.y + NormalizedFrame.y);

        // If the texture is flipped, just swap 0 <-> 1 and 2 <-> 3
        if(SpriteObj.GetFlipped())
        {
            Vector2 temp = Model.UVs[0];
            Model.UVs[0] = Model.UVs[1];
            Model.UVs[1] = temp;

            temp = Model.UVs[2];
            Model.UVs[2] = Model.UVs[3];
            Model.UVs[3] = temp;
        }

        // Done!
        return Model;
    }