[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20501] branches/blender2.5/blender/source /blender/makesrna: RNA:

Brecht Van Lommel brecht at blender.org
Fri May 29 17:12:31 CEST 2009


Revision: 20501
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20501
Author:   blendix
Date:     2009-05-29 17:12:31 +0200 (Fri, 29 May 2009)

Log Message:
-----------
RNA:
* Added PROP_ID_REFCOUNT flag to control if refcounting should
  be done on ID pointer properties. All ID pointers are refcounted,
  by default, with the exception of Object, Scene and Text.
* Also made TextureFace image pointer editable, with the special
  refcounting behavior.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
    branches/blender2.5/blender/source/blender/makesrna/RNA_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_text.c

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_define.h	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_define.h	2009-05-29 15:12:31 UTC (rev 20501)
@@ -52,6 +52,7 @@
 void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop);
 void RNA_def_struct_nested(BlenderRNA *brna, StructRNA *srna, const char *structname);
 void RNA_def_struct_flag(StructRNA *srna, int flag);
+void RNA_def_struct_clear_flag(StructRNA *srna, int flag);
 void RNA_def_struct_refine_func(StructRNA *srna, const char *refine);
 void RNA_def_struct_idproperties_func(StructRNA *srna, const char *refine);
 void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg);

Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/RNA_types.h	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_types.h	2009-05-29 15:12:31 UTC (rev 20501)
@@ -99,6 +99,9 @@
 	PROP_REGISTER = 16,
 	PROP_REGISTER_OPTIONAL = 16|32,
 
+	/* pointers */
+	PROP_ID_REFCOUNT = 64,
+
 	/* internal flags */
 	PROP_BUILTIN = 128,
 	PROP_EXPORT = 256,
