From BlenderWiki

< Doc:ES | Manual | Extensions
Revision as of 04:20, 4 November 2009 by 189.182.130.206 (Talk)
(diff) ← Older revision | Current revision (diff) | Newer revision → (diff)
Jump to: navigation, search

[edit] Sistema de plugins de Blender

Esta sección muestra una referencia detallada de como escribir plugins de Secuencia y de Textura para Blender.

[edit] Escribiendo un plugin de Textura

En esta sección escribiremos un plugin de textura básico y después enseñaremos a usarlo. Los elementos básicos detrás de un plugin de textura consisten en que tu estás dando algunos valores de entrada, tales como posición, etc y alguna información más. Entonces dependiendo del tipo de plugin de textura se te devolverá información sobre la intensidad, el color y/o las normales. Tanto los archivos necesarios para desarrollar los plugins como unos pocos plugins se pueden encontrar en el directorio blender/plugins. Alternativamente puede obtener más plugins de http://www.cs.umn.edu/~mein/blender/plugins. Los plugins son utilizados (cargados/llamados) en Blender a través de dlopen(). Para aquellos que no están familiarizados con el sistema dlopen diremos que este permite a un programa (Blender) usar un objeto compilado como si éste fuese parte del programa mismo, similar a cuando se enlazan librerías dinámicamente, exceptuando que el objeto a cargar se determina cuando se está ejecutando el programa. La ventaja de usar el sistema dlopen para los plugins consiste en que es muy rápido acceder a una función, y además no hay sobrecarga en la interfaz del plugin, lo cual es crítico cuando (como en el caso de los plugins de textura) el plugin se puede llamar varios millones de veces en un único render. La desventaja de este sistema es que el plugin funciona como si realmente fuese parte de Blender, con lo que si el plugin se muere, Blender muere. Los ficheros de cabecera que se encuentran en el subdirectorio plugin/include/ de la instalación de Blender están documentados mostrando las funcionalidades que se proporcionan a los plugins. Dichas funcionalidades incluyen las funciones de las librería Imbuf para cargar y trabajar con imágenes y buffers de imagen, y funciones de ruido y turbulencia para un texturizado consistente.

[edit] Especificación

  • #include <plugin.h>
Todos los plugins de Blender deben incluir este fichero cabecera, que contiene todas las estructuras y definiciones necesarias para trabajar correctamente con Blender.
  • char name[]="Tiles";
Un string (cadena de caracteres) conteniendo el nombre del plugin, este valor se usará para indicar el título de la textura en la ventana de botones de textura
  • define NR_TYPES 2 char stnames[NR_TYPES][16]= {"Square", "Deformed"};
A los Plugins se les permite tener subtipos separados para variaciones minimas en algoritmos - por ejemplo la textura "clouds (nubes)" que está por defecto en Blender tiene los subtipos "Default" y "Color". NR_STYPES debería ser definido con el numero de subtipos que el plugin requiera, y además a cada subtipo se le tiene que dar un nombre. Cada plugin debe tener al menos 1 subtipo y el nombre de ese subtipo.
  • VarStruct varstr[]= {...};
