[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54318] trunk/blender: Fix #34040: Moving Normal Node with enabled Cycles Material Preview crashes

Sergey Sharybin sergey.vfx at gmail.com
Tue Feb 5 13:46:16 CET 2013


Revision: 54318
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54318
Author:   nazgul
Date:     2013-02-05 12:46:15 +0000 (Tue, 05 Feb 2013)
Log Message:
-----------
Fix #34040: Moving Normal Node with enabled Cycles Material Preview crashes

Issue was caused by couple of circumstances:

- Normal Map node requires tesselated faces to compute tangent space
- All temporary meshes needed for Cycles export were adding to G.main
- Undo pushes would temporary set meshes tessfaces to NULL
- Moving node will cause undo push and tree re-evaluate fr preview

All this leads to threading conflict between preview render and undo
system.

Solved it in  way that all temporary meshes are adding to that exact
Main which was passed to Cycles via BlendData. This required couple
of mechanic changes like adding extra parameter to *_add() functions
and adding some *_ex() functions to make it possible RNA adds objects
to Main passed to new() RNA function.

This was tricky to pass Main to RNA function and IMO that's not so
nice to pass main to function, so ended up with such decision:

- Object.to_mesh() will add temp mesh to G.main
- Added Main.meshes.new_from_object() which does the same as to_mesh,
  but adds temporary mesh to specified Main.

So now all temporary meshes needed for preview render would be added
to preview_main which does not conflict with undo pushes.

Viewport render shall not be an issue because object sync happens from
main thread in this case.

It could be some issues with final render, but that's not so much
likely to happen, so shall be fine.

Thanks to Brecht for review!

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/blender/blender_util.h
    trunk/blender/source/blender/blenkernel/BKE_action.h
    trunk/blender/source/blender/blenkernel/BKE_armature.h
    trunk/blender/source/blender/blenkernel/BKE_brush.h
    trunk/blender/source/blender/blenkernel/BKE_camera.h
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/BKE_group.h
    trunk/blender/source/blender/blenkernel/BKE_image.h
    trunk/blender/source/blender/blenkernel/BKE_lamp.h
    trunk/blender/source/blender/blenkernel/BKE_lattice.h
    trunk/blender/source/blender/blenkernel/BKE_library.h
    trunk/blender/source/blender/blenkernel/BKE_mask.h
    trunk/blender/source/blender/blenkernel/BKE_material.h
    trunk/blender/source/blender/blenkernel/BKE_mball.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/BKE_movieclip.h
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/BKE_speaker.h
    trunk/blender/source/blender/blenkernel/BKE_text.h
    trunk/blender/source/blender/blenkernel/BKE_texture.h
    trunk/blender/source/blender/blenkernel/BKE_world.h
    trunk/blender/source/blender/blenkernel/intern/action.c
    trunk/blender/source/blender/blenkernel/intern/anim_sys.c
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenkernel/intern/camera.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/group.c
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenkernel/intern/ipo.c
    trunk/blender/source/blender/blenkernel/intern/lamp.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/mask.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/movieclip.c
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/paint.c
    trunk/blender/source/blender/blenkernel/intern/speaker.c
    trunk/blender/source/blender/blenkernel/intern/text.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenkernel/intern/world.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/animation/keyframing.c
    trunk/blender/source/blender/editors/armature/poselib.c
    trunk/blender/source/blender/editors/interface/interface_ops.c
    trunk/blender/source/blender/editors/mask/mask_ops.c
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/object/object_group.c
    trunk/blender/source/blender/editors/physics/rigidbody_constraint.c
    trunk/blender/source/blender/editors/physics/rigidbody_object.c
    trunk/blender/source/blender/editors/render/render_shading.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_ops.c
    trunk/blender/source/blender/editors/space_action/action_edit.c
    trunk/blender/source/blender/editors/space_clip/clip_ops.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/editors/space_node/node_add.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_group.c
    trunk/blender/source/blender/editors/space_node/node_header.c
    trunk/blender/source/blender/editors/space_text/text_ops.c
    trunk/blender/source/blender/makesrna/intern/rna_internal.h
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c
    trunk/blender/source/blender/modifiers/intern/MOD_boolean_util.c

