reman3/Rayman_X/cpa/tempgrp/TGM/Src/diaview.cpp

1860 lines
77 KiB
C++

// DiaView.cpp : implementation file
//
#include "stdafx.h"
#include "ACP_Base.h"
#include "matres.h"
#include "itf.h"
#include "gli.h"
#include "gmt.h"
#include "dpt.h"
#include "MatList.hpp"
#include "inctex.h"
#include "_interf.hpp"
#include "GMatObj.hpp"
#include "VMatObj.hpp"
#include "TexObj.hpp"
#include "DiaView.hpp"
#include "PatternList.hpp"
#include "DiaText.hpp"
#include "TextureDlg.h"
#include "choosecolor.hpp"
#include "x:\cpa\main\inc\_editid.h"
#include "TUT.h"
#define C_fAutoScrollEditCoeff 100.0f
#define C_szAutoScrollStringFormat "%6.2f"
extern Material_Interface *gs_p_oMaterialInterface;
/////////////////////////////////////////////////////////////////////////////
// DiaView dialog
IMPLEMENT_DYNCREATE(DiaView, CFormView)
//==================================================================================================
//==================================================================================================
DiaView::DiaView()
: CFormView(DiaView::IDD)
{
//{{AFX_DATA_INIT(DiaView)
//}}AFX_DATA_INIT
m_bControlsFilledFromMaterial = FALSE;
m_hEditedVisualMaterial = NULL; //NULL is the invalid value, until otherwise specified...
}
//==================================================================================================
//==================================================================================================
DiaView::~DiaView()
{
}
//==================================================================================================
//==================================================================================================
void DiaView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DiaView)
//}}AFX_DATA_MAP
}
//==================================================================================================
//==================================================================================================
BEGIN_MESSAGE_MAP(DiaView, CFormView)
//{{AFX_MSG_MAP(DiaView)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_CHECK_TEXTURE, OnCheckTexture)
ON_WM_DRAWITEM()
ON_BN_CLICKED(IDC_BUTTON_DIFFUSE, OnButtonDiffuse)
ON_BN_CLICKED(IDC_BUTTON_SPECULAR, OnButtonSpecular)
ON_BN_CLICKED(IDC_BUTTON_AMBIENT, OnButtonAmbient)
ON_BN_CLICKED(IDC_CHECK_GOURAUD, OnCheckGouraud)
ON_EN_CHANGE(IDC_EDIT_SPECEXP, OnChangeEditSpecExp)
ON_BN_CLICKED(IDC_CHECK_CHROME, OnCheckChrome)
ON_BN_CLICKED(IDC_CHECK_TRANS, OnCheckTrans)
ON_BN_CLICKED(IDC_CHECK_ALPHASENSITIVE, OnCheckAlphaSensitive)
ON_BN_CLICKED(IDC_BUTTON_ADDANIMATED, OnButtonAddAnimatedTexture)
ON_CBN_SELCHANGE(IDC_COMBO_ANIMATEDTEXTURES, OnSelchangeComboAnimatedTextures)
ON_BN_CLICKED(IDC_BUTTON_REMOVEANIMATED, OnButtonRemoveAnimatedTexture)
ON_BN_CLICKED(IDC_BUTTON_MOVEUP, OnButtonMoveUpTexture)
ON_BN_CLICKED(IDC_BUTTON_MOVEDOWN, OnButtonMoveDownTexture)
ON_BN_CLICKED(IDC_CHECK_AUTOSCROLL, OnCheckAutoScroll)
ON_EN_KILLFOCUS(IDC_EDIT_HORIZONTALSCROLL, OnKillFocusEditHorizontalScroll)
ON_EN_KILLFOCUS(IDC_EDIT_VERTICALSCROLL, OnKillFocusEditVerticalScroll)
ON_BN_CLICKED(IDC_CHECK_BACKFACE, OnCheckBackface)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//==================================================================================================
//==================================================================================================
int DiaView::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
CString csMessage;
switch ( CWnd::OnToolHitTest(point, pTI) )
{
default:
csMessage = "???????????????????????????????????????????????????";
break;
case IDC_STATIC:
csMessage = "";
break;
case IDC_BUTTON_DIFFUSE:
case IDC_BUTTON_AMBIENT:
case IDC_BUTTON_SPECULAR:
csMessage = "view/edit the color of the current game material";
break;
case IDC_EDIT_SPECEXP:
csMessage = "edit the specularity of the current game material";
break;
case IDC_CHECK_CHROME:
csMessage = "make the material chromed";
break;
case IDC_CHECK_BACKFACE:
csMessage = "tell that the material is to be seen from both sides of a single-sided face";
break;
case IDC_CHECK_TEXTURE:
csMessage = "enable/disable the texture of the current game material";
break;
case IDC_CHECK_GOURAUD:
csMessage = "select the rendering method for the current game material";
break;
case IDC_CHECK_TRANS:
csMessage = "enable/disable transparency of the current game material";
break;
case IDC_CHECK_ALPHASENSITIVE:
csMessage = "enable/disable transparent light sensitivity";
break;
case IDC_CHECK_AUTOSCROLL:
csMessage = "enable/disable texture autoscrolling";
break;
}
//output the help info in the status bar
fn_vGiveProgressInfo(csMessage, -1);
//there is no hit for a true tooltip
return -1;
}
//==================================================================================================
//==================================================================================================
//void DiaView::fn_vInitDialog ( void )
//{
// UpdateData(FALSE);
//}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vShowMaterial(GMT_tdxHandleToGameMaterial _hMat, int _iTextureIndex /*= -1*/)
{
tdoEditorGameMaterial *p_oEditedGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial();
BOOL bAGameMAterialIsEdited = p_oEditedGameMaterial ? TRUE : FALSE;
static BOOL s_bFirstDone = FALSE;
if ( !s_bFirstDone )
{
s_bFirstDone = TRUE;
//enable the buttons so that they will be redisplayed properly
GetDlgItem(IDC_BUTTON_MOVEUP )->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_MOVEDOWN )->EnableWindow(TRUE);
//attach the icons to the buttons
HICON hIcon;
hIcon = AfxGetApp()->LoadIcon(IDI_ICON_MOVEDOWN);
((CButton *) GetDlgItem(IDC_BUTTON_MOVEDOWN))->SetIcon(hIcon);
hIcon = AfxGetApp()->LoadIcon(IDI_ICON_MOVEUP);
((CButton *) GetDlgItem(IDC_BUTTON_MOVEUP))->SetIcon(hIcon);
//and force redisplay of their contents
GetDlgItem(IDC_BUTTON_MOVEUP)->Invalidate();
GetDlgItem(IDC_BUTTON_MOVEDOWN)->Invalidate();
}
/* if no material is currently selected, disable everything */
if ( !bAGameMAterialIsEdited )
{
m_hEditedVisualMaterial = NULL; //invalidate the handle
//clear the controls
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->SetCurSel(CB_ERR);
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL )->SetWindowText("");
GetDlgItem(IDC_EDIT_VERTICALSCROLL )->SetWindowText("");
GetDlgItem(IDC_EDIT_SPECEXP )->SetWindowText("");
((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->SetCheck(FALSE);
//and disable them
GetDlgItem(IDC_CHECK_GOURAUD )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_DIFFUSE )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_AMBIENT )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_SPECULAR )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_AUTOSCROLL )->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL )->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_VERTICALSCROLL )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_TRANS )->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_SPECEXP )->EnableWindow(FALSE);
GetDlgItem(IDC_SPIN_SPECEXP )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_TEXTURE )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_CHROME )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_BACKFACE )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_ALPHASENSITIVE )->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_ADDANIMATED )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_REMOVEANIMATED )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_MOVEUP )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_MOVEDOWN )->EnableWindow(FALSE);
//tell the texture view to clear itself
gs_p_oMaterialInterface->m_p_oGetTexView()->m_fn_vShowMaterial(_hMat);
return;
}
//normally, the specified engine game material must belong to the current editor game material...
ASSERT(_hMat == p_oEditedGameMaterial->GetData());
//get the submaterial's handle
m_hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
//prevent self-induced windows messages handling
m_bControlsFilledFromMaterial = TRUE;
//here bAGameMAterialIsEdited is TRUE, so enable the controls
GetDlgItem(IDC_CHECK_GOURAUD )->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_DIFFUSE )->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_AMBIENT )->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_SPECULAR )->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_AUTOSCROLL )->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_TRANS )->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_SPECEXP )->EnableWindow(TRUE);
GetDlgItem(IDC_SPIN_SPECEXP )->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_TEXTURE )->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_CHROME )->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_BACKFACE )->EnableWindow(TRUE);
GetDlgItem(IDC_CHECK_ALPHASENSITIVE )->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_ADDANIMATED )->EnableWindow(TRUE);
unsigned long xMType;
CString csEditContents;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xMType);
BOOL bMaterialIsTextured = (xMType & GLI_C_lIsTextured);
if ( _iTextureIndex < 0 )
_iTextureIndex = 0;
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->ResetContent();
long lNbTextures = GLI_lGetMaterialNumberOfAnimatedTexture(m_hEditedVisualMaterial);
if (_iTextureIndex > lNbTextures - 1)
_iTextureIndex = lNbTextures - 1;
if ( lNbTextures > 0 )
{
//since the first texture will be selected in the combo, it cannot be moved up
GetDlgItem(IDC_BUTTON_MOVEUP )->EnableWindow(_iTextureIndex > 0);
//but it can be moved down, if there are more than one texture, and the selected texture is not the last
GetDlgItem(IDC_BUTTON_MOVEDOWN )->EnableWindow(bMaterialIsTextured && (lNbTextures > 1) && (_iTextureIndex < (lNbTextures - 1)) );
//there are animated textures, so enable the combo if there is more than one
GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES)->EnableWindow(bMaterialIsTextured && (lNbTextures > 1));
//TODO: retirer la partie && (lNbTextures > 1) quand la fct moteur fonctionnera pour le cas lNbTextures == 1
GetDlgItem(IDC_BUTTON_REMOVEANIMATED )->EnableWindow(bMaterialIsTextured);
//now add entries in the combo for the additional textures
for ( ; lNbTextures > 0; lNbTextures -- )
{
GLI_tdstTexture *hAnimatedTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(m_hEditedVisualMaterial, lNbTextures - 1, &hAnimatedTexture, &fDuration);
tdoEditorTexture *p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hAnimatedTexture);
short wInsert = ((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->InsertString(0, p_oEditorTexture ? p_oEditorTexture->GetName() : "N/A");
if ( wInsert != CB_ERR )
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->SetItemDataPtr(wInsert, p_oEditorTexture);
}
}
else //there is no texture
{
if ( bMaterialIsTextured ) //if the material believed it was textured though it is not
{
//remove the textured flag attribute
GLI_xSetMaterialType(m_hEditedVisualMaterial, xMType & ~GLI_C_lIsTextured);
m_vNotifyChangeToScripts();
bMaterialIsTextured = FALSE;
}
//disable the irrelevant combos
GetDlgItem(IDC_BUTTON_MOVEUP )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_MOVEDOWN )->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_REMOVEANIMATED )->EnableWindow(FALSE);
}
//now select the default texture of the combo
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->SetCurSel(bMaterialIsTextured ? _iTextureIndex : -1);
//and make the texture view update its display according to the selected item in the combo
gs_p_oMaterialInterface->m_p_oGetTexView()->m_fn_vShowMaterial(_hMat, bMaterialIsTextured ? _iTextureIndex : -1);
//update the rest of the controls according to the edited material
GetDlgItem(IDC_CHECK_GOURAUD)->SetWindowText((xMType & GLI_C_lIsGouraud) ? "Gouraud" : "Flat");
((CButton *) GetDlgItem(IDC_CHECK_TEXTURE))->SetCheck(bMaterialIsTextured);
((CButton *) GetDlgItem(IDC_CHECK_CHROME))->SetCheck(GLI_bIsMaterialChromed(m_hEditedVisualMaterial));
((CButton *) GetDlgItem(IDC_CHECK_BACKFACE))->SetCheck(GLI_bIsMaterialBackface(m_hEditedVisualMaterial));
((CButton *) GetDlgItem(IDC_CHECK_ALPHASENSITIVE))->SetCheck(!(xMType & GLI_C_lIsNotLightAlphaSensitive));
((CButton *) GetDlgItem(IDC_CHECK_TRANS))->SetCheck(!(xMType & GLI_C_lIsNotGrided));
//get the autoscroll speed
float fUSpeed, fVSpeed;
long lSwitch;
GLI_xGetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
csEditContents.Format(C_szAutoScrollStringFormat, fUSpeed * C_fAutoScrollEditCoeff);
csEditContents.TrimLeft();
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->SetWindowText(csEditContents);
csEditContents.Format(C_szAutoScrollStringFormat, fVSpeed * C_fAutoScrollEditCoeff);
csEditContents.TrimLeft();
GetDlgItem(IDC_EDIT_VERTICALSCROLL)->SetWindowText(csEditContents);
((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->SetCheck(lSwitch);
//the autoscroll parameters are modifiable only if autoscroll is enabled
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->EnableWindow(lSwitch);
GetDlgItem(IDC_EDIT_VERTICALSCROLL )->EnableWindow(lSwitch);
//get the specular color's exponent
GEO_tdstColor stColor;
long lSpecExp;
GLI_xGetMaterialSpecularCoef(m_hEditedVisualMaterial, &lSpecExp, &stColor);
csEditContents.Format("%d", lSpecExp);
GetDlgItem(IDC_EDIT_SPECEXP)->SetWindowText(csEditContents);
//note that the 3 color buttons contents will be updated by OnDrawItem()
GetDlgItem(IDC_BUTTON_DIFFUSE )->Invalidate();
GetDlgItem(IDC_BUTTON_AMBIENT )->Invalidate();
GetDlgItem(IDC_BUTTON_SPECULAR)->Invalidate();
m_bControlsFilledFromMaterial = FALSE;
//Invalidate();
}
/////////////////////////////////////////////////////////////////////////////
// DiaView diagnostics
#ifdef _DEBUG
void DiaView::AssertValid() const
{
CFormView::AssertValid();
}
void DiaView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// DiaView message handlers
//-----------------------------------------------------------------------------
// Description : handle function for BN_CLICKED
//---------------------------------------------------------------------------
void DiaView::OnCheckTexture()
{
unsigned long xMType, xOldType;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xMType);
xOldType = xMType;
//check if the material references textures
long lNbTextures = GLI_lGetMaterialNumberOfAnimatedTexture(m_hEditedVisualMaterial);
if ( ((CButton *) GetDlgItem(IDC_CHECK_TEXTURE))->GetCheck() ) //we try to enable material texturing
{
if ( lNbTextures == 0 ) //but there is no texture
{
xMType &= ~GLI_C_lIsTextured; //and clear the texture flag
}
else //there are textures
xMType |= GLI_C_lIsTextured; //lets set the texture flag
}
else //we want to clear the flag
xMType &= ~GLI_C_lIsTextured;
if ( xOldType != xMType )
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialStateModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialStateModif::E_st_Textured
));
/*
//make listview update the displayed texture for the edited game material
GLI_tdstTexture *p_stTexture;
//we display the first texture of the animation
GLI_xGetMaterialTexture(m_hEditedVisualMaterial, &p_stTexture);
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vSetItemImage(
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_lGetSelectedItem(),
(short) (
(xMType & GLI_C_lIsTextured)
? gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndexByLong((long) p_stTexture)
: gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndex(C_szNoBitmapName)
)
);
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vRedrawSelectedItem();
//update the "textured" attribute of the material
GLI_xSetMaterialType(m_hEditedVisualMaterial, xMType);
//tell the object it changed, and has to be saved
m_vNotifyChangeToScripts();
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
*/
}
//now make the visual and texture views update their contents
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vShowMaterial(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel()
);
GetDlgItem(IDC_BUTTON_ADDANIMATED)->EnableWindow(((CButton *) GetDlgItem(IDC_CHECK_TEXTURE))->GetCheck());
}
//-----------------------------------------------------------------------------
// Description : handle function for WM_DRAWITEM
//---------------------------------------------------------------------------
void DiaView::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
RECT *rect = &lpDrawItemStruct->rcItem;
GEO_tdstColor stColor;
long lSpecularExponent;
COLORREF xColor;
BOOL bAMaterialIsEdited = m_hEditedVisualMaterial ? TRUE : FALSE;
BOOL bNormalDraw = FALSE;
switch ( nIDCtl )
{
default:
CFormView::OnDrawItem(nIDCtl, lpDrawItemStruct);
bNormalDraw = TRUE;
break;
case IDC_BUTTON_DIFFUSE:
if ( bAMaterialIsEdited )
{
GLI_xGetMaterialDiffuseCoef(m_hEditedVisualMaterial, &stColor);
xColor = RGB( stColor.xR * 255, stColor.xG * 255, stColor.xB * 255 );
}
else
xColor = RGB(192,192,192);
pDC->FillSolidRect( rect, xColor);
break;
case IDC_BUTTON_AMBIENT:
if ( bAMaterialIsEdited )
{
GLI_xGetMaterialAmbientCoef(m_hEditedVisualMaterial, &stColor);
xColor = RGB( stColor.xR * 255, stColor.xG * 255, stColor.xB * 255 );
}
else
xColor = RGB(192,192,192);
pDC->FillSolidRect( rect, xColor);
break;
case IDC_BUTTON_SPECULAR:
if ( bAMaterialIsEdited )
{
GLI_xGetMaterialSpecularCoef(m_hEditedVisualMaterial, &lSpecularExponent, &stColor);
xColor = RGB( stColor.xR * 255, stColor.xG * 255, stColor.xB * 255 );
}
else
xColor = RGB(192,192,192);
pDC->FillSolidRect( rect, xColor);
break;
}
//if we have drawn a color button
if ( bAMaterialIsEdited && !bNormalDraw )
{
//draw the alpha color in the button too, in the righthand third of the rectangle
short wOffset = (rect->right * 2) / 3;
rect->left += wOffset;
xColor = RGB(stColor.xA * 255, stColor.xA * 255, stColor.xA * 255);
pDC->FillSolidRect(rect, xColor);
}
}
//==================================================================================================
// Description : handle function for WM_CREATE
//==================================================================================================
int DiaView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
EnableToolTips(TRUE);
return 0;
}
//==================================================================================================
// Description : handle function for WM_DRAWITEM
//==================================================================================================
BOOL DiaView::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext )
{
BOOL bResult = CFormView::Create( lpszClassName, lpszWindowName, dwRequestedStyle, rect, pParentWnd, nID, pContext );
//control registration for tutorial and assistants, should be unregistered when view is destroyed
TUT_M_vGetTutDll();
TUT_M_vRegisterControlID(IDC_CHECK_ALPHASENSITIVE,"TGM_DiaViewCheckAlphaSensitive",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_TRANS,"TGM_DiaViewCheckTransparency",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_TEXTURE,"TGM_DiaViewCheckTextured",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_GOURAUD,"TGM_DiaViewCheckGouraud",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_CHROME,"TGM_DiaViewCheckChrome",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_BACKFACE,"TGM_DiaViewCheckBackface",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_AUTOSCROLL,"TGM_DiaViewCheckAutoScroll",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_EDIT_HORIZONTALSCROLL,"TGM_DiaViewEditHorScroll",TUT_e_TextEdit);
TUT_M_vRegisterControlID(IDC_EDIT_VERTICALSCROLL,"TGM_DiaViewEditVertScroll",TUT_e_TextEdit);
TUT_M_vRegisterControlID(IDC_BUTTON_AMBIENT,"TGM_DiaViewButtonAmbientColor",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_DIFFUSE,"TGM_DiaViewButtonDiffusecolor",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_SPECULAR,"TGM_DiaViewButtonSpecularcolor",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_EDIT_SPECEXP,"TGM_DiaViewEditSpecularExponent",TUT_e_TextEdit);
TUT_M_vRegisterControlID(IDC_SPIN_SPECEXP,"TGM_DiaViewSpinSpecularExponent",TUT_e_Spin);
TUT_M_vRegisterControlID(IDC_COMBO_ANIMATEDTEXTURES,"TGM_DiaViewTexturesCombo",TUT_e_ComboBox);
TUT_M_vRegisterControlID(IDC_BUTTON_ADDANIMATED,"TGM_DiaViewButtonAddAnimated",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_REMOVEANIMATED,"TGM_DiaViewButtonRemoveAnimated",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_MOVEUP,"TGM_DiaViewButtonMoveUp",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_MOVEDOWN,"TGM_DiaViewButtonMoveDown",TUT_e_Button);
return bResult;
}
//==================================================================================================
// Description : change texture in m_oMemDC
//==================================================================================================
void DiaView::OnButtonDiffuse()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialColorModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialColorModif::E_ct_Diffuse
));
}
//==================================================================================================
// Description : change texture in m_oMemDC
//==================================================================================================
void DiaView::OnButtonSpecular()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialColorModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialColorModif::E_ct_Specular
));
}
//==================================================================================================
// Description : edit a color of the VMT
//==================================================================================================
void DiaView::OnButtonAmbient()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialColorModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialColorModif::E_ct_Ambient
));
}
//==================================================================================================
//==================================================================================================
void DiaView::OnCheckGouraud()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialStateModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialStateModif::E_st_Gouraud
));
/*
unsigned long xMType;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xMType);
//change
if ( xMType & GLI_C_lIsGouraud )
xMType &= ~GLI_C_lIsGouraud;
else
xMType |= GLI_C_lIsGouraud;
GLI_xSetMaterialType(m_hEditedVisualMaterial, xMType);
m_vNotifyChangeToScripts();
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//update controls according to the edited material
((CButton *) GetDlgItem(IDC_CHECK_GOURAUD))->SetCheck(FALSE);
GetDlgItem(IDC_CHECK_GOURAUD)->SetWindowText((xMType & GLI_C_lIsGouraud) ? "Gouraud" : "Flat");
*/
}
//==================================================================================================
//==================================================================================================
void DiaView::m_vNotifyChangeToScripts()
{
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedVisualMaterial)
->fn_vNotifySave();
}
//==================================================================================================
//==================================================================================================
void DiaView::OnChangeEditSpecExp()
{
if ( !m_bControlsFilledFromMaterial && m_hEditedVisualMaterial != NULL ) //test handle validity
{
//get the old values
long lSpecExp;
GEO_tdstColor stColor;
GLI_xGetMaterialSpecularCoef(m_hEditedVisualMaterial, &lSpecExp, &stColor);
//read the contents of the specular exponent edit
CString csSpecExp;
GetDlgItem(IDC_EDIT_SPECEXP)->GetWindowText(csSpecExp);
lSpecExp = atoi((char*)LPCTSTR(csSpecExp));
//and store it back in the visual material
GLI_xSetMaterialSpecularCoef(m_hEditedVisualMaterial, lSpecExp, &stColor);
//notify the change
m_vNotifyChangeToScripts();
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnCheckAutoScroll()
{
if ( !m_bControlsFilledFromMaterial && m_hEditedVisualMaterial != NULL ) //test handle validity
{
//prevent SetWindowText() generated windows messages from being handled
m_bControlsFilledFromMaterial = TRUE;
long lSwitch = ((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->GetCheck();
M_p_oGetEditManager()->AskFor(new tdoChangeAutoScrollModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeAutoScrollModif::E_as_Switch,
lSwitch, 0.0f, 0.0f)
);
/*
//get the old values
float fUSpeed, fVSpeed;
long lSwitch;
GLI_xGetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
//read the contents of the autoscroll switch
if ( lSwitch = (((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->GetCheck() ? 1 : 0) )
{
//if we want to enable autoscroll, make sure the engine function will not clear the flag
//when it sees that the speeds are null...
if ( fUSpeed == 0.0 && fVSpeed == 0.0 )
{
fUSpeed = (float) (1.0 / C_fAutoScrollEditCoeff);
//dont forget to set the control's contents accordingly
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->SetWindowText("1");
}
//enable tiling of all the textures used by this material, so that autoscroll remains nice
long lNbtextures = GLI_lGetMaterialNumberOfAnimatedTexture(m_hEditedVisualMaterial);
for ( lNbtextures --; lNbtextures >= 0; lNbtextures -- )
{
GLI_tdstTexture *hTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(m_hEditedVisualMaterial, lNbtextures, &hTexture, &fDuration);
TEX_vSetTextureTilingMode(hTexture, TRUE, TRUE);
//do not forget to save the section
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hTexture)->fn_vNotifySave();
}
//make the texture view redisplay the current texture
gs_p_oMaterialInterface->m_p_oGetTexView()->m_fn_vShowMaterial(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel()
);
}
//and store it back in the visual material
GLI_xSetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, lSwitch, fUSpeed, fVSpeed);
//notify the change
m_vNotifyChangeToScripts();
//the autoscroll parameters are modifiable only if autoscroll is enabled
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->EnableWindow(lSwitch);
GetDlgItem(IDC_EDIT_VERTICALSCROLL )->EnableWindow(lSwitch);
*/
//restore normal message handling
m_bControlsFilledFromMaterial = FALSE;
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnKillFocusEditHorizontalScroll()
{
if ( !m_bControlsFilledFromMaterial && m_hEditedVisualMaterial != NULL ) //test handle validity
{
//prevent SetWindowText() generated windows messages from being handled
m_bControlsFilledFromMaterial = TRUE;
//read the contents of the autoscroll horizontal speed edit
CString csHorScroll;
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->GetWindowText(csHorScroll);
float fUSpeed = (float) atof((char*)LPCTSTR(csHorScroll));
if ( fUSpeed < -C_fAutoScrollEditCoeff )
fUSpeed = -C_fAutoScrollEditCoeff;
else if ( fUSpeed > C_fAutoScrollEditCoeff )
fUSpeed = C_fAutoScrollEditCoeff;
//and store it back in the visual material
fUSpeed /= C_fAutoScrollEditCoeff;
M_p_oGetEditManager()->AskFor(new tdoChangeAutoScrollModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeAutoScrollModif::E_as_USpeed,
1, fUSpeed, 0.0f)
);
/*
//get the old values
float fUSpeed, fVSpeed;
long lSwitch;
GLI_xGetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
//read the contents of the autoscroll horizontal speed edit
CString csHorScroll;
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->GetWindowText(csHorScroll);
fUSpeed = (float) atof((char*)LPCTSTR(csHorScroll));
if ( fUSpeed < -C_fAutoScrollEditCoeff )
fUSpeed = -C_fAutoScrollEditCoeff;
else if ( fUSpeed > C_fAutoScrollEditCoeff )
fUSpeed = C_fAutoScrollEditCoeff;
//and store it back in the visual material
fUSpeed /= C_fAutoScrollEditCoeff;
GLI_xSetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, ((fUSpeed != 0.0f) || (fVSpeed != 0.0f)), fUSpeed, fVSpeed);
//notify the change
m_vNotifyChangeToScripts();
//read the values again, to see if the flag is still set
GLI_xGetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->SetCheck(lSwitch);
//rewrite the contents of the edit according to the definitive value of the coefficient
CString csValue;
csValue.Format(C_szAutoScrollStringFormat, fUSpeed * C_fAutoScrollEditCoeff);
csValue.TrimLeft();
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->SetWindowText(csValue);
//the autoscroll parameters are modifiable only if autoscroll is enabled
// GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->EnableWindow(lSwitch);
// GetDlgItem(IDC_EDIT_VERTICALSCROLL )->EnableWindow(lSwitch);
*/
//restore normal message handling
m_bControlsFilledFromMaterial = FALSE;
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnKillFocusEditVerticalScroll()
{
if ( !m_bControlsFilledFromMaterial && m_hEditedVisualMaterial != NULL ) //test handle validity
{
//prevent SetWindowText() generated windows messages from being handled
m_bControlsFilledFromMaterial = TRUE;
//read the contents of the autoscroll horizontal speed edit
CString csVertScroll;
GetDlgItem(IDC_EDIT_VERTICALSCROLL)->GetWindowText(csVertScroll);
float fVSpeed = (float) atof((char*)LPCTSTR(csVertScroll));
if ( fVSpeed < -C_fAutoScrollEditCoeff )
fVSpeed = -C_fAutoScrollEditCoeff;
else if ( fVSpeed > C_fAutoScrollEditCoeff )
fVSpeed = C_fAutoScrollEditCoeff;
//and store it back in the visual material
fVSpeed /= C_fAutoScrollEditCoeff;
M_p_oGetEditManager()->AskFor(new tdoChangeAutoScrollModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeAutoScrollModif::E_as_VSpeed,
1, 0.0f, fVSpeed)
);
/*
//get the old values
float fUSpeed, fVSpeed;
long lSwitch;
GLI_xGetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
//read the contents of the autoscroll horizontal speed edit
CString csVertScroll;
GetDlgItem(IDC_EDIT_VERTICALSCROLL)->GetWindowText(csVertScroll);
fVSpeed = (float) atof((char*)LPCTSTR(csVertScroll));
if ( fVSpeed < -C_fAutoScrollEditCoeff )
fVSpeed = -C_fAutoScrollEditCoeff;
else if ( fVSpeed > C_fAutoScrollEditCoeff )
fVSpeed = C_fAutoScrollEditCoeff;
//and store it back in the visual material
fVSpeed /= C_fAutoScrollEditCoeff;
GLI_xSetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, ((fUSpeed != 0.0f) || (fVSpeed != 0.0f)), fUSpeed, fVSpeed);
//notify the change
m_vNotifyChangeToScripts();
//read the values again, to see if the flag is still set
GLI_xGetMaterialTextureScrollingCoef(m_hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->SetCheck(lSwitch);
//rewrite the contents of the edit according to the definitive value of the coefficient
CString csValue;
csValue.Format(C_szAutoScrollStringFormat, fVSpeed * C_fAutoScrollEditCoeff);
csValue.TrimLeft();
GetDlgItem(IDC_EDIT_VERTICALSCROLL)->SetWindowText(csValue);
//the autoscroll parameters are modifiable only if autoscroll is enabled
// GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->EnableWindow(lSwitch);
// GetDlgItem(IDC_EDIT_VERTICALSCROLL )->EnableWindow(lSwitch);
*/
//restore normal message handling
m_bControlsFilledFromMaterial = FALSE;
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnCheckBackface()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialStateModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialStateModif::E_st_Backface
));
/*
unsigned long xType;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xType);
BOOL bBackface = ((CButton *) GetDlgItem(IDC_CHECK_BACKFACE))->GetCheck();
//until the chrome removal function is available... in SetTextureAsEnvironnement()
if ( bBackface )
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsTestingBackface));
else
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType | GLI_C_lIsTestingBackface);
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//notify the change
m_vNotifyChangeToScripts();
*/
}
//==================================================================================================
//==================================================================================================
void DiaView::OnCheckChrome()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialStateModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialStateModif::E_st_Chrome
));
/*
unsigned long xType;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xType);
BOOL bChrome = ((CButton *) GetDlgItem(IDC_CHECK_CHROME))->GetCheck();
//until the chrome removal function is available... in SetTextureAsEnvironnement()
if ( bChrome )
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsNotChromed));
else
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType | GLI_C_lIsNotChromed);
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//notify the change
m_vNotifyChangeToScripts();
*/
}
//==================================================================================================
//==================================================================================================
void DiaView::OnCheckTrans()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialStateModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialStateModif::E_st_Transparent
));
/*
unsigned long xType;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xType);
BOOL bTransparent = ((CButton *) GetDlgItem(IDC_CHECK_TRANS))->GetCheck();
if ( bTransparent )
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsNotGrided));
else
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType | GLI_C_lIsNotGrided);
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//notify the change
m_vNotifyChangeToScripts();
*/
}
//==================================================================================================
//==================================================================================================
void DiaView::OnCheckAlphaSensitive()
{
M_p_oGetEditManager()->AskFor(new tdoChangeMaterialStateModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
tdoChangeMaterialStateModif::E_st_Alpha
));
/*
unsigned long xType;
GLI_xGetMaterialType(m_hEditedVisualMaterial, &xType);
BOOL bAlphaSensitive = ((CButton *) GetDlgItem(IDC_CHECK_ALPHASENSITIVE))->GetCheck();
if ( bAlphaSensitive ) //set the alpha and transparency flags to make it work
{
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsNotLightAlphaSensitive - GLI_C_lIsNotGrided));
//if we check the alpha sensitiveness, we have to set the transparency flag in order to have it work
((CButton *) GetDlgItem(IDC_CHECK_TRANS))->SetCheck(TRUE);
}
else //clear only the alpha flag, because the transparency flag works by itself too
GLI_xSetMaterialType(m_hEditedVisualMaterial, xType | GLI_C_lIsNotLightAlphaSensitive);
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//notify the change
m_vNotifyChangeToScripts();
*/
}
//==================================================================================================
//==================================================================================================
void DiaView::OnButtonAddAnimatedTexture()
{
gs_p_oMaterialInterface->m_p_oGetTextureChooserDialog()->DoModal();
GLI_tdstTexture *hTextureToInsert = NULL;
int iImage = gs_p_oMaterialInterface->m_p_oGetTextureChooserDialog()->m_fn_iGetSelectedImage();
if (iImage != -1)
hTextureToInsert = (GLI_tdstTexture *) gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_lGetBitmapLong(iImage);
if ( hTextureToInsert )
{
short wCurrentTexture = ((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel();
if ( wCurrentTexture == CB_ERR ) //if there are no texture yet
wCurrentTexture = 0; //add at the beginning of the list
else
wCurrentTexture ++; //else add after the current texture
//perform the modif
M_p_oGetEditManager()->AskFor(new tdoInsertAnimatedTextureModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
wCurrentTexture,
hTextureToInsert,
(float) (100.0 + (((float) rand()) / RAND_MAX * 10.0))
));
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnButtonRemoveAnimatedTexture()
{
//get the current animated texture index
short wCurrentTexture = ((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel();
if ( wCurrentTexture != CB_ERR )
{
tdoEditorGameMaterial *p_oGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial();
if (GLI_lGetMaterialNumberOfAnimatedTexture(GMT_fn_hGetVisualMaterial(p_oGameMaterial->m_hGetEngineMaterial())) <= 1)
return;
//perform the modif
M_p_oGetEditManager()->AskFor(new tdoRemoveAnimatedTextureModif(
p_oGameMaterial->m_hGetEngineMaterial(),
wCurrentTexture
));
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnSelchangeComboAnimatedTextures()
{
//make the texture view dialog display the correponding animated texture
short wItem = ((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel();
if ( wItem != CB_ERR )
{
gs_p_oMaterialInterface->m_p_oGetTexView()->m_fn_vShowMaterial(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
wItem
);
//update the moveup/movedown buttons
GetDlgItem(IDC_BUTTON_MOVEUP)->EnableWindow(wItem > 0);
GetDlgItem(IDC_BUTTON_MOVEDOWN)->EnableWindow(wItem < GLI_lGetMaterialNumberOfAnimatedTexture(m_hEditedVisualMaterial) - 1);
}
else
{
GetDlgItem(IDC_BUTTON_MOVEUP)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_MOVEDOWN)->EnableWindow(FALSE);
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnButtonMoveUpTexture()
{
//get the current animated texture index
short wCurrentTexture = ((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel();
//if it can be moved up
if ( wCurrentTexture != CB_ERR && wCurrentTexture > 0 )
{
tdoEditorGameMaterial *p_oGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial();
//move the texture one step earlier in the animation list
M_p_oGetEditManager()->AskFor(new tdoMoveAnimatedTextureModif(
p_oGameMaterial->m_hGetEngineMaterial(),
wCurrentTexture, -1
));
}
}
//==================================================================================================
//==================================================================================================
void DiaView::OnButtonMoveDownTexture()
{
//get the current animated texture index
CComboBox *p_oCombo = (CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES);
short wCurrentTexture = p_oCombo->GetCurSel();
//if it can be moved down
if ( (wCurrentTexture != CB_ERR) && (wCurrentTexture < (p_oCombo->GetCount() - 1)) )
{
tdoEditorGameMaterial *p_oGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial();
//move the texture one step later in the animation list
M_p_oGetEditManager()->AskFor(new tdoMoveAnimatedTextureModif(
p_oGameMaterial->m_hGetEngineMaterial(),
wCurrentTexture, 1
));
}
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateAlphaButton (GMT_tdxHandleToGameMaterial _hMat, BOOL bActivate)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
((CButton *) GetDlgItem(IDC_CHECK_ALPHASENSITIVE))->SetCheck(bActivate);
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateChromeButton (GMT_tdxHandleToGameMaterial _hMat, BOOL bActivate)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
((CButton *) GetDlgItem(IDC_CHECK_CHROME))->SetCheck(bActivate);
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateGouraudButton (GMT_tdxHandleToGameMaterial _hMat, BOOL bActivate)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
{
((CButton *) GetDlgItem(IDC_CHECK_GOURAUD))->SetCheck(FALSE);
GetDlgItem(IDC_CHECK_GOURAUD)->SetWindowText(bActivate ? "Gouraud" : "Flat");
}
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateTextureButton (GMT_tdxHandleToGameMaterial _hMat, BOOL bActivate)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
{
((CButton *) GetDlgItem(IDC_CHECK_TEXTURE))->SetCheck(bActivate);
//now make the visual and texture views update their contents
m_fn_vShowMaterial(gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel());
GetDlgItem(IDC_BUTTON_ADDANIMATED)->EnableWindow(bActivate);
}
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateBackfaceButton (GMT_tdxHandleToGameMaterial _hMat, BOOL bActivate)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
((CButton *) GetDlgItem(IDC_CHECK_BACKFACE))->SetCheck(bActivate);
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateTransparentButton (GMT_tdxHandleToGameMaterial _hMat, BOOL bActivate)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
((CButton *) GetDlgItem(IDC_CHECK_TRANS))->SetCheck(bActivate);
}
//==================================================================================================
//==================================================================================================
void DiaView::m_fn_vUpdateAutoScroll (GMT_tdxHandleToGameMaterial _hMat, long lSwitch, float fUSpeed, float fVSpeed)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
if (hEditedVisualMaterial != m_hEditedVisualMaterial)
m_fn_vShowMaterial(_hMat);
else
{
CString csValue;
// update autoscroll button
((CButton *) GetDlgItem(IDC_CHECK_AUTOSCROLL))->SetCheck(lSwitch);
// update U value
csValue.Format(C_szAutoScrollStringFormat, fUSpeed * C_fAutoScrollEditCoeff);
csValue.TrimLeft();
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->SetWindowText(csValue);
// update V value
csValue.Format(C_szAutoScrollStringFormat, fVSpeed * C_fAutoScrollEditCoeff);
csValue.TrimLeft();
GetDlgItem(IDC_EDIT_VERTICALSCROLL)->SetWindowText(csValue);
//make the texture view redisplay the current texture
gs_p_oMaterialInterface->m_p_oGetTexView()->m_fn_vShowMaterial(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
((CComboBox *) GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES))->GetCurSel()
);
//the autoscroll parameters are modifiable only if autoscroll is enabled
GetDlgItem(IDC_EDIT_HORIZONTALSCROLL)->EnableWindow(lSwitch);
GetDlgItem(IDC_EDIT_VERTICALSCROLL )->EnableWindow(lSwitch);
}
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoInsertAnimatedTextureModif::tdoInsertAnimatedTextureModif
(
GMT_tdxHandleToGameMaterial _MyMatHandle,
long _lInsertPoint,
GLI_tdstTexture *_hTexture,
float _fDuration
)
: CPA_Modif(0, "")
{
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_hTexture = _hTexture;
m_p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hTexture);
m_lInsertPoint = _lInsertPoint;
m_fDuration = _fDuration;
m_p_oRemoveAnimatedTextureModif = NULL;
SetName(CString("insertion of texture '") + m_p_oEditorTexture->GetName() + "' in material '" + m_p_oEditedGameMaterial->GetName() + "'");
}
//==================================================================================================
//==================================================================================================
tdoInsertAnimatedTextureModif::~tdoInsertAnimatedTextureModif()
{
if ( m_p_oRemoveAnimatedTextureModif )
{
delete m_p_oRemoveAnimatedTextureModif;
m_p_oRemoveAnimatedTextureModif = NULL;
}
}
//==================================================================================================
//==================================================================================================
BOOL tdoInsertAnimatedTextureModif::Do()
{
if ( m_p_oRemoveAnimatedTextureModif )
return m_p_oRemoveAnimatedTextureModif->Undo();
else
{
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
GLI_vAddMaterialAnimatedTexture(hMaterialVisual, m_lInsertPoint, m_hTexture, m_fDuration);
if ( m_lInsertPoint == 0 ) //if we insert the texture at the beginning of the list
{
//make it the standard unanimated texture too
GLI_xSetMaterialTexture(hMaterialVisual, m_hTexture);
//tell the material list view to update the bitmap associated to this game material
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_vResetMaterialItemTexture(m_p_oEditedGameMaterial);
}
//set the textured flag, if it was not set
unsigned long xMType;
GLI_xGetMaterialType(hMaterialVisual, &xMType);
GLI_xSetMaterialType(hMaterialVisual, xMType | GLI_C_lIsTextured);
//tel the engine that something changed about the texture animation for this material
GLI_xRefreshAnimatedTexture(hMaterialVisual);
//notify the changes to the scripts
tdoEditorVisualMaterial *p_oVisualMaterial = (tdoEditorVisualMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hMaterialVisual);
p_oVisualMaterial->fn_vNotifySave();
//create the coherence manager link
if ( m_p_oEditorTexture )
g_oCoherenceManager.m_fn_vAddALink(p_oVisualMaterial, m_p_oEditorTexture);
//if the material is currenly visible
if ( m_p_oEditedGameMaterial == gs_p_oMaterialInterface->m_p_oGetEditedMaterial() )
//make the texture and material view update their display
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vShowMaterial(m_hEditedGameMaterial, m_lInsertPoint);
//now create an opposite modif for further do/undo operation
m_p_oRemoveAnimatedTextureModif = new tdoRemoveAnimatedTextureModif(m_hEditedGameMaterial, m_lInsertPoint);
return TRUE;
}
}
//==================================================================================================
//==================================================================================================
BOOL tdoInsertAnimatedTextureModif::Undo()
{
return m_p_oRemoveAnimatedTextureModif ? m_p_oRemoveAnimatedTextureModif->Do() : FALSE;
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoRemoveAnimatedTextureModif::tdoRemoveAnimatedTextureModif
(
GMT_tdxHandleToGameMaterial _MyMatHandle,
long _lRemovePoint
)
: CPA_Modif(0, "")
{
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_lRemovePoint = _lRemovePoint;
GLI_vGetMaterialAnimatedTexture(GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial), m_lRemovePoint, &m_hTexture, &m_fDuration);
m_p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hTexture);
m_p_oInsertAnimatedTextureModif = NULL;
SetName(CString("Removal of texture '") + m_p_oEditorTexture->GetName() + "' from material '" + m_p_oEditedGameMaterial->GetName() + "'");
}
//==================================================================================================
//==================================================================================================
tdoRemoveAnimatedTextureModif::~tdoRemoveAnimatedTextureModif()
{
if ( m_p_oInsertAnimatedTextureModif )
{
delete m_p_oInsertAnimatedTextureModif;
m_p_oInsertAnimatedTextureModif = NULL;
}
}
//==================================================================================================
//==================================================================================================
BOOL tdoRemoveAnimatedTextureModif::Do()
{
if ( m_p_oInsertAnimatedTextureModif )
return m_p_oInsertAnimatedTextureModif->Undo();
else
{
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
//remove the animated texture from the list
GLI_vDeleteMaterialAnimatedTexture(hMaterialVisual, m_lRemovePoint);
//if this was the last texture, untexture the material completely
long lNewNbAnimatedTextures = GLI_lGetMaterialNumberOfAnimatedTexture(hMaterialVisual);
if ( lNewNbAnimatedTextures == 0 )
{
//remove the texture pointer
GLI_xSetMaterialTexture(hMaterialVisual, NULL);
//remove the textured flag, and setthe flag telling the chrome effect is disabled
unsigned long xMType;
GLI_xGetMaterialType(hMaterialVisual, &xMType);
GLI_xSetMaterialType(hMaterialVisual, xMType & ~GLI_C_lIsTextured | ~GLI_C_lIsNotChromed);
}
else if ( m_lRemovePoint == 0 ) //there remains at least one texture in the animation list
{
//make the material reference the new first texture as its standard unanimated texture
GLI_tdstTexture *hNewStdTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(hMaterialVisual, m_lRemovePoint, &hNewStdTexture, &fDuration);
GLI_xSetMaterialTexture(hMaterialVisual, hNewStdTexture);
//tell the material list view to update the bitmap associated to this game material
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_vResetMaterialItemTexture(m_p_oEditedGameMaterial);
}
//tel the engine that something changed about the texture animation for this material
GLI_xRefreshAnimatedTexture(hMaterialVisual);
//save the visual material section
tdoEditorVisualMaterial *p_oVisualMaterial = (tdoEditorVisualMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hMaterialVisual);
p_oVisualMaterial->fn_vNotifySave();
//remove the cohemngr link
g_oCoherenceManager.m_fn_vRemoveALink(p_oVisualMaterial, m_p_oEditorTexture);
//if the material is currenly visible
if ( m_p_oEditedGameMaterial == gs_p_oMaterialInterface->m_p_oGetEditedMaterial() )
//redisplay it completely
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vShowMaterial(m_hEditedGameMaterial, m_lRemovePoint);
m_p_oInsertAnimatedTextureModif = new tdoInsertAnimatedTextureModif(m_hEditedGameMaterial, m_lRemovePoint, m_hTexture, m_fDuration);
}
return TRUE;
}
//==================================================================================================
//==================================================================================================
BOOL tdoRemoveAnimatedTextureModif::Undo()
{
return m_p_oInsertAnimatedTextureModif ? m_p_oInsertAnimatedTextureModif->Do() : FALSE;
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoMoveAnimatedTextureModif::tdoMoveAnimatedTextureModif(GMT_tdxHandleToGameMaterial _MyMatHandle, long _lMoved, long _lDirection)
: CPA_Modif(0, "")
{
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_lMovedPoint = _lMoved;
//we work only by swap: we dont exchange position of non-contiguous animation components
m_lDirection = (_lDirection > 0) ? 1 : -1;
//check that the move is al least possible
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
if ( !GLI_lGetMaterialNumberOfAnimatedTexture(hMaterialVisual) )
m_lDirection = 0;
else
{
GLI_tdstTexture *hTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(hMaterialVisual, m_lMovedPoint, &hTexture, &fDuration);
CString csName = gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hTexture)->GetName() + " texture moved ";
csName += m_lDirection < 0 ? "up" : "down";
SetName(csName);
}
}
//==================================================================================================
//==================================================================================================
tdoMoveAnimatedTextureModif::~tdoMoveAnimatedTextureModif()
{
}
//==================================================================================================
//==================================================================================================
BOOL tdoMoveAnimatedTextureModif::Do()
{
//if the constructor decided the move is irrelevant, tell the modif did not occur
if ( !m_lDirection )
return FALSE;
//compute the upper and lower index being swapped
long lUpper, lLower = lUpper = m_lMovedPoint;
if ( m_lDirection > 0 )
lUpper += m_lDirection;
else
lLower += m_lDirection;
//we swap by removing the element with the higher index and insert it at the lower index
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
//read the animation nodes
GLI_tdstTexture *hTextureUp, *hTextureDown;
float fDurationUp, fDurationDown;
GLI_vGetMaterialAnimatedTexture(hMaterialVisual, lUpper, &hTextureUp, &fDurationUp);
GLI_vGetMaterialAnimatedTexture(hMaterialVisual, lLower, &hTextureDown, &fDurationDown);
//and modify them, swapping the datae
GLI_vModifyMaterialAnimatedTexture(hMaterialVisual, lLower, hTextureUp, fDurationUp);
GLI_vModifyMaterialAnimatedTexture(hMaterialVisual, lUpper, hTextureDown, fDurationDown);
//if the swapped element is the first of the list
if ( lLower == 0 )
{
//make the ex-upper texture the default unanimated texture
GLI_xSetMaterialTexture(hMaterialVisual, hTextureUp);
//tell the material list view to update the bitmap associated to this game material
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_vResetMaterialItemTexture(m_p_oEditedGameMaterial);
}
//tel the engine that something changed about the texture animation for this material
GLI_xRefreshAnimatedTexture(hMaterialVisual);
//and save the visual material section
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hMaterialVisual)->fn_vNotifySave();
//now do the same thing for the combo box, if the material is the one being edited
if ( m_p_oEditedGameMaterial == gs_p_oMaterialInterface->m_p_oGetEditedMaterial() )
{
CComboBox *p_oCombo = (CComboBox *) gs_p_oMaterialInterface->m_p_oGetVisualView()->GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES);
long lCurSel = p_oCombo->GetCurSel();
//if the element is the lower, resinsert it one step later, else one step earlier
lCurSel += (lCurSel == lLower) ? 1 : -1;
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vShowMaterial(m_hEditedGameMaterial, lCurSel);
//read the name and texture pointer in the current item of the texture list
/*CString csName;
p_oCombo->GetLBText(lCurSel, csName);
tdoEditorTexture *p_oTexture = (tdoEditorTexture *) p_oCombo->GetItemDataPtr(lCurSel);
p_oCombo->DeleteString(lCurSel);
p_oCombo->InsertString(lCurSel, csName);
p_oCombo->SetItemDataPtr(lCurSel, p_oTexture);
//reselect the item in the combo
p_oCombo->SetCurSel(lCurSel);*/
}
return TRUE;
}
//==================================================================================================
//==================================================================================================
BOOL tdoMoveAnimatedTextureModif::Undo()
{
//do and undo are equivalent, because it is a position swap
return Do();
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoChangeMaterialColorModif::tdoChangeMaterialColorModif
(
GMT_tdxHandleToGameMaterial _MyMatHandle,
tdeColorType _eType
)
: CPA_Modif(0, "")
{
m_bGoForIt = FALSE;
//get the edited game material handles
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_eType = _eType;
//read the color to be edited
CString csName;
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
long lDlgItem;
switch (m_eType)
{
case E_ct_Ambient:
GLI_xGetMaterialAmbientCoef(hMaterialVisual, &m_xColorBeforeDo);
csName = "Ambient";
lDlgItem = IDC_BUTTON_AMBIENT;
break;
case E_ct_Diffuse:
GLI_xGetMaterialDiffuseCoef(hMaterialVisual, &m_xColorBeforeDo);
csName = "Diffuse";
lDlgItem = IDC_BUTTON_DIFFUSE;
break;
case E_ct_Specular:
GLI_xGetMaterialSpecularCoef(hMaterialVisual, &m_lSpecExp, &m_xColorBeforeDo);
csName = "Specular";
lDlgItem = IDC_BUTTON_SPECULAR;
break;
}
//call the color edit dialog
m_xColorAfterDo = m_xColorBeforeDo;
m_bGoForIt = fn_bEditColor(gs_p_oMaterialInterface->m_p_oGetVisualView()->GetDlgItem(lDlgItem), &m_xColorAfterDo);
//set the name of the modif
csName += " color change (" + m_p_oEditedGameMaterial->GetName() + ")";
SetName(csName);
}
//==================================================================================================
//==================================================================================================
tdoChangeMaterialColorModif::~tdoChangeMaterialColorModif()
{
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeMaterialColorModif::Do()
{
return m_bGoForIt ? m_bDoIt(m_xColorAfterDo) : FALSE;
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeMaterialColorModif::Undo()
{
return m_bGoForIt ? m_bDoIt(m_xColorBeforeDo) : FALSE;
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeMaterialColorModif::m_bDoIt(GLI_tdstColor _xNewColor)
{
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
long lDglItem;
switch ( m_eType )
{
case E_ct_Ambient:
GLI_xSetMaterialAmbientCoef(hMaterialVisual, &_xNewColor);
lDglItem = IDC_BUTTON_AMBIENT;
break;
case E_ct_Diffuse:
GLI_xSetMaterialDiffuseCoef(hMaterialVisual, &_xNewColor);
lDglItem = IDC_BUTTON_DIFFUSE;
break;
case E_ct_Specular:
GLI_xSetMaterialSpecularCoef(hMaterialVisual, m_lSpecExp, &_xNewColor);
lDglItem = IDC_BUTTON_SPECULAR;
break;
}
if ( m_p_oEditedGameMaterial == gs_p_oMaterialInterface->m_p_oGetEditedMaterial() )
{
gs_p_oMaterialInterface->m_p_oGetVisualView()->GetDlgItem(lDglItem)->Invalidate();
}
//if the edited game material is used in the scene
if ( m_p_oEditedGameMaterial->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//tell the material has to be saved
tdoEditorVisualMaterial *p_oVisualMaterial = (tdoEditorVisualMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hMaterialVisual);
p_oVisualMaterial->fn_vNotifySave();
return TRUE;
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoChangeMaterialStateModif::tdoChangeMaterialStateModif (GMT_tdxHandleToGameMaterial _MyMatHandle, tdeStateType _eType)
: CPA_Modif(0, "")
{
//get the edited game material handles
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_eType = _eType;
m_bFirstTime = TRUE;
// get current material type
ACP_tdxHandleOfMaterial hEditedVisualMaterial= GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
GLI_xGetMaterialType(hEditedVisualMaterial, &m_xMaterialType);
CString csName = "Change ";
switch (m_eType)
{
case E_st_Alpha:
m_bActivated = !(m_xMaterialType & GLI_C_lIsNotLightAlphaSensitive);
m_bTransparent = (m_xMaterialType & GLI_C_lIsNotGrided);
csName += "alpha sensitivity";
break;
case E_st_Transparent:
m_bActivated = !(m_xMaterialType & GLI_C_lIsNotGrided);
csName += "transparency";
break;
case E_st_Textured:
m_bActivated = (m_xMaterialType & GLI_C_lIsTextured);
csName += "textured state";
break;
case E_st_Gouraud:
m_bActivated = (m_xMaterialType & GLI_C_lIsGouraud);
csName += "gouraud state";
break;
case E_st_Chrome:
m_bActivated = GLI_bIsMaterialChromed(hEditedVisualMaterial);
csName += "chrome state";
break;
case E_st_Backface:
m_bActivated = GLI_bIsMaterialBackface(hEditedVisualMaterial);
csName += "backface state";
break;
default:
break;
}
//set the name of the modif
csName += " of " + m_p_oEditedGameMaterial->GetName();
SetName(csName);
}
//==================================================================================================
//==================================================================================================
tdoChangeMaterialStateModif::~tdoChangeMaterialStateModif()
{
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeMaterialStateModif::Do()
{
return fn_bChangeState(!m_bActivated);
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeMaterialStateModif::Undo()
{
return fn_bChangeState(m_bActivated);
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeMaterialStateModif::fn_bChangeState (BOOL bActivate)
{
// get current material type
ACP_tdxHandleOfMaterial hEditedVisualMaterial;
GLI_tdstTexture *p_stTexture;
unsigned long xType;
hEditedVisualMaterial= GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
GLI_xGetMaterialType(hEditedVisualMaterial, &xType);
switch (m_eType)
{
case E_st_Alpha:
// change material state
if (bActivate)
{
GLI_xSetMaterialType(hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsNotLightAlphaSensitive - GLI_C_lIsNotGrided));
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateTransparentButton(m_hEditedGameMaterial, TRUE);
}
else
{
GLI_xSetMaterialType(hEditedVisualMaterial, xType | GLI_C_lIsNotLightAlphaSensitive);
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateTransparentButton(m_hEditedGameMaterial, m_bTransparent);
}
// if necessary, update sate of controls
if (!m_bFirstTime)
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateAlphaButton(m_hEditedGameMaterial,bActivate);
break;
case E_st_Transparent:
// change material state
if (bActivate)
GLI_xSetMaterialType(hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsNotGrided));
else
GLI_xSetMaterialType(hEditedVisualMaterial, xType | GLI_C_lIsNotGrided);
// if necessary, update sate of controls
if (!m_bFirstTime)
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateTransparentButton(m_hEditedGameMaterial,bActivate);
break;
case E_st_Textured:
//we display the first texture of the animation
GLI_xGetMaterialTexture(hEditedVisualMaterial, &p_stTexture);
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vSetItemImage(
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_lGetSelectedItem(),
(short) (
bActivate
? gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndexByLong((long) p_stTexture)
: gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndex(C_szNoBitmapName)
)
);
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vRedrawSelectedItem();
// change material state
if (bActivate)
GLI_xSetMaterialType(hEditedVisualMaterial, xType | GLI_C_lIsTextured);
else
GLI_xSetMaterialType(hEditedVisualMaterial, xType & ~GLI_C_lIsTextured);
// if necessary, update sate of controls
if (!m_bFirstTime)
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateTextureButton(m_hEditedGameMaterial,bActivate);
break;
case E_st_Gouraud:
// change material state
if (bActivate)
GLI_xSetMaterialType(hEditedVisualMaterial, xType | GLI_C_lIsGouraud);
else
GLI_xSetMaterialType(hEditedVisualMaterial, xType & ~GLI_C_lIsGouraud);
// if necessary, update sate of controls
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateGouraudButton(m_hEditedGameMaterial,bActivate);
break;
case E_st_Chrome:
// change material state
if (bActivate)
GLI_xSetMaterialType(hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsNotChromed));
else
GLI_xSetMaterialType(hEditedVisualMaterial, xType | GLI_C_lIsNotChromed);
// if necessary, update sate of controls
if (!m_bFirstTime)
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateChromeButton(m_hEditedGameMaterial,bActivate);
break;
case E_st_Backface:
// change material state
if (bActivate)
GLI_xSetMaterialType(hEditedVisualMaterial, xType & (GLI_C_lAllIsEnable - GLI_C_lIsTestingBackface));
else
GLI_xSetMaterialType(hEditedVisualMaterial, xType | GLI_C_lIsTestingBackface);
// if necessary, update sate of controls
if (!m_bFirstTime)
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateBackfaceButton(m_hEditedGameMaterial,bActivate);
break;
default:
return FALSE;
}
//if the edited game material is used in the scene
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_bIsReferenced() )
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//notify the change
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEditedVisualMaterial)->fn_vNotifySave();
m_bFirstTime = FALSE;
return TRUE;
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoChangeAutoScrollModif::tdoChangeAutoScrollModif (GMT_tdxHandleToGameMaterial _MyMatHandle, tdeAutoScroll eType, long lSwitch, float fUSpeed, float fVSpeed)
: CPA_Modif(0, "")
{
//get the edited game material handles
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_eType = eType;
// get current material type
ACP_tdxHandleOfMaterial hEditedVisualMaterial= GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
//get the old values
GLI_xGetMaterialTextureScrollingCoef(hEditedVisualMaterial, 0, &m_lOldSwitch, &m_fOldUSpeed, &m_fOldVSpeed);
m_lNewSwitch = (eType == E_as_Switch) ? lSwitch : m_lOldSwitch;
m_fNewUSpeed = (eType == E_as_USpeed) ? fUSpeed : m_fOldUSpeed;
m_fNewVSpeed = (eType == E_as_VSpeed) ? fVSpeed : m_fOldVSpeed;
//set the name of the modif
CString csName = "Change Autoscroll of " + m_p_oEditedGameMaterial->GetName();
SetName(csName);
}
//==================================================================================================
//==================================================================================================
tdoChangeAutoScrollModif::~tdoChangeAutoScrollModif()
{
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeAutoScrollModif::Do()
{
return fn_bChangeState(TRUE);
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeAutoScrollModif::Undo()
{
return fn_bChangeState(FALSE);
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeAutoScrollModif::fn_bChangeState (BOOL bDo)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial= GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
float fUSpeed, fVSpeed;
long lSwitch;
switch (m_eType)
{
case E_as_Switch:
// check new state
lSwitch = (!bDo) ? m_lOldSwitch : m_lNewSwitch;
//read the contents of the autoscroll switch
if (lSwitch)
{
//if we want to enable autoscroll, make sure the engine function will not clear the flag
//when it sees that the speeds are null...
if ( m_fOldUSpeed == 0.0 && m_fOldVSpeed == 0.0 )
m_fOldUSpeed = (float) (1.0 / C_fAutoScrollEditCoeff);
//enable tiling of all the textures used by this material, so that autoscroll remains nice
long lNbtextures = GLI_lGetMaterialNumberOfAnimatedTexture(hEditedVisualMaterial);
for ( lNbtextures --; lNbtextures >= 0; lNbtextures -- )
{
GLI_tdstTexture *hTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(hEditedVisualMaterial, lNbtextures, &hTexture, &fDuration);
TEX_vSetTextureTilingMode(hTexture, TRUE, TRUE);
//do not forget to save the section
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hTexture)->fn_vNotifySave();
}
}
//and store it back in the visual material
GLI_xSetMaterialTextureScrollingCoef(hEditedVisualMaterial, 0, lSwitch, m_fOldUSpeed, m_fOldVSpeed);
//notify the change
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEditedVisualMaterial)->fn_vNotifySave();
// update dialog
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateAutoScroll(m_hEditedGameMaterial,lSwitch, m_fOldUSpeed, m_fOldVSpeed);
break;
case E_as_USpeed:
case E_as_VSpeed:
// check new values
fUSpeed = (!bDo) ? m_fOldUSpeed : m_fNewUSpeed;
fVSpeed = (!bDo) ? m_fOldVSpeed : m_fNewVSpeed;
// update material
GLI_xSetMaterialTextureScrollingCoef(hEditedVisualMaterial, 0, ((fUSpeed != 0.0f) || (fVSpeed != 0.0f)), fUSpeed, fVSpeed);
//notify the change
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEditedVisualMaterial)->fn_vNotifySave();
//read the values again, to see if the flag is still set
GLI_xGetMaterialTextureScrollingCoef(hEditedVisualMaterial, 0, &lSwitch, &fUSpeed, &fVSpeed);
// update dialog
gs_p_oMaterialInterface->m_p_oGetVisualView()->m_fn_vUpdateAutoScroll(m_hEditedGameMaterial,lSwitch, fUSpeed, fVSpeed);
break;
default :
return FALSE;
}
return TRUE;
}