UI - Refactoring progress
(see previous log message)
This commit is contained in:
parent
b5a5a5298c
commit
942b6f239a
21 changed files with 905 additions and 704 deletions
5
Makefile
5
Makefile
|
@ -38,10 +38,14 @@ COMMON = \
|
||||||
opcomp.cc \
|
opcomp.cc \
|
||||||
opmgr.cc \
|
opmgr.cc \
|
||||||
\
|
\
|
||||||
|
ui.cc \
|
||||||
ui-actions.cc \
|
ui-actions.cc \
|
||||||
ui-colorgrading.cc \
|
ui-colorgrading.cc \
|
||||||
ui-dialogs.cc \
|
ui-dialogs.cc \
|
||||||
ui-imgui-sdl.cc \
|
ui-imgui-sdl.cc \
|
||||||
|
ui-overrides.cc \
|
||||||
|
ui-sequencer.cc \
|
||||||
|
ui-sync.cc \
|
||||||
ui-utilities.cc \
|
ui-utilities.cc \
|
||||||
# END COMMON
|
# END COMMON
|
||||||
|
|
||||||
|
@ -49,7 +53,6 @@ DEMO = \
|
||||||
demo.cc \
|
demo.cc \
|
||||||
main.cc \
|
main.cc \
|
||||||
opemu.cc \
|
opemu.cc \
|
||||||
ui-sequencer.cc \
|
|
||||||
# END DEMO
|
# END DEMO
|
||||||
|
|
||||||
PARSERCHECK = \
|
PARSERCHECK = \
|
||||||
|
|
16
globals.cc
16
globals.cc
|
@ -2,24 +2,16 @@
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
|
|
||||||
#include "filewatcher.hh"
|
#include "filewatcher.hh"
|
||||||
#include "odbg.hh"
|
|
||||||
#include "opcomp.hh"
|
#include "opcomp.hh"
|
||||||
#include "ops.hh"
|
#include "ops.hh"
|
||||||
#include "profiling.hh"
|
#include "profiling.hh"
|
||||||
#include "shaders.hh"
|
|
||||||
#include "sync.hh"
|
#include "sync.hh"
|
||||||
#include "texture.hh"
|
|
||||||
#include "undo.hh"
|
#include "undo.hh"
|
||||||
#include "window.hh"
|
|
||||||
|
|
||||||
|
|
||||||
T_OwnPtr< T_FilesWatcher > Globals::watcher_;
|
T_OwnPtr< T_FilesWatcher > Globals::watcher_;
|
||||||
T_OwnPtr< T_Window > Globals::window_;
|
|
||||||
T_OwnPtr< T_Profiler > Globals::profiler_;
|
T_OwnPtr< T_Profiler > Globals::profiler_;
|
||||||
T_OwnPtr< T_SyncManager > Globals::sync_;
|
T_OwnPtr< T_SyncManager > Globals::sync_;
|
||||||
T_OwnPtr< T_TextureManager > Globals::textures_;
|
|
||||||
T_OwnPtr< T_ShaderManager > Globals::shaders_;
|
|
||||||
T_OwnPtr< T_OutputDebugger > Globals::odbg_;
|
|
||||||
T_OwnPtr< T_ScriptManager > Globals::ops_;
|
T_OwnPtr< T_ScriptManager > Globals::ops_;
|
||||||
T_OwnPtr< T_UndoManager > Globals::undo_;
|
T_OwnPtr< T_UndoManager > Globals::undo_;
|
||||||
|
|
||||||
|
@ -27,12 +19,8 @@ T_OwnPtr< T_UndoManager > Globals::undo_;
|
||||||
void Globals::Init( )
|
void Globals::Init( )
|
||||||
{
|
{
|
||||||
watcher_ = NewOwned< T_FilesWatcher >( );
|
watcher_ = NewOwned< T_FilesWatcher >( );
|
||||||
window_ = NewOwned< T_Window >( );
|
|
||||||
profiler_ = NewOwned< T_Profiler >( );
|
profiler_ = NewOwned< T_Profiler >( );
|
||||||
sync_ = NewOwned< T_SyncManager >( );
|
sync_ = NewOwned< T_SyncManager >( );
|
||||||
textures_ = NewOwned< T_TextureManager >( );
|
|
||||||
shaders_ = NewOwned< T_ShaderManager >( );
|
|
||||||
odbg_ = NewOwned< T_OutputDebugger >( );
|
|
||||||
ops_ = NewOwned< T_ScriptManager >( );
|
ops_ = NewOwned< T_ScriptManager >( );
|
||||||
undo_ = NewOwned< T_UndoManager >( );
|
undo_ = NewOwned< T_UndoManager >( );
|
||||||
}
|
}
|
||||||
|
@ -41,11 +29,7 @@ void Globals::Shutdown( )
|
||||||
{
|
{
|
||||||
undo_.clear( );
|
undo_.clear( );
|
||||||
ops_.clear( );
|
ops_.clear( );
|
||||||
odbg_.clear( );
|
|
||||||
shaders_.clear( );
|
|
||||||
textures_.clear( );
|
|
||||||
sync_.clear( );
|
sync_.clear( );
|
||||||
profiler_.clear( );
|
profiler_.clear( );
|
||||||
window_.clear( );
|
|
||||||
watcher_.clear( );
|
watcher_.clear( );
|
||||||
}
|
}
|
||||||
|
|
12
globals.hh
12
globals.hh
|
@ -4,12 +4,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct T_Window;
|
|
||||||
struct T_FilesWatcher;
|
struct T_FilesWatcher;
|
||||||
struct T_Profiler;
|
struct T_Profiler;
|
||||||
struct T_TextureManager;
|
|
||||||
struct T_ShaderManager;
|
|
||||||
struct T_OutputDebugger;
|
|
||||||
struct T_SyncManager;
|
struct T_SyncManager;
|
||||||
struct T_ScriptManager;
|
struct T_ScriptManager;
|
||||||
class T_UndoManager;
|
class T_UndoManager;
|
||||||
|
@ -21,23 +17,15 @@ struct Globals
|
||||||
static void Shutdown( );
|
static void Shutdown( );
|
||||||
|
|
||||||
static T_FilesWatcher& Watcher( ) { return *watcher_; }
|
static T_FilesWatcher& Watcher( ) { return *watcher_; }
|
||||||
static T_Window& Window( ) { return *window_; }
|
|
||||||
static T_Profiler& Profiler( ) { return *profiler_; }
|
static T_Profiler& Profiler( ) { return *profiler_; }
|
||||||
static T_SyncManager& Sync( ) { return *sync_; }
|
static T_SyncManager& Sync( ) { return *sync_; }
|
||||||
static T_TextureManager& Textures( ) { return *textures_; }
|
|
||||||
static T_ShaderManager& Shaders( ) { return *shaders_; }
|
|
||||||
static T_OutputDebugger& ODbg( ) { return *odbg_; }
|
|
||||||
static T_ScriptManager& Ops( ) { return *ops_; }
|
static T_ScriptManager& Ops( ) { return *ops_; }
|
||||||
static T_UndoManager& Undo( ) { return *undo_; }
|
static T_UndoManager& Undo( ) { return *undo_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static T_OwnPtr< T_FilesWatcher > watcher_;
|
static T_OwnPtr< T_FilesWatcher > watcher_;
|
||||||
static T_OwnPtr< T_Window > window_;
|
|
||||||
static T_OwnPtr< T_Profiler > profiler_;
|
static T_OwnPtr< T_Profiler > profiler_;
|
||||||
static T_OwnPtr< T_SyncManager > sync_;
|
static T_OwnPtr< T_SyncManager > sync_;
|
||||||
static T_OwnPtr< T_ShaderManager > shaders_;
|
|
||||||
static T_OwnPtr< T_TextureManager > textures_;
|
|
||||||
static T_OwnPtr< T_OutputDebugger > odbg_;
|
|
||||||
static T_OwnPtr< T_ScriptManager > ops_;
|
static T_OwnPtr< T_ScriptManager > ops_;
|
||||||
static T_OwnPtr< T_UndoManager > undo_;
|
static T_OwnPtr< T_UndoManager > undo_;
|
||||||
};
|
};
|
||||||
|
|
80
main.cc
80
main.cc
|
@ -9,7 +9,9 @@
|
||||||
#include "opemu.hh"
|
#include "opemu.hh"
|
||||||
#include "rendertarget.hh"
|
#include "rendertarget.hh"
|
||||||
#include "sync.hh"
|
#include "sync.hh"
|
||||||
|
#include "ui.hh"
|
||||||
#include "ui-sequencer.hh"
|
#include "ui-sequencer.hh"
|
||||||
|
#include "ui-sync.hh"
|
||||||
#include "ui-utilities.hh"
|
#include "ui-utilities.hh"
|
||||||
#include "undo.hh"
|
#include "undo.hh"
|
||||||
|
|
||||||
|
@ -50,46 +52,8 @@ struct T_Main
|
||||||
T_Main::T_Main( )
|
T_Main::T_Main( )
|
||||||
{
|
{
|
||||||
Globals::Init( );
|
Globals::Init( );
|
||||||
|
UI::Init( );
|
||||||
prevSize = ImVec2( -1 , -1 );
|
prevSize = ImVec2( -1 , -1 );
|
||||||
|
|
||||||
// FIXME: should be somewhere else
|
|
||||||
T_UIAction saveCurves{ "Save curves" , []() {
|
|
||||||
if ( Globals::Sync( ).curvesFileChanged( ) ) {
|
|
||||||
Globals::Window( ).msgbox(
|
|
||||||
"Curves file changed" ,
|
|
||||||
"The file containing the curves has been modified "
|
|
||||||
"on the disk. These changes will be overwritten. "
|
|
||||||
"Do you want to continue?" ,
|
|
||||||
[]( auto b ) {
|
|
||||||
if ( b == T_MessageBox::BT_YES ) {
|
|
||||||
Globals::Sync( ).saveCurves( );
|
|
||||||
}
|
|
||||||
} , { T_MessageBox::BT_YES , T_MessageBox::BT_NO } );
|
|
||||||
} else {
|
|
||||||
Globals::Sync( ).saveCurves( );
|
|
||||||
}
|
|
||||||
} };
|
|
||||||
saveCurves.setEnabledCheck( []() { return Globals::Sync( ).curvesModified( ); } )
|
|
||||||
.setIcon( ICON_FA_FLOPPY_O )
|
|
||||||
.setShortcut( T_KeyboardShortcut{ 's' , E_KeyboardModifier::CTRL } );
|
|
||||||
Globals::Window( ).addAction( std::move( saveCurves ) );
|
|
||||||
|
|
||||||
T_UIAction reloadCurves{ "Reload curves" , []() {
|
|
||||||
Globals::Window( ).msgbox(
|
|
||||||
"Reload curves?" ,
|
|
||||||
"Changes you made to the curves will be lost. Do you "
|
|
||||||
"want to continue?" ,
|
|
||||||
[]( auto b ) {
|
|
||||||
if ( b == T_MessageBox::BT_YES ) {
|
|
||||||
Globals::Sync( ).loadCurves( );
|
|
||||||
}
|
|
||||||
} , { T_MessageBox::BT_YES , T_MessageBox::BT_NO } );
|
|
||||||
} };
|
|
||||||
reloadCurves.setEnabledCheck( []() { return Globals::Sync( ).curvesModified( ); } )
|
|
||||||
.setIcon( ICON_FA_DOWNLOAD )
|
|
||||||
.setShortcut( T_KeyboardShortcut{ 'r' ,
|
|
||||||
{ E_KeyboardModifier::CTRL , E_KeyboardModifier::SHIFT } } );
|
|
||||||
Globals::Window( ).addAction( std::move( reloadCurves ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Main::mainLoop( )
|
void T_Main::mainLoop( )
|
||||||
|
@ -121,7 +85,7 @@ void T_Main::mainLoop( )
|
||||||
}
|
}
|
||||||
|
|
||||||
Globals::Watcher( ).check( );
|
Globals::Watcher( ).check( );
|
||||||
Globals::Shaders( ).update( );
|
UI::Shaders( ).update( );
|
||||||
|
|
||||||
glFinish( );
|
glFinish( );
|
||||||
p.startFrame( );
|
p.startFrame( );
|
||||||
|
@ -132,7 +96,7 @@ void T_Main::mainLoop( )
|
||||||
makeUI( );
|
makeUI( );
|
||||||
render( );
|
render( );
|
||||||
p.end( "Full frame" );
|
p.end( "Full frame" );
|
||||||
Globals::Window( ).swap( );
|
UI::Window( ).swap( );
|
||||||
p.endFrame( );
|
p.endFrame( );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,6 +105,7 @@ void T_Main::mainLoop( )
|
||||||
T_Main::~T_Main( )
|
T_Main::~T_Main( )
|
||||||
{
|
{
|
||||||
demo.clear( );
|
demo.clear( );
|
||||||
|
UI::Shutdown( );
|
||||||
Globals::Shutdown( );
|
Globals::Shutdown( );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +145,7 @@ void T_Main::startIteration( )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Globals::Window( ).startFrame( capture , mouseInitial );
|
UI::Window( ).startFrame( capture , mouseInitial );
|
||||||
ImGui::GetIO( ).MouseDrawCursor = true;
|
ImGui::GetIO( ).MouseDrawCursor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,11 +187,11 @@ void T_Main::handleCapture( )
|
||||||
capture = false;
|
capture = false;
|
||||||
CaptureMouseFromApp( false );
|
CaptureMouseFromApp( false );
|
||||||
SDL_SetRelativeMouseMode( SDL_FALSE );
|
SDL_SetRelativeMouseMode( SDL_FALSE );
|
||||||
Globals::Window( ).warpMouse( mouseInitial );
|
UI::Window( ).warpMouse( mouseInitial );
|
||||||
SetMouseCursor( ImGuiMouseCursor_Arrow );
|
SetMouseCursor( ImGuiMouseCursor_Arrow );
|
||||||
} else if ( capture ) {
|
} else if ( capture ) {
|
||||||
SetMouseCursor( ImGuiMouseCursor_Move );
|
SetMouseCursor( ImGuiMouseCursor_Move );
|
||||||
Globals::Sync( ).handleDragAndDrop( mouseMove , kb , mb );
|
UI::Sync( ).handleDragAndDrop( mouseMove , kb , mb );
|
||||||
} else if ( appCanGrab && mb ) {
|
} else if ( appCanGrab && mb ) {
|
||||||
capture = true;
|
capture = true;
|
||||||
mouseInitial = GetMousePos( );
|
mouseInitial = GetMousePos( );
|
||||||
|
@ -236,7 +201,7 @@ void T_Main::handleCapture( )
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ( appCanGrab || capture ) && io.MouseWheel ) {
|
if ( ( appCanGrab || capture ) && io.MouseWheel ) {
|
||||||
Globals::Sync( ).handleWheel( io.MouseWheel , kb , mb );
|
UI::Sync( ).handleWheel( io.MouseWheel , kb , mb );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,12 +209,11 @@ void T_Main::makeUI( )
|
||||||
{
|
{
|
||||||
using namespace ImGui;
|
using namespace ImGui;
|
||||||
auto& undo( Globals::Undo( ) );
|
auto& undo( Globals::Undo( ) );
|
||||||
auto& sync( Globals::Sync( ) );
|
|
||||||
bool eSequencer{ sequencer };
|
bool eSequencer{ sequencer };
|
||||||
if ( BeginMainMenuBar( ) ) {
|
if ( BeginMainMenuBar( ) ) {
|
||||||
if ( BeginMenu( "File" ) ) {
|
if ( BeginMenu( "File" ) ) {
|
||||||
Globals::Window( ).actionMenu( "Save curves" );
|
UI::Window( ).actionMenu( "Save curves" );
|
||||||
Globals::Window( ).actionMenu( "Reload curves" );
|
UI::Window( ).actionMenu( "Reload curves" );
|
||||||
Separator( );
|
Separator( );
|
||||||
if ( MenuItem( "Undo" , "C-z" , false , undo.canUndo( ) ) ) {
|
if ( MenuItem( "Undo" , "C-z" , false , undo.canUndo( ) ) ) {
|
||||||
undo.undo( );
|
undo.undo( );
|
||||||
|
@ -265,14 +229,14 @@ void T_Main::makeUI( )
|
||||||
}
|
}
|
||||||
if ( BeginMenu( "Views" ) ) {
|
if ( BeginMenu( "Views" ) ) {
|
||||||
MenuItemCheckbox( "Input overrides" ,
|
MenuItemCheckbox( "Input overrides" ,
|
||||||
&sync.overridesWindowEnabled( ) );
|
&UI::Sync( ).overridesWindowEnabled( ) );
|
||||||
MenuItemCheckbox( "Output debugger" ,
|
MenuItemCheckbox( "Output debugger" ,
|
||||||
&Globals::ODbg( ).uiEnabled( ) );
|
&UI::ODbg( ).uiEnabled( ) );
|
||||||
MenuItemCheckbox( "Profiler" ,
|
MenuItemCheckbox( "Profiler" ,
|
||||||
&Globals::Profiler( ).uiEnabled( ) );
|
&Globals::Profiler( ).uiEnabled( ) );
|
||||||
MenuItemCheckbox( "Sequencer" , &eSequencer );
|
MenuItemCheckbox( "Sequencer" , &eSequencer );
|
||||||
MenuItemCheckbox( "Shaders" ,
|
MenuItemCheckbox( "Shaders" ,
|
||||||
&Globals::Shaders( ).uiEnabled( ) );
|
&UI::Shaders( ).uiEnabled( ) );
|
||||||
EndMenu( );
|
EndMenu( );
|
||||||
}
|
}
|
||||||
EndMainMenuBar( );
|
EndMainMenuBar( );
|
||||||
|
@ -285,9 +249,9 @@ void T_Main::makeUI( )
|
||||||
}
|
}
|
||||||
|
|
||||||
Globals::Profiler( ).makeUI( );
|
Globals::Profiler( ).makeUI( );
|
||||||
Globals::ODbg( ).makeUI( );
|
UI::ODbg( ).makeUI( );
|
||||||
Globals::Shaders( ).makeUI( );
|
UI::Shaders( ).makeUI( );
|
||||||
Globals::Sync( ).makeOverridesWindow( );
|
UI::Sync( ).makeOverridesWindow( );
|
||||||
if ( sequencer && !sequencer->display( ) ) {
|
if ( sequencer && !sequencer->display( ) ) {
|
||||||
sequencer.clear( );
|
sequencer.clear( );
|
||||||
}
|
}
|
||||||
|
@ -300,8 +264,8 @@ void T_Main::render( )
|
||||||
|
|
||||||
Globals::Profiler( ).start( "Debug" );
|
Globals::Profiler( ).start( "Debug" );
|
||||||
T_Rendertarget::MainOutput( );
|
T_Rendertarget::MainOutput( );
|
||||||
if ( Globals::ODbg( ).isActive( ) ) {
|
if ( UI::ODbg( ).isActive( ) ) {
|
||||||
Globals::ODbg( ).debugOutput( );
|
UI::ODbg( ).debugOutput( );
|
||||||
}
|
}
|
||||||
glFinish( ); Globals::Profiler( ).end( "Debug" );
|
glFinish( ); Globals::Profiler( ).end( "Debug" );
|
||||||
|
|
||||||
|
@ -311,10 +275,10 @@ void T_Main::render( )
|
||||||
glClear( GL_COLOR_BUFFER_BIT );
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
}
|
}
|
||||||
|
|
||||||
Globals::Window( ).handleDialogs( );
|
UI::Window( ).handleDialogs( );
|
||||||
glUseProgram( 0 );
|
glUseProgram( 0 );
|
||||||
glBindProgramPipeline( 0 );
|
glBindProgramPipeline( 0 );
|
||||||
Globals::Textures( ).reset( );
|
UI::Textures( ).reset( );
|
||||||
glClearColor( 0 , 0 , 0 , 1 );
|
glClearColor( 0 , 0 , 0 , 1 );
|
||||||
ImGui::Render( );
|
ImGui::Render( );
|
||||||
}
|
}
|
||||||
|
|
6
odbg.cc
6
odbg.cc
|
@ -1,6 +1,6 @@
|
||||||
#include "externals.hh"
|
#include "externals.hh"
|
||||||
#include "odbg.hh"
|
#include "odbg.hh"
|
||||||
#include "globals.hh"
|
#include "ui.hh"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ void T_OutputDebugger::debugOutput( )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& tm( Globals::Textures( ) );
|
auto& tm( UI::Textures( ) );
|
||||||
glBindTextureUnit( 0 , info.id );
|
glBindTextureUnit( 0 , info.id );
|
||||||
glBindSampler( 0 , tm.sampler( "nearest-border" )->id( ) );
|
glBindSampler( 0 , tm.sampler( "nearest-border" )->id( ) );
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ void T_OutputDebugger::registerSubmode(
|
||||||
sb << shader << ".glsl" << '\0';
|
sb << shader << ".glsl" << '\0';
|
||||||
submodes_[ int( mode ) ].add( T_Submode_{
|
submodes_[ int( mode ) ].add( T_Submode_{
|
||||||
name ,
|
name ,
|
||||||
Globals::Shaders( ).pipeline({
|
UI::Shaders( ).pipeline({
|
||||||
"fullscreen.v.glsl" , sb.data( ) }) ,
|
"fullscreen.v.glsl" , sb.data( ) }) ,
|
||||||
setup
|
setup
|
||||||
} );
|
} );
|
||||||
|
|
11
opemu.cc
11
opemu.cc
|
@ -1,6 +1,7 @@
|
||||||
#include "externals.hh"
|
#include "externals.hh"
|
||||||
#include "opemu.hh"
|
#include "opemu.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
|
#include "ui.hh"
|
||||||
#include "profiling.hh"
|
#include "profiling.hh"
|
||||||
#include "rendertarget.hh"
|
#include "rendertarget.hh"
|
||||||
#include "sync.hh"
|
#include "sync.hh"
|
||||||
|
@ -69,7 +70,7 @@ struct T_RunGuard
|
||||||
glUseProgram( 0 );
|
glUseProgram( 0 );
|
||||||
glBindProgramPipeline( 0 );
|
glBindProgramPipeline( 0 );
|
||||||
glBindFramebuffer( GL_FRAMEBUFFER , 0 );
|
glBindFramebuffer( GL_FRAMEBUFFER , 0 );
|
||||||
Globals::Textures( ).reset( );
|
UI::Textures( ).reset( );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -436,7 +437,7 @@ void T_OpContext::run(
|
||||||
}
|
}
|
||||||
|
|
||||||
pipelines[ plIndex ] = NewOwned< T_ShaderPipeline >(
|
pipelines[ plIndex ] = NewOwned< T_ShaderPipeline >(
|
||||||
Globals::Shaders( ).pipeline( progNames , instr.args[ 0 ] + 1 ) );
|
UI::Shaders( ).pipeline( progNames , instr.args[ 0 ] + 1 ) );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +447,7 @@ void T_OpContext::run(
|
||||||
throw X_OpFailure{ instr , "invalid argument" };
|
throw X_OpFailure{ instr , "invalid argument" };
|
||||||
}
|
}
|
||||||
programs.add( NewOwned< T_ShaderProgram >(
|
programs.add( NewOwned< T_ShaderProgram >(
|
||||||
Globals::Shaders( ).program( program.progNames[ instr.args[ 0 ] ] ) ) );
|
UI::Shaders( ).program( program.progNames[ instr.args[ 0 ] ] ) ) );
|
||||||
wreg = programs.size( );
|
wreg = programs.size( );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -551,7 +552,7 @@ void T_OpContext::run(
|
||||||
throw X_OpFailure{ instr , "invalid sampler" };
|
throw X_OpFailure{ instr , "invalid sampler" };
|
||||||
}
|
}
|
||||||
|
|
||||||
Globals::Textures( ).bind( instr.args[ 0 ] ,
|
UI::Textures( ).bind( instr.args[ 0 ] ,
|
||||||
*textures[ svt - 1 ] , *samplers[ svs - 1 ] );
|
*textures[ svt - 1 ] , *samplers[ svs - 1 ] );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -710,7 +711,7 @@ void T_OpContext::run(
|
||||||
if ( svt == 0 || svt > textures.size( ) || !textures[ svt - 1 ] ) {
|
if ( svt == 0 || svt > textures.size( ) || !textures[ svt - 1 ] ) {
|
||||||
throw X_OpFailure{ instr , "invalid texture" };
|
throw X_OpFailure{ instr , "invalid texture" };
|
||||||
}
|
}
|
||||||
Globals::ODbg( ).registerTexture( *textures[ svt - 1 ] ,
|
UI::ODbg( ).registerTexture( *textures[ svt - 1 ] ,
|
||||||
E_ODbgMode( instr.args[ 0 ] ) ,
|
E_ODbgMode( instr.args[ 0 ] ) ,
|
||||||
program.uiStrings[ instr.args[ 1 ] ] );
|
program.uiStrings[ instr.args[ 1 ] ] );
|
||||||
break;
|
break;
|
||||||
|
|
39
shaders.cc
39
shaders.cc
|
@ -1,6 +1,7 @@
|
||||||
#include "externals.hh"
|
#include "externals.hh"
|
||||||
#include "shaders.hh"
|
#include "shaders.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
|
#include "ui.hh"
|
||||||
#include "ui-utilities.hh"
|
#include "ui-utilities.hh"
|
||||||
|
|
||||||
#include <ebcl/Sets.hh>
|
#include <ebcl/Sets.hh>
|
||||||
|
@ -214,14 +215,14 @@ T_ShaderProgram::T_ShaderProgram(
|
||||||
: id_( id )
|
: id_( id )
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).programs_[ id_ - 1 ].saReferences ++;
|
UI::Shaders( ).programs_[ id_ - 1 ].saReferences ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
T_ShaderProgram::~T_ShaderProgram( )
|
T_ShaderProgram::~T_ShaderProgram( )
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).dereferenceProgram( id_ - 1 );
|
UI::Shaders( ).dereferenceProgram( id_ - 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,11 +231,11 @@ T_ShaderProgram& T_ShaderProgram::operator=(
|
||||||
{
|
{
|
||||||
if ( this != &other ) {
|
if ( this != &other ) {
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).dereferenceProgram( id_ - 1 );
|
UI::Shaders( ).dereferenceProgram( id_ - 1 );
|
||||||
}
|
}
|
||||||
id_ = other.id_;
|
id_ = other.id_;
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).programs_[ id_ - 1 ].saReferences ++;
|
UI::Shaders( ).programs_[ id_ - 1 ].saReferences ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -245,7 +246,7 @@ T_ShaderProgram& T_ShaderProgram::operator=(
|
||||||
{
|
{
|
||||||
if ( this != &other ) {
|
if ( this != &other ) {
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).dereferenceProgram( id_ - 1 );
|
UI::Shaders( ).dereferenceProgram( id_ - 1 );
|
||||||
}
|
}
|
||||||
id_ = other.id_;
|
id_ = other.id_;
|
||||||
other.id_ = T_String{};
|
other.id_ = T_String{};
|
||||||
|
@ -255,7 +256,7 @@ T_ShaderProgram& T_ShaderProgram::operator=(
|
||||||
|
|
||||||
bool T_ShaderProgram::valid( ) const noexcept
|
bool T_ShaderProgram::valid( ) const noexcept
|
||||||
{
|
{
|
||||||
return id_ && Globals::Shaders( ).programs_[ id_ - 1 ].id != 0;
|
return id_ && UI::Shaders( ).programs_[ id_ - 1 ].id != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_ShaderProgram::enable( ) const
|
void T_ShaderProgram::enable( ) const
|
||||||
|
@ -264,7 +265,7 @@ void T_ShaderProgram::enable( ) const
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const& p( Globals::Shaders( ).programs_[ id_ - 1 ] );
|
auto const& p( UI::Shaders( ).programs_[ id_ - 1 ] );
|
||||||
if ( p.id ) {
|
if ( p.id ) {
|
||||||
glBindProgramPipeline( 0 );
|
glBindProgramPipeline( 0 );
|
||||||
glUseProgram( p.id );
|
glUseProgram( p.id );
|
||||||
|
@ -274,7 +275,7 @@ void T_ShaderProgram::enable( ) const
|
||||||
GLuint T_ShaderProgram::id( ) const
|
GLuint T_ShaderProgram::id( ) const
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
return Globals::Shaders( ).programs_[ id_ - 1 ].id;
|
return UI::Shaders( ).programs_[ id_ - 1 ].id;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +284,7 @@ GLuint T_ShaderProgram::id( ) const
|
||||||
T_Optional< E_ShaderType > T_ShaderProgram::type( ) const
|
T_Optional< E_ShaderType > T_ShaderProgram::type( ) const
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
return Globals::Shaders( ).programs_[ id_ - 1 ].code.type;
|
return UI::Shaders( ).programs_[ id_ - 1 ].code.type;
|
||||||
} else {
|
} else {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -292,7 +293,7 @@ T_Optional< E_ShaderType > T_ShaderProgram::type( ) const
|
||||||
T_String T_ShaderProgram::name( ) const
|
T_String T_ShaderProgram::name( ) const
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
return Globals::Shaders( ).programs_[ id_ - 1 ].name;
|
return UI::Shaders( ).programs_[ id_ - 1 ].name;
|
||||||
} else {
|
} else {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -321,14 +322,14 @@ T_ShaderPipeline::T_ShaderPipeline( T_String id ) noexcept
|
||||||
: id_( std::move( id ) )
|
: id_( std::move( id ) )
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).pipelines_.get( id_ )->references ++;
|
UI::Shaders( ).pipelines_.get( id_ )->references ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
T_ShaderPipeline::~T_ShaderPipeline( )
|
T_ShaderPipeline::~T_ShaderPipeline( )
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).dereferencePipeline( id_ );
|
UI::Shaders( ).dereferencePipeline( id_ );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,11 +338,11 @@ T_ShaderPipeline& T_ShaderPipeline::operator=(
|
||||||
{
|
{
|
||||||
if ( this != &other ) {
|
if ( this != &other ) {
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).dereferencePipeline( id_ );
|
UI::Shaders( ).dereferencePipeline( id_ );
|
||||||
}
|
}
|
||||||
id_ = other.id_;
|
id_ = other.id_;
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).pipelines_.get( id_ )->references ++;
|
UI::Shaders( ).pipelines_.get( id_ )->references ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -352,7 +353,7 @@ T_ShaderPipeline& T_ShaderPipeline::operator=(
|
||||||
{
|
{
|
||||||
if ( this != &other ) {
|
if ( this != &other ) {
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
Globals::Shaders( ).dereferencePipeline( id_ );
|
UI::Shaders( ).dereferencePipeline( id_ );
|
||||||
}
|
}
|
||||||
id_ = other.id_;
|
id_ = other.id_;
|
||||||
other.id_ = T_String{};
|
other.id_ = T_String{};
|
||||||
|
@ -363,7 +364,7 @@ T_ShaderPipeline& T_ShaderPipeline::operator=(
|
||||||
bool T_ShaderPipeline::valid( ) const noexcept
|
bool T_ShaderPipeline::valid( ) const noexcept
|
||||||
{
|
{
|
||||||
return id_
|
return id_
|
||||||
&& Globals::Shaders( ).pipelines_.get( id_ )->id != 0;
|
&& UI::Shaders( ).pipelines_.get( id_ )->id != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_ShaderPipeline::enable( ) const
|
void T_ShaderPipeline::enable( ) const
|
||||||
|
@ -372,7 +373,7 @@ void T_ShaderPipeline::enable( ) const
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const* pl( Globals::Shaders( ).pipelines_.get( id_ ) );
|
auto const* pl( UI::Shaders( ).pipelines_.get( id_ ) );
|
||||||
if ( pl && pl->id ) {
|
if ( pl && pl->id ) {
|
||||||
glUseProgram( 0 );
|
glUseProgram( 0 );
|
||||||
glBindProgramPipeline( pl->id );
|
glBindProgramPipeline( pl->id );
|
||||||
|
@ -382,7 +383,7 @@ void T_ShaderPipeline::enable( ) const
|
||||||
GLuint T_ShaderPipeline::id( ) const
|
GLuint T_ShaderPipeline::id( ) const
|
||||||
{
|
{
|
||||||
if ( id_ ) {
|
if ( id_ ) {
|
||||||
return Globals::Shaders( ).pipelines_.get( id_ )->id;
|
return UI::Shaders( ).pipelines_.get( id_ )->id;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -395,7 +396,7 @@ GLuint T_ShaderPipeline::program(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const& sm( Globals::Shaders( ) );
|
auto const& sm( UI::Shaders( ) );
|
||||||
auto const& pl( *sm.pipelines_.get( id_ ) );
|
auto const& pl( *sm.pipelines_.get( id_ ) );
|
||||||
for ( auto const& pn : pl.programs ) {
|
for ( auto const& pn : pl.programs ) {
|
||||||
auto const* pos( sm.programIndex_.get( pn ) );
|
auto const* pos( sm.programIndex_.get( pn ) );
|
||||||
|
|
123
sync.cc
123
sync.cc
|
@ -10,18 +10,6 @@
|
||||||
#include <ebcl/SRDParser.hh>
|
#include <ebcl/SRDParser.hh>
|
||||||
using ebcl::T_SRDParserConfig;
|
using ebcl::T_SRDParserConfig;
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
const std::map< std::string , T_SyncSegment::E_SegmentType > SegmentTypes_( ([] {
|
|
||||||
std::map< std::string , T_SyncSegment::E_SegmentType > t;
|
|
||||||
t.emplace( "linear" , T_SyncSegment::LINEAR );
|
|
||||||
t.emplace( "ramp" , T_SyncSegment::RAMP );
|
|
||||||
t.emplace( "smooth" , T_SyncSegment::SMOOTH );
|
|
||||||
return t;
|
|
||||||
})());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*= SRD parser for the curves ================================================*/
|
/*= SRD parser for the curves ================================================*/
|
||||||
|
|
||||||
|
@ -432,40 +420,6 @@ void A_SyncOverride::setup( ) noexcept
|
||||||
id_ = std::move( sb );
|
id_ = std::move( sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
char const* A_SyncOverride::buildLabel(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
sb.clear( ) << "temp label " << counter << '\0';
|
|
||||||
counter ++;
|
|
||||||
return sb.data( );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void A_SyncOverride::makeUI(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
|
|
||||||
if ( Checkbox( &title_[ 0 ] , &enabled_ ) ) {
|
|
||||||
Globals::Sync( ).setOverridesActive( enabled_ , inputPos_.size( ) , &inputPos_[ 0 ] );
|
|
||||||
}
|
|
||||||
if ( !enabled_ ) {
|
|
||||||
PushItemFlag( ImGuiItemFlags_Disabled , true );
|
|
||||||
PushStyleVar( ImGuiStyleVar_Alpha , GetStyle( ).Alpha * 0.5f );
|
|
||||||
}
|
|
||||||
Indent( );
|
|
||||||
PushItemWidth( -1 );
|
|
||||||
makeEditWidgets( counter , sb );
|
|
||||||
PopItemWidth( );
|
|
||||||
Unindent( );
|
|
||||||
if ( !enabled_ ) {
|
|
||||||
PopItemFlag( );
|
|
||||||
PopStyleVar( );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*= T_SyncOverrideSection ====================================================*/
|
/*= T_SyncOverrideSection ====================================================*/
|
||||||
|
|
||||||
|
@ -486,33 +440,6 @@ void T_SyncOverrideSection::merge(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_SyncOverrideSection::makeUI(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& tempSb ,
|
|
||||||
const bool topLevel ) noexcept
|
|
||||||
{
|
|
||||||
const bool display( topLevel
|
|
||||||
? ImGui::CollapsingHeader( &cTitle[ 0 ] )
|
|
||||||
: ImGui::TreeNode( &cTitle[ 0 ] ) );
|
|
||||||
if ( !display ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( auto& os : subsections ) {
|
|
||||||
os->makeUI( counter , tempSb );
|
|
||||||
}
|
|
||||||
if ( subsections.size( ) && overrides.size( ) ) {
|
|
||||||
ImGui::Separator( );
|
|
||||||
}
|
|
||||||
for ( auto& ov : overrides ) {
|
|
||||||
ov->makeUI( counter , tempSb );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !topLevel ) {
|
|
||||||
ImGui::TreePop( );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
T_SyncOverrideSection& T_SyncOverrideSection::section(
|
T_SyncOverrideSection& T_SyncOverrideSection::section(
|
||||||
T_String const& name ) noexcept
|
T_String const& name ) noexcept
|
||||||
{
|
{
|
||||||
|
@ -803,7 +730,6 @@ void T_SyncManager::updateValues( )
|
||||||
|
|
||||||
void T_SyncManager::clearOverrides( ) noexcept
|
void T_SyncManager::clearOverrides( ) noexcept
|
||||||
{
|
{
|
||||||
mouseDelegate_ = nullptr;
|
|
||||||
soRoot_.subsections.clear( );
|
soRoot_.subsections.clear( );
|
||||||
soRoot_.overrides.clear( );
|
soRoot_.overrides.clear( );
|
||||||
soTable_.clear( );
|
soTable_.clear( );
|
||||||
|
@ -866,52 +792,3 @@ void T_SyncManager::visitOverrides(
|
||||||
{
|
{
|
||||||
soVisitor_.visitor.visit( &soRoot_ , visitor );
|
soVisitor_.visitor.visit( &soRoot_ , visitor );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void T_SyncManager::makeOverridesWindow( )
|
|
||||||
{
|
|
||||||
if ( !ovWindow_ ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace ImGui;
|
|
||||||
auto const& dspSize( GetIO( ).DisplaySize );
|
|
||||||
SetNextWindowSize( ImVec2( dspSize.x * .25f , dspSize.y * .66f - 20 ) , ImGuiSetCond_Appearing );
|
|
||||||
SetNextWindowPos( ImVec2( 0 , 20 ) , ImGuiSetCond_Appearing );
|
|
||||||
Begin( "Input overrides" , &ovWindow_ ,
|
|
||||||
ImGuiWindowFlags_NoCollapse );
|
|
||||||
|
|
||||||
if ( soRoot_.subsections.empty( ) ) {
|
|
||||||
Text( "No overrides have been defined." );
|
|
||||||
} else {
|
|
||||||
T_StringBuilder temp;
|
|
||||||
uint32_t counter{ 0 };
|
|
||||||
for ( auto& section : soRoot_.subsections ) {
|
|
||||||
section->makeUI( counter , temp , true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
End( );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void T_SyncManager::handleDragAndDrop(
|
|
||||||
ImVec2 const& move ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept
|
|
||||||
{
|
|
||||||
if ( mouseDelegate_ ) {
|
|
||||||
mouseDelegate_->handleDragAndDrop( move , modifiers , buttons );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void T_SyncManager::handleWheel(
|
|
||||||
const float wheel ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept
|
|
||||||
{
|
|
||||||
if ( mouseDelegate_ ) {
|
|
||||||
mouseDelegate_->handleWheel( wheel , modifiers , buttons );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
54
sync.hh
54
sync.hh
|
@ -1,7 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "filewatcher.hh"
|
#include "filewatcher.hh"
|
||||||
#include "utilities.hh"
|
#include "utilities.hh"
|
||||||
#include "ui-mousectrl.hh"
|
|
||||||
|
|
||||||
#include <ebcl/SRDParserConfig.hh>
|
#include <ebcl/SRDParserConfig.hh>
|
||||||
#include <ebcl/Sets.hh>
|
#include <ebcl/Sets.hh>
|
||||||
|
@ -189,18 +188,6 @@ class A_SyncOverride
|
||||||
A_SyncOverride( char const* type ,
|
A_SyncOverride( char const* type ,
|
||||||
T_String const& title ) noexcept;
|
T_String const& title ) noexcept;
|
||||||
|
|
||||||
// Build a temporary label for use with ImGui. The label is valid
|
|
||||||
// until the next call to buildLabel(), as it is in fact stored
|
|
||||||
// in the string builder.
|
|
||||||
char const* buildLabel(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept;
|
|
||||||
|
|
||||||
// Draw the UI for that specific override.
|
|
||||||
virtual void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept = 0;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
A_SyncOverride( ) = delete;
|
A_SyncOverride( ) = delete;
|
||||||
virtual ~A_SyncOverride( ) = 0;
|
virtual ~A_SyncOverride( ) = 0;
|
||||||
|
@ -208,9 +195,13 @@ class A_SyncOverride
|
||||||
T_String const& type( ) const noexcept
|
T_String const& type( ) const noexcept
|
||||||
{ return type_; }
|
{ return type_; }
|
||||||
|
|
||||||
ebcl::T_Set< T_String > const& inputNames( ) const noexcept
|
auto const& inputNames( ) const noexcept
|
||||||
{ return inputs_; }
|
{ return inputs_; }
|
||||||
|
auto const& inputPositions( ) const noexcept
|
||||||
|
{ return inputPos_; }
|
||||||
|
|
||||||
|
bool& enabled( ) noexcept
|
||||||
|
{ return enabled_; }
|
||||||
bool enabled( ) const noexcept
|
bool enabled( ) const noexcept
|
||||||
{ return enabled_; }
|
{ return enabled_; }
|
||||||
|
|
||||||
|
@ -228,12 +219,6 @@ class A_SyncOverride
|
||||||
// the inputs have been added.
|
// the inputs have been added.
|
||||||
virtual void setup( ) noexcept;
|
virtual void setup( ) noexcept;
|
||||||
|
|
||||||
// Draw the title, enable button and editor. The counter and temporary
|
|
||||||
// string builder are used to generate "fake" labels for ImGui.
|
|
||||||
virtual void makeUI(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept;
|
|
||||||
|
|
||||||
// Create a clone of the current override.
|
// Create a clone of the current override.
|
||||||
virtual T_OwnPtr< A_SyncOverride > clone( ) const noexcept = 0;
|
virtual T_OwnPtr< A_SyncOverride > clone( ) const noexcept = 0;
|
||||||
};
|
};
|
||||||
|
@ -288,7 +273,7 @@ struct T_SyncOverrideVisitor
|
||||||
|
|
||||||
// Synchronisation manager; handles all the synchronization data and makes it
|
// Synchronisation manager; handles all the synchronization data and makes it
|
||||||
// work together.
|
// work together.
|
||||||
struct T_SyncManager : public virtual A_MouseCtrl
|
struct T_SyncManager
|
||||||
{
|
{
|
||||||
T_SyncManager( );
|
T_SyncManager( );
|
||||||
|
|
||||||
|
@ -391,30 +376,6 @@ struct T_SyncManager : public virtual A_MouseCtrl
|
||||||
void updateValues( );
|
void updateValues( );
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
|
||||||
// User interface
|
|
||||||
|
|
||||||
bool& overridesWindowEnabled( ) noexcept
|
|
||||||
{ return ovWindow_; }
|
|
||||||
void makeOverridesWindow( );
|
|
||||||
|
|
||||||
void delegateMouse( A_MouseCtrl& delegate ) noexcept
|
|
||||||
{ mouseDelegate_ = &delegate; }
|
|
||||||
void clearMouseDelegate( ) noexcept
|
|
||||||
{ mouseDelegate_ = nullptr; }
|
|
||||||
bool isCurrentDelegate( A_MouseCtrl const& delegate ) noexcept
|
|
||||||
{ return mouseDelegate_ == &delegate; }
|
|
||||||
|
|
||||||
void handleDragAndDrop(
|
|
||||||
ImVec2 const& move ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept override;
|
|
||||||
void handleWheel(
|
|
||||||
float wheel ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept override;
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// Private data
|
// Private data
|
||||||
|
|
||||||
|
@ -434,11 +395,8 @@ struct T_SyncManager : public virtual A_MouseCtrl
|
||||||
T_SyncCurves curves_; // Curves storage
|
T_SyncCurves curves_; // Curves storage
|
||||||
T_Array< P_SyncCurveCache > curveCaches_; // Cache for curve segments
|
T_Array< P_SyncCurveCache > curveCaches_; // Cache for curve segments
|
||||||
|
|
||||||
bool ovWindow_{ false }; // Overrides window
|
|
||||||
T_SyncOverrideSection soRoot_; // Root for overrides
|
T_SyncOverrideSection soRoot_; // Root for overrides
|
||||||
T_SyncOverrideVisitor soVisitor_;
|
T_SyncOverrideVisitor soVisitor_;
|
||||||
T_KeyValueTable< T_String , A_SyncOverride* > soTable_;
|
T_KeyValueTable< T_String , A_SyncOverride* > soTable_;
|
||||||
// Table of sync overrides, by ID
|
// Table of sync overrides, by ID
|
||||||
|
|
||||||
A_MouseCtrl* mouseDelegate_{ nullptr }; // Delegate for mouse actions
|
|
||||||
};
|
};
|
||||||
|
|
342
syncoverrides.cc
342
syncoverrides.cc
|
@ -641,24 +641,6 @@ T_Float::T_Float(
|
||||||
inputs_.add( input );
|
inputs_.add( input );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Float::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
float v[ 1 ] = {
|
|
||||||
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ]
|
|
||||||
};
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderFloat( label , v , min( ) , max( ) , decimals( ) , power( ) )
|
|
||||||
: DragFloat( label , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ] = v[ 0 ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Float::clone( ) const noexcept
|
P_SyncOverride T_Float::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Float >( inputs_[ 0 ] , &title_[ 0 ] ) };
|
auto c{ NewOwned< T_Float >( inputs_[ 0 ] , &title_[ 0 ] ) };
|
||||||
|
@ -679,28 +661,6 @@ T_Float2::T_Float2(
|
||||||
inputs_.add( input1 );
|
inputs_.add( input1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Float2::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
float v[ 2 ];
|
|
||||||
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderFloat2( label , v , min( ) , max( ) , decimals( ) , power( ) )
|
|
||||||
: DragFloat2( label , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Float2::clone( ) const noexcept
|
P_SyncOverride T_Float2::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Float2 >( inputs_[ 0 ] , inputs_[ 1 ] , &title_[ 0 ] ) };
|
auto c{ NewOwned< T_Float2 >( inputs_[ 0 ] , inputs_[ 1 ] , &title_[ 0 ] ) };
|
||||||
|
@ -723,28 +683,6 @@ T_Float3::T_Float3(
|
||||||
inputs_.add( input2 );
|
inputs_.add( input2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Float3::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
float v[ 3 ];
|
|
||||||
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderFloat3( label , v , min( ) , max( ) , decimals( ) , power( ) )
|
|
||||||
: DragFloat3( label , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Float3::clone( ) const noexcept
|
P_SyncOverride T_Float3::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Float3 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
auto c{ NewOwned< T_Float3 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
||||||
|
@ -770,28 +708,6 @@ T_Float4::T_Float4(
|
||||||
inputs_.add( input3 );
|
inputs_.add( input3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Float4::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
float v[ 4 ];
|
|
||||||
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderFloat4( label , v , min( ) , max( ) , decimals( ) , power( ) )
|
|
||||||
: DragFloat4( label , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Float4::clone( ) const noexcept
|
P_SyncOverride T_Float4::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Float4 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
auto c{ NewOwned< T_Float4 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
||||||
|
@ -838,24 +754,6 @@ T_Integer::T_Integer(
|
||||||
inputs_.add( input );
|
inputs_.add( input );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Integer::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
int32_t v[ 1 ] = {
|
|
||||||
int32_t( Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ] )
|
|
||||||
};
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderInt( label , v , min( ) , max( ) )
|
|
||||||
: DragInt( label , v , step( ) , min( ) , max( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ] = v[ 0 ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Integer::clone( ) const noexcept
|
P_SyncOverride T_Integer::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Integer >( inputs_[ 0 ] , &title_[ 0 ] ) };
|
auto c{ NewOwned< T_Integer >( inputs_[ 0 ] , &title_[ 0 ] ) };
|
||||||
|
@ -876,28 +774,6 @@ T_Integer2::T_Integer2(
|
||||||
inputs_.add( input1 );
|
inputs_.add( input1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Integer2::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
int32_t v[ 2 ];
|
|
||||||
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderInt2( label , v , min( ) , max( ) )
|
|
||||||
: DragInt2( label , v , step( ) , min( ) , max( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Integer2::clone( ) const noexcept
|
P_SyncOverride T_Integer2::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Integer2 >( inputs_[ 0 ] , inputs_[ 1 ] , &title_[ 0 ] ) };
|
auto c{ NewOwned< T_Integer2 >( inputs_[ 0 ] , inputs_[ 1 ] , &title_[ 0 ] ) };
|
||||||
|
@ -920,28 +796,6 @@ T_Integer3::T_Integer3(
|
||||||
inputs_.add( input2 );
|
inputs_.add( input2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Integer3::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
int32_t v[ 3 ];
|
|
||||||
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderInt3( label , v , min( ) , max( ) )
|
|
||||||
: DragInt3( label , v , step( ) , min( ) , max( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Integer3::clone( ) const noexcept
|
P_SyncOverride T_Integer3::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Integer3 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
auto c{ NewOwned< T_Integer3 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
||||||
|
@ -967,28 +821,6 @@ T_Integer4::T_Integer4(
|
||||||
inputs_.add( input3 );
|
inputs_.add( input3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_Integer4::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
int32_t v[ 4 ];
|
|
||||||
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label( buildLabel( counter , sb ) );
|
|
||||||
const bool changed( slider( )
|
|
||||||
? SliderInt4( label , v , min( ) , max( ) )
|
|
||||||
: DragInt4( label , v , step( ) , min( ) , max( ) ) );
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SyncOverride T_Integer4::clone( ) const noexcept
|
P_SyncOverride T_Integer4::clone( ) const noexcept
|
||||||
{
|
{
|
||||||
auto c{ NewOwned< T_Integer4 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
auto c{ NewOwned< T_Integer4 >( inputs_[ 0 ] , inputs_[ 1 ] ,
|
||||||
|
@ -1012,30 +844,6 @@ T_ColorGrading::T_ColorGrading(
|
||||||
inputs_.add( iBlue );
|
inputs_.add( iBlue );
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_ColorGrading::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
using namespace ImGui;
|
|
||||||
auto& sinp{ Globals::Sync( ).inputs( ) };
|
|
||||||
float v[ 3 ];
|
|
||||||
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
|
||||||
v[ i ] = sinp[ inputPos_[ i ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
char const* const label{ buildLabel( counter , sb ) };
|
|
||||||
const bool changed{ ColorGradingControls(
|
|
||||||
label ,
|
|
||||||
&v[ 0 ] , &v[ 1 ] , &v[ 2 ] ,
|
|
||||||
base( ) , unit( ) ) };
|
|
||||||
|
|
||||||
if ( changed ) {
|
|
||||||
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
|
||||||
sinp[ inputPos_[ i ] ] = v[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool T_ColorGrading::setBase(
|
bool T_ColorGrading::setBase(
|
||||||
const float v ) noexcept
|
const float v ) noexcept
|
||||||
{
|
{
|
||||||
|
@ -1187,7 +995,7 @@ bool T_CamOverride::checkValidConfig( ) noexcept
|
||||||
/*------------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
T_CamOverride::E_SetState T_CamOverride::setVector(
|
T_CamOverride::E_SetState T_CamOverride::setVector(
|
||||||
T_Optional< T_VectorConfig_ >& vector ,
|
T_Optional< T_VectorConfig >& vector ,
|
||||||
T_String const& inX ,
|
T_String const& inX ,
|
||||||
T_String const& inY ,
|
T_String const& inY ,
|
||||||
T_String const& inZ ) noexcept
|
T_String const& inZ ) noexcept
|
||||||
|
@ -1206,151 +1014,3 @@ T_CamOverride::E_SetState T_CamOverride::setVector(
|
||||||
inputs_.add( inZ );
|
inputs_.add( inZ );
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void T_CamOverride::makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept
|
|
||||||
{
|
|
||||||
auto& sync( Globals::Sync( ) );
|
|
||||||
auto& sinp( sync.inputs( ) );
|
|
||||||
auto const& fc( *fovConfig_ );
|
|
||||||
|
|
||||||
if ( !enabled( ) || !prevEnabled_ ) {
|
|
||||||
// Set field of view / near plane
|
|
||||||
if ( fc.mode == FM_FOV ) {
|
|
||||||
camera_.fieldOfView( sinp[ inputPos_[ fc.inputIndex ] ] );
|
|
||||||
} else {
|
|
||||||
camera_.nearPlane( sinp[ inputPos_[ fc.inputIndex ] ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set camera parameters
|
|
||||||
const glm::vec3 lookAt{ vectorFromInputs( *target_ ) };
|
|
||||||
if ( camMode_ == CM_ANGLES ) {
|
|
||||||
const glm::vec3 angles{ vectorFromInputs( *angles_ ) };
|
|
||||||
const float distance{ sinp[ inputPos_[ *distance_ ] ] };
|
|
||||||
camera_.camera( lookAt , angles , distance );
|
|
||||||
} else {
|
|
||||||
const glm::vec3 position{ vectorFromInputs( *position_ ) };
|
|
||||||
const glm::vec3 up{ vectorFromInputs( *upVector_ ) };
|
|
||||||
camera_.camera( lookAt , position , up );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prevEnabled_ = enabled( );
|
|
||||||
|
|
||||||
// Draw UI
|
|
||||||
char const* const name( buildLabel( counter , sb ) );
|
|
||||||
bool mouseHandler{ sync.isCurrentDelegate( *this ) };
|
|
||||||
using namespace ImGui;
|
|
||||||
PushItemWidth( 0 ); // Compensate for -1
|
|
||||||
PushID( GetCurrentWindow( )->GetID( name ) );
|
|
||||||
const bool handlerChanged{ Checkbox( "Mouse control" , &mouseHandler ) };
|
|
||||||
Separator( );
|
|
||||||
const auto changes{ camera_.makeUI( ) };
|
|
||||||
PopID( );
|
|
||||||
PopItemWidth( );
|
|
||||||
|
|
||||||
if ( handlerChanged ) {
|
|
||||||
if ( mouseHandler ) {
|
|
||||||
sync.delegateMouse( *this );
|
|
||||||
} else {
|
|
||||||
sync.clearMouseDelegate( );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( changes & T_Camera::E_Changes::FOV ) {
|
|
||||||
if ( fc.mode == FM_FOV ) {
|
|
||||||
sinp[ inputPos_[ fc.inputIndex ] ] = camera_.fieldOfView( );
|
|
||||||
} else {
|
|
||||||
sinp[ inputPos_[ fc.inputIndex ] ] = camera_.nearPlane( );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( changes & T_Camera::E_Changes::MATRIX ) {
|
|
||||||
inputsFromVector( *target_ , camera_.lookAt( ) );
|
|
||||||
if ( camMode_ == CM_ANGLES ) {
|
|
||||||
inputsFromVector( *angles_ , camera_.angles( ) );
|
|
||||||
sinp[ inputPos_[ *distance_ ] ] = camera_.distance( );
|
|
||||||
} else {
|
|
||||||
inputsFromVector( *position_ , camera_.position( ) );
|
|
||||||
inputsFromVector( *upVector_ , camera_.upVector( ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 T_CamOverride::vectorFromInputs(
|
|
||||||
T_VectorConfig_ const& vc ) noexcept
|
|
||||||
{
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
return glm::vec3{
|
|
||||||
sinp[ inputPos_[ vc.x ] ] ,
|
|
||||||
sinp[ inputPos_[ vc.y ] ] ,
|
|
||||||
sinp[ inputPos_[ vc.z ] ] };
|
|
||||||
}
|
|
||||||
|
|
||||||
void T_CamOverride::inputsFromVector(
|
|
||||||
T_VectorConfig_ const& vc ,
|
|
||||||
glm::vec3 const& v ) noexcept
|
|
||||||
{
|
|
||||||
auto& sinp( Globals::Sync( ).inputs( ) );
|
|
||||||
sinp[ inputPos_[ vc.x ] ] = v.x;
|
|
||||||
sinp[ inputPos_[ vc.y ] ] = v.y;
|
|
||||||
sinp[ inputPos_[ vc.z ] ] = v.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void T_CamOverride::handleDragAndDrop(
|
|
||||||
ImVec2 const& move ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept
|
|
||||||
{
|
|
||||||
auto& sync( Globals::Sync( ) );
|
|
||||||
if ( !enabled( ) ) {
|
|
||||||
sync.clearMouseDelegate( );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
camera_.handleDragAndDrop( move , modifiers , buttons );
|
|
||||||
|
|
||||||
auto& sinp( sync.inputs( ) );
|
|
||||||
inputsFromVector( *target_ , camera_.lookAt( ) );
|
|
||||||
if ( camMode_ == CM_ANGLES ) {
|
|
||||||
inputsFromVector( *angles_ , camera_.angles( ) );
|
|
||||||
sinp[ inputPos_[ *distance_ ] ] = camera_.distance( );
|
|
||||||
} else {
|
|
||||||
inputsFromVector( *position_ , camera_.position( ) );
|
|
||||||
inputsFromVector( *upVector_ , camera_.upVector( ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void T_CamOverride::handleWheel(
|
|
||||||
const float wheel ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept
|
|
||||||
{
|
|
||||||
auto& sync( Globals::Sync( ) );
|
|
||||||
if ( !enabled( ) ) {
|
|
||||||
sync.clearMouseDelegate( );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
camera_.handleWheel( wheel , modifiers , buttons );
|
|
||||||
|
|
||||||
auto& sinp( sync.inputs( ) );
|
|
||||||
if ( modifiers & E_KeyboardModifier::SHIFT ) {
|
|
||||||
auto const& fc( *fovConfig_ );
|
|
||||||
if ( fc.mode == FM_FOV ) {
|
|
||||||
sinp[ inputPos_[ fc.inputIndex ] ] = camera_.fieldOfView( );
|
|
||||||
} else {
|
|
||||||
sinp[ inputPos_[ fc.inputIndex ] ] = camera_.nearPlane( );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
inputsFromVector( *target_ , camera_.lookAt( ) );
|
|
||||||
if ( camMode_ == CM_ANGLES ) {
|
|
||||||
inputsFromVector( *angles_ , camera_.angles( ) );
|
|
||||||
sinp[ inputPos_[ *distance_ ] ] = camera_.distance( );
|
|
||||||
} else {
|
|
||||||
inputsFromVector( *position_ , camera_.position( ) );
|
|
||||||
inputsFromVector( *upVector_ , camera_.upVector( ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
122
syncoverrides.hh
122
syncoverrides.hh
|
@ -53,10 +53,6 @@ class A_Float : public A_SyncOverride
|
||||||
// Single float values
|
// Single float values
|
||||||
class T_Float : public A_Float
|
class T_Float : public A_Float
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Float( T_String const& input ,
|
T_Float( T_String const& input ,
|
||||||
T_String const& title ) noexcept;
|
T_String const& title ) noexcept;
|
||||||
|
@ -67,10 +63,6 @@ class T_Float : public A_Float
|
||||||
// 2 float values
|
// 2 float values
|
||||||
class T_Float2 : public A_Float
|
class T_Float2 : public A_Float
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Float2( T_String const& input0 ,
|
T_Float2( T_String const& input0 ,
|
||||||
T_String const& input1 ,
|
T_String const& input1 ,
|
||||||
|
@ -82,10 +74,6 @@ class T_Float2 : public A_Float
|
||||||
// 3 float values
|
// 3 float values
|
||||||
class T_Float3 : public A_Float
|
class T_Float3 : public A_Float
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Float3( T_String const& input0 ,
|
T_Float3( T_String const& input0 ,
|
||||||
T_String const& input1 ,
|
T_String const& input1 ,
|
||||||
|
@ -98,10 +86,6 @@ class T_Float3 : public A_Float
|
||||||
// 4 float values
|
// 4 float values
|
||||||
class T_Float4 : public A_Float
|
class T_Float4 : public A_Float
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Float4( T_String const& input0 ,
|
T_Float4( T_String const& input0 ,
|
||||||
T_String const& input1 ,
|
T_String const& input1 ,
|
||||||
|
@ -155,10 +139,6 @@ class A_Integer : public A_SyncOverride
|
||||||
// Single integers
|
// Single integers
|
||||||
class T_Integer : public A_Integer
|
class T_Integer : public A_Integer
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Integer( T_String const& input ,
|
T_Integer( T_String const& input ,
|
||||||
T_String const& title ) noexcept;
|
T_String const& title ) noexcept;
|
||||||
|
@ -169,10 +149,6 @@ class T_Integer : public A_Integer
|
||||||
// 2 integers
|
// 2 integers
|
||||||
class T_Integer2 : public A_Integer
|
class T_Integer2 : public A_Integer
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Integer2( T_String const& input0 ,
|
T_Integer2( T_String const& input0 ,
|
||||||
T_String const& input1 ,
|
T_String const& input1 ,
|
||||||
|
@ -184,10 +160,6 @@ class T_Integer2 : public A_Integer
|
||||||
// 3 integers
|
// 3 integers
|
||||||
class T_Integer3 : public A_Integer
|
class T_Integer3 : public A_Integer
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Integer3( T_String const& input0 ,
|
T_Integer3( T_String const& input0 ,
|
||||||
T_String const& input1 ,
|
T_String const& input1 ,
|
||||||
|
@ -200,10 +172,6 @@ class T_Integer3 : public A_Integer
|
||||||
// 4 integers
|
// 4 integers
|
||||||
class T_Integer4 : public A_Integer
|
class T_Integer4 : public A_Integer
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
public:
|
public:
|
||||||
T_Integer4( T_String const& input0 ,
|
T_Integer4( T_String const& input0 ,
|
||||||
T_String const& input1 ,
|
T_String const& input1 ,
|
||||||
|
@ -223,11 +191,6 @@ class T_ColorGrading : public A_SyncOverride
|
||||||
T_Optional< float > base_;
|
T_Optional< float > base_;
|
||||||
T_Optional< float > unit_;
|
T_Optional< float > unit_;
|
||||||
|
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
T_ColorGrading( T_String const& iRed ,
|
T_ColorGrading( T_String const& iRed ,
|
||||||
T_String const& iGreen ,
|
T_String const& iGreen ,
|
||||||
|
@ -246,7 +209,7 @@ class T_ColorGrading : public A_SyncOverride
|
||||||
|
|
||||||
/*= CAMERA CONTROLS ============================================================*/
|
/*= CAMERA CONTROLS ============================================================*/
|
||||||
|
|
||||||
class T_CamOverride : public A_SyncOverride , public virtual A_MouseCtrl
|
class T_CamOverride : public A_SyncOverride
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum E_SetState {
|
enum E_SetState {
|
||||||
|
@ -255,57 +218,60 @@ class T_CamOverride : public A_SyncOverride , public virtual A_MouseCtrl
|
||||||
S_INPUTS , // Duplicate inputs
|
S_INPUTS , // Duplicate inputs
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
enum E_CamMode {
|
||||||
enum E_CamMode_ {
|
|
||||||
CM_INVALID ,
|
CM_INVALID ,
|
||||||
CM_ANGLES ,
|
CM_ANGLES ,
|
||||||
CM_VECTORS
|
CM_VECTORS
|
||||||
};
|
};
|
||||||
|
|
||||||
enum E_FovMode_ {
|
enum E_FovMode {
|
||||||
FM_INVALID ,
|
FM_INVALID ,
|
||||||
FM_FOV ,
|
FM_FOV ,
|
||||||
FM_NEARPLANE ,
|
FM_NEARPLANE ,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct T_FovConfig_
|
struct T_FovConfig
|
||||||
{
|
{
|
||||||
E_FovMode_ mode;
|
E_FovMode mode;
|
||||||
uint32_t inputIndex;
|
uint32_t inputIndex;
|
||||||
|
|
||||||
T_FovConfig_( E_FovMode_ mode , uint32_t idx ) noexcept
|
T_FovConfig( E_FovMode mode , uint32_t idx ) noexcept
|
||||||
: mode( mode ) , inputIndex( idx )
|
: mode( mode ) , inputIndex( idx )
|
||||||
{ assert( mode != FM_INVALID ); }
|
{ assert( mode != FM_INVALID ); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct T_VectorConfig_
|
struct T_VectorConfig
|
||||||
{
|
{
|
||||||
uint32_t x , y , z;
|
uint32_t x , y , z;
|
||||||
|
|
||||||
T_VectorConfig_( uint32_t x , uint32_t y , uint32_t z ) noexcept
|
T_VectorConfig( uint32_t x , uint32_t y ,
|
||||||
|
uint32_t z ) noexcept
|
||||||
: x(x),y(y),z(z)
|
: x(x),y(y),z(z)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
T_Optional< T_FovConfig_ > fovConfig_;
|
private:
|
||||||
T_Optional< T_VectorConfig_ > target_;
|
T_Optional< T_FovConfig > fovConfig_;
|
||||||
|
T_Optional< T_VectorConfig > target_;
|
||||||
|
|
||||||
T_Optional< T_VectorConfig_ > upVector_;
|
T_Optional< T_VectorConfig > upVector_;
|
||||||
T_Optional< T_VectorConfig_ > position_;
|
T_Optional< T_VectorConfig > position_;
|
||||||
|
|
||||||
T_Optional< T_VectorConfig_ > angles_;
|
T_Optional< T_VectorConfig > angles_;
|
||||||
T_Optional< uint32_t > distance_;
|
T_Optional< uint32_t > distance_;
|
||||||
|
|
||||||
E_CamMode_ camMode_;
|
E_CamMode camMode_;
|
||||||
T_Camera camera_;
|
T_Camera camera_;
|
||||||
|
|
||||||
bool prevEnabled_{ false };
|
bool prevEnabled_{ false };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
T_CamOverride( T_String const& title ) noexcept;
|
T_CamOverride( T_String const& title ) noexcept;
|
||||||
|
|
||||||
P_SyncOverride clone( ) const noexcept override;
|
P_SyncOverride clone( ) const noexcept override;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// Set configuration
|
||||||
|
|
||||||
E_SetState setFieldOfView(
|
E_SetState setFieldOfView(
|
||||||
T_String const& input ) noexcept;
|
T_String const& input ) noexcept;
|
||||||
E_SetState setNearPlane(
|
E_SetState setNearPlane(
|
||||||
|
@ -332,44 +298,52 @@ class T_CamOverride : public A_SyncOverride , public virtual A_MouseCtrl
|
||||||
E_SetState setDistance(
|
E_SetState setDistance(
|
||||||
T_String const& input ) noexcept;
|
T_String const& input ) noexcept;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// Check configuration
|
||||||
|
|
||||||
bool isFovConfigured( ) const noexcept
|
bool isFovConfigured( ) const noexcept
|
||||||
{ return fovConfig_; }
|
{ return fovConfig_; }
|
||||||
bool isTargetConfigured( ) const noexcept
|
bool isTargetConfigured( ) const noexcept
|
||||||
{ return target_; }
|
{ return target_; }
|
||||||
bool checkValidConfig( ) noexcept;
|
bool checkValidConfig( ) noexcept;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// Read configuration
|
||||||
|
|
||||||
|
T_FovConfig const& fovConfig( ) const noexcept
|
||||||
|
{ return *fovConfig_; }
|
||||||
|
T_VectorConfig const& target( ) const noexcept
|
||||||
|
{ return *target_; }
|
||||||
|
E_CamMode mode( ) const noexcept
|
||||||
|
{ return camMode_; }
|
||||||
|
|
||||||
|
auto const& angles( ) const noexcept
|
||||||
|
{ return *angles_; }
|
||||||
|
auto const& distance( ) const noexcept
|
||||||
|
{ return *distance_; }
|
||||||
|
|
||||||
|
auto const& position( ) const noexcept
|
||||||
|
{ return *position_; }
|
||||||
|
auto const& up( ) const noexcept
|
||||||
|
{ return *upVector_; }
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// State
|
||||||
|
|
||||||
T_Camera& camData( ) noexcept
|
T_Camera& camData( ) noexcept
|
||||||
{ return camera_; }
|
{ return camera_; }
|
||||||
T_Camera const& camData( ) const noexcept
|
T_Camera const& camData( ) const noexcept
|
||||||
{ return camera_; }
|
{ return camera_; }
|
||||||
|
|
||||||
void handleDragAndDrop(
|
bool& prevEnabled( ) noexcept
|
||||||
ImVec2 const& move ,
|
{ return prevEnabled_; }
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept override;
|
|
||||||
void handleWheel(
|
|
||||||
float wheel ,
|
|
||||||
T_KeyboardModifiers modifiers ,
|
|
||||||
T_MouseButtons buttons ) noexcept override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
E_SetState setVector(
|
E_SetState setVector(
|
||||||
T_Optional< T_VectorConfig_ >& vector ,
|
T_Optional< T_VectorConfig >& vector ,
|
||||||
T_String const& inX ,
|
T_String const& inX ,
|
||||||
T_String const& inY ,
|
T_String const& inY ,
|
||||||
T_String const& inZ ) noexcept;
|
T_String const& inZ ) noexcept;
|
||||||
|
|
||||||
protected:
|
|
||||||
void makeEditWidgets(
|
|
||||||
uint32_t& counter ,
|
|
||||||
T_StringBuilder& sb ) noexcept override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
glm::vec3 vectorFromInputs(
|
|
||||||
T_VectorConfig_ const& inputs ) noexcept;
|
|
||||||
void inputsFromVector(
|
|
||||||
T_VectorConfig_ const& inputs ,
|
|
||||||
glm::vec3 const& vector ) noexcept;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "externals.hh"
|
#include "externals.hh"
|
||||||
#include "texture.hh"
|
#include "texture.hh"
|
||||||
#include "globals.hh"
|
#include "ui.hh"
|
||||||
#include "odbg.hh"
|
#include "odbg.hh"
|
||||||
#include "ui-utilities.hh"
|
#include "ui-utilities.hh"
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ T_Texture::T_Texture(
|
||||||
T_Texture::~T_Texture( )
|
T_Texture::~T_Texture( )
|
||||||
{
|
{
|
||||||
if ( debugIndex_ != -1 ) {
|
if ( debugIndex_ != -1 ) {
|
||||||
auto& odbg( Globals::ODbg( ) );
|
auto& odbg( UI::ODbg( ) );
|
||||||
assert( odbg.outputs_[ debugIndex_ ].id == id_ );
|
assert( odbg.outputs_[ debugIndex_ ].id == id_ );
|
||||||
assert( odbg.nRegistered_ > 0 );
|
assert( odbg.nRegistered_ > 0 );
|
||||||
odbg.outputs_[ debugIndex_ ].id = 0;
|
odbg.outputs_[ debugIndex_ ].id = 0;
|
||||||
|
|
|
@ -21,5 +21,6 @@ class A_MouseCtrl
|
||||||
T_MouseButtons buttons
|
T_MouseButtons buttons
|
||||||
) noexcept = 0;
|
) noexcept = 0;
|
||||||
};
|
};
|
||||||
|
using P_MouseCtrl = T_OwnPtr< A_MouseCtrl >;
|
||||||
|
|
||||||
inline A_MouseCtrl::~A_MouseCtrl() {}
|
inline A_MouseCtrl::~A_MouseCtrl() {}
|
||||||
|
|
426
ui-overrides.cc
Normal file
426
ui-overrides.cc
Normal file
|
@ -0,0 +1,426 @@
|
||||||
|
#include "externals.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
#include "ui.hh"
|
||||||
|
#include "ui-colorgrading.hh"
|
||||||
|
#include "ui-overrides.hh"
|
||||||
|
#include "ui-sync.hh"
|
||||||
|
|
||||||
|
#include <imgui_internal.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace sov {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
char const* BuildLabel_(
|
||||||
|
uint32_t& counter ,
|
||||||
|
T_StringBuilder& sb ) noexcept
|
||||||
|
{
|
||||||
|
sb.clear( ) << "##temp label " << counter << '\0';
|
||||||
|
counter ++;
|
||||||
|
return sb.data( );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace <anon>
|
||||||
|
|
||||||
|
|
||||||
|
/*= FLOAT OVERRIDES ==========================================================*/
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Float )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Float& >( ovp ) };
|
||||||
|
float v[ 1 ] = {
|
||||||
|
Globals::Sync( ).inputs( )[ ov.inputPositions( )[ 0 ] ]
|
||||||
|
};
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderFloat( label , v , ov.min( ) , ov.max( ) ,
|
||||||
|
ov.decimals( ) , ov.power( ) )
|
||||||
|
: DragFloat( label , v , ov.step( ) , ov.min( ) ,
|
||||||
|
ov.max( ) , ov.decimals( ) , ov.power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
Globals::Sync( ).inputs( )[ ov.inputPositions( )[ 0 ] ] = v[ 0 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Float2 )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Float2& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
float v[ 2 ];
|
||||||
|
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderFloat2( label , v , ov.min( ) , ov.max( ) ,
|
||||||
|
ov.decimals( ) , ov.power( ) )
|
||||||
|
: DragFloat2( label , v , ov.step( ) , ov.min( ) ,
|
||||||
|
ov.max( ) , ov.decimals( ) , ov.power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Float3 )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Float3& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
float v[ 3 ];
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderFloat3( label , v , ov.min( ) , ov.max( ) ,
|
||||||
|
ov.decimals( ) , ov.power( ) )
|
||||||
|
: DragFloat3( label , v , ov.step( ) , ov.min( ) ,
|
||||||
|
ov.max( ) , ov.decimals( ) , ov.power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Float4 )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Float4& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
float v[ 4 ];
|
||||||
|
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderFloat4( label , v , ov.min( ) , ov.max( ) ,
|
||||||
|
ov.decimals( ) , ov.power( ) )
|
||||||
|
: DragFloat4( label , v , ov.step( ) , ov.min( ) ,
|
||||||
|
ov.max( ) , ov.decimals( ) , ov.power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= INTEGER OVERRIDES ========================================================*/
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Integer )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Integer& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
int32_t v[ 1 ] = {
|
||||||
|
int32_t( sinp[ ovip[ 0 ] ] )
|
||||||
|
};
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderInt( label , v , ov.min( ) , ov.max( ) )
|
||||||
|
: DragInt( label , v , ov.step( ) , ov.min( ) , ov.max( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
sinp[ ovip[ 0 ] ] = v[ 0 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Integer2 )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Integer2& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
int32_t v[ 2 ];
|
||||||
|
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderInt2( label , v , ov.min( ) , ov.max( ) )
|
||||||
|
: DragInt2( label , v , ov.step( ) , ov.min( ) , ov.max( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Integer3 )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Integer3& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
int32_t v[ 3 ];
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderInt3( label , v , ov.min( ) , ov.max( ) )
|
||||||
|
: DragInt3( label , v , ov.step( ) , ov.min( ) , ov.max( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Integer4 )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_Integer4& >( ovp ) };
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
int32_t v[ 4 ];
|
||||||
|
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label( BuildLabel_( counter , sb ) );
|
||||||
|
const bool changed( ov.slider( )
|
||||||
|
? SliderInt4( label , v , ov.min( ) , ov.max( ) )
|
||||||
|
: DragInt4( label , v , ov.step( ) , ov.min( ) , ov.max( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= COLOR GRADING OVERRIDES ==================================================*/
|
||||||
|
|
||||||
|
M_DECL_SOVUI( ColorGrading )
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& ov{ dynamic_cast< T_ColorGrading& >( ovp ) };
|
||||||
|
auto& sinp{ Globals::Sync( ).inputs( ) };
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
float v[ 3 ];
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ ovip[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* const label{ BuildLabel_( counter , sb ) };
|
||||||
|
const bool changed{ ColorGradingControls(
|
||||||
|
label ,
|
||||||
|
&v[ 0 ] , &v[ 1 ] , &v[ 2 ] ,
|
||||||
|
ov.base( ) , ov.unit( ) ) };
|
||||||
|
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
sinp[ ovip[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= CAMERA OVERRIDES =========================================================*/
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
glm::vec3 VectorFromInputs_(
|
||||||
|
T_CamOverride::T_VectorConfig const& vc ,
|
||||||
|
T_AutoArray< uint32_t , 8 > const& ovip ) noexcept
|
||||||
|
{
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
return glm::vec3{
|
||||||
|
sinp[ ovip[ vc.x ] ] ,
|
||||||
|
sinp[ ovip[ vc.y ] ] ,
|
||||||
|
sinp[ ovip[ vc.z ] ] };
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputsFromVector_(
|
||||||
|
T_CamOverride::T_VectorConfig const& vc ,
|
||||||
|
T_AutoArray< uint32_t , 8 > const& ovip ,
|
||||||
|
glm::vec3 const& v ) noexcept
|
||||||
|
{
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
sinp[ ovip[ vc.x ] ] = v.x;
|
||||||
|
sinp[ ovip[ vc.y ] ] = v.y;
|
||||||
|
sinp[ ovip[ vc.z ] ] = v.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
struct T_MouseCam_ : public virtual A_MouseCtrl
|
||||||
|
{
|
||||||
|
T_Camera& camera;
|
||||||
|
T_CamOverride& ov;
|
||||||
|
|
||||||
|
T_MouseCam_( T_Camera& cam ,
|
||||||
|
T_CamOverride& ov ) noexcept
|
||||||
|
: camera( cam ) , ov( ov )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void handleDragAndDrop(
|
||||||
|
ImVec2 const& move ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept override;
|
||||||
|
|
||||||
|
void handleWheel(
|
||||||
|
float wheel ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept override;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void T_MouseCam_::handleDragAndDrop(
|
||||||
|
ImVec2 const& move ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept
|
||||||
|
{
|
||||||
|
auto& sync( Globals::Sync( ) );
|
||||||
|
if ( !ov.enabled( ) ) {
|
||||||
|
UI::Sync( ).clearMouseDelegate( );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
camera.handleDragAndDrop( move , modifiers , buttons );
|
||||||
|
|
||||||
|
auto& sinp( sync.inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
InputsFromVector_( ov.target( ) , ovip , camera.lookAt( ) );
|
||||||
|
if ( ov.mode( ) == T_CamOverride::CM_ANGLES ) {
|
||||||
|
InputsFromVector_( ov.angles( ) , ovip , camera.angles( ) );
|
||||||
|
sinp[ ovip[ ov.distance( ) ] ] = camera.distance( );
|
||||||
|
} else {
|
||||||
|
InputsFromVector_( ov.position( ) , ovip , camera.position( ) );
|
||||||
|
InputsFromVector_( ov.up( ) , ovip , camera.upVector( ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_MouseCam_::handleWheel(
|
||||||
|
const float wheel ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept
|
||||||
|
{
|
||||||
|
auto& sync( Globals::Sync( ) );
|
||||||
|
if ( !ov.enabled( ) ) {
|
||||||
|
UI::Sync( ).clearMouseDelegate( );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
camera.handleWheel( wheel , modifiers , buttons );
|
||||||
|
|
||||||
|
auto& sinp( sync.inputs( ) );
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
if ( modifiers & E_KeyboardModifier::SHIFT ) {
|
||||||
|
auto const& fc( ov.fovConfig( ) );
|
||||||
|
if ( fc.mode == T_CamOverride::FM_FOV ) {
|
||||||
|
sinp[ ovip[ fc.inputIndex ] ] = camera.fieldOfView( );
|
||||||
|
} else {
|
||||||
|
sinp[ ovip[ fc.inputIndex ] ] = camera.nearPlane( );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
InputsFromVector_( ov.target( ) , ovip , camera.lookAt( ) );
|
||||||
|
if ( ov.mode( ) == T_CamOverride::CM_ANGLES ) {
|
||||||
|
InputsFromVector_( ov.angles( ) , ovip , camera.angles( ) );
|
||||||
|
sinp[ ovip[ ov.distance( ) ] ] = camera.distance( );
|
||||||
|
} else {
|
||||||
|
InputsFromVector_( ov.position( ) , ovip , camera.position( ) );
|
||||||
|
InputsFromVector_( ov.up( ) , ovip , camera.upVector( ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace <anon>
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Camera )
|
||||||
|
{
|
||||||
|
auto& ov{ dynamic_cast< T_CamOverride& >( ovp ) };
|
||||||
|
auto& sync{ Globals::Sync( ) };
|
||||||
|
auto& sinp{ sync.inputs( ) };
|
||||||
|
auto& camera{ ov.camData( ) };
|
||||||
|
auto const& ovip{ ov.inputPositions( ) };
|
||||||
|
auto const& fc{ ov.fovConfig( ) };
|
||||||
|
|
||||||
|
if ( !ov.enabled( ) || !ov.prevEnabled( ) ) {
|
||||||
|
// Set field of view / near plane
|
||||||
|
if ( fc.mode == T_CamOverride::FM_FOV ) {
|
||||||
|
camera.fieldOfView( sinp[ ovip[ fc.inputIndex ] ] );
|
||||||
|
} else {
|
||||||
|
camera.nearPlane( sinp[ ovip[ fc.inputIndex ] ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set camera parameters
|
||||||
|
const glm::vec3 lookAt{ VectorFromInputs_(
|
||||||
|
ov.target( ) , ovip ) };
|
||||||
|
if ( ov.mode( ) == T_CamOverride::CM_ANGLES ) {
|
||||||
|
const glm::vec3 angles{ VectorFromInputs_(
|
||||||
|
ov.angles( ) , ovip ) };
|
||||||
|
const float distance{ sinp[ ovip[ ov.distance( ) ] ] };
|
||||||
|
camera.camera( lookAt , angles , distance );
|
||||||
|
} else {
|
||||||
|
const glm::vec3 position{ VectorFromInputs_(
|
||||||
|
ov.position( ) , ovip ) };
|
||||||
|
const glm::vec3 up{ VectorFromInputs_(
|
||||||
|
ov.up( ) , ovip ) };
|
||||||
|
camera.camera( lookAt , position , up );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ov.prevEnabled( ) = ov.enabled( );
|
||||||
|
|
||||||
|
// Draw UI
|
||||||
|
char const* const name( BuildLabel_( counter , sb ) );
|
||||||
|
auto& sui{ UI::Sync( ) };
|
||||||
|
bool mouseHandler{ sui.isCurrentDelegate( ov.id( ) ) };
|
||||||
|
using namespace ImGui;
|
||||||
|
PushItemWidth( 0 ); // Compensate for -1
|
||||||
|
PushID( GetCurrentWindow( )->GetID( name ) );
|
||||||
|
const bool handlerChanged{ Checkbox( "Mouse control" , &mouseHandler ) };
|
||||||
|
Separator( );
|
||||||
|
const auto changes{ camera.makeUI( ) };
|
||||||
|
PopID( );
|
||||||
|
PopItemWidth( );
|
||||||
|
|
||||||
|
if ( handlerChanged ) {
|
||||||
|
if ( mouseHandler ) {
|
||||||
|
sui.delegateMouse( ov.id( ) ,
|
||||||
|
NewOwned< T_MouseCam_ >( camera , ov ) );
|
||||||
|
} else {
|
||||||
|
sui.clearMouseDelegate( );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update values
|
||||||
|
if ( changes & T_Camera::E_Changes::FOV ) {
|
||||||
|
if ( fc.mode == T_CamOverride::FM_FOV ) {
|
||||||
|
sinp[ ovip[ fc.inputIndex ] ] = camera.fieldOfView( );
|
||||||
|
} else {
|
||||||
|
sinp[ ovip[ fc.inputIndex ] ] = camera.nearPlane( );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( changes & T_Camera::E_Changes::MATRIX ) {
|
||||||
|
InputsFromVector_( ov.target( ) , ovip , camera.lookAt( ) );
|
||||||
|
if ( ov.mode( ) == T_CamOverride::CM_ANGLES ) {
|
||||||
|
InputsFromVector_( ov.angles( ) , ovip , camera.angles( ) );
|
||||||
|
sinp[ ovip[ ov.distance( ) ] ] = camera.distance( );
|
||||||
|
} else {
|
||||||
|
InputsFromVector_( ov.position( ) , ovip , camera.position( ) );
|
||||||
|
InputsFromVector_( ov.up( ) , ovip , camera.upVector( ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace sov
|
25
ui-overrides.hh
Normal file
25
ui-overrides.hh
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#pragma once
|
||||||
|
#include "syncoverrides.hh"
|
||||||
|
|
||||||
|
#define M_DECL_SOVUI(NAME) \
|
||||||
|
void UI##NAME( A_SyncOverride& ovp , \
|
||||||
|
uint32_t& counter , \
|
||||||
|
T_StringBuilder& sb ) noexcept
|
||||||
|
|
||||||
|
namespace sov {
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Float );
|
||||||
|
M_DECL_SOVUI( Float2 );
|
||||||
|
M_DECL_SOVUI( Float3 );
|
||||||
|
M_DECL_SOVUI( Float4 );
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Integer );
|
||||||
|
M_DECL_SOVUI( Integer2 );
|
||||||
|
M_DECL_SOVUI( Integer3 );
|
||||||
|
M_DECL_SOVUI( Integer4 );
|
||||||
|
|
||||||
|
M_DECL_SOVUI( ColorGrading );
|
||||||
|
|
||||||
|
M_DECL_SOVUI( Camera );
|
||||||
|
|
||||||
|
} // namespace sovui
|
|
@ -4,6 +4,7 @@
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "window.hh"
|
#include "window.hh"
|
||||||
#include "syncedit.hh"
|
#include "syncedit.hh"
|
||||||
|
#include "ui.hh"
|
||||||
#include "ui-utilities.hh"
|
#include "ui-utilities.hh"
|
||||||
|
|
||||||
#define IMGUI_DEFINE_MATH_OPERATORS
|
#define IMGUI_DEFINE_MATH_OPERATORS
|
||||||
|
@ -326,7 +327,7 @@ void T_SyncViewImpl_::displayToolbar( ) noexcept
|
||||||
ToolbarSeparator( );
|
ToolbarSeparator( );
|
||||||
|
|
||||||
if ( ToolbarButton( ICON_FA_CLOCK_O , BtSize , "Change duration and time units." ) ) {
|
if ( ToolbarButton( ICON_FA_CLOCK_O , BtSize , "Change duration and time units." ) ) {
|
||||||
Globals::Window( ).pushDialog( NewOwned< T_ChangeDurationDialog_ >(
|
UI::Window( ).pushDialog( NewOwned< T_ChangeDurationDialog_ >(
|
||||||
sync.durationUnits( ) , sync.durationUnitSize( ) ) );
|
sync.durationUnits( ) , sync.durationUnitSize( ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,7 +500,7 @@ void T_SyncViewImpl_::sequencerHeader(
|
||||||
GetColorU32( ImVec4{ 1 , 1 , 1 , .5 } ) );
|
GetColorU32( ImVec4{ 1 , 1 , 1 , .5 } ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
PushFont( Globals::Window( ).smallFont( ) );
|
PushFont( UI::Window( ).smallFont( ) );
|
||||||
PushStyleColor( ImGuiCol_Text , ColHeaderText );
|
PushStyleColor( ImGuiCol_Text , ColHeaderText );
|
||||||
auto pos{ startBarPos };
|
auto pos{ startBarPos };
|
||||||
auto bar{ startBar };
|
auto bar{ startBar };
|
||||||
|
|
191
ui-sync.cc
Normal file
191
ui-sync.cc
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
#include "externals.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
#include "ui.hh"
|
||||||
|
#include "ui-actions.hh"
|
||||||
|
#include "ui-overrides.hh"
|
||||||
|
#include "ui-sync.hh"
|
||||||
|
#include "ui-utilities.hh"
|
||||||
|
#include "window.hh"
|
||||||
|
|
||||||
|
|
||||||
|
/*= T_UISync =================================================================*/
|
||||||
|
|
||||||
|
T_UISync::T_UISync( )
|
||||||
|
{
|
||||||
|
UI::Window( ).newAction( "Save curves" , []() {
|
||||||
|
if ( Globals::Sync( ).curvesFileChanged( ) ) {
|
||||||
|
UI::Window( ).msgbox(
|
||||||
|
"Curves file changed" ,
|
||||||
|
"The file containing the curves has been modified "
|
||||||
|
"on the disk. These changes will be overwritten. "
|
||||||
|
"Do you want to continue?" ,
|
||||||
|
[]( auto b ) {
|
||||||
|
if ( b == T_MessageBox::BT_YES ) {
|
||||||
|
Globals::Sync( ).saveCurves( );
|
||||||
|
}
|
||||||
|
} , { T_MessageBox::BT_YES , T_MessageBox::BT_NO } );
|
||||||
|
} else {
|
||||||
|
Globals::Sync( ).saveCurves( );
|
||||||
|
}
|
||||||
|
} ).setEnabledCheck( []() {
|
||||||
|
return Globals::Sync( ).curvesModified( );
|
||||||
|
} ).setIcon( ICON_FA_FLOPPY_O )
|
||||||
|
.setShortcut( T_KeyboardShortcut{ 's' , E_KeyboardModifier::CTRL } );
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
UI::Window( ).newAction( "Reload curves" , []() {
|
||||||
|
UI::Window( ).msgbox(
|
||||||
|
"Reload curves?" ,
|
||||||
|
"Changes you made to the curves will be lost. Do you "
|
||||||
|
"want to continue?" ,
|
||||||
|
[]( auto b ) {
|
||||||
|
if ( b == T_MessageBox::BT_YES ) {
|
||||||
|
Globals::Sync( ).loadCurves( );
|
||||||
|
}
|
||||||
|
} , { T_MessageBox::BT_YES , T_MessageBox::BT_NO } );
|
||||||
|
} ).setEnabledCheck( []() {
|
||||||
|
return Globals::Sync( ).curvesModified( );
|
||||||
|
} ).setIcon( ICON_FA_DOWNLOAD )
|
||||||
|
.setShortcut( T_KeyboardShortcut{ 'r' ,
|
||||||
|
{ E_KeyboardModifier::CTRL , E_KeyboardModifier::SHIFT } } );
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
const auto addui{ [this]( char const* type , F_Override ov ) {
|
||||||
|
const bool ok{ sovuis_.add( T_String{ type } , std::move( ov ) ) };
|
||||||
|
assert( ok ); (void)ok;
|
||||||
|
} };
|
||||||
|
addui( "float" , sov::UIFloat );
|
||||||
|
addui( "float2" , sov::UIFloat2 );
|
||||||
|
addui( "float3" , sov::UIFloat3 );
|
||||||
|
addui( "float4" , sov::UIFloat4 );
|
||||||
|
addui( "int" , sov::UIInteger );
|
||||||
|
addui( "int2" , sov::UIInteger2 );
|
||||||
|
addui( "int3" , sov::UIInteger3 );
|
||||||
|
addui( "int4" , sov::UIInteger4 );
|
||||||
|
addui( "cg" , sov::UIColorGrading );
|
||||||
|
addui( "cam" , sov::UICamera );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
bool HandleOverrideSection_(
|
||||||
|
T_SyncOverrideSection& sos ,
|
||||||
|
bool exit ,
|
||||||
|
T_AutoArray< bool , 32 >& stack )
|
||||||
|
{
|
||||||
|
if ( exit ) {
|
||||||
|
assert( !stack.empty( ) );
|
||||||
|
if ( stack.last( ) && stack.size( ) > 1 ) {
|
||||||
|
ImGui::TreePop( );
|
||||||
|
}
|
||||||
|
stack.removeLast( );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool display( stack.empty( )
|
||||||
|
? ImGui::CollapsingHeader( &sos.cTitle[ 0 ] )
|
||||||
|
: ImGui::TreeNode( &sos.cTitle[ 0 ] ) );
|
||||||
|
stack.add( display );
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleOverride_(
|
||||||
|
A_SyncOverride& ov ,
|
||||||
|
uint32_t& counter ,
|
||||||
|
T_StringBuilder& sb ) noexcept
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
|
||||||
|
bool& enabled{ ov.enabled( ) };
|
||||||
|
if ( Checkbox( &ov.title( )[ 0 ] , &enabled ) ) {
|
||||||
|
auto const& ipos( ov.inputPositions( ) );
|
||||||
|
Globals::Sync( ).setOverridesActive( ov.enabled( ) ,
|
||||||
|
ipos.size( ) , &ipos[ 0 ] );
|
||||||
|
}
|
||||||
|
if ( !enabled ) {
|
||||||
|
PushDisabled( );
|
||||||
|
}
|
||||||
|
Indent( );
|
||||||
|
PushItemWidth( -1 );
|
||||||
|
(UI::Sync( ).uiFor( ov ))( ov , counter , sb );
|
||||||
|
PopItemWidth( );
|
||||||
|
Unindent( );
|
||||||
|
if ( !enabled ) {
|
||||||
|
PopDisabled( );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace <anon>
|
||||||
|
|
||||||
|
T_UISync::F_Override T_UISync::uiFor(
|
||||||
|
A_SyncOverride& target ) const noexcept
|
||||||
|
{
|
||||||
|
auto const* const rv{ sovuis_.get( target.type( ) ) };
|
||||||
|
return rv ? *rv : []( A_SyncOverride& , uint32_t& , T_StringBuilder& ) {
|
||||||
|
ImGui::Text( "(missing UI)" );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_UISync::makeOverridesWindow( )
|
||||||
|
{
|
||||||
|
if ( !ovWindow_ ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace ImGui;
|
||||||
|
auto const& dspSize( GetIO( ).DisplaySize );
|
||||||
|
SetNextWindowSize( ImVec2( dspSize.x * .25f , dspSize.y * .66f - 20 ) , ImGuiSetCond_Appearing );
|
||||||
|
SetNextWindowPos( ImVec2( 0 , 20 ) , ImGuiSetCond_Appearing );
|
||||||
|
Begin( "Input overrides" , &ovWindow_ ,
|
||||||
|
ImGuiWindowFlags_NoCollapse );
|
||||||
|
|
||||||
|
T_StringBuilder temp;
|
||||||
|
uint32_t counter{ 0 };
|
||||||
|
T_AutoArray< bool , 32 > stack;
|
||||||
|
bool found{ false };
|
||||||
|
using T_Ove_ = T_SyncOverrideVisitor::T_Element;
|
||||||
|
Globals::Sync( ).visitOverrides( [&]( T_Ove_ element , bool exit ) {
|
||||||
|
// Display sections
|
||||||
|
if ( element.hasType< T_SyncOverrideSection* >( ) ) {
|
||||||
|
auto& sos( *element.value< T_SyncOverrideSection* >( ) );
|
||||||
|
if ( sos.title == "*root*" ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return HandleOverrideSection_( sos , exit , stack );
|
||||||
|
}
|
||||||
|
if ( exit ) {
|
||||||
|
HandleOverride_( *element.value< A_SyncOverride* >( ) ,
|
||||||
|
counter , temp );
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} );
|
||||||
|
|
||||||
|
if ( !found ) {
|
||||||
|
Text( "No overrides have been defined." );
|
||||||
|
}
|
||||||
|
|
||||||
|
End( );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void T_UISync::handleDragAndDrop(
|
||||||
|
ImVec2 const& move ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept
|
||||||
|
{
|
||||||
|
if ( mouseDelegate_ ) {
|
||||||
|
mouseDelegate_->handleDragAndDrop( move , modifiers , buttons );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_UISync::handleWheel(
|
||||||
|
const float wheel ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept
|
||||||
|
{
|
||||||
|
if ( mouseDelegate_ ) {
|
||||||
|
mouseDelegate_->handleWheel( wheel , modifiers , buttons );
|
||||||
|
}
|
||||||
|
}
|
55
ui-sync.hh
Normal file
55
ui-sync.hh
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#pragma once
|
||||||
|
#include "sync.hh"
|
||||||
|
#include "ui-mousectrl.hh"
|
||||||
|
|
||||||
|
|
||||||
|
class T_UISync : public A_MouseCtrl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
using F_Override = std::function<
|
||||||
|
void( A_SyncOverride& , uint32_t& , T_StringBuilder& ) >;
|
||||||
|
|
||||||
|
T_UISync( );
|
||||||
|
|
||||||
|
bool& overridesWindowEnabled( ) noexcept
|
||||||
|
{ return ovWindow_; }
|
||||||
|
void makeOverridesWindow( );
|
||||||
|
|
||||||
|
F_Override uiFor( A_SyncOverride& target ) const noexcept;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
void delegateMouse( T_String const& id ,
|
||||||
|
P_MouseCtrl delegate ) noexcept
|
||||||
|
{
|
||||||
|
mouseDelegateName_ = id;
|
||||||
|
mouseDelegate_ = std::move( delegate );
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearMouseDelegate( ) noexcept
|
||||||
|
{
|
||||||
|
mouseDelegateName_ = T_String{ };
|
||||||
|
mouseDelegate_ = P_MouseCtrl{ };
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isCurrentDelegate( T_String const& delegate ) noexcept
|
||||||
|
{ return mouseDelegateName_ == delegate; }
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
void handleDragAndDrop(
|
||||||
|
ImVec2 const& move ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept override;
|
||||||
|
void handleWheel(
|
||||||
|
float wheel ,
|
||||||
|
T_KeyboardModifiers modifiers ,
|
||||||
|
T_MouseButtons buttons ) noexcept override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool ovWindow_{ false };
|
||||||
|
T_String mouseDelegateName_{ };
|
||||||
|
T_OwnPtr< A_MouseCtrl > mouseDelegate_{ };
|
||||||
|
T_KeyValueTable< T_String , F_Override > sovuis_;
|
||||||
|
};
|
54
ui.cc
Normal file
54
ui.cc
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#include "externals.hh"
|
||||||
|
#include "odbg.hh"
|
||||||
|
#include "shaders.hh"
|
||||||
|
#include "texture.hh"
|
||||||
|
#include "ui.hh"
|
||||||
|
#include "ui-sync.hh"
|
||||||
|
#include "window.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct UIData_
|
||||||
|
{
|
||||||
|
T_Window window;
|
||||||
|
T_TextureManager textures;
|
||||||
|
T_ShaderManager shaders;
|
||||||
|
T_OutputDebugger odbg;
|
||||||
|
T_UISync sync;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::aligned_storage_t< sizeof( UIData_ ) , alignof( UIData_ ) > Instance_;
|
||||||
|
|
||||||
|
} // namespace <anon>
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void UI::Init( ) noexcept
|
||||||
|
{
|
||||||
|
new ((char*)&Instance_) UIData_( );
|
||||||
|
}
|
||||||
|
|
||||||
|
void UI::Shutdown( ) noexcept
|
||||||
|
{
|
||||||
|
((UIData_*)(char*)&Instance_)->~UIData_( );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define M_GET_( P ) ((UIData_*)(char*)&Instance_)->P
|
||||||
|
|
||||||
|
T_Window& UI::Window( ) noexcept
|
||||||
|
{ return M_GET_( window ); }
|
||||||
|
|
||||||
|
T_TextureManager& UI::Textures( ) noexcept
|
||||||
|
{ return M_GET_( textures ); }
|
||||||
|
|
||||||
|
T_ShaderManager& UI::Shaders( ) noexcept
|
||||||
|
{ return M_GET_( shaders ); }
|
||||||
|
|
||||||
|
T_OutputDebugger& UI::ODbg( ) noexcept
|
||||||
|
{ return M_GET_( odbg ); }
|
||||||
|
|
||||||
|
T_UISync& UI::Sync( ) noexcept
|
||||||
|
{ return M_GET_( sync ); }
|
29
ui.hh
Normal file
29
ui.hh
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
#ifndef REAL_BUILD
|
||||||
|
# include "externals.hh"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct T_Window;
|
||||||
|
struct T_TextureManager;
|
||||||
|
struct T_ShaderManager;
|
||||||
|
struct T_OutputDebugger;
|
||||||
|
struct T_UISync;
|
||||||
|
|
||||||
|
|
||||||
|
struct UI : public ebcl::A_PrivateImplementation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Init( ) noexcept;
|
||||||
|
static void Shutdown( ) noexcept;
|
||||||
|
|
||||||
|
static T_Window& Window( ) noexcept;
|
||||||
|
static T_TextureManager& Textures( ) noexcept;
|
||||||
|
static T_ShaderManager& Shaders( ) noexcept;
|
||||||
|
static T_OutputDebugger& ODbg( ) noexcept;
|
||||||
|
static T_UISync& Sync( ) noexcept;
|
||||||
|
|
||||||
|
private:
|
||||||
|
UI( ) noexcept;
|
||||||
|
NO_COPY( UI );
|
||||||
|
NO_MOVE( UI );
|
||||||
|
};
|
|
@ -33,6 +33,15 @@ struct T_Window
|
||||||
void actionMenu( T_String const& id ) const noexcept;
|
void actionMenu( T_String const& id ) const noexcept;
|
||||||
void actionButton( T_String const& id ) const noexcept;
|
void actionButton( T_String const& id ) const noexcept;
|
||||||
|
|
||||||
|
template< typename... Args >
|
||||||
|
T_UIAction& newAction( Args&&... args )
|
||||||
|
{
|
||||||
|
T_UIAction a{ std::forward< Args >( args ) ... };
|
||||||
|
T_String id{ a.id };
|
||||||
|
addAction( std::move( a ) );
|
||||||
|
return *actions_.get( id );
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
ImFont* defaultFont( ) const noexcept
|
ImFont* defaultFont( ) const noexcept
|
||||||
|
|
Loading…
Reference in a new issue