Esiste un'API Blender per riempire un colore a un certo vertex_colors?

Aug 23 2020

Prendendo spunto da questa domanda , sto provando a creare un riempimento di un colore in un vertex_colors. Funziona bene, ma è molto lento su mesh con molti poligoni.

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

Ho anche trovato un operatore bpy.ops.paint.vertex_color_set()(sembra essere due volte più veloce) ma l'idea non mi piace molto, in più è un operatore apparentemente senza input

C'è qualche Api frullatore che lo fa direttamente?

Dopo una buona risposta:

Il codice sopra è un codice che non ha senso in questo caso. I miei test sono passati a questo metodo (non molto veloce):

for d in vertex_color.data[:]: #Slow method
    d.color = (1,0,0,1)

In ogni caso, data la risposta di @batFINGER e l'aiuto di @lemon, il codice ora è 4 volte e più, più veloce di prima.

Risposte

4 batFINGER Aug 23 2020 at 22:20

Imposta tutti i colori dei vertici del loop su uno

Utilizzare il metodo set foreach. Esempio di utilizzo qui creando curve di 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()

Potrebbe anche semplicemente

np.array((r, g, b, a) * len(color_layer.data)).T.ravel()