"varstr" contiene toda la información que Blender necesita para mostrar los botones del plugin. Los botones para los plugin pueden ser de tipo numerico para introducir datos, o de tipo texto para introducir comentarios u otra información. Se pueden utilizar como máximo 32 variables en los plugins. Cada estructura VarStruct consta de un tipo, un nombre, un rango de información y una nota emergente sobre la herramienta.
El tipo define el tipo de dato para cada botón, y la manera en la que se muestra dicho botón. Para botones numéricos este valor debería ser una combinación (ORed) de INT o FLO para el formato del numero y NUM, NUMSLI o TOG para el tipo de botón. Los botones de texto son de tipo LABEL.
El nombre es lo que se mostrará en el botón y está limitado a 15 caracteres.
El rango de información consiste en 3 números reales que definen los valores máximo, mínimo y "por defecto" para el botón. Para los botones TOG el mínimo es configurado cuando el botón se haya presionado y el máximo cuando está sin presionar.
La nota emergente (tool tip) es una cadena de caracteres que se mostrará cuando el puntero esté encima del botón (si el usuario tiene los tool tips activos). Tiene un límite de 80 caracteres y se tiene que poner a NULL (") si no se utiliza.
  • typedef struct Cast {...};
La estructura Cast se usa en la llamada a la función doit, y simplifica el acceso de cada plugin a los valores de los datos. La estructura Cast debería contener, en este orden, un entero o numero real por cada botón definido en varstr, incluidos los botones de texto. Típicamente deberían tener el mismo nombre que el botón para permitir una búsqueda o una referencia sencilla.
  • float result[8];
El vector result se usa para enviar y recibir información al plugin. Los valores de result están definidos de esta manera:
Result Indice Significado Rango
result[0] Valor de la intensidad 0.0 to 1.0
result[1] Valor del color rojo 0.0 to 1.0
result[2] Valor del color verde 0.0 to 1.0
result[3] Valor del color azul 0.0 to 1.0
result[4] Valor del color transparente (alpha) 0.0 to 1.0
result[5] Valor del desplazamiento normal en X
result[6] Valor del desplazamiento normal en Y
result[7] Valor del desplazamiento normal en Z
El plugin siempre devuelve el valor de la intensidad. Devolver el color (RGB) o la normal es opcional, y se debería indicar con el "return" de la funcion doit(), siendo "1" para (RGB) y "2" para (Normal).
Antes de que se llame al plugin, Blender asigna el resultado de renderizar normalmente en result[5], result[6] y result[7].
  • float cfra
El valor cfra actualizado por Blender a su valor actual antes de que todos los renders se hagan. Este valor es el numero de frame +/- .5 dependiendo de las configuraciones del campo.
  • plugin_tex_doit prototype
La funcion plugin_tex_doit deberia ser prototipada para que pueda ser usada por la funcion getinfo. No necesita cambiar esta linea.
  • plugin_tex_getversion
Esta funcion deberia estar en cada plugin para que pueda ser cargado correctamente. No debería cambiar esta función.
  • plugin_but_changed
Esta función se usa para pasar información sobre que botones cambia el usuario en la interface. La mayoria de los plugins no necesitan esta función, solo cuando el interface permita al usuario modificar algunas variables que furze al plugin a recalcularse (una tabla hash aleatoria por ejemplo).
  • plugin_init
Si fuese necesario los plugins pueden utilizar esta funcion para inicializar datos internos. NOTA: Esta función de iniciacion se puede llamar varias veces si el mismo plugin de textura se copia. En esta función, no inicialice datos globales especificos a una unica instancia de un plugin.
  • plugin_getinfo
Esta función se usa para comunicar información a Blender. Nunca deberías cambiarla.
  • plugin_tex_doit
La función doit es la responsable de devolver información a Blender sobre pixeles requeridos.
Los Argumentos
  • int stype
Este es el número de subtipos seleccionados, mira las entradas NR_TYPES y char stypes anteriores.
  • Cast *cast
La estructura Cast que contiene los datos del plugin, mira la entrada Cast anterior.
  • float *texvec
Esto es un puntero a 3 floats, los cuales son las coordenadas para las cuales un valor de la textura debe retornarse.
  • float *dxt float *dyt
Si los punteros son no-NULL apuntarán a 2 vectores (2 arrays de 3 floats) que definen el tamaño del valor textura requerida en el espacio pixel Apuntan solo a no-NULL cuando el OSA esté activado, y se usan para calcular adecuadamente el antialiasing.
La función doit debería rellenar el array result y devolver 0, 1, 2 o 3 dependiendo de que valores hayan rellenado el array. La función doit debería siempre rellenarse con el valor intensidad. Si la funcion asigna el valor "color" debería devolver 1, si asigna el valor "normal" debería devolver 2 y si asigna todo devería devolver 3.

[edit] Interacción Texturas/Materiales

Blender es algo diferente de la mayoría de paquetes 3D en lo que se refiere a la separación lógica entre materiales y textura En Blender las texturas son objetos que devuelven ciertos valores, son generadores de señales de hecho. Los materiales controlan el mapeado de texturas en los objetos, lo que está afectado, en que cantidad, en que manera, etc. Plugins adecuadamente diseñados deberían incluir unicamente variables que afecten a la señal devuelta no al mapeado de ella. Es mejor incluir botones para controlar el escalado, el rango, los ejes, etc unicamente cuando hagan a la textura más facil de usar (en caso del botón tamaño en el plugin Tiles) o aceleran el calculo (los subtipos Intensity/Color/Bump en el plugin Clouds2). De otra manera los botones del material hacen a esos botones redundantes, y la interfaz incrementa innecesariamente su complejidad.

[edit] Un plugin de textura genérico:

#include "plugin.h"


/*DEMONGOD*/
/* Nombre de la textura */
char name[24]= ";

#define NR_TYPES 3
char stnames[NR_TYPES][16]= {"Intens","Color", "Bump"};
/* Estructura para los botones,
 * 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*);

/* Funciones fijas */
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] Nuestras modificaciones:

