[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29118] trunk/blender: Fix [#22469] Crashes with "segmentation fault" when opening an image for Voxel Data texture of type Image sequence

Matt Ebb matt at mke3.net
Tue Jun 1 08:07:23 CEST 2010


Revision: 29118
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29118
Author:   broken
Date:     2010-06-01 08:07:22 +0200 (Tue, 01 Jun 2010)

Log Message:
-----------
Fix [#22469] Crashes with "segmentation fault" when opening an image for Voxel Data texture of type Image sequence

Cleaned up the code here, made it more efficient and more reliable with threaded render.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/properties_texture.py
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_texture_types.h
    trunk/blender/source/blender/makesrna/intern/rna_texture.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/voxeldata.c

Modified: trunk/blender/release/scripts/ui/properties_texture.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_texture.py	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/release/scripts/ui/properties_texture.py	2010-06-01 06:07:22 UTC (rev 29118)
@@ -961,7 +961,9 @@
             layout.prop(vd, "domain_object")
             layout.prop(vd, "smoke_data_type")
         elif vd.file_format == 'IMAGE_SEQUENCE':
-            layout.template_image(tex, "image", tex.image_user)
+            layout.template_ID(tex, "image", open="image.open")
+            layout.template_image(tex, "image", tex.image_user, compact=True)
+            #layout.prop(vd, "frames")
 
         layout.prop(vd, "still")
         row = layout.row()

Modified: trunk/blender/source/blender/blenkernel/intern/texture.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/texture.c	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/source/blender/blenkernel/intern/texture.c	2010-06-01 06:07:22 UTC (rev 29118)
@@ -1149,7 +1149,8 @@
 void BKE_free_voxeldatadata(struct VoxelData *vd)
 {
 	if (vd->dataset) {
-		MEM_freeN(vd->dataset);
+		if(vd->file_format != TEX_VD_SMOKE)
+			MEM_freeN(vd->dataset);
 		vd->dataset = NULL;
 	}
 
@@ -1173,6 +1174,8 @@
 	vd->int_multiplier = 1.0;
 	vd->extend = TEX_CLIP;
 	vd->object = NULL;
+	vd->cachedframe = -1;
+	vd->ok = 0;
 	
 	return vd;
  }

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-06-01 06:07:22 UTC (rev 29118)
@@ -2839,6 +2839,7 @@
 	tex->vd= newdataadr(fd, tex->vd);
 	if(tex->vd) {
 		tex->vd->dataset = NULL;
+		tex->vd->ok = 0;
 	}
 	
 	tex->nodetree= newdataadr(fd, tex->nodetree);

Modified: trunk/blender/source/blender/makesdna/DNA_texture_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_texture_types.h	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/source/blender/makesdna/DNA_texture_types.h	2010-06-01 06:07:22 UTC (rev 29118)
@@ -190,8 +190,12 @@
 	float int_multiplier;	
 	int still_frame;
 	char source_path[240];
+
+	/* temporary data */
 	float *dataset;
- 
+	int cachedframe;
+	int ok;
+	
 } VoxelData;
 
 typedef struct Tex {

Modified: trunk/blender/source/blender/makesrna/intern/rna_texture.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_texture.c	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/source/blender/makesrna/intern/rna_texture.c	2010-06-01 06:07:22 UTC (rev 29118)
@@ -75,6 +75,7 @@
 #include "RNA_access.h"
 
 #include "BKE_depsgraph.h"
+#include "BKE_image.h"
 #include "BKE_texture.h"
 #include "BKE_main.h"
 
@@ -131,6 +132,22 @@
 	WM_main_add_notifier(NC_TEXTURE, tex);
 }
 
+static void rna_Texture_voxeldata_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	Tex *tex= ptr->id.data;
+	
+	tex->vd->ok = 0;
+	rna_Texture_update(bmain, scene, ptr);
+}
+
+static void rna_Texture_voxeldata_image_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	Tex *tex= ptr->id.data;
+	
+	tex->ima->source = IMA_SRC_SEQUENCE;
+	rna_Texture_voxeldata_update(bmain, scene, ptr);
+}
+
 /* Used for Texture Properties, used (also) for/in Nodes */
 static void rna_Texture_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
@@ -1593,7 +1610,7 @@
 	RNA_def_property_enum_sdna(prop, NULL, "smoked_type");
 	RNA_def_property_enum_items(prop, smoked_type_items);
 	RNA_def_property_ui_text(prop, "Source", "Simulation value to be used as a texture");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 	
 	prop= RNA_def_property(srna, "extension", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "extend");
