Skip to content

Commit 4e43ccf

Browse files
committed
add camera anim previewing
1 parent bd881f4 commit 4e43ccf

File tree

5 files changed

+111
-13
lines changed

5 files changed

+111
-13
lines changed

include/DOM/CameraAnimationDOMNode.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
#include "io/KeyframeIO.hpp"
44
#include "BGRenderDOMNode.hpp"
55
#include "scene/Camera.hpp"
6+
#include "scene/EditorScene.hpp"
7+
8+
namespace CameraAnimation {
9+
void CleanupPreview();
10+
void RenderPreview();
11+
void InitPreview();
12+
}
613

714
class LCameraAnimationDOMNode : public LBGRenderDOMNode
815
{

src/DOM/CameraAnimationDOMNode.cpp

Lines changed: 85 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,103 @@
11

22
#include "DOM/CameraAnimationDOMNode.hpp"
33
#include "imgui.h"
4+
#include <glad/glad.h>
45
#include "misc/cpp/imgui_stdlib.h"
56
#include "imgui_neo_internal.h"
67
#include "imgui_neo_sequencer.h"
78

9+
static bool mAnimPlayerReady { false };
10+
static uint32_t mPreviewFbo { 0 }, mPreviewRbo { 0 }, mPreviewTex { 0 };
11+
12+
static glm::vec3 mEye, mCenter;
13+
static float mFovY { 90.0f };
14+
15+
namespace CameraAnimation {
16+
void InitPreview(){
17+
glGenFramebuffers(1, &mPreviewFbo);
18+
glBindFramebuffer(GL_FRAMEBUFFER, mPreviewFbo);
19+
20+
glGenRenderbuffers(1, &mPreviewRbo);
21+
glBindRenderbuffer(GL_RENDERBUFFER, mPreviewRbo);
22+
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 640, 480);
23+
24+
glGenTextures(1, &mPreviewTex);
25+
26+
glBindTexture(GL_TEXTURE_2D, mPreviewTex);
27+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
28+
29+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
30+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
31+
32+
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mPreviewTex, 0);
33+
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mPreviewRbo);
34+
35+
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
36+
37+
38+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
39+
glBindTexture(GL_TEXTURE_2D, 0);
40+
glBindRenderbuffer(GL_RENDERBUFFER, 0);
41+
42+
std::cout << mPreviewTex << std::endl;
43+
44+
}
45+
46+
void CleanupPreview(){
47+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
48+
glBindRenderbuffer(GL_RENDERBUFFER, 0);
49+
50+
glDeleteFramebuffers(1, &mPreviewFbo);
51+
glDeleteRenderbuffers(1, &mPreviewRbo);
52+
glDeleteTextures(1, &mPreviewTex);
53+
}
54+
55+
void RenderPreview(){
56+
glBindFramebuffer(GL_FRAMEBUFFER, mPreviewFbo);
57+
glBindRenderbuffer(GL_RENDERBUFFER, mPreviewRbo);
58+
59+
glViewport(0, 0, 640, 480);
60+
glClearColor(0.100f, 0.261f, 0.402f, 1.0f);
61+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62+
63+
auto scene = LEditorScene::GetEditorScene();
64+
auto eye = scene->Camera.GetEye();
65+
auto center = scene->Camera.GetCenter();
66+
auto fov = scene->Camera.Fovy;
67+
auto mode = scene->Camera.mCamMode;
68+
scene->Camera.mCamMode = ECamMode::ANIMATION;
69+
70+
scene->Camera.SetEye(mEye);
71+
scene->Camera.SetCenter(mCenter);
72+
scene->Camera.Fovy = mFovY;
73+
74+
scene->RenderSubmit(640, 480);
75+
76+
scene->Camera.mCamMode = mode;
77+
scene->Camera.SetEye(eye);
78+
scene->Camera.SetCenter(center);
79+
scene->Camera.Fovy = fov;
80+
81+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
82+
glBindRenderbuffer(GL_RENDERBUFFER, 0);
83+
}
84+
85+
}
86+
887
LCameraAnimationDOMNode::LCameraAnimationDOMNode(std::string name) : Super(name)
988
{
1089
mType = EDOMNodeType::CameraAnim;
1190
}
1291

1392
void LCameraAnimationDOMNode::RenderDetailsUI(float dt, LSceneCamera* camera)
1493
{
94+
95+
ImGui::Image(static_cast<uintptr_t>(mPreviewTex), ImVec2(640, 480), {0.0f, 1.0f}, {1.0f, 0.0f});
96+
1597
if(ImGui::Button(">"))
1698
{
1799
mPlaying = true;
18-
camera->mCamMode = ECamMode::ANIMATION;
19100

20-
camera->SetEye(glm::vec3(mPosFramesX.mFrames[mPosFramesX.mKeys[0]].value, mPosFramesY.mFrames[mPosFramesY.mKeys[0]].value, mPosFramesZ.mFrames[mPosFramesZ.mKeys[0]].value));
21-
camera->SetCenter(glm::vec3(mTargetFramesX.mFrames[mTargetFramesX.mKeys[0]].value, mTargetFramesY.mFrames[mTargetFramesY.mKeys[0]].value, mTargetFramesZ.mFrames[mTargetFramesZ.mKeys[0]].value));
22101
mCurrentFrame = 0;
23102

24103
//camera->Fovy = glm::radians(mFovFrames.mFrames[mFovFrames.mKeys[0]].value);
@@ -38,16 +117,10 @@ void LCameraAnimationDOMNode::RenderDetailsUI(float dt, LSceneCamera* camera)
38117

39118
if(ImGui::Button("||")){
40119
mPlaying = false;
41-
camera->mCamMode = ECamMode::FLY;
42120
}
43121

44122
if(mPlaying)
45123
{
46-
if(camera->mCamMode != ECamMode::ANIMATION)
47-
{
48-
camera->mCamMode = ECamMode::ANIMATION;
49-
}
50-
51124

52125
if(mCurrentFrame++ > mFrameCount)
53126
{
@@ -119,13 +192,13 @@ void LCameraAnimationDOMNode::RenderDetailsUI(float dt, LSceneCamera* camera)
119192
}
120193

121194
if(mNextFovKey < mFovFrames.mKeys.size()){
122-
camera->Fovy = glm::radians(glm::mix(mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey - 1]].value, mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey]].value, (mCurrentFrame - mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey - 1]].frame) / (mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey]].frame - mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey - 1]].frame)));
195+
mFovY = glm::radians(glm::mix(mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey - 1]].value, mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey]].value, (mCurrentFrame - mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey - 1]].frame) / (mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey]].frame - mFovFrames.mFrames[mFovFrames.mKeys[mNextFovKey - 1]].frame)));
123196
}
124197