@@ -172,12 +175,13 @@
 /* Struct */
 
 typedef enum StructFlag {
-	/* indicates that this struct is an ID struct */
+	/* indicates that this struct is an ID struct, and to use refcounting */
 	STRUCT_ID = 1,
+	STRUCT_ID_REFCOUNT = 2,
 
 	/* internal flags */
-	STRUCT_RUNTIME = 2,
-	STRUCT_GENERATED = 4
+	STRUCT_RUNTIME = 4,
+	STRUCT_GENERATED = 8
 } StructFlag;
 
 typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -509,17 +509,15 @@
 				fprintf(f, "	%s(ptr, value);\n", manualfunc);
 			}
 			else {
-				PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
-				StructRNA *type= rna_find_struct((char*)pprop->type);
-
 				rna_print_data_get(f, dp);
 
-				if(type && (type->flag & STRUCT_ID) && strcmp(type->identifier, "Object")!=0) {
+				if(prop->flag & PROP_ID_REFCOUNT) {
 					fprintf(f, "\n	if(data->%s)\n", dp->dnaname);
 					fprintf(f, "		id_us_min((ID*)data->%s);\n", dp->dnaname);
 					fprintf(f, "	if(value.data)\n");
 					fprintf(f, "		id_us_plus((ID*)value.data);\n\n");
 				}
+
 				fprintf(f, "	data->%s= value.data;\n", dp->dnaname);
 
 			}
@@ -1212,9 +1210,16 @@
 			if(dp->dnatype) {
 				if(dp->prop->type == PROP_POINTER) {
 					PointerPropertyRNA *pprop= (PointerPropertyRNA*)dp->prop;
+					StructRNA *type;
 
 					if(!pprop->type && !pprop->get)
 						pprop->type= (StructRNA*)rna_find_type(dp->dnatype);
+
+					if(pprop->type) {
+						type= rna_find_struct((char*)pprop->type);
+						if(type && (type->flag & STRUCT_ID_REFCOUNT))
+							pprop->property.flag |= PROP_ID_REFCOUNT;
+					}
 				}
 				else if(dp->prop->type== PROP_COLLECTION) {
 					CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)dp->prop;

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -182,7 +182,7 @@
 
 	srna= RNA_def_struct(brna, "ID", NULL);
 	RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, defining a unique name, linking from other libraries and garbage collection.");
-	RNA_def_struct_flag(srna, STRUCT_ID);
+	RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT);
 	RNA_def_struct_refine_func(srna, "rna_ID_refine");
 	RNA_def_struct_idproperties_func(srna, "rna_ID_idproperties");
 

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -712,9 +712,14 @@
 
 void RNA_def_struct_flag(StructRNA *srna, int flag)
 {
-	srna->flag= flag;
+	srna->flag |= flag;
 }
 
+void RNA_def_struct_clear_flag(StructRNA *srna, int flag)
+{
+	srna->flag &= ~flag;
+}
+
 void RNA_def_struct_refine_func(StructRNA *srna, const char *refine)
 {
 	if(!DefRNA.preprocess) {
@@ -1059,6 +1064,10 @@
 		case PROP_POINTER: {
 			PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
 			pprop->type = type;
+
+			if(type && (type->flag & STRUCT_ID_REFCOUNT))
+				prop->flag |= PROP_ID_REFCOUNT;
+
 			break;
 		}
 		case PROP_COLLECTION: {

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_mesh.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -467,6 +467,23 @@
 	return rna_CustomDataLayer_length(ptr, CD_PROP_STR);
 }
 
+static void rna_TextureFace_image_set(PointerRNA *ptr, PointerRNA value)
+{
+	MTFace *tf= (MTFace*)ptr->data;
+	ID *id= value.data;
+
+	if(id) {
+		/* special exception here, individual faces don't count
+		 * as reference, but we do ensure the refcount is not zero */
+		if(id->us == 0)
+			id_us_plus(id);
+		else
+			id_lib_extern(id);
+	}
+
+	tf->tpage= (struct Image*)id;
+}
+
 /* path construction */
 
 static char *rna_VertexGroupElement_path(PointerRNA *ptr)
@@ -747,9 +764,11 @@
 	RNA_def_struct_ui_text(srna, "Mesh Texture Face", "UV mapping, texturing and game engine data for a face.");
 	RNA_def_struct_path_func(srna, "rna_MeshTextureFace_path");
 
-	/* prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
+	prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
 	RNA_def_property_pointer_sdna(prop, NULL, "tpage");
-	RNA_def_property_ui_text(prop, "Image", ""); */
+	RNA_def_property_pointer_funcs(prop, NULL, "rna_TextureFace_image_set");
+	RNA_def_property_flag(prop, PROP_EDITABLE);
+	RNA_def_property_ui_text(prop, "Image", "");
 
 	prop= RNA_def_property(srna, "tex", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TEX);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -513,6 +513,7 @@
 
 	srna= RNA_def_struct(brna, "Object", "ID");
 	RNA_def_struct_ui_text(srna, "Object", "Object datablock defining an object in a scene..");
+	RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
 
 	prop= RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE);
 	RNA_def_property_struct_type(prop, "ID");

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -607,6 +607,7 @@
 
 	srna= RNA_def_struct(brna, "Scene", "ID");
 	RNA_def_struct_ui_text(srna, "Scene", "Scene consisting objects and defining time and render related settings.");
+	RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
 
 	prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
 	RNA_def_property_flag(prop, PROP_EDITABLE);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_text.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_text.c	2009-05-29 13:37:51 UTC (rev 20500)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_text.c	2009-05-29 15:12:31 UTC (rev 20501)
@@ -172,6 +172,7 @@
 	
 	srna = RNA_def_struct(brna, "Text", "ID");
 	RNA_def_struct_ui_text(srna, "Text", "Text datablock referencing an external or packed text file.");
+	RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
 	
 	prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_NONE);
 	RNA_def_property_string_funcs(prop, "rna_Text_filename_get", "rna_Text_filename_length", "rna_Text_filename_set");





More information about the Bf-blender-cvs mailing list