Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions engine/includes/editor/assetconverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ typedef QMap<QString, QString> QStringMap;
class ENGINE_EXPORT AssetConverterSettings : public QObject {
Q_OBJECT

struct SubItem {
QString uuid;

int32_t typeId;

bool dirty = true;
};

public:
AssetConverterSettings();
virtual ~AssetConverterSettings();
Expand Down Expand Up @@ -59,6 +67,8 @@ class ENGINE_EXPORT AssetConverterSettings : public QObject {
QString subTypeName(const QString &key) const;
int32_t subType(const QString &key) const;

void setSubItemsDirty();

void setSubItem(const QString &name, const QString &uuid, int32_t type);
virtual void setSubItemData(const QString &name, const QJsonObject &data);

Expand Down Expand Up @@ -86,9 +96,7 @@ class ENGINE_EXPORT AssetConverterSettings : public QObject {
QString m_absoluteDestination;
QString m_source;

QStringMap m_subItems;
QStringMap m_subTypeNames;
QMap<QString, int32_t> m_subTypes;
QMap<QString, SubItem> m_subItems;
};

typedef QList<uint32_t> QIntegerList;
Expand Down
5 changes: 4 additions & 1 deletion engine/includes/editor/converters/assimpconverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class aiAnimation;

typedef std::list<const aiBone *> BonesList;
typedef std::map<std::string, Actor *> ActorsMap;
typedef std::unordered_map<uint32_t, Mesh *> MeshMap;

class AssimpImportSettings : public AssetConverterSettings {
Q_OBJECT
Expand Down Expand Up @@ -72,6 +73,8 @@ class AssimpImportSettings : public AssetConverterSettings {

BonesList m_bones;

MeshMap m_meshes;

ActorsMap m_actors;

Actor *m_rootActor;
Expand Down Expand Up @@ -113,7 +116,7 @@ class AssimpConverter : public AssetConverter {

Actor *importObject(const aiScene *scene, const aiNode *element, Actor *parent, AssimpImportSettings *fbxSettings);

static Mesh *importMesh(const aiScene *scene, const aiNode *element, Actor *parent, AssimpImportSettings *fbxSettings);
static Mesh *importMesh(const aiScene *scene, const aiNode *element, Actor *actor, AssimpImportSettings *fbxSettings);

static void importAnimation(const aiScene *scene, AssimpImportSettings *fbxSettings);

Expand Down
38 changes: 24 additions & 14 deletions engine/src/editor/assetconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ const QStringList AssetConverterSettings::subKeys() const {
}

QString AssetConverterSettings::subItem(const QString &key) const {
return m_subItems.value(key);
return m_subItems.value(key).uuid;
}

QJsonObject AssetConverterSettings::subItemData(const QString &key) const {
Expand All @@ -164,13 +164,18 @@ QString AssetConverterSettings::subTypeName(const QString &key) const {
}

int32_t AssetConverterSettings::subType(const QString &key) const {
return m_subTypes.value(key);
return m_subItems.value(key).typeId;
}

void AssetConverterSettings::setSubItemsDirty() {
for(auto &it : m_subItems) {
it.dirty = true;
}
}

void AssetConverterSettings::setSubItem(const QString &name, const QString &uuid, int32_t type) {
if(!name.isEmpty() && !uuid.isEmpty()) {
m_subItems[name] = uuid;
m_subTypes[name] = type;
m_subItems[name] = {uuid, type, false};
}
}

Expand Down Expand Up @@ -263,17 +268,22 @@ void AssetConverterSettings::saveSettings() {

QJsonObject sub;
for(const QString &it : subKeys()) {
QJsonArray array;
QString uuid = subItem(it);
array.push_back(uuid);
array.push_back(subType(it));

QJsonObject data = subItemData(it);
if(!data.isEmpty()) {
array.push_back(data);
}
SubItem item = m_subItems.value(it);

if(!item.dirty) {
QJsonArray array;
array.push_back(item.uuid);
array.push_back(item.typeId);

sub[it] = array;
QJsonObject data = subItemData(it);
if(!data.isEmpty()) {
array.push_back(data);
}

array.push_back(subTypeName(it));

sub[it] = array;
}
}
obj.insert(gSubItems, sub);

Expand Down
1 change: 1 addition & 0 deletions engine/src/editor/assetmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -839,6 +839,7 @@ AssetConverter *AssetManager::getConverter(const QFileInfo &source) {
void AssetManager::convert(AssetConverterSettings *settings) {
AssetConverter *converter = getConverter(settings->source());
if(converter) {
settings->setSubItemsDirty();
uint8_t result = converter->convertFile(settings);
switch(result) {
case AssetConverter::Success: {
Expand Down
55 changes: 38 additions & 17 deletions engine/src/editor/converters/assimpconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ AssetConverter::ReturnCode AssimpConverter::convertFile(AssetConverterSettings *
fbxSettings->m_resources.clear();
fbxSettings->m_bones.clear();
fbxSettings->m_actors.clear();
fbxSettings->m_meshes.clear();
fbxSettings->m_rootActor = nullptr;
fbxSettings->m_rootBone = nullptr;
fbxSettings->m_flip = false;
Expand Down Expand Up @@ -326,28 +327,17 @@ Actor *importObjectHelper(const aiScene *scene, const aiNode *element, const aiM
actor->transform()->setRotation(Vector3(euler.x, euler.y, euler.z) * RAD2DEG);
actor->transform()->setScale(Vector3(scale.x, scale.y, scale.z));

QString uuid = actor->name().c_str();

Mesh *result = AssimpConverter::importMesh(scene, element, actor, fbxSettings);
if(result) {
uuid = fbxSettings->saveSubData(Bson::save(Engine::toVariant(result)), uuid, MetaType::type<Mesh *>());

Mesh *resource = Engine::loadResource<Mesh>(qPrintable(uuid));
if(resource == nullptr) {
Engine::setResource(result, uuid.toStdString());
fbxSettings->m_resources.push_back(uuid);
resource = result;
}

if(!result->weights().empty()) {
SkinnedMeshRender *render = static_cast<SkinnedMeshRender *>(actor->addComponent("SkinnedMeshRender"));

render->setMesh(resource);
render->setMesh(result);
fbxSettings->m_renders.push_back(render);
} else {
MeshRender *render = static_cast<MeshRender *>(actor->addComponent("MeshRender"));

render->setMesh(resource);
render->setMesh(result);
fbxSettings->m_renders.push_back(render);
}
}
Expand All @@ -367,9 +357,26 @@ Actor *AssimpConverter::importObject(const aiScene *scene, const aiNode *element
return importObjectHelper(scene, element, m, parent, fbxSettings);
}

Mesh *AssimpConverter::importMesh(const aiScene *scene, const aiNode *element, Actor *parent, AssimpImportSettings *fbxSettings) {
Mesh *AssimpConverter::importMesh(const aiScene *scene, const aiNode *element, Actor *actor, AssimpImportSettings *fbxSettings) {
if(element->mNumMeshes) {
Mesh *mesh = Engine::objectCreate<Mesh>(element->mName.C_Str());
uint32_t hash = 16;
for(uint32_t index = 0; index < element->mNumMeshes; index++) {
Mathf::hashCombine(hash, element->mMeshes[index]);
}

Mesh *mesh = nullptr;

auto it = fbxSettings->m_meshes.find(hash);
if(it != fbxSettings->m_meshes.end()) {
mesh = it->second;
}

if(mesh) {
return mesh;
}

// Creating a new one
mesh = Engine::objectCreate<Mesh>(element->mName.C_Str());

size_t total_v = 0;
size_t total_i = 0;
Expand All @@ -379,6 +386,7 @@ Mesh *AssimpConverter::importMesh(const aiScene *scene, const aiNode *element, A

for(uint32_t index = 0; index < element->mNumMeshes; index++) {
const aiMesh *item = scene->mMeshes[element->mMeshes[index]];

count_v += item->mNumVertices;
count_i += static_cast<uint32_t>(item->mNumFaces * 3);
}
Expand Down Expand Up @@ -412,7 +420,7 @@ Mesh *AssimpConverter::importMesh(const aiScene *scene, const aiNode *element, A
Matrix4 mov;
Matrix3 rot;
if(item->HasBones()) {
Transform *t = parent->transform();
Transform *t = actor->transform();
rot = t->worldQuaternion().toMatrix();
mov = t->worldTransform();
}
Expand Down Expand Up @@ -511,7 +519,20 @@ Mesh *AssimpConverter::importMesh(const aiScene *scene, const aiNode *element, A
total_i += indexCount;
}

return mesh;
QString uuid = actor->name().c_str();

uuid = fbxSettings->saveSubData(Bson::save(Engine::toVariant(mesh)), uuid, MetaType::type<Mesh *>());

Mesh *resource = Engine::loadResource<Mesh>(qPrintable(uuid));
if(resource == nullptr) {
Engine::setResource(mesh, uuid.toStdString());
fbxSettings->m_resources.push_back(uuid);
resource = mesh;
}

fbxSettings->m_meshes[hash] = resource;

return resource;
}
return nullptr;
}
Expand Down
3 changes: 1 addition & 2 deletions modules/editor/texturetools/converter/textureconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@ void TextureImportSettings::removeElement(const std::string &key) {
m_elements.erase(key);

m_subItems.remove(key.c_str());
m_subTypes.remove(key.c_str());

emit updated();
}
Expand All @@ -148,7 +147,7 @@ QString TextureImportSettings::typeName() const {
QString TextureImportSettings::defaultIcon(QString) const {
return ":/Style/styles/dark/images/texture.svg";
}
#include <QDebug>

QJsonObject TextureImportSettings::subItemData(const QString &key) const {
QJsonObject result;

Expand Down