khanat-opennel-code/code/nel/tools/3d/plugin_max/nel_patch_paint/paint_pops.cpp

93 lines
2 KiB
C++

#include "stdafx.h"
#include "nel_patch_paint.h"
extern CoreExport Class_ID patchClassID;
// in mods.cpp
extern HINSTANCE hInstance;
/*-------------------------------------------------------------------*/
EPTempData::~EPTempData()
{
if (patch) delete patch;
if (rpatch) delete rpatch;
}
EPTempData::EPTempData(PaintPatchMod *m,PaintPatchData *pd)
{
patch = NULL;
rpatch = NULL;
patchValid.SetEmpty();
patchData = pd;
mod = m;
}
void EPTempData::Invalidate(PartID part,BOOL patchValid)
{
if ( !patchValid )
{
delete patch;
patch = NULL;
delete rpatch;
rpatch = NULL;
}
if ( part & PART_TOPO )
{
if (rpatch)
rpatch->InvalidateChannels (PART_TOPO|PART_GEOM|PART_SELECT|TEXMAP_CHANNEL);
}
if ( part & PART_GEOM )
{
if (rpatch)
rpatch->InvalidateChannels (PART_GEOM);
}
if ( part & PART_SELECT )
{
if (rpatch)
rpatch->InvalidateChannels (PART_SELECT);
}
}
PatchMesh *EPTempData::GetPatch(TimeValue t, RPatchMesh *&rPatch)
{
if ( patchValid.InInterval(t) && patch )
{
rPatch=rpatch;
return patch;
}
else
{
patchData->SetFlag(EPD_UPDATING_CACHE,TRUE);
mod->NotifyDependents(Interval(t,t),
PART_GEOM|SELECT_CHANNEL|PART_SUBSEL_TYPE|PART_DISPLAY|PART_TOPO,
REFMSG_MOD_EVAL);
patchData->SetFlag(EPD_UPDATING_CACHE,FALSE);
rPatch=rpatch;
return patch;
}
}
BOOL EPTempData::PatchCached(TimeValue t)
{
return (patchValid.InInterval(t) && patch);
}
void EPTempData::UpdateCache(RPO *patchOb)
{
if ( patch ) delete patch;
if ( rpatch ) delete rpatch;
patch = new PatchMesh(patchOb->patch);
rpatch = new RPatchMesh(*patchOb->rpatch);
patchValid = FOREVER;
// These are the channels we care about.
patchValid &= patchOb->ChannelValidity(0,GEOM_CHAN_NUM);
patchValid &= patchOb->ChannelValidity(0,TOPO_CHAN_NUM);
patchValid &= patchOb->ChannelValidity(0,SELECT_CHAN_NUM);
patchValid &= patchOb->ChannelValidity(0,SUBSEL_TYPE_CHAN_NUM);
patchValid &= patchOb->ChannelValidity(0,DISP_ATTRIB_CHAN_NUM);
patchValid &= patchOb->ChannelValidity(0,TEXMAP_CHAN_NUM);
}