aboutsummaryrefslogtreecommitdiff
path: root/source/30-game/EditorCorePrivate.hpp
blob: 4fbfb72f0e6344756bd32d69c5cfcbfaa455a8dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma once

#include "EditorCore.hpp"

#include "App.hpp"
#include "EditorAttachment.hpp"
#include "EditorCommandPalette.hpp"
#include "EditorUtils.hpp"
#include "GameObject.hpp"
#include "Ires.hpp"
#include "Level.hpp"
#include "RcPtr.hpp"
#include "Sprite.hpp"
#include "World.hpp"

#include <memory>
#include <string>

// TODO move inspector drawing to this class
class EditorInspector final : public IEditorInspector {
public:
	std::string renamingScratchBuffer;
	void* selectedItPtr = nullptr;
	TargetType selectedItt = ITT_None;
	bool renaming = false;

	void SelectTarget(TargetType type, void* object) override;
};

class EditorContentBrowser final : public IEditorContentBrowser {
private:
	enum Pane {
		P_Settings,
		P_Ires,
		P_Level,
	};

	static constexpr float kSplitterThickness = 3.0f;
	static constexpr float kPadding = 4.0f;

	// <root>
	static constexpr float kLeftPaneMinWidth = 200.0f;
	static constexpr float kRightPaneMinWidth = 200.0f;

	EditorInspector* mInspector;
	Pane mPane = P_Settings;
	float mBrowserHeight = 0.5f;
	float mSplitterLeft = kLeftPaneMinWidth;
	float mSplitterRight = 0.0f;
	bool mDocked = true;

public:
	EditorContentBrowser(EditorInspector* inspector);
	~EditorContentBrowser() override;

	void Show(bool* open = nullptr);
};

struct GuizmoState {
	ImGuizmo::OPERATION currOperation = ImGuizmo::TRANSLATE;
	ImGuizmo::MODE currMode = ImGuizmo::LOCAL;
	glm::mat4 cubeMatrix;
	float snap[3] = { 1.f, 1.f, 1.f };
	float boundsSnap[3] = { 0.1f, 0.1f, 0.1f };
	bool useSnap = false;
	bool boundSizing = false;
	bool boundSizingSnap = false;
};

// TODO editor undo stack
class EditorInstance : public IEditor {
public:
	enum EditorCameraMode {
		// "Game mode": the camera views from the side, where the forward vector is perpendicular to the world plane
		ECM_2D,
		// "Editor mode": equivalent to Unity's 3D mode, the camera is completely free and controlled as a 3d camera
		ECM_Side3D,
	};

private:
	App* mApp;
	GameObject* mPopupCurrent_GameObject = nullptr;
	Camera mEditorCamera;
	RcPtr<SpriteDefinition> mSpriteView_Instance;
	EditorCommandPalette mEdCommandPalette;
	EditorInspector mEdInspector;
	EditorContentBrowser mEdContentBrowser;
	GuizmoState mGuizmo;
	glm::vec3 mDragCam_CamInitial;
	ImVec2 mDragCam_CursorInitial;
	int mSpriteView_Frame;
	float mMoveCamScrollSpeed = 1.0f;
	float mMoveCamSlideSpeed = 0.1f;
	EditorCameraMode mEcm = ECM_2D;
	bool mSpriteView_OpenNextFrame = false;
	bool mWindowVisible_ImGuiDemo = false;
	bool mWindowVisible_CommandPalette = false;
	bool mWindowVisible_Inspector = true;
	bool mWindowVisible_ContentBrowser = true;
	bool mWindowVisible_WorldStructure = true;
	bool mWindowVisible_WorldProperties = true;
	bool mDragCam_Happening = false;
	bool mMoveCamKeyboard = false;
	bool mMoveCamScrollWheel = false;

public:
	EditorInstance(App* app);
	~EditorInstance() override;

	void OnGameStateChanged(bool running) override;
	void Show() override;

	EditorInspector& GetInspector() override { return mEdInspector; }
	EditorContentBrowser& GetContentBrowser() override { return mEdContentBrowser; }

	void OpenSpriteViewer(SpriteDefinition* sprite) override;

private:
	bool IsCurrentCameraEditor() const {
		return !mApp->IsGameRunning();
	}

	void ShowWorldProperties();

	void ShowInspector(IresObject* ires);
	void ShowInspector(LevelManager::LoadableObject* ldObj);
	void ShowInspector(GameObject* object);

	void ShowSpriteViewer();
};