Existe uma API do Blender para preencher uma cor para um determinado vertex_colors?
Aproveitando a sugestão desta pergunta , estou testando para fazer um preenchimento de uma cor para um vertex_colors. Funciona bem, mas é muito lento em malhas com muitos polígonos.
ob = context.object
color = (0,0,0,0)
vertex_color = ob.data.vertex_colors['My Vertex color']
i = 0
for p in ob.data.polygons:
for idx in p.loop_indices:
vertex_color.data[i].color = (color)
i += 1
Também encontrei um operador bpy.ops.paint.vertex_color_set()(parece ser duas vezes mais rápido), mas não gosto muito da ideia, além disso, é um operador sem entrada aparentemente
Existe alguma API de liquidificador que faça isso diretamente?
Depois de uma boa resposta:
O código acima é um código que não faz sentido neste caso. Meus testes mudaram para este método (não muito rápido):
for d in vertex_color.data[:]: #Slow method
d.color = (1,0,0,1)
De qualquer forma, dada a resposta do @batFINGER e a ajuda do @lemon, o código agora é 4 vezes ou mais, mais rápido do que antes.
Respostas
Defina todas as cores dos vértices do loop como uma
Use o método foreach set. Exemplo de uso aqui criando curvas bezierhttps://blender.stackexchange.com/a/180184/15543
import bpy
import numpy as np
context = bpy.context
name = "Xxxx"
r, g, b, a = (1, 0, 0, 1) # red
ob = context.object
me = ob.data
color_layer = (me.vertex_colors.get(name)
or me.vertex_colors.new(name=name)
)
ones = np.ones(len(color_layer.data))
color_layer.data.foreach_set(
"color",
np.array((r * ones, g * ones, b * ones, a * ones)).T.ravel(),
)
me.update()
Também poderia simplesmente
np.array((r, g, b, a) * len(color_layer.data)).T.ravel()