From 952c5c128f9efaea89d41d882c4ea3ade7df4591 Mon Sep 17 00:00:00 2001 From: zakk Date: Fri, 26 Aug 2005 04:48:05 +0000 Subject: Itsa me, quake3io! git-svn-id: svn://svn.icculus.org/quake3/trunk@2 edf5b092-35ff-0310-97b2-ce42778d08ea --- q3radiant/SurfaceDlg.cpp | 983 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 983 insertions(+) create mode 100755 q3radiant/SurfaceDlg.cpp (limited to 'q3radiant/SurfaceDlg.cpp') diff --git a/q3radiant/SurfaceDlg.cpp b/q3radiant/SurfaceDlg.cpp new file mode 100755 index 0000000..6930126 --- /dev/null +++ b/q3radiant/SurfaceDlg.cpp @@ -0,0 +1,983 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// SurfaceDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "Radiant.h" +#include "SurfaceDlg.h" +#include "PrefsDlg.h" +#include "mainfrm.h" +#include "TextureLayout.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// surface properties plugin +// global flag for surface properties plugin is g_qeglobals.bSurfacePropertiesPlugin +_QERPlugSurfaceTable g_SurfaceTable; + +///////////////////////////////////////////////////////////////////////////// +// CSurfaceDlg dialog + +CSurfaceDlg g_dlgSurface; + + +CSurfaceDlg::CSurfaceDlg(CWnd* pParent /*=NULL*/) + : CDialog(CSurfaceDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CSurfaceDlg) + m_nHeight = 1; + m_nWidth = 1; + //}}AFX_DATA_INIT +} + + +void CSurfaceDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CSurfaceDlg) + DDX_Control(pDX, IDC_SPIN_WIDTH, m_wndWidth); + DDX_Control(pDX, IDC_SPIN_HEIGHT, m_wndHeight); + DDX_Control(pDX, IDC_SPIN_VSHIFT, m_wndVShift); + DDX_Control(pDX, IDC_SPIN_VSCALE, m_wndVScale); + DDX_Control(pDX, IDC_SPIN_ROTATE, m_wndRotate); + DDX_Control(pDX, IDC_SPIN_HSHIFT, m_wndHShift); + DDX_Control(pDX, IDC_SPIN_HSCALE, m_wndHScale); + DDX_Text(pDX, IDC_EDIT_HEIGHT, m_nHeight); + DDV_MinMaxInt(pDX, m_nHeight, 1, 32); + DDX_Text(pDX, IDC_EDIT_WIDTH, m_nWidth); + DDV_MinMaxInt(pDX, m_nWidth, 1, 32); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CSurfaceDlg, CDialog) + //{{AFX_MSG_MAP(CSurfaceDlg) + ON_WM_HSCROLL() + ON_WM_KEYDOWN() + ON_WM_VSCROLL() + ON_BN_CLICKED(IDAPPLY, OnApply) + ON_WM_CLOSE() + ON_WM_DESTROY() + ON_BN_CLICKED(ID_BTN_CANCEL, OnBtnCancel) + ON_BN_CLICKED(IDC_BTN_COLOR, OnBtnColor) + ON_WM_CTLCOLOR() + ON_WM_CREATE() + ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSHIFT, OnDeltaPosSpin) + ON_BN_CLICKED(IDC_BTN_PATCHDETAILS, OnBtnPatchdetails) + ON_BN_CLICKED(IDC_BTN_PATCHNATURAL, OnBtnPatchnatural) + ON_BN_CLICKED(IDC_BTN_PATCHRESET, OnBtnPatchreset) + ON_BN_CLICKED(IDC_BTN_PATCHFIT, OnBtnPatchfit) + ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSCALE, OnDeltaPosSpin) + ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ROTATE, OnDeltaPosSpin) + ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSCALE, OnDeltaPosSpin) + ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSHIFT, OnDeltaPosSpin) + ON_BN_CLICKED(IDC_BTN_AXIAL, OnBtnAxial) + ON_BN_CLICKED(IDC_BTN_BRUSHFIT, OnBtnBrushfit) + ON_BN_CLICKED(IDC_BTN_FACEFIT, OnBtnFacefit) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CSurfaceDlg message handlers + + +/* +=================================================== + + SURFACE INSPECTOR + +=================================================== +*/ + +texdef_t g_old_texdef; +texdef_t g_patch_texdef; +HWND g_surfwin = NULL; +qboolean g_changed_surface; + +int g_checkboxes[64] = { + IDC_CHECK1, IDC_CHECK2, IDC_CHECK3, IDC_CHECK4, + IDC_CHECK5, IDC_CHECK6, IDC_CHECK7, IDC_CHECK8, + IDC_CHECK9, IDC_CHECK10, IDC_CHECK11, IDC_CHECK12, + IDC_CHECK13, IDC_CHECK14, IDC_CHECK15, IDC_CHECK16, + IDC_CHECK17, IDC_CHECK18, IDC_CHECK19, IDC_CHECK20, + IDC_CHECK21, IDC_CHECK22, IDC_CHECK23, IDC_CHECK24, + IDC_CHECK25, IDC_CHECK26, IDC_CHECK27, IDC_CHECK28, + IDC_CHECK29, IDC_CHECK30, IDC_CHECK31, IDC_CHECK32, + + IDC_CHECK33, IDC_CHECK34, IDC_CHECK35, IDC_CHECK36, + IDC_CHECK37, IDC_CHECK38, IDC_CHECK39, IDC_CHECK40, + IDC_CHECK41, IDC_CHECK42, IDC_CHECK43, IDC_CHECK44, + IDC_CHECK45, IDC_CHECK46, IDC_CHECK47, IDC_CHECK48, + IDC_CHECK49, IDC_CHECK50, IDC_CHECK51, IDC_CHECK52, + IDC_CHECK53, IDC_CHECK54, IDC_CHECK55, IDC_CHECK56, + IDC_CHECK57, IDC_CHECK58, IDC_CHECK59, IDC_CHECK60, + IDC_CHECK61, IDC_CHECK62, IDC_CHECK63, IDC_CHECK64 + }; + +/* +============== +SetTexMods + +Set the fields to the current texdef +if one face selected -> will read this face texdef, else current texdef +if only patches selected, will read the patch texdef +=============== +*/ + +bool g_bNewFace = false; +bool g_bNewApplyHandling = false; +bool g_bGatewayhack = false; + +void CSurfaceDlg::SetTexMods() +{ + char sz[128]; + texdef_t *pt; + brushprimit_texdef_t *bpt; + // local copy if a width=2 height=2 qtetxture_t is needed + brushprimit_texdef_t local_bp; + int i; + + if (!g_surfwin) + return; + + m_bPatchMode = false; + + if (OnlyPatchesSelected()) + { + pt = &g_qeglobals.d_texturewin.texdef; + if (QE_SingleBrush()) + { + //strcpy(g_patch_texdef.name, Patch_GetTextureName()); + g_patch_texdef.SetName(Patch_GetTextureName()); + } + else + { + //strcpy(g_patch_texdef.name, pt->name); + g_patch_texdef.SetName(pt->name); + } + g_patch_texdef.contents = pt->contents; + g_patch_texdef.flags = pt->flags; + g_patch_texdef.value = pt->value; + pt = &g_patch_texdef; + m_bPatchMode = true; + } + else + { + if (g_bNewFace && g_ptrSelectedFaces.GetSize() > 0) + { + face_t *selFace = reinterpret_cast(g_ptrSelectedFaces.GetAt(0)); + pt = &selFace->texdef; + if (g_qeglobals.m_bBrushPrimitMode) + { + // compute a texture matrix related to the default matrix width=2 height=2 + ConvertTexMatWithQTexture( &selFace->brushprimit_texdef, selFace->d_texture, &local_bp, NULL ); + bpt = &local_bp; + } + } + else + { + pt = &g_qeglobals.d_texturewin.texdef; + if (g_qeglobals.m_bBrushPrimitMode) + { + bpt = &g_qeglobals.d_texturewin.brushprimit_texdef; + } + } + // brush primitive mode : compute fake shift scale rot representation + if (g_qeglobals.m_bBrushPrimitMode) + TexMatToFakeTexCoords( bpt->coords, m_shift, &m_rotate, m_scale ); + } + + SendMessage (WM_SETREDRAW, 0, 0); + + ::SetWindowText(GetDlgItem(IDC_TEXTURE)->GetSafeHwnd(), pt->name); + + if (m_bPatchMode) + sprintf(sz, "%4.6f", pt->shift[0]); + else + if (g_qeglobals.m_bBrushPrimitMode) + sprintf(sz, "%d", (int)m_shift[0]); + else + sprintf(sz, "%d", (int)pt->shift[0]); + ::SetWindowText(GetDlgItem(IDC_HSHIFT)->GetSafeHwnd(), sz); + + if (m_bPatchMode) + sprintf(sz, "%4.6f", pt->shift[1]); + else + if (g_qeglobals.m_bBrushPrimitMode) + sprintf(sz, "%d", (int)m_shift[1]); + else + sprintf(sz, "%d", (int)pt->shift[1]); + ::SetWindowText(GetDlgItem(IDC_VSHIFT)->GetSafeHwnd(), sz); + + sprintf(sz, m_bPatchMode ? "%4.6f" : "%4.6f", g_qeglobals.m_bBrushPrimitMode ? m_scale[0] : pt->scale[0]); + ::SetWindowText(GetDlgItem(IDC_HSCALE)->GetSafeHwnd(), sz); + + sprintf(sz, m_bPatchMode ? "%4.6f" : "%4.6f", g_qeglobals.m_bBrushPrimitMode ? m_scale[1] : pt->scale[1]); + ::SetWindowText(GetDlgItem(IDC_VSCALE)->GetSafeHwnd(), sz); + + //++timo compute BProtate as int .. + sprintf(sz, "%d", g_qeglobals.m_bBrushPrimitMode ? (int)m_rotate : (int)pt->rotate); + ::SetWindowText(GetDlgItem(IDC_ROTATE)->GetSafeHwnd(), sz); + + sprintf(sz, "%d", (int)pt->value); + ::SetWindowText(GetDlgItem(IDC_VALUE)->GetSafeHwnd(), sz); + + for (i=0 ; i<32 ; i++) + ::SendMessage(GetDlgItem(g_checkboxes[i])->GetSafeHwnd(), BM_SETCHECK, !!(pt->flags&(1<GetSafeHwnd(), BM_SETCHECK, !!(pt->contents&(1<GetSafeHwnd(), sz, 127); + pt->shift[0] = atof(sz); + + ::GetWindowText (GetDlgItem(IDC_VSHIFT)->GetSafeHwnd(), sz, 127); + pt->shift[1] = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_HSCALE)->GetSafeHwnd(), sz, 127); + pt->scale[0] = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_VSCALE)->GetSafeHwnd(), sz, 127); + pt->scale[1] = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_ROTATE)->GetSafeHwnd(), sz, 127); + pt->rotate = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_VALUE)->GetSafeHwnd(), sz, 127); + pt->value = atof(sz); + + pt->flags = 0; + for (i=0 ; i<32 ; i++) + { + b = ::SendMessage(GetDlgItem(g_checkboxes[i])->GetSafeHwnd(), BM_GETCHECK, 0, 0); + if (b != 1 && b != 0) + continue; + pt->flags |= b<contents = 0; + for (i=0 ; i<32 ; i++) + { + b = ::SendMessage(GetDlgItem(g_checkboxes[32+i])->GetSafeHwnd(), BM_GETCHECK, 0, 0); + if (b != 1 && b != 0) + continue; + pt->contents |= b< 0) + { + face_t *selFace = reinterpret_cast(g_ptrSelectedFaces.GetAt(0)); + pt = &selFace->texdef; + } + else + { + pt = &g_qeglobals.d_texturewin.texdef; + } + } + + ::GetWindowText (GetDlgItem(IDC_TEXTURE)->GetSafeHwnd(), sz, 127); + //strncpy (pt->name, sz, sizeof(pt->name)-1); + pt->SetName(sz); + if (pt->name[0] <= ' ') + { + //strcpy (pt->name, "none"); + pt->SetName("none"); + ::SetWindowText(GetDlgItem(IDC_TEXTURE)->GetSafeHwnd(), pt->name); + } + + ::GetWindowText (GetDlgItem(IDC_HSHIFT)->GetSafeHwnd(), sz, 127); + ( g_qeglobals.m_bBrushPrimitMode ? m_shift[0] : pt->shift[0] ) = atof(sz); + + ::GetWindowText (GetDlgItem(IDC_VSHIFT)->GetSafeHwnd(), sz, 127); + ( g_qeglobals.m_bBrushPrimitMode ? m_shift[1] : pt->shift[1] ) = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_HSCALE)->GetSafeHwnd(), sz, 127); + ( g_qeglobals.m_bBrushPrimitMode ? m_scale[0] : pt->scale[0] ) = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_VSCALE)->GetSafeHwnd(), sz, 127); + ( g_qeglobals.m_bBrushPrimitMode ? m_scale[1] : pt->scale[1] ) = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_ROTATE)->GetSafeHwnd(), sz, 127); + ( g_qeglobals.m_bBrushPrimitMode ? m_rotate : pt->rotate ) = atof(sz); + + ::GetWindowText(GetDlgItem(IDC_VALUE)->GetSafeHwnd(), sz, 127); + pt->value = atof(sz); + + pt->flags = 0; + for (i=0 ; i<32 ; i++) + { + b = ::SendMessage(GetDlgItem(g_checkboxes[i])->GetSafeHwnd(), BM_GETCHECK, 0, 0); + if (b != 1 && b != 0) + continue; + pt->flags |= b<contents = 0; + for (i=0 ; i<32 ; i++) + { + b = ::SendMessage(GetDlgItem(g_checkboxes[32+i])->GetSafeHwnd(), BM_GETCHECK, 0, 0); + if (b != 1 && b != 0) + continue; + pt->contents |= b< 0) + { + selFace = reinterpret_cast(g_ptrSelectedFaces.GetAt(0)); + bpt = &selFace->brushprimit_texdef; + } + else + { + bpt = &g_qeglobals.d_texturewin.brushprimit_texdef; + } + // compute texture matrix + // the matrix returned must be understood as a qtexture_t with width=2 height=2 + FakeTexCoordsToTexMat( m_shift, m_rotate, m_scale, local_bp.coords ); + // copy the texture matrix in the global struct + // fit the qtexture if we have a face selected, otherwise g_qeglobals.d_texturewin.brushprimit_texdef uses the basic qtexture_t with width=2 height=2 + + ConvertTexMatWithQTexture( &local_bp, NULL, bpt, ( ( g_bNewFace && selFace ) ? selFace->d_texture : NULL ) ); + } + Select_SetTexture(pt,&local_bp); + + //if (m_bPatchMode) + //{ + // Patch_SetTextureInfo(pt); + //} + +} + +/* +================= +UpdateSpinners +================= +*/ + +void CSurfaceDlg::UpdateSpinners(bool bUp, int nID) +{ + texdef_t *pt; + texdef_t td; + + if (m_bPatchMode) + { + td.rotate = 0.0; + td.scale[0] = td.scale[1] = 0.0; + td.shift[0] = td.shift[1] = 0.0; + GrabPatchMods(); + + pt = &g_patch_texdef; + td.contents = pt->contents; + td.flags = pt->flags; + td.value = pt->value; + + if (nID == IDC_SPIN_ROTATE) + { + if (bUp) + td.rotate = pt->rotate; + else + td.rotate = -pt->rotate; + } + else if (nID == IDC_SPIN_HSCALE) + { + if (bUp) + td.scale[0] = 1-pt->scale[0]; + else + td.scale[0] = 1+pt->scale[0]; + } + else if (nID == IDC_SPIN_VSCALE) + { + if (bUp) + td.scale[1] = 1-pt->scale[1]; + else + td.scale[1] = 1+pt->scale[1]; + } + + else if (nID == IDC_SPIN_HSHIFT) + { + if (bUp) + td.shift[0] = pt->shift[0]; + else + td.shift[0] = -pt->shift[0]; + } + else if (nID == IDC_SPIN_VSHIFT) + { + if (bUp) + td.shift[1] = pt->shift[1]; + else + td.shift[1] = -pt->shift[1]; + } + pt = &g_qeglobals.d_texturewin.texdef; + Patch_SetTextureInfo(&td); + } + else + { + // in brush primitive mode, will read up-to-date m_shift m_rotate m_scale + GetTexMods (); + if (g_bNewFace && g_ptrSelectedFaces.GetSize() > 0) + { + face_t *selFace = reinterpret_cast(g_ptrSelectedFaces.GetAt(0)); + pt = &selFace->texdef; + } + else + { + pt = &g_qeglobals.d_texturewin.texdef; + } + if (nID == IDC_SPIN_ROTATE) + { + if (g_qeglobals.m_bBrushPrimitMode) + { + if (bUp) + m_rotate += 45; + else + m_rotate -= 45; + } + else + { + if (bUp) + pt->rotate += 45; + else + pt->rotate -= 45; + if (pt->rotate < 0) + pt->rotate += 360; + if (pt->rotate >= 360) + pt->rotate -= 360; + } + } + else if (nID == IDC_SPIN_HSCALE) + { + if (g_qeglobals.m_bBrushPrimitMode) + { + if (bUp) + m_scale[0] += 0.1; + else + m_scale[0] -= 0.1; + } + else + { + if (bUp) + pt->scale[0] += 0.1; + else + pt->scale[0] -= 0.1; + } + } + else if (nID == IDC_SPIN_VSCALE) + { + if (g_qeglobals.m_bBrushPrimitMode) + { + if (bUp) + m_scale[1] += 0.1; + else + m_scale[1] -= 0.1; + } + else + { + if (bUp) + pt->scale[1] += 0.1; + else + pt->scale[1] -= 0.1; + } + } + else if (nID == IDC_SPIN_HSHIFT) + { + if (g_qeglobals.m_bBrushPrimitMode) + { + if (bUp) + m_shift[0] += 8; + else + m_shift[0] -= 8; + } + else + { + if (bUp) + pt->shift[0] += 8; + else + pt->shift[0] -= 8; + } + } + else if (nID == IDC_SPIN_VSHIFT) + { + if (g_qeglobals.m_bBrushPrimitMode) + { + if (bUp) + m_shift[1] += 8; + else + m_shift[1] -= 8; + } + else + { + if (bUp) + pt->shift[1] += 8; + else + pt->shift[1] -= 8; + } + } + } + // a local copy of the texture matrix, given for a qtexture_t with width=2 height=2 + brushprimit_texdef_t local_bp; + brushprimit_texdef_t *bpt; + if (g_qeglobals.m_bBrushPrimitMode) + { + face_t *selFace = NULL; + if (g_bNewFace && g_ptrSelectedFaces.GetSize() > 0) + { + selFace = reinterpret_cast(g_ptrSelectedFaces.GetAt(0)); + bpt = &selFace->brushprimit_texdef; + } + else + { + bpt = &g_qeglobals.d_texturewin.brushprimit_texdef; + } + // compute texture matrix + // the matrix returned must be understood as a qtexture_t with width=2 height=2 + FakeTexCoordsToTexMat( m_shift, m_rotate, m_scale, local_bp.coords ); + // copy the texture matrix in the global struct + // fit the qtexture if we have a face selected, otherwise g_qeglobals.d_texturewin.brushprimit_texdef uses the basic qtexture_t with width=2 height=2 + ConvertTexMatWithQTexture( &local_bp, NULL, bpt, ( ( g_bNewFace && selFace ) ? selFace->d_texture : NULL ) ); + } + // brush primit : will update the widgets after reading back texture matrix and computing fake shift scale rot + SetTexMods(); + g_changed_surface = true; + Select_SetTexture(pt,&local_bp); +} + +void CSurfaceDlg::UpdateSpinners(int nScrollCode, int nPos, CScrollBar* pBar) +{ + texdef_t *pt; + + GetTexMods (); + if (g_bNewFace && g_ptrSelectedFaces.GetSize() > 0) + { + face_t *selFace = reinterpret_cast(g_ptrSelectedFaces.GetAt(0)); + pt = &selFace->texdef; + } + else + { + pt = &g_qeglobals.d_texturewin.texdef; + } + + if ((nScrollCode != SB_LINEUP) && (nScrollCode != SB_LINEDOWN)) + return; + + if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_ROTATEA)) + { + if (nScrollCode == SB_LINEUP) + pt->rotate += 45; + else + pt->rotate -= 45; + + if (pt->rotate < 0) + pt->rotate += 360; + + if (pt->rotate >= 360) + pt->rotate -= 360; + } + + else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_HSCALEA)) + { + if (nScrollCode == SB_LINEDOWN) + pt->scale[0] -= 0.1; + else + pt->scale[0] += 0.1; + } + + else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_VSCALEA)) + { + if (nScrollCode == SB_LINEUP) + pt->scale[1] += 0.1; + else + pt->scale[1] -= 0.1; + } + + else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_HSHIFTA)) + { + if (nScrollCode == SB_LINEDOWN) + pt->shift[0] -= 8; + else + pt->shift[0] += 8; + } + + else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_VSHIFTA)) + { + if (nScrollCode == SB_LINEUP) + pt->shift[1] += 8; + else + pt->shift[1] -= 8; + } + + SetTexMods(); + g_changed_surface = true; + //++timo if !g_qeglobals.m_bBrushPrimitMode send a NULL brushprimit_texdef + if (!g_qeglobals.m_bBrushPrimitMode) + { + Sys_Printf("Warning : non brush primitive mode call to CSurfaceDlg::GetTexMods broken\n"); + Sys_Printf(" ( Select_SetTexture not called )\n"); + } +// Select_SetTexture(pt); +} + +void UpdateSurfaceDialog() +{ + if (g_qeglobals.bSurfacePropertiesPlugin) + { + g_SurfaceTable.m_pfnUpdateSurfaceDialog(); + } + else + { + if (g_surfwin) + g_dlgSurface.SetTexMods(); + } + g_pParentWnd->UpdateTextureBar(); +} + +bool ByeByeSurfaceDialog(); + +void DoSurface (void) +{ + // surface properties plugin ? + if (g_qeglobals.bSurfacePropertiesPlugin) + { + g_SurfaceTable.m_pfnDoSurface(); + return; + } + + g_bNewFace = g_PrefsDlg.m_bFace; + g_bNewApplyHandling = g_PrefsDlg.m_bNewApplyHandling; + g_bGatewayhack = g_PrefsDlg.m_bGatewayHack; + // save current state for cancel + g_old_texdef = g_qeglobals.d_texturewin.texdef; + g_changed_surface = false; + + if (g_surfwin == NULL && g_dlgSurface.GetSafeHwnd() == NULL) + { + g_patch_texdef.scale[0] = 0.05; + g_patch_texdef.scale[1] = 0.05; + g_patch_texdef.shift[0] = 0.05; + g_patch_texdef.shift[1] = 0.05; + // use rotation increment from preferences + g_patch_texdef.rotate = g_PrefsDlg.m_nRotation; + + g_dlgSurface.Create(IDD_SURFACE); + CRect rct; + LONG lSize = sizeof(rct); + if (LoadRegistryInfo("Radiant::SurfaceWindow", &rct, &lSize)) + g_dlgSurface.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE | SWP_SHOWWINDOW); + + Sys_UpdateWindows(W_ALL); + } + else + { + g_surfwin = g_dlgSurface.GetSafeHwnd(); + g_dlgSurface.SetTexMods (); + g_dlgSurface.ShowWindow(SW_SHOW); + } +} + +bool ByeByeSurfaceDialog() +{ + // surface properties plugin ? + if (g_qeglobals.bSurfacePropertiesPlugin) + { + return g_SurfaceTable.m_pfnByeByeSurfaceDialog(); + } + + if (g_surfwin) + { + if (g_bGatewayhack) + PostMessage(g_surfwin, WM_COMMAND, IDAPPLY, 0); + else + PostMessage(g_surfwin, WM_COMMAND, IDCANCEL, 0); + return true; + } + else return false; +} + +BOOL CSurfaceDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + g_surfwin = GetSafeHwnd(); + SetTexMods (); + +#ifdef QUAKE3 + GetDlgItem(IDC_CHECK32)->SetWindowText("Curve"); + GetDlgItem(IDC_CHECK64)->SetWindowText("Inverted"); +#endif + + m_wndHScale.SetRange(0, 1000); + m_wndVScale.SetRange(0, 1000); + m_wndHShift.SetRange(0, 1000); + m_wndVShift.SetRange(0, 1000); + m_wndRotate.SetRange(0, 1000); + m_wndWidth.SetRange(1, 32); + m_wndHeight.SetRange(1, 32); + + LPVOID lpv = g_pParentWnd->GetPlugInMgr().GetSurfaceFlags(); + if (lpv != NULL) + { + int i = 0; + char* p = reinterpret_cast(lpv); + char* pBuff = new char[strlen(p)+1]; + strcpy(pBuff, p); + char* pToken = strtok(pBuff, ";\0"); + while (pToken != NULL) + { + GetDlgItem(g_checkboxes[i++])->SetWindowText(pToken); + pToken = strtok(NULL, ";\0"); + } + } + + if (strstr(g_PrefsDlg.m_strWhatGame, "Quake3") != NULL) { + for (int i=0 ; i < 64 ; i++) { + ::EnableWindow(GetDlgItem(g_checkboxes[i])->GetSafeHwnd(), FALSE); + } + + } + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CSurfaceDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + CDialog::OnHScroll(nSBCode, nPos, pScrollBar); + UpdateSpinners(nSBCode, nPos, pScrollBar); + Sys_UpdateWindows(W_CAMERA); +} + +void CSurfaceDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) +{ + + CDialog::OnKeyDown(nChar, nRepCnt, nFlags); +} + +void CSurfaceDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + CDialog::OnVScroll(nSBCode, nPos, pScrollBar); + UpdateSpinners(nSBCode, nPos, pScrollBar); + Sys_UpdateWindows(W_CAMERA); +} + +void CSurfaceDlg::OnApply() +{ + GetTexMods (); + Sys_UpdateWindows(W_CAMERA); + if (g_bNewApplyHandling) + OnOK(); +} + +void CSurfaceDlg::OnOK() +{ + GetTexMods(); + g_surfwin = NULL; + CDialog::OnOK(); + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnClose() +{ + g_surfwin = NULL; + CDialog::OnClose(); +} + +void CSurfaceDlg::OnCancel() +{ + if (g_bGatewayhack) + OnOK(); + else + OnBtnCancel(); +} + +void CSurfaceDlg::OnDestroy() +{ + if (GetSafeHwnd()) + { + CRect rct; + GetWindowRect(rct); + SaveRegistryInfo("Radiant::SurfaceWindow", &rct, sizeof(rct)); + } + CDialog::OnDestroy(); + g_surfwin = NULL; + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnBtnCancel() +{ + g_qeglobals.d_texturewin.texdef = g_old_texdef; + if (g_changed_surface) + { + //++timo if !g_qeglobals.m_bBrushPrimitMode send a NULL brushprimit_texdef + if (!g_qeglobals.m_bBrushPrimitMode) + { + Sys_Printf("Warning : non brush primitive mode call to CSurfaceDlg::GetTexMods broken\n"); + Sys_Printf(" ( Select_SetTexture not called )\n"); + } +// Select_SetTexture(&g_qeglobals.d_texturewin.texdef); + } + g_surfwin = NULL; + DestroyWindow(); +} + +void CSurfaceDlg::OnBtnColor() +{ +} + +HBRUSH CSurfaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) +{ + HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); + return hbr; +} + +int CSurfaceDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (CDialog::OnCreate(lpCreateStruct) == -1) + return -1; + + return 0; +} + +BOOL CSurfaceDlg::PreCreateWindow(CREATESTRUCT& cs) +{ + // TODO: Add your specialized code here and/or call the base class + + return CDialog::PreCreateWindow(cs); +} + + +void CSurfaceDlg::OnDeltaPosSpin(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; + UpdateSpinners((pNMUpDown->iDelta > 0), pNMUpDown->hdr.idFrom); + *pResult = 0; +} + +void CSurfaceDlg::OnBtnPatchdetails() +{ + Patch_NaturalizeSelected(true); + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnBtnPatchnatural() +{ + Patch_NaturalizeSelected(); + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnBtnPatchreset() +{ + CTextureLayout dlg; + if (dlg.DoModal() == IDOK) + { + Patch_ResetTexturing(dlg.m_fX, dlg.m_fY); + } + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnBtnPatchfit() +{ + Patch_FitTexturing(); + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnBtnAxial() +{ + Select_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, true); + g_changed_surface = true; + SetTexMods(); + Sys_UpdateWindows(W_ALL); +} + +void CSurfaceDlg::OnBtnBrushfit() +{ + // TODO: Add your control notification handler code here + +} + +void CSurfaceDlg::OnBtnFacefit() +{ + UpdateData(TRUE); + if (g_ptrSelectedFaces.GetSize() == 0) + { + brush_t *b; + for (b=selected_brushes.next ; b != &selected_brushes ; b=b->next) + { + for (face_t* pFace = b->brush_faces; pFace; pFace = pFace->next) + { + g_ptrSelectedFaces.Add(pFace); + g_ptrSelectedFaceBrushes.Add(b); + } + } + } + Select_FitTexture(m_nHeight, m_nWidth); + SetTexMods(); + g_changed_surface = true; + Sys_UpdateWindows(W_ALL); +} -- cgit v1.2.3