125198
//std::cout << eyePos.x << "," << eyePos.y << "," << eyePos.z << " | " << targetPos.x << "," << targetPos.y << "," << targetPos.z << std::endl;
126199

127-
camera->SetCenter(targetPos);
128-
camera->SetEye(eyePos);
200+
mEye = eyePos;
201+
mCenter = targetPos;
129202
}
130203

131204
}

src/DOM/EventDataDOMNode.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ void LEventDataDOMNode::LoadEventArchive(std::shared_ptr<Archive::Rarc> arc, std
9999
mEventScript = LGenUtility::SjisToUtf8(std::string((char*)txtFile->GetData(), txtFile->GetSize()));
100100
}
101101

102+
for(auto file : arc->GetRoot()->GetFiles()){
103+
if(std::filesystem::path(file->GetName()).extension().string() == ".cmn"){
104+
auto cameraAnimNode = std::make_shared<LCameraAnimationDOMNode>(std::filesystem::path(file->GetName()).stem().string());
105+
bStream::CMemoryStream camstream(file->GetData(), file->GetSize(), bStream::Endianess::Big, bStream::OpenMode::In);
106+
cameraAnimNode->Load(&camstream);
107+
AddChild(cameraAnimNode);
108+
}
109+
}
110+
102111
}
103112

104113
void LEventDataDOMNode::SaveEventArchive(){

src/modes/EventMode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ void LEventMode::RenderDetailsWindow(LSceneCamera* camera)
7575

7676
ImGui::End();
7777
} else {
78-
ImGui::Begin("bottomPanel");
78+
ImGui::Begin("toolWindow");
7979
ImGui::Text("Camera Animation");
8080
ImGui::Separator();
8181
std::static_pointer_cast<LCameraAnimationDOMNode>(mSelectionManager.GetPrimarySelection())->RenderDetailsUI(0, camera);

src/ui/BooldozerEditor.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
#include <cstdlib>
2626

27+
#include "DOM/CameraAnimationDOMNode.hpp"
28+
2729
namespace {
2830
char* patchErrorMsg { nullptr };
2931
std::thread mapOperationThread {};
@@ -47,6 +49,8 @@ LBooldozerEditor::~LBooldozerEditor(){
4749
glDeleteRenderbuffers(1, &mRbo);
4850
glDeleteTextures(1, &mViewTex);
4951
glDeleteTextures(1, &mPickTex);
52+
53+
CameraAnimation::CleanupPreview();
5054
}
5155

5256
void LBooldozerEditor::LoadMap(std::string path, LEditorScene* scene){
@@ -108,6 +112,8 @@ void LBooldozerEditor::Render(float dt, LEditorScene* renderer_scene)
108112
glBindTexture(GL_TEXTURE_2D, 0);
109113
glBindRenderbuffer(GL_RENDERBUFFER, 0);
110114

115+
CameraAnimation::InitPreview();
116+
111117
ImGui::DockBuilderRemoveNode(mMainDockSpaceID); // clear any previous layout
112118
ImGui::DockBuilderAddNode(mMainDockSpaceID, dockFlags | ImGuiDockNodeFlags_DockSpace);
113119
ImGui::DockBuilderSetNodeSize(mMainDockSpaceID, mainViewport->Size);
@@ -335,6 +341,8 @@ void LBooldozerEditor::Render(float dt, LEditorScene* renderer_scene)
335341

336342
mGhostConfigs.RenderUI();
337343

344+
CameraAnimation::RenderPreview();
345+
338346
ImGuiWindowClass mainWindowOverride;
339347
mainWindowOverride.DockNodeFlagsOverrideSet = ImGuiDockNodeFlags_NoTabBar;
340348
ImGui::SetNextWindowClass(&mainWindowOverride);
@@ -345,6 +353,7 @@ void LBooldozerEditor::Render(float dt, LEditorScene* renderer_scene)
345353
ImVec2 cursorPos = ImGui::GetCursorScreenPos();
346354

347355
glBindFramebuffer(GL_FRAMEBUFFER, mFbo);
356+
glBindRenderbuffer(GL_RENDERBUFFER, mRbo);
348357

349358
if(winSize.x != mPrevWinWidth || winSize.y != mPrevWinHeight){
350359
glDeleteTextures(1, &mViewTex);

0 commit comments

Comments
 (0)