| Documentazione di Blender Volume I - Guida Utente: Ultima modifica 5 Settembre 2005 | ||
|---|---|---|
| Indietro | Capitolo 27. Il Sistema di Plugin di Blender | Avanti |
A partire da Blender v2.31
In questa sezione si scriverà un plugin di sequenza elementare e quindi si percorreranno i passi per usare un plugin di sequenza. Le basi dietro un plugin di sequenza sono degli input: da 1 a 3buffer di immagini in ingresso così come qualche altra informazione e restituisce il buffer dell'immagine risultante.
Tutti i file necessari allo sviluppo dei plugin così come un paio di plugin di esempio si trovano nella directory blender/plugins. In alternativa si possono prendere un bel po' di plugin da http://www.cs.umn.edu/~mein/blender/plugins
A partire da Blender v2.31
#include <plugin.h>
Ogni plugin di Blender dovrebbe includere questo file di intestazione, che contiene tutte le strutture e definizioni per lavorare appropriatamente con Blender.
char name[]="Blur";
Una stringa di caratteri contenente il nome del plugin, questo valore apparirà come titolo della texture nella Pulsantiera della Texture.
VarStruct varstr[]= {...};
varstr contiene tutte le informazioni necessarie a Blender per mostrare i pulsanti del plugin. I pulsanti del plugin possono essere numerici per l'immissione di dati, o testuali per commenti ed altre informazioni. I plugin sono limitati ad un massimo di 32 variabili.
Ciascuna voce di VarStruct consiste in un tipo, un nome, un l'informazione sull'intervallo ed un tool tip.
Il tipo [type] definisce il tipo di dati per ciascuna voce del pulsante, ed il modo di mostrare il pulsante. Per pulsanti numerici tale valore dovrebbe essere una combinazione (OR) di INT e FLO per il formato numerico, e NUM, NUMSLI, e TOG, per il tipo di pulsante. I pulsanti testo dovrebbero essere di tipo LABEL.
Il nome [name] è quello che apparirà sul (a accanto al) pulsante. Questo è limitato a 15 caratteri.
L'informazione sull'intervallo [range] consiste in tre float che definiscono il default, il minimo ed massimo dei valori del pulsante. Per i pulsanti interruttori [TOG] il minimo è impostato allo stato premuto, il massimo allo stato di non premuto.
Il tool tip è la stringa che apparirà quando il mouse è sopra il pulsante( se l'utente ha i tool tip attivati). Questo è limitato ad 80 caratteri, e dovrebbe essere posto ad una stringa NULL ("") se inutilizzato.
typedef struct Cast {...};
La struttura cast viene utilizzata nella chiamata alla funzione doit e serve per semplificare l'accesso ai dati di ogni plugin.
cast dovrebbe contenere, nell'ordine, un intero o un float per ogni pulsante definito in varstr, inclusi i pulsanti testo. Di solito dovrebbero avere lo stesso nome del pulsante per semplificare i riferimenti.
float cfra
Il valore cfra è impostato da Blender al valore attuale prima di ogni passo del rendering. Questo valore è un numero di frame +/- .5 a seconda delle impostazioni del campo.
plugin_seq_doit prototype
La funzione plugin_seq_doit dovrebbe essere prototipizzata per essere usata dalla funzione getinfo. Non è necessario cambiare questa linea.
plugin_seq_getversion
Questa funzione deve stare in ciascun plugin affinché sia caricato correttamente. Non si dovrebbe cambiare questa funzione.
plugin_but_changed
Questa funzione viene usata per passare le informazioni su quali pulsanti l'utente cambia nell'interfaccia. La maggior parte dei plugin non ha bisogno di usare questa funzione, solo quando l'interfaccia consente all'utente di cambiare qualche variabile che obbliga il plugin a rifare il calcolo (per esempio una tabella hash random ).
plugin_init
Se necessario i plugin possono utilizzare questa funzione per inizializzare i dati interni. NOTA: Questa funzione di init può essere chiamata più volte se viene copiato lo stesso plugin di sequenza. In questa funzione non inizializza i dati globali specifici di una singola istanza di plugin.
plugin_getinfo
Questa funzione viene chiamata per comunicare delle informazioni a Blender. Non dovrebbe essere necessario modificarla.
plugin_seq_doit
La funzione doit di sequenza è responsabile di applicare l'effetto del plugin e copiare il dato finale nel buffer di uscita.
Gli Argomenti
Cast *cast
La struttura Cast che contiene i dati del plugin, vedere la voce precedente Cast.
float facf0
Il valore della curva IPO del plugin per lo spostamento [offset] del primo campo. Se l'utente non ha creato una curva IPO questo spazia da 0 a 1 per la durata del plugin.
float facf1
Il valore della curva IPO del plugin per lo spostamento [offset] del secondo campo. Se l'utente non ha creato una curva IPO questo spazia da 0 a 1 per la durata del plugin.
int x int y
La larghezza e l'altezza, rispettivamente, del buffer dell'immagine.
Imbuf *ibuf1
Un puntatore al primo buffer dell'immagine con cui è collegato il plugin. Sarà sempre un buffer di immagine valido.
Imbuf *ibuf2
Un puntatore al secondo buffer dell'immagine con cui è collegato il plugin. I plugin che usano questo buffer dovrebbero verificare che non sia un buffer NULL, nel caso l'utente potrebbe non aver collegato il plugin a due buffer.
Imbuf *out
Il buffer immagine per l'uscita del plugin.
Imbuf *use
Un puntatore al terzo buffer dell'immagine con cui è collegato il plugin. I plugin che usano questo buffer dovrebbero verificare che non sia un buffer NULL, nel caso l'utente potrebbe non aver collegato il plugin a tre buffer.
Struttura immagine ImBuf
La struttura ImBuf contiene sempre 32 bit RGBA di dati sul pixel.
La struttura ImBuf ha sempre le dimensioni uguali, indicate valori passati di x e y.
Interazione con l'Utente
Non c'è modo per blender di sapere quanti input si aspetta un plugin, così è possibile per un utente includere solo un input ad un plugin che ne aspetta due. Per questa ragione è importante verificare sempre i buffer che usa il plugin per essere sicuri che siano sempre validi. I plugin di sequenza dovrebbero includere anche un'etichetta di testo con la descrizione degli input richiesti nell'interfaccia dei pulsanti.
#include "plugin.h"
char name[24]= "";
/* struttura per i pulsanti,
* codice pulsante nome default min max 0
*/
VarStruct varstr[]= {
{ LABEL, "In: X strips", 0.0, 0.0, 0.0, ""},
};
/* La struttura cast è per l'input nella funzione principale doit
Varstr e Cast devono avere le stesse variabili nello stesso ordine */
typedef struct Cast {
int dummy; /* a causa del pulsante 'label' */
} Cast;
/* cfra: il frame corrente */
float cfra;
void plugin_seq_doit(Cast *, float, float, int, int,
ImBuf *, ImBuf *, ImBuf *, ImBuf *);
int plugin_seq_getversion(void) {
return B_PLUGIN_VERSION;
}
void plugin_but_changed(int but) {
}
void plugin_init() {
}
void plugin_getinfo(PluginInfo *info) {
info->name= name;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->cfra= &cfra;
info->varstr= varstr;
info->init= plugin_init;
info->seq_doit= (SeqDoit) plugin_seq_doit;
info->callback= plugin_but_changed;
}
void plugin_seq_doit(Cast *cast, float facf0, float facf1, int xo, int yo,
ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *outbuf, ImBuf *use) {
char *in1= (char *)ibuf1->rect;
char *out=(char *)outbuf->rect;
} |
Il primo passo inizia col progetto di un gioco. Cosa deve fare questo plugin, come l'utente deve interagire con esso. Per questo esempio si creerà una semplice filtro che avrà uno slider per l'intensità da 0 a 255. Se ciascuna delle componenti R,G, e B di un pixel nell'immagine sorgente è inferiore all'intensità scelta, ritornerà nero ed alfa, altrimenti tornerà quello che era nell'immagine. Ora si copierà il plugin generico in simpfilt.c e si faranno le aggiunte.
Aggiungere dei commenti è sempre una buona idea. Prima si dice agli utenti cosa fa il plugin, dove si può prenderne una copia, chi contattare per modifiche/bug, e qualsiasi limitazione di licenza del codice. Quando si usano commenti ci si assicuri di usare lo stile /* */. I plugin sono in C e qualche compilatore C non accetta lo stile //.
/*
Description: This plugin is a sample sequence plugin that filters out lower
intensity pixels. I works on one strip as input.
Author: Kent Mein (mein@cs.umn.edu)
Website: http://www.cs.umn.edu/~mein/blender/plugins
Licensing: Public Domain
Last Modified: Sun Sep 7 23:41:35 CDT 2003
*/
|
Successivamente si inserisce il nome [Name], in realtà dovrebbe essere lo stesso del file .c. Preferibilmente descrittivo, con meno di 23 caratteri, senza spazi e tutto in minuscolo.
char name[24]= "simpfilt.c"; |
Cast e varstr devono essere sincronizzate. Si vuole un solo slider quindi si fa ciò che segue:
varStruct varstr[]= {
{ LABEL, "In: 1 strips", 0.0, 0.0, 0.0, ""},
{ NUM|INT, "Intensity", 10.0, 0.0, 255.0, "Our threshold value"},
};
typedef struct Cast {
int dummy; /* per il pulsante 'label' */
int intensity;
} Cast;
|
Ora si deve riempire plugin_seq_doit. Fondamentalmente si vuol fare un loop per ciascun pixel e se RGB sono inferiori dell'intensità imposta l'output a: 0,0,0,255 altrimenti lo imposta al valore dell'input per quella posizione.
int x,y;
for(y=0;y cast->intensity) &&
(in1[1] > cast->intensity) &&
(in1[2] > cast->intensity)) {
out[0] = out[1] = out[2] = 0;
out[3] = 255;
} else {
out[0] = in1[0];
out[1] = in1[1];
out[2] = in1[2];
out[3] = in1[3];
}
}
}
|
Quindi si deve concludere con simpfilt.c
bmake è una semplice utility (uno script shell) di aiuto alla compilazione e sviluppo dei plugin e la si può trovare nella sub-directory plugins/ della directory di installazione di Blender. Viene richiamato con: bmake (plugin_name.c) e proverà a linkare le librerie giuste e compilare il file C indicato in modo appropriato al proprio sistema. Se si prova a sviluppare dei plugin su una macchina Windows, bmake potrebbe non funzionare. Nel qual caso si deve vedere di usare lcc. Per compilare un plugin con lcc si può usare: Si assume che si abbiano i plugin c:\blender\plugins. Qui c'è un esempio di come si dovrebbe compilare il plugin di texture sweep.c. Si apre una finestra dos e si digita: (Nota: Ci si dovrà assicurare che nel path ci sia la directory lcc\bin)
cd c:\blender\plugins\sequence\sweep
lcc -Ic:\blender\plugins\include sweep.c
lcclnk -DLL sweep.obj c:\blender\plugins\include\seq.def
implib sweep.dll
|