Modified: trunk/blender/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/intern/cycles/blender/blender_mesh.cpp	2013-02-05 12:46:15 UTC (rev 54318)
@@ -435,7 +435,7 @@
 	mesh_synced.insert(mesh);
 
 	/* create derived mesh */
-	BL::Mesh b_mesh = object_to_mesh(b_ob, b_scene, true, !preview);
+	BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview);
 	PointerRNA cmesh = RNA_pointer_get(&b_ob_data.ptr, "cycles");
 
 	vector<Mesh::Triangle> oldtriangle = mesh->triangles;
@@ -507,7 +507,7 @@
 		return;
 
 	/* get derived mesh */
-	BL::Mesh b_mesh = object_to_mesh(b_ob, b_scene, true, !preview);
+	BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview);
 
 	if(b_mesh) {
 		BL::Mesh::vertices_iterator v;

Modified: trunk/blender/intern/cycles/blender/blender_util.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_util.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/intern/cycles/blender/blender_util.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -39,9 +39,9 @@
 
 CCL_NAMESPACE_BEGIN
 
-static inline BL::Mesh object_to_mesh(BL::Object self, BL::Scene scene, bool apply_modifiers, bool render)
+static inline BL::Mesh object_to_mesh(BL::BlendData data, BL::Object object, BL::Scene scene, bool apply_modifiers, bool render)
 {
-	return self.to_mesh(scene, apply_modifiers, (render)? 2: 1);
+	return data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1);
 }
 
 static inline void colorramp_to_array(BL::ColorRamp ramp, float4 *data, int size)

Modified: trunk/blender/source/blender/blenkernel/BKE_action.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_action.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_action.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -44,6 +44,7 @@
 struct bPose;
 struct bItasc;
 struct bPoseChannel;
+struct Main;
 struct Object;
 struct Scene;
 struct ID;
@@ -56,7 +57,7 @@
 /* Action Lib Stuff ----------------- */
 
 /* Allocate a new bAction with the given name */
-struct bAction *add_empty_action(const char name[]);
+struct bAction *add_empty_action(struct Main *bmain, const char name[]);
 
 /* Allocate a copy of the given Action and all its data */	
 struct bAction *BKE_action_copy(struct bAction *src);

Modified: trunk/blender/source/blender/blenkernel/BKE_armature.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_armature.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_armature.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -73,7 +73,7 @@
 extern "C" {
 #endif
 
-struct bArmature *BKE_armature_add(const char *name);
+struct bArmature *BKE_armature_add(struct Main *bmain, const char *name);
 struct bArmature *BKE_armature_from_object(struct Object *ob);
 void BKE_armature_bonelist_free(struct ListBase *lb);
 void BKE_armature_free(struct bArmature *arm);

Modified: trunk/blender/source/blender/blenkernel/BKE_brush.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_brush.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_brush.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -37,12 +37,13 @@
 struct Brush;
 struct ImBuf;
 struct ImagePool;
+struct Main;
 struct Scene;
 struct wmOperator;
 // enum CurveMappingPreset;
 
 /* datablock functions */
-struct Brush *BKE_brush_add(const char *name);
+struct Brush *BKE_brush_add(struct Main *bmain, const char *name);
 struct Brush *BKE_brush_copy(struct Brush *brush);
 void BKE_brush_make_local(struct Brush *brush);
 void BKE_brush_free(struct Brush *brush);

Modified: trunk/blender/source/blender/blenkernel/BKE_camera.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_camera.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_camera.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -39,6 +39,7 @@
 #include "DNA_vec_types.h"
 
 struct Camera;
+struct Main;
 struct Object;
 struct RegionView3D;
 struct RenderData;
@@ -48,7 +49,7 @@
 
 /* Camera Datablock */
 
-void *BKE_camera_add(const char *name);
+void *BKE_camera_add(struct Main *bmain, const char *name);
 struct Camera *BKE_camera_copy(struct Camera *cam);
 void BKE_camera_make_local(struct Camera *cam);
 void BKE_camera_free(struct Camera *ca);

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -39,6 +39,7 @@
 struct EditNurb;
 struct ListBase;
 struct ListBase;
+struct Main;
 struct Nurb;
 struct Object;
 struct Scene;
@@ -57,7 +58,7 @@
 void BKE_curve_unlink(struct Curve *cu);
 void BKE_curve_free(struct Curve *cu);
 void BKE_curve_editfont_free(struct Curve *cu);
-struct Curve *BKE_curve_add(const char *name, int type);
+struct Curve *BKE_curve_add(struct Main *bmain, const char *name, int type);
 struct Curve *BKE_curve_copy(struct Curve *cu);
 void BKE_curve_make_local(struct Curve *cu);
 short BKE_curve_type_get(struct Curve *cu);

Modified: trunk/blender/source/blender/blenkernel/BKE_group.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_group.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_group.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -36,13 +36,14 @@
 struct Base;
 struct Group;
 struct GroupObject;
+struct Main;
 struct Object;
 struct bAction;
 struct Scene;
 
 void        BKE_group_free(struct Group *group);
 void        BKE_group_unlink(struct Group *group);
-struct Group *add_group(const char *name);
+struct Group *add_group(struct Main *bmain, const char *name);
 struct Group *BKE_group_copy(struct Group *group);
 int         add_to_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
 int         rem_from_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);

