[nostalgia/scene] ACTUALLY add Scene Studio module
This commit is contained in:
		
							
								
								
									
										25
									
								
								src/nostalgia/scene/studio/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/nostalgia/scene/studio/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
add_library(
 | 
			
		||||
	NostalgiaScene-Studio OBJECT
 | 
			
		||||
		module.cpp
 | 
			
		||||
		sceneeditor-imgui.cpp
 | 
			
		||||
		sceneeditor.cpp
 | 
			
		||||
		sceneeditorview.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if(NOT MSVC)
 | 
			
		||||
	target_compile_options(NostalgiaScene-Studio PRIVATE -Wsign-conversion)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
target_link_libraries(
 | 
			
		||||
	NostalgiaScene-Studio PUBLIC
 | 
			
		||||
		NostalgiaGlUtils
 | 
			
		||||
		NostalgiaStudio
 | 
			
		||||
		NostalgiaScene
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
install(
 | 
			
		||||
	TARGETS
 | 
			
		||||
		NostalgiaScene-Studio
 | 
			
		||||
	LIBRARY DESTINATION
 | 
			
		||||
		${NOSTALGIA_DIST_MODULE}
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										32
									
								
								src/nostalgia/scene/studio/module.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/nostalgia/scene/studio/module.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ox/std/memory.hpp>
 | 
			
		||||
 | 
			
		||||
#include "sceneeditor-imgui.hpp"
 | 
			
		||||
#include "module.hpp"
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
ox::Vector<studio::EditorMaker> StudioModule::editors(core::Context *ctx) noexcept {
 | 
			
		||||
	return {
 | 
			
		||||
		{
 | 
			
		||||
			{"nscn"},
 | 
			
		||||
			[ctx](ox::CRStringView path) -> ox::Result<studio::BaseEditor*> {
 | 
			
		||||
				try {
 | 
			
		||||
					return ox::make<SceneEditorImGui>(ctx, path);
 | 
			
		||||
				} catch (const ox::Exception &ex) {
 | 
			
		||||
					return ex.toError();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ox::Vector<ox::UPtr<studio::ItemMaker>> StudioModule::itemMakers(core::Context*) noexcept {
 | 
			
		||||
	ox::Vector<ox::UPtr<studio::ItemMaker>> out;
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								src/nostalgia/scene/studio/module.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/nostalgia/scene/studio/module.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nostalgia/studio/studio.hpp>
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
class StudioModule: public studio::Module {
 | 
			
		||||
	public:
 | 
			
		||||
		ox::Vector<studio::EditorMaker> editors(core::Context *ctx) noexcept override;
 | 
			
		||||
		ox::Vector<ox::UPtr<studio::ItemMaker>> itemMakers(core::Context*) noexcept override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								src/nostalgia/scene/studio/sceneeditor-imgui.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/nostalgia/scene/studio/sceneeditor-imgui.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <imgui.h>
 | 
			
		||||
 | 
			
		||||
#include <nostalgia/core/gfx.hpp>
 | 
			
		||||
#include <nostalgia/foundation/media.hpp>
 | 
			
		||||
#include <ox/std/memory.hpp>
 | 
			
		||||
 | 
			
		||||
#include "sceneeditor-imgui.hpp"
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
SceneEditorImGui::SceneEditorImGui(core::Context *ctx, ox::CRStringView path):
 | 
			
		||||
	m_editor(ctx, path),
 | 
			
		||||
	m_view(ctx, m_editor.scene()) {
 | 
			
		||||
	m_ctx = ctx;
 | 
			
		||||
	m_itemPath = path;
 | 
			
		||||
	const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
 | 
			
		||||
	m_itemName = m_itemPath.substr(lastSlash + 1);
 | 
			
		||||
	setRequiresConstantRefresh(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ox::CRString SceneEditorImGui::itemName() const noexcept {
 | 
			
		||||
	return m_itemPath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ox::CRString SceneEditorImGui::itemDisplayName() const noexcept {
 | 
			
		||||
	return m_itemName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SceneEditorImGui::draw(core::Context*) noexcept {
 | 
			
		||||
	const auto paneSize = ImGui::GetContentRegionAvail();
 | 
			
		||||
	const geo::Size fbSize{
 | 
			
		||||
		static_cast<int>(paneSize.x),
 | 
			
		||||
		static_cast<int>(paneSize.y)};
 | 
			
		||||
	m_view.draw(fbSize.width, fbSize.height);
 | 
			
		||||
	auto &fb = m_view.framebuffer();
 | 
			
		||||
	const uintptr_t buffId = fb.color.id;
 | 
			
		||||
	ImGui::Image(
 | 
			
		||||
		reinterpret_cast<void*>(buffId),
 | 
			
		||||
		paneSize,
 | 
			
		||||
		ImVec2(0, 1),
 | 
			
		||||
		ImVec2(1, 0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SceneEditorImGui::onActivated() noexcept {
 | 
			
		||||
	m_view.setupScene();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ox::Error SceneEditorImGui::saveItem() noexcept {
 | 
			
		||||
	const auto sctx = applicationData<studio::StudioContext>(m_ctx);
 | 
			
		||||
	oxReturnError(sctx->project->writeObj(m_itemPath, &m_editor.scene()));
 | 
			
		||||
	oxReturnError(m_ctx->assetManager.setAsset(m_itemPath, m_editor.scene()));
 | 
			
		||||
	return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								src/nostalgia/scene/studio/sceneeditor-imgui.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/nostalgia/scene/studio/sceneeditor-imgui.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nostalgia/core/gfx.hpp>
 | 
			
		||||
#include <nostalgia/studio/studio.hpp>
 | 
			
		||||
 | 
			
		||||
#include "sceneeditor.hpp"
 | 
			
		||||
#include "sceneeditorview.hpp"
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
class SceneEditorImGui: public studio::Editor {
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		core::Context *m_ctx = nullptr;
 | 
			
		||||
		ox::String m_itemName;
 | 
			
		||||
		ox::String m_itemPath;
 | 
			
		||||
		SceneEditor m_editor;
 | 
			
		||||
		SceneEditorView m_view;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		SceneEditorImGui(core::Context *ctx, ox::CRStringView path);
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Returns the name of item being edited.
 | 
			
		||||
		 */
 | 
			
		||||
		ox::CRString itemName() const noexcept final;
 | 
			
		||||
 | 
			
		||||
		ox::CRString itemDisplayName() const noexcept final;
 | 
			
		||||
 | 
			
		||||
		void draw(core::Context*) noexcept final;
 | 
			
		||||
 | 
			
		||||
		void onActivated() noexcept override;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		ox::Error saveItem() noexcept final;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								src/nostalgia/scene/studio/sceneeditor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/nostalgia/scene/studio/sceneeditor.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "sceneeditor.hpp"
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
SceneEditor::SceneEditor(core::Context *ctx, ox::CRStringView path) {
 | 
			
		||||
	m_ctx = ctx;
 | 
			
		||||
	oxRequireT(scn, foundation::readObj<SceneStatic>(m_ctx, path));
 | 
			
		||||
	m_scene = *scn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								src/nostalgia/scene/studio/sceneeditor.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/nostalgia/scene/studio/sceneeditor.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nostalgia/core/gfx.hpp>
 | 
			
		||||
#include <nostalgia/studio/studio.hpp>
 | 
			
		||||
#include <nostalgia/scene/scene.hpp>
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
class SceneEditor {
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		core::Context *m_ctx = nullptr;
 | 
			
		||||
		ox::String m_itemName;
 | 
			
		||||
		ox::String m_itemPath;
 | 
			
		||||
		SceneStatic m_scene;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		SceneEditor(core::Context *ctx, ox::CRStringView path);
 | 
			
		||||
 | 
			
		||||
		const SceneStatic &scene() noexcept {
 | 
			
		||||
			return m_scene;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		ox::Error saveItem() noexcept;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								src/nostalgia/scene/studio/sceneeditorview.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/nostalgia/scene/studio/sceneeditorview.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "sceneeditorview.hpp"
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
SceneEditorView::SceneEditorView(core::Context *ctx, const SceneStatic &sceneStatic) noexcept:
 | 
			
		||||
	m_ctx(*ctx),
 | 
			
		||||
	m_sceneStatic(sceneStatic),
 | 
			
		||||
	m_scene(m_sceneStatic) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SceneEditorView::setupScene() noexcept {
 | 
			
		||||
	oxIgnoreError(m_scene.setupDisplay(&m_ctx));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SceneEditorView::draw(int width, int height) noexcept {
 | 
			
		||||
	if (width != m_frameBuffer.width || height != m_frameBuffer.height) {
 | 
			
		||||
		glutils::resizeInitFrameBuffer(&m_frameBuffer, width, height);
 | 
			
		||||
		core::gl::setRenderSize(&m_ctx, width, height);
 | 
			
		||||
		oxIgnoreError(m_scene.setupDisplay(&m_ctx));
 | 
			
		||||
	}
 | 
			
		||||
	glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer);
 | 
			
		||||
	glViewport(0, 0, m_frameBuffer.width, m_frameBuffer.height);
 | 
			
		||||
	// draw begin
 | 
			
		||||
	core::gl::drawMainView(&m_ctx);
 | 
			
		||||
	// draw end
 | 
			
		||||
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const glutils::FrameBuffer &SceneEditorView::framebuffer() const noexcept {
 | 
			
		||||
	return m_frameBuffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								src/nostalgia/scene/studio/sceneeditorview.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/nostalgia/scene/studio/sceneeditorview.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nostalgia/core/gfx.hpp>
 | 
			
		||||
#include <nostalgia/glutils/glutils.hpp>
 | 
			
		||||
#include <nostalgia/scene/scene.hpp>
 | 
			
		||||
 | 
			
		||||
namespace nostalgia::scene {
 | 
			
		||||
 | 
			
		||||
class SceneEditorView {
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		core::Context &m_ctx;
 | 
			
		||||
		const SceneStatic &m_sceneStatic;
 | 
			
		||||
		Scene m_scene;
 | 
			
		||||
		glutils::FrameBuffer m_frameBuffer;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		SceneEditorView(core::Context *ctx, const SceneStatic &sceneStatic) noexcept;
 | 
			
		||||
 | 
			
		||||
		void setupScene() noexcept;
 | 
			
		||||
 | 
			
		||||
		void draw(int width, int height) noexcept;
 | 
			
		||||
 | 
			
		||||
		[[nodiscard]]
 | 
			
		||||
		const glutils::FrameBuffer &framebuffer() const noexcept;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user