[Bf-blender-cvs] [e44b3bf7b84] hair_guides_grooming: Cycles support for groom hair.

Lukas Tönne noreply at git.blender.org
Mon Jun 4 18:02:50 CEST 2018


Commit: e44b3bf7b8480a51ad7a80e9e30e8396cd992f6f
Author: Lukas Tönne
Date:   Mon Jun 4 17:02:37 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rBe44b3bf7b8480a51ad7a80e9e30e8396cd992f6f

Cycles support for groom hair.

===================================================================

M	intern/cycles/blender/blender_curves.cpp
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_object.cpp
M	source/blender/editors/object/object_edit.c

===================================================================

diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index ce881258225..9ddb9b67844 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -300,6 +300,7 @@ static void ObtainCacheVColFromParticleSystem(BL::Mesh *b_mesh,
 
 static void ObtainCacheDataFromHairSystem(BL::Object *b_ob,
                                           BL::HairSystem *b_hsys,
+                                          BL::Mesh *b_scalp,
                                           int shader,
                                           bool /*background*/,
                                           ParticleCurveData *CData,
@@ -309,9 +310,8 @@ static void ObtainCacheDataFromHairSystem(BL::Object *b_ob,
 	Transform tfm = get_transform(b_ob->matrix_world());
 	Transform itfm = transform_quick_inverse(tfm);
 	
-	BL::Mesh b_mesh(b_ob->data());
 	void *hair_cache = BKE_hair_export_cache_new();
-	BKE_hair_export_cache_update(hair_cache, b_hsys->ptr.data, 0, b_mesh.ptr.data, 0xFFFFFFFF);
+	BKE_hair_export_cache_update(hair_cache, b_hsys->ptr.data, 0, b_scalp->ptr.data, 0xFFFFFFFF);
 	
 	int totcurves, totverts;
 	BKE_hair_render_get_buffer_size(hair_cache, &totcurves, &totverts);
@@ -407,7 +407,6 @@ static void ObtainCacheDataFromHairSystem(BL::Object *b_ob,
 }
 
 static bool ObtainCacheDataFromObject(Mesh *mesh,
-                                      BL::Mesh *b_mesh,
                                       BL::Object *b_ob,
                                       ParticleCurveData *CData,
                                       bool background)
@@ -415,9 +414,28 @@ static bool ObtainCacheDataFromObject(Mesh *mesh,
 	int curvenum = 0;
 	int keyno = 0;
 
-	if(!(mesh && b_mesh && b_ob && CData))
+	if(!(mesh && b_ob && CData))
 		return false;
 
+	if(b_ob->type() == BL::Object::type_GROOM) {
+		BL::Groom b_groom(b_ob->data());
+		BL::HairSystem b_hsys = b_groom.hair_system();
+		
+		int shader = clamp(b_groom.material_index() - 1, 0, mesh->used_shaders.size()-1);
+		
+		BL::Mesh b_scalp(b_groom.scalp_object().data());
+		if (b_scalp) {
+			ObtainCacheDataFromHairSystem(b_ob,
+			                              &b_hsys,
+			                              &b_scalp,
+			                              shader,
+			                              background,
+			                              CData,
+			                              &curvenum,
+			                              &keyno);
+		}
+	}
+
 	BL::Object::modifiers_iterator b_mod;
 	for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
 		if (background ? b_mod->show_render() : b_mod->show_viewport())
@@ -439,8 +457,11 @@ static bool ObtainCacheDataFromObject(Mesh *mesh,
 				const int material_index = 1; /* TODO */
 				int shader = clamp(material_index - 1, 0, mesh->used_shaders.size()-1);
 				
+				BL::Mesh b_scalp(b_ob->data());
+				
 				ObtainCacheDataFromHairSystem(b_ob,
 				                              &b_hsys,
+				                              &b_scalp,
 				                              shader,
 				                              background,
 				                              CData,
@@ -1087,7 +1108,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
 
 	ParticleCurveData CData;
 
-	ObtainCacheDataFromObject(mesh, &b_mesh, &b_ob, &CData, !preview);
+	ObtainCacheDataFromObject(mesh, &b_ob, &CData, !preview);
 
 	/* add hair geometry to mesh */
 	if(primitive == CURVE_TRIANGLES) {
@@ -1123,7 +1144,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
 
 	/* generated coordinates from first key. we should ideally get this from
 	 * blender to handle deforming objects */
-	if(!motion) {
+	if(b_mesh && !motion) {
 		if(mesh->need_attribute(scene, ATTR_STD_GENERATED)) {
 			float3 loc, size;
 			mesh_texture_space(b_mesh, loc, size);
@@ -1148,7 +1169,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
 	}
 
 	/* create vertex color attributes */
-	if(!motion) {
+	if(b_mesh && !motion) {
 		BL::Mesh::tessface_vertex_colors_iterator l;
 		int vcol_num = 0;
 
@@ -1184,7 +1205,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
 	}
 
 	/* create UV attributes */
-	if(!motion) {
+	if(b_mesh && !motion) {
 		BL::Mesh::tessface_uv_textures_iterator l;
 		int uv_num = 0;
 
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 03d24c04e2a..0553d9ccadf 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -1203,14 +1203,16 @@ Mesh *BlenderSync::sync_mesh(BL::Depsgraph& b_depsgraph,
 
 				create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
 			}
+		}
 
-			if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
-				sync_curves(mesh, b_mesh, b_ob, false);
+		if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
+			sync_curves(mesh, b_mesh, b_ob, false);
 
-			if(can_free_caches) {
-				b_ob.cache_release();
-			}
+		if(can_free_caches) {
+			b_ob.cache_release();
+		}
 
+		if(b_mesh) {
 			/* free derived mesh */
 			b_data.meshes.remove(b_mesh, false, true, false);
 		}
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 090682c8e14..31269ada268 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -81,7 +81,8 @@ bool BlenderSync::object_is_mesh(BL::Object& b_ob)
 	else {
 		return (b_ob_data.is_a(&RNA_Mesh) ||
 		        b_ob_data.is_a(&RNA_Curve) ||
-		        b_ob_data.is_a(&RNA_MetaBall));
+		        b_ob_data.is_a(&RNA_MetaBall) ||
+		        b_ob_data.is_a(&RNA_Groom));
 	}
 }
 
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 11cce4ea994..06f0dc6112a 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -48,6 +48,7 @@
 #include "DNA_armature_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_gpencil_types.h"
+#include "DNA_groom_types.h"
 #include "DNA_group_types.h"
 #include "DNA_material_types.h"
 #include "DNA_meta_types.h"
@@ -260,6 +261,10 @@ static bool ED_object_editmode_load_ex(Main *bmain, Object *obedit, const bool f
 		}
 	}
 	else if (obedit->type == OB_GROOM) {
+		const Groom *groom = obedit->data;
+		if (groom->editgroom == NULL) {
+			return false;
+		}
 		ED_groom_editgroom_load(obedit);
 		if (freedata) ED_groom_editgroom_free(obedit);
 	}



More information about the Bf-blender-cvs mailing list