API structuring improvements according to design guidelines by Brecht,
authorArystanbek Dyussenov <arystan.d@gmail.com>
Thu, 18 Jun 2009 09:50:34 +0000 (09:50 +0000)
committerArystanbek Dyussenov <arystan.d@gmail.com>
Thu, 18 Jun 2009 09:50:34 +0000 (09:50 +0000)
for more info see
http://lists.blender.org/pipermail/bf-taskforce25/2009-June/000954.html.

Created *_api.c files in makesrna/intern. Among these only rna_api.c
is compiled on preprocesssing step. It contains code declaring RNA
struct functions, for example RNA_api_mesh declares all functions on
Mesh. The rest *_api.c files contain functions themselves.

Removed interface_api.c and moved its contents to rna_api.c.

Added remove_mesh function on Main.

Replaced copy and copy_mesh on Mesh with make_rendermesh which currently
does the same as copy_applied did (grasping mesh-related stuff needs
time).

SConscript tweaking so it builds ok.

13 files changed:
source/blender/editors/interface/SConscript
source/blender/editors/mesh/editmesh.c
source/blender/makesrna/intern/SConscript
source/blender/makesrna/intern/main_api.c [new file with mode: 0644]
source/blender/makesrna/intern/mesh_api.c [new file with mode: 0644]
source/blender/makesrna/intern/rna_api.c [moved from source/blender/editors/interface/interface_api.c with 82% similarity]
source/blender/makesrna/intern/rna_context.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_main.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_wm.c
source/blender/makesrna/intern/wm_api.c [new file with mode: 0644]
source/blender/python/intern/bpy_operator_wrap.c

index bac3742c12feed313f42094177afddaede8026ef..a05756ed9c6215882026a0eab980e0e58a1d4881 100644 (file)
@@ -3,8 +3,8 @@ Import ('env')
 
 sources = env.Glob('*.c')
 
-for source in env.Glob('*_api.c'):
-       sources.remove(source)
+for source in env.Glob('*_api.c'):
+#      sources.remove(source)
 
 incs = '../include ../../blenlib ../../blenfont ../../blenkernel ../../makesdna ../../imbuf'
 incs += ' ../../makesrna ../../windowmanager #/intern/guardedalloc'
index 33174e31df59b0c3e616fea17c6950ad9ad50b7a..b6cc57990a3807abd878dab2fc50cb80d48092f5 100644 (file)
@@ -2028,35 +2028,11 @@ void em_setup_viewcontext(bContext *C, ViewContext *vc)
        }
 }
 
