// // Copyright (c) 2014-2016 THUNDERBEAST GAMES LLC // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #include #include #include #include #include #include "../ToolSystem.h" #include "../Assets/AssetEvents.h" #include "../Project/Project.h" #include "../Project/ProjectEvents.h" #include "NETProjectGen.h" #include "NETBuildSystem.h" #include "NETProjectSystem.h" namespace ToolCore { NETProjectSystem::NETProjectSystem(Context* context) : Object(context) { Initialize(); } NETProjectSystem::~NETProjectSystem() { } void NETProjectSystem::Clear() { quietPeriod_ = 0.0f; solutionPath_.Clear(); projectAssemblyPath_.Clear(); solutionDirty_ = false; projectAssemblyDirty_ = false; } void NETProjectSystem::HandleUpdate(StringHash eventType, VariantMap& eventData) { using namespace Update; float delta = eventData[P_TIMESTEP].GetFloat(); quietPeriod_ -= delta; if (quietPeriod_ < 0.0f) quietPeriod_ = 0.0f; if (quietPeriod_ > 0.0f) return; if (solutionDirty_) { ToolSystem* tsystem = GetSubsystem(); Project* project = tsystem->GetProject(); SharedPtr gen(new NETProjectGen(context_)); gen->SetScriptPlatform("WINDOWS"); if (!gen->LoadProject(project)) { return; } if (!gen->Generate()) { return; } solutionDirty_ = false; } if (projectAssemblyDirty_) { using namespace NETBuildAtomicProject; VariantMap eventData; Project* project = GetSubsystem()->GetProject(); eventData[P_PROJECT] = project; // We need to rebuild the project assembly SendEvent(E_NETBUILDATOMICPROJECT, eventData); projectAssemblyDirty_ = false; } } void NETProjectSystem::HandleProjectLoaded(StringHash eventType, VariantMap& eventData) { using namespace ProjectLoaded; String projectPath = eventData[P_PROJECTPATH].GetString(); if (GetExtension(projectPath) == ".atomic") projectPath = GetParentPath(projectPath); solutionPath_ = AddTrailingSlash(projectPath) + "AtomicNET/Solution/AtomicProject.sln"; projectAssemblyPath_ = AddTrailingSlash(projectPath) + "Resource/AtomicProject.dll"; FileSystem* fileSystem = GetSubsystem(); // if the solution or project assemblies don't exist mark as dirty if (!fileSystem->FileExists(solutionPath_)) solutionDirty_ = true; if (!fileSystem->FileExists(projectAssemblyPath_)) projectAssemblyDirty_ = true; } void NETProjectSystem::HandleProjectUnloaded(StringHash eventType, VariantMap& eventData) { Clear(); } void NETProjectSystem::HandleFileChanged(StringHash eventType, VariantMap& eventData) { } void NETProjectSystem::HandleResourceAdded(StringHash eventType, VariantMap& eventData) { } void NETProjectSystem::HandleResourceRemoved(StringHash eventType, VariantMap& eventData) { } void NETProjectSystem::HandleAssetRenamed(StringHash eventType, VariantMap& eventData) { } void NETProjectSystem::HandleAssetMoved(StringHash eventType, VariantMap& eventData) { } void NETProjectSystem::Initialize() { Clear(); SubscribeToEvent(E_UPDATE, HANDLER(NETProjectSystem, HandleUpdate)); SubscribeToEvent(E_PROJECTLOADED, HANDLER(NETProjectSystem, HandleProjectLoaded)); SubscribeToEvent(E_PROJECTUNLOADED, HANDLER(NETProjectSystem, HandleProjectUnloaded)); SubscribeToEvent(E_FILECHANGED, HANDLER(NETProjectSystem, HandleFileChanged)); SubscribeToEvent(E_RESOURCEADDED, HANDLER(NETProjectSystem, HandleResourceAdded)); SubscribeToEvent(E_RESOURCEREMOVED, HANDLER(NETProjectSystem, HandleResourceRemoved)); SubscribeToEvent(E_ASSETRENAMED, HANDLER(NETProjectSystem, HandleAssetRenamed)); SubscribeToEvent(E_ASSETMOVED, HANDLER(NETProjectSystem, HandleAssetMoved)); #ifdef ATOMIC_PLATFORM_WINDOWS FileSystem* fileSystem = GetSubsystem(); // Query for Visual Studio 2015 path String visualStudioPath_ = Poco::Environment::get("VS140COMNTOOLS").c_str(); if (visualStudioPath_.Length()) { visualStudioPath_.Replace("Tools\\", "IDE\\devenv.exe"); if (!fileSystem->FileExists(visualStudioPath_)) visualStudioPath_.Clear(); } } #endif }