khanat-opennel-code/code/nel/tools/3d/plugin_max/nel_patch_edit/np_epm_gui.cpp

161 lines
4.5 KiB
C++

#include "stdafx.h"
#include "editpat.h"
// ------------------------------------------------------------------------------------------------------------------------------------------------------
#define DBGWELD_DUMPx
#define DBGWELD_ACTIONx
#define DBG_NAMEDSELSx
#define PROMPT_TIME 2000
// ------------------------------------------------------------------------------------------------------------------------------------------------------
extern HIMAGELIST hFaceImages;
int patchHitOverride = 0; // If zero, no override is done
// ------------------------------------------------------------------------------------------------------------------------------------------------------
class EPImageListDestroyer
{
~EPImageListDestroyer()
{
if (hFaceImages)
ImageList_Destroy(hFaceImages);
}
};
PatchRightMenu pMenu;
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void LoadImages()
{
if (hFaceImages)
return;
HBITMAP hBitmap, hMask;
hFaceImages = ImageList_Create(24, 23, ILC_COLOR | ILC_MASK, 6, 0);
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_PATCHSELTYPES));
hMask = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_PATCHSELMASK));
ImageList_Add(hFaceImages, hBitmap, hMask);
DeleteObject(hBitmap);
DeleteObject(hMask);
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void PatchRightMenu::Init(RightClickMenuManager* manager, HWND hWnd, IPoint2 m)
{
switch (ep->GetSubobjectLevel())
{
case EP_VERTEX:
if (ep->RememberVertThere(hWnd, m))
{
int oldType = -1;
int flags1, flags2;
flags1 = flags2 = MF_STRING;
switch (ep->rememberedData)
{
case PVERT_COPLANAR:
flags1 |= MF_CHECKED;
break;
case 0:
flags2 |= MF_CHECKED;
break;
}
manager->AddMenu(this, MF_SEPARATOR, 0, NULL);
manager->AddMenu(this, flags1, PVERT_COPLANAR, GetString(IDS_TH_COPLANAR));
manager->AddMenu(this, flags2, 0, GetString(IDS_TH_CORNER));
}
break;
case EP_PATCH:
if (ep->RememberPatchThere(hWnd, m))
{
int oldType = -1;
int flags1, flags2;
flags1 = flags2 = MF_STRING;
switch (ep->rememberedData)
{
case PATCH_AUTO:
flags1 |= MF_CHECKED;
break;
case 0:
flags2 |= MF_CHECKED;
break;
}
manager->AddMenu(this, MF_SEPARATOR, 0, NULL);
manager->AddMenu(this, flags1, PATCH_AUTO, GetString(IDS_TH_AUTOINTERIOR));
manager->AddMenu(this, flags2, 0, GetString(IDS_TH_MANUALINTERIOR));
}
break;
}
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void PatchRightMenu::Selected(UINT id)
{
switch (ep->GetSubobjectLevel())
{
case EP_VERTEX:
ep->SetRememberedVertType((int)id);
break;
case EP_PATCH:
ep->SetRememberedPatchType((int)id);
break;
}
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
int EditPatchMod::HitTest(TimeValue t, INode* inode, int type, int crossing,
int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc)
{
Interval valid;
int savedLimits, res = 0;
GraphicsWindow *gw = vpt->getGW();
HitRegion hr;
MakeHitRegion(hr, type, crossing, 4, p);
gw->setHitRegion(&hr);
Matrix3 mat = inode->GetObjectTM(t);
gw->setTransform(mat);
gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM);
gw->clearHitCode();
if (mc->localData)
{
EditPatchData *patchData =(EditPatchData*)mc->localData;
RPatchMesh *rpatch;
PatchMesh *patch = patchData->TempData(this)->GetPatch(ip->GetTime(), rpatch);
if (!patch)
return FALSE;
SubPatchHitList hitList;
PatchSubHitRec *rec;
rpatch->UpdateBinding (*patch, t);
if (selLevel!=EP_TILE)
{
res = patch->SubObjectHitTest(gw, gw->getMaterial(), &hr,
flags | ((patchHitOverride) ? patchHitLevel[patchHitOverride] : patchHitLevel[selLevel]), hitList);
}
else
{
res = rpatch->SubObjectHitTest(gw, gw->getMaterial(), &hr,
flags | ((patchHitOverride) ? patchHitLevel[patchHitOverride] : patchHitLevel[selLevel]), hitList,
t, *patch);
}
rec = hitList.First();
while (rec)
{
vpt->LogHit(inode, mc, rec->dist, 123456, new PatchHitData(rec->patch, rec->index, rec->type));
rec = rec->Next();
}
}
gw->setRndLimits(savedLimits);
return res;
}