khanat-opennel-code/code/nel/tools/3d/plugin_max/nel_patch_edit_adv/NP_EPM_Tess.cpp
2010-05-06 02:08:41 +02:00

956 lines
28 KiB
C++

#include "stdafx.h"
#include "editpat.h"
// ------------------------------------------------------------------------------------------------------------------------------------------------------
#define DBGWELD_DUMPx
#define DBGWELD_ACTIONx
#define DBG_NAMEDSELSx
#define PROMPT_TIME 2000
extern AdvParams sParams;
BOOL CALLBACK AdvParametersDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetTessUI(HWND hDlg, TessApprox *tess)
{
EnableWindow(GetDlgItem(hDlg, IDC_TESS_U), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_U_SPINNER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_V), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_V_SPINNER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_EDGE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_EDGE_SPINNER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_DIST), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_DIST_SPINNER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_ANG), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_ANG_SPINNER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_PARAMETERS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_NORMALS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_WELDTESS), FALSE);
CheckDlgButton(hDlg, IDC_TESS_SET, FALSE);
CheckDlgButton(hDlg, IDC_TESS_REGULAR, FALSE);
CheckDlgButton(hDlg, IDC_TESS_PARAM, FALSE);
CheckDlgButton(hDlg, IDC_TESS_SPATIAL, FALSE);
CheckDlgButton(hDlg, IDC_TESS_CURV, FALSE);
CheckDlgButton(hDlg, IDC_TESS_LDA, FALSE);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_NORMALS), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_WELDTESS), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_MESH), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_DISP), SW_HIDE);
// watje 12-10-98
if (tess->showInteriorFaces)
CheckDlgButton(hDlg, IDC_SHOW_INTERIOR_FACES, TRUE);
else CheckDlgButton(hDlg, IDC_SHOW_INTERIOR_FACES, FALSE);
if (tileMode)
{
CheckDlgButton(hDlg, IDC_TILE_MODE, TRUE);
}
else
{
CheckDlgButton(hDlg, IDC_TILE_MODE, FALSE);
}
// Old
BOOL bCheck=(IsDlgButtonChecked(hDlg, IDC_TILE_MODE)==BST_CHECKED);
EnableWindow (GetDlgItem (hDlg, IDC_STEPS), !bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_STEPSSPINNER), !bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_STEPS_RENDER), !bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_STEPSRENDERSPINNER), !bCheck);
// New
EnableWindow (GetDlgItem (hDlg, IDC_TILESTEPS), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_TILESTEPSSPINNER), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_TRANSITION), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_TRANSITIONSPINNER), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_KEEP_MAPPING), bCheck);
if (keepMapping)
CheckDlgButton(hDlg, IDC_KEEP_MAPPING, TRUE);
else
CheckDlgButton(hDlg, IDC_KEEP_MAPPING, FALSE);
switch (tess->type)
{
case TESS_SET:
CheckDlgButton(hDlg, IDC_TESS_SET, TRUE);
mergeSpin->Disable();
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
case TESS_REGULAR:
CheckDlgButton(hDlg, IDC_TESS_REGULAR, TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_U), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_U_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_V), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_V_SPINNER), TRUE);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), SW_HIDE);
mergeSpin->Enable();
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), FALSE);
break;
case TESS_PARAM:
CheckDlgButton(hDlg, IDC_TESS_PARAM, TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_U), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_U_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_V), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_V_SPINNER), TRUE);
mergeSpin->Enable();
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), FALSE);
break;
case TESS_SPATIAL:
CheckDlgButton(hDlg, IDC_TESS_SPATIAL, TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_EDGE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_EDGE_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), !settingViewportTess);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), settingViewportTess?SW_HIDE:SW_SHOW);
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_PARAMETERS), TRUE);
mergeSpin->Enable();
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), FALSE);
break;
case TESS_CURVE:
CheckDlgButton(hDlg, IDC_TESS_CURV, TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_DIST), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_DIST_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_ANG), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_ANG_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), !settingViewportTess);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), settingViewportTess?SW_HIDE:SW_SHOW);
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_PARAMETERS), TRUE);
mergeSpin->Enable();
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), FALSE);
break;
case TESS_LDA:
CheckDlgButton(hDlg, IDC_TESS_LDA, TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_EDGE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_EDGE_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_DIST), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_DIST_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_ANG), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_ANG_SPINNER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), !settingViewportTess);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), settingViewportTess?SW_HIDE:SW_SHOW);
EnableWindow(GetDlgItem(hDlg, IDC_ADVANCED_PARAMETERS), TRUE);
mergeSpin->Enable();
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), FALSE);
break;
}
if (settingViewportTess)
{
ShowWindow(GetDlgItem(hDlg, IDC_TESS_SET), SW_SHOW);
if (tess->type != TESS_SET)
{
ShowWindow(GetDlgItem(hDlg, IDC_TESS_NORMALS), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_WELDTESS), SW_SHOW);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_NORMALS), !GetViewTessWeld());
EnableWindow(GetDlgItem(hDlg, IDC_WELDTESS), tess->merge > 0.0f);
}
} else
{
if (settingDisp)
{
ShowWindow(GetDlgItem(hDlg, IDC_MESH), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_DISP), SW_SHOW);
} else
{
if (tess->type != TESS_SET)
{
ShowWindow(GetDlgItem(hDlg, IDC_MESH), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_DISP), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_TESS_NORMALS), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_WELDTESS), SW_SHOW);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_NORMALS), !GetProdTessWeld());
EnableWindow(GetDlgItem(hDlg, IDC_WELDTESS), tess->merge > 0.0f);
CheckDlgButton(hDlg, IDC_MESH, TRUE);
}
ShowWindow(GetDlgItem(hDlg, IDC_TESS_SET), SW_SHOW);
}
}
// now set all the settings
uSpin->SetValue(tess->u, FALSE);
vSpin->SetValue(tess->v, FALSE);
edgeSpin->SetValue(tess->edge, FALSE);
distSpin->SetValue(tess->dist, FALSE);
angSpin->SetValue(tess->ang, FALSE);
mergeSpin->SetValue(tess->merge, FALSE);
CheckDlgButton(hDlg, IDC_TESS_VIEW_DEP, tess->view);
if (settingViewportTess)
{
CheckDlgButton(hDlg, IDC_TESS_VIEW, TRUE);
CheckDlgButton(hDlg, IDC_TESS_RENDERER, FALSE);
CheckDlgButton(hDlg, IDC_TESS_NORMALS, GetViewTessNormals());
CheckDlgButton(hDlg, IDC_WELDTESS, GetViewTessWeld());
} else
{
CheckDlgButton(hDlg, IDC_TESS_VIEW, FALSE);
CheckDlgButton(hDlg, IDC_TESS_RENDERER, TRUE);
CheckDlgButton(hDlg, IDC_TESS_NORMALS, GetProdTessNormals());
CheckDlgButton(hDlg, IDC_WELDTESS, GetProdTessWeld());
}
CheckDlgButton(hDlg, IDC_DISP, settingDisp);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
BOOL CALLBACK PatchObjSurfDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
EditPatchMod *ep =(EditPatchMod *)GetWindowLong(hDlg, GWL_USERDATA);
if (!ep && message != WM_INITDIALOG)
return FALSE;
switch (message)
{
case WM_INITDIALOG:
{
ep =(EditPatchMod *)lParam;
ep->hSurfPanel = hDlg;
SetWindowLong(hDlg, GWL_USERDATA, (LONG)ep);
if (!ep->settingViewportTess && ep->settingDisp && ep->GetProdTess().type == TESS_SET)
ep->settingDisp = FALSE;
TessApprox t;
if (ep->settingViewportTess)
{
t = ep->GetViewTess();
} else
{
if (ep->settingDisp)
t = ep->GetDispTess();
else
t = ep->GetProdTess();
}
ep->uSpin = SetupIntSpinner(hDlg, IDC_TESS_U_SPINNER, IDC_TESS_U, 1, 100, t.u);
ep->vSpin = SetupIntSpinner(hDlg, IDC_TESS_V_SPINNER, IDC_TESS_V, 1, 100, t.v);
#define MAX_F 1000.0f
ep->edgeSpin = SetupFloatSpinner(hDlg, IDC_TESS_EDGE_SPINNER, IDC_TESS_EDGE, 0.0f, MAX_F, t.edge);
ep->distSpin = SetupFloatSpinner(hDlg, IDC_TESS_DIST_SPINNER, IDC_TESS_DIST, 0.0f, MAX_F, t.dist);
ep->angSpin = SetupFloatSpinner(hDlg, IDC_TESS_ANG_SPINNER, IDC_TESS_ANG, 0.0f, MAX_F, t.ang);
ep->mergeSpin = SetupFloatSpinner(hDlg, IDC_MERGE_SPINNER, IDC_MERGE, 0.000f, MAX_F, t.merge);
ep->SetTessUI(hDlg, &t);
ep->SetSurfDlgEnables();
ep->SetTileDlgEnables();
return TRUE;
}
case WM_DESTROY:
if (ep->uSpin)
{
ReleaseISpinner(ep->uSpin);
ep->uSpin = NULL;
}
if (ep->vSpin)
{
ReleaseISpinner(ep->vSpin);
ep->vSpin = NULL;
}
if (ep->edgeSpin)
{
ReleaseISpinner(ep->edgeSpin);
ep->edgeSpin = NULL;
}
if (ep->distSpin)
{
ReleaseISpinner(ep->distSpin);
ep->distSpin = NULL;
}
if (ep->angSpin)
{
ReleaseISpinner(ep->angSpin);
ep->angSpin = NULL;
}
if (ep->mergeSpin)
{
ReleaseISpinner(ep->mergeSpin);
ep->mergeSpin = NULL;
}
return FALSE;
case CC_SPINNER_BUTTONUP:
{
TessApprox tess;
if (ep->settingViewportTess)
{
tess = ep->GetViewTess();
} else
{
if (ep->settingDisp)
tess = ep->GetDispTess();
else
tess = ep->GetProdTess();
}
ep->SetTessUI(hDlg, &tess);
}
break;
case CC_SPINNER_CHANGE:
switch (LOWORD(wParam))
{
case IDC_TESS_U_SPINNER:
case IDC_TESS_V_SPINNER:
case IDC_TESS_EDGE_SPINNER:
case IDC_TESS_DIST_SPINNER:
case IDC_TESS_ANG_SPINNER:
case IDC_MERGE_SPINNER:
{
TessApprox tess;
if (ep->settingViewportTess)
{
tess = ep->GetViewTess();
} else
{
if (ep->settingDisp)
tess = ep->GetDispTess();
else
tess = ep->GetProdTess();
}
switch (LOWORD(wParam))
{
case IDC_TESS_U_SPINNER:
tess.u = ep->uSpin->GetIVal();
break;
case IDC_TESS_V_SPINNER:
tess.v = ep->vSpin->GetIVal();
break;
case IDC_TESS_EDGE_SPINNER:
tess.edge = ep->edgeSpin->GetFVal();
break;
case IDC_TESS_DIST_SPINNER:
tess.dist = ep->distSpin->GetFVal();
break;
case IDC_TESS_ANG_SPINNER:
tess.ang = ep->angSpin->GetFVal();
break;
case IDC_MERGE_SPINNER:
tess.merge = ep->mergeSpin->GetFVal();
break;
}
if (ep->settingViewportTess)
{
ep->SetViewTess(tess);
} else
{
if (ep->settingDisp)
ep->SetDispTess(tess);
else
ep->SetProdTess(tess);
}
if (!HIWORD(wParam))
ep->SetTessUI(hDlg, &tess);
break;
}
}
break;
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MOUSEMOVE:
ep->ip->RollupMouseMessage(hDlg, message, wParam, lParam);
return FALSE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
// Tessellation
case IDC_TESS_VIEW:
{
ep->settingViewportTess = TRUE;
TessApprox t = ep->GetViewTess();
ep->SetTessUI(hDlg, &t);
EnableWindow(GetDlgItem(hDlg, IDC_TESS_VIEW_DEP), FALSE); // always off here
break;
}
case IDC_TESS_RENDERER:
{
ep->settingViewportTess = FALSE;
if (ep->settingDisp)
{
TessApprox t = ep->GetDispTess();
ep->SetTessUI(hDlg, &t);
} else
{
TessApprox t = ep->GetProdTess();
ep->SetTessUI(hDlg, &t);
}
break;
}
case IDC_MESH:
ep->settingDisp = FALSE;
ep->SetTessUI(hDlg, &ep->GetProdTess());
break;
case IDC_DISP:
ep->settingDisp = TRUE;
ep->SetTessUI(hDlg, &ep->GetDispTess());
break;
case IDC_TILE_MODE:
{
BOOL bCheck=(IsDlgButtonChecked(hDlg, IDC_TILE_MODE)==BST_CHECKED);
ep->SetTileMode (bCheck!=0);
// Old
EnableWindow (GetDlgItem (hDlg, IDC_STEPS), !bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_STEPSSPINNER), !bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_STEPS_RENDER), !bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_STEPSRENDERSPINNER), !bCheck);
// New
EnableWindow (GetDlgItem (hDlg, IDC_TILESTEPS), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_TILESTEPSSPINNER), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_TRANSITION), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_TRANSITIONSPINNER), bCheck);
EnableWindow (GetDlgItem (hDlg, IDC_KEEP_MAPPING), bCheck);
ep->SetTessUI(hDlg, &ep->GetDispTess());
}
break;
case IDC_KEEP_MAPPING:
ep->SetKeepMapping (IsDlgButtonChecked(hDlg, IDC_KEEP_MAPPING)!=0);
ep->SetTessUI(hDlg, &ep->GetDispTess());
break;
// watje 12-10-98
case IDC_SHOW_INTERIOR_FACES:
case IDC_TESS_SET:
case IDC_TESS_REGULAR:
case IDC_TESS_PARAM:
case IDC_TESS_SPATIAL:
case IDC_TESS_CURV:
case IDC_TESS_LDA:
{
TessApprox tess;
if (ep->settingViewportTess)
{
tess = ep->GetViewTess();
} else
{
if (ep->settingDisp)
tess = ep->GetDispTess();
else
tess = ep->GetProdTess();
}
switch (LOWORD(wParam))
{
// watje 12-10-98
case IDC_SHOW_INTERIOR_FACES:
tess.showInteriorFaces = IsDlgButtonChecked(hDlg, IDC_SHOW_INTERIOR_FACES);
break;
case IDC_TESS_SET:
tess.type = TESS_SET;
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
case IDC_TESS_REGULAR:
tess.type = TESS_REGULAR;
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
case IDC_TESS_PARAM:
tess.type = TESS_PARAM;
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
case IDC_TESS_SPATIAL:
tess.type = TESS_SPATIAL;
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
case IDC_TESS_CURV:
tess.type = TESS_CURVE;
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
case IDC_TESS_LDA:
tess.type = TESS_LDA;
EnableWindow(GetDlgItem(hDlg, IDC_SHOW_INTERIOR_FACES), TRUE);
break;
}
if (ep->settingViewportTess)
{
ep->SetViewTess(tess);
} else
{
if (ep->settingDisp)
ep->SetDispTess(tess);
else
ep->SetProdTess(tess);
}
ep->SetTessUI(hDlg, &tess);
}
break;
case IDC_TESS_VIEW_DEP:
{
TessApprox tess;
tess = ep->GetProdTess();
tess.view = IsDlgButtonChecked(hDlg, IDC_TESS_VIEW_DEP);
if (ep->settingDisp)
ep->SetDispTess(tess);
else
ep->SetProdTess(tess);
}
break;
case IDC_TESS_NORMALS:
if (ep->settingViewportTess)
{
ep->SetViewTessNormals(IsDlgButtonChecked(hDlg, IDC_TESS_NORMALS));
ep->SetTessUI(hDlg, &ep->GetViewTess());
} else
{
ep->SetProdTessNormals(IsDlgButtonChecked(hDlg, IDC_TESS_NORMALS));
if (ep->settingDisp)
ep->SetTessUI(hDlg, &ep->GetDispTess());
else
ep->SetTessUI(hDlg, &ep->GetProdTess());
}
break;
case IDC_WELDTESS:
if (ep->settingViewportTess)
{
ep->SetViewTessWeld(IsDlgButtonChecked(hDlg, IDC_WELDTESS));
ep->SetTessUI(hDlg, &ep->GetViewTess());
} else
{
ep->SetProdTessWeld(IsDlgButtonChecked(hDlg, IDC_WELDTESS));
if (ep->settingDisp)
ep->SetTessUI(hDlg, &ep->GetDispTess());
else
ep->SetTessUI(hDlg, &ep->GetProdTess());
}
break;
case IDC_ADVANCED_PARAMETERS:
{
TessApprox tess;
if (ep->settingViewportTess)
{
tess = ep->GetViewTess();
} else
{
if (ep->settingDisp)
tess = ep->GetDispTess();
else
tess = ep->GetProdTess();
}
sParams.mStyle = tess.subdiv;
sParams.mMin = tess.minSub;
sParams.mMax = tess.maxSub;
sParams.mTris = tess.maxTris;
int retval = DialogBox(hInstance,
MAKEINTRESOURCE(IDD_SURF_APPROX_ADV),
ep->ip->GetMAXHWnd(), AdvParametersDialogProc);
if (retval == 1)
{
BOOL confirm = FALSE;
if ((sParams.mStyle == SUBDIV_DELAUNAY && sParams.mTris > 200000) ||
(sParams.mStyle != SUBDIV_DELAUNAY && sParams.mMax > 5))
{
// warning!
TSTR title = GetString(IDS_ADV_SURF_APPROX_WARNING_TITLE),
warning = GetString(IDS_ADV_SURF_APPROX_WARNING);
if (MessageBox(hDlg, warning, title,
MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2) == IDYES)
confirm = TRUE;
} else
confirm = TRUE;
if (confirm)
{
// do it, they've been warned!
tess.subdiv = sParams.mStyle;
tess.minSub = sParams.mMin;
tess.maxSub = sParams.mMax;
tess.maxTris = sParams.mTris;
if (ep->settingViewportTess)
{
ep->SetViewTess(tess);
} else
{
if (ep->settingDisp)
ep->SetDispTess(tess);
else
ep->SetProdTess(tess);
}
}
}
break;
}
}
break;
}
return FALSE;
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
AdvParams sParams;
static ISpinnerControl* psMinSpin = NULL;
static ISpinnerControl* psMaxSpin = NULL;
static ISpinnerControl* psMaxTrisSpin = NULL;
// this max matches the MI max.
#define MAX_SUBDIV 7
static BOOL initing = FALSE; // this is a hack but CenterWindow causes bad commands
BOOL CALLBACK
AdvParametersDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
initing = TRUE;
CenterWindow(hDlg, GetCOREInterface()->GetMAXHWnd());
initing = FALSE;
psMinSpin = SetupIntSpinner(hDlg, IDC_TESS_MIN_REC_SPINNER, IDC_TESS_MIN_REC, 0, sParams.mMax, sParams.mMin);
psMaxSpin = SetupIntSpinner(hDlg, IDC_TESS_MAX_REC_SPINNER, IDC_TESS_MAX_REC, sParams.mMin, MAX_SUBDIV, sParams.mMax);
psMaxTrisSpin = SetupIntSpinner(hDlg, IDC_TESS_MAX_TRIS_SPINNER, IDC_TESS_MAX_TRIS, 0, 2000000, sParams.mTris);
switch (sParams.mStyle)
{
case SUBDIV_GRID:
CheckDlgButton(hDlg, IDC_GRID, TRUE);
CheckDlgButton(hDlg, IDC_TREE, FALSE);
CheckDlgButton(hDlg, IDC_DELAUNAY, FALSE);
break;
case SUBDIV_TREE:
CheckDlgButton(hDlg, IDC_GRID, FALSE);
CheckDlgButton(hDlg, IDC_TREE, TRUE);
CheckDlgButton(hDlg, IDC_DELAUNAY, FALSE);
break;
case SUBDIV_DELAUNAY:
CheckDlgButton(hDlg, IDC_GRID, FALSE);
CheckDlgButton(hDlg, IDC_TREE, FALSE);
CheckDlgButton(hDlg, IDC_DELAUNAY, TRUE);
break;
}
break;
}
case WM_COMMAND:
if (initing)
return FALSE;
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg, 1);
break;
case IDCANCEL:
EndDialog(hDlg, 0);
break;
case IDC_GRID:
sParams.mStyle = SUBDIV_GRID;
CheckDlgButton(hDlg, IDC_GRID, TRUE);
CheckDlgButton(hDlg, IDC_TREE, FALSE);
CheckDlgButton(hDlg, IDC_DELAUNAY, FALSE);
break;
case IDC_TREE:
sParams.mStyle = SUBDIV_TREE;
CheckDlgButton(hDlg, IDC_GRID, FALSE);
CheckDlgButton(hDlg, IDC_TREE, TRUE);
CheckDlgButton(hDlg, IDC_DELAUNAY, FALSE);
break;
case IDC_DELAUNAY:
sParams.mStyle = SUBDIV_DELAUNAY;
CheckDlgButton(hDlg, IDC_GRID, FALSE);
CheckDlgButton(hDlg, IDC_TREE, FALSE);
CheckDlgButton(hDlg, IDC_DELAUNAY, TRUE);
break;
}
break;
case CC_SPINNER_CHANGE:
switch (LOWORD(wParam))
{
case IDC_TESS_MIN_REC_SPINNER:
sParams.mMin = psMinSpin->GetIVal();
psMinSpin->SetLimits(0, sParams.mMax, FALSE);
psMaxSpin->SetLimits(sParams.mMin, MAX_SUBDIV, FALSE);
break;
case IDC_TESS_MAX_REC_SPINNER:
sParams.mMax = psMaxSpin->GetIVal();
psMinSpin->SetLimits(0, sParams.mMax, FALSE);
psMaxSpin->SetLimits(sParams.mMin, MAX_SUBDIV, FALSE);
break;
case IDC_TESS_MAX_TRIS_SPINNER:
sParams.mTris = psMaxTrisSpin->GetIVal();
break;
}
break;
case WM_DESTROY:
if (psMinSpin)
{
ReleaseISpinner(psMinSpin);
psMinSpin = NULL;
}
if (psMaxSpin)
{
ReleaseISpinner(psMaxSpin);
psMaxSpin = NULL;
}
if (psMaxTrisSpin)
{
ReleaseISpinner(psMaxTrisSpin);
psMaxTrisSpin = NULL;
}
break;
}
return FALSE;
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetViewTess(TessApprox &tess)
{
viewTess = tess;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetViewTess(tess);
patchData->viewTess = tess;
//rpatch->rTess = rTess;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetProdTess(TessApprox &tess)
{
prodTess = tess;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetProdTess(tess);
patchData->prodTess = tess;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetDispTess(TessApprox &tess)
{
dispTess = tess;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetDispTess(tess);
patchData->dispTess = tess;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetViewTessNormals(BOOL use)
{
mViewTessNormals = use;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetViewTessNormals(use);
patchData->mViewTessNormals = use;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetProdTessNormals(BOOL use)
{
mProdTessNormals = use;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetProdTessNormals(use);
patchData->mProdTessNormals = use;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetViewTessWeld(BOOL weld)
{
mViewTessWeld = weld;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetViewTessWeld(weld);
patchData->mViewTessWeld = weld;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void EditPatchMod::SetProdTessWeld(BOOL weld)
{
mProdTessWeld = weld;
ModContextList mcList;
INodeTab nodes;
if (!ip)
return;
ip->GetModContexts(mcList, nodes);
for (int i = 0; i < mcList.Count(); i++)
{
EditPatchData *patchData =(EditPatchData*)mcList[i]->localData;
if (!patchData)
continue;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(),rpatch);
if (!patch)
continue;
patch->SetProdTessWeld(weld);
patchData->mProdTessWeld = weld;
if (patchData->tempData)
{
patchData->TempData(this)->Invalidate(PART_DISPLAY);
}
}
nodes.DisposeTemporary();
NotifyDependents(FOREVER, PART_DISPLAY, REFMSG_CHANGE);
ip->RedrawViews(ip->GetTime(), REDRAW_NORMAL);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------