[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20898] trunk/blender/source/blender/ blenkernel: Fix for bug #18924: OpenGL performance issue with particle modifiers,

Brecht Van Lommel brecht at blender.org
Mon Jun 15 13:48:42 CEST 2009


Revision: 20898
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20898
Author:   blendix
Date:     2009-06-15 13:48:42 +0200 (Mon, 15 Jun 2009)

Log Message:
-----------
Fix for bug #18924: OpenGL performance issue with particle modifiers,
actually two modifier datamask optimizations that were never done.

* Don't use modifier data mask for disabled modifiers.
* Check if UV data is needed for particle system instead of always
  requesting it.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_modifier.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2009-06-15 11:47:16 UTC (rev 20897)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2009-06-15 11:48:42 UTC (rev 20898)
@@ -202,7 +202,7 @@
 	 *
 	 * This function is optional.
 	 */
-	CustomDataMask (*requiredDataMask)(struct ModifierData *md);
+	CustomDataMask (*requiredDataMask)(struct Object *ob, struct ModifierData *md);
 
 	/* Free internal modifier data variables, this function should
 	 * not free the md variable itself.
@@ -270,6 +270,7 @@
 int           modifier_supportsMapping(struct ModifierData *md);
 int           modifier_couldBeCage(struct ModifierData *md);
 int           modifier_isDeformer(struct ModifierData *md);
+int           modifier_isEnabled(struct ModifierData *md, int required_mode);
 void          modifier_setError(struct ModifierData *md, char *format, ...);
 
 void          modifiers_foreachObjectLink(struct Object *ob,
@@ -300,8 +301,10 @@
  * evaluation, assuming the data indicated by dataMask is required at the
  * end of the stack.
  */
-struct LinkNode *modifiers_calcDataMasks(struct ModifierData *md,
-                                         CustomDataMask dataMask);
+struct LinkNode *modifiers_calcDataMasks(struct Object *ob,
+                                         struct ModifierData *md,
+                                         CustomDataMask dataMask,
+                                         int required_mode);
 struct ModifierData  *modifiers_getVirtualModifierList(struct Object *ob);
 
 #endif

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-06-15 11:47:16 UTC (rev 20897)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-06-15 11:48:42 UTC (rev 20898)
@@ -2134,18 +2134,18 @@
 
 	modifiers_clearErrors(ob);
 
+	if(useRenderParams) required_mode = eModifierMode_Render;
+	else required_mode = eModifierMode_Realtime;
+
 	/* we always want to keep original indices */
 	dataMask |= CD_MASK_ORIGINDEX;
 
-	datamasks = modifiers_calcDataMasks(md, dataMask);
+	datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
 	curr = datamasks;
 
 	if(deform_r) *deform_r = NULL;
 	*final_r = NULL;
 
-	if(useRenderParams) required_mode = eModifierMode_Render;
-	else required_mode = eModifierMode_Realtime;
-
 	if(useDeform) {
 		if(useDeform > 0 && do_ob_key(ob)) /* shape key makes deform verts */
 			deformedVerts = mesh_getVertexCos(me, &numVerts);
@@ -2156,8 +2156,7 @@
 		for(;md; md = md->next, curr = curr->next) {
 			ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
-			if((md->mode & required_mode) != required_mode) continue;
-			if(mti->isDisabled && mti->isDisabled(md)) continue;
+			if(!modifier_isEnabled(md, required_mode)) continue;
 			if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
 
 			if(mti->type == eModifierTypeType_OnlyDeform) {
@@ -2221,19 +2220,18 @@
 	for(;md; md = md->next, curr = curr->next) {
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
-		if((md->mode & required_mode) != required_mode) continue;
+		if(!modifier_isEnabled(md, required_mode)) continue;
 		if(mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue;
 		if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
 			modifier_setError(md, "Modifier requires original data, bad stack position.");
 			continue;
 		}
-		if(mti->isDisabled && mti->isDisabled(md)) continue;
 		if(needMapping && !modifier_supportsMapping(md)) continue;
 		if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
 
 		/* add an orco layer if needed by this modifier */
 		if(dm && mti->requiredDataMask) {
-			mask = mti->requiredDataMask(md);
+			mask = mti->requiredDataMask(ob, md);
 			if(mask & CD_MASK_ORCO)
 				add_orco_dm(ob, NULL, dm, orcodm);
 		}
@@ -2405,14 +2403,11 @@
 	ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 	int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
 
-	if((md->mode & required_mode) != required_mode) return 0;
+	if(!modifier_isEnabled(md, required_mode)) return 0;
 	if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
 		modifier_setError(md, "Modifier requires original data, bad stack position.");
 		return 0;
 	}
-	if(mti->isDisabled && mti->isDisabled(md)) return 0;
-	if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0;
-	if(md->mode & eModifierMode_DisableTemporary) return 0;
 	
 	return 1;
 }
@@ -2429,6 +2424,7 @@
 	DerivedMesh *dm, *orcodm = NULL;
 	int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL);
 	LinkNode *datamasks, *curr;
+	int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
 
 	modifiers_clearErrors(ob);
 
@@ -2442,7 +2438,7 @@
 	/* we always want to keep original indices */
 	dataMask |= CD_MASK_ORIGINDEX;
 
-	datamasks = modifiers_calcDataMasks(md, dataMask);
+	datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
 
 	curr = datamasks;
 	for(i = 0; md; i++, md = md->next, curr = curr->next) {
@@ -2453,7 +2449,7 @@
 
 		/* add an orco layer if needed by this modifier */
 		if(dm && mti->requiredDataMask) {
-			mask = mti->requiredDataMask(md);
+			mask = mti->requiredDataMask(ob, md);
 			if(mask & CD_MASK_ORCO)
 				add_orco_dm(ob, em, dm, orcodm);
 		}

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-06-15 11:47:16 UTC (rev 20897)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-06-15 11:48:42 UTC (rev 20898)
@@ -206,7 +206,7 @@
 	strncpy(tcmd->name, cmd->name, 32);
 }
 
-CustomDataMask curveModifier_requiredDataMask(ModifierData *md)
+CustomDataMask curveModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	CurveModifierData *cmd = (CurveModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -282,7 +282,7 @@
 	strncpy(tlmd->name, lmd->name, 32);
 }
 
-CustomDataMask latticeModifier_requiredDataMask(ModifierData *md)
+CustomDataMask latticeModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	LatticeModifierData *lmd = (LatticeModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -665,7 +665,7 @@
 	strcpy(tmmd->vgroup, mmd->vgroup);
 }
 
-static CustomDataMask maskModifier_requiredDataMask(ModifierData *md)
+static CustomDataMask maskModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	return (1 << CD_MDEFORMVERT);
 }
