2012-05-29 13:31:11 +00:00
|
|
|
#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;
|
|
|
|
}
|