// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved // Please see LICENSE.md in repository root for license information // https://github.com/AtomicGameEngine/AtomicGameEngine #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../EditorMode/AEEditorMode.h" #include "AEEditorApp.h" #include "AEPreferences.h" using namespace ToolCore; namespace ToolCore { extern void jsapi_init_toolcore(JSVM* vm); } namespace AtomicEditor { extern void jsapi_init_editor(JSVM* vm); AEEditorApp::AEEditorApp(Context* context) : AEEditorCommon(context) { } void AEEditorApp::Start() { AEEditorCommon::Start(); context_->RegisterSubsystem(new EditorMode(context_)); vm_->SetModuleSearchPaths("AtomicEditor"); // Do not create bone structure by default when in the editor // this can be toggled temporarily, for example to setup an animation preview AnimatedModel::SetBoneCreationEnabled(false); // move UI initialization to JS UI* ui = GetSubsystem(); ui->Initialize("AtomicEditor/resources/language/lng_en.tb.txt"); ui->LoadSkin("AtomicEditor/resources/default_skin/skin.tb.txt", "AtomicEditor/editor/skin/skin.tb.txt"); ui->AddFont("AtomicEditor/resources/vera.ttf", "Vera"); ui->AddFont("AtomicEditor/resources/MesloLGS-Regular.ttf", "Monaco"); ui->SetDefaultFont("Vera", 12); SubscribeToEvent(E_JSERROR, HANDLER(AEEditorApp, HandleJSError)); SubscribeToEvent(E_EXITREQUESTED, HANDLER(AEEditorApp, HandleExitRequested)); jsapi_init_toolcore(vm_); jsapi_init_editor(vm_); SharedPtr file (GetSubsystem()->GetFile("AtomicEditor/main.js")); if (file.Null()) { ErrorExit("Unable to load AtomicEditor/main.js"); return; } if (!vm_->ExecuteFile(file)) { ErrorExit("Error executing AtomicEditor/main.js"); return; } GetSubsystem()->Initialize(); } void AEEditorApp::Setup() { context_->SetEditorContext(true); context_->RegisterSubsystem(new AEPreferences(context_)); ToolEnvironment* env = new ToolEnvironment(context_); context_->RegisterSubsystem(env); ToolSystem* system = new ToolSystem(context_); context_->RegisterSubsystem(system); #ifdef ATOMIC_DEV_BUILD if (!env->InitFromJSON()) { ErrorExit(ToString("Unable to initialize tool environment from %s", env->GetDevConfigFilename().CString())); return; } #endif engineParameters_["WindowTitle"] = "AtomicEditor"; engineParameters_["WindowResizable"] = true; engineParameters_["FullScreen"] = false; engineParameters_["LogLevel"] = LOG_DEBUG; FileSystem* filesystem = GetSubsystem(); engineParameters_["LogName"] = filesystem->GetAppPreferencesDir("AtomicEditor", "Logs") + "AtomicEditor.log"; #ifdef ATOMIC_PLATFORM_OSX engineParameters_["WindowIcon"] = "Images/AtomicLogo32.png"; #endif #ifdef ATOMIC_DEV_BUILD engineParameters_["ResourcePrefixPath"] = ""; String ScriptPath = env->GetRootSourceDir() + "Script"; String resourcePaths = env->GetCoreDataDir() + ";" + env->GetEditorDataDir() + ";" + ScriptPath; engineParameters_["ResourcePaths"] = resourcePaths; #else #error ATOMIC_DEV_BUILD not defined #endif // ATOMIC_DEV_BUILD } void AEEditorApp::Stop() { AEEditorCommon::Stop(); } void AEEditorApp::HandleExitRequested(StringHash eventType, VariantMap& eventData) { } void AEEditorApp::HandleJSError(StringHash eventType, VariantMap& eventData) { using namespace JSError; //String errName = eventData[P_ERRORNAME].GetString(); String errMessage = eventData[P_ERRORMESSAGE].GetString(); String errFilename = eventData[P_ERRORFILENAME].GetString(); //String errStack = eventData[P_ERRORSTACK].GetString(); int errLineNumber = eventData[P_ERRORLINENUMBER].GetInt(); String errorString = ToString("%s - %s - Line: %i", errFilename.CString(), errMessage.CString(), errLineNumber); ErrorExit(errorString); } }