/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#ifndef plAccMeshSmooth_inc
#define plAccMeshSmooth_inc
#include "hsTemplates.h"
#include "plAccessGeometry.h"
#include "plAccessSpan.h"
struct hsPoint3;
struct hsVector3;
class plGeometrySpan;
class plAccMeshSmooth
{
public:
enum {
kNone = 0x0,
kSmoothNorm = 0x1,
kSmoothPos = 0x2,
kSmoothDiffuse = 0x4
};
protected:
struct VtxAccum
{
hsPoint3 fPos;
hsVector3 fNorm;
hsColorRGBA fDiffuse;
};
UInt32 fFlags;
hsScalar fMinNormDot;
hsScalar fDistTolSq;
plAccessGeometry fAccGeom;
hsTArray fSpans;
hsPoint3 IPositionToWorld(plAccessSpan& span, int i) const;
hsVector3 INormalToWorld(plAccessSpan& span, int i) const;
hsPoint3 IPositionToLocal(plAccessSpan& span, const hsPoint3& wPos) const;
hsVector3 INormalToLocal(plAccessSpan& span, const hsVector3& wNorm) const;
void FindEdges(UInt32 maxVtxIdx, UInt32 nTris, UInt16* idxList, hsTArray& edgeVerts);
void FindEdges(hsTArray& sets, hsTArray* edgeVerts);
void FindSharedVerts(plAccessSpan& span, int numEdgeVerts, hsTArray& edgeVerts, hsTArray& shareVtx, VtxAccum& accum);
void SetNormals(plAccessSpan& span, hsTArray& shareVtx, const hsVector3& norm) const;
void SetPositions(plAccessSpan& span, hsTArray& shareVtx, const hsPoint3& pos) const;
void SetDiffuse(plAccessSpan& span, hsTArray& shareVtx, const hsColorRGBA& diff) const;
public:
plAccMeshSmooth() : fFlags(kSmoothNorm), fMinNormDot(0.25f), fDistTolSq(1.e-4f), fAccGeom() {}
void SetAngle(hsScalar degs);
hsScalar GetAngle() const; // returns degrees
void SetDistTol(hsScalar dist);
hsScalar GetDistTol() const;
void Smooth(hsTArray& sets);
void SetFlags(UInt32 f) { fFlags = f; }
UInt32 GetFlags() const { return fFlags; }
};
#endif // plAccMeshSmooth_inc