El primer paso es tener un plan. Para qué sirve este plugin y como los usuarios interactuarán con él. Para este ejemplo crearemos una textura sencilla que crea un simple patrón de ladrillos. Ahora copiaremos nuestro plugin generico al archivo cube.c y rellenaremos los espacios vacíos. Es siempre una buena idea añadir algunos comentarios. Lo primero de todo es decir a los usuarios qué hace el plugin, de donde pueden obtener una copia, con quién deberian contactar para mejorarlo o para informar de fallos y cual es la licencia del código. Cuando uses comentarios asegurate de usar /* */. Los plugins están en C y algunos compiladores de C no aceptan los comentarios con el estilo de C++ (//).

/* 
Descripción: Este plugin es un ejemplo de plugin de textura que crea
un simple patrón de ladrillos.

Toma dos valores, el tamaño brick y el tamaño mortar.
El tamaño brick es el tamaño de cada ladrillo.
El tamaño mortar es el tamaño que hay entre los ladrillos (cemento).

Autor: Kent Mein (mein@cs.umn.edu)
Sitio web: <nowiki>http://www.cs.umn.edu/~mein/bender/plugins
Licencia: Dominio Público
Última modificación: Tue Oct 21 0:57:13 CDT 2003
*/
</nowiki>

Lo siguiente que necesitamos será rellenar el nombre, realmente debería ser el mismo que tu fichero .c, preferiblemente descriptivo, con menos de 23 caracteres, sin espacios y todas las letras en minúsculas.

char name[24]= "cube.c";

Vamos a mantener este plugin simple, solo tiene un tipo que está relacionado con la intensidad. Así que necesitamos lo siguiente:

#define NR_TYPES        1
char stnames[NR_TYPES][16]= {"Default"};

Para nuestro interfaz vamos a permitir a la gente cambiar el tamaño del ladrillo, el espaciado entre ellos y los valores de intensidad devueltos por el ladrillo y el espaciado entre ladrillos. Para ello necesitamos modificar varstr y Cast. Cast debería tener una variable por cada entrada que haya en varstr.

/* Estructura para los botones,
 *  butcode      name           default  min  max  Tool tip
 */
VarStruct varstr[]= {
   {NUM|FLO,   "Brick",      .8,    0.1,   1.0, "Size of Cell"},
   {NUM|FLO,   "Mortar",     .1,    0.0,   0.4, "Size of boarder in cell"},
   {NUM|FLO,   "Brick Int",   1,    0.0,   1.0, "Color of Brick"},
   {NUM|FLO,   "Mortar Int",  0,    0.0,   1.0, "Color of Mortar"},
};

typedef struct Cast {
        float brick,mortar, bricki, mortari;
} Cast;

Ahora rellenaremos la función plugin_tex_doit. Basicamente queremos romper nuestra textura en "bloques" que estarán formados de un ladrillo y del espaciado a lo largo de las aristas del ladrillo (cemento) y entonces determinar si estamos en el ladrillo o estamos en el cemento. El código siguiente hace esto.

int plugin_tex_doit(int stype, Cast *cast, float *texvec, float *dxt,
   float *dyt) {
   int c[3];
   float pos[3], cube;

   /* configura el tamaño de nuestro bloque */
   cube = cast->brick + cast->mortar;

   /* necesitamos determinar donde estamos dentro del ladrillo actual. */
   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));

   /* Descubrir si estamos en una posición de cemento 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 que destacar, la función ABS está definida en una cabecera que está en plugins/include. En ese lugar hay otras funciones de uso común por lo que sería aconsejable que echara un vistazo allí.

[edit] Compilando:

bmake es una utilidad simple (shell script) para ayudar a la compilación y desarrollo de plugins, y puede encontrarse en el subdirectorio plugins del directorio de instalación de Blender. Se invoca mediante: bmake (nombre_plugin.c) e intentará enlazar las librerías adecuadas y compilar adecuadamente para su sistema el archivo C especificado. Si usted está intentando desarrollar plugins en una máquina windows, bmake puede no funcionar en este caso; debería usar lcc. Puede usar lo siguiente para compilar un plugin con lcc, asumiendo que usted tiene sus plugins en c:\blender\plugins: Aquí tiene un ejemplo de cómo se compilaría el plugin de textura sinus.c. Abra una ventana DOS y haga lo siguiente: (Nota: Asegúrese de que el directorio lcc\bin está en su path)

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] Escribiendo un plugin de Secuencia

En esta sección escribiremos un plugin de secuencia básico y luego seguiremos los pasos para usar un plugin de secuencia. Las bases de un plugin de secuencia son: se reciben unas entradas (1-3 buffers de imagen de entrada, así como alguna otra información), y se produce como resultado un buffer de imagen de salida. Todos los archivos necesarios para el desarrollo de plugins así como unos pocos plugins de ejemplo pueden encontrarse en el directorio blender/plugins. Puede conseguir adicionalmente un puñado de plugins en http://www.cs.umn.edu/~mein/blender/plugins.

[edit] Especificación:

  • #include <plugin.h>
Todos los plugins de Blender deben incluir este fichero cabecera, que contiene todas las estructuras y definiciones necesarias para trabajar correctamente con Blender.
  • char name[]="Blur";
Un string (cadena de caracteres) conteniendo el nombre del plugin, este valor se usará para indicar el título de la textura en la ventana de botones de textura.
  • VarStruct varstr[]= {...};
"varstr" contiene toda la información que Blender necesita para mostrar los botones del plugin. Los botones para los plugin pueden ser de tipo numerico para introducir datos, o de tipo texto para introducir comentarios u otra información. Se pueden utilizar como máximo 32 variables en los plugins. Cada estructura VarStruct consta de un tipo, un nombre, un rango de información y una nota emergente sobre la herramienta.
El tipo define el tipo de dato para cada botón, y la manera en la que se muestra dicho botón. Para botones numericos este valor debería ser una combinación (ORed) de INT o FLO para el formato del numero y NUM, NUMSLI o TOG para el tipo de botón. Los botones de texto son de tipo LABEL.
El nombre es lo que se mostrará en el botón y está limitado a 15 caracteres.
El rango de información consiste en 3 numeros reales que definen los valores maximo, minimo y "por defecto" para el botón. Para los botones TOG el minimo es configurado cuando el boton se haya presionado y el maximo cuando está sin presionar.
La nota emergente (tool tip) es una cadena de caracteres que se mostrará cuando el puntero esté encima del botón (si el usuario tiene los tool tips activos). Tiene un límite de 80 caracteres y se tiene que poner a NULL (") si no se utiliza.
  • typedef struct Cast {...};
La estructura Cast se usa en la llamada a la función doit, y simplifica el acceso de cada plugin a los valores de los datos. La estructura Cast debería contener, en este orden, un entero o numero real por cada botón definido en varstr, incluidos los botones de texto. Tipicamente deberian tener el mismo nombre que el botón para permitir una busqueda o una referencia sencilla.
  • float cfra
El valor cfra actualizado por Blender a su valor actual antes de que todos los renders se hagan. Este valor es el numero de frame +/- .5 dependiendo de las configuraciones del campo.
  • plugin_seq_doit prototype
La funcion plugin_seq_doit deberia ser prototipada para que pueda ser usada por la funcion getinfo. No necesita cambiar esta linea.
  • plugin_seq_getversion
Esta funcion deberia estar en cada plugin para que pueda ser cargado correctamente. No debería cambiar esta función.
  • plugin_but_changed
Esta función se usa para pasar información sobre que botones cambia el usuario en la interface. La mayoria de los plugins no necesitan esta función, solo cuando el interface permita al usuario modificar algunas variables que furze al plugin a recalcularse (una tabla hash aleatoria por ejemplo).
  • plugin_init
Si fuese necesario los plugins pueden utilizar esta funcion para inicializar datos internos. NOTA: Esta función de iniciacion se puede llamar varias veces si el mismo plugin de textura se copia. En esta función, no inicialice datos globales especificos a una unica instancia de un plugin.
  • plugin_getinfo
Esta función se usa para comunicar información a Blender. Nunca deberías cambiarla.
  • plugin_seq_doit
La función de secuencia doit es responsable de aplicar el efecto del plugin y de copiar los datos finales en el buffer de salida.
Los argumentos
  • Cast *cast
La estructura Cast, que contiene los datos del plugin; véase la entrada Cast más arriba.
  • float facf0
El valor de la curva IPO del plugin para el offset del primer campo. Si el usuario no ha hecho una curva IPO, su rango va entre 0 y 1 para la duración del plugin.
  • float facf1
El valor de la curva IPO del plugin para el offset del segundo campo. Si el usuario no ha hecho una curva IPO, su rango va entre 0 y 1 para la duración del plugin.
  • int x int y
La anchura y altura de los buffers de imagen, respectivamente.
  • int x int y
Un apuntador al primer buffer de imagen al que el plugin está vinculado. Será siempre un buffer de imagen válido.
  • Imbuf *ibuf2
Un apuntador al segundo buffer de imagen al que el plugin está vinculado. Los plugins que usan este buffer deberían comprobar si es un buffer NULL, pues el usuario puede no haber vinculado el plugin a dos buffers.
  • Imbuf *out
El buffer de imagen de la salida del plugin.
  • Imbuf *use
Un apuntador al tercer buffer de imagen al que el plugin está vinculado. Los plugins que usan este buffer deberían comprobar si es un buffer NULL, pues el usuario puede no haber vinculado el plugin a tres buffers.

Estructura de imagen ImBuf La estructura ImBuf contiene siempre 32 bits de datos de píxel ABGR. Las estructuras ImBuf son siempre iguales en tamaño, indicado por los valores de x e y.

Interacción con el usuario Blender no tiene ninguna manera de saber cuántas entradas espera el plugin, por lo que le es posible a un usuario adjuntar sólo una entrada a un plugin que espera dos. Por esta razón es importante comprobar siempre los buffers que usa el plugin para asegurarnos de que son todos válidos. Los plugins de secuencia deberían incluir también una etiqueta de texto describiendo el número de entradas requeridas en la interfaz de botones.

[edit] Plugin de Secuencia Genérico:

#include "plugin.h"
char name[24]= ";

/* estructura para los botones,
 * butcode name default min max 0
 */

