PyObject *py_ue_skeleton_add_bone(ue_PyUObject *self, PyObject * args) { ue_py_check(self); char *name; int parent_index; PyObject *py_transform; if (!PyArg_ParseTuple(args, "siO:skeleton_add_bone", &name, &parent_index, &py_transform)) return nullptr; USkeleton *skeleton = ue_py_check_type<USkeleton>(self); if (!skeleton) return PyErr_Format(PyExc_Exception, "uobject is not a USkeleton"); ue_PyFTransform *transform = py_ue_is_ftransform(py_transform); if (!transform) return PyErr_Format(PyExc_Exception, "argument is not a FTransform"); if (skeleton->GetReferenceSkeleton().FindBoneIndex(FName(UTF8_TO_TCHAR(name))) > -1) { return PyErr_Format(PyExc_Exception, "bone %s already exists", name); } #if WITH_EDITOR skeleton->PreEditChange(nullptr); #endif { const FReferenceSkeleton &ref = skeleton->GetReferenceSkeleton(); // horrible hack to modify the skeleton in place FReferenceSkeletonModifier modifier((FReferenceSkeleton &)ref, skeleton); TCHAR *bone_name = UTF8_TO_TCHAR(name); modifier.Add(FMeshBoneInfo(FName(bone_name), FString(bone_name), parent_index), transform->transform); } #if WITH_EDITOR skeleton->PostEditChange(); #endif skeleton->MarkPackageDirty(); return PyLong_FromLong(skeleton->GetReferenceSkeleton().FindBoneIndex(FName(UTF8_TO_TCHAR(name)))); }