[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15882] trunk/blender/source/gameengine:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jul 30 18:15:15 CEST 2008


Revision: 15882
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15882
Author:   blendix
Date:     2008-07-30 18:15:15 +0200 (Wed, 30 Jul 2008)

Log Message:
-----------

Bugfixes: fix for two memory leaks related to dupligroups,
and a missing reference count in the trackto actuator. This
showed up as leaked pose data, but actually the whole object
was not being freed.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
    trunk/blender/source/gameengine/Converter/BL_ArmatureObject.cpp
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp	2008-07-30 11:27:04 UTC (rev 15881)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp	2008-07-30 16:15:15 UTC (rev 15882)
@@ -57,24 +57,12 @@
 
 BL_ActionActuator::~BL_ActionActuator()
 {
-
-	if (m_pose) {
-		free_pose_channels(m_pose);
-		MEM_freeN(m_pose);
-		m_pose = NULL;
-	};
-	
-	if (m_userpose){
-		free_pose_channels(m_userpose);
-		MEM_freeN(m_userpose);
-		m_userpose=NULL;
-	}
-	if (m_blendpose) {
-		free_pose_channels(m_blendpose);
-		MEM_freeN(m_blendpose);
-		m_blendpose = NULL;
-	};
-	
+	if (m_pose)
+		free_pose(m_pose);
+	if (m_userpose)
+		free_pose(m_userpose);
+	if (m_blendpose)
+		free_pose(m_blendpose);
 }
 
 void BL_ActionActuator::ProcessReplica(){

Modified: trunk/blender/source/gameengine/Converter/BL_ArmatureObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ArmatureObject.cpp	2008-07-30 11:27:04 UTC (rev 15881)
+++ trunk/blender/source/gameengine/Converter/BL_ArmatureObject.cpp	2008-07-30 16:15:15 UTC (rev 15882)
@@ -82,10 +82,8 @@
 
 BL_ArmatureObject::~BL_ArmatureObject()
 {
-	if (m_mrdPose){
-		free_pose_channels(m_mrdPose);
-		MEM_freeN(m_mrdPose);
-	}
+	if (m_mrdPose)
+		free_pose(m_mrdPose);
 }
 
 /* note, you can only call this for exisiting Armature objects, and not mix it with other Armatures */
@@ -172,12 +170,13 @@
 	//	copy_pose (&m_mrdPose, m_pose, 0);
 	//}
 
-	if (!*pose)
+	if (!*pose) {
 		// must duplicate the constraints too otherwise we have corruption in free_pose_channels()
 		// because it will free the blender constraints. 
 		// Ideally, blender should rememeber that the constraints were not copied so that
 		// free_pose_channels() would not free them.
 		copy_pose(pose, m_objArma->pose, 1);
+	}
 	else
 		extract_pose_from_pose(*pose, m_objArma->pose);
 

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-07-30 11:27:04 UTC (rev 15881)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-07-30 16:15:15 UTC (rev 15882)
@@ -628,7 +628,8 @@
 		material->transp = TF_ALPHA;
 
 	// always zsort alpha + add
-	if(material->transp == TF_ALPHA || material->transp == TF_ADD || texalpha) {
+	if((material->transp == TF_ALPHA || material->transp == TF_ADD || texalpha)
+		&& (material->transp != TF_CLIP)) {
 		material->ras_mode |= ALPHA;
 		material->ras_mode |= (material->mode & TF_ALPHASORT)? ZSORT: 0;
 	}
@@ -1856,7 +1857,7 @@
 		if (converter->addInitFromFrame)
 			if (!isInActiveLayer)
 				addobj=false;
-										
+
 		if (gameobj&&addobj)
 		{
 			MT_Point3 posPrev;			

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2008-07-30 11:27:04 UTC (rev 15881)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2008-07-30 16:15:15 UTC (rev 15882)
@@ -93,6 +93,9 @@
 {
 	KX_GameObject* replica = ((KX_Scene*)scene)->AddNodeReplicaObject(node,(KX_GameObject*)gameobj);
 
+	if(replica)
+		replica->Release();
+
 	return (void*)replica;
 }
 
@@ -670,8 +673,12 @@
 	for (oit=m_groupGameObjects.begin(); oit != m_groupGameObjects.end(); oit++)
 	{
 		gameobj = (KX_GameObject*)(*oit);
-		if (gameobj->GetParent() != NULL)
+
+		KX_GameObject *parent = gameobj->GetParent();
+		if (parent != NULL)
 		{
+			parent->Release(); // GetParent() increased the refcount
+
 			// this object is not a top parent. Either it is the child of another
 			// object in the group and it will be added automatically when the parent
 			// is added. Or it is the child of an object outside the group and the group

Modified: trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp	2008-07-30 11:27:04 UTC (rev 15881)
+++ trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp	2008-07-30 16:15:15 UTC (rev 15882)
@@ -195,6 +195,8 @@
 	// the replica is tracking the same object => register it
 	if (m_object)
 		m_object->RegisterActuator(this);
+	if (m_parentobj)
+		m_parentobj->AddRef();
 	SCA_IActuator::ProcessReplica();
 }
 
@@ -219,6 +221,14 @@
 		m_object = (SCA_IObject*)(*h_obj);
 		m_object->RegisterActuator(this);
 	}
+
+	void **h_parobj = (*obj_map)[m_parentobj];
+	if (h_parobj) {
+		if (m_parentobj)
+			m_parentobj->Release();
+		m_parentobj= (KX_GameObject*)(*h_parobj);
+		m_parentobj->AddRef();
+	}
 }
 
 





More information about the Bf-blender-cvs mailing list