| 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
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 texture che crea una semplice disposizione di blocchi di mattoni.
Ora si copierà il nostro plugin generico cube.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 //.
/* Descrizione: Questo plugin è un esempio di plugin di texture con cui si crea una semplice disposizione a blocchi di mattone. Esso prende due valori la dimensione di un mattone e la dimensione della malta. La dimensione del mattone è la dimensione per ciascun mattone. La dimensione della malta è la dimensione della malta tra ciascun mattone. Autor: Kent Mein (mein@cs.umn.edu) Website: http://www.cs.umn.edu/~mein/blender/plugins Licensing: Public Domain Last Modified: Tue Oct 21 05:57:13 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]= "cube.c"; |
Manterremo semplice questo plugin, ed avrà un solo tipo che riguarda l'intensità. Quindi c'è bisogno di ciò che segue:
#define NR_TYPES 1
char stnames[NR_TYPES][16]= {"Default"};
|
Per l'interfaccia utente si consentirà alle persone di cambiare la dimensione del mattone e della malta, così come i valori di intensità restituiti dal mattone e dalla malta. Per questo bisogna modificare varstr e Cast. Cast dovrebbe avere una variabile per ciascuna voce in varstr.
/* Struttura per i pulsanti,
* codice pulsante nome default min max Tool tip
*/
VarStruct varstr[]= {
{NUM|FLO, "Brick", .8, 0.1, 1.0, "Dimensione della Cella"},
{NUM|FLO, "Mortar", .1, 0.0, 0.4, "Dimensione del contenuto nella cella"},
{NUM|FLO, "Brick Int", 1, 0.0, 1.0, "Colore del Mattone"},
{NUM|FLO, "Mortar Int", 0, 0.0, 1.0, "Colore della Malta"},
};
typedef struct Cast {
float brick,mortar, bricki, mortari;
} Cast;
|
Ora si deve riempire plugin_tex_doit, fondamentalmente si deve dividere la texture in "celle" che consisteranno di un mattone e della malta assieme al bordo inferiore del mattone. Quindi si determina se si è nel mattone o nella malta. Il codice che segue dovrebbe fare ciò.
int plugin_tex_doit(int stype, Cast *cast, float *texvec, float *dxt,
float *dyt) {
int c[3];
float pos[3], cube;
/* impostazione della dimensione della cella */
cube = cast->brick + cast->mortar;
/* bisogna determinare dove sia; l'interno del mattone attuale. */
c[0] = (int)(texvec[0] / cube);
c[1] = (int)(texvec[1] / cube);
c[2] = (int)(texvec[2] / cube);
pos[0] = ABS(texvec[0] - (c[0] * cube));
pos[1] = ABS(texvec[1] - (c[1] * cube));
pos[2] = ABS(texvec[2] - (c[2] * cube));
/* Si cerca di capire se si e' nella posizione della malta all'interno del mattone o no. */
if ((pos[0] <= cast-mortar) || (pos[1] <= cast->mortar) ||
(pos[2] <= cast->mortar)) {
result[0] = cast->mortari;
} else {
result[0] = cast->bricki;
}
return 0;
}
|
Una cosa da notare, la funzione ABS è definita in un header in plugins/include. Lì ci sono altre funzioni comuni si dia uno sguardo.