@@ -386,47 +386,65 @@ void imguiManager::WidgetAddObject()
}
ImGui : : SameLine ( ) ;
ImGui : : Text ( " Number of cubes: %d " , app_ - > get_cube_count ( ) ) ;
ImGui : : Text ( " Number of cubes: %d " , 1 ) ;
}
}
void imguiManager : : WidgetObjectWindow ( )
{
ImGui : : Begin ( " Objects " , & showObjectWindow ) ;
// Obtenir toutes les entit<69> s avec un composant d'identit<69> et de transformation
auto entities = app_ - > get_entity_manager ( ) - > GetEntitiesWithComponent < ecs : : IdentityComponent > ( ) ;
int index = 0 ;
for ( auto & object : app_ - > get_kobjects ( ) )
for ( auto & entity : entities )
{
std : : string headerName = object - > GetName ( ) + " " + std : : to_string ( index ) ;
auto identity = entity - > GetComponent < ecs : : IdentityComponent > ( ) ;
auto transform = entity - > GetComponent < ecs : : TransformComponent > ( ) ;
auto render = entity - > GetComponent < ecs : : RenderComponent > ( ) ;
auto shader = entity - > GetComponent < ecs : : ShaderComponent > ( ) ;
auto physics = entity - > GetComponent < ecs : : PhysicsComponent > ( ) ;
if ( identity & & transform )
{
std : : string headerName = identity - > GetName ( ) + " " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : CollapsingHeader ( headerName . c_str ( ) ) )
{
XMVECTOR position = object - > GetPosition ( ) ;
XMVECTOR rotation = object - > GetRotation ( ) ;
XMVECTOR scale = object - > GetScale ( ) ;
// Position, Rotation, Scale
XMVECTOR position = transform - > GetPosition ( ) ;
XMVECTOR rotation = transform - > GetRotation ( ) ;
XMVECTOR scale = transform - > GetScale ( ) ;
float pos [ 3 ] = { XMVectorGetX ( position ) , XMVectorGetY ( position ) , XMVectorGetZ ( position ) } ;
std : : string posLabel = " Position## " + std : : to_string ( in dex ) ;
std : : string posLabel = " Position## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : DragFloat3 ( posLabel . c_str ( ) , pos ) )
{
object - > SetPosition ( XMVectorSet ( pos [ 0 ] , pos [ 1 ] , pos [ 2 ] , 0.0f ) ) ;
transform - > SetPosition ( XMVectorSet ( pos [ 0 ] , pos [ 1 ] , pos [ 2 ] , 0.0f ) ) ;
transform - > UpdateWorldMatrix ( ) ;
}
float rot [ 3 ] = { XMVectorGetX ( rotation ) , XMVectorGetY ( rotation ) , XMVectorGetZ ( rotation ) } ;
std : : string rotLabel = " Rotation## " + std : : to_string ( in dex ) ;
std : : string rotLabel = " Rotation## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : DragFloat3 ( rotLabel . c_str ( ) , rot ) )
{
object - > SetRotation ( XMVectorSet ( rot [ 0 ] , rot [ 1 ] , rot [ 2 ] , 0.0f ) ) ;
transform - > SetRotation ( XMVectorSet ( rot [ 0 ] , rot [ 1 ] , rot [ 2 ] , 0.0f ) ) ;
transform - > UpdateWorldMatrix ( ) ;
}
float scl [ 3 ] = { XMVectorGetX ( scale ) , XMVectorGetY ( scale ) , XMVectorGetZ ( scale ) } ;
std : : string sclLabel = " Scale## " + std : : to_string ( in dex ) ;
std : : string sclLabel = " Scale## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : DragFloat3 ( sclLabel . c_str ( ) , scl ) )
{
object - > SetScale ( XMVectorSet ( scl [ 0 ] , scl [ 1 ] , scl [ 2 ] , 0.0f ) ) ;
transform - > SetScale ( XMVectorSet ( scl [ 0 ] , scl [ 1 ] , scl [ 2 ] , 0.0f ) ) ;
transform - > UpdateWorldMatrix ( ) ;
}
ImGui : : Separator ( ) ;
// Textures - Seulement si le composant de rendu existe
if ( render & & render - > GetModel ( ) )
{
// D<> finir les types de textures_
std : : vector < std : : string > textureCategories = {
" Diffuse " , " Normal " , " Specular " , " Alpha "
@@ -438,7 +456,8 @@ void imguiManager::WidgetObjectWindow()
} ;
// Cr<43> er un espace pour afficher les textures_ avec d<> filement
ImGui : : BeginChild ( " TextureChild " , ImVec2 ( 0 , 200 ) , true , ImGuiWindowFlags_HorizontalScrollbar ) ;
std : : string textureChildId = " TextureChild## " + std : : to_string ( identity - > GetId ( ) ) ;
ImGui : : BeginChild ( textureChildId . c_str ( ) , ImVec2 ( 0 , 200 ) , true , ImGuiWindowFlags_HorizontalScrollbar ) ;
// Pour chaque type de texture
for ( int typeIndex = 0 ; typeIndex < textureCategories . size ( ) ; typeIndex + + )
@@ -447,25 +466,27 @@ void imguiManager::WidgetObjectWindow()
std : : string typeName = textureCategories [ typeIndex ] ;
// Afficher le titre de la cat<61> gorie
std : : string categoryLabel = typeName + " ## " + std : : to_string ( identity - > GetId ( ) ) ;
ImGui : : Text ( " %s: " , typeName . c_str ( ) ) ;
ImGui : : SameLine ( ) ;
// Compter combien de textures_ de ce type existent
int textureCount = 0 ;
while ( object - > g et_m odel( ) - > GetTexture ( type , textureCount ) ! = nullptr )
while ( render - > G etM odel( ) - > GetTexture ( type , textureCount ) ! = nullptr )
{
textureCount + + ;
}
// Afficher toutes les textures_ existantes
std : : string groupId = " TextureGroup_ " + std : : to_string ( identity - > GetId ( ) ) + " _ " + std : : to_string ( typeIndex ) ;
ImGui : : BeginGroup ( ) ;
for ( int texIndex = 0 ; texIndex < textureCount ; texIndex + + )
{
ID3D11ShaderResourceView * texture = object - > g et_m odel( ) - > GetTexture ( type , texIndex ) ;
ID3D11ShaderResourceView * texture = render - > G etM odel( ) - > GetTexture ( type , texIndex ) ;
if ( texture )
{
// ID unique pour chaque bouton de texture
std : : string buttonId = " tex## " + std : : to_string ( in dex ) + " _ " +
std : : string buttonId = " tex## " + std : : to_string ( identity - > GetId ( ) ) + " _ " +
std : : to_string ( typeIndex ) + " _ " +
std : : to_string ( texIndex ) ;
@@ -473,12 +494,11 @@ void imguiManager::WidgetObjectWindow()
{
// Ouvrir une bo<62> te de dialogue pour changer la texture
OPENFILENAME ofn ;
WCHAR szFile [ 260 ] ;
WCHAR szFile [ 260 ] = { 0 } ;
ZeroMemory ( & ofn , sizeof ( ofn ) ) ;
ofn . lStructSize = sizeof ( ofn ) ;
ofn . hwndOwner = NULL ;
ofn . lpstrFile = szFile ;
szFile [ 0 ] = ' \0 ' ;
ofn . nMaxFile = sizeof ( szFile ) ;
ofn . lpstrFilter = L " Texture \0 *.png;*.jpg;*.dds \0 " ;
ofn . nFilterIndex = 1 ;
@@ -488,7 +508,7 @@ void imguiManager::WidgetObjectWindow()
if ( GetOpenFileName ( & ofn ) )
{
// Changer la texture existante
object - > g et_m odel( ) - > ChangeTexture ( m_device , m_deviceContext , ofn . lpstrFile , type , texIndex ) ;
render - > G etM odel( ) - > ChangeTexture ( m_device , m_deviceContext , ofn . lpstrFile , type , texIndex ) ;
}
}
@@ -506,17 +526,16 @@ void imguiManager::WidgetObjectWindow()
}
// Bouton pour ajouter une nouvelle texture
std : : string addButtonLabel = " +## " + std : : to_string ( in dex ) + " _ " + std : : to_string ( typeIndex ) ;
std : : string addButtonLabel = " +## " + std : : to_string ( identity - > GetId ( ) ) + " _ " + std : : to_string ( typeIndex ) ;
if ( ImGui : : Button ( addButtonLabel . c_str ( ) , ImVec2 ( 48 , 48 ) ) )
{
// Ouvrir une bo<62> te de dialogue pour ajouter une texture
OPENFILENAME ofn ;
WCHAR szFile [ 260 ] ;
WCHAR szFile [ 260 ] = { 0 } ;
ZeroMemory ( & ofn , sizeof ( ofn ) ) ;
ofn . lStructSize = sizeof ( ofn ) ;
ofn . hwndOwner = NULL ;
ofn . lpstrFile = szFile ;
szFile [ 0 ] = ' \0 ' ;
ofn . nMaxFile = sizeof ( szFile ) ;
ofn . lpstrFilter = L " Texture \0 *.png;*.jpg;*.dds \0 " ;
ofn . nFilterIndex = 1 ;
@@ -526,7 +545,7 @@ void imguiManager::WidgetObjectWindow()
if ( GetOpenFileName ( & ofn ) )
{
// Ajouter une nouvelle texture
object - > g et_m odel( ) - > AddTexture ( m_device , m_deviceContext , ofn . lpstrFile , type ) ;
render - > G etM odel( ) - > AddTexture ( m_device , m_deviceContext , ofn . lpstrFile , type ) ;
}
}
@@ -535,19 +554,25 @@ void imguiManager::WidgetObjectWindow()
}
ImGui : : EndChild ( ) ;
ImGui : : Separator ( ) ;
// Delete button
std : : string deleteLabel = " Delete## " + std : : to_string ( index ) ;
if ( ImGui : : Button ( deleteLabel . c_str ( ) ) )
{
app_ - > delete_kobject ( index ) ;
}
ImGui : : Separator ( ) ;
// Liste des opti ons
// Delete butt on
std : : string deleteLabel = " Delete## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : Button ( deleteLabel . c_str ( ) ) )
{
app_ - > delete_entity_by_id ( identity - > GetId ( ) ) ;
// Sortir du boucle apr<70> s suppression pour <20> viter des acc<63> s invalides
break ;
}
ImGui : : Separator ( ) ;
// Shader options
if ( shader )
{
// Liste des options de shader
const char * shaderOptions [ ] = {
" Enable Global Lighting " ,
" Enable Lighting " ,
@@ -557,30 +582,41 @@ void imguiManager::WidgetObjectWindow()
" Enable Alpha Mapping "
} ;
ShaderType shaderTypes [ ] = {
ShaderType : : SUNLIGHT ,
ShaderType : : LIGHTING ,
ShaderType : : CEL_SHADING ,
ShaderType : : NORMAL_MAPPING ,
ShaderType : : SPECULAR_MAPPING ,
ShaderType : : ALPHA_MAPPING
std : : vector < ecs : : ShaderType > shaderTypes = {
ecs : : ShaderType : : SUNLIGHT ,
ecs : : ShaderType : : LIGHTING ,
ecs : : ShaderType : : CEL_SHADING ,
ecs : : ShaderType : : NORMAL_MAPPING ,
ecs : : ShaderType : : SPECULAR_MAPPING ,
ecs : : ShaderType : : ALPHA_MAPPING
} ;
// Variable pour stocker l'option s<> lectionn<6E> e
static int currentShader = 0 ; // Index de l'option actuellement s<> lectionn<6E> e
// Trouver l'index actuel du shader pour cette entit<69> sp<73> cifiqu e
int currentShader = 0 ;
ecs : : ShaderType activeShader = shader - > GetActiveShader ( ) ;
for ( size_t i = 0 ; i < shaderTypes . size ( ) ; i + + )
{
if ( shaderTypes [ i ] = = activeShader )
{
currentShader = static_cast < int > ( i ) ;
break ;
}
}
// Cr<43> ation du menu d<> roulant
if ( ImGui : : BeginCombo ( " Shader Options " , shaderOptions [ currentShader ] ) )
// Cr<43> ation du menu d<> roulant avec un ID unique pour chaque entit<69>
std : : string shaderComboId = " Shader Options## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : BeginCombo ( shaderComboId . c_str ( ) , shaderOptions [ currentShader ] ) )
{
for ( int i = 0 ; i < IM_ARRAYSIZE ( shaderOptions ) ; i + + )
{
// Cr<43> e une option s<> lectionnable pour chaque shader
// Cr<43> e une option s<> lectionnable pour chaque shader avec ID unique
std : : string shaderSelectableId = std : : to_string ( i ) + " ##shader_ " + std : : to_string ( identity - > GetId ( ) ) ;
bool isSelected = ( currentShader = = i ) ;
if ( ImGui : : Selectable ( shaderOptions [ i ] , isSelected ) )
{
// Met <20> jour l'option s<> lectionn<6E> e
// Met <20> jour l'option s<> lectionn<6E> e uniquement pour cette entit<69>
currentShader = i ;
object - > SetActiveShader ( shaderTypes [ i ] ) ;
shader - > SetActiveShader ( shaderTypes [ i ] ) ;
}
// Si l'option s<> lectionn<6E> e est active, nous mettons en surbrillance
@@ -589,88 +625,75 @@ void imguiManager::WidgetObjectWindow()
}
ImGui : : EndCombo ( ) ;
}
}
ImGui : : Separator ( ) ;
// p hysics
std : : string physicsLabel = " physics## " + std : : to_string ( index ) ;
// P hysics
bool isPhysicsEnabled = ( physics ! = nullptr ) ;
std : : string physicsLabel = " Physics## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : Checkbox ( physicsLabel . c_str ( ) , & m_ isPhyi scsEnabled) )
if ( ImGui : : Checkbox ( physicsLabel . c_str ( ) , & isPhysi csEnabled ) )
{
object - > SetPhysicsEnabled ( m_isPhyiscsEnabled ) ;
if ( isPhysicsEnabled & & ! physics )
{
// Ajouter un composant de physique
physics = entity - > AddComponent < ecs : : PhysicsComponent > ( ) ;
physics - > Initialize ( ) ;
}
else if ( ! isPhysicsEnabled & & physics )
{
// Retirer le composant de physique
entity - > RemoveComponent < ecs : : PhysicsComponent > ( ) ;
physics = nullptr ;
}
}
if ( physics )
{
// Gravity Enabled checkbox
std : : string gravityLabel = " Gravity## " + std : : to_string ( index ) ;
if ( ImGui : : Checkbox ( gravityLabel . c_str ( ) , & object - > m_gravityEnabled ) )
bool gravityEnabled = physics - > IsGravityEnabled ( ) ;
std : : string gravityLabel = " Gravity## " + std : : to_string ( identity - > GetId ( ) ) ;
if ( ImGui : : Checkbox ( gravityLabel . c_str ( ) , & gravityEnabled ) )
{
object - > SetGravityEnabled ( object - > m_ gravityEnabled) ;
physics - > SetGravityEnabled ( gravityEnabled ) ;
}
// 3 radio buttons pour le type d'objet physique avec IDs uniques
std : : string typeLabel = " Type## " + std : : to_string ( identity - > GetId ( ) ) ;
ecs : : ObjectType type = identity - > GetType ( ) ;
// 3 r adio b utton on the same line to set the ObjectType
std : : string typeLabel = " Type## " + std : : to_string ( index ) ;
ObjectType type = object - > GetType ( ) ;
if ( ImGui : : RadioButton ( " None " , type = = ObjectType : : Unknown ) )
if ( ImGui : : R adioB utton( ( " None## " + std : : to_string ( identity - > GetId ( ) ) ) . c_str ( ) ,
type = = ecs : : ObjectType : : Unknown ) )
{
object - > SetType ( ObjectType : : Unknown ) ;
identity - > SetType ( ecs : : ObjectType: : Unknown ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : RadioButton ( " Cube " , type = = ObjectType : : Cube ) )
if ( ImGui : : RadioButton ( ( " Cube## " + std : : to_string ( identity - > GetId ( ) ) ) . c_str ( ) ,
type = = ecs : : ObjectType : : Cube ) )
{
object - > SetType ( ObjectType : : Cube ) ;
identity - > SetType ( ecs : : ObjectType: : Cube ) ;
}
ImGui : : SameLine ( ) ;
if ( ImGui : : RadioButton ( " Sphere " , type = = ObjectType : : Sphere ) )
if ( ImGui : : RadioButton ( ( " Sphere## " + std : : to_string ( identity - > GetId ( ) ) ) . c_str ( ) ,
type = = ecs : : ObjectType : : Sphere ) )
{
object - > SetType ( ObjectType : : Sphere ) ;
}
// button to launch the object
std : : string launchLabel = " Launch## " + std : : to_string ( index ) ;
// paraeter to set the alpha, initial stretch and spring constant
float alpha = object - > GetAlpha ( ) ;
float initialStretch = object - > GetInitialStretch ( ) ;
float springConstant = object - > GetSpringConstant ( ) ;
if ( ImGui : : DragFloat ( " Alpha## " , & alpha , 0.01f , 0.0f , 1.0f ) )
{
object - > SetAlpha ( alpha ) ;
}
if ( ImGui : : DragFloat ( " Initial Stretch## " , & initialStretch , 0.01f , 0.0f , 1.0f ) )
{
object - > SetInitialStretch ( initialStretch ) ;
}
if ( ImGui : : DragFloat ( " Spring Constant## " , & springConstant , 0.01f , 0.0f , 100.0f ) )
{
object - > SetSpringConstant ( springConstant ) ;
}
if ( ImGui : : Button ( launchLabel . c_str ( ) ) )
{
object - > LaunchObject ( ) ;
identity - > SetType ( ecs : : ObjectType: : Sphere ) ;
}
ImGui : : SameLine ( ) ;
// button to stop the object
std : : string stopLabel = " Stop## " + std : : to_string ( index ) ;
if ( ImGui : : Button ( stopLabel . c_str ( ) ) )
if ( ImGui : : RadioButton ( ( " Terrain## " + std : : to_string ( identity - > GetId ( ) ) ) . c_str ( ) ,
type = = ecs : : ObjectType : : Terrain ) )
{
object - > SetVelocity ( XMVectorSet ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ;
object - > SetPosition ( XMVectorSet ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ;
identity - > SetType ( ecs : : ObjectType : : Terrain ) ;
}
}
ImGui : : Separator ( ) ;
// Demo spinning
std : : string demoLabel = " Demo spinning## " + std : : to_string ( index ) ;
ImGui : : Checkbox ( demoLabel . c_str ( ) , & object - > m_demoSpinning ) ;
}
index + + ;
}
}
ImGui : : End ( ) ;
}
@@ -679,7 +702,7 @@ void imguiManager::WidgetTerrainWindow()
{
ImGui : : Begin ( " Terrain " , & showTerrainWindow ) ;
ImGui : : Text ( " Number of terrain cubes: %d " , app_ - > get_terrain_cube_count ( ) ) ;
ImGui : : Text ( " Number of terrain cubes: %d " , 1 ) ;
ImGui : : Separator ( ) ;
@@ -1107,3 +1130,4 @@ void imguiManager::WidgetRenderStats()
ImGui : : End ( ) ;
}