aboutsummaryrefslogtreecommitdiff
path: root/source/EditorCorePrivate.hpp
blob: 566131b00b9706659d3de82e886140339720f414 (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
#pragma once

#include "EditorCore.hpp"

#include "App.hpp"
#include "EditorAttachment.hpp"
#include "EditorCommandPalette.hpp"
#include "EditorUtils.hpp"
#include "GameObject.hpp"
#include "Ires.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,
	};

	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 {
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;
	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;

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:
	void ShowWorldProperties();

	void ShowInspector(IresObject* ires);
	void ShowInspector(GameObject* object);

	void ShowSpriteViewer();
};