예제 #1
0
	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();
	}
예제 #2
0
	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();
	}
예제 #3
0
	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();
	}
예제 #4
0
	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();
	}
예제 #5
0
	void GUICanvas::drawTexture(const HSpriteTexture& texture, const Rect2I& area, TextureScaleMode scaleMode, 
		const Color& color)
	{
		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Image;
		element.color = color;
		element.dataId = (UINT32)mImageData.size();
		element.scaleMode = scaleMode;
		element.imageSprite = bs_new<ImageSprite>();

		mImageData.push_back({ texture, area });
		_markContentAsDirty();
	}
예제 #6
0
	void GUICanvas::drawText(const WString& text, const Vector2I& position, const HFont& font, UINT32 size, 
		const Color& color)
	{
		mElements.push_back(CanvasElement());
		CanvasElement& element = mElements.back();

		element.type = CanvasElementType::Text;
		element.color = color;
		element.dataId = (UINT32)mTextData.size();
		element.size = size;
		element.textSprite = bs_new<TextSprite>();

		mTextData.push_back({ text, font, position });
		_markContentAsDirty();
	}
예제 #7
0
	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();
	}