khanat-opennel-code/code/nel/include/nel/3d/tess_block.h

167 lines
5 KiB
C++

// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_TESS_BLOCK_H
#define NL_TESS_BLOCK_H
#include "nel/misc/types_nl.h"
#include "nel/3d/tessellation.h"
#include "nel/misc/aabbox.h"
#include "nel/misc/bsphere.h"
#include <list>
namespace NL3D
{
// clip Only with Left/Right and Top/Bottom planes, for faster clip.
#define NL3D_TESSBLOCK_NUM_CLIP_PLANE 4
// block of 2*2 tiles, for accurate clipping.
#define NL3D_TESSBLOCK_TILESIZE 4
class CPatchRdrPass;
class CLandscapeFaceVectorManager;
class CLandscapeVegetableBlock;
// ***************************************************************************
/**
* A block of 2*2 tiles, for accurate clipping.
* \author Lionel Berenguier
* \author Nevrax France
* \date 2000
*/
class CTessBlock
{
public:
/*
Cache optim:
Important to store them here for better Cache access in CPatch::MasterBlock (near too TessBlocks)
*/
// FaceVectors.
TLandscapeIndexType *Far0FaceVector;
TLandscapeIndexType *Far1FaceVector;
// tiles one are stored in material.
private:
// Clip info.
NLMISC::CAABBox BBox;
NLMISC::CBSphere BSphere;
bool Empty; // empty bbox? (first extend).
// Clip result.
bool Clipped;
bool FullFar1; // block Entirely IN transition. (all alpha of Far1 should be 255)
bool EmptyFar1; // block Entirely OUT transition. (all alpha of Far1 should be 0)
public:
// Vertices.
CTessList<CTessFarVertex> FarVertexList;
CTessList<CTessNearVertex> NearVertexList;
// Faces.
CTessList<CTessFace> FarFaceList;
CTileMaterial *RdrTileRoot[NL3D_TESSBLOCK_TILESIZE];
// contains FarFaceList.size() + "RdrTileRoot.size()"
uint FaceTileMaterialRefCount;
// contains only "RdrTileRoot.size()"
uint TileMaterialRefCount;
// For memory optimisation, Info for Lightmap per block of 2x2 tiles are stored here too.
uint LightMapId;
uint LightMapRefCount;
CPatchRdrPass *LightMapRdrPass;
// For micro-vegetation, little tessBlocks got InstanceGroups
CLandscapeVegetableBlock *VegetableBlock;
public:
CTessBlock();
// in dtor, remove me from list of TessBlock to modify, if needed.
~CTessBlock();
// Must have a patch, for good TessBlock FaceVector (re)construction.
void init(CPatch *patch);
CPatch *getPatch();
// BBox.
void extendSphereFirst(const CVector &vec);
void extendSphereAdd(const CVector &vec);
void extendSphereCompile();
// Reset clip to no clipped.
void resetClip();
// force clip to clipped.
void forceClip();
// Clip. (set Clipped to true/false). Use the CurrentPyramid static.
static CPlane CurrentPyramid[NL3D_TESSBLOCK_NUM_CLIP_PLANE];
void clip();
// Clip Tile/Far.
void clipFar(const CVector &refineCenter, float tileDistNear, float farTransition);
// Clip result.
bool getClipped() const {return Clipped;}
bool visibleFar0() const {return !Clipped && !FullFar1;}
bool visibleTile() const {return !Clipped && !FullFar1;}
bool visibleFar1() const {return !Clipped && !EmptyFar1;}
// create and fill FaceVector, from the FaceList.
void createFaceVectorFar0(CLandscapeFaceVectorManager &mgr);
void deleteFaceVectorFar0(CLandscapeFaceVectorManager &mgr);
void createFaceVectorFar1(CLandscapeFaceVectorManager &mgr);
void deleteFaceVectorFar1(CLandscapeFaceVectorManager &mgr);
void createFaceVectorTile(CLandscapeFaceVectorManager &mgr);
void deleteFaceVectorTile(CLandscapeFaceVectorManager &mgr);
// suppose FV is created, and refill it.
void refillFaceVectorFar0();
void refillFaceVectorFar1();
void refillFaceVectorTile();
// append/remove to modify list. This is for FaceVector update durint refine(), addZone() ....
bool isInModifyList() const {return _PrecToModify!=NULL;}
// append to modify list has the side effect od deleting ALL FaceVector.
void appendToModifyListAndDeleteFaceVector(CTessBlock &root, CLandscapeFaceVectorManager &mgr);
void removeFromModifyList();
public:
// For CLandscape only.
CTessBlock *getNextToModify() {return _NextToModify;}
private:
CPatch *_Patch;
// If in list, prec is !NULL.
CTessBlock *_PrecToModify;
CTessBlock *_NextToModify;
};
} // NL3D
#endif // NL_TESS_BLOCK_H
/* End of tess_block.h */