// 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; }