@@ -1611,34 +1628,34 @@
 	RNA_def_property_enum_sdna(prop, NULL, "file_format");
 	RNA_def_property_enum_items(prop, file_format_items);
 	RNA_def_property_ui_text(prop, "File Format", "Format of the source data set to render	");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 	
 	prop= RNA_def_property(srna, "source_path", PROP_STRING, PROP_FILEPATH);
 	RNA_def_property_string_sdna(prop, NULL, "source_path");
 	RNA_def_property_ui_text(prop, "Source Path", "The external source data file to use");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 	
 	prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "resol");
 	RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 	
 	prop= RNA_def_property(srna, "still", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_VD_STILL);
 	RNA_def_property_ui_text(prop, "Still Frame Only", "Always render a still frame from the voxel data sequence");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 	
 	prop= RNA_def_property(srna, "still_frame_number", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "still_frame");
 	RNA_def_property_range(prop, -MAXFRAME, MAXFRAME);
 	RNA_def_property_ui_text(prop, "Still Frame Number", "The frame number to always use");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 	
 	prop= RNA_def_property(srna, "domain_object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_pointer_sdna(prop, NULL, "object");
 	RNA_def_property_ui_text(prop, "Domain Object", "Object used as the smoke simulation domain");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 
 	
 	srna= RNA_def_struct(brna, "VoxelDataTexture", "Texture");
@@ -1656,12 +1673,12 @@
 	RNA_def_property_struct_type(prop, "Image");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Image", "");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_image_update");
 	
 	prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
 	RNA_def_property_pointer_sdna(prop, NULL, "iuser");
 	RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed");
-	RNA_def_property_update(prop, 0, "rna_Texture_update");
+	RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update");
 }
 
 static void rna_def_texture(BlenderRNA *brna)

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2010-06-01 06:07:22 UTC (rev 29118)
@@ -4595,7 +4595,6 @@
 	end_render_textures();
 	
 	free_pointdensities(re);
-	free_voxeldata(re);
 	
 	free_camera_inside_volumes(re);
 	

Modified: trunk/blender/source/blender/render/intern/source/voxeldata.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/voxeldata.c	2010-06-01 04:15:00 UTC (rev 29117)
+++ trunk/blender/source/blender/render/intern/source/voxeldata.c	2010-06-01 06:07:22 UTC (rev 29118)
@@ -57,58 +57,72 @@
 #include "texture.h"
 #include "voxeldata.h"
 
-static int load_frame_blendervoxel(FILE *fp, float *F, int size, int frame, int offset)
+static int load_frame_blendervoxel(VoxelData *vd, FILE *fp, int frame)
 {	
-	if(fseek(fp,frame*size*sizeof(float)+offset,0) == -1)
+	size_t offset = sizeof(VoxelDataHeader);
+	int size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]);
+	
+	vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset");
+	
+	if(fseek(fp, frame*size*sizeof(float)+offset, 0) == -1)
 		return 0;
-	if(fread(F,sizeof(float),size,fp) != size)
+	if(fread(vd->dataset, sizeof(float), size, fp) != size)
 		return 0;
 	
+	vd->cachedframe = frame;
+	vd->ok = 1;
 	return 1;
 }
 
-static int load_frame_raw8(FILE *fp, float *F, int size, int frame)
+static int load_frame_raw8(VoxelData *vd, FILE *fp, int frame)
 {
-	char *tmp;
+	int size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]);
+	char *data_c;
 	int i;
 	
-	tmp = (char *)MEM_mallocN(sizeof(char)*size, "temporary voxel file reading storage");
+	vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset");
+	data_c = (char *)MEM_mallocN(sizeof(char)*size, "temporary voxel file reading storage");
 	
 	if(fseek(fp,(frame-1)*size*sizeof(char),0) == -1) {
-		MEM_freeN(tmp);
+		MEM_freeN(data_c);
 		return 0;
 	}
-	if(fread(tmp, sizeof(char), size, fp) != size) {
-		MEM_freeN(tmp);
+	if(fread(data_c, sizeof(char), size, fp) != size) {
+		MEM_freeN(data_c);
 		return 0;
 	}
 	
 	for (i=0; i<size; i++) {
-		F[i] = (float)tmp[i] / 256.f;
+		vd->dataset[i] = (float)data_c[i] / 255.f;
 	}
-	MEM_freeN(tmp);
+	MEM_freeN(data_c);
+	
+	vd->cachedframe = frame;
+	vd->ok = 1;
 	return 1;
 }
 
-static void load_frame_image_sequence(Render *re, VoxelData *vd, Tex *tex)
+static void load_frame_image_sequence(VoxelData *vd, Tex *tex)
 {
 	ImBuf *ibuf;
 	Image *ima = tex->ima;
-	ImageUser *iuser = &tex->iuser;
+	ImageUser *tiuser = &tex->iuser;
+	ImageUser iuser = *(tiuser);
 	int x=0, y=0, z=0;
 	float *rf;
 
-	if (!ima || !iuser) return;
+	if (!ima || !tiuser) return;
+	if (iuser.frames == 0) return;
 	
 	ima->source = IMA_SRC_SEQUENCE;
-	iuser->framenr = 1 + iuser->offset;
+	iuser.framenr = 1 + iuser.offset;
 
 	/* find the first valid ibuf and use it to initialise the resolution of the data set */
 	/* need to do this in advance so we know how much memory to allocate */
-	ibuf= BKE_image_get_ibuf(ima, iuser);
-	while (!ibuf && (iuser->framenr < iuser->frames)) {
-		iuser->framenr++;
-		ibuf= BKE_image_get_ibuf(ima, iuser);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list