Changeset 383

Show
Ignore:
Timestamp:
09/18/11 23:16:39 (8 months ago)
Author:
Carsten
Message:

Model Editor: Added support for model skins.

Closes #86.

Location:
cafu/trunk
Files:
2 added
23 modified

Legend:

Unmodified
Added
Removed
  • cafu/trunk/CaWE/ModelEditor/ChildFrame.cpp

    r375 r383  
    3131#include "SceneView3D.hpp" 
    3232#include "ScenePropGrid.hpp" 
     33#include "SkinsList.hpp" 
    3334#include "SubmodelsList.hpp" 
    3435#include "TransformDialog.hpp" 
     
    8990      m_AnimsList(NULL), 
    9091      m_AnimInspector(NULL), 
     92      m_SkinsList(NULL), 
    9193      m_GuiFixturesList(NULL), 
    9294      m_GuiFixtureInspector(NULL), 
     
    144146    ViewMenu->AppendCheckItem(ID_MENU_VIEW_AUIPANE_GUIFIXTURES_LIST,     "GUI Fixtures List",     "Show or hide the GUI fixtures list"); 
    145147    ViewMenu->AppendCheckItem(ID_MENU_VIEW_AUIPANE_GUIFIXTURE_INSPECTOR, "GUI Fixture Inspector", "Show or hide the GUI fixture inspector"); 
     148    ViewMenu->AppendCheckItem(ID_MENU_VIEW_AUIPANE_SKINS_LIST,           "Skins List",            "Show or hide the skins list"); 
    146149    ViewMenu->AppendSeparator(); 
    147150    ViewMenu->AppendCheckItem(ID_MENU_VIEW_AUIPANE_SCENE_SETUP,          "Scene Setup",           "Show or hide the scene setup inspector"); 
     
    241244                         Name("SubmodelsPanel").Caption("Submodels List"). 
    242245                         Right().Position(1)); 
     246 
     247    m_SkinsList=new SkinsPanelT(this, wxSize(230, 150)); 
     248    m_AUIManager.AddPane(m_SkinsList, wxAuiPaneInfo(). 
     249                         Name("SkinsList").Caption("Skins List"). 
     250                         Right().Position(2)); 
    243251 
    244252    m_TransformDialog=new TransformDialogT(this, wxSize(248, 240)); 
     
    715723        case ID_MENU_VIEW_AUIPANE_ANIMS_LIST:           PaneToggleShow(m_AUIManager.GetPane(m_AnimsList          )); break; 
    716724        case ID_MENU_VIEW_AUIPANE_ANIM_INSPECTOR:       PaneToggleShow(m_AUIManager.GetPane(m_AnimInspector      )); break; 
     725        case ID_MENU_VIEW_AUIPANE_SKINS_LIST:           PaneToggleShow(m_AUIManager.GetPane(m_SkinsList          )); break; 
    717726        case ID_MENU_VIEW_AUIPANE_GUIFIXTURES_LIST:     PaneToggleShow(m_AUIManager.GetPane(m_GuiFixturesList    )); break; 
    718727        case ID_MENU_VIEW_AUIPANE_GUIFIXTURE_INSPECTOR: PaneToggleShow(m_AUIManager.GetPane(m_GuiFixtureInspector)); break; 
     
    747756        case ID_MENU_VIEW_AUIPANE_ANIMS_LIST:           UE.Check(m_AUIManager.GetPane(m_AnimsList          ).IsShown()); break; 
    748757        case ID_MENU_VIEW_AUIPANE_ANIM_INSPECTOR:       UE.Check(m_AUIManager.GetPane(m_AnimInspector      ).IsShown()); break; 
     758        case ID_MENU_VIEW_AUIPANE_SKINS_LIST:           UE.Check(m_AUIManager.GetPane(m_SkinsList          ).IsShown()); break; 
    749759        case ID_MENU_VIEW_AUIPANE_GUIFIXTURES_LIST:     UE.Check(m_AUIManager.GetPane(m_GuiFixturesList    ).IsShown()); break; 
    750760        case ID_MENU_VIEW_AUIPANE_GUIFIXTURE_INSPECTOR: UE.Check(m_AUIManager.GetPane(m_GuiFixtureInspector).IsShown()); break; 
  • cafu/trunk/CaWE/ModelEditor/ChildFrame.hpp

    r354 r383  
    4444    class ScenePropGridT; 
    4545    class SceneView3DT; 
     46    class SkinsPanelT; 
    4647    class SubmodelsPanelT; 
    4748    class TransformDialogT; 
     
    7980 
    8081        /// Sets the type of the most recently used (clicked) model element. 
    81         void SetLastUsedType(ModelElementTypeT Type) { wxASSERT(Type<4); m_LastUsedType=Type; } 
     82        void SetLastUsedType(ModelElementTypeT Type) { wxASSERT(Type<5); m_LastUsedType=Type; } 
    8283 
    8384        ModelDocumentT* GetModelDoc() const { return m_ModelDoc; } 
     
    109110        ElementsPanelT*    m_AnimsList; 
    110111        AnimInspectorT*    m_AnimInspector; 
     112        SkinsPanelT*       m_SkinsList; 
    111113        ElementsPanelT*    m_GuiFixturesList; 
    112114        GuiFixInspectorT*  m_GuiFixtureInspector; 
     
    132134            ID_MENU_VIEW_AUIPANE_ANIMS_LIST, 
    133135            ID_MENU_VIEW_AUIPANE_ANIM_INSPECTOR, 
     136            ID_MENU_VIEW_AUIPANE_SKINS_LIST, 
    134137            ID_MENU_VIEW_AUIPANE_GUIFIXTURES_LIST, 
    135138            ID_MENU_VIEW_AUIPANE_GUIFIXTURE_INSPECTOR, 
  • cafu/trunk/CaWE/ModelEditor/Commands/Add.cpp

    r334 r383  
    2727 
    2828 
     29CommandAddT::CommandAddT(ModelDocumentT* ModelDoc, const CafuModelT::SkinT& Skin) 
     30    : m_ModelDoc(ModelDoc), 
     31      m_Type(SKIN), 
     32      m_Skins() 
     33{ 
     34    m_Skins.PushBack(Skin); 
     35} 
     36 
     37 
    2938CommandAddT::CommandAddT(ModelDocumentT* ModelDoc, const ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures) 
    3039    : m_ModelDoc(ModelDoc), 
    3140      m_Type(GFIX), 
    32    // m_Joints(), 
    33    // m_Meshes(), 
    34    // m_DrawMs(), 
    35    // m_Anims(), 
    3641      m_GuiFixtures(GuiFixtures) 
    3742{ 
     
    4651    ArrayT<unsigned int> Indices; 
    4752 
    48     for (unsigned long GFixNr=0; GFixNr<m_GuiFixtures.Size(); GFixNr++) 
     53    switch (m_Type) 
    4954    { 
    50         Indices.PushBack(m_ModelDoc->GetModel()->m_GuiFixtures.Size()); 
    51         m_ModelDoc->GetModel()->m_GuiFixtures.PushBack(m_GuiFixtures[GFixNr]); 
     55        case SKIN: 
     56            for (unsigned long SkinNr=0; SkinNr<m_Skins.Size(); SkinNr++) 
     57            { 
     58                Indices.PushBack(m_ModelDoc->GetModel()->m_Skins.Size()); 
     59                m_ModelDoc->GetModel()->m_Skins.PushBack(m_Skins[SkinNr]); 
     60            } 
     61            break; 
     62 
     63        case GFIX: 
     64            for (unsigned long GFixNr=0; GFixNr<m_GuiFixtures.Size(); GFixNr++) 
     65            { 
     66                Indices.PushBack(m_ModelDoc->GetModel()->m_GuiFixtures.Size()); 
     67                m_ModelDoc->GetModel()->m_GuiFixtures.PushBack(m_GuiFixtures[GFixNr]); 
     68            } 
     69            break; 
     70 
     71        default: 
     72            break; 
    5273    } 
    5374 
     
    6990    ArrayT<unsigned int> Indices; 
    7091 
    71     for (unsigned long GFixNr=0; GFixNr<m_GuiFixtures.Size(); GFixNr++) 
     92    switch (m_Type) 
    7293    { 
    73         m_ModelDoc->GetModel()->m_GuiFixtures.DeleteBack(); 
    74         Indices.InsertAt(0, m_ModelDoc->GetModel()->m_GuiFixtures.Size()); 
     94        case SKIN: 
     95            for (unsigned long SkinNr=0; SkinNr<m_Skins.Size(); SkinNr++) 
     96            { 
     97                m_ModelDoc->GetModel()->m_Skins.DeleteBack(); 
     98                Indices.InsertAt(0, m_ModelDoc->GetModel()->m_Skins.Size()); 
     99            } 
     100            break; 
     101 
     102        case GFIX: 
     103            for (unsigned long GFixNr=0; GFixNr<m_GuiFixtures.Size(); GFixNr++) 
     104            { 
     105                m_ModelDoc->GetModel()->m_GuiFixtures.DeleteBack(); 
     106                Indices.InsertAt(0, m_ModelDoc->GetModel()->m_GuiFixtures.Size()); 
     107            } 
     108            break; 
     109 
     110        default: 
     111            break; 
    75112    } 
    76113 
  • cafu/trunk/CaWE/ModelEditor/Commands/Add.hpp

    r334 r383  
    3838        public: 
    3939 
     40        CommandAddT(ModelDocumentT* ModelDoc, const CafuModelT::SkinT& Skin); 
    4041        CommandAddT(ModelDocumentT* ModelDoc, const ArrayT<CafuModelT::GuiFixtureT>& GuiFixtures); 
    4142 
     
    5455     // ArrayT<MatSys::MeshT>           m_DrawMs;       ///< The draw meshes related to m_Meshes. 
    5556     // ArrayT<CafuModelT::AnimT>       m_Anims;        ///< The added anims (if m_Type==ANIM). 
     57        ArrayT<CafuModelT::SkinT>       m_Skins;        ///< The added skins (if m_Type==SKIN). 
    5658        ArrayT<CafuModelT::GuiFixtureT> m_GuiFixtures;  ///< The added GUI fixtures (if m_Type==GFIX). 
    5759    }; 
  • cafu/trunk/CaWE/ModelEditor/Commands/Delete.cpp

    r334 r383  
    6363      m_Indices(GetSorted(Indices)), 
    6464      m_Joints(), 
    65       m_Meshes(), 
    66       m_DrawMs(), 
     65      m_MeshInfos(), 
    6766      m_Anims(), 
     67      m_Skins(), 
    6868      m_GuiFixtures(), 
    6969      m_Message(), 
     
    7676        switch (m_Type) 
    7777        { 
    78             case JOINT: m_Joints     .PushBack(m_ModelDoc->GetModel()->GetJoints()[i]); break; 
    79             case MESH:  m_Meshes     .PushBack(m_ModelDoc->GetModel()->GetMeshes()[i]); 
    80                         m_DrawMs     .PushBack(m_ModelDoc->GetModel()->m_Draw_Meshes[i]); break; 
    81             case ANIM:  m_Anims      .PushBack(m_ModelDoc->GetModel()->GetAnims()[i]); break; 
     78            case JOINT: m_Joints     .PushBack(m_ModelDoc->GetModel()->GetJoints()     [i]); break; 
     79            case ANIM:  m_Anims      .PushBack(m_ModelDoc->GetModel()->GetAnims()      [i]); break; 
     80            case SKIN:  m_Skins      .PushBack(m_ModelDoc->GetModel()->GetSkins()      [i]); break; 
    8281            case GFIX:  m_GuiFixtures.PushBack(m_ModelDoc->GetModel()->GetGuiFixtures()[i]); break; 
     82            case MESH: 
     83            { 
     84                wxASSERT(m_MeshInfos.Size() == INr); 
     85                m_MeshInfos.PushBackEmpty(); 
     86                MeshInfoT& MI=m_MeshInfos[m_MeshInfos.Size()-1]; 
     87 
     88                MI.Mesh    =m_ModelDoc->GetModel()->GetMeshes()[i]; 
     89                MI.DrawMesh=m_ModelDoc->GetModel()->m_Draw_Meshes[i]; 
     90 
     91                for (unsigned long SkinNr=0; SkinNr<m_ModelDoc->GetModel()->GetSkins().Size(); SkinNr++) 
     92                { 
     93                    MI.SkinsMaterials      .PushBack(m_ModelDoc->GetModel()->GetSkins()[SkinNr].Materials[i]); 
     94                    MI.SkinsRenderMaterials.PushBack(m_ModelDoc->GetModel()->GetSkins()[SkinNr].RenderMaterials[i]); 
     95                } 
     96                break; 
     97            } 
    8398        } 
    8499    } 
     
    90105    if (m_Done && MatSys::Renderer!=NULL) 
    91106    { 
    92         for (unsigned long MeshNr=0; MeshNr<m_Meshes.Size(); MeshNr++) 
    93         { 
    94             MatSys::Renderer->FreeMaterial(m_Meshes[MeshNr].RenderMaterial); 
    95             m_Meshes[MeshNr].RenderMaterial=NULL; 
     107        for (unsigned long MeshInfoNr=0; MeshInfoNr<m_MeshInfos.Size(); MeshInfoNr++) 
     108        { 
     109            MeshInfoT& MI=m_MeshInfos[MeshInfoNr]; 
     110 
     111            MatSys::Renderer->FreeMaterial(MI.Mesh.RenderMaterial); 
     112            MI.Mesh.RenderMaterial=NULL; 
     113 
     114            for (unsigned long SkinNr=0; SkinNr<MI.SkinsRenderMaterials.Size(); SkinNr++) 
     115            { 
     116                MatSys::Renderer->FreeMaterial(MI.SkinsRenderMaterials[SkinNr]); 
     117                MI.SkinsRenderMaterials[SkinNr]=NULL; 
     118            } 
     119        } 
     120 
     121        for (unsigned long SkinNr=0; SkinNr<m_Skins.Size(); SkinNr++) 
     122        { 
     123            for (unsigned long MatNr=0; MatNr<m_Skins[SkinNr].RenderMaterials.Size(); MatNr++) 
     124            { 
     125                MatSys::Renderer->FreeMaterial(m_Skins[SkinNr].RenderMaterials[MatNr]); 
     126                m_Skins[SkinNr].RenderMaterials[MatNr]=NULL; 
     127            } 
    96128        } 
    97129    } 
     
    127159                if (m_Indices.Find(m_ModelDoc->GetModel()->GetGuiFixtures()[GFixNr].Points[PointNr].MeshNr)>=0) 
    128160                { 
    129                     m_Message="There are still GUI fixtures referring to the selected mesh(es). Please delete the GUI fixtures first, then delete the meshes."; 
     161                    m_Message="There are still GUI fixtures referring to the selected mesh(es). Delete the GUI fixtures first, then delete the meshes."; 
    130162                    return false; 
    131163                } 
     
    142174        { 
    143175            case JOINT: m_ModelDoc->GetModel()->m_Joints     .RemoveAtAndKeepOrder(i); break; 
    144             case MESH:  m_ModelDoc->GetModel()->m_Meshes     .RemoveAtAndKeepOrder(i); 
    145                         m_ModelDoc->GetModel()->m_Draw_Meshes.RemoveAtAndKeepOrder(i); break; 
    146176            case ANIM:  m_ModelDoc->GetModel()->m_Anims      .RemoveAtAndKeepOrder(i); break; 
     177            case SKIN:  m_ModelDoc->GetModel()->m_Skins      .RemoveAtAndKeepOrder(i); break; 
    147178            case GFIX:  m_ModelDoc->GetModel()->m_GuiFixtures.RemoveAtAndKeepOrder(i); break; 
     179            case MESH: 
     180            { 
     181                m_ModelDoc->GetModel()->m_Meshes     .RemoveAtAndKeepOrder(i); 
     182                m_ModelDoc->GetModel()->m_Draw_Meshes.RemoveAtAndKeepOrder(i); 
     183 
     184                for (unsigned long SkinNr=0; SkinNr<m_ModelDoc->GetModel()->GetSkins().Size(); SkinNr++) 
     185                { 
     186                    m_ModelDoc->GetModel()->m_Skins[SkinNr].Materials      .RemoveAtAndKeepOrder(i); 
     187                    m_ModelDoc->GetModel()->m_Skins[SkinNr].RenderMaterials.RemoveAtAndKeepOrder(i); 
     188                } 
     189                break; 
     190            } 
    148191        } 
    149192    } 
     
    171214        { 
    172215            case JOINT: m_ModelDoc->GetModel()->m_Joints     .InsertAt(i, m_Joints     [INr]); break; 
    173             case MESH:  m_ModelDoc->GetModel()->m_Meshes     .InsertAt(i, m_Meshes     [INr]); 
    174                         m_ModelDoc->GetModel()->m_Draw_Meshes.InsertAt(i, m_DrawMs     [INr]); break; 
    175216            case ANIM:  m_ModelDoc->GetModel()->m_Anims      .InsertAt(i, m_Anims      [INr]); break; 
     217            case SKIN:  m_ModelDoc->GetModel()->m_Skins      .InsertAt(i, m_Skins      [INr]); break; 
    176218            case GFIX:  m_ModelDoc->GetModel()->m_GuiFixtures.InsertAt(i, m_GuiFixtures[INr]); break; 
     219            case MESH: 
     220            { 
     221                const MeshInfoT& MI=m_MeshInfos[INr]; 
     222 
     223                m_ModelDoc->GetModel()->m_Meshes     .InsertAt(i, MI.Mesh); 
     224                m_ModelDoc->GetModel()->m_Draw_Meshes.InsertAt(i, MI.DrawMesh); 
     225 
     226                for (unsigned long SkinNr=0; SkinNr<m_ModelDoc->GetModel()->GetSkins().Size(); SkinNr++) 
     227                { 
     228                    m_ModelDoc->GetModel()->m_Skins[SkinNr].Materials      .InsertAt(i, MI.SkinsMaterials[SkinNr]); 
     229                    m_ModelDoc->GetModel()->m_Skins[SkinNr].RenderMaterials.InsertAt(i, MI.SkinsRenderMaterials[SkinNr]); 
     230                } 
     231                break; 
     232            } 
    177233        } 
    178234    } 
     
    199255        case MESH:  Name+=(m_Indices.Size()==1) ? "mesh"        : "meshes";       break; 
    200256        case ANIM:  Name+=(m_Indices.Size()==1) ? "animation"   : "animations";   break; 
     257        case SKIN:  Name+=(m_Indices.Size()==1) ? "skin"        : "skins";        break; 
    201258        case GFIX:  Name+=(m_Indices.Size()==1) ? "GUI fixture" : "GUI fixtures"; break; 
    202259    } 
  • cafu/trunk/CaWE/ModelEditor/Commands/Delete.hpp

    r334 r383  
    5151        private: 
    5252 
     53        struct MeshInfoT 
     54        { 
     55            CafuModelT::MeshT                Mesh;                  ///< The deleted mesh. 
     56            MatSys::MeshT                    DrawMesh;              ///< The draw mesh related to \c Mesh. 
     57            ArrayT<MaterialT*>               SkinsMaterials;        ///< The material in each skin for this mesh. 
     58            ArrayT<MatSys::RenderMaterialT*> SkinsRenderMaterials;  ///< The render material in each skin for this mesh. 
     59        }; 
     60 
    5361        ModelDocumentT*                 m_ModelDoc; 
    5462        const ModelElementTypeT         m_Type; 
    5563        const ArrayT<unsigned int>      m_Indices; 
    5664        ArrayT<CafuModelT::JointT>      m_Joints;           ///< The deleted joints (if m_Type==JOINT). 
    57         ArrayT<CafuModelT::MeshT>       m_Meshes;           ///< The deleted meshes (if m_Type==MESH). 
    58         ArrayT<MatSys::MeshT>           m_DrawMs;           ///< The draw meshes related to m_Meshes. 
     65        ArrayT<MeshInfoT>               m_MeshInfos;        ///< Information about the deleted meshes (if m_Type==MESH). 
    5966        ArrayT<CafuModelT::AnimT>       m_Anims;            ///< The deleted anims (if m_Type==ANIM). 
     67        ArrayT<CafuModelT::SkinT>       m_Skins;            ///< The deleted skins (if m_Type==SKIN). 
    6068        ArrayT<CafuModelT::GuiFixtureT> m_GuiFixtures;      ///< The deleted GUI fixtures (if m_Type==GFIX). 
    6169        wxString                        m_Message;          ///< Calling Do() may place an error or info message here that the caller is supposed to show to the user (when the command is first run). 
  • cafu/trunk/CaWE/ModelEditor/Commands/Rename.cpp

    r334 r383  
    7777        case MESH:  return "Rename mesh"; 
    7878        case ANIM:  return "Rename anim"; 
     79        case SKIN:  return "Rename skin"; 
    7980        case GFIX:  return "Rename GUI fixture"; 
    8081    } 
     
    9293        case MESH:  return m_ModelDoc->GetModel()->m_Meshes     [m_ElemNr].Name; 
    9394        case ANIM:  return m_ModelDoc->GetModel()->m_Anims      [m_ElemNr].Name; 
     95        case SKIN:  return m_ModelDoc->GetModel()->m_Skins      [m_ElemNr].Name; 
    9496        case GFIX:  return m_ModelDoc->GetModel()->m_GuiFixtures[m_ElemNr].Name; 
    9597    } 
     
    108110        case MESH:  m_ModelDoc->UpdateAllObservers_MeshChanged      (m_ElemNr); break; 
    109111        case ANIM:  m_ModelDoc->UpdateAllObservers_AnimChanged      (m_ElemNr); break; 
     112        case SKIN:  m_ModelDoc->UpdateAllObservers_SkinChanged      (m_ElemNr); break; 
    110113        case GFIX:  m_ModelDoc->UpdateAllObservers_GuiFixtureChanged(m_ElemNr); break; 
    111114    } 
  • cafu/trunk/CaWE/ModelEditor/Commands/SetMeshMaterial.cpp

    r305 r383  
    2929 
    3030 
    31 CommandSetMeshMaterialT::CommandSetMeshMaterialT(ModelDocumentT* ModelDoc, unsigned int MeshNr, const wxString& NewName) 
     31CommandSetMeshMaterialT::CommandSetMeshMaterialT(ModelDocumentT* ModelDoc, unsigned int MeshNr, int SkinNr, const wxString& NewName) 
    3232    : m_ModelDoc(ModelDoc), 
    3333      m_MeshNr(MeshNr), 
     34      m_SkinNr(SkinNr), 
    3435      m_NewMat(m_ModelDoc->GetModel()->GetMaterialManager().GetMaterial(NewName.ToStdString())), 
    35       m_OldMat(m_ModelDoc->GetModel()->GetMeshes()[m_MeshNr].Material) 
     36      m_OldMat(GetMaterial()) 
    3637{ 
    3738} 
     
    4950    if (m_NewMat==m_OldMat) return false; 
    5051 
    51     // Cannot keep a reference to m_ModelDoc->GetModel()->m_Meshes[m_MeshNr] as a member, 
     52    // Cannot keep a reference to m_ModelDoc->GetModel()->m_Meshes[m_MeshNr].Material as a member, 
    5253    // because it's bound to become invalid whenever another command meddles with the array of meshes. 
    53     CafuModelT::MeshT& Mesh=m_ModelDoc->GetModel()->m_Meshes[m_MeshNr]; 
    54  
    55     Mesh.Material=m_NewMat; 
     54    GetMaterial()=m_NewMat; 
    5655 
    5756    if (MatSys::Renderer!=NULL) 
    5857    { 
    59         MatSys::Renderer->FreeMaterial(Mesh.RenderMaterial); 
    60         Mesh.RenderMaterial=MatSys::Renderer->RegisterMaterial(Mesh.Material); 
     58        MatSys::Renderer->FreeMaterial(GetRenderMaterial()); 
     59        GetRenderMaterial()=MatSys::Renderer->RegisterMaterial(GetMaterial()); 
    6160    } 
    6261 
     
    7271    if (!m_Done) return; 
    7372 
    74     // Cannot keep a reference to m_ModelDoc->GetModel()->m_Meshes[m_MeshNr] as a member, 
     73    // Cannot keep a reference to m_ModelDoc->GetModel()->m_Meshes[m_MeshNr].Material as a member, 
    7574    // because it's bound to become invalid whenever another command meddles with the array of meshes. 
    76     CafuModelT::MeshT& Mesh=m_ModelDoc->GetModel()->m_Meshes[m_MeshNr]; 
    77  
    78     Mesh.Material=m_OldMat; 
     75    GetMaterial()=m_OldMat; 
    7976 
    8077    if (MatSys::Renderer!=NULL) 
    8178    { 
    82         MatSys::Renderer->FreeMaterial(Mesh.RenderMaterial); 
    83         Mesh.RenderMaterial=MatSys::Renderer->RegisterMaterial(Mesh.Material); 
     79        MatSys::Renderer->FreeMaterial(GetRenderMaterial()); 
     80        GetRenderMaterial()=MatSys::Renderer->RegisterMaterial(GetMaterial()); 
    8481    } 
    8582 
     
    8986 
    9087 
     88MaterialT*& CommandSetMeshMaterialT::GetMaterial() 
     89{ 
     90    if (m_SkinNr<0) 
     91        return m_ModelDoc->GetModel()->m_Meshes[m_MeshNr].Material; 
     92 
     93    return m_ModelDoc->GetModel()->m_Skins[m_SkinNr].Materials[m_MeshNr]; 
     94} 
     95 
     96 
     97MatSys::RenderMaterialT*& CommandSetMeshMaterialT::GetRenderMaterial() 
     98{ 
     99    if (m_SkinNr<0) 
     100        return m_ModelDoc->GetModel()->m_Meshes[m_MeshNr].RenderMaterial; 
     101 
     102    return m_ModelDoc->GetModel()->m_Skins[m_SkinNr].RenderMaterials[m_MeshNr]; 
     103} 
     104 
     105 
    91106wxString CommandSetMeshMaterialT::GetName() const 
    92107{ 
  • cafu/trunk/CaWE/ModelEditor/Commands/SetMeshMaterial.hpp

    r303 r383  
    2727 
    2828class MaterialT; 
     29namespace MatSys { class RenderMaterialT; } 
    2930 
    3031 
     
    3738        public: 
    3839 
    39         CommandSetMeshMaterialT(ModelDocumentT* ModelDoc, unsigned int MeshNr, const wxString& NewName); 
     40        CommandSetMeshMaterialT(ModelDocumentT* ModelDoc, unsigned int MeshNr, int SkinNr, const wxString& NewName); 
    4041 
    4142        // CommandT implementation. 
     
    4748        private: 
    4849 
    49         ModelDocumentT* m_ModelDoc; 
    50         unsigned int    m_MeshNr; 
    51         MaterialT*      m_NewMat; 
    52         MaterialT*      m_OldMat; 
     50        MaterialT*&               GetMaterial(); 
     51        MatSys::RenderMaterialT*& GetRenderMaterial(); 
     52 
     53        ModelDocumentT*    m_ModelDoc; 
     54        const unsigned int m_MeshNr; 
     55        const int          m_SkinNr; 
     56        MaterialT*         m_NewMat; 
     57        MaterialT*         m_OldMat; 
    5358    }; 
    5459} 
  • cafu/trunk/CaWE/ModelEditor/ElementTypes.hpp

    r334 r383  
    2626namespace ModelEditor 
    2727{ 
    28     /// Enumerates the types of the elements that a model is comprised of. 
     28    /// Enumerates the types of the elements that a model is composed of. 
    2929    enum ModelElementTypeT 
    3030    { 
     
    3232        MESH =1, 
    3333        ANIM =2, 
    34         GFIX =3 
     34        SKIN =3, 
     35        GFIX =4 
    3536    }; 
    3637} 
  • cafu/trunk/CaWE/ModelEditor/ElementsList.cpp

    r343 r383  
    7979{ 
    8080    if (m_IsRecursiveSelfNotify) return; 
     81    if (m_TYPE==MESH && Type==SKIN) { InitListItems(); return; } 
    8182    if (Type!=m_TYPE) return; 
    8283 
     
    131132 
    132133 
     134void ElementsListT::Notify_SkinChanged(SubjectT* Subject, unsigned int SkinNr) 
     135{ 
     136    if (m_IsRecursiveSelfNotify) return; 
     137 
     138    // Update the list of meshes also when a skin changed, as with each 
     139    // mesh we display the used material in the currently selected skin. 
     140    if (m_TYPE!=MESH) return; 
     141 
     142    InitListItems(); 
     143} 
     144 
     145 
    133146void ElementsListT::Notify_GuiFixtureChanged(SubjectT* Subject, unsigned int GuiFixtureNr) 
    134147{ 
     
    164177 
    165178        case MESH: 
     179        { 
     180            wxListItem Col; 
     181 
     182            GetColumn(2, Col); 
     183            Col.SetText(wxString::Format("Material (%s)", m_ModelDoc->GetSelSkinString())); 
     184            SetColumn(2, Col); 
     185 
    166186            for (unsigned long ElemNr=0; ElemNr<m_ModelDoc->GetModel()->GetMeshes().Size(); ElemNr++) 
    167187            { 
     188                const MaterialT* Mat=m_ModelDoc->GetModel()->GetMaterial(ElemNr, m_ModelDoc->GetSelSkinNr()); 
     189 
    168190                InsertItem(ElemNr, m_ModelDoc->GetModel()->GetMeshes()[ElemNr].Name); 
    169191                SetItem(ElemNr, 1, wxString::Format("%lu", ElemNr)); 
    170                 SetItem(ElemNr, 2, m_ModelDoc->GetModel()->GetMeshes()[ElemNr].Material->Name); 
     192                SetItem(ElemNr, 2, Mat ? Mat->Name : "<NULL>"); 
    171193 
    172194                if (Sel.Find(ElemNr)!=-1) Select(ElemNr); 
    173195            } 
    174196            break; 
     197        } 
    175198 
    176199        case ANIM: 
     
    182205                if (Sel.Find(ElemNr)!=-1) Select(ElemNr); 
    183206            } 
     207            break; 
     208 
     209        case SKIN: 
     210            wxASSERT(false); 
    184211            break; 
    185212 
  • cafu/trunk/CaWE/ModelEditor/ElementsList.hpp

    r343 r383  
    5151        void Notify_MeshChanged(SubjectT* Subject, unsigned int MeshNr); 
    5252        void Notify_AnimChanged(SubjectT* Subject, unsigned int AnimNr); 
     53        void Notify_SkinChanged(SubjectT* Subject, unsigned int SkinNr); 
    5354        void Notify_GuiFixtureChanged(SubjectT* Subject, unsigned int GuiFixtureNr); 
    5455        void Notify_SubjectDies(SubjectT* dyingSubject); 
  • cafu/trunk/CaWE/ModelEditor/MeshInspector.cpp

    r322 r383  
    118118{ 
    119119    if (m_IsRecursiveSelfNotify) return; 
    120     if (Type!=MESH) return; 
     120 
     121    // Update the mesh also when a skin changed, as the material that 
     122    // is used for this mesh depends on the currently selected skin. 
     123    if (Type!=MESH && Type!=SKIN) return; 
    121124 
    122125    RefreshPropGrid(); 
     
    128131    if (m_IsRecursiveSelfNotify) return; 
    129132 
     133    RefreshPropGrid(); 
     134} 
     135 
     136 
     137void MeshInspectorT::Notify_SkinChanged(SubjectT* Subject, unsigned int SkinNr) 
     138{ 
     139    if (m_IsRecursiveSelfNotify) return; 
     140 
     141    // Update the mesh also when a skin changed, as the material that 
     142    // is used for this mesh depends on the currently selected skin. 
    130143    RefreshPropGrid(); 
    131144} 
     
    159172    { 
    160173        const CafuModelT::MeshT& Mesh=Meshes[Selection[0]]; 
     174        const MaterialT*         Mat =m_ModelDoc->GetModel()->GetMaterial(Selection[0], m_ModelDoc->GetSelSkinNr()); 
    161175 
    162176        Append(new wxStringProperty("Name", wxPG_LABEL, Mesh.Name)); 
    163         Append(new MaterialPropertyT("Material", wxPG_LABEL, Mesh.Material ? Mesh.Material->Name : "<NULL>", m_ModelDoc)); 
     177 
     178        Append(new MaterialPropertyT(wxString::Format("Material (%s)", m_ModelDoc->GetSelSkinString()), 
     179            wxPG_LABEL, Mat ? Mat->Name : "<NULL>", m_ModelDoc)); 
    164180 
    165181        wxPGProperty* UseGivenTS=Append(new wxBoolProperty("Use given TS", wxPG_LABEL, false)); 
     
    209225 
    210226         if (PropName=="Name"    ) ok=m_Parent->SubmitCommand(new CommandRenameT(m_ModelDoc, MESH, MeshNr, Event.GetValue().GetString())); 
    211     else if (PropName=="Material") ok=m_Parent->SubmitCommand(new CommandSetMeshMaterialT(m_ModelDoc, MeshNr, Event.GetValue().GetString())); 
     227    else if (PropName=="Material") ok=m_Parent->SubmitCommand(new CommandSetMeshMaterialT(m_ModelDoc, MeshNr, m_ModelDoc->GetSelSkinNr(), Event.GetValue().GetString())); 
    212228    else 
    213229    { 
  • cafu/trunk/CaWE/ModelEditor/MeshInspector.hpp

    r305 r383  
    4343        void Notify_SelectionChanged(SubjectT* Subject, ModelElementTypeT Type, const ArrayT<unsigned int>& OldSel, const ArrayT<unsigned int>& NewSel); 
    4444        void Notify_MeshChanged(SubjectT* Subject, unsigned int MeshNr); 
     45        void Notify_SkinChanged(SubjectT* Subject, unsigned int SkinNr); 
    4546        void Notify_SubjectDies(SubjectT* dyingSubject); 
    4647 
  • cafu/trunk/CaWE/ModelEditor/ModelDocument.cpp

    r381 r383  
    110110 
    111111 
     112int ModelEditor::ModelDocumentT::GetSelSkinNr() const 
     113{ 
     114    return m_Selection[SKIN].Size()==0 ? -1 : m_Selection[SKIN][0]; 
     115} 
     116 
     117 
     118wxString ModelEditor::ModelDocumentT::GetSelSkinString() const 
     119{ 
     120    if (m_Selection[SKIN].Size()==0) 
     121        return "default skin"; 
     122 
     123    return wxString::Format("skin %u: \"%s\"", m_Selection[SKIN][0], m_Model->GetSkins()[m_Selection[SKIN][0]].Name); 
     124} 
     125 
     126 
    112127void ModelEditor::ModelDocumentT::SetSelection(ModelElementTypeT Type, const ArrayT<unsigned int>& NewSel) 
    113128{ 
    114     wxASSERT(Type<4); 
     129    wxASSERT(Type<5); 
    115130    m_Selection[Type]=NewSel; 
    116131 
  • cafu/trunk/CaWE/ModelEditor/ModelDocument.hpp

    r381 r383  
    102102 
    103103        const CafuModelT*               GetModel() const           { return m_Model; } 
    104         const ArrayT<unsigned int>&     GetSelection(ModelElementTypeT Type) const { wxASSERT(Type<4); return m_Selection[Type]; } 
     104        const ArrayT<unsigned int>&     GetSelection(ModelElementTypeT Type) const { wxASSERT(Type<5); return m_Selection[Type]; } 
    105105        const BoundingBox3fT&           GetSequenceBB() const      { return m_SequenceBB; } 
     106        int                             GetSelSkinNr() const;      ///< Return the index number of the currently selected skin, or -1 when no skin (that is, the default skin) is selected. 
     107        wxString                        GetSelSkinString() const;  ///< Returns a string representation for the currently selected skin. 
    106108        const ArrayT<EditorMaterialI*>& GetEditorMaterials() const { return m_EditorMaterials; } 
    107109        const AnimStateT&               GetAnimState() const       { return m_AnimState; } 
     
    135137 
    136138        CafuModelT*              m_Model;           ///< The model that is being edited. 
    137         ArrayT<unsigned int>     m_Selection[4];    ///< The selected joints, meshes, animations and GUI fixtures. 
     139        ArrayT<unsigned int>     m_Selection[5];    ///< The selected joints, meshes, animations, skins and GUI fixtures. 
    138140        BoundingBox3fT           m_SequenceBB;      ///< The bounding-box encompassing all frames of the currently selected animation sequence(s). 
    139141        ArrayT<EditorMaterialI*> m_EditorMaterials; ///< One editor material for each material in the model (its material manager). 
  • cafu/trunk/CaWE/ModelEditor/ObserverPattern.cpp

    r341 r383  
    102102 
    103103 
     104void SubjectT::UpdateAllObservers_SkinChanged(unsigned int SkinNr) 
     105{ 
     106    for (unsigned long ObsNr=0; ObsNr<m_Observers.Size(); ObsNr++) 
     107        m_Observers[ObsNr]->Notify_SkinChanged(this, SkinNr); 
     108} 
     109 
     110 
    104111void SubjectT::UpdateAllObservers_GuiFixtureChanged(unsigned int GuiFixtureNr) 
    105112{ 
  • cafu/trunk/CaWE/ModelEditor/ObserverPattern.hpp

    r374 r383  
    7979        virtual void Notify_AnimChanged(SubjectT* Subject, unsigned int AnimNr) { } 
    8080 
     81        /// Notifies the observer that a skin has changed. 
     82        /// @param Subject   The model document with the model in which the skin has changed. 
     83        /// @param AnimNr    The number of the skin that has changed. 
     84        virtual void Notify_SkinChanged(SubjectT* Subject, unsigned int SkinNr) { } 
     85 
    8186        /// Notifies the observer that a GUI fixture has changed. 
    8287        /// @param Subject        The model document with the model in which the GUI fixture has changed. 
     
    125130        virtual void UpdateAllObservers_MeshChanged(unsigned int MeshNr); 
    126131        virtual void UpdateAllObservers_AnimChanged(unsigned int AnimNr); 
     132        virtual void UpdateAllObservers_SkinChanged(unsigned int SkinNr); 
    127133        virtual void UpdateAllObservers_GuiFixtureChanged(unsigned int GuiFixtureNr); 
    128134        virtual void UpdateAllObservers_AnimStateChanged(); 
  • cafu/trunk/CaWE/ModelEditor/ScenePropGrid.cpp

    r381 r383  
    101101    wxPGProperty* CameraPosY=AppendIn(CameraPos, new wxFloatProperty("y", wxPG_LABEL, Camera.Pos.y)); SetPropertyTextColour(CameraPosY, wxColour(0, 200, 0)); 
    102102    wxPGProperty* CameraPosZ=AppendIn(CameraPos, new wxFloatProperty("z", wxPG_LABEL, Camera.Pos.z)); SetPropertyTextColour(CameraPosZ, wxColour(0, 0, 200)); 
     103    Collapse(CameraPos); 
    103104 
    104105    wxPGProperty* CameraAngles=AppendIn(CameraCat, new wxStringProperty("Angles", "Camera.Angles", "<composed>")); 
     
    106107 // AppendIn(CameraAngles, new wxFloatProperty("Roll", wxPG_LABEL, Camera.Angles.roll())); 
    107108    AppendIn(CameraAngles, new wxFloatProperty("Yaw", wxPG_LABEL, Camera.Angles.yaw())); 
     109    Collapse(CameraAngles); 
    108110 
    109111    wxPGProperty* CameraAdvanced=AppendIn(CameraCat, new wxStringProperty("Advanced", "Camera.Advanced", "<composed>")); 
  • cafu/trunk/CaWE/ModelEditor/SceneView3D.cpp

    r382 r383  
    6363Vector3fT ModelEditor::SceneView3DT::TraceCameraRay(const wxPoint& RefPtWin, ModelT::TraceResultT& ModelTR) const 
    6464{ 
    65     float     BestFraction=std::numeric_limits<float>::max(); 
    66     Vector3fT BestPos     =GetCamera().Pos; 
     65    const ModelDocumentT* ModelDoc    =m_Parent->GetModelDoc(); 
     66    float                 BestFraction=std::numeric_limits<float>::max(); 
     67    Vector3fT             BestPos     =GetCamera().Pos; 
    6768 
    6869    // Note that our ray does intentionally not start at GetCamera().Pos, 
     
    8182    // Include the ground plane in the test only if it is visible - everything else confuses the user! 
    8283    if (m_Parent->GetScenePropGrid()->m_GroundPlane_Show) 
    83         Elems.PushBack(m_Parent->GetModelDoc()->GetGround()); 
     84        Elems.PushBack(ModelDoc->GetGround()); 
    8485 
    8586    for (unsigned long ElemNr=0; ElemNr<Elems.Size(); ElemNr++) 
     
    100101 
    101102    // Trace the ray against the model, which is a per-triangle accurate test. 
    102     const ModelDocumentT::AnimStateT& Anim   =m_Parent->GetModelDoc()->GetAnimState(); 
    103     const ArrayT<unsigned int>&       AnimSel=m_Parent->GetModelDoc()->GetSelection(ANIM); 
     103    const ModelDocumentT::AnimStateT& Anim   =ModelDoc->GetAnimState(); 
     104    const ArrayT<unsigned int>&       AnimSel=ModelDoc->GetSelection(ANIM); 
    104105    ModelT::TraceResultT Result; 
    105106 
    106     if (m_Parent->GetModelDoc()->GetModel()->TraceRay(AnimSel.Size()==0 ? -1 : AnimSel[0], Anim.FrameNr, -1 /*SkinNr*/, RayOrigin, RayDir, Result) && Result.Fraction<BestFraction) 
     107    if (ModelDoc->GetModel()->TraceRay(AnimSel.Size()==0 ? -1 : AnimSel[0], Anim.FrameNr, 
     108        ModelDoc->GetSelSkinNr(), RayOrigin, RayDir, Result) && Result.Fraction<BestFraction) 
    107109    { 
    108110        BestFraction=Result.Fraction; 
     
    388390    if (ScenePropGrid->m_Model_ShowMesh) 
    389391    { 
    390         Model->Draw(SequNr, Anim.FrameNr, -1 /*SkinNr*/, 0.0f /*LodDist*/, (CafuModelT::SuperT*)NULL); 
     392        Model->Draw(SequNr, Anim.FrameNr, ModelDoc->GetSelSkinNr(), 0.0f /*LodDist*/, (CafuModelT::SuperT*)NULL); 
    391393 
    392394        for (unsigned long SmNr=0; SmNr<ModelDoc->GetSubmodels().Size(); SmNr++) 
  • cafu/trunk/CaWE/ModelEditor/SubmodelsList.hpp

    r343 r383  
    3434 
    3535 
    36     /// A control for displaying a list of the elements (meshes or animations) of the model. 
     36    /// A control for displaying a list of the submodels that are rendered with the model. 
    3737    class SubmodelsListT : public wxListView, public ObserverT 
    3838    { 
  • cafu/trunk/Libs/Models/Loader_mdl.cpp

    r382 r383  
    541541        CafuModelT::SkinT& Skin    =Skins[SkinNr-1]; 
    542542 
     543        Skin.Name="Skin"; 
     544 
    543545        for (unsigned long MeshNr=0; MeshNr<m_MeshSkinRef.Size(); MeshNr++) 
    544546        { 
  • cafu/trunk/Libs/Models/Model_cmdl.hpp

    r382 r383  
    268268    bool IsVertexNrOK(const GuiFixtureT& GF, unsigned int PointNr) const; 
    269269 
     270    /// Returns the proper material for the given mesh in the given skin. 
     271    const MaterialT* GetMaterial(unsigned long MeshNr, int SkinNr) const; 
     272 
    270273    // The ModelT interface. 
    271274    const std::string& GetFileName() const;     // TODO: Remove!?! 
     
    297300    void InitMeshes();                                                                      ///< An auxiliary method for the constructors. 
    298301    void UpdateCachedDrawData(int SequenceNr, float FrameNr, const SuperT* Super) const;    ///< A private auxiliary method. 
    299     const MaterialT* GetMaterial(unsigned long MeshNr, int SkinNr) const;                   ///< Returns the proper material for the given mesh in the given skin. 
    300302    MatSys::RenderMaterialT* GetRenderMaterial(unsigned long MeshNr, int SkinNr) const;     ///< Returns the proper render material for the given mesh in the given skin. 
    301303