// ShaderTemplatePanel.cpp : implementation file // #include "stdafx.h" #include "ShaderTemplatePanel.h" #include "ShaderTemplateTool.h" // CTemplateTool #include "resource.h" // IDC_SHADERTEMPL_XML #include "Objects\\BaseObject.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CShaderTemplatePanel dialog CShaderTemplatePanel::CShaderTemplatePanel( CShaderTemplateTool *obj,XmlNodeRef &node,CWnd* pParent /*=NULL*/) : CDialog(CShaderTemplatePanel::IDD, pParent) , m_sParameterSetName(_T("")) { //{{AFX_DATA_INIT(CShaderTemplatePanel) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_node = node; m_object = obj; m_sFilename = "shader.stp"; m_sParameterSetName = "unnamed"; assert( m_object != 0 ); Create( IDD,pParent ); } void CShaderTemplatePanel::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CShaderTemplatePanel) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP DDX_Control(pDX, IDC_TEMPLATECOMBO, m_TemplateCombo); DDX_Control(pDX, IDC_SHADERTEMPL_MATERIALNAME, m_Material); DDX_Text(pDX, IDC_SHADERTEMPL_FILENAME, m_sFilename); DDX_Text(pDX, IDC_SHADERTEMPL_NAME, m_sParameterSetName); } BEGIN_MESSAGE_MAP(CShaderTemplatePanel, CDialog) //{{AFX_MSG_MAP(CShaderTemplatePanel) ON_WM_DESTROY() ON_WM_KILLFOCUS() ON_WM_SIZE() //}}AFX_MSG_MAP ON_CBN_SELCHANGE(IDC_TEMPLATECOMBO, OnCbnSelchangeTemplatecombo) ON_BN_CLICKED(IDC_SHADERTEMPL_COPY, OnBnClickedShadertemplCopy) ON_BN_CLICKED(IDC_SHADERTEMPL_SETDEFAULT, OnBnClickedShadertemplSetdefault) ON_BN_CLICKED(IDC_SHADERTEMPL_PASTE, OnBnClickedShadertemplPaste) ON_BN_CLICKED(IDC_SHADERTEMPL_LOAD, OnBnClickedShadertemplLoad) ON_BN_CLICKED(IDC_SHADERTEMPL_SAVE, OnBnClickedShadertemplSave) ON_BN_CLICKED(IDC_SHADERTEMPL_GETFROMSEL, OnBnClickedShadertemplGetfromsel) ON_BN_CLICKED(IDC_SHADERTEMPL_SELECTBYSTP, OnBnClickedShadertemplSelectbystp) ON_BN_CLICKED(IDC_SHADERTEMPL_TOLIB, OnBnClickedShadertemplTolib) ON_BN_CLICKED(IDC_SHADERTEMPL_FROMLIB, OnBnClickedShadertemplFromlib) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CShaderTemplatePanel message handlers BOOL CShaderTemplatePanel::OnInitDialog() { CDialog::OnInitDialog(); m_TemplateCombo.SetWindowPos(0,0,0,190,180,SWP_NOREPOSITION | SWP_NOMOVE | SWP_NOZORDER); m_TemplateCombo.SetItemHeight(-1,15); CRect rc; CWnd *w=GetDlgItem(IDC_SHADERTEMPL_XML); w->GetWindowRect( rc ); ScreenToClient(rc); m_propWnd.Create( WS_CHILD,rc,this ); m_propWnd.ShowWindow( SW_SHOW ); m_propWnd.SetSplitter( (2*rc.right)/5 ); SetProperties( m_node ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CShaderTemplatePanel::SetProperties( XmlNodeRef &props ) { m_node = props; // If properties window is already created. if (GetSafeHwnd()) { if (m_node) { m_propWnd.CreateItems(m_node); m_propWnd.SetUpdateCallback( functor(*this,&CShaderTemplatePanel::OnPropertyChanged) ); Invalidate(); UpdateWindow(); // calles OnSize() // SetWindowPos( NULL,0,0,rc.right,MIN((rc.bottom+yOffset*2),listSize.cy+yOffset*2)+30,SWP_NOMOVE ); } } } void CShaderTemplatePanel::OnDestroy() { CDialog::OnDestroy(); } void CShaderTemplatePanel::OnKillFocus(CWnd* pNewWnd) { CDialog::OnKillFocus(pNewWnd); } void CShaderTemplatePanel::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); /* if (m_propWnd) { FRect fr = m_propWnd->GetWindowRect(); CRect rc( fr.Min.X,fr.Min.Y,fr.Max.X,fr.Max.Y ); ScreenToClient( &rc ); m_propWnd->EnableUpdateCallback(false); m_propWnd->MoveWindow( 2,4,cx-2,fr.Height()+30,TRUE ); m_propWnd->DividerWidth = (2*cx)/5; m_propWnd->Resizable = true; m_propWnd->ResizeList(); m_propWnd->Resizable = false; m_propWnd->ForceRefresh(); m_propWnd->EnableUpdateCallback(true); } */ } ////////////////////////////////////////////////////////////////////////// void CShaderTemplatePanel::OnPropertyChanged( XmlNodeRef node ) { // m_object->OnPropertyChange( node->getTag() ); } void CShaderTemplatePanel::OnCbnSelchangeTemplatecombo() { int sel=m_TemplateCombo.GetCurSel(); CString str; m_TemplateCombo.GetLBText(sel,str); IShader *sshader=GetIEditor()->GetRenderer()->EF_LoadShader(str.GetBuffer(64),eSH_World,0); if(sshader) { TArray &shaderparams=sshader->GetPublicParams(); // struct SShaderParam // string m_Name; // EParamType m_Type; // UParamVal m_Value; // // union UParamVal // { // byte m_Byte; // short m_Short; // int m_Int; // float m_Float; // char *m_String; // }; CString str=""; int nParamCount=shaderparams.Num(); for(int e=0;em_Type) { case eType_BYTE: { CString val; val.Format("%d",(int)(ptr->m_Value.m_Byte)); str+="<"+CString(ptr->m_Name)+" type=\"Int\" value=\"" +val+ "\"/>"; } break; case eType_SHORT: { CString val; val.Format("%d",(int)(ptr->m_Value.m_Short)); str+="<"+CString(ptr->m_Name)+" type=\"Int\" value=\"" +val+ "\"/>"; } break; case eType_INT: { CString val; val.Format("%d",(int)(ptr->m_Value.m_Int)); str+="<"+CString(ptr->m_Name)+" type=\"Int\" value=\"" +val+ "\"/>"; } break; case eType_FLOAT: { CString val; val.Format("%f",(float)(ptr->m_Value.m_Float)); str+="<"+CString(ptr->m_Name)+" type=\"Float\" value=\"" +val+ "\" Precision=\"5\"/>"; } break; case eType_STRING: { CString val; val.Format("%s",(char *)(ptr->m_Value.m_String)); str+="<"+CString(ptr->m_Name)+" type=\"String\" value=\"" +val+ "\"/>"; } break; case eType_UNKNOWN: default: assert(0); break; } } str+=""; XmlParser xml; m_node=xml.parseBuffer(str); SetProperties(m_node); sshader->Release(); } } void CShaderTemplatePanel::OnBnClickedShadertemplCopy() { AfxMessageBox("todo"); } void CShaderTemplatePanel::OnBnClickedShadertemplSetdefault() { AfxMessageBox("todo"); } void CShaderTemplatePanel::OnBnClickedShadertemplPaste() { AfxMessageBox("todo"); } void CShaderTemplatePanel::OnBnClickedShadertemplLoad() { assert(m_object); m_object->OnBnClickedShadertemplLoad(); m_sFilename=m_object->getFilename(); UpdateData(false); } void CShaderTemplatePanel::OnBnClickedShadertemplSave() { assert(m_object); m_object->OnBnClickedShadertemplSave(); } void CShaderTemplatePanel::OnBnClickedShadertemplGetfromsel() { AfxMessageBox("todo"); } void CShaderTemplatePanel::OnBnClickedShadertemplSelectbystp() { AfxMessageBox("todo"); } void CShaderTemplatePanel::OnBnClickedShadertemplTolib() { AfxMessageBox("todo"); } void CShaderTemplatePanel::OnBnClickedShadertemplFromlib() { AfxMessageBox("todo"); }