-/* Python API */
-void copy_mesh_data(Mesh *dest, Mesh *src);
-
-Mesh *RNA_api_add_mesh(Main *main, char *name)
-{
-       return add_mesh(name);
-}
-
-void RNA_api_mesh_copy(Mesh *me, Mesh *from)
-{
-       copy_mesh_data(me, from);
-}
-
-void RNA_api_mesh_copy_applied(Mesh *me, Scene *sce, Object *ob)
-{
-       DerivedMesh *dm= mesh_create_derived_view(sce, ob, CD_MASK_MESH);
-       DM_to_mesh(dm, me);
-       dm->release(dm);
-}
-
-void RNA_api_mesh_transform(Mesh *me, float **mat)
-{
-}
-
 /*
  * This version of copy_mesh doesn't allocate a new mesh,
  * instead it copies data between two existing meshes.
  *
- * XXX is this already possible with DerivedMesh?
+ * XXX not used anywhere...
  */
 void copy_mesh_data(Mesh *dest, Mesh *src)
 {
index 9c8e00da16d617246a5600423dc0622cb79a0e1c..0ad14553bfba5e5ab61aa38b3259602744d1c8e6 100644 (file)
@@ -13,12 +13,17 @@ root_build_dir=normpath(env['BF_BUILDDIR'])
 source_files = env.Glob('*.c')
 source_files.remove('rna_access.c')
 
+api_runtime_files = env.Glob('*_api.c')
+for api_file in api_runtime_files:
+    source_files.remove(api_file)
+
 generated_files = source_files[:]
 generated_files.remove('rna_define.c')
 generated_files.remove('makesrna.c')
 generated_files = [filename[:-2] + '_gen.c' for filename in generated_files]
 
-source_files.extend(env.Glob('../../editors/*/*_api.c'))
+# source_files.extend(env.Glob('../../editors/*/*_api.c'))
+source_files.extend(env.Glob('rna_api.c'))
 
 makesrna_tool = env.Clone()
 rna = env.Clone()
@@ -110,8 +115,9 @@ else:
                rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna.exe "  + build_dir)
 
 
+api_runtime_files.remove('rna_api.c')
 obj = ['intern/rna_access.c']
-for generated_file in generated_files:
+for generated_file in generated_files + api_runtime_files:
        obj += ['intern/' + generated_file]
 
 Return ('obj')
diff --git a/source/blender/makesrna/intern/main_api.c b/source/blender/makesrna/intern/main_api.c
new file mode 100644 (file)
index 0000000..5d9e1f5
--- /dev/null
@@ -0,0 +1,26 @@
+#include <stdlib.h>
+
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_library.h"
+
+#include "BLI_listbase.h"
+
+#include "DNA_mesh_types.h"
+
+Mesh *RNA_api_main_add_mesh(Main *main, char *name)
+{
+       return add_mesh(name);
+}
+
+void RNA_api_main_remove_mesh(Main *main, Mesh *me)
+{
+       if (BLI_findindex(&main->mesh, me) == -1) {
+               /* XXX report error */
+               return;
+       }
+
+       /* XXX correct ? */
+       if (me->id.us == 1)
+               free_libblock(&main->mesh, me);
+}
diff --git a/source/blender/makesrna/intern/mesh_api.c b/source/blender/makesrna/intern/mesh_api.c
new file mode 100644 (file)
index 0000000..e9437e2
--- /dev/null
@@ -0,0 +1,42 @@
+#include <stdlib.h>
+
+#include "DNA_mesh_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_blenlib.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_mesh.h"
+
+
+/*
+void RNA_api_mesh_copy(Mesh *me, Mesh *from)
+{
+       copy_mesh_data(me, from);
+}
+
+void RNA_api_mesh_copy_applied(Mesh *me, Scene *sce, Object *ob)
+{
+       DerivedMesh *dm= mesh_create_derived_view(sce, ob, CD_MASK_MESH);
+       DM_to_mesh(dm, me);
+       dm->release(dm);
+}
+*/
+
+/* copied from init_render_mesh (render code) */
+void RNA_api_mesh_make_rendermesh(Mesh *me, Scene *sce, Object *ob)
+{
+       CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
+       DerivedMesh *dm= mesh_create_derived_render(sce, ob, mask);
+
+       /* XXX report reason */
+       if(dm==NULL) return;
+       
+       DM_to_mesh(dm, me);
+       dm->release(dm);
+}
+
+void RNA_api_mesh_transform(Mesh *me, float **mat)
+{
+}
similarity index 82%
rename from source/blender/editors/interface/interface_api.c
rename to source/blender/makesrna/intern/rna_api.c
index b4e7dc03506ed0cd3155621a5aeca894cb3aa280..fa594c5929e5b20848f4e79a3c55126666c896bc 100644 (file)
 
 #include "UI_interface.h"
 
+
+void RNA_api_main(StructRNA *srna)
+{
+       FunctionRNA *func;
+       PropertyRNA *prop;
+
+       func= RNA_def_function(srna, "add_mesh", "RNA_api_main_add_mesh");
+       RNA_def_function_ui_description(func, "Add a new mesh.");
+       prop= RNA_def_string(func, "name", "", 0, "", "New name for the datablock.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       prop= RNA_def_pointer(func, "mesh", "Mesh", "", "A new mesh.");
+       RNA_def_function_return(func, prop);
+
+       func= RNA_def_function(srna, "remove_mesh", "RNA_api_main_remove_mesh");
+       RNA_def_function_ui_description(func, "Remove a mesh if it has only one user.");
+       prop= RNA_def_pointer(func, "mesh", "Mesh", "", "A mesh to remove.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+}
+
+void RNA_api_mesh(StructRNA *srna)
+{
+       FunctionRNA *func;
+       PropertyRNA *prop;
+
+       /*
+       func= RNA_def_function(srna, "copy", "RNA_api_mesh_copy");
+       RNA_def_function_ui_description(func, "Copy mesh data.");
+       prop= RNA_def_pointer(func, "src", "Mesh", "", "A mesh to copy data from.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);*/
+
+       func= RNA_def_function(srna, "make_rendermesh", "RNA_api_mesh_make_rendermesh");
+       RNA_def_function_ui_description(func, "Copy mesh data from object with all modifiers applied.");
+       prop= RNA_def_pointer(func, "sce", "Scene", "", "Scene.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       prop= RNA_def_pointer(func, "ob", "Object", "", "Object to copy data from.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+
+       /*
+       func= RNA_def_function(srna, "add_geom", "RNA_api_mesh_add_geom");
+       RNA_def_function_ui_description(func, "Add geometry data to mesh.");
+       prop= RNA_def_collection(func, "verts", "?", "", "Vertices.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       prop= RNA_def_collection(func, "faces", "?", "", "Faces.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       */
+}
+
+void RNA_api_wm(StructRNA *srna)
+{
+       FunctionRNA *func;
+       PropertyRNA *prop;
+
+       func= RNA_def_function(srna, "add_fileselect", "RNA_api_wm_add_fileselect");
+       RNA_def_function_ui_description(func, "Show up the file selector.");
+       prop= RNA_def_pointer(func, "context", "Context", "", "Context.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       prop= RNA_def_pointer(func, "op", "Operator", "", "Operator to call.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+}
+
 static void api_ui_item_common(FunctionRNA *func)
 {
        RNA_def_string(func, "text", "", 0, "", "Override automatic text of the item.");
@@ -237,4 +297,3 @@ void RNA_api_ui_layout(StructRNA *srna)
        parm= RNA_def_string(func, "property", "", 0, "", "Identifier of pointer property in data.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
 }
-
index b1ecf2c3a860119bd971abd4465ebba071f4f8db..6bab4206dc6553c5fe6c660a45be0384b49ac032 100644 (file)
@@ -146,11 +146,6 @@ void RNA_def_context(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_struct_type(prop, "Scene");
        RNA_def_property_pointer_funcs(prop, "rna_Context_scene_get", NULL, NULL);
-
-       func= RNA_def_function(srna, "add_fileselect", "WM_event_add_fileselect");
-       RNA_def_function_ui_description(func, "Show up the file selector.");
-       prop= RNA_def_pointer(func, "op", "Operator", "", "Operator to call.");
-       RNA_def_property_flag(prop, PROP_REQUIRED);
 }
 
 #endif
index 467e0dabb24219f4339a029a9ed90cc1bbc1cf93..f38c3aac71d5e17e3e469d7b46a7de5c17d006ba 100644 (file)
@@ -188,15 +188,29 @@ void rna_object_vcollayer_name_set(struct PointerRNA *ptr, const char *value, ch
 
 /* API functions */
 
+void RNA_api_ui_layout(struct StructRNA *srna);
+void RNA_api_mesh(struct StructRNA *srna);
+void RNA_api_wm(struct StructRNA *srna);
+void RNA_api_main(StructRNA *srna);
+
+#ifdef RNA_RUNTIME
+
+struct wmWindowManager;
+struct bContext;
+struct wmOperator;
 struct Main;
+struct Mesh;
 struct Scene;
 struct Object;
-struct Mesh;
 
-void RNA_api_ui_layout(struct StructRNA *srna);
-struct Mesh *RNA_api_add_mesh(struct Main *main, char *name);
-void RNA_api_mesh_copy(struct Mesh *me, struct Mesh *from);
-void RNA_api_mesh_copy_applied(struct Mesh *me, struct Scene *sce, struct Object *ob);
+void RNA_api_wm_add_fileselect(struct wmWindowManager *self, struct bContext *C, struct wmOperator *op);
+
+struct Mesh *RNA_api_main_add_mesh(struct Main *main, char *name);
+void RNA_api_main_remove_mesh(struct Main *main, struct Mesh *me);
+
+void RNA_api_mesh_make_rendermesh(struct Mesh *me, struct Scene *sce, struct Object *ob);
+
+#endif
 
 /* ID Properties */
 
index 22f19d725cb25009d7bd7a52e9552743587811e6..78e1c7fb4350612a1a205e58b5802490fb73c21b 100644 (file)
@@ -33,6 +33,7 @@
 #ifdef RNA_RUNTIME
 
 #include "BKE_main.h"
+#include "BKE_mesh.h"
 
 /* all the list begin functions are added manually here, Main is not in SDNA */
 
@@ -268,12 +269,7 @@ void RNA_def_main(BlenderRNA *brna)
                RNA_def_property_ui_text(prop, lists[i][3], lists[i][4]);
        }
 
-       func= RNA_def_function(srna, "add_mesh", "RNA_api_add_mesh");
-       RNA_def_function_ui_description(func, "Add a new mesh.");
-       prop= RNA_def_string(func, "name", "", 0, "", "New name for the datablock.");
-       RNA_def_property_flag(prop, PROP_REQUIRED);
-       prop= RNA_def_pointer(func, "mesh", "Mesh", "", "A new mesh.");
-       RNA_def_function_return(func, prop);
+       RNA_api_main(srna);
 }
 
 #endif
index ec58d695105ea1cf0ebbca901afd59d9a3cd433c..d7b174908262020a4503781d5f87bfa1b59da1c4 100644 (file)
@@ -1071,7 +1071,6 @@ static void rna_def_mesh(BlenderRNA *brna)
 {
        StructRNA *srna;
        PropertyRNA *prop;
-       FunctionRNA *func;
 
        srna= RNA_def_struct(brna, "Mesh", "ID");
        RNA_def_struct_ui_text(srna, "Mesh", "Mesh datablock to define geometric surfaces.");
@@ -1156,17 +1155,7 @@ static void rna_def_mesh(BlenderRNA *brna)
 
        rna_def_texmat_common(srna, "rna_Mesh_texspace_editable");
 
-       func= RNA_def_function(srna, "copy", "RNA_api_mesh_copy");
-       RNA_def_function_ui_description(func, "Copy mesh data.");
-       prop= RNA_def_pointer(func, "src", "Mesh", "", "A mesh to copy data from.");
-       RNA_def_property_flag(prop, PROP_REQUIRED);
-
-       func= RNA_def_function(srna, "copy_applied", "RNA_api_mesh_copy_applied");
-       RNA_def_function_ui_description(func, "Copy mesh data from object with all modifiers applied.");
-       prop= RNA_def_pointer(func, "sce", "Scene", "", "Scene.");
-       RNA_def_property_flag(prop, PROP_REQUIRED);
-       prop= RNA_def_pointer(func, "ob", "Object", "", "Object to copy data from.");
-       RNA_def_property_flag(prop, PROP_REQUIRED);
+       RNA_api_mesh(srna);
 }
 
 void RNA_def_mesh(BlenderRNA *brna)
index 22ce207c6a91913942ce764aec12c361ae8b2b54..df07e03850ad8286991210bdbd830eb51f61e32c 100644 (file)
@@ -160,6 +160,8 @@ static void rna_def_windowmanager(BlenderRNA *brna)
        prop= RNA_def_property(srna, "operators", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "Operator");
        RNA_def_property_ui_text(prop, "Operators", "Operator registry.");
+
+       RNA_api_wm(srna);
 }
 
 void RNA_def_wm(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/wm_api.c b/source/blender/makesrna/intern/wm_api.c
new file mode 100644 (file)
index 0000000..a00c401
--- /dev/null
@@ -0,0 +1,9 @@
+#include "WM_api.h"
+
+#include "BKE_context.h"
+
+void RNA_api_wm_add_fileselect(wmWindowManager *self, bContext *C, wmOperator *op)
+{
+       WM_event_add_fileselect(C, op);
+}
+
index 4624fe764b3f1e155a6a0296bd0fa06044e66e4c..c0fac17dd9766a2c49d4f04c2846a718f2ef4ca0 100644 (file)
@@ -225,7 +225,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
        PyObject *ret= NULL, *py_class_instance, *item= NULL;
        int ret_flag= (mode==PYOP_POLL ? 0:OPERATOR_CANCELLED);
        PointerRNA ptr_context;
-       PyObject ptr_operator;
+       PointerRNA ptr_operator;
        PyObject *py_operator;
 
        PyGILState_STATE gilstate = PyGILState_Ensure();