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+
887LCameraAnimationDOMNode::LCameraAnimationDOMNode (std::string name) : Super(name)
988{
1089 mType = EDOMNodeType::CameraAnim;
1190}
1291
1392void 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 }
0 commit comments