Esiste un'API Blender per riempire un colore a un certo vertex_colors?
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
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()