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

138 lines
3 KiB
C++

#include "stdafx.h"
#include "editpat.h"
// ------------------------------------------------------------------------------------------------------------------------------------------------------
#define DBGWELD_DUMPx
#define DBGWELD_ACTIONx
#define DBG_NAMEDSELSx
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void PatchVertexDelta::SetSize(PatchMesh& patch, BOOL load)
{
dtab.MakeCompatible(patch, FALSE);
// Load it if necessary
if (load)
{
int verts = patch.numVerts;
int vecs = patch.numVecs;
int i;
for (i = 0; i < verts; ++i)
{
dtab.ptab[i] = patch.verts[i].p;
dtab.pttab[i] = patch.verts[i].flags & PVERT_COPLANAR;
}
for (i = 0; i < vecs; ++i)
dtab.vtab[i] = patch.vecs[i].p;
}
}
void PatchVertexDelta::Apply(PatchMesh &patch)
{
// DebugPrint(_T("PVD:Applying\n"));
// This does nothing if the number of verts hasn't changed in the mesh.
SetSize(patch, FALSE);
// Apply the deltas
int verts = patch.numVerts;
int vecs = patch.numVecs;
int i;
for (i = 0; i < verts; ++i)
{
patch.verts[i].p += dtab.ptab[i];
patch.verts[i].flags ^= dtab.pttab[i];
}
for (i = 0; i < vecs; ++i)
{
patch.vecs[i].p += dtab.vtab[i];
}
patch.computeInteriors();
}
void PatchVertexDelta::UnApply(PatchMesh &patch)
{
// DebugPrint(_T("PVD:UnApplying\n"));
// This does nothing if the number of verts hasn't changed in the mesh.
SetSize(patch, FALSE);
// Apply the deltas
int verts = patch.numVerts;
int vecs = patch.numVecs;
int i;
for (i = 0; i < verts; ++i)
{
patch.verts[i].p -= dtab.ptab[i];
patch.verts[i].flags ^= dtab.pttab[i];
}
for (i = 0; i < vecs; ++i)
{
patch.vecs[i].p -= dtab.vtab[i];
}
patch.computeInteriors();
}
// This function applies the current changes to slave handles and their knots, and zeroes everything else
void PatchVertexDelta::ApplyHandlesAndZero(PatchMesh &patch, int handleVert)
{
// DebugPrint(_T("PVD:ApplyAndZero\n"));
// This does nothing if the number of verts hasn't changed in the mesh.
SetSize(patch, FALSE);
Point3 zeroPt(0.0f, 0.0f, 0.0f);
// Apply the deltas to just the slave handles
int verts = patch.numVerts;
int vecs = patch.numVecs;
Point3Tab& delta = dtab.vtab;
IntTab& kdelta = dtab.pttab;
int i;
for (i = 0; i < vecs; ++i)
{
if (!(delta[i] == zeroPt))
{
if (i != handleVert)
patch.vecs[i].p += delta[i];
else
delta[i] = zeroPt;
}
}
for (i = 0; i < verts; ++i)
{
if (kdelta[i])
patch.verts[i].flags ^= kdelta[i];
}
}
#define PVD_POINTTAB_CHUNK 0x1000
IOResult PatchVertexDelta::Save(ISave *isave)
{
isave->BeginChunk(PVD_POINTTAB_CHUNK);
dtab.Save(isave);
isave-> EndChunk();
return IO_OK;
}
IOResult PatchVertexDelta::Load(ILoad *iload)
{
IOResult res;
while (IO_OK == (res = iload->OpenChunk()))
{
switch (iload->CurChunkID())
{
case PVD_POINTTAB_CHUNK:
res = dtab.Load(iload);
break;
}
iload->CloseChunk();
if (res != IO_OK)
return res;
}
return IO_OK;
}