love.graphics.newMesh (Português)

love.graphics.newMesh


Disponível desde o LÖVE 0.9.0
Esta função não é suportada em versões anteriores.

Cria uma nova Malha.

O.png Esta função pode ser lenta, se for chamada repetidamente, como dentro de love.update ou love.draw. Se você precisa usar um recurso específico com frequência, crie-o uma vez e guarde-o em algum lugar onde possa ser reutilizado!  



Função

Sinopse

malha = love.graphics.newMesh( vertices, textura, modo )

Argumentos

tabela vertices
A tabela contendo tabelas de informação para cada vértice da seguinte forma:
number [1]
A posição do vértice no eixo x.
number [2]
A posição do vértice no eixo y.
number [3]
A textura de coordenada u. Coordenadas de textura ficam normalmente na faixa de [0, 1], mas podem ser menos ou mais (veja ModoDeAcondicionar.)
number [4]
A textura de coordenada v. Coordenadas de textura ficam normalmente na faixa de [0, 1] mas podem ser menos ou mais (veja ModoDeAcondicionar.)
number [5] (255)
O componente de cor vermelha.
number [6] (255)
O componente de cor verde.
number [7] (255)
O componente de cor azul.
number [8] (255)
O componente de cor alfa.
Textura textura (nil)
A Imagem ou Pintura a ser usada ao desenhar a Malha. Pode ser nil para não usar textura nenhuma.
ModoDeDesenhoDeMalha modo ("fan")
Como os vértices serão usados ao desenhar. O modo padrão "fan" (leque) é suficiente para polígonos convexos simples.

Retorna

Malha malha
A nova malha.

Exemplos

Cria e desenha uma Malha idêntica a uma imagem desenhada normalmente, mas com cores diferentes em cada canto

function love.load()
	imagem = love.graphics.newImage("pig.png")
	
	local vertices = {
		{
			-- canto superior esquerdo (avermelhado)
			0, 0, -- posição do vértice
			0, 0, -- coordenada de textura na posição do vértice
			255, 0, 0, -- cor do vértice
		},
		{
			-- canto superior direito (esverdeado)
			image:getWidth(), 0,
			1, 0, -- coordenadas de textura estão entre 0 e 1
			0, 255, 0
		},
		{
			-- canto inferior direito (azulado)
			image:getWidth(), image:getHeight(),
			1, 1,
			0, 0, 255
		},
		{
			-- canto inferior esquerdo (amarelado)
			0, image:getHeight(),
			0, 1,
			255, 255, 0
		},
	}
	
	-- o ModoDeDesenho de Malha "fan" (leque) funciona bem com Malhas de 4 vértices.
	malha = love.graphics.newMesh(vertices, imagem, "fan")
end

function love.draw()
	love.graphics.draw(malha, 0, 0)
end

Cria e desenha um círculo texturizado com o centro avermelhado.

function CriarCirculoTexturizado(imagem, segmentos)
	segmentos = segmentos or 40
	local vertices = {}
	
	-- O primeiro vértice fica no centro, e tem um tom avermelhado. Vamos centralizar o círculo ao redor da origem (0, 0).
	table.insert(vertices, {0, 0, 0.5, 0.5, 255, 0, 0})
	
	-- Criar os vértices na borda do círculo.
	for i=0, segmentos do
		local angulo = (i / segmentos) * math.pi * 2

		-- Círculo unitário.
		local x = math.cos(angulo)
		local y = math.sin(angulo)
		
		-- Nossa posição está na faixa de [-1, 1], mas queremos que a coordenada de textura fique na faixa de [0, 1].
		local u = (x + 1) * 0.5
		local v = (y + 1) * 0.5
		
		-- A cor padrão para cada vértice é branca.
		table.insert(vertices, {x, y, u, v})
	end
	
	-- O modo de desenho "fan" (leque) é perfeito para o nosso círculo.
	return love.graphics.newMesh(vertices, imagem, "fan")
end

function love.load()
	imagem = love.graphics.newImage("pig.png")
	malha = CriarCirculoTexturizado(imagem)
end

function love.draw()
	local raio = 100
	local mx, my = love.mouse.getPosition()
	
	-- Criamos um círculo unitário, então podemos usar o parâmetro de escala diretamente como raio.
	love.graphics.draw(malha, mx, my, 0, raio, raio)
end

Cria um círculo e o desenha com mais eficiência que love.graphics.circle.

function CriarCirculo(segmentos)
	segmentos = segmentos or 40
	local vertices = {}
	
	-- O primeiro vértice fica na origem (0, 0) e será o centro do círculo.
	table.insert(vertices, {0, 0})
	
	-- Cria os vértices na borda do círculo.
	for i=0, segmentos do
		local angulo = (i / segmentos) * math.pi * 2

		-- Círculo unitário.
		local x = math.cos(angulo)
		local y = math.sin(angulo)

		table.insert(vertices, {x, y})
	end
	
	-- O modo de desenho "fan" (leque) é perfeito para o nosso círculo. Não vamos texturizá-lo, então deixamos esse argumento como nil.
	return love.graphics.newMesh(vertices, nil, "fan")
end

function love.load()
	malha = CriarCirculo()
end

function love.draw()
	local raio = 100
	local mx, my = love.mouse.getPosition()
	
	-- Criamos um círculo unitário, então podemos usar o parâmetro de escala diretamente como raio.
	love.graphics.draw(malha, mx, my, 0, raio, raio)
end

Veja Também


Outras Línguas