void GUICanvas::drawPolyLine(const Vector<Vector2I>& vertices, const Color& color)
	{
		if(vertices.size() < 2)
		{
			LOGWRN("Invalid number of vertices. Ignoring call.");
			return;
		}

		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Line;
		element.color = color;
		element.dataId = (UINT32)mTriangleElementData.size();
		element.vertexStart = (UINT32)mVertexData.size();
		element.numVertices = (UINT32)vertices.size();

		mTriangleElementData.push_back(TriangleElementData());
		TriangleElementData& elemData = mTriangleElementData.back();
		elemData.matInfo.groupId = 0;
		elemData.matInfo.tint = color;

		for (auto& vertex : vertices)
		{
			Vector2 point = Vector2((float)vertex.x, (float)vertex.y);
			point += Vector2(0.5f, 0.5f); // Offset to the middle of the pixel

			mVertexData.push_back(point);
		}

		mForceTriangleBuild = true;
		_markContentAsDirty();
	}
	void GUICanvas::drawTriangleList(const Vector<Vector2I>& vertices, const Color& color)
	{
		if (vertices.size() < 3 || vertices.size() % 3 != 0)
		{
			LOGWRN("Invalid number of vertices. Ignoring call.");
			return;
		}

		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Triangle;
		element.color = color;
		element.dataId = (UINT32)mTriangleElementData.size();
		element.vertexStart = (UINT32)mVertexData.size();
		element.numVertices = (UINT32)vertices.size();

		for (auto& vertex : vertices)
			mVertexData.push_back(Vector2((float)vertex.x, (float)vertex.y));

		mTriangleElementData.push_back(TriangleElementData());
		TriangleElementData& elemData = mTriangleElementData.back();
		elemData.matInfo.groupId = 0;
		elemData.matInfo.tint = color;

		mForceTriangleBuild = true;
		_markContentAsDirty();
	}
	void GUICanvas::drawPolyLine(const Vector<Vector2I>& vertices, const Color& color)
	{
		if(vertices.size() < 2)
		{
			LOGWRN("Invalid number of vertices. Ignoring call.");
			return;
		}

		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Line;
		element.color = color;
		element.dataId = (UINT32)mTriangleElementData.size();
		element.vertexStart = (UINT32)mVertexData.size();
		element.numVertices = (UINT32)vertices.size();

		// TODO - Add actual triangle line data here
		for (auto& vertex : vertices)
			mVertexData.push_back(Vector2((float)vertex.x, (float)vertex.y));

		mTriangleElementData.push_back(TriangleElementData());
		TriangleElementData& elemData = mTriangleElementData.back();
		elemData.matInfo.groupId = 0;
		elemData.matInfo.tint = color;
		elemData.matInfo.type = SpriteMaterial::ImageAlpha; // TODO - Use line material here

		mForceTriangleBuild = true;
		_markContentAsDirty();
	}
	void GUICanvas::drawTriangleStrip(const Vector<Vector2I>& vertices, const Color& color)
	{
		if (vertices.size() < 3)
		{
			LOGWRN("Invalid number of vertices. Ignoring call.");
			return;
		}

		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Triangle;
		element.color = color;
		element.dataId = (UINT32)mTriangleElementData.size();
		element.vertexStart = (UINT32)mVertexData.size();
		element.numVertices = (UINT32)(vertices.size() - 2) * 3;

		// Convert strip to list
		for(UINT32 i = 2; i < (UINT32)vertices.size(); i++)
		{
			mVertexData.push_back(Vector2((float)vertices[i - 2].x, (float)vertices[i - 2].y));
			mVertexData.push_back(Vector2((float)vertices[i - 1].x, (float)vertices[i - 1].y));
			mVertexData.push_back(Vector2((float)vertices[i - 0].x, (float)vertices[i - 0].y));
		}

		mTriangleElementData.push_back(TriangleElementData());
		TriangleElementData& elemData = mTriangleElementData.back();
		elemData.matInfo.groupId = 0;
		elemData.matInfo.tint = color;
		elemData.matInfo.type = SpriteMaterial::ImageAlpha;

		mForceTriangleBuild = true;
		_markContentAsDirty();
	}
	void GUICanvas::drawLine(const Vector2I& a, const Vector2I& b, const Color& color)
	{
		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Line;
		element.color = color;
		element.dataId = (UINT32)mTriangleElementData.size();
		element.vertexStart = (UINT32)mVertexData.size();
		element.numVertices = 2;

		// TODO - Add actual triangle line data here
		mVertexData.push_back(Vector2((float)a.x, (float)a.y));
		mVertexData.push_back(Vector2((float)b.x, (float)b.y));

		mTriangleElementData.push_back(TriangleElementData());
		TriangleElementData& elemData = mTriangleElementData.back();
		elemData.matInfo.groupId = 0;
		elemData.matInfo.tint = color;
		elemData.matInfo.type = SpriteMaterial::ImageAlpha; // TODO - Use line material here

		mForceTriangleBuild = true;
		_markContentAsDirty();
	}