Modified: trunk/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_image.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -153,12 +153,12 @@
 void BKE_image_pool_release_ibuf(struct Image *ima, struct ImBuf *ibuf, struct ImagePool *pool);
 
 /* returns a new image or NULL if it can't load */
-struct Image *BKE_image_load(const char *filepath);
+struct Image *BKE_image_load(struct Main *bmain, const char *filepath);
 /* returns existing Image when filename/type is same (frame optional) */
 struct Image *BKE_image_load_exists(const char *filepath);
 
 /* adds image, adds ibuf, generates color or pattern */
-struct Image *BKE_image_add_generated(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4]);
+struct Image *BKE_image_add_generated(struct Main *bmain, unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short gen_type, float color[4]);
 /* adds image from imbuf, owns imbuf */
 struct Image *BKE_image_add_from_imbuf(struct ImBuf *ibuf);
 

Modified: trunk/blender/source/blender/blenkernel/BKE_lamp.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_lamp.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_lamp.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -37,9 +37,10 @@
 #endif
 
 struct Lamp;
+struct Main;
 struct Scene;
 
-struct Lamp *BKE_lamp_add(const char *name) WARN_UNUSED;
+struct Lamp *BKE_lamp_add(struct Main *bmain, const char *name) WARN_UNUSED;
 struct Lamp *BKE_lamp_copy(struct Lamp *la) WARN_UNUSED;
 struct Lamp *localize_lamp(struct Lamp *la) WARN_UNUSED;
 void BKE_lamp_make_local(struct Lamp *la);

Modified: trunk/blender/source/blender/blenkernel/BKE_lattice.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_lattice.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_lattice.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -35,6 +35,7 @@
  */
 
 struct Lattice;
+struct Main;
 struct Object;
 struct Scene;
 struct DerivedMesh;
@@ -42,7 +43,7 @@
 struct MDeformVert;
 
 void BKE_lattice_resize(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
-struct Lattice *BKE_lattice_add(const char *name);
+struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name);
 struct Lattice *BKE_lattice_copy(struct Lattice *lt);
 void BKE_lattice_free(struct Lattice *lt);
 void BKE_lattice_make_local(struct Lattice *lt);

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -51,6 +51,12 @@
 __attribute__((nonnull))
 #endif
 ;
+void *BKE_libblock_copy_ex(struct Main *bmain, struct ID *id)
+#ifdef __GNUC__
+__attribute__((warn_unused_result))
+__attribute__((nonnull))
+#endif
+;
 void *BKE_libblock_copy(struct ID *id)
 #ifdef __GNUC__
 __attribute__((warn_unused_result))

Modified: trunk/blender/source/blender/blenkernel/BKE_mask.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mask.h	2013-02-05 11:30:50 UTC (rev 54317)
+++ trunk/blender/source/blender/blenkernel/BKE_mask.h	2013-02-05 12:46:15 UTC (rev 54318)
@@ -98,7 +98,7 @@
 void BKE_mask_point_select_set_handle(struct MaskSplinePoint *point, const short do_select);
 
 /* general */
-struct Mask *BKE_mask_new(const char *name);
+struct Mask *BKE_mask_new(struct Main *bmain, const char *name);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list