77 lines
2.4 KiB
C++
77 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <functional>
|
|
#include <osg/Camera>
|
|
#include <osgViewer/Viewer>
|
|
#include <osgGA/GUIEventAdapter>
|
|
|
|
class MorphManager;
|
|
class PoseManager;
|
|
class BoneSelector;
|
|
class AppConfig;
|
|
|
|
class ImGuiLayer {
|
|
public:
|
|
explicit ImGuiLayer(MorphManager* morphMgr,
|
|
const AppConfig* cfg);
|
|
~ImGuiLayer();
|
|
|
|
void init(osgViewer::Viewer* viewer);
|
|
bool handleEvent(const osgGA::GUIEventAdapter& ea);
|
|
|
|
void renderPanel();
|
|
void markGLInitialized();
|
|
|
|
// Callbacks
|
|
std::function<void(const std::string&)> onShaderChange;
|
|
std::function<void()> onShaderReload;
|
|
std::function<void(float)> onScaleChange;
|
|
// Pose callbacks
|
|
std::function<void(bool)> onPoseModeToggle;
|
|
std::function<void(bool)> onBoneVisToggle;
|
|
|
|
void setCurrentShader(const std::string& s) { m_currentShader = s; }
|
|
void setInitialScale(float s) { m_scale = s; m_scaleBuf[0] = 0; }
|
|
|
|
// Set pose subsystem references so the Pose tab can drive them
|
|
void setPoseManager(PoseManager* pm) { m_poseMgr = pm; }
|
|
void setBoneSelector(BoneSelector* bs) { m_boneSel = bs; }
|
|
|
|
// Called by Application when the user clicks a bone in the viewport
|
|
void selectBone(const std::string& name) { m_selectedBone = name; }
|
|
|
|
private:
|
|
void renderMorphTab();
|
|
void renderShaderTab();
|
|
void renderTransformTab();
|
|
void renderPoseTab();
|
|
void renderBoneTree(const std::string& boneName, int depth);
|
|
|
|
MorphManager* m_morphMgr = nullptr;
|
|
PoseManager* m_poseMgr = nullptr;
|
|
BoneSelector* m_boneSel = nullptr;
|
|
const AppConfig* m_cfg = nullptr;
|
|
osgViewer::Viewer* m_viewer = nullptr;
|
|
osg::ref_ptr<osg::Camera> m_camera;
|
|
|
|
bool m_contextCreated = false;
|
|
bool m_glInitialized = false;
|
|
float m_panelWidth = 380.f;
|
|
|
|
char m_searchBuf[256] = {};
|
|
char m_boneSearch[256] = {};
|
|
bool m_showOnlyActive = false;
|
|
std::string m_currentShader = "toon";
|
|
float m_scale = 1.0f;
|
|
char m_scaleBuf[32] = {};
|
|
|
|
// Pose tab state
|
|
bool m_poseEnabled = false;
|
|
bool m_bonesVisible = true;
|
|
std::string m_selectedBone;
|
|
// Euler angles for selected bone (degrees, for display)
|
|
float m_boneEuler[3] = {};
|
|
float m_boneTrans[3] = {};
|
|
};
|