Skip to content

Commit e995c98

Browse files
author
rdeioris
authored
Merge pull request #78 from osstony/get_assets_by_filter_asset_data
Add flag to return FAssetData
2 parents 1665c1b + 36d9b24 commit e995c98

File tree

6 files changed

+176
-3
lines changed

6 files changed

+176
-3
lines changed

Source/UnrealEnginePython/Private/UEPyEditor.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,9 @@ PyObject *py_unreal_engine_get_assets(PyObject * self, PyObject * args) {
334334
PyObject *py_unreal_engine_get_assets_by_filter(PyObject * self, PyObject * args) {
335335

336336
PyObject *pyfilter;
337+
PyObject *py_return_asset_data;
337338

338-
if (!PyArg_ParseTuple(args, "O:get_assets_by_filter", &pyfilter)) {
339+
if (!PyArg_ParseTuple(args, "O|O:get_assets_by_filter", &pyfilter, &py_return_asset_data)) {
339340
return NULL;
340341
}
341342

@@ -352,13 +353,24 @@ PyObject *py_unreal_engine_get_assets_by_filter(PyObject * self, PyObject * args
352353
AssetRegistryModule.Get().SearchAllAssets(true);
353354
AssetRegistryModule.Get().GetAssets(filter->filter, assets);
354355

356+
bool return_asset_data = false;
357+
if (py_return_asset_data && PyObject_IsTrue(py_return_asset_data))
358+
return_asset_data = true;
355359
PyObject *assets_list = PyList_New(0);
356360
for (FAssetData asset : assets) {
357361
if (!asset.IsValid())
358362
continue;
359-
ue_PyUObject *ret = ue_get_python_wrapper(asset.GetAsset());
363+
PyObject *ret = nullptr;
364+
if (return_asset_data) {
365+
// Copy isn't working due to an issue with the TSharedMapView TagsAndValues memory
366+
FAssetData *asset_data = new FAssetData(asset.PackageName, asset.PackagePath, asset.GroupNames, asset.AssetName, asset.AssetClass, asset.TagsAndValues.GetMap(), asset.ChunkIDs, asset.PackageFlags);
367+
ret = py_ue_new_fassetdata(asset_data);
368+
}
369+
else {
370+
ret = (PyObject *)ue_get_python_wrapper(asset.GetAsset());
371+
}
360372
if (ret) {
361-
PyList_Append(assets_list, (PyObject *)ret);
373+
PyList_Append(assets_list, ret);
362374
}
363375
}
364376

Source/UnrealEnginePython/Private/UEPyEngine.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,14 @@ PyObject *py_unreal_engine_get_content_dir(PyObject * self, PyObject * args) {
133133
return PyUnicode_FromString(TCHAR_TO_UTF8(*FPaths::GameContentDir()));
134134
}
135135

136+
PyObject *py_unreal_engine_convert_relative_path_to_full(PyObject * self, PyObject * args) {
137+
char *path;
138+
if (!PyArg_ParseTuple(args, "s:convert_relative_path_to_full", &path)) {
139+
return NULL;
140+
}
141+
return PyUnicode_FromString(TCHAR_TO_UTF8(*FPaths::ConvertRelativePathToFull(UTF8_TO_TCHAR(path))));
142+
}
143+
136144
PyObject *py_unreal_engine_find_class(PyObject * self, PyObject * args) {
137145
char *name;
138146
if (!PyArg_ParseTuple(args, "s:find_class", &name)) {
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#include "UnrealEnginePythonPrivatePCH.h"
2+
3+
#if WITH_EDITOR
4+
5+
static PyObject *py_ue_fassetdata_get_asset(ue_PyFAssetData *self, PyObject * args) {
6+
return (PyObject *)ue_get_python_wrapper(self->asset_data->GetAsset());
7+
}
8+
9+
static PyObject *py_ue_fassetdata_is_asset_loaded(ue_PyFAssetData *self, PyObject * args) {
10+
if (self->asset_data->IsAssetLoaded())
11+
Py_RETURN_TRUE;
12+
Py_RETURN_FALSE;
13+
}
14+
15+
static PyMethodDef ue_PyFAssetData_methods[] = {
16+
{ "get_asset", (PyCFunction)py_ue_fassetdata_get_asset, METH_VARARGS, "" },
17+
{ "is_asset_loaded", (PyCFunction)py_ue_fassetdata_is_asset_loaded, METH_VARARGS, "" },
18+
{ NULL } /* Sentinel */
19+
};
20+
21+
static PyMemberDef ue_PyFAssetData_members[] = {
22+
{ (char *)"asset_class", T_OBJECT, offsetof(ue_PyFAssetData, asset_class), READONLY, (char *)"asset_class" },
23+
{ (char *)"asset_name", T_OBJECT, offsetof(ue_PyFAssetData, asset_name), READONLY, (char *)"asset_name" },
24+
{ (char *)"group_names", T_OBJECT, offsetof(ue_PyFAssetData, group_names), READONLY, (char *)"group_names" },
25+
{ (char *)"object_path", T_OBJECT, offsetof(ue_PyFAssetData, object_path), READONLY, (char *)"object_path" },
26+
{ (char *)"package_flags", T_OBJECT, offsetof(ue_PyFAssetData, package_flags), READONLY, (char *)"package_flags" },
27+
{ (char *)"package_name", T_OBJECT, offsetof(ue_PyFAssetData, package_name), READONLY, (char *)"package_name" },
28+
{ (char *)"package_path", T_OBJECT, offsetof(ue_PyFAssetData, package_path), READONLY, (char *)"package_path" },
29+
{ (char *)"tags_and_values", T_OBJECT, offsetof(ue_PyFAssetData, tags_and_values), READONLY, (char *)"tags_and_values" },
30+
{ NULL } /* Sentinel */
31+
};
32+
33+
static int ue_py_fassetdata_init(ue_PyFAssetData *self, PyObject *args, PyObject *kwargs) {
34+
return 0;
35+
}
36+
37+
static void ue_py_fassetdata_dealloc(ue_PyFAssetData *self) {
38+
Py_XDECREF(self->asset_class);
39+
Py_XDECREF(self->asset_name);
40+
Py_XDECREF(self->group_names);
41+
Py_XDECREF(self->object_path);
42+
Py_XDECREF(self->package_flags);
43+
Py_XDECREF(self->package_name);
44+
Py_XDECREF(self->package_path);
45+
Py_XDECREF(self->tags_and_values);
46+
47+
#if PY_MAJOR_VERSION < 3
48+
self->ob_type->tp_free((PyObject*)self);
49+
#else
50+
Py_TYPE(self)->tp_free((PyObject*)self);
51+
#endif
52+
}
53+
54+
static PyTypeObject ue_PyFAssetDataType = {
55+
PyVarObject_HEAD_INIT(NULL, 0)
56+
"unreal_engine.FAssetData", /* tp_name */
57+
sizeof(ue_PyFAssetData), /* tp_basicsize */
58+
0, /* tp_itemsize */
59+
(destructor)ue_py_fassetdata_dealloc, /* tp_dealloc */
60+
0, /* tp_print */
61+
0, /* tp_getattr */
62+
0, /* tp_setattr */
63+
0, /* tp_reserved */
64+
0, /* tp_repr */
65+
0, /* tp_as_number */
66+
0, /* tp_as_sequence */
67+
0, /* tp_as_mapping */
68+
0, /* tp_hash */
69+
0, /* tp_call */
70+
0, /* tp_str */
71+
0, /* tp_getattro */
72+
0, /* tp_setattro */
73+
0, /* tp_as_buffer */
74+
Py_TPFLAGS_DEFAULT, /* tp_flags */
75+
"Unreal Engine FAssetData", /* tp_doc */
76+
0, /* tp_traverse */
77+
0, /* tp_clear */
78+
0, /* tp_richcompare */
79+
0, /* tp_weaklistoffset */
80+
0, /* tp_iter */
81+
0, /* tp_iternext */
82+
ue_PyFAssetData_methods, /* tp_methods */
83+
ue_PyFAssetData_members, /* tp_members */
84+
0, /* tp_getset */
85+
};
86+
87+
void ue_python_init_fassetdata(PyObject *ue_module) {
88+
ue_PyFAssetDataType.tp_new = PyType_GenericNew;;
89+
ue_PyFAssetDataType.tp_init = (initproc)ue_py_fassetdata_init;
90+
if (PyType_Ready(&ue_PyFAssetDataType) < 0)
91+
return;
92+
93+
Py_INCREF(&ue_PyFAssetDataType);
94+
PyModule_AddObject(ue_module, "FAssetData", (PyObject *)&ue_PyFAssetDataType);
95+
}
96+
97+
PyObject *py_ue_new_fassetdata(FAssetData *asset_data) {
98+
ue_PyFAssetData *ret = (ue_PyFAssetData *)PyObject_New(ue_PyFAssetData, &ue_PyFAssetDataType);
99+
100+
ret->asset_class = PyString_FromString(TCHAR_TO_UTF8(*asset_data->AssetClass.ToString()));
101+
ret->asset_name = PyString_FromString(TCHAR_TO_UTF8(*asset_data->AssetName.ToString()));
102+
ret->group_names = PyString_FromString(TCHAR_TO_UTF8(*asset_data->GroupNames.ToString()));
103+
ret->object_path = PyString_FromString(TCHAR_TO_UTF8(*asset_data->ObjectPath.ToString()));
104+
ret->package_flags = PyInt_FromLong(asset_data->PackageFlags);
105+
ret->package_name = PyString_FromString(TCHAR_TO_UTF8(*asset_data->PackageName.ToString()));
106+
ret->package_path = PyString_FromString(TCHAR_TO_UTF8(*asset_data->PackagePath.ToString()));
107+
ret->tags_and_values = PyDict_New();
108+
for (auto It = asset_data->TagsAndValues.CreateConstIterator(); It; ++It)
109+
{
110+
PyDict_SetItem(ret->tags_and_values,
111+
PyString_FromString(TCHAR_TO_UTF8(*It->Key.ToString())),
112+
PyString_FromString(TCHAR_TO_UTF8(*It->Value)));
113+
}
114+
115+
ret->asset_data = asset_data;
116+
return (PyObject *)ret;
117+
}
118+
119+
ue_PyFAssetData *py_ue_is_fassetdata(PyObject *obj) {
120+
if (!PyObject_IsInstance(obj, (PyObject *)&ue_PyFAssetDataType))
121+
return nullptr;
122+
return (ue_PyFAssetData *)obj;
123+
}
124+
125+
#endif
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma once
2+
#include "UnrealEnginePython.h"
3+
4+
#if WITH_EDITOR
5+
6+
struct ue_PyFAssetData {
7+
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;
18+
};
19+
20+
PyObject *py_ue_new_fassetdata(FAssetData *);
21+
ue_PyFAssetData *py_ue_is_fassetdata(PyObject *);
22+
23+
void ue_python_init_fassetdata(PyObject *);
24+
25+
#endif

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ static PyMethodDef unreal_engine_methods[] = {
128128
{ "get_right_vector", py_unreal_engine_get_right_vector, METH_VARARGS, "" },
129129

130130
{ "get_content_dir", py_unreal_engine_get_content_dir, METH_VARARGS, "" },
131+
{ "convert_relative_path_to_full", py_unreal_engine_convert_relative_path_to_full, METH_VARARGS, "" },
131132
#if WITH_EDITOR
132133
{ "get_editor_world", py_unreal_engine_get_editor_world, METH_VARARGS, "" },
133134
{ "editor_get_selected_actors", py_unreal_engine_editor_get_selected_actors, METH_VARARGS, "" },
@@ -981,6 +982,7 @@ void unreal_engine_init_py_module() {
981982
#if WITH_EDITOR
982983
ue_python_init_swidget(new_unreal_engine_module);
983984
ue_python_init_farfilter(new_unreal_engine_module);
985+
ue_python_init_fassetdata(new_unreal_engine_module);
984986
#endif
985987

986988
PyObject *py_sys = PyImport_ImportModule("sys");

Source/UnrealEnginePython/Private/UnrealEnginePythonPrivatePCH.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "UEPyEnumsImporter.h"
4343

4444
#if WITH_EDITOR
45+
#include "UEPyFAssetData.h"
4546
#include "UEPyFARFilter.h"
4647
#include "UEPyAnimSequence.h"
4748
#endif

0 commit comments

Comments
 (0)