=Texture Plugins=
authorChris Want <cwant@ualberta.ca>
Wed, 22 Nov 2006 15:53:46 +0000 (15:53 +0000)
committerChris Want <cwant@ualberta.ca>
Wed, 22 Nov 2006 15:53:46 +0000 (15:53 +0000)
Added a callback instance_init() so that any particular instance of a
texture plugin can initialize data. Updated the clouds2 and tile example
plugins to have a (dummy) call back.

release/plugins/texture/clouds2.c
release/plugins/texture/tiles.c
source/blender/blenkernel/BKE_plugin_types.h
source/blender/blenkernel/intern/texture.c
source/blender/blenloader/intern/readfile.c
source/blender/blenpluginapi/plugin.h
source/blender/makesdna/DNA_texture_types.h

index 5f77dba90fe6db8b975df91fb40c01da76a77c62..69f890e4df3870271460a0107bb03068366d572f 100644 (file)
@@ -77,6 +77,7 @@ float result[8];
 float cfra;
 
 int plugin_tex_doit(int, Cast*, float*, float*, float*);
+void plugin_instance_init(Cast*);
 
 /* ******************** Fixed functions ***************** */
 
@@ -94,6 +95,14 @@ void plugin_init(void)
        
 }
 
+/* 
+ * initialize any data for a particular instance of
+ * the plugin here
+ */
+void plugin_instance_init(Cast *cast)
+{
+}
+
 /* this function should not be changed: */
 
 void plugin_getinfo(PluginInfo *info)
@@ -110,6 +119,7 @@ void plugin_getinfo(PluginInfo *info)
        info->init= plugin_init;
        info->tex_doit=  (TexDoit) plugin_tex_doit;
        info->callback= plugin_but_changed;
+       info->instance_init= (void (*)(void *)) plugin_instance_init;
 }
 
 /* ********************* the texture ******************** */
index 96d35198aee15e94ebffb1966c1e11314044e3b4..2bdf669f9ca08559143b0e6cc08dd6d082bf0b46 100644 (file)
@@ -66,7 +66,7 @@ float result[8];
 float cfra;
 
 int plugin_tex_doit(int, Cast *, float *, float *, float *);
-
+void plugin_instance_init(Cast*);
 
 /* ******************** Fixed functions ***************** */
 
@@ -83,6 +83,14 @@ void plugin_init(void)
 {
 }
 
+/* 
+ * initialize any data for a particular instance of
+ * the plugin here
+ */
+void plugin_instance_init(Cast *cast)
+{
+}
+
 /* this function should not be changed: */
 
 void plugin_getinfo(PluginInfo *info)
@@ -99,6 +107,8 @@ void plugin_getinfo(PluginInfo *info)
        info->init= plugin_init;
        info->tex_doit=  (TexDoit) plugin_tex_doit;
        info->callback= plugin_but_changed;
+       info->instance_init= (void (*)(void *)) plugin_instance_init;
+
 }
 
 /* ************************************************************
index 338cfee72915bece79704409b711d8fae50cc82b..2b7c6c06832a183889748b963eea777f72f22eed 100644 (file)
@@ -65,6 +65,7 @@ typedef struct _PluginInfo {
        void (*callback)(int);
        TexDoit tex_doit;
        SeqDoit seq_doit;
+       void (*instance_init)(void *);
 } PluginInfo;
 
 #endif
index 3f78ad3a1d66f82e97c1a0aa2266327c7160e7c7..62ac911bea7fc70d8c4ac98cbcb4f309df9db7b5 100644 (file)
@@ -136,6 +136,7 @@ void open_plugin_tex(PluginTex *pit)
 
                                info_func= (int (*)(PluginInfo *))PIL_dynlib_find_symbol(pit->handle, "plugin_getinfo");
                                if (!test_dlerr(pit->name, "plugin_getinfo")) {
+                                       info->instance_init = NULL;
 
                                        info_func(info);
 
@@ -148,6 +149,7 @@ void open_plugin_tex(PluginTex *pit)
                                        pit->varstr= info->varstr;
                                        pit->result= info->result;
                                        pit->cfra= info->cfra;
+                                       pit->instance_init = info->instance_init;
                                        if (info->init) info->init();
                                }
                                MEM_freeN(info);
@@ -191,6 +193,9 @@ PluginTex *add_plugin_tex(char *str)
                        *((int *)(pit->data+a))= (int) varstr->def;
        }
 
+       if (pit->instance_init)
+               pit->instance_init((void *) pit->data);
+
        return pit;
 }
 
index 807af79f76bcdb611c84edea36ced4c5238fdf15..1a00ff1490c7cd8c4b181c8b7cc7d7b2229ad240 100644 (file)
@@ -2255,6 +2255,11 @@ static void direct_link_texture(FileData *fd, Tex *tex)
        if(tex->plugin) {
                tex->plugin->handle= 0;
                open_plugin_tex(tex->plugin);
+               /* initialize data for this instance, if an initialization
+                * function exists.
+                */
+               if (tex->plugin->instance_init)
+                       tex->plugin->instance_init((void *) tex->plugin->data);
        }
        tex->coba= newdataadr(fd, tex->coba);
        tex->env= newdataadr(fd, tex->env);
index f7ffc7e7c8eef8db6b9ac28167ecc75f60891827..b9048b928789c63423e0c07f9be88c69586f7957 100644 (file)
@@ -62,6 +62,8 @@ typedef struct _PluginInfo {
        void (*callback)(int);
        TexDoit tex_doit;
        SeqDoit seq_doit;
+
+       void (*instance_init)(void *);
 } PluginInfo;
 
 int plugin_tex_getversion(void);
index b93276624d5fb63ee623cc59a6619196bb531682..01de2196f8c6fb87bbfe145555f55f3d9004c612 100644 (file)
@@ -89,6 +89,7 @@ typedef struct PluginTex {
        float data[32];
 
        int (*doit)(void);
+       void (*instance_init)(void *);
 
        /* should be void (*)(unsigned short)... patched */     
        void (*callback)(dna_ushort_fix);