metaforce/Editor/ViewManager.hpp

226 lines
8.2 KiB
C++
Raw Normal View History

2016-01-05 09:53:16 +00:00
#ifndef URDE_VIEW_MANAGER_HPP
#define URDE_VIEW_MANAGER_HPP
2016-03-08 07:10:52 +00:00
#include "hecl/CVarManager.hpp"
2016-03-24 00:05:56 +00:00
#include "boo/audiodev/IAudioVoiceEngine.hpp"
2016-09-14 05:54:09 +00:00
#include "amuse/BooBackend.hpp"
2015-12-13 21:01:32 +00:00
#include "ProjectManager.hpp"
#include "Space.hpp"
2016-09-10 04:50:00 +00:00
#include "Runtime/CGameHintInfo.hpp"
2016-02-16 05:50:41 +00:00
#include "Runtime/Particle/CElementGen.hpp"
#include "Runtime/Graphics/CLineRenderer.hpp"
2016-03-07 03:12:32 +00:00
#include "Runtime/Graphics/CMoviePlayer.hpp"
2016-03-31 06:18:56 +00:00
#include "Runtime/Graphics/CModel.hpp"
2016-04-03 05:25:34 +00:00
#include "Runtime/Particle/CGenDescription.hpp"
2016-04-15 03:02:21 +00:00
#include "Runtime/Character/CAssetFactory.hpp"
2016-08-20 04:22:13 +00:00
#include "Runtime/Graphics/Shaders/CColoredQuadFilter.hpp"
#include "Runtime/Graphics/Shaders/CXRayBlurFilter.hpp"
2016-08-20 18:18:44 +00:00
#include "Runtime/Graphics/Shaders/CCameraBlurFilter.hpp"
2016-12-14 01:10:17 +00:00
#include "Runtime/Audio/CStaticAudioPlayer.hpp"
2016-02-16 05:50:41 +00:00
2016-03-05 00:03:41 +00:00
namespace urde
{
2015-12-13 02:27:34 +00:00
class SplashScreen;
2016-03-04 23:04:53 +00:00
class ViewManager : public specter::IViewManager
{
2016-01-04 05:31:02 +00:00
friend class ProjectManager;
2016-01-11 02:17:08 +00:00
friend class Space;
friend class RootSpace;
2016-02-01 01:13:45 +00:00
friend class SplitSpace;
2016-01-04 05:31:02 +00:00
2017-07-17 03:04:14 +00:00
std::shared_ptr<boo::IWindow> m_mainWindow;
2016-03-04 23:04:53 +00:00
hecl::Runtime::FileStoreManager& m_fileStoreManager;
hecl::CVarManager& m_cvarManager;
2015-12-13 21:01:32 +00:00
ProjectManager m_projManager;
2016-03-04 23:04:53 +00:00
specter::FontCache m_fontCache;
specter::DefaultThemeData m_themeData;
specter::ViewResources m_viewResources;
2016-01-18 23:33:23 +00:00
boo::GraphicsDataToken m_iconsToken;
2016-07-16 19:21:12 +00:00
boo::GraphicsDataToken m_badgeToken;
2016-03-04 23:04:53 +00:00
specter::Translator m_translator;
2016-04-15 20:42:40 +00:00
boo::IGraphicsDataFactory* m_mainBooFactory = nullptr;
boo::IGraphicsCommandQueue* m_mainCommandQueue = nullptr;
boo::ITextureR* m_renderTex = nullptr;
const boo::SystemChar* m_mainPlatformName;
2016-01-04 05:31:02 +00:00
2016-03-04 23:04:53 +00:00
std::unique_ptr<specter::RootView> m_rootView;
2015-12-13 02:27:34 +00:00
std::unique_ptr<SplashScreen> m_splash;
std::unique_ptr<RootSpace> m_rootSpace;
2016-03-04 23:04:53 +00:00
specter::View* m_rootSpaceView = nullptr;
2015-12-09 01:04:50 +00:00
2017-01-22 21:26:58 +00:00
class TestGameView : public specter::View
2016-02-16 05:50:41 +00:00
{
ViewManager& m_vm;
2016-07-29 17:38:44 +00:00
CSpaceWarpFilter m_spaceWarpFilter;
2017-06-01 05:34:24 +00:00
CWideScreenFilter m_widescreen = { EFilterType::Blend };
2016-08-20 04:22:13 +00:00
CXRayBlurFilter m_xrayBlur;
2016-08-20 18:18:44 +00:00
CCameraBlurFilter m_camBlur;
CRandom16 m_random;
2016-04-02 03:56:19 +00:00
float m_theta = 0.f;
2016-09-12 04:53:28 +00:00
unsigned m_frame = 0;
2016-02-16 05:50:41 +00:00
public:
2017-01-22 21:26:58 +00:00
TestGameView(ViewManager& vm, specter::ViewResources& res, specter::View& parent,
2016-08-20 04:22:13 +00:00
TLockedToken<CTexture>& xrayPalette)
: View(res, parent), m_vm(vm), m_xrayBlur(xrayPalette), m_random(20) {}
void resized(const boo::SWindowRect& root, const boo::SWindowRect& sub);
void draw(boo::IGraphicsCommandQueue* gfxQ);
2017-01-22 21:26:58 +00:00
void mouseDown(const boo::SWindowCoord& coord, boo::EMouseButton button, boo::EModifierKey mkey)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->mouseDown(coord, button, mkey);
}
void mouseUp(const boo::SWindowCoord& coord, boo::EMouseButton button, boo::EModifierKey mkey)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->mouseUp(coord, button, mkey);
}
void mouseMove(const boo::SWindowCoord& coord)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->mouseMove(coord);
}
void scroll(const boo::SWindowCoord& coord, const boo::SScrollDelta& sd)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->scroll(coord, sd);
}
void charKeyDown(unsigned long cc, boo::EModifierKey mkey, bool repeat)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->charKeyDown(cc, mkey, repeat);
}
void charKeyUp(unsigned long cc, boo::EModifierKey mkey)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->charKeyUp(cc, mkey);
}
void specialKeyDown(boo::ESpecialKey skey, boo::EModifierKey mkey, bool repeat)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->specialKeyDown(skey, mkey, repeat);
}
void specialKeyUp(boo::ESpecialKey skey, boo::EModifierKey mkey)
{
if (MP1::CMain* m = m_vm.m_projManager.gameMain())
if (MP1::CGameArchitectureSupport* as = m->GetArchSupport())
as->specialKeyUp(skey, mkey);
}
2016-02-16 05:50:41 +00:00
};
2017-01-22 21:26:58 +00:00
std::unique_ptr<TestGameView> m_testGameView;
2016-08-20 04:22:13 +00:00
urde::TLockedToken<CModel> m_modelTest;
urde::TLockedToken<CGenDescription> m_partGenDesc;
2016-09-10 04:50:00 +00:00
TLockedToken<CGameHintInfo> m_hints;
2016-03-08 22:51:13 +00:00
std::unique_ptr<CElementGen> m_partGen;
std::unique_ptr<CLineRenderer> m_lineRenderer;
std::unique_ptr<CMoviePlayer> m_moviePlayer;
std::unique_ptr<u8[]> m_rsfBuf;
2016-03-24 00:05:56 +00:00
std::unique_ptr<boo::IAudioVoiceEngine> m_voiceEngine;
2016-03-08 07:10:52 +00:00
std::unique_ptr<boo::IAudioVoice> m_videoVoice;
2016-09-14 05:54:09 +00:00
std::experimental::optional<amuse::BooBackendVoiceAllocator> m_amuseAllocWrapper;
2016-03-08 07:10:52 +00:00
struct AudioVoiceCallback : boo::IAudioVoiceCallback
{
ViewManager& m_vm;
2016-07-05 01:08:27 +00:00
void preSupplyAudio(boo::IAudioVoice&, double) {}
2016-03-24 00:05:56 +00:00
size_t supplyAudio(boo::IAudioVoice& voice, size_t frames, int16_t* data)
2016-03-08 07:10:52 +00:00
{
if (m_vm.m_moviePlayer)
2016-03-24 00:05:56 +00:00
m_vm.m_moviePlayer->MixAudio(data, nullptr, frames);
CMoviePlayer::MixStaticAudio(data, data, frames);
return frames;
2016-03-08 07:10:52 +00:00
}
AudioVoiceCallback(ViewManager& vm) : m_vm(vm) {}
} m_voiceCallback;
2016-02-16 05:50:41 +00:00
2016-12-14 01:10:17 +00:00
std::experimental::optional<CStaticAudioPlayer> m_newAudioPlayer;
2016-03-04 23:04:53 +00:00
hecl::SystemString m_recentProjectsPath;
std::vector<hecl::SystemString> m_recentProjects;
hecl::SystemString m_recentFilesPath;
std::vector<hecl::SystemString> m_recentFiles;
2016-01-02 02:27:46 +00:00
2015-12-09 01:04:50 +00:00
bool m_updatePf = false;
float m_reqPf;
2016-03-04 23:04:53 +00:00
specter::View* BuildSpaceViews();
specter::RootView* SetupRootView();
2016-01-05 00:01:02 +00:00
SplashScreen* SetupSplashView();
2016-03-04 23:04:53 +00:00
void RootSpaceViewBuilt(specter::View* view);
2016-03-07 03:12:32 +00:00
void ProjectChanged(hecl::Database::Project& proj);
2015-12-13 02:27:34 +00:00
void SetupEditorView();
2016-01-05 00:01:02 +00:00
void SetupEditorView(ConfigReader& r);
void SaveEditorView(ConfigWriter& w);
2015-12-13 02:27:34 +00:00
bool m_showSplash = false;
2016-01-05 00:01:02 +00:00
void DismissSplash();
unsigned m_editorFrames = 120;
void FadeInEditors() {m_editorFrames = 0;}
2016-03-04 23:04:53 +00:00
void BuildTestPART(urde::IObjectStore& objStore);
2016-04-15 20:42:40 +00:00
void InitMP1(MP1::CMain& main);
2016-02-16 05:50:41 +00:00
2016-01-11 02:17:08 +00:00
Space* m_deferSplit = nullptr;
2016-03-04 23:04:53 +00:00
specter::SplitView::Axis m_deferSplitAxis;
2016-01-11 02:17:08 +00:00
int m_deferSplitThisSlot;
2016-01-12 00:46:27 +00:00
boo::SWindowCoord m_deferSplitCoord;
hecl::SystemString m_deferedProject;
2016-01-11 02:17:08 +00:00
2016-01-04 05:31:02 +00:00
public:
2016-03-04 23:04:53 +00:00
ViewManager(hecl::Runtime::FileStoreManager& fileMgr, hecl::CVarManager& cvarMgr);
2015-12-13 02:27:34 +00:00
~ViewManager();
2016-03-04 23:04:53 +00:00
specter::RootView& rootView() const {return *m_rootView;}
2016-01-03 04:06:18 +00:00
void requestPixelFactor(float pf)
{
m_reqPf = pf;
m_updatePf = true;
}
2015-12-13 21:01:32 +00:00
ProjectManager& projectManager() {return m_projManager;}
2016-03-04 23:04:53 +00:00
hecl::Database::Project* project() {return m_projManager.project();}
const specter::Translator* getTranslator() const {return &m_translator;}
2015-12-13 21:01:32 +00:00
2016-03-04 23:04:53 +00:00
void deferSpaceSplit(specter::ISpaceController* split, specter::SplitView::Axis axis, int thisSlot,
2016-01-12 00:46:27 +00:00
const boo::SWindowCoord& coord)
2016-01-11 02:17:08 +00:00
{
m_deferSplit = static_cast<Space*>(split);
m_deferSplitAxis = axis;
m_deferSplitThisSlot = thisSlot;
2016-01-12 00:46:27 +00:00
m_deferSplitCoord = coord;
2016-01-11 02:17:08 +00:00
}
2016-03-04 23:04:53 +00:00
const std::vector<hecl::SystemString>* recentProjects() const {return &m_recentProjects;}
void pushRecentProject(const hecl::SystemString& path);
2016-01-02 02:27:46 +00:00
2016-03-04 23:04:53 +00:00
const std::vector<hecl::SystemString>* recentFiles() const {return &m_recentFiles;}
void pushRecentFile(const hecl::SystemString& path);
2016-01-02 02:27:46 +00:00
void init(boo::IApplication* app);
const boo::SystemChar* platformName() { return m_mainPlatformName; }
bool proc();
void stop();
void deferOpenProject(const hecl::SystemString& path) { m_deferedProject = path; }
};
}
2016-01-05 09:53:16 +00:00
#endif // URDE_VIEW_MANAGER_HPP