From BlenderWiki
[edit] Il Sistema di Plugin di Blender
Questa sezione riporta un approfondito riferimento alla codifica dei plugin di Texture e Sequenze di Blender.
[edit] Scrivere un Plugin Texture
In questa Sezione scriveremo un plugin di texture base e quindi percorreremo i passi per usarlo. La base dietro un plugin texture è che si stanno fornendo alcuni input; posizione e valori delle normali così come qualche altra informazione. Viene quindi restituita l'intensità, il colore e/o l'informazione sulla normale a seconda del tipo di plugin texture.
Tutti i file necessari per lo sviluppo dei plugin così come qualche plugin di esempio si possono trovare in blender/plugins. In alternativa si possono prendere un mucchio di plugin da http://www.cs.umn.edu/~mein/blender/plugins I plugin sono supportati (caricati/chiamati) in Blender usando la famiglia di chiamate dlopen(). Per quelli che non hanno familiarità con il sistema dlopen esso consente ad un programma (Blender) di usare un oggetto compilato come se facesse parte del programma stesso, un po' come le librerie dinamiche eccetto che gli oggetti da caricare vengono determinati in fase di esecuzione.
Il vantaggio di usare il sistema dlopen per i plugin è che consente un accesso molto veloce alle funzioni, e quindi non c'è un sovralavoro nell'interfacciare un plugin, fatto critico quando (come nel caso dei plugin texture) il plugin può essere chiamato diversi milioni di volte in un solo rendering.
Lo svantaggio del sistema è che il codice del plugin funziona proprio come se facesse parte di Blender stesso, se il plugin fallisce, fallisce Blender.
I file include che si trovano nella subdirectory plugin/include/ dell'installazione di Blender documentano le funzionalità di Blender per i plugin. Queste includono le funzioni di libreria Imbuf per il caricamento e la gestione di immagini e buffer di immagini, e funzioni di rumore e turbolenza per la coerenza delle texture.
[edit] Specifiche:
- #include <plugin.h>
- Ogni plugin di Blender dovrebbe includere questa file di intestazione, che contiene tutte le strutture e definizioni necessarie per lavorare in modo appropriato con Blender.
- char name[]="Tiles";
- Una stringa di caratteri contenente il nome del plugin, questo valore apparirà nel titolo della texture nella Pulsantiera della Texture.
- define NR_TYPES 2 char stnames[NR_TYPES][16]= {"Square", "Deformed"};
- Ai plugin è consentito avere un sottotipo diverso per piccole variazioni dell'algoritmo - per esempio la texture di default della nebbia in Blender ha i sotto tipi "Default"e "Color".
NR_STYPES dovrebbe essere definito come il numero di sottotipi richiesti dal plugin, e si dovrebbe fornire un nome per ciascun sottotipo. Ogni plugin dovrebbe avere almeno 1 sottotipo col relativo nome.
- VarStruct varstr[]= {...};
- varstr contiene tutte le informazioni necessarie a Blender per mostrare i pulsanti per il plugin. I pulsanti per i plugin possono essere numerici per dati in ingresso o testo per i commenti o altre informazioni. I plugin sono limitati ad un massimo di 32 variabili. Ciascuna voce della struttura VarStruct consiste in un tipo, un nome, l'informazione di un intervallo ed un 'tool tip'.
- Il tipo definisce il tipo per ciascuna voce del pulsante, ed il modo di mostrare il pulsante. Per i pulsanti numerici tale valore dovrebbe essere una combinazione (OR) di INT o FLO per il formato del numero e NUM, NUMSLI, o TOG, per il tipo di pulsante. I pulsanti testo dovrebbero avere un tipo LABEL.
- Il nome è quello che apparirà sul (o accanto al) pulsante. Il limite è 15 caratteri.
- L'informazione sull'intervallo consiste di tre numeri a virgola mobile che definiscono i valori di default, del minimo ed il massimo del pulsante. Per pulsanti TOG il minimo è lo stato di premuto ed il massimo è lo stato di non-premuto.
- Il tool tip è una stringa che apparirà (se l'utente ha i 'tool tip' attivati) quando il mouse è sopra tale pulsante. Ha un limite di 80 caratteri, e se non utilizzato, dovrebbe essere una stringa NULLA ("").
- typedef struct Cast {...};
- La struttura Cast viene usata nella chiamata alla funzione doit, ed è un modo per semplificare l'accesso ai dati di ciascun plugin.
Cast dovrebbe contenere, nell'ordine, un intero o un float per ogni pulsante definito nella varstr, inclusi i pulsanti testo. Di solito questi dovrebbero avere lo stesso nome dei pulsanti per semplificare i riferimenti.
- float result[8];
- L'array result viene usato per passare informazioni e riceverle dal plugin. i valori di result sono mappati come segue:
Indice di Result Significato Intervallo result[0] valore dell'Intensità [Intensity] da 0.0 a 1.0 result[1] valore del colore Rosso [Red] da 0.0 a 1.0 result[2] valore del colore Verde [Green] da 0.0 a 1.0 result[3] valore del colore Blu [Blue] da 0.0 a 1.0 result[4] valore del colore Alfa [Alpha] da 0.0 a 1.0 result[5] valore dello scostamento della normale X da -1.0 a 1.0 result[6] valore dello scostamento della normale Y da -1.0 a 1.0 result[7] valore dello scostamento della normale Z da -1.0 a 1.0
- Il plugin dovrebbe sempre restituire un valore di intensità. La restituzione dell'RGB o della normale sono facoltative e dovrebbero essere indicate dal flag di ritorno doit() "1" (RGB) o "2" (Normale).
- Prima che venga chiamato il plugin, Blender include la normale del rendering attuale in result[5], result[6] e result[7].
- Before the plugin is called, Blender includes the current rendering-normal in result[5], result[6] and result[7].
- float cfra
- Il valore cfra viene impostato da Blender al valore attuale prima di qualsiasi passo del rendering. Tale valore è un numero di frame +/- .5 a seconda delle impostazioni del campo.
- plugin_tex_doit prototype
- La funzione plugin_tex_doit dovrebbe essere prototipizzata per essere utilizzata dalla funzione getinfo. Non è necessario cambiare questa linea.
- plugin_tex_getversion
- Questa funzione deve essere presente in ciascun plugin affinché sia caricato correttamente. Non la si dovrebbe cambiare.
- plugin_but_changed
- Questa funzione viene usata per passare le informazioni sui pulsanti dell'interfaccia che l'utente modifica. La maggior parte dei plugin non dovrebbe aver necessità di usare tale funzione, solo quando l'interfaccia consente all'utente di modificare qualche variabile che forza 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 texture. 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_tex_doit
- La funzione doit è responsabile della restituzione delle informazioni sul pixel richiesto a Blender.
- Gli Argomenti
- int stype
- Questo è il numero del sottotipo selezionato, vedere le voci precedenti NR_TYPES e char stypes.
- Cast *cast
- La struttura Cast che contiene i dati del plugin, vedere la voce precedente <emphasis role="bold">Cast</emphasis>.
- float *texvec
- Questo è un puntatore a 3 float, che sono le coordinate per cui si deve restituire un valore della texture.
- float *dxt float *dyt
- Se questi puntatori sono non-NULL essi puntano a due vettori (due array di tre float) che definiscono la dimensione del valore della texture richiesto nello spazio del pixel. Essi sono non-NULL solo quando è attivato l'OSA, e vengono usati per calcolare l'antiscalettatura [anti aliasing] appropriata.
- La funzione doit dovrebbe riempire l'array del risultato e restituire 0, 1, 2, o 3 a seconda di quali valori siano stati inseriti. La funzione doit dovrebbe sempre inserire un valore di intensità. Se la funzione inserisce il valore di un colore dovrebbe restituire 1, se la funzione inserisce il valore di una normale dovrebbe restituire 2, se la funzione inserisce tutto dovrebbe restituire 3.
[edit] Interazione tra Texture e Materiale
Blender è piuttosto diverso dalla maggior parte dei pacchetti 3D nella separazione logica tra texture e materiali. In Blender le texture sono oggetti che restituiscono certi valori, generatori di segnali infatti. I materiali controllano la mappatura delle texture negli oggetti, riguarda chi, quanto, in che modo, ecc. I plugin ben progettati dovrebbero includere solo le variabili che riguardano il segnale restituito non la sua mappatura. I pulsanti per controllare il dimensionamento, la gamma di valori, gli assi, ecc. è meglio includerli solo quando rendono la texture più facile da usare (nel caso del pulsante del dimensionamento nel plugin Tiles) o quando velocizzano il calcolo (i sottotipi Intensity/Color/Bump nel plugin Clouds2). Altrimenti la Pulsantiera del Materiale rende ridondanti tali pulsanti, e l'interfaccia diventa inutilmente complessa.
[edit] Plugin di Texture Generico:
#include "plugin.h"
/* Texture name */
char name[24]= "";
#define NR_TYPES 3
char stnames[NR_TYPES][16]= {"Intens","Color", "Bump"};
/* Structure for buttons,
* butcode name default min max 0
*/
VarStruct varstr[]= {
{ NUM|FLO, "Const 1", 1.7, -1.0, 1.0, ""},
};
typedef struct Cast {
float a;
} Cast;
float result[8];
float cfra;
int plugin_tex_doit(int, Cast*, float*, float*, float*);
/* Fixed Functions */
int plugin_tex_getversion(void) {
return B_PLUGIN_VERSION;
}
void plugin_but_changed(int but) { }
void plugin_init(void) { }
void plugin_getinfo(PluginInfo *info) {
info->name= name;
info->stypes= NR_TYPES;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->snames= stnames[0];
info->result= result;
info->cfra= &cfra;
info->varstr= varstr;
info->init= plugin_init;
info->tex_doit= (TexDoit) plugin_tex_doit;
info->callback= plugin_but_changed;
}
int plugin_tex_doit(int stype, Cast *cast, float *texvec, float *dxt, float *dyt) {
if (stype == 1) {
return 1;
} if (stype == 2) {
return 2;
}
return 0;
}
[edit] Le nostre Modifiche:
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. Author: 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.
[edit] Compilazione:
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 sinus.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\texture\sinus lcc -Ic:\blender\plugins\include sinus.c lcclnk -DLL sinus.obj c:\blender\plugins\include\tex.def implib sinus.dll
[edit] Scrittura di un Plugin di Sequenza [Sequence Plugin]
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
[edit] Specifiche:
- #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.
- The Arguments
- 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.
[edit] Plugin di Sequenza Generico:
#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; /* per via 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;
}
[edit] Le nostre modifiche:
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 //.
/* Descrizione: Questo plugin è un esempio di plugin di sequenza che taglia i valori di intensità bassi. Lavoro su di una strip come imput. 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, "Il nostro valore di soglia"},
};
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
[edit] Compilazione:
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
Redirects to fix
- Doc:FR/Manual/Extensions/Plugins System → Doc:FR/Manual/Extensions/Plugins
- Doc:Manual/Extensions/Plugins System → Doc:Manual/Extensions/Plugins
- Manual.it/Manuale → Doc:IT/Manual







![[]](/skins/blender/open.png)
