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
7 changes: 1 addition & 6 deletions engine/src/components/actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,17 +323,12 @@ void Actor::setParent(Object *parent, int32_t position, bool force) {
return;
}

m_scene = nullptr;

Actor *actor = dynamic_cast<Actor *>(parent);
if(actor) {
setScene(actor->scene());
m_hierarchyEnable = actor->m_hierarchyEnable;
} else {
Scene *scene = dynamic_cast<Scene *>(parent);
if(scene) {
setScene(scene);
}
setScene(dynamic_cast<Scene *>(parent));
}
if(m_transform) {
Object::setParent(parent, position, force);
Expand Down
13 changes: 7 additions & 6 deletions engine/src/editor/assetmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,29 +429,30 @@ void AssetManager::makePrefab(const QString &source, const QString &target) {
QString name = source.mid(index + 1);
Actor *actor = dynamic_cast<Actor *>(Engine::findObject(id.toUInt()));
if(actor) {
Actor *clone = static_cast<Actor *>(actor->clone(actor->parent()));
Object *parent = actor->parent();
Prefab *fab = Engine::objectCreate<Prefab>("");
fab->setActor(actor);

QString path = m_projectManager->contentPath() + "/" + QFileInfo(target).filePath() + "/" + name + ".fab";
QFile file(path);
if(file.open(QIODevice::WriteOnly)) {
std::string str = Json::save(Engine::toVariant(actor), 0);
std::string str = Json::save(Engine::toVariant(fab), 0);
file.write(static_cast<const char *>(&str[0]), str.size());
file.close();

AssetConverterSettings *settings = fetchSettings(path);
if(settings) {
settings->saveSettings();

Prefab *fab = Engine::objectCreate<Prefab>("");
fab->setActor(actor);
clone->setPrefab(fab);

if(!settings->isCode()) {
registerAsset(settings->source(), settings->destination(), settings->typeName());

Engine::setResource(fab, settings->destination().toStdString());
}
dumpBundle();

Actor *clone = static_cast<Actor *>(actor->clone(parent));

emit prefabCreated(id.toUInt(), clone->uuid());
}
}
Expand Down
4 changes: 2 additions & 2 deletions engine/src/editor/converters/prefabconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Actor *PrefabConverter::createActor(const AssetConverterSettings *settings, cons
PROFILE_FUNCTION();

Prefab *prefab = Engine::loadResource<Prefab>(guid.toStdString());
if(prefab) {
if(prefab && prefab->actor()) {
return static_cast<Actor *>(prefab->actor()->clone());
}
return AssetConverter::createActor(settings, guid);
Expand Down Expand Up @@ -145,7 +145,7 @@ bool PrefabConverter::toVersion4(Variant &variant) {

bool PrefabConverter::toVersion5(Variant &variant) {
Object *object = Engine::toObject(variant);
if(object) {
if(object && dynamic_cast<Prefab *>(object) == nullptr) {
Prefab *resource = Engine::objectCreate<Prefab>();

object->setParent(resource);
Expand Down
8 changes: 4 additions & 4 deletions engine/src/systems/resourcesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,11 @@ void ResourceSystem::processState(Resource *resource) {
ObjectList deleteObjects;
enumObjects(resource, deleteObjects);

VariantList objects = var.toList();
const VariantList &objects = *(reinterpret_cast<VariantList *>(var.data()));
auto delIt = deleteObjects.begin();
bool first = true;
for(auto &obj : objects) {
VariantList fields = obj.toList();
const VariantList &fields = *(reinterpret_cast<VariantList *>(obj.data()));
auto it = std::next(fields.begin(), 1);
Object *object = resource;
if(!first) {
Expand All @@ -242,7 +242,7 @@ void ResourceSystem::processState(Resource *resource) {

if(object) {
it = std::next(fields.begin(), 4);
VariantMap &properties = *(reinterpret_cast<VariantMap *>((*it).data()));
const VariantMap &properties = *(reinterpret_cast<VariantMap *>((*it).data()));
for(const auto &prop : properties) {
Variant v = prop.second;
if(v.type() < MetaType::USERTYPE) {
Expand All @@ -267,7 +267,7 @@ void ResourceSystem::processState(Resource *resource) {

resource->switchState(Resource::ToBeUpdated);
} else {
Log(Log::ERR) << "Unable to load resource: " << uuid.c_str();
aError() << "Unable to load resource:" << uuid;
resource->setState(Resource::Invalid);
}
}
Expand Down
2 changes: 1 addition & 1 deletion worldeditor/bin/engine/materials/DefaultMesh.shader
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ void main() {
#ifdef VISIBILITY_BUFFER
gbuffer0 = _objectId;
#else
vec3 emissive = vec3(1.0f);
vec3 emissive = vec3(0.0f);
vec3 albedo = vec3(1.0f) * _color.xyz;
float roughness = 0.9f;
float metallic = 0.0f;
Expand Down
16 changes: 11 additions & 5 deletions worldeditor/src/screens/scenecomposer/objectcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,17 +364,21 @@ void ObjectController::select(Object &object) {
m_objectsList = {object.uuid()};
}

void ObjectController::setIsolatedPrefab(Prefab *prefab) {
bool ObjectController::setIsolatedPrefab(Prefab *prefab) {
m_isolatedPrefab = prefab;
if(m_isolatedPrefab) {
m_isolatedPrefab->setModified(false);
m_isolationSelectedBackup = selected();
Actor *actor = m_isolatedPrefab->actor();
onSelectActor({actor});
if(actor) {
onSelectActor({actor});

onFocusActor(actor);
blockMovement(true);
setFree(false);
onFocusActor(actor);
blockMovement(true);
setFree(false);
} else {
return false;
}
} else {
std::list<uint32_t> local;
for(auto &it : m_isolationSelectedBackup) {
Expand All @@ -394,6 +398,8 @@ void ObjectController::setIsolatedPrefab(Prefab *prefab) {
color = EditorSettings::instance()->value(gBackgroundColor).value<QColor>();
}
m_activeCamera->setColor(Vector4(color.redF(), color.greenF(), color.blueF(), color.alphaF()));

return true;
}

void ObjectController::selectActors(const std::list<uint32_t> &list) {
Expand Down
2 changes: 1 addition & 1 deletion worldeditor/src/screens/scenecomposer/objectcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class ObjectController : public CameraController {

QList<Object *> selected() override;

void setIsolatedPrefab(Prefab *prefab);
bool setIsolatedPrefab(Prefab *prefab);
Prefab *isolatedPrefab() const { return m_isolatedPrefab; }

QList<EditorTool *> tools() const { return m_tools; }
Expand Down
11 changes: 8 additions & 3 deletions worldeditor/src/screens/scenecomposer/scenecomposer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
#include <editor/undomanager.h>
#include <editor/projectsettings.h>

#include <log.h>

#include <float.h>

#include "objectcontroller.h"
Expand Down Expand Up @@ -931,9 +933,12 @@ void SceneComposer::enterToIsolation(AssetConverterSettings *settings) {
emit objectsHierarchyChanged(m_isolationScene);

m_isolationBackState = m_controller->saveState();
m_controller->setIsolatedPrefab(prefab);

ui->isolationPanel->setVisible(true);
if(m_controller->setIsolatedPrefab(prefab)) {
ui->isolationPanel->setVisible(true);
} else {
aWarning() << "Prefab is broken";
quitFromIsolation();
}
}
}
}
Expand Down
Loading