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

928 lines
37 KiB
C++

// diatext.cpp : implementation file
//
#include "stdafx.h"
#include "Acp_Base.h"
#define HieFriend
#include "incgli.h"
#include "inctex.h"
#include "_interf.hpp"
#include "GMatObj.hpp"
#include "VMatObj.hpp"
#include "diatext.hpp"
#include "DiaView.hpp"
#include "TextureDlg.h"
#include "TexObj.hpp"
#include "choosecolor.hpp"
#include "MatList.hpp"
#include "x:\cpa\main\inc\_editid.h"
#include "TUT.h"
#define C_szDurationStringFormat "%6.2f"
extern Material_Interface *gs_p_oMaterialInterface;
static BOOL g_sModalLoop = FALSE;
/////////////////////////////////////////////////////////////////////////////
// DiaMain dialog
IMPLEMENT_DYNCREATE(DiaText, CFormView)
DiaText::DiaText()
: CFormView(DiaText::IDD)
{
m_hEditedTexture = NULL;
m_bDisplaySupplyTexture = FALSE;
m_lAnimatedTextureIndex = -1;
m_nRPixelColor = 0;
m_nGPixelColor = 0;
m_nBPixelColor = 0;
//{{AFX_DATA_INIT(DiaText)
//}}AFX_DATA_INIT
}
void DiaText::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DiaText)
//}}AFX_DATA_MAP
}
DiaText::~DiaText()
{
m_oMemDC.SelectObject(m_p_oPreviousSelectedBitmap);
m_oMemBitmap.DeleteObject();
m_oMemDC.DeleteDC();
}
BEGIN_MESSAGE_MAP(DiaText, CFormView)
//{{AFX_MSG_MAP(DiaText)
ON_WM_CREATE()
ON_WM_DRAWITEM()
ON_BN_CLICKED(IDC_BUTTON_VISUEL, OnButtonVisuel)
ON_BN_CLICKED(IDC_BUTTON_PRIORITY, OnButtonPriority)
ON_BN_CLICKED(IDC_BUTTON_QUALITYLEVEL, OnButtonQualityLevel)
ON_BN_CLICKED(IDC_CHECK_HORIZONTALTILE, OnCheckTile)
ON_BN_CLICKED(IDC_BUTTON_CHROMAKEYCOLOR, OnButtonChromakeyColor)
ON_BN_CLICKED(IDC_CHECK_HORIZONTALFILTERING, OnCheckFilter)
ON_BN_CLICKED(IDC_BUTTON_SUPPLYTEXTURE, OnButtonSupplyTexture)
ON_EN_KILLFOCUS(IDC_EDIT_DURATION, OnKillFocusEditDuration)
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDOWN()
ON_BN_CLICKED(IDC_CHECK_VERTICALTILE, OnCheckTile)
ON_BN_CLICKED(IDC_CHECK_VERTICALFILTERING, OnCheckFilter)
ON_BN_CLICKED(IDC_CHECK_DEPTHFILTERING, OnCheckFilter)
ON_BN_CLICKED(IDC_BUTTON_PIXELCOLOR, OnButtonPixelcolor)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DiaText message handlers
//==================================================================================================
//==================================================================================================
int DiaText::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
CString csMessage;
switch ( CWnd::OnToolHitTest(point, pTI) )
{
default:
csMessage = "???????????????????????????????????????????????????????????";
break;
//Mircea Dunka 04.11.98
case IDC_BUTTON_PIXELCOLOR:
csMessage = "color picked from scene (click to set chromakey)";
break;
//end Mircea Dunka
case IDC_STATIC:
csMessage = "";
break;
case IDC_EDIT_DURATION:
csMessage = "set the duration in seconds that the current texture will be displayed";
break;
case IDC_BUTTON_VISUEL:
csMessage = "left click to view/edit the texture OR right click to get the color";
break;
case IDC_BUTTON_PRIORITY:
csMessage = "change the priority of this texture to adapt to memory restrictions";
break;
case IDC_BUTTON_QUALITYLEVEL:
csMessage = "change the quality of this texture to adapt to memory restrictions";
break;
case IDC_CHECK_HORIZONTALTILE:
case IDC_CHECK_VERTICALTILE:
csMessage = "enable/disable texture tiling";
break;
case IDC_CHECK_HORIZONTALFILTERING:
case IDC_CHECK_VERTICALFILTERING:
case IDC_CHECK_DEPTHFILTERING:
csMessage = "enable/disable texture bilinear filtering";
break;
case IDC_BUTTON_CHROMAKEYCOLOR:
csMessage = "Chromakey / alpha";
break;
case IDC_BUTTON_SUPPLYTEXTURE:
csMessage = "swap display between the main and supply texture";
break;
}
//output the help info in the status bar
fn_vGiveProgressInfo(csMessage, -1);
//there is no hit for a true tooltip
return -1;
}
//==================================================================================================
// Description : handle function for WM_CREATE
//==================================================================================================
int DiaText::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
EnableToolTips(TRUE);
m_oMemDC.CreateCompatibleDC( NULL );
m_oMemBitmap.CreateCompatibleBitmap( this->GetDC(), 16, 16);
m_p_oPreviousSelectedBitmap = m_oMemDC.SelectObject(&m_oMemBitmap);
return 0;
}
//==================================================================================================
// Description : handle function for WM_DRAWITEM
//==================================================================================================
BOOL DiaText::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_BUTTON_SUPPLYTEXTURE,"TGM_DiaTextButtonSupplyTexture",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_VISUEL,"TGM_DiaTextButtonVisuel",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_PRIORITY,"TGM_DiaTextButtonPriority",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_QUALITYLEVEL,"TGM_DiaTextButtonQyalityLevel",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_HORIZONTALFILTERING,"TGM_DiaTextCheckHorizontalFiltering",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_VERTICALFILTERING,"TGM_DiaTextCheckVerticalFiltering",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_DEPTHFILTERING,"TGM_DiaTextCheckDepthFiltering",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_HORIZONTALTILE,"TGM_DiaTextcheckHorizontalTiling",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_CHECK_VERTICALTILE,"TGM_DiaTextCheckVerticalTiling",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_BUTTON_CHROMAKEYCOLOR,"TGM_DiaTextButtonChromakeyColor",TUT_e_Button);
TUT_M_vRegisterControlID(IDC_EDIT_DURATION,"TGM_DiaTextEditDuration",TUT_e_TextEdit);
//Mircea Dunka 4.11.98
TUT_M_vRegisterControlID(IDC_BUTTON_PIXELCOLOR,"TGM_PixelColor",TUT_e_Button);
//end Mircea Dunka
return bResult;
}
//==================================================================================================
//==================================================================================================
void DiaText::m_fn_vShowMaterial(GMT_tdxHandleToGameMaterial _hMat, long _lAnimatedTextureIndex /*= -1*/)
{
m_lAnimatedTextureIndex = _lAnimatedTextureIndex;
tdoEditorGameMaterial *p_oEditedGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial();
BOOL bAGameMAterialIsEdited = p_oEditedGameMaterial ? TRUE : FALSE;
/* if no material is currently selected, disable everything */
if ( !bAGameMAterialIsEdited )
{
m_lAnimatedTextureIndex = -1;
m_hEditedTexture = NULL; //invalidate the handle
//clear the controls
GetDlgItem(IDC_EDIT_DURATION )->SetWindowText("");
((CButton *) GetDlgItem(IDC_CHECK_HORIZONTALTILE ))->SetCheck(FALSE);
((CButton *) GetDlgItem(IDC_CHECK_VERTICALTILE ))->SetCheck(FALSE);
((CButton *) GetDlgItem(IDC_CHECK_HORIZONTALFILTERING))->SetCheck(FALSE);
((CButton *) GetDlgItem(IDC_CHECK_VERTICALFILTERING ))->SetCheck(FALSE);
((CButton *) GetDlgItem(IDC_CHECK_DEPTHFILTERING ))->SetCheck(FALSE);
//change the texture before the button is disabled, else it will not be displayed...
m_fn_vChangeTexture(NULL);
//Mircea Dunka 5.11.1998
//I need this button remain this way all the time!!!
GetDlgItem(IDC_BUTTON_VISUEL )->EnableWindow(FALSE);
m_bButtonVisuelEnabled = FALSE;
GetDlgItem(IDC_BUTTON_PIXELCOLOR )->EnableWindow(FALSE);
//end Mircea Dunka
GetDlgItem(IDC_BUTTON_PRIORITY )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_QUALITYLEVEL )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_HORIZONTALTILE )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_VERTICALTILE )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_HORIZONTALFILTERING)->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_VERTICALFILTERING )->EnableWindow(FALSE);
GetDlgItem(IDC_CHECK_DEPTHFILTERING )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_CHROMAKEYCOLOR )->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_SUPPLYTEXTURE )->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_DURATION )->EnableWindow(FALSE);
return;
}
//normally, the specified engine game material must belong to the current editor game material...
ASSERT(_hMat == p_oEditedGameMaterial->GetData());
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(_hMat);
float fDuration = 0.0f;
//get the texture's handle
if ( m_lAnimatedTextureIndex == -1 )
m_hEditedTexture = NULL;
else //get the animated texture instead
GLI_vGetMaterialAnimatedTexture(hEditedVisualMaterial, m_lAnimatedTextureIndex, &m_hEditedTexture, &fDuration);
//fill the duration control
BOOL bEditDuration = (m_hEditedTexture ? TRUE : FALSE) && (GLI_lGetMaterialNumberOfAnimatedTexture(hEditedVisualMaterial) > 1);
if ( bEditDuration )
{
CString csDuration;
csDuration.Format(C_szDurationStringFormat, fDuration);
csDuration.TrimLeft();
GetDlgItem(IDC_EDIT_DURATION)->SetWindowText(csDuration);
}
else
GetDlgItem(IDC_EDIT_DURATION)->SetWindowText("");
GetDlgItem(IDC_EDIT_DURATION)->EnableWindow(bEditDuration);
BOOL bTheMaterialIsTextured = (m_hEditedTexture ? TRUE : FALSE);
m_bControlsFilledFromMaterial = TRUE;
GLI_tdstTexture *p_stTextureToDisplay = NULL;
GetDlgItem(IDC_BUTTON_SUPPLYTEXTURE)->SetWindowText(m_bDisplaySupplyTexture ? "Supply texture" : "Primary texture");
if ( bTheMaterialIsTextured )
{
p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
if ( p_stTextureToDisplay == NULL ) //can only happen if we want to display the supplied texture and there is none
bTheMaterialIsTextured = FALSE; //display no texture
unsigned long xMType;
GLI_xGetMaterialType(hEditedVisualMaterial, &xMType);
if (xMType & GLI_C_lIsTextured)
m_fn_vChangeTexture(p_stTextureToDisplay);
else
m_fn_vChangeTexture(NULL);
}
else
m_fn_vChangeTexture(NULL);
if ( bTheMaterialIsTextured )
{
//TODO: priority, bilinear filtering
//fill the controls with the proper values
switch ( TEX_ucGetTextureQualityLevel(p_stTextureToDisplay) )
{
case TEX_C_QLOW:
GetDlgItem(IDC_BUTTON_QUALITYLEVEL)->SetWindowText("Low");
break;
case TEX_C_QNORMAL:
GetDlgItem(IDC_BUTTON_QUALITYLEVEL)->SetWindowText("Normal");
break;
case TEX_C_QHIGH:
GetDlgItem(IDC_BUTTON_QUALITYLEVEL)->SetWindowText("High");
break;
}
long lMipmappingMode = TEX_lGetTextureMipMappingMode(p_stTextureToDisplay);
if ( lMipmappingMode == TEX_C_TRILINEAR )
((CButton *) GetDlgItem(IDC_CHECK_DEPTHFILTERING))->SetCheck(TRUE);
BOOL bFilterU = FALSE, bFilterV = FALSE;
if ( lMipmappingMode == TEX_C_BILINEAR )
{
//TODO: read filtering axis
}
((CButton *) GetDlgItem(IDC_CHECK_HORIZONTALFILTERING))->SetCheck(bFilterU);
((CButton *) GetDlgItem(IDC_CHECK_VERTICALFILTERING ))->SetCheck(bFilterV);
BOOL bTilingX, bTilingY;
TEX_vGetTextureTilingMode(p_stTextureToDisplay, &bTilingX , &bTilingY);
((CButton *) GetDlgItem(IDC_CHECK_HORIZONTALTILE ))->SetCheck(bTilingX);
((CButton *) GetDlgItem(IDC_CHECK_VERTICALTILE ))->SetCheck(bTilingY);
BOOL bActive, bFiltering;
unsigned char ucR, ucG, ucB, ucA;
TEX_vGetTextureChromakey(p_stTextureToDisplay, &bActive, &bFiltering, &ucR, &ucG, &ucB, &ucA);
UpdateData(FALSE); //move the data into the control
}
//enable the button just after the texture is changed
//Mircea Dunka 5.11.1998
//I need this button remain this way all the time!!!
//GetDlgItem(IDC_BUTTON_VISUEL )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_BUTTON_VISUEL )->EnableWindow(FALSE);
m_bButtonVisuelEnabled = bTheMaterialIsTextured;
//end Mircea Dunka
//note that these buttons will be updated by OnDrawItem()
GetDlgItem(IDC_BUTTON_VISUEL )->Invalidate();
GetDlgItem(IDC_BUTTON_CHROMAKEYCOLOR )->Invalidate();
GetDlgItem(IDC_BUTTON_PRIORITY )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_BUTTON_QUALITYLEVEL )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_CHECK_HORIZONTALTILE )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_CHECK_VERTICALTILE )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_CHECK_HORIZONTALFILTERING)->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_CHECK_VERTICALFILTERING )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_CHECK_DEPTHFILTERING )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_BUTTON_CHROMAKEYCOLOR )->EnableWindow(bTheMaterialIsTextured);
GetDlgItem(IDC_BUTTON_SUPPLYTEXTURE )->EnableWindow(bTheMaterialIsTextured || m_bDisplaySupplyTexture);
//Mircea Dunka 16.11.98
GetDlgItem(IDC_BUTTON_PIXELCOLOR )->EnableWindow(bTheMaterialIsTextured);
//end Mircea Dunka
m_bControlsFilledFromMaterial = FALSE;
//Invalidate();
}
//==================================================================================================
// Description : handle function for WM_DRAWITEM
//==================================================================================================
void DiaText::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
RECT *rect = &lpDrawItemStruct->rcItem;
BOOL bATextureIsEdited = m_hEditedTexture ? TRUE : FALSE;
COLORREF xColor;
switch ( nIDCtl )
{
default:
CFormView::OnDrawItem(nIDCtl, lpDrawItemStruct);
break;
case IDC_BUTTON_VISUEL:
{
BITMAP stBitmap;
m_oMemDC.GetCurrentBitmap()->GetBitmap(&stBitmap);
pDC -> StretchBlt(
rect->left, rect->top, rect->right, rect->bottom,
&m_oMemDC,
0, 0, stBitmap.bmWidth, stBitmap.bmHeight,
SRCCOPY
);
}
break;
case IDC_BUTTON_CHROMAKEYCOLOR:
{
unsigned char ucR, ucG, ucB, ucA;
if ( bATextureIsEdited )
{
BOOL bActive, bFiltering;
GLI_tdstTexture *p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
if ( p_stTextureToDisplay )
TEX_vGetTextureChromakey(p_stTextureToDisplay, &bActive, &bFiltering, &ucR, &ucG, &ucB, &ucA);
else
ucR = ucG = ucB = ucA = 0;
xColor = RGB(ucR, ucG, ucB);
}
else
xColor = RGB(192,192,192);
pDC->FillSolidRect( rect, xColor);
//draw the alpha color in the button too, in the righthand third of the rectangle
if ( bATextureIsEdited )
{
short wOffset = (rect->right * 2) / 3;
rect->left += wOffset;
xColor = RGB(ucA, ucA, ucA);
pDC->FillSolidRect(rect, xColor);
}
}
break;
//mircea Dunka 4.11.98
case IDC_BUTTON_PIXELCOLOR:
{
xColor = RGB(m_nRPixelColor, m_nGPixelColor, m_nBPixelColor);
pDC->FillSolidRect(rect,xColor);
COLORREF clrNewTextColor;
if(((m_nRPixelColor >= 128) ? 0:255) + ((m_nGPixelColor >= 128) ? 0:255) + ((m_nBPixelColor >= 128) ? 0:255) > 255)
clrNewTextColor = 0x00FFFFFF;
else
clrNewTextColor = 0x000000000;
COLORREF clrOldTextColor = pDC->SetTextColor(clrNewTextColor);
int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
char szBuffer[20];
wsprintf(szBuffer, "R:%d G:%d B:%d", m_nRPixelColor, m_nGPixelColor, m_nBPixelColor);
pDC->DrawText(szBuffer, strlen(szBuffer), rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
pDC->SetBkMode(nOldBkMode);
pDC->SetTextColor(clrOldTextColor);
}
break;
}
}
//==================================================================================================
//==================================================================================================
void DiaText::OnButtonQualityLevel()
{
GLI_tdstTexture *p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
unsigned char ucQuality = TEX_ucGetTextureQualityLevel(p_stTextureToDisplay);
switch ( ucQuality )
{
case TEX_C_QLOW:
GetDlgItem(IDC_BUTTON_QUALITYLEVEL)->SetWindowText("Normal");
ucQuality = TEX_C_QNORMAL;
break;
case TEX_C_QNORMAL:
GetDlgItem(IDC_BUTTON_QUALITYLEVEL)->SetWindowText("High");
ucQuality = TEX_C_QHIGH;
break;
case TEX_C_QHIGH:
GetDlgItem(IDC_BUTTON_QUALITYLEVEL)->SetWindowText("Low");
ucQuality = TEX_C_QLOW;
break;
}
TEX_vSetTextureQualityLevel(p_stTextureToDisplay, ucQuality);
m_vNotifyChangeToScripts(FALSE, TRUE); //only the texture section is modified
}
//==================================================================================================
//==================================================================================================
void DiaText::OnButtonPriority()
{
static short wPri = 0;
switch ( wPri )
{
case 0:
GetDlgItem(IDC_BUTTON_PRIORITY)->SetWindowText("roglobo");
wPri = 1;
break;
case 1:
GetDlgItem(IDC_BUTTON_PRIORITY)->SetWindowText("gougnapla");
wPri = 2;
break;
case 2:
GetDlgItem(IDC_BUTTON_PRIORITY)->SetWindowText("zorbagnac");
wPri = 0;
break;
}
//m_vNotifyChangeToScripts(FALSE, TRUE); //only the texture section is modified
}
//==================================================================================================
//==================================================================================================
void DiaText::OnCheckTile()
{
GLI_tdstTexture *p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
TEX_vSetTextureTilingMode(
p_stTextureToDisplay,
((CButton *) GetDlgItem(IDC_CHECK_HORIZONTALTILE))->GetCheck(),
((CButton *) GetDlgItem(IDC_CHECK_VERTICALTILE))->GetCheck()
);
m_vNotifyChangeToScripts(FALSE, TRUE); //only the texture section is modified
}
//==================================================================================================
//==================================================================================================
void DiaText::OnCheckFilter()
{
BOOL bFilterU, bFilterV, bFilterZ;
bFilterU = ((CButton *) GetDlgItem(IDC_CHECK_HORIZONTALFILTERING))->GetCheck();
bFilterV = ((CButton *) GetDlgItem(IDC_CHECK_VERTICALFILTERING))->GetCheck();
bFilterZ = ((CButton *) GetDlgItem(IDC_CHECK_DEPTHFILTERING))->GetCheck();
GLI_tdstTexture *p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
long lTypeOfMipMapping;
if ( bFilterZ )
lTypeOfMipMapping = TEX_C_TRILINEAR;
else if ( bFilterU || bFilterV )
lTypeOfMipMapping = TEX_C_BILINEAR;
else
lTypeOfMipMapping = TEX_C_NO_MIPMAPPING;
TEX_vSetTextureMipMappingMode(p_stTextureToDisplay, lTypeOfMipMapping);
//TODO: set axis of bilinear filtering in texture according to bFilterU and bFilterV
m_vNotifyChangeToScripts(FALSE, TRUE); //only the texture section is modified
}
//==================================================================================================
//==================================================================================================
void DiaText::OnButtonVisuel()
{
if (g_sModalLoop)
return;
g_sModalLoop = TRUE;
gs_p_oMaterialInterface->m_p_oGetTextureChooserDialog()->DoModal();
g_sModalLoop = FALSE;
int iImage = gs_p_oMaterialInterface->m_p_oGetTextureChooserDialog()->m_fn_iGetSelectedImage();
if (iImage != -1)
{
GLI_tdstTexture *p_stGliText = (GLI_tdstTexture *) gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_lGetBitmapLong(iImage);
M_p_oGetEditManager()->AskFor(new tdoChangeTextureModif(
gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(),
m_lAnimatedTextureIndex,
p_stGliText,
iImage,
m_bDisplaySupplyTexture
));
/*
GMT_tdxHandleToGameMaterial hGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial();
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(hGameMaterial);
tdoEditorVisualMaterial *p_oVisualMaterial = (tdoEditorVisualMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEditedVisualMaterial);
GLI_tdstTexture *p_stTextureToUnlink = NULL;
CPA_BaseObject *p_oOwnerObject = m_bDisplaySupplyTexture ? gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedTexture) : p_oVisualMaterial;
//find the editor texture associated to the previous texture, and remove the cohemngr link if there is one
if ( m_hEditedTexture )
{
tdoEditorTexture *p_oEditorTexture = NULL;
if ( p_stTextureToUnlink = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture) )
p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(p_stTextureToUnlink);
if ( p_oEditorTexture )
g_oCoherenceManager.m_fn_vRemoveALink(p_oOwnerObject, p_oEditorTexture);
}
//get the pointer on the new texture
GLI_tdstTexture *p_stGliText = (GLI_tdstTexture *) gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_lGetBitmapLong(iImage);
if ( p_stGliText != NULL && p_stTextureToUnlink != p_stGliText ) //if the texture effectively changed
{
//try to find the editor texture for this file, and associate it to the visual material
tdoEditorTexture *p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(p_stGliText);
if ( p_oEditorTexture )
g_oCoherenceManager.m_fn_vAddALink(p_oOwnerObject, p_oEditorTexture);
if ( !m_bDisplaySupplyTexture )
{
GLI_tdstTexture *hChangedTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(hEditedVisualMaterial, m_lAnimatedTextureIndex, &hChangedTexture, &fDuration);
//give the new texture to the engine visual material
GLI_vModifyMaterialAnimatedTexture(hEditedVisualMaterial, m_lAnimatedTextureIndex, p_stGliText, fDuration);
//add the flag saying the material is textured
ACP_tdxIndex xCurrentType;
GLI_xGetMaterialType(hEditedVisualMaterial, &xCurrentType);
GLI_xSetMaterialType(hEditedVisualMaterial, xCurrentType | GLI_C_lIsTextured);
}
else //give the supply texture to the main texture
TEX_vSetSupplyTexture(m_hEditedTexture, p_stGliText);
//display the new texture
m_fn_vShowMaterial(hGameMaterial, m_lAnimatedTextureIndex);
//m_fn_vChangeTexture(p_stGliText);
//GetDlgItem(IDC_BUTTON_VISUEL)->Invalidate();
//update the textured flag button
((CButton *) (gs_p_oMaterialInterface->m_p_oGetVisualMaterialView()->GetDlgItem(IDC_CHECK_TEXTURE)))->SetCheck(TRUE);
//make listview update the displayed texture for the edited game material
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vSetItemImage(
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_lGetSelectedItem(),
(short) iImage
);
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vRedrawSelectedItem();
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
}
m_vNotifyChangeToScripts(TRUE, TRUE); //to be sure everybody is notified (but is the primary texture notified as well ?
*/
}
}
//==================================================================================================
// Description : change texture in m_oMemDC (for display)
//==================================================================================================
void DiaText::m_fn_vChangeTexture(GLI_tdstTexture *p_stTexture, BOOL _bEnableButton /*= TRUE*/)
{
//restore the old bitmap in the DC before destroying the textured one
m_oMemDC.SelectObject(m_p_oPreviousSelectedBitmap);
m_oMemBitmap.DeleteObject();
int iImage = -1;
tdoEditorGameMaterial * p_oGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial();
if ( p_oGameMaterial )
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(p_oGameMaterial->m_hGetEngineMaterial());
if ( hEditedVisualMaterial != NULL ) //is the handle valid ?
{
// try to get the good bitmap in list
if ( p_stTexture )
iImage = gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndexByLong((long) p_stTexture);
else //if we display the supply texture, show an invalid texture when there is none instead of the rainbow
iImage = m_bDisplaySupplyTexture ? -1 : gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndex(C_szNoBitmapName);
}
}
if ( iImage == -1 )
iImage = gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_iGetBitmapIndex(C_szUnviewableBitmapName);
if ( iImage != -1 )
{
BITMAP stBitmap;
CBitmap *p_oBitmap = CBitmap::FromHandle( gs_p_oMaterialInterface->m_p_oGetMaterialsTextureList()->m_fn_hGetBitmap(iImage));
p_oBitmap->GetBitmap(&stBitmap);
m_oMemBitmap.CreateCompatibleBitmap(this->GetDC(), stBitmap.bmWidth, stBitmap.bmHeight);
m_oMemDC.SelectObject(&m_oMemBitmap);
m_oMemDC.DrawState(CPoint(0,0), CSize(stBitmap.bmWidth, stBitmap.bmHeight), p_oBitmap, DST_BITMAP);
}
//Mircea Dunka 5.11.1998
//I need this button to remain disabled all the time!!! (for right click messages).
//GetDlgItem(IDC_BUTTON_VISUEL)->EnableWindow(_bEnableButton && p_stTexture);
GetDlgItem(IDC_BUTTON_VISUEL )->EnableWindow(FALSE);
m_bButtonVisuelEnabled = _bEnableButton && p_stTexture;
//end Mircea Dunka
GetDlgItem(IDC_BUTTON_VISUEL)->Invalidate();
}
//==================================================================================================
//==================================================================================================
void DiaText::m_vNotifyChangeToScripts(BOOL _bVisualSection, BOOL _bTextureSection)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial());
//notify the visual material
if ( _bVisualSection )
{
tdoEditorVisualMaterial *p_oVisualMaterial = (tdoEditorVisualMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEditedVisualMaterial);
if ( p_oVisualMaterial )
p_oVisualMaterial->fn_vNotifySave();
}
//notify the texture sections as well (main and supply, just to be sure
if ( _bTextureSection )
{
tdoEditorTexture *p_oEditorTexture;
p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedTexture);
if ( p_oEditorTexture )
p_oEditorTexture->fn_vNotifySave();
p_oEditorTexture = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(TEX_p_tdstGetSupplyTexture(m_hEditedTexture));
if ( p_oEditorTexture )
p_oEditorTexture->fn_vNotifySave();
}
}
//==================================================================================================
//==================================================================================================
void DiaText::OnButtonChromakeyColor()
{
//Mircea Dunka 12.11.98
GEO_tdstColor stTempColor, stCapturedColor;
//end Mircea Dunka
BOOL bActive, bFiltering;
unsigned char ucR, ucG, ucB, ucA;
GLI_tdstTexture *p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
TEX_vGetTextureChromakey(p_stTextureToDisplay, &bActive, &bFiltering, &ucR, &ucG, &ucB, &ucA);
stTempColor.xR = ((float) ucR) / 255;
stTempColor.xG = ((float) ucG) / 255;
stTempColor.xB = ((float) ucB) / 255;
stTempColor.xA = ((float) ucA) / 255;
//Mircea Dunka 12.11.98
stCapturedColor.xR = ((float) m_nRPixelColor) / 255;
stCapturedColor.xG = ((float) m_nGPixelColor) / 255;
stCapturedColor.xB = ((float) m_nBPixelColor) / 255;
stCapturedColor.xA = 0;
// end Mircea Dunka
if ( fn_bEditColor(GetDlgItem(IDC_BUTTON_CHROMAKEYCOLOR), &stTempColor, &stCapturedColor) )
{
TEX_vSetTextureChromakey(
p_stTextureToDisplay, bActive, bFiltering,
(unsigned char) (stTempColor.xR * 255),
(unsigned char) (stTempColor.xG * 255),
(unsigned char) (stTempColor.xB * 255),
(unsigned char) (stTempColor.xA * 255)
);
GetDlgItem(IDC_BUTTON_CHROMAKEYCOLOR)->Invalidate();
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//tell the texture section has to be saved
m_vNotifyChangeToScripts(FALSE, TRUE);
}
}
//==================================================================================================
//==================================================================================================
void DiaText::OnButtonSupplyTexture()
{
m_bDisplaySupplyTexture = !m_bDisplaySupplyTexture;
m_fn_vShowMaterial(gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial(), m_lAnimatedTextureIndex);
}
//==================================================================================================
//==================================================================================================
void DiaText::OnKillFocusEditDuration()
{
//read the contents of the edit
CString csDuration;
GetDlgItem(IDC_EDIT_DURATION)->GetWindowText(csDuration);
//convert the string into a floating point number
float fDuration = (float) atof(LPCTSTR(csDuration));
if ( fDuration < 0.0f )
fDuration = 0.0f;
//write back in the edit the string that corresponds to the value we parsed
csDuration.Format(C_szDurationStringFormat, fDuration);
csDuration.TrimLeft();
GetDlgItem(IDC_EDIT_DURATION)->SetWindowText(csDuration);
//change the duration for the texture
GMT_tdxHandleToGameMaterial hGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial();
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(hGameMaterial);
GLI_tdstTexture *hReadTexture;
float fReadDuration;
GLI_vGetMaterialAnimatedTexture(hEditedVisualMaterial, m_lAnimatedTextureIndex, &hReadTexture, &fReadDuration);
GLI_vModifyMaterialAnimatedTexture(hEditedVisualMaterial, m_lAnimatedTextureIndex, hReadTexture, fDuration);
if ( hReadTexture != m_hEditedTexture )
AfxMessageBox(
"TGM INTERNAL ERROR! Tell B. Germain if you see this message\n"
"You can continue to work normally, this has no influence on your data",
MB_OK
);
//now update the edited animation texture node.
m_vNotifyChangeToScripts(FALSE, TRUE);
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
//==================================================================================================
tdoChangeTextureModif::tdoChangeTextureModif
(
GMT_tdxHandleToGameMaterial _MyMatHandle,
long _lChanged,
GLI_tdstTexture *_hNewTexture,
int _iNewImage,
BOOL _bSupplyTexture
)
: CPA_Modif(0, "Texture Change")
{
m_hEditedGameMaterial = _MyMatHandle;
m_p_oEditedGameMaterial = (tdoEditorGameMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hEditedGameMaterial);
m_hTextureAfterDo = _hNewTexture;
m_iImageAfterDo = _iNewImage;
m_lChangeIndex = _lChanged;
m_bSupplyTexture = _bSupplyTexture;
ACP_tdxHandleOfMaterial hMaterialVisual = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
GLI_xGetMaterialTexture(hMaterialVisual, &m_hTextureBeforeDo);
if ( m_bSupplyTexture )
m_hTextureBeforeDo = TEX_p_tdstGetSupplyTexture(m_hTextureBeforeDo);
m_iImageBeforeDo = gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_iGetTextureIndexForGameMaterial(m_p_oEditedGameMaterial, FALSE);
}
//==================================================================================================
//==================================================================================================
tdoChangeTextureModif::~tdoChangeTextureModif()
{
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeTextureModif::Do()
{
return m_bDoIt(m_hTextureAfterDo, m_iImageAfterDo);
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeTextureModif::Undo()
{
return m_bDoIt(m_hTextureBeforeDo, m_iImageBeforeDo);
}
//==================================================================================================
//==================================================================================================
BOOL tdoChangeTextureModif::m_bDoIt(GLI_tdstTexture *_hReplacingTexture, int _iImageIndex)
{
ACP_tdxHandleOfMaterial hEditedVisualMaterial = GMT_fn_hGetVisualMaterial(m_hEditedGameMaterial);
//change the texture in the material
GLI_tdstTexture *hReplacedTexture;
float fDuration;
GLI_vGetMaterialAnimatedTexture(hEditedVisualMaterial, m_lChangeIndex, &hReplacedTexture, &fDuration);
GLI_vModifyMaterialAnimatedTexture(hEditedVisualMaterial, m_lChangeIndex, _hReplacingTexture, fDuration);
//if this is the first texture in the animation, update the unanimated texture too
if ( m_lChangeIndex == 0 )
GLI_xSetMaterialTexture(hEditedVisualMaterial, _hReplacingTexture);
//tell the engine something changed with the animated textures
GLI_xRefreshAnimatedTexture(hEditedVisualMaterial);
//update coherence manager links
tdoEditorVisualMaterial *p_oVisualMaterial = (tdoEditorVisualMaterial *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEditedVisualMaterial);
tdoEditorTexture *p_oEditorTextureBefore = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hReplacedTexture);
if ( p_oEditorTextureBefore )
g_oCoherenceManager.m_fn_vRemoveALink(p_oVisualMaterial, p_oEditorTextureBefore);
tdoEditorTexture *p_oEditorTextureAfter = (tdoEditorTexture *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(_hReplacingTexture);
if ( p_oEditorTextureAfter )
g_oCoherenceManager.m_fn_vAddALink(p_oVisualMaterial, p_oEditorTextureAfter);
//make the visual material save itself
p_oVisualMaterial->fn_vNotifySave();
//if we changed the first texture in tha animation
if ( m_lChangeIndex == 0 )
{
//find the item for the game material in the material list
int iMaterialIndex = gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_iFindMaterial(m_p_oEditedGameMaterial);
//change its image
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vSetItemImage(iMaterialIndex, _iImageIndex);
//then redraw it
gs_p_oMaterialInterface->m_p_oGetMaterialListView()->m_fn_vRedrawSelectedItem(iMaterialIndex);
}
//update display if relevant
if ( m_p_oEditedGameMaterial == gs_p_oMaterialInterface->m_p_oGetEditedMaterial() )
{
//first update the combo of the VMT
CComboBox *p_oCombo = (CComboBox *) gs_p_oMaterialInterface->m_p_oGetVisualView()->GetDlgItem(IDC_COMBO_ANIMATEDTEXTURES);
p_oCombo->DeleteString(m_lChangeIndex);
p_oCombo->InsertString(m_lChangeIndex, p_oEditorTextureAfter ? p_oEditorTextureAfter->GetName() : "ERROR!");
p_oCombo->SetItemDataPtr(m_lChangeIndex, p_oEditorTextureAfter);
//then select the modified entry
p_oCombo->SetCurSel(m_lChangeIndex);
//then make the texture view redisplay itself
gs_p_oMaterialInterface->m_p_oGetTexView()->m_fn_vShowMaterial(m_hEditedGameMaterial, m_lChangeIndex);
}
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
return TRUE;
}
//Mircea Dunka 4.11.98
void DiaText::OnRButtonDown(UINT nFlags, CPoint point)
{
CWnd* pWndTexture = GetDlgItem(IDC_BUTTON_VISUEL);
if( ChildWindowFromPoint(point, CWP_ALL) == pWndTexture)
{
CPoint ptTexture = point;
ClientToScreen(&ptTexture);
pWndTexture->ScreenToClient(&ptTexture);
COLORREF color = pWndTexture->GetDC()->GetPixel(ptTexture);
m_nRPixelColor = GetRValue(color);
m_nGPixelColor = GetGValue(color);
m_nBPixelColor = GetBValue(color);
GetDlgItem(IDC_BUTTON_PIXELCOLOR)->InvalidateRect(NULL);
}
CFormView::OnRButtonDown(nFlags, point);
}
void DiaText::OnLButtonDown(UINT nFlags, CPoint point)
{
if( (ChildWindowFromPoint(point, CWP_ALL)==GetDlgItem(IDC_BUTTON_VISUEL)) && m_bButtonVisuelEnabled)
{
OnButtonVisuel();
}
else
CFormView::OnLButtonDown(nFlags, point);
}
void DiaText::OnButtonPixelcolor()
{
BOOL bActive, bFiltering;
unsigned char ucR, ucG, ucB, ucA;
GLI_tdstTexture *p_stTextureToDisplay = (m_bDisplaySupplyTexture ? TEX_p_tdstGetSupplyTexture(m_hEditedTexture) : m_hEditedTexture);
TEX_vGetTextureChromakey(p_stTextureToDisplay, &bActive, &bFiltering, &ucR, &ucG, &ucB, &ucA);
TEX_vSetTextureChromakey(
p_stTextureToDisplay, bActive, bFiltering,
m_nRPixelColor,
m_nGPixelColor,
m_nBPixelColor,
ucA
);
GetDlgItem(IDC_BUTTON_CHROMAKEYCOLOR)->Invalidate();
//tell the main view to redraw itself because a material changed aspect
M_GetMainDevice3D()->DrawObject();
//tell the texture section has to be saved
m_vNotifyChangeToScripts(FALSE, TRUE);
}
///end Mircea Dunka