VarStruct varstr[]= {
 { LABEL, "In: X strips", 0.0, 0.0, 0.0, "},
};


/* La estructura cast es para entrada en la función doit principal
 Varstr y Cast deben tener las mismas variables en el mismo orden */

typedef struct Cast {
 int dummy; /* debido al botón 'etiqueta' */
} Cast;

/* cfra: el fotograma actual */

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] Nuestras modificaciones:

El primer paso es diseñar un plan de juego. Qué hará este plugin, cómo interactuarán con él los usuarios. Para este ejemplo crearemos un filtro simple que tendrá un botón de deslizamiento para una intensidad de 0-255. Si alguno de los componentes R, G o B de un píxel en la imagen fuente es menos de la intensidad seleccionada, devolverá negro y alfa; de lo contrario devolverá lo que haya en la imagen. Ahora copiaremos nuestro plugin genérico a simpfilt.c y rellenaremos los vacíos. Siempre es una buena idea añadir algunos comentarios. Primero, explicar a los usuarios lo que hace el plugin, dónde pueden obtener una copia, a quién deberían contactar para fallos/mejoras, y cualquier restricción de licencia sobre el código. Al usar comentarios, debemos asegurarnos de usar comentarios del estilo /* */. Los plugins están en c, y algunos compiladores de c no aceptan comentarios del estilo //.

