Files
vr-poser/include/ImGuiLayer.h
2026-03-16 00:22:49 -04:00

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] = {};
};