Existe uma API do Blender para preencher uma cor para um determinado vertex_colors?

Aug 23 2020

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

4 batFINGER Aug 23 2020 at 22:20

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()