@@ -3393,7 +3393,7 @@
 	strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32);
 }
 
-CustomDataMask bevelModifier_requiredDataMask(ModifierData *md)
+CustomDataMask bevelModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	BevelModifierData *bmd = (BevelModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -3473,7 +3473,7 @@
 	strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32);
 }
 
-CustomDataMask displaceModifier_requiredDataMask(ModifierData *md)
+CustomDataMask displaceModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	DisplaceModifierData *dmd = (DisplaceModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -3816,7 +3816,7 @@
 	tumd->aspecty = umd->aspecty;
 }
 
-CustomDataMask uvprojectModifier_requiredDataMask(ModifierData *md)
+CustomDataMask uvprojectModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	CustomDataMask dataMask = 0;
 
@@ -4276,7 +4276,7 @@
 	return 0;
 }
 
-CustomDataMask smoothModifier_requiredDataMask(ModifierData *md)
+CustomDataMask smoothModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	SmoothModifierData *smd = (SmoothModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -4505,7 +4505,7 @@
 	return 0;
 }
 
-CustomDataMask castModifier_requiredDataMask(ModifierData *md)
+CustomDataMask castModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	CastModifierData *cmd = (CastModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -5136,7 +5136,7 @@
 	}
 }
 
-CustomDataMask waveModifier_requiredDataMask(ModifierData *md)
+CustomDataMask waveModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	WaveModifierData *wmd = (WaveModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -5473,7 +5473,7 @@
 	strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
 }
 
-CustomDataMask armatureModifier_requiredDataMask(ModifierData *md)
+CustomDataMask armatureModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	CustomDataMask dataMask = 0;
 
@@ -5587,7 +5587,7 @@
 	strncpy(thmd->name, hmd->name, 32);
 }
 
-CustomDataMask hookModifier_requiredDataMask(ModifierData *md)
+CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	HookModifierData *hmd = (HookModifierData *)md;
 	CustomDataMask dataMask = 0;
@@ -5846,7 +5846,7 @@
 	}
 }
 
-CustomDataMask clothModifier_requiredDataMask(ModifierData *md)
+CustomDataMask clothModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	CustomDataMask dataMask = 0;
 
@@ -6230,7 +6230,7 @@
 	return derivedData;
 }
 
-CustomDataMask booleanModifier_requiredDataMask(ModifierData *md)
+CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
 
@@ -6278,12 +6278,27 @@
 	tpsmd->psys = psmd->psys;
 }
 
-CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md)
+CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
-	CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
+	CustomDataMask dataMask = 0;
+	Material *ma;
+	MTex *mtex;
 	int i;
 
+	ma= give_current_material(ob, psmd->psys->part->omat);
+	if(ma) {
+		for(i=0; i<MAX_MTEX; i++) {
+			mtex=ma->mtex[i];
+			if(mtex && (ma->septex & (1<<i))==0)
+				if(mtex->pmapto && (mtex->texco & TEXCO_UV))
+					dataMask |= (1 << CD_MTFACE);
+		}
+	}
+
+	if(psmd->psys->part->tanfac!=0.0)
+		dataMask |= (1 << CD_MTFACE);
+
 	/* ask for vertexgroups if we need them */
 	for(i=0; i<PSYS_TOT_VG; i++){
 		if(psmd->psys->vgroup[i]){
@@ -6638,7 +6653,7 @@
 {
 	return 1;
 }
-CustomDataMask explodeModifier_requiredDataMask(ModifierData *md)
+CustomDataMask explodeModifier_requiredDataMask(Object *ob, ModifierData *md)
 {
 	ExplodeModifierData *emd= (ExplodeModifierData*) md;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list