/*
Descripción: Este plugin es un ejemplo de plugin de secuencia que filtra píxeles
de baja intensidad. Funciona con un Strip como entrada.
Autor: Kent Mein (mein@cs.umn.edu)
Sitio web: http://www.cs.umn.edu/~mein/blender/plugins
Licencia: Dominio Público
Última modificación: Sun Sep  7 23:41:35 CDT 2003
*/

Después necesitamos rellenar el Nombre, debería ser el mismo que el archivo .c. Preferiblemente descriptivo, menos de 23 caracteres, sin espacios, y todo minúsculas.

char name[24]= "simpfilt.c";

Cast y varstr necesitan estar sincronizados. Queremos una barra de desplazamiento por lo que haremos lo siguiente:

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;                      /* debido al botón 'etiqueta' */
 	int intensity;
} Cast;

Ahora necesitamos rellenar plugin_seq_doit. Básicamente queremos pasar por cada píxel y si RGB es menor que la intensidad seleccionada, coloca el píxel de salida a: 0,0,0,255; si no, devuelve el mismo valor que el píxel de entrada para esa posición.

  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];
        }
     }
  }

Terminamos pues con simpfilt.c.

[edit] Compilando:

bmake es una utilidad simple (shell script) para ayudar a la compilación y desarrollo de plugins, y puede encontrarse en el subdirectorio plugins/ del directorio de instalación de Blender. Se invoca mediante: bmake (nombre_plugin.c) e intentará enlazar las librerías adecuadas y compilar el archivo C especificado adecuadamente para su sistema. Si usted está intentando desarrollar plugins en una máquina windows, bmake puede no funcionar en este caso; debería usar lcc. Puede usar lo siguiente para compilar un plugin con lcc, asumiendo que usted tiene sus plugins en c:\blender\plugins: Aquí tiene un ejemplo de cómo se compilaría el plugin de secuencia sweep.c. Abra una ventana DOS y haga lo siguiente: (Nota: Asegúrese de que el directorio lcc\bin está en su path)

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.es/Manual → Doc:ES/Manual
  • Manual.es/PartXV/Python Scripting → Doc:ES/Manual/Extensions/Python