Skip to content

Commit a0731ae

Browse files
author
Roberto De Ioris
committed
heavy refactoring and optimization of FAssetData
1 parent bf7f4d6 commit a0731ae

File tree

4 files changed

+71
-67
lines changed

4 files changed

+71
-67
lines changed

Source/UnrealEnginePython/Private/Slate/UEPySlate.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ void UPythonSlateDelegate::CheckBoxChanged(ECheckBoxState state) {
155155
void UPythonSlateDelegate::OnAssetDoubleClicked(const FAssetData& AssetData) {
156156
FScopePythonGIL gil;
157157

158-
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_ue_new_fassetdata((FAssetData *)&AssetData));
158+
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_ue_new_fassetdata(AssetData));
159159
if (!ret) {
160160
unreal_engine_py_log_error();
161161
}
@@ -165,7 +165,7 @@ void UPythonSlateDelegate::OnAssetDoubleClicked(const FAssetData& AssetData) {
165165
void UPythonSlateDelegate::OnAssetSelected(const FAssetData& AssetData) {
166166
FScopePythonGIL gil;
167167

168-
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_ue_new_fassetdata((FAssetData *)&AssetData));
168+
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_ue_new_fassetdata(AssetData));
169169
if (!ret) {
170170
unreal_engine_py_log_error();
171171
}
@@ -175,7 +175,7 @@ void UPythonSlateDelegate::OnAssetSelected(const FAssetData& AssetData) {
175175
void UPythonSlateDelegate::OnAssetChanged(const FAssetData& AssetData) {
176176
FScopePythonGIL gil;
177177

178-
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_ue_new_fassetdata((FAssetData *)&AssetData));
178+
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_ue_new_fassetdata(AssetData));
179179
if (!ret) {
180180
unreal_engine_py_log_error();
181181
}
@@ -187,7 +187,7 @@ TSharedPtr<SWidget> UPythonSlateDelegate::OnGetAssetContextMenu(const TArray<FAs
187187

188188
PyObject *py_list = PyList_New(0);
189189
for (FAssetData asset : SelectedAssets) {
190-
PyList_Append(py_list, py_ue_new_fassetdata(&asset));
190+
PyList_Append(py_list, py_ue_new_fassetdata(asset));
191191
}
192192

193193
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"O", py_list);
@@ -213,7 +213,7 @@ void UPythonSlateDelegate::MenuPyAssetBuilder(FMenuBuilder &Builder, TArray<FAss
213213

214214
PyObject *py_list = PyList_New(0);
215215
for (FAssetData asset : SelectedAssets) {
216-
PyList_Append(py_list, py_ue_new_fassetdata(&asset));
216+
PyList_Append(py_list, py_ue_new_fassetdata(asset));
217217
}
218218

219219
PyObject *ret = PyObject_CallFunction(py_callable, (char *)"OO", py_ue_new_fmenu_builder(&Builder), py_list);

Source/UnrealEnginePython/Private/UEPyEditor.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,9 +752,7 @@ PyObject *py_unreal_engine_get_assets_by_filter(PyObject * self, PyObject * args
752752
continue;
753753
PyObject *ret = nullptr;
754754
if (return_asset_data) {
755-
// Copy isn't working due to an issue with the TSharedMapView TagsAndValues memory
756-
FAssetData *asset_data = new FAssetData(asset.PackageName, asset.PackagePath, asset.GroupNames, asset.AssetName, asset.AssetClass, asset.TagsAndValues.GetMap(), asset.ChunkIDs, asset.PackageFlags);
757-
ret = py_ue_new_fassetdata(asset_data);
755+
ret = py_ue_new_fassetdata(asset);
758756
}
759757
else {
760758
ret = (PyObject *)ue_get_python_wrapper(asset.GetAsset());

Source/UnrealEnginePython/Private/Wrappers/UEPyFAssetData.cpp

Lines changed: 62 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#if WITH_EDITOR
44

55
static PyObject *py_ue_fassetdata_get_asset(ue_PyFAssetData *self, PyObject * args) {
6-
PyObject *ret = (PyObject *)ue_get_python_wrapper(self->asset_data->GetAsset());
6+
PyObject *ret = (PyObject *)ue_get_python_wrapper(self->asset_data.GetAsset());
77
if (!ret) {
88
return PyErr_Format(PyExc_Exception, "unable to get UObject from asset");
99
}
@@ -12,7 +12,7 @@ static PyObject *py_ue_fassetdata_get_asset(ue_PyFAssetData *self, PyObject * ar
1212
}
1313

1414
static PyObject *py_ue_fassetdata_is_asset_loaded(ue_PyFAssetData *self, PyObject * args) {
15-
if (self->asset_data->IsAssetLoaded())
15+
if (self->asset_data.IsAssetLoaded())
1616
Py_RETURN_TRUE;
1717
Py_RETURN_FALSE;
1818
}
@@ -23,45 +23,74 @@ static PyMethodDef ue_PyFAssetData_methods[] = {
2323
{ NULL } /* Sentinel */
2424
};
2525

26-
static PyMemberDef ue_PyFAssetData_members[] = {
27-
{ (char *)"asset_class", T_OBJECT, offsetof(ue_PyFAssetData, asset_class), READONLY, (char *)"asset_class" },
28-
{ (char *)"asset_name", T_OBJECT, offsetof(ue_PyFAssetData, asset_name), READONLY, (char *)"asset_name" },
29-
{ (char *)"group_names", T_OBJECT, offsetof(ue_PyFAssetData, group_names), READONLY, (char *)"group_names" },
30-
{ (char *)"object_path", T_OBJECT, offsetof(ue_PyFAssetData, object_path), READONLY, (char *)"object_path" },
31-
{ (char *)"package_flags", T_OBJECT, offsetof(ue_PyFAssetData, package_flags), READONLY, (char *)"package_flags" },
32-
{ (char *)"package_name", T_OBJECT, offsetof(ue_PyFAssetData, package_name), READONLY, (char *)"package_name" },
33-
{ (char *)"package_path", T_OBJECT, offsetof(ue_PyFAssetData, package_path), READONLY, (char *)"package_path" },
34-
{ (char *)"tags_and_values", T_OBJECT, offsetof(ue_PyFAssetData, tags_and_values), READONLY, (char *)"tags_and_values" },
26+
static PyObject *py_ue_fassetdata_get_asset_class(ue_PyFAssetData *self, void *closure) {
27+
return PyUnicode_FromString(TCHAR_TO_UTF8(*self->asset_data.AssetClass.ToString()));
28+
}
29+
30+
static PyObject *py_ue_fassetdata_get_asset_name(ue_PyFAssetData *self, void *closure) {
31+
return PyUnicode_FromString(TCHAR_TO_UTF8(*self->asset_data.AssetName.ToString()));
32+
}
33+
34+
static PyObject *py_ue_fassetdata_get_group_names(ue_PyFAssetData *self, void *closure) {
35+
return PyUnicode_FromString(TCHAR_TO_UTF8(*self->asset_data.GroupNames.ToString()));
36+
}
37+
38+
static PyObject *py_ue_fassetdata_get_object_path(ue_PyFAssetData *self, void *closure) {
39+
return PyUnicode_FromString(TCHAR_TO_UTF8(*self->asset_data.ObjectPath.ToString()));
40+
}
41+
42+
static PyObject *py_ue_fassetdata_get_package_flags(ue_PyFAssetData *self, void *closure) {
43+
return PyLong_FromUnsignedLong(self->asset_data.PackageFlags);
44+
}
45+
46+
static PyObject *py_ue_fassetdata_get_package_name(ue_PyFAssetData *self, void *closure) {
47+
return PyUnicode_FromString(TCHAR_TO_UTF8(*self->asset_data.PackageName.ToString()));
48+
}
49+
50+
static PyObject *py_ue_fassetdata_get_package_path(ue_PyFAssetData *self, void *closure) {
51+
return PyUnicode_FromString(TCHAR_TO_UTF8(*self->asset_data.PackagePath.ToString()));
52+
}
53+
54+
static PyObject *py_ue_fassetdata_get_tags_and_values(ue_PyFAssetData *self, void *closure) {
55+
PyObject *ret = PyDict_New();
56+
for (auto It = self->asset_data.TagsAndValues.CreateConstIterator(); It; ++It)
57+
{
58+
PyDict_SetItem(ret,
59+
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Key.ToString())),
60+
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Value)));
61+
}
62+
return ret;
63+
}
64+
65+
static PyGetSetDef ue_PyFAssetData_getseters[] = {
66+
{ (char *)"asset_class", (getter)py_ue_fassetdata_get_asset_class, nullptr, (char *)"asset_class" },
67+
{ (char *)"asset_name", (getter)py_ue_fassetdata_get_asset_name, nullptr, (char *)"asset_name" },
68+
{ (char *)"group_names", (getter)py_ue_fassetdata_get_group_names, nullptr, (char *)"group_names" },
69+
{ (char *)"object_path",(getter)py_ue_fassetdata_get_object_path, nullptr, (char *)"object_path" },
70+
{ (char *)"package_flags",(getter)py_ue_fassetdata_get_package_flags, nullptr, (char *)"package_flags" },
71+
{ (char *)"package_name", (getter)py_ue_fassetdata_get_package_name, nullptr, (char *)"package_name" },
72+
{ (char *)"package_path", (getter)py_ue_fassetdata_get_package_path, nullptr, (char *)"package_path" },
73+
{ (char *)"tags_and_values", (getter)py_ue_fassetdata_get_tags_and_values, nullptr, (char *)"tags_and_values" },
3574
{ NULL } /* Sentinel */
3675
};
3776

3877
static int ue_py_fassetdata_init(ue_PyFAssetData *self, PyObject *args, PyObject *kwargs) {
39-
return 0;
78+
// avoid FAssetData manual creation
79+
return -1;
4080
}
4181

42-
static void ue_py_fassetdata_dealloc(ue_PyFAssetData *self) {
43-
Py_XDECREF(self->asset_class);
44-
Py_XDECREF(self->asset_name);
45-
Py_XDECREF(self->group_names);
46-
Py_XDECREF(self->object_path);
47-
Py_XDECREF(self->package_flags);
48-
Py_XDECREF(self->package_name);
49-
Py_XDECREF(self->package_path);
50-
Py_XDECREF(self->tags_and_values);
51-
52-
#if PY_MAJOR_VERSION < 3
53-
self->ob_type->tp_free((PyObject*)self);
54-
#else
55-
Py_TYPE(self)->tp_free((PyObject*)self);
56-
#endif
82+
static PyObject *ue_PyFAssetData_str(ue_PyFAssetData *self)
83+
{
84+
return PyUnicode_FromFormat("<unreal_engine.FColor '%s'>",
85+
TCHAR_TO_UTF8(*self->asset_data.GetExportTextName()));
5786
}
5887

5988
static PyTypeObject ue_PyFAssetDataType = {
6089
PyVarObject_HEAD_INIT(NULL, 0)
6190
"unreal_engine.FAssetData", /* tp_name */
6291
sizeof(ue_PyFAssetData), /* tp_basicsize */
6392
0, /* tp_itemsize */
64-
(destructor)ue_py_fassetdata_dealloc, /* tp_dealloc */
93+
0, /* tp_dealloc */
6594
0, /* tp_print */
6695
0, /* tp_getattr */
6796
0, /* tp_setattr */
@@ -72,7 +101,7 @@ static PyTypeObject ue_PyFAssetDataType = {
72101
0, /* tp_as_mapping */
73102
0, /* tp_hash */
74103
0, /* tp_call */
75-
0, /* tp_str */
104+
(reprfunc)ue_PyFAssetData_str, /* tp_str */
76105
0, /* tp_getattro */
77106
0, /* tp_setattro */
78107
0, /* tp_as_buffer */
@@ -85,8 +114,8 @@ static PyTypeObject ue_PyFAssetDataType = {
85114
0, /* tp_iter */
86115
0, /* tp_iternext */
87116
ue_PyFAssetData_methods, /* tp_methods */
88-
ue_PyFAssetData_members, /* tp_members */
89-
0, /* tp_getset */
117+
0, /* tp_members */
118+
ue_PyFAssetData_getseters, /* tp_getset */
90119
};
91120

92121
void ue_python_init_fassetdata(PyObject *ue_module) {
@@ -99,25 +128,10 @@ void ue_python_init_fassetdata(PyObject *ue_module) {
99128
PyModule_AddObject(ue_module, "FAssetData", (PyObject *)&ue_PyFAssetDataType);
100129
}
101130

102-
PyObject *py_ue_new_fassetdata(FAssetData *asset_data) {
131+
PyObject *py_ue_new_fassetdata(FAssetData asset_data) {
103132
ue_PyFAssetData *ret = (ue_PyFAssetData *)PyObject_New(ue_PyFAssetData, &ue_PyFAssetDataType);
104133

105-
ret->asset_class = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->AssetClass.ToString()));
106-
ret->asset_name = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->AssetName.ToString()));
107-
ret->group_names = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->GroupNames.ToString()));
108-
ret->object_path = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->ObjectPath.ToString()));
109-
ret->package_flags = PyLong_FromLong(asset_data->PackageFlags);
110-
ret->package_name = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->PackageName.ToString()));
111-
ret->package_path = PyUnicode_FromString(TCHAR_TO_UTF8(*asset_data->PackagePath.ToString()));
112-
ret->tags_and_values = PyDict_New();
113-
for (auto It = asset_data->TagsAndValues.CreateConstIterator(); It; ++It)
114-
{
115-
PyDict_SetItem(ret->tags_and_values,
116-
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Key.ToString())),
117-
PyUnicode_FromString(TCHAR_TO_UTF8(*It->Value)));
118-
}
119-
120-
ret->asset_data = asset_data;
134+
new(&ret->asset_data) FAssetData(asset_data);
121135
return (PyObject *)ret;
122136
}
123137

Source/UnrealEnginePython/Private/Wrappers/UEPyFAssetData.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,11 @@
55

66
struct ue_PyFAssetData {
77
PyObject_HEAD
8-
/* Type-specific fields go here. */
9-
FAssetData *asset_data;
10-
PyObject *asset_class;
11-
PyObject *asset_name;
12-
PyObject *group_names;
13-
PyObject *object_path;
14-
PyObject *package_flags;
15-
PyObject *package_name;
16-
PyObject *package_path;
17-
PyObject *tags_and_values;
8+
/* Type-specific fields go here. */
9+
FAssetData asset_data;
1810
};
1911

20-
PyObject *py_ue_new_fassetdata(FAssetData *);
12+
PyObject *py_ue_new_fassetdata(FAssetData);
2113
ue_PyFAssetData *py_ue_is_fassetdata(PyObject *);
2214

2315
void ue_python_init_fassetdata(PyObject *);

0 commit comments

Comments
 (0)