aboutsummaryrefslogtreecommitdiff
path: root/source/EditorCore.hpp
blob: 785fc6bfc89dacb6be4f9411b4e2c891d952f783 (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
#pragma once

#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
struct EditorInspector {
	enum TargetType {
		ITT_GameObject,
		ITT_Ires,
		ITT_None,
	};

	std::string renamingScratchBuffer;
	void* selectedItPtr = nullptr;
	TargetType selectedItt = ITT_None;
	bool renaming = false;

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

class EditorContentBrowser {
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();

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

class EditorTransformEdit {
private:
	ImGuizmo::OPERATION mCurrentGizmoOperation = ImGuizmo::TRANSLATE;
	ImGuizmo::MODE mCurrentGizmoMode = ImGuizmo::LOCAL;
	glm::mat4 cubeMatrix;
	float snap[3] = { 1.f, 1.f, 1.f };
	float bounds[6] = { -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f };
	float boundsSnap[3] = { 0.1f, 0.1f, 0.1f };
	float camDistance = 8.f;
	bool useSnap = false;
	bool boundSizing = false;
	bool boundSizingSnap = false;
	bool showGrid = false;

public:
	void ShowWorld(float* cameraView, float* cameraProjection);
	bool ShowObjectInspector(float* cameraView, float* cameraProjection, glm::vec3* pos, glm::quat* rotation, glm::vec3* scale);
	bool ShowObject(float* cameraView, float* cameraProjection, glm::vec3* pos, glm::quat* rotation, glm::vec3* scale);
};

class App;
class EditorInstance {
private:
	App* mApp;
	RendererFrameInfo mFallbackFrameInfo;
	const RendererFrameInfo* mCurrentFrameInfo;
	GameObject* mPopupCurrent_GameObject = nullptr;
	RcPtr<SpriteDefinition> mSpriteView_Instance;
	EditorCommandPalette mEdCommandPalette;
	EditorInspector mEdInspector;
	EditorContentBrowser mEdContentBrowser;
	EditorTransformEdit mEdTransformEdit;
	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;

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

	void OnUpdate();
	void OnDraw(const RendererFrameInfo& frameInfo);
	void Show();

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

	void OpenSpriteViewer(SpriteDefinition* sprite);

private:
	void ShowWorldProperties();

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

	void ShowSpriteViewer();
};