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.
This commit is contained in:
@@ -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(){
|
||||
|
||||
@@ -82,10 +82,8 @@ void BL_ArmatureObject::ProcessReplica(BL_ArmatureObject *replica)
|
||||
|
||||
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 @@ void BL_ArmatureObject::GetMRDPose(bPose **pose)
|
||||
// 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);
|
||||
|
||||
|
||||
@@ -628,7 +628,8 @@ BL_Material* ConvertMaterial(
|
||||
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 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
|
||||
if (converter->addInitFromFrame)
|
||||
if (!isInActiveLayer)
|
||||
addobj=false;
|
||||
|
||||
|
||||
if (gameobj&&addobj)
|
||||
{
|
||||
MT_Point3 posPrev;
|
||||
|
||||
@@ -93,6 +93,9 @@ void* KX_SceneReplicationFunc(SG_IObject* node,void* gameobj,void* scene)
|
||||
{
|
||||
KX_GameObject* replica = ((KX_Scene*)scene)->AddNodeReplicaObject(node,(KX_GameObject*)gameobj);
|
||||
|
||||
if(replica)
|
||||
replica->Release();
|
||||
|
||||
return (void*)replica;
|
||||
}
|
||||
|
||||
@@ -670,8 +673,12 @@ void KX_Scene::DupliGroupRecurse(CValue* obj, int level)
|
||||
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
|
||||
|
||||
@@ -195,6 +195,8 @@ void KX_TrackToActuator::ProcessReplica()
|
||||
// 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 @@ void KX_TrackToActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user