#include <patch.h>
A---> ad ---- da <---D | | | | v v ab ia id dc
| | | |
ba ib ic cd ^ ^ | | | | B---> bc ---- cb <---C
NB: Patch 1x1 or 1xX are illegal: lot of problem: rectangular geomoprh, Son0 and Son1 must be setup as tile at beginning ...
NB: Edges number are:
Nevrax France
Definition at line 302 of file patch.h.
Lumels methods | |
void | copyTileFlagsFromPatch (const CPatch *src) |
void | packShadowMap (const uint8 *pLumel) |
void | resetCompressedLumels () |
void | setupColorsFromTileFlags (const NLMISC::CRGBA colors[4]) |
debug coloring | |
void | unpackShadowMap (uint8 *pShadow) |
uint | evalLumelBlock (const uint8 *original, const uint8 *unCompressed, uint width, uint height) |
void | packLumelBlock (uint8 *dest, const uint8 *source, uint8 alpha0, uint8 alpha1) |
void | unpackLumelBlock (uint8 *dest, const uint8 *src) |
[NOHEADER] | |
bool | getCornerSmoothFlag (uint corner) const |
void | setCornerSmoothFlag (uint corner, bool smooth) |
uint8 | NoiseRotation |
The orientation of the NoiseMap. 0,1,2,3. This represent a CCW rotation of the NoiseMap. | |
uint8 | _CornerSmoothFlag |
Put here for packing with NoiseRotation. | |
RenderList mgt. | |
enum | TFarVertType { FVMasterBlock = 0, FVTessBlock, FVTessBlockEdge } |
void | addRefTessBlocks () |
void | appendFaceToRenderList (CTessFace *face) |
void | appendFaceToTileRenderList (CTessFace *face) |
void | appendFarVertexToRenderList (CTessFarVertex *fv) |
void | appendNearVertexToRenderList (CTileMaterial *tileMat, CTessNearVertex *nv) |
void | appendTileMaterialToRenderList (CTileMaterial *tm) |
void | clearTessBlocks () |
void | decRefTessBlocks () |
void | dirtTessBlockFaceVector (CTessBlock &block) |
void | extendTessBlockWithEndPos (CTessFace *face) |
void | getNumTessBlock (CParamCoord pc, TFarVertType &type, uint &numtb) |
uint | getNumTessBlock (CTessFace *face) |
void | removeFaceFromRenderList (CTessFace *face) |
void | removeFaceFromTileRenderList (CTessFace *face) |
void | removeFarVertexFromRenderList (CTessFarVertex *fv) |
void | removeNearVertexFromRenderList (CTileMaterial *tileMat, CTessNearVertex *nv) |
void | removeTileMaterialFromRenderList (CTileMaterial *tm) |
void | resetMasterBlock () |
Dynamic Lighting Management | |
void | addRefDLMContext () |
Add a ref count to the DLMContext, creating it if necessary. | |
void | decRefDLMContext (uint count=1) |
Dec a ref count to the DLMContext, deleting it if refCount== 0. | |
CPatchDLMContext * | _DLMContext |
sint | _DLMContextRefCount |
[NOHEADER] | |
CTessFace * | linkTessFaceWithEdge (const NLMISC::CVector2f &uv0, const NLMISC::CVector2f &uv1, CTessFace *linkTo) |
CZone * | _BindZoneNeighbor [4] |
The 4 neighbors zone of this patch (setuped at bind() time). NB: NULL if zone not loaded, or if no patch near us. | |
Public Member Functions | |
void | averageTesselationVertices () |
void | bind (CBindInfo Edges[4], bool rebind) |
CAABBox | buildBBox () const |
Build the bbox of the patch, according to ctrl points, and displacement map max value. | |
void | compile (CZone *z, uint patchId, uint8 orderS, uint8 orderT, CTessVertex *baseVertices[4], float errorSize=0) |
CVector | computeContinousVertex (float s, float t) const |
CVector | computeVertex (float s, float t) const |
CPatch () | |
Constructor. | |
void | deleteTileUvs () |
void | forceMergeAtTileLevel () |
For changing TileMaxSubdivision. force tesselation to be under tile. | |
void | getBindNeighbor (uint edge, CBindInfo &neighborEdge) const |
return neighborhood information. | |
const CTessVertex * | getCornerVertex (uint corner) |
float | getErrorSize () const |
sint | getFar0 () const |
sint | getFar1 () const |
CLandscape * | getLandscape () const |
Get the landscape in which is placed this patch. | |
uint8 | getOrderForEdge (sint8 edge) const |
uint8 | getOrderS () const |
uint8 | getOrderT () const |
uint16 | getPatchId () const |
uint | getTileMaterialRefCount () const |
Get number of TileMaterial created in this Patch. | |
CZone * | getZone () const |
bool | isRenderClipped () const |
void | recreateTileUvs () |
void | refineAll () |
Refine this patch. Even if clipped. Refine all nodes. | |
void | refreshTesselationGeometry () |
void | release () |
Un-compile a patch. Tesselation is deleted. if patch is not compiled, no - op. | |
void | resetRenderFar () |
void | serial (NLMISC::IStream &f) |
void | unbind () |
void | unpack (CBezierPatch &p) const |
CBezierPatch * | unpackIntoCache () const |
~CPatch () | |
dtor | |
Subdivision / ForCollision. | |
void | addPatchBlocksInBBox (CPatchIdent paId, const CAABBox &bbox, std::vector< CPatchBlockIdent > &paBlockIds) const |
void | addTrianglesInBBox (CPatchIdent paId, const CAABBox &bbox, std::vector< CTrianglePatch > &triangles, uint8 tileTessLevel) const |
void | appendTessellationLeaves (std::vector< const CTessFace * > &leaves) const |
void | fillPatchQuadBlock (CPatchQuadBlock &quadBlock) const |
CVector | getTesselatedPos (CUV uv) const |
VB Allocator mgt. | |
void | allocateVBAndFaceVector () |
void | allocateVBAndFaceVectorFar1Only () |
void | debugAllocationMarkIndices (uint marker) |
void | deleteVBAndFaceVector () |
void | deleteVBAndFaceVectorFar1Only () |
void | fillFar0DLMUvOnlyVertexListVB (CTessList< CTessFarVertex > &vertList) |
void | fillFar1DLMUvOnlyVertexListVB (CTessList< CTessFarVertex > &vertList) |
void | fillVB () |
void | fillVBFar0Only () |
void | fillVBFar1Only () |
void | fillVBFarsDLMUvOnly () |
void | fillVBIfVisible () |
void | recreateTessBlockFaceVector (CTessBlock &block) |
Lightmap get interface. | |
void | appendTileLightInfluences (const CUV &uv, std::vector< CPointLightInfluence > &pointLightList) const |
void | computeCurrentTLILightmapDiv2 (NLMISC::CRGBA *array) const |
uint8 | getLumel (const CUV &uv) const |
Get the lumel under the position. | |
Dynamic Lighting Management | |
void | beginDLMLighting () |
void | endDLMLighting () |
void | processDLMLight (CPatchDLMPointLight &pl) |
Render | |
void | computeSoftwareGeomorphAndAlpha () |
CPatch * | getNextFar0ToRdr () const |
CPatch * | getNextFar1ToRdr () const |
void | preRender (const NLMISC::CBSphere &patchSphere) |
preRender this patch. Build Max faces / pass etc... | |
void | renderFar0 () |
Render this patch, if not clipped. Call PatchCurrentDriver->renderSimpleTriangles(). | |
void | renderFar1 () |
void | updateClipPatchVB (bool renderClipped) |
void | updateTextureFarOnly (const NLMISC::CBSphere &patchSphere) |
MicroVegetation | |
void | deleteAllVegetableIgs () |
Delete any vegetable Ig still existing in this patch. | |
void | recreateAllVegetableIgs () |
Recreate any vegetable block (as possible) in this patch. (usefull for edition). | |
UpdateLighting Management | |
CPatch * | getNextNearUL () const |
For lighting update, get Next (CiruclarList). If ==this, then list is empty. | |
uint | getNumNearTessBlocks () const |
get the number of Near TessBlocks. Actually OrderS/2*OrderT/2. | |
void | linkBeforeNearUL (CPatch *patchNext) |
For lighting update, insert this before patchNext (CiruclarList). textNext must be !NULL. | |
void | unlinkNearUL () |
For lighting update, unlink (CiruclarList). | |
uint | updateTessBlockLighting (uint numTb) |
Smooth flags methods | |
bool | getSmoothFlag (uint edge) const |
void | setSmoothFlag (uint edge, bool flag) |
Tiles get interface. | |
CTileElement * | getTileElement (const CUV &uv) |
Get the lumel under the position. | |
TileLightInfluences | |
void | resetTileLightInfluences () |
Data Fields | |
std::vector< uint8 > | CompressedLumels |
CVector3s | Interiors [4] |
CVector3s | Tangents [8] |
std::vector< CTileColor > | TileColors |
std::vector< CTileLightInfluence > | TileLightInfluences |
std::vector< CTileElement > | Tiles |
CVector3s | Vertices [4] |
The patch coordinates (see CBezierPatch). | |
Private Types | |
Private Member Functions | |
void | changeEdgeNeighbor (sint edge, CTessFace *to) |
void | checkCreateVertexVBFar (CTessFarVertex *pVert) |
void | checkCreateVertexVBNear (CTessNearVertex *pVert) |
void | checkDeleteVertexVBFar (CTessFarVertex *pVert) |
void | checkDeleteVertexVBNear (CTessNearVertex *pVert) |
void | checkFillVertexVBFar (CTessFarVertex *pVert) |
void | checkFillVertexVBNear (CTessNearVertex *pVert) |
void | computeDefaultErrorSize () |
void | computeGeomorphAlphaFar1VertexListVB (CTessList< CTessFarVertex > &vertList) |
void | computeGeomorphFar0VertexListVB (CTessList< CTessFarVertex > &vertList) |
void | computeGeomorphTileVertexListVB (CTessList< CTessNearVertex > &vertList) |
void | computeGeomorphVertexList (CTessList< CTessFarVertex > &vertList) |
void | computeNewFar (const NLMISC::CBSphere &patchSphere, sint &newFar0, sint &newFar1) |
void | computeTbTm (uint &numtb, uint &numtm, uint ts, uint tt) |
void | createFaceVectorFar0OrTile () |
void | createFaceVectorFar1 () |
void | debugAllocationMarkIndicesFarList (CTessList< CTessFarVertex > &vertList, uint marker) |
void | debugAllocationMarkIndicesNearList (CTessList< CTessNearVertex > &vertList, uint marker) |
void | deleteFaceVectorFar0OrTile () |
void | deleteFaceVectorFar1 () |
void | fillFar0VertexListVB (CTessList< CTessFarVertex > &vertList) |
void | fillFar0VertexVB (CTessFarVertex *pVert) |
void | fillFar1VertexListVB (CTessList< CTessFarVertex > &vertList) |
void | fillFar1VertexVB (CTessFarVertex *pVert) |
void | fillTileVertexListVB (CTessList< CTessNearVertex > &vertList) |
void | fillTileVertexVB (CTessNearVertex *pVert) |
CTessFace * | getRootFaceForEdge (sint edge) const |
CTessVertex * | getRootVertexForEdge (sint edge) const |
void | makeRoots () |
void | updateFar0VBAlloc (CTessList< CTessFarVertex > &vertList, bool alloc) |
void | updateFar1VBAlloc (CTessList< CTessFarVertex > &vertList, bool alloc) |
void | updateTileVBAlloc (CTessList< CTessNearVertex > &vertList, bool alloc) |
void | updateVBAlloc (bool alloc) |
Subdivision private. | |
void | addPatchBlocksInBBoxRecurs (CPatchIdent paId, const CAABBox &bbox, std::vector< CPatchBlockIdent > &paBlockIds, const CBezierPatch &pa, uint8 s0, uint8 s1, uint8 t0, uint8 t1) const |
void | addTileTrianglesInBBox (CPatchIdent paId, const CAABBox &bbox, std::vector< CTrianglePatch > &triangles, uint8 tessLevel, uint8 s0, uint8 t0) const |
void | addTrianglesInBBoxRecurs (CPatchIdent paId, const CAABBox &bbox, std::vector< CTrianglePatch > &triangles, uint8 tessLevel, const CBezierPatch &pa, uint8 s0, uint8 s1, uint8 t0, uint8 t1) const |
void | buildBBoxFromBezierPatch (const CBezierPatch &p, CAABBox &ret) const |
build a bbox from the convex hull of a bezier patch, enlarged with noise. | |
CVector | computeVertexButCorner (float s, float t, bool &onCorner) const |
Used by computeContinousVertex(). | |
void | addTileLightmapEdgeWithTLI (uint ts, uint tt, uint edge, NLMISC::CRGBA *dest, uint stride, bool inverse) |
void | addTileLightmapPixelWithTLI (uint ts, uint tt, uint s, uint t, NLMISC::CRGBA *dest) |
void | addTileLightmapWithTLI (uint ts, uint tt, NLMISC::CRGBA *dest, uint stride) |
void | computeNearBlockLightmap (uint ts, uint tt, NLMISC::CRGBA *lightText) |
void | computeTileLightmap (uint ts, uint tt, NLMISC::CRGBA *dest, uint stride) |
void | computeTileLightmapAutomatic (uint ts, uint tt, NLMISC::CRGBA *dest, uint stride) |
void | computeTileLightmapEdge (uint ts, uint tt, uint edge, NLMISC::CRGBA *dest, uint stride, bool inverse) |
void | computeTileLightmapEdgeAutomatic (uint ts, uint tt, uint edge, NLMISC::CRGBA *dest, uint stride, bool inverse) |
void | computeTileLightmapEdgePrecomputed (uint ts, uint tt, uint edge, NLMISC::CRGBA *dest, uint stride, bool inverse) |
void | computeTileLightmapPixel (uint ts, uint tt, uint s, uint t, NLMISC::CRGBA *dest) |
void | computeTileLightmapPixelAroundCorner (const NLMISC::CVector2f &stIn, NLMISC::CRGBA *dest, bool lookAround) |
void | computeTileLightmapPixelAutomatic (uint ts, uint tt, uint s, uint t, NLMISC::CRGBA *dest) |
void | computeTileLightmapPixelPrecomputed (uint ts, uint tt, uint s, uint t, NLMISC::CRGBA *dest) |
void | computeTileLightmapPrecomputed (uint ts, uint tt, NLMISC::CRGBA *dest, uint stride) |
CRGBA | CPatch::getCurrentTLIColor (uint x, uint y) const |
void | getCurrentTileTLIColors (uint ts, uint tt, NLMISC::CRGBA corners[4]) |
void | getTileLightMap (uint ts, uint tt, CPatchRdrPass *&rdrpass) |
void | getTileLightMapUvInfo (uint ts, uint tt, CVector &uvScaleBias) |
void | getTileTileColors (uint ts, uint tt, NLMISC::CRGBA corners[4]) |
void | modulateTileLightmapEdgeWithTileColors (uint ts, uint tt, uint edge, NLMISC::CRGBA *dest, uint stride, bool inverse) |
void | modulateTileLightmapPixelWithTileColors (uint ts, uint tt, uint s, uint t, NLMISC::CRGBA *dest) |
void | modulateTileLightmapWithTileColors (uint ts, uint tt, NLMISC::CRGBA *dest, uint stride) |
void | releaseTileLightMap (uint ts, uint tt) |
float | computeDisplaceCornerSmooth (float s, float t, sint8 smoothBorderX, sint8 smoothBorderY) const |
float | computeDisplaceEdgeSmooth (float s, float t, sint8 smoothBorderX, sint8 smoothBorderY) const |
float | computeDisplaceInteriorSmooth (float s, float t) const |
float | computeDisplaceRaw (float sTile, float tTile, float s, float t) const |
void | computeDisplaceRawCoordinates (float sTile, float tTile, float s, float t, sint &ts, sint &tt, sint &ms, sint &mt) const |
float | computeDisplaceRawInteger (sint ts, sint tt, sint ms, sint mt) const |
float | computeDisplaceRawOnNeighbor (float sTile, float tTile, float s, float t) const |
void | computeNoise (float s, float t, CVector &displace) const |
CVector | computeNormalCornerSmooth (float s, float t, sint8 smoothBorderX, sint8 smoothBorderY) const |
CVector | computeNormalEdgeSmooth (float s, float t, sint8 smoothBorderX, sint8 smoothBorderY) const |
CVector | computeNormalOnNeighbor (float s, float t, uint edgeExclude) const |
void | createVegetableBlock (uint numTb, uint ts, uint tt) |
Create / init the vegetableBlock in the corresponding TessBlock. TessBlocks must exist. | |
void | generateTileVegetable (CVegetableInstanceGroup *vegetIg, uint distType, uint ts, uint tt, CLandscapeVegetableBlockCreateContext &vbCreateCtx) |
Create / init the vegetableBlock in the corresponding TessBlock. TessBlocks must exist. | |
void | getTileLumelmapPixelPrecomputed (uint ts, uint tt, uint s, uint t, uint8 &dest) const |
void | getTileLumelmapPrecomputed (uint ts, uint tt, uint8 *dest, uint stride) |
Create / init the vegetableBlock in the corresponding TessBlock. TessBlocks must exist. | |
void | releaseVegetableBlock (uint numTb) |
release the vegetableBlock in the corresponding TessBlock. TessBlocks must exist | |
Texture mgt. | |
CPatchRdrPass * | getTileRenderPass (sint tileId, sint pass) |
void | getTileUvInfo (sint tileId, sint pass, bool alpha, uint8 &orient, CVector &uvScaleBias, bool &is256x256, uint8 &uvOff) |
Private Attributes | |
CPatch * | _NextRdrFar0 |
CPatch * | _NextRdrFar1 |
CPatchRdrPass * | _PatchRdrPassFar0 |
CPatchRdrPass * | _PatchRdrPassFar1 |
CTessFarVertex | BaseFarVertices [4] |
CTessVertex * | BaseVertices [4] |
float | ErrorSize |
bool | ExcludeFromRefineAll |
sint | Far0 |
float | Far0UBias |
float | Far0UScale |
float | Far0VBias |
float | Far0VScale |
sint | Far1 |
float | Far1UBias |
float | Far1UScale |
float | Far1VBias |
float | Far1VScale |
uint8 | Flags |
float | OOTransitionSqrDelta |
uint8 | OrderS |
uint8 | OrderT |
uint16 | PatchId |
CTessFace * | Son0 |
CTessFace * | Son1 |
sint | SquareLimitLevel |
sint | TessBlockLimitLevel |
sint | TileLimitLevel |
float | TransitionSqrMin |
CZone * | Zone |
UpdateLighting Management | |
CPatch * | _ULNearNext |
CPatch * | _ULNearPrec |
Block renders. | |
CTessBlock | MasterBlock |
sint | NumRenderableFaces |
sint | TessBlockRefCount |
NLMISC::CObjectVector< CTessBlock > | TessBlocks |
Vegetables. | |
std::vector< CVegetableClipBlock * > | VegetableClipBlocks |
list of vegetable clipBlocks, created/destroyed at same time as TessBlocks. | |
Static Private Attributes | |
uint32 | _Version = 7 |
CBezierPatch | CachePatch |
const CPatch * | LastPatch = NULL |
Friends | |
class | CLandscapeVegetableBlock |
class | CPatchRdrPass |
class | CTessFace |
class | CZone |
|
Definition at line 931 of file patch.h. Referenced by appendFarVertexToRenderList(), and removeFarVertexFromRenderList().
00931 {FVMasterBlock=0, FVTessBlock, FVTessBlockEdge}; |
|
Constructor.
Definition at line 61 of file patch.cpp. References _BindZoneNeighbor, _CornerSmoothFlag, _DLMContext, _DLMContextRefCount, _NextRdrFar0, _NextRdrFar1, _PatchRdrPassFar0, _PatchRdrPassFar1, _ULNearNext, _ULNearPrec, ExcludeFromRefineAll, MasterBlock, NoiseRotation, NumRenderableFaces, NL3D::CTessBlock::resetClip(), Son0, Son1, and TessBlockRefCount.
00062 { 00063 Zone= NULL; 00064 OrderS=0; 00065 OrderT=0; 00066 Son0=NULL; 00067 Son1=NULL; 00068 TessBlockRefCount=0; 00069 NumRenderableFaces= 0; 00070 00071 // for Pacs process. By default, false. 00072 ExcludeFromRefineAll= false; 00073 00074 // Init Passes. 00075 // DO NOT FILL Patch here, because of operator= problem. do it in compile(). 00076 // By default, RdrPasses are NULL. 00077 00078 // To force computation of texture info on next preRender(). 00079 Far0= -1; 00080 Far1= -1; 00081 00082 // Default: not binded. 00083 _BindZoneNeighbor[0]= NULL; 00084 _BindZoneNeighbor[1]= NULL; 00085 _BindZoneNeighbor[2]= NULL; 00086 _BindZoneNeighbor[3]= NULL; 00087 NoiseRotation= 0; 00088 // No smooth by default. 00089 _CornerSmoothFlag= 0; 00090 00091 // MasterBlock never clipped. 00092 MasterBlock.resetClip(); 00093 00094 // Init UL circular list to NULL (not compiled) 00095 _ULNearPrec= NULL; 00096 _ULNearNext= NULL; 00097 00098 // Dynamic LightMap 00099 _DLMContext= NULL; 00100 _DLMContextRefCount= 0; 00101 00102 // Render Passes 00103 _PatchRdrPassFar0= NULL; 00104 _NextRdrFar0= NULL; 00105 _PatchRdrPassFar1= NULL; 00106 _NextRdrFar1= NULL; 00107 } |
|
dtor
Definition at line 109 of file patch.cpp. References release().
00110 { 00111 release(); 00112 } |
|
Add CPatchBlockIdent to CPatchBlockIdent array which intersect the bbox. NB: this method use a convex hull subdivion to search in O(logn) what part of the patch to insert.
Definition at line 504 of file patch.cpp. References addPatchBlocksInBBoxRecurs(), and unpackIntoCache(). Referenced by NL3D::CLandscape::addPatchBlocksInBBox().
00505 { 00506 CBezierPatch &bpatch= *unpackIntoCache(); 00507 00508 // call with the whole root patch. 00509 addPatchBlocksInBBoxRecurs(paId, bbox, paBlockIds, bpatch, 0, OrderS, 0, OrderT); 00510 } |
|
recurse method of addPatchBlocksInBBox. Definition at line 514 of file patch.cpp. References buildBBoxFromBezierPatch(), NLMISC::CAABBox::intersect(), NL_PATCH_BLOCK_MAX_QUAD, nlassert, NL3D::CPatchBlockIdent::OrderS, NL3D::CPatchBlockIdent::OrderT, NL3D::CPatchBlockIdent::PatchId, NL3D::CPatchBlockIdent::S0, NL3D::CPatchBlockIdent::S1, NL3D::CBezierPatch::subdivideS(), NL3D::CBezierPatch::subdivideT(), NL3D::CPatchBlockIdent::T0, NL3D::CPatchBlockIdent::T1, uint, and uint8. Referenced by addPatchBlocksInBBox().
00516 { 00517 uint8 lenS=s1-s0, lenT=t1-t0; 00518 nlassert(lenS>0); 00519 nlassert(lenT>0); 00520 00521 // compute and compare bbox of the subdivision patch against request bbox. 00522 //======================== 00523 // NB: this compute includes possible noise. 00524 CAABBox paBBox; 00525 buildBBoxFromBezierPatch(pa, paBBox); 00526 // if do not intersect, stop here. 00527 if( !paBBox.intersect(bbox) ) 00528 return; 00529 // else if at CPatchQuadBlock tile level, then just add this Id. 00530 //======================== 00531 else if( lenS<=NL_PATCH_BLOCK_MAX_QUAD && lenT<=NL_PATCH_BLOCK_MAX_QUAD ) 00532 { 00533 // Add this PatchBlock desctiptor to the list. 00534 CPatchBlockIdent pbId; 00535 // Fill struct from this and result of recursion. 00536 pbId.PatchId= paId; 00537 pbId.OrderS= OrderS; 00538 pbId.OrderT= OrderT; 00539 pbId.S0= s0; 00540 pbId.S1= s1; 00541 pbId.T0= t0; 00542 pbId.T1= t1; 00543 // Add to list. 00544 paBlockIds.push_back(pbId); 00545 } 00546 // else subdiv and reccurs. 00547 //======================== 00548 else 00549 { 00550 // Subdivide along the bigger side. 00551 if(lenS>lenT) 00552 { 00553 // subdivide. 00554 CBezierPatch left, right; 00555 pa.subdivideS(left, right); 00556 uint8 sMiddle= (uint8)( ((uint)s0+(uint)s1) /2 ); 00557 // recurs left. 00558 addPatchBlocksInBBoxRecurs(paId, bbox, paBlockIds, left, s0, sMiddle, t0, t1); 00559 // recurs right. 00560 addPatchBlocksInBBoxRecurs(paId, bbox, paBlockIds, right, sMiddle, s1, t0, t1); 00561 } 00562 else 00563 { 00564 // subdivide. 00565 CBezierPatch top, bottom; 00566 pa.subdivideT(top, bottom); 00567 uint8 tMiddle= (uint8)( ((uint)t0+(uint)t1) /2 ); 00568 // recurs top. 00569 addPatchBlocksInBBoxRecurs(paId, bbox, paBlockIds, top, s0, s1, t0, tMiddle); 00570 // recurs bottom. 00571 addPatchBlocksInBBoxRecurs(paId, bbox, paBlockIds, bottom, s0, s1, tMiddle, t1); 00572 } 00573 } 00574 00575 } |
|
Add a ref count to the DLMContext, creating it if necessary.
Definition at line 1950 of file patch_lightmap.cpp. References _DLMContext, _DLMContextRefCount, fillVBFarsDLMUvOnly(), NL3D::CPatchDLMContext::generate(), getLandscape(), isRenderClipped(), and nlassert. Referenced by appendTileMaterialToRenderList(), and processDLMLight().
01951 { 01952 // the patch must be compiled. 01953 nlassert(Zone); 01954 01955 // if 0, create the context. 01956 if(_DLMContextRefCount==0) 01957 { 01958 nlassert(_DLMContext==NULL); 01959 _DLMContext= new CPatchDLMContext; 01960 // init now the context. 01961 _DLMContext->generate(this, getLandscape()->getTextureDLM(), getLandscape()->getPatchDLMContextList()); 01962 01963 // If the patch is visible, it may have Far Vertices created, 01964 // hence, we must refill them with good DLM Uvs. 01965 if(!isRenderClipped()) 01966 { 01967 // setup DLM Uv with new _DLMContext 01968 fillVBFarsDLMUvOnly(); 01969 } 01970 } 01971 01972 // incRef. 01973 _DLMContextRefCount++; 01974 } |
|
Definition at line 611 of file patch.cpp. References NL3D::CLandscape::_VegetableManager, NL3D::CVegetableManager::createClipBlock(), getLandscape(), NL3D::CLandscape::linkPatchToNearUL(), NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK, NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT, NL3D_TESSBLOCK_TILESIZE, nlassert, NLMISC::CObjectVector< CTessBlock >::resize(), sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlockRefCount, TessBlocks, uint, and VegetableClipBlocks. Referenced by appendFaceToRenderList(), appendFarVertexToRenderList(), appendNearVertexToRenderList(), and appendTileMaterialToRenderList().
00612 { 00613 uint i; 00614 00615 TessBlockRefCount++; 00616 if(TessBlocks.size()==0) 00617 { 00618 // Allocate the tessblocks. 00619 //========== 00620 00621 nlassert(NL3D_TESSBLOCK_TILESIZE==4); 00622 // A tessblock is 2*2 tiles. 00623 sint os= OrderS>>1; 00624 sint ot= OrderT>>1; 00625 nlassert(os>0); 00626 nlassert(ot>0); 00627 TessBlocks.resize(os*ot); 00628 // init all tessBlocks with the Patch ptr. 00629 for(i=0; i<TessBlocks.size(); i++) 00630 TessBlocks[i].init(this); 00631 00632 00633 // Vegetable management 00634 //========== 00635 CVegetableManager *vegetableManager= getLandscape()->_VegetableManager; 00636 00637 // Create ClipBlocks. 00638 uint nTbPerCb= NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK; 00639 uint wCB= (os + nTbPerCb-1) >> NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT; 00640 uint hCB= (ot + nTbPerCb-1) >> NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT; 00641 VegetableClipBlocks.resize(wCB * hCB); 00642 // allocate ClipBlocks 00643 for(i=0; i<VegetableClipBlocks.size(); i++) 00644 { 00645 VegetableClipBlocks[i]= vegetableManager->createClipBlock(); 00646 } 00647 00648 00649 // updateLighting management. 00650 //========== 00651 // append patch for Near updateLighting, since TessBlock lightmap may/will exist. 00652 getLandscape()->linkPatchToNearUL(this); 00653 00654 } 00655 } |
|
Definition at line 1758 of file patch_lightmap.cpp. References NL3D::bilinearColorDiv2AndAdd(), getCurrentTileTLIColors(), NL_LUMEL_BY_TILE, stride, uint, x, and y. Referenced by computeTileLightmapEdge().
01759 { 01760 // compute colors ar corners of the tile. 01761 CRGBA corners[4]; 01762 getCurrentTileTLIColors(ts, tt, corners); 01763 01764 // get coordinate according to edge. 01765 uint x=0,y=0; 01766 switch(edge) 01767 { 01768 case 0: x= 0; break; 01769 case 1: y= NL_LUMEL_BY_TILE-1; break; 01770 case 2: x= NL_LUMEL_BY_TILE-1; break; 01771 case 3: y= 0; break; 01772 }; 01773 01774 // For all lumel of the edge, bilinear. 01775 uint i; 01776 for(i=0; i<NL_LUMEL_BY_TILE; i++) 01777 { 01778 // if vertical edge 01779 if( (edge&1)==0 ) y= i; 01780 // else horizontal edge 01781 else x= i; 01782 01783 // manage inverse. 01784 uint where; 01785 if(inverse) where= (NL_LUMEL_BY_TILE-1)-i; 01786 else where= i; 01787 // compute this pixel, and modulate 01788 bilinearColorDiv2AndAdd(corners, x, y, dest[where*stride]); 01789 } 01790 } |
|
Definition at line 1793 of file patch_lightmap.cpp. References NL3D::bilinearColorDiv2AndAdd(), getCurrentTileTLIColors(), s, t, and uint. Referenced by computeTileLightmapPixel().
01794 { 01795 // compute colors ar corners of the tile. 01796 CRGBA corners[4]; 01797 getCurrentTileTLIColors(ts, tt, corners); 01798 01799 // compute this pixel, and modulate 01800 bilinearColorDiv2AndAdd(corners, s, t, *dest); 01801 } |
|
Definition at line 1739 of file patch_lightmap.cpp. References NL3D::bilinearColorDiv2AndAdd(), getCurrentTileTLIColors(), NL_LUMEL_BY_TILE, stride, uint, x, and y. Referenced by computeTileLightmap().
01740 { 01741 // compute colors ar corners of the tile. 01742 CRGBA corners[4]; 01743 getCurrentTileTLIColors(ts, tt, corners); 01744 01745 // Bilinear accross the tile, and add to dest. 01746 uint x, y; 01747 for(y=0; y<NL_LUMEL_BY_TILE; y++) 01748 { 01749 for(x=0; x<NL_LUMEL_BY_TILE; x++) 01750 { 01751 // compute this pixel, and add 01752 bilinearColorDiv2AndAdd(corners, x, y, dest[y*stride + x]); 01753 } 01754 } 01755 } |
|
called by addTrianglesInBBoxRecurs(). effective fill the array of triangles from 1 tile at tile coordinates s0,t0. depending of tessLevel (0,1,2), 2, 8 or 32 triangles are added. (2*2m, 1*1*m or 0.5*0.5m). NB: only triangles of quad included in the bbox are added. Definition at line 335 of file patch.cpp. References computeVertex(), NLMISC::CAABBox::extend(), NLMISC::CAABBox::intersect(), nlassert, NL3D::CTrianglePatch::PatchId, NLMISC::CAABBox::setCenter(), NLMISC::CUV::U, uint, uint8, NLMISC::CTriangleUV::Uv0, NLMISC::CTriangleUV::Uv1, NLMISC::CTriangleUV::Uv2, NLMISC::CUV::V, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, and NLMISC::CTriangle::V2. Referenced by addTrianglesInBBoxRecurs().
00336 { 00337 nlassert(s0<OrderS); 00338 nlassert(t0<OrderT); 00339 nlassert(tessLevel<=2); 00340 uint tessLen= 1<<tessLevel; 00341 00342 // some preca. 00343 float startS0= (float)s0 / (float)(OrderS); 00344 float startT0= (float)t0 / (float)(OrderT); 00345 float ds= 1.0f/(float)(OrderS*tessLen); 00346 float dt= 1.0f/(float)(OrderT*tessLen); 00347 00348 // Parse all quads. 00349 uint sl,tl; 00350 for(tl=0; tl<tessLen; tl++) 00351 { 00352 float fs0, fs1, ft0, ft1; 00353 // compute t patch coordinates. 00354 ft0= startT0 + (float)tl * dt ; 00355 ft1= ft0 + dt; 00356 for(sl=0; sl<tessLen; sl++) 00357 { 00358 // compute s patch coordinates. 00359 fs0= startS0 + (float)sl * ds ; 00360 fs1= fs0 + ds; 00361 00362 // Compute Quad vectors (in CCW). 00363 CVector p0, p1, p2, p3; 00364 CUV uv0, uv1, uv2, uv3; 00365 uv0.U= fs0; uv0.V= ft0; 00366 uv1.U= fs0; uv1.V= ft1; 00367 uv2.U= fs1; uv2.V= ft1; 00368 uv3.U= fs1; uv3.V= ft0; 00369 // evaluate patch (with noise). (NB: because of cache, patch decompression cost nothing). 00370 p0= computeVertex(uv0.U, uv0.V); 00371 p1= computeVertex(uv1.U, uv1.V); 00372 p2= computeVertex(uv2.U, uv2.V); 00373 p3= computeVertex(uv3.U, uv3.V); 00374 00375 // build the bbox of this quad, and test with request bbox. 00376 CAABBox quadBBox; 00377 quadBBox.setCenter(p0); 00378 quadBBox.extend(p1); 00379 quadBBox.extend(p2); 00380 quadBBox.extend(p3); 00381 00382 // insert only if intersect with the bbox. 00383 if(quadBBox.intersect(bbox)) 00384 { 00385 // build triangles (in CCW). 00386 CTrianglePatch tri; 00387 tri.PatchId= paId; 00388 00389 // first tri. 00390 tri.V0= p0; tri.V1= p1; tri.V2= p2; 00391 tri.Uv0= uv0; tri.Uv1= uv1; tri.Uv2= uv2; 00392 triangles.push_back(tri); 00393 00394 // second tri. 00395 tri.V0= p2; tri.V1= p3; tri.V2= p0; 00396 tri.Uv0= uv2; tri.Uv1= uv3; tri.Uv2= uv0; 00397 triangles.push_back(tri); 00398 00399 // NB: this is not the same tesselation than in tesselation.cpp. 00400 // But this looks like Ben's NLPACS::CLocalRetriever tesselation. 00401 } 00402 } 00403 } 00404 00405 } |
|
Add triangles to triangles array which intersect the bbox. NB: this method use a convex hull subdivion to search in O(logn) what part of the patch to insert.
Definition at line 270 of file patch.cpp. References addTrianglesInBBoxRecurs(), uint8, and unpackIntoCache(). Referenced by NL3D::CLandscape::addTrianglesInBBox().
00271 { 00272 CBezierPatch &bpatch= *unpackIntoCache(); 00273 00274 // call with the whole root patch. 00275 addTrianglesInBBoxRecurs(paId, bbox, triangles, tileTessLevel, bpatch, 0, OrderS, 0, OrderT); 00276 } |
|
recurse subdivide of the bezierPatch. 3 1st parameters are the parameter of addTrianglesInBBox(). Definition at line 280 of file patch.cpp. References addTileTrianglesInBBox(), buildBBoxFromBezierPatch(), NLMISC::CAABBox::intersect(), nlassert, NL3D::CBezierPatch::subdivideS(), NL3D::CBezierPatch::subdivideT(), uint, and uint8. Referenced by addTrianglesInBBox().
00282 { 00283 uint8 lenS=s1-s0, lenT=t1-t0; 00284 nlassert(lenS>0); 00285 nlassert(lenT>0); 00286 00287 // compute and compare bbox of the subdivision patch against request bbox. 00288 //======================== 00289 // NB: this compute includes possible noise. 00290 CAABBox paBBox; 00291 buildBBoxFromBezierPatch(pa, paBBox); 00292 // if do not intersect, stop here. 00293 if( !paBBox.intersect(bbox) ) 00294 return; 00295 // else if at tile level, then just computeTriangles. 00296 //======================== 00297 else if( lenS==1 && lenT==1 ) 00298 { 00299 addTileTrianglesInBBox(paId, bbox, triangles, tessLevel, s0, t0); 00300 } 00301 // else subdiv and reccurs. 00302 //======================== 00303 else 00304 { 00305 // Subdivide along the bigger side. 00306 if(lenS>lenT) 00307 { 00308 // subdivide. 00309 CBezierPatch left, right; 00310 pa.subdivideS(left, right); 00311 uint8 sMiddle= (uint8)( ((uint)s0+(uint)s1) /2 ); 00312 // recurs left. 00313 addTrianglesInBBoxRecurs(paId, bbox, triangles, tessLevel, left, s0, sMiddle, t0, t1); 00314 // recurs right. 00315 addTrianglesInBBoxRecurs(paId, bbox, triangles, tessLevel, right, sMiddle, s1, t0, t1); 00316 } 00317 else 00318 { 00319 // subdivide. 00320 CBezierPatch top, bottom; 00321 pa.subdivideT(top, bottom); 00322 uint8 tMiddle= (uint8)( ((uint)t0+(uint)t1) /2 ); 00323 // recurs top. 00324 addTrianglesInBBoxRecurs(paId, bbox, triangles, tessLevel, top, s0, s1, t0, tMiddle); 00325 // recurs bottom. 00326 addTrianglesInBBoxRecurs(paId, bbox, triangles, tessLevel, bottom, s0, s1, tMiddle, t1); 00327 } 00328 } 00329 00330 00331 } |
|
Definition at line 845 of file patch_render.cpp. References createFaceVectorFar0OrTile(), createFaceVectorFar1(), and updateVBAlloc(). Referenced by preRender(), and updateClipPatchVB().
00846 { 00847 updateVBAlloc(true); 00848 createFaceVectorFar1(); 00849 createFaceVectorFar0OrTile(); 00850 } |
|
Definition at line 873 of file patch_render.cpp. References createFaceVectorFar1(), NL3D::CTessBlock::FarVertexList, MasterBlock, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, updateFar1VBAlloc(), and NL3D::CTessBlock::visibleFar1(). Referenced by preRender().
00874 { 00875 if(Far1>0) 00876 { 00877 // alloc VB. 00878 updateFar1VBAlloc(MasterBlock.FarVertexList, true); 00879 for(sint i=0; i<(sint)TessBlocks.size(); i++) 00880 { 00881 CTessBlock &tblock= TessBlocks[i]; 00882 // need update VB only if tessBlock is visible. 00883 if( tblock.visibleFar1() ) 00884 updateFar1VBAlloc(tblock.FarVertexList, true); 00885 } 00886 } 00887 00888 createFaceVectorFar1(); 00889 } |
|
Definition at line 800 of file patch.cpp. References addRefTessBlocks(), NL3D::CTessList< CTessFace >::append(), appendFaceToTileRenderList(), dirtTessBlockFaceVector(), NL3D::CTessVertex::EndPos, NL3D::CTessBlock::FaceTileMaterialRefCount, NL3D::CTessBlock::FarFaceList, getNumTessBlock(), NL3D::CTessFace::Level, MasterBlock, NumRenderableFaces, NL3D::CTessVertex::StartPos, TessBlockLimitLevel, TessBlocks, uint, NL3D::CTessFace::VBase, NL3D::CTessFace::VLeft, and NL3D::CTessFace::VRight. Referenced by NL3D::CTessFace::doMerge(), makeRoots(), NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
00801 { 00802 // Update the number of renderable Faces 00803 NumRenderableFaces++; 00804 00805 // Update Gnal render. 00806 //==================== 00807 if(face->Level<TessBlockLimitLevel) 00808 { 00809 MasterBlock.FarFaceList.append(face); 00810 MasterBlock.FaceTileMaterialRefCount++; 00811 00812 // The facelist is modified, so we must update the faceVector, if visible. 00813 dirtTessBlockFaceVector(MasterBlock); 00814 } 00815 else 00816 { 00817 // Alloc if necessary the TessBlocks. 00818 addRefTessBlocks(); 00819 00820 // link the face to the good tessblock. 00821 uint numtb= getNumTessBlock(face); 00822 TessBlocks[numtb].FarFaceList.append(face); 00823 TessBlocks[numtb].FaceTileMaterialRefCount++; 00824 00825 // The facelist is modified, so we must update the faceVector, if visible. 00826 dirtTessBlockFaceVector(TessBlocks[numtb]); 00827 00828 // Must enlarge the BSphere of the tesblock!! 00829 // We must do it on a per-face approach, because of tessblocks 's corners which are outside of tessblocks. 00830 TessBlocks[numtb].extendSphereFirst(face->VBase->EndPos); 00831 TessBlocks[numtb].extendSphereAdd(face->VLeft->EndPos); 00832 TessBlocks[numtb].extendSphereAdd(face->VRight->EndPos); 00833 // I think this should be done too on StartPos, for geomorph (rare??...) problems. 00834 // \todo yoyo: is this necessary??? 00835 TessBlocks[numtb].extendSphereAdd(face->VBase->StartPos); 00836 TessBlocks[numtb].extendSphereAdd(face->VLeft->StartPos); 00837 TessBlocks[numtb].extendSphereAdd(face->VRight->StartPos); 00838 TessBlocks[numtb].extendSphereCompile(); 00839 00840 00841 // Update Tile render (no need to do it if face not at least at tessblock level). 00842 appendFaceToTileRenderList(face); 00843 } 00844 } |
|
Definition at line 884 of file patch.cpp. References NL3D::CTessList< CTileFace >::append(), NL3D::CLandscape::appendToShadowPolyReceiver(), dirtTessBlockFaceVector(), getLandscape(), getNumTessBlock(), NL3D_MAX_TILE_FACE, nlassert, NL3D::CTileMaterial::Pass, NL3D::CRdrTileId::PatchRdrPass, sint, TessBlocks, NL3D::CTileMaterial::TileFaceList, NL3D::CTessFace::TileFaces, NL3D::CTessFace::TileMaterial, and uint. Referenced by appendFaceToRenderList(), and NL3D::CTessFace::recreateTileUvs().
00885 { 00886 if(face->TileMaterial) 00887 { 00888 // For all valid faces, update their links. 00889 // Do not do this for lightmap, since it use same face from RGB0 pass. 00890 for(sint i=0;i<NL3D_MAX_TILE_FACE;i++) 00891 { 00892 CPatchRdrPass *tilePass= face->TileMaterial->Pass[i].PatchRdrPass; 00893 // If tile i enabled. 00894 if(tilePass) 00895 { 00896 // a face should have created for this pass. 00897 nlassert(face->TileFaces[i]); 00898 face->TileMaterial->TileFaceList[i].append(face->TileFaces[i]); 00899 } 00900 } 00901 00902 // The facelist is modified, so we must update the faceVector, if visible. 00903 uint numtb= getNumTessBlock(face); 00904 dirtTessBlockFaceVector(TessBlocks[numtb]); 00905 00906 // Shadow: append it to the Shadow Triangles. 00907 getLandscape()->appendToShadowPolyReceiver(face); 00908 } 00909 } |
|
Definition at line 1040 of file patch.cpp. References addRefTessBlocks(), NL3D::CTessList< CTessFarVertex >::append(), NL3D::CTessBlock::FarVertexList, FVMasterBlock, FVTessBlockEdge, getNumTessBlock(), MasterBlock, NL3D::CTessFarVertex::OwnerBlock, NL3D::CTessFarVertex::PCoord, TessBlocks, TFarVertType, type, and uint. Referenced by makeRoots(), NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
01041 { 01042 TFarVertType type; 01043 uint numtb; 01044 getNumTessBlock(fv->PCoord, type, numtb); 01045 01046 01047 if(type==FVMasterBlock || type==FVTessBlockEdge) 01048 { 01049 fv->OwnerBlock= &MasterBlock; 01050 MasterBlock.FarVertexList.append(fv); 01051 } 01052 else 01053 { 01054 // Alloc if necessary the TessBlocks. 01055 addRefTessBlocks(); 01056 01057 fv->OwnerBlock= &TessBlocks[numtb]; 01058 TessBlocks[numtb].FarVertexList.append(fv); 01059 } 01060 } |
|
Definition at line 1086 of file patch.cpp. References addRefTessBlocks(), computeTbTm(), nlassert, NL3D::CTessNearVertex::OwnerBlock, TessBlocks, NL3D::CTileMaterial::TileS, NL3D::CTileMaterial::TileT, and uint. Referenced by NL3D::CTessFace::allocTileUv().
01087 { 01088 nlassert(tileMat); 01089 01090 // Alloc if necessary the TessBlocks. 01091 addRefTessBlocks(); 01092 01093 uint numtb, numtm; 01094 computeTbTm(numtb, numtm, tileMat->TileS, tileMat->TileT); 01095 nv->OwnerBlock= &TessBlocks[numtb]; 01096 TessBlocks[numtb].NearVertexList.append(nv); 01097 } |
|
From the current tesselation of this patch, append to the list of leaves faces. Definition at line 2176 of file patch.cpp. References NL3D::CTessFace::appendTessellationLeaves(), nlassert, Son0, and Son1. Referenced by NL3D::CLandscape::getTessellationLeaves().
|
|
Append lights under the position to pointLightList. Notice that the PointLight are ensured to be actually CPointLightNamed. Definition at line 1543 of file patch_lightmap.cpp. References NL3D::CZone::_PointLightArray, NLMISC::clamp(), NL3D::CLightInfluenceInterpolator::Corners, NL3D::CPointLightNamedArray::getPointLights(), getZone(), NL3D::CLightInfluenceInterpolator::interpolate(), NL3D::CTileLightInfluence::Light, NL3D::CLightInfluenceInterpolator::CCorner::Lights, nlassert, NLMISC::OptFastFloor(), sint, TileLightInfluences, NLMISC::CUV::U, uint, NLMISC::CUV::V, w, x, and y. Referenced by NL3D::CLandscape::appendTileLightInfluences(), and generateTileVegetable().
01545 { 01546 /* 01547 WARNING !! only CPointLightNamed must be added here (used for convenience by CPatch::generateTileVegetable() ) 01548 */ 01549 01550 // Compute TLI coord for BiLinear. 01551 sint x,y; 01552 // There is (OrderS/2+1) * (OrderT/2+1) tileLightInfluences (TLI). 01553 sint w= (OrderS>>1); 01554 sint h= (OrderT>>1); 01555 sint wTLI= w+1; 01556 // fastFloor: use a precision of 256 to avoid doing OptFastFloorBegin. 01557 x= NLMISC::OptFastFloor(uv.U * (w<<8)); 01558 y= NLMISC::OptFastFloor(uv.V * (h<<8)); 01559 clamp(x, 0, w<<8); 01560 clamp(y, 0, h<<8); 01561 // compute the TLI coord, and the subCoord for bilinear. 01562 sint xTLI,yTLI, xSub, ySub; 01563 xTLI= x>>8; clamp(xTLI, 0, w-1); 01564 yTLI= y>>8; clamp(yTLI, 0, h-1); 01565 // Hence, xSub and ySub range is [0, 256]. 01566 xSub= x - (xTLI<<8); 01567 ySub= y - (yTLI<<8); 01568 01569 01570 // Use a CLightInfluenceInterpolator to biLinear light influence 01571 CLightInfluenceInterpolator interp; 01572 // Must support only 2 light per TLI. 01573 nlassert(CTileLightInfluence::NumLightPerCorner==2); 01574 nlassert(CLightInfluenceInterpolator::NumLightPerCorner==2); 01575 // Get ref on array of PointLightNamed. 01576 CPointLightNamed *zonePointLights= NULL; 01577 if( getZone()->_PointLightArray.getPointLights().size() >0 ) 01578 { 01579 // const_cast, because will only change _IdInfluence, and 01580 // also because CLightingManager will call appendLightedModel() 01581 zonePointLights= const_cast<CPointLightNamed*>(&(getZone()->_PointLightArray.getPointLights()[0])); 01582 } 01583 // For 4 corners. 01584 for(y=0;y<2;y++) 01585 { 01586 for(x=0;x<2;x++) 01587 { 01588 // get ref on TLI, and on corner. 01589 const CTileLightInfluence &tli= TileLightInfluences[ (yTLI+y)*wTLI + xTLI+x ]; 01590 CLightInfluenceInterpolator::CCorner &corner= interp.Corners[y*2 + x]; 01591 // For all lights 01592 uint lid; 01593 for(lid= 0; lid<CTileLightInfluence::NumLightPerCorner; lid++) 01594 { 01595 // get the id of the light in the zone 01596 uint tliLightId= tli.Light[lid]; 01597 // If empty id, stop 01598 if(tliLightId==0xFF) 01599 break; 01600 else 01601 { 01602 // Set pointer of the light in the corner 01603 corner.Lights[lid]= zonePointLights + tliLightId; 01604 } 01605 } 01606 // Reset Empty slots. 01607 for(; lid<CTileLightInfluence::NumLightPerCorner; lid++) 01608 { 01609 // set to NULL 01610 corner.Lights[lid]= NULL; 01611 } 01612 } 01613 } 01614 // interpolate. 01615 interp.interpolate(pointLightList, xSub/256.f, ySub/256.f); 01616 } |
|
Definition at line 955 of file patch.cpp. References addRefDLMContext(), addRefTessBlocks(), NL3D::CTileAddedInfo::Center, computeTbTm(), NL3D::CTileAddedInfo::Corners, createVegetableBlock(), NL3D::CBezierPatch::eval(), NL3D::CBezierPatch::evalNormal(), getLandscape(), NL3D::CLandscape::getTileCallback(), NL3D::CLandscape::isVegetableActive(), MasterBlock, nlassert, NL3D::CTileAddedInfo::Normal, TessBlocks, NL3D::ULandscapeTileCallback::tileAdded(), NL3D::CTileAddedInfo::TileID, NL3D::CTessBlock::TileMaterialRefCount, NL3D::CTileMaterial::TileS, NL3D::CTileMaterial::TileT, uint, uint64, and unpackIntoCache().
00956 { 00957 nlassert(tm); 00958 00959 // Alloc if necessary the TessBlocks. 00960 addRefTessBlocks(); 00961 00962 uint numtb, numtm; 00963 computeTbTm(numtb, numtm, tm->TileS, tm->TileT); 00964 TessBlocks[numtb].RdrTileRoot[numtm]= tm; 00965 TessBlocks[numtb].FaceTileMaterialRefCount++; 00966 TessBlocks[numtb].TileMaterialRefCount++; 00967 // The master block contains the whole patch TileMaterialRefCount 00968 MasterBlock.TileMaterialRefCount++; 00969 00970 // DynamicLighting. When in near, must compute the context, to have good UVs. 00971 //========== 00972 // inc ref to the context, creating it if needed. 00973 addRefDLMContext(); 00974 // NB: do it before creating the vegetableBlock, because vegetables use DLM Uvs. 00975 00976 // if was no tiles before in this tessBlock, create a Vegetable block. 00977 //========== 00978 // one Tile <=> was 0 before 00979 if( TessBlocks[numtb].TileMaterialRefCount == 1 && getLandscape()->isVegetableActive() ) 00980 { 00981 createVegetableBlock(numtb, tm->TileS, tm->TileT); 00982 } 00983 ULandscapeTileCallback *tileCallback = getLandscape()->getTileCallback(); 00984 if (tileCallback) 00985 { 00986 CBezierPatch *bpatch= unpackIntoCache(); 00987 CTileAddedInfo tai; 00988 // 00989 tai.Corners[0] = bpatch->eval((float) tm->TileS / OrderS, (float) tm->TileT / OrderT); 00990 tai.Corners[1] = bpatch->eval((tm-> TileS + 1.f) / OrderS, (float) tm->TileT / OrderT); 00991 tai.Corners[2] = bpatch->eval( (tm-> TileS + 1.f) / OrderS, (tm->TileT + 1.f) / OrderT); 00992 tai.Corners[3] = bpatch->eval( (float) tm-> TileS / OrderS, (tm->TileT + 1.f) / OrderT); 00993 tai.Center = bpatch->eval( (tm-> TileS + 0.5f) / OrderS, (tm->TileT + 0.5f) / OrderT); 00994 // 00995 tai.Normal = bpatch->evalNormal( (tm-> TileS + 0.5f) / OrderS, (tm->TileT + 0.5f) / OrderT); 00996 tai.TileID = (uint64) tm; // pointer to tile material serves as a unique identifier 00997 // 00998 tileCallback->tileAdded(tai); 00999 } 01000 } |
|
This is especially for Pacs. see CLandscape desc. Definition at line 1505 of file patch.cpp. References NL3D::CTessFace::averageTesselationVertices(), BaseVertices, computeVertex(), NL3D::CTessVertex::EndPos, nlassert, NL3D::CTessVertex::Pos, Son0, Son1, and NL3D::CTessVertex::StartPos. Referenced by NL3D::CZone::averageTesselationVertices().
01506 { 01507 nlassert(Son0); 01508 nlassert(Son1); 01509 01510 // Recompute the BaseVertices. This is usefull for Pacs. 01511 // Because CLandscape::averageTesselationVertices() is made on a strict order for patchs (map of zones, then 01512 // array of patchs), we are sure to overwrite BaseVertices in this order. 01513 CTessVertex *a= BaseVertices[0]; 01514 CTessVertex *b= BaseVertices[1]; 01515 CTessVertex *c= BaseVertices[2]; 01516 CTessVertex *d= BaseVertices[3]; 01517 // Set positions. 01518 a->Pos= a->StartPos= a->EndPos= computeVertex(0,0); 01519 b->Pos= b->StartPos= b->EndPos= computeVertex(0,1); 01520 c->Pos= c->StartPos= c->EndPos= computeVertex(1,1); 01521 d->Pos= d->StartPos= d->EndPos= computeVertex(1,0); 01522 01523 01524 // Average the tesselation of sons. 01525 Son0->averageTesselationVertices(); 01526 Son1->averageTesselationVertices(); 01527 } |
|
begin Dynamic light Process. reset texture To Black (if needed) Called by CLandscape. _DLMContext must exist Definition at line 2005 of file patch_lightmap.cpp. References _DLMContext, NL3D::CPatchDLMContext::clearLighting(), NL3D::CPatchDLMContext::CurPointLightCount, isRenderClipped(), nlassert, and NL3D::CPatchDLMContext::OldPointLightCount. Referenced by NL3D::CLandscape::computeDynamicLighting().
02006 { 02007 nlassert(_DLMContext); 02008 02009 // Must bkup prec pointLightCount in OldPointLightCount, and reset CurPointLightCount 02010 _DLMContext->OldPointLightCount= _DLMContext->CurPointLightCount; 02011 _DLMContext->CurPointLightCount= 0; 02012 02013 // clear lighting, only if patch is visible 02014 if(!isRenderClipped()) 02015 // NB: no-op if src is already full black. 02016 _DLMContext->clearLighting(); 02017 02018 } |
|
bind the patch to 4 neighbors, given in this patch edge order (0,1,2,3). Tesselation is reseted (patch unbound first). NB: this patch and his neighborood must be compiled... NB: neighbor patchs must not be NULL (but according to NPatchs). Definition at line 1847 of file patch.cpp. References _BindZoneNeighbor, BaseVertices, bind(), NL3D::CPatchUVLocator::build(), changeEdgeNeighbor(), checkFillVertexVBFar(), NL3D::CTessFace::computeSplitPoint(), computeVertex(), NL3D::CPatch::CBindInfo::Edge, NL3D::CTessVertex::EndPos, NL3D::CTessFace::FBase, NL3D::CTessFace::FLeft, NL3D::CTessFace::FRight, NL3D::CTessFace::FVBase, NL3D::CTessFace::FVLeft, NL3D::CTessFace::FVRight, getBindNeighbor(), getRootFaceForEdge(), getRootVertexForEdge(), NL3D::CTessFace::isLeaf(), linkTessFaceWithEdge(), NL3D::CPatchUVLocator::locateUV(), NL3D::CPatch::CBindInfo::Next, nlassert, NL3D::CPatch::CBindInfo::NPatchs, OrderS, OrderT, NL3D::CTessVertex::Pos, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint, Son0, Son1, NL3D::CTessFace::SonLeft, NL3D::CTessFace::SonRight, NL3D::CTessVertex::StartPos, uint, NL3D::CTessFace::updateBind(), NL3D::CTessFace::VBase, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by bind(), and NL3D::CZone::bindPatch().
01848 { 01849 // The multiple Patch Face. 01850 // By default, Patch==NULL, FLeft, FRight and FBase==NULL so ok! 01851 static CTessFace bind1_2[4]; 01852 static CTessFace bind1_4[8]; 01853 01854 01855 // THIS PATCH MUST BE UNBOUND FIRST!!!!! 01856 nlassert(Son0 && Son1); 01857 nlassert(Son0->isLeaf() && Son1->isLeaf()); 01858 nlassert(Son0->FLeft == NULL); 01859 nlassert(Son0->FRight == NULL); 01860 nlassert(Son1->FLeft == NULL); 01861 nlassert(Son1->FRight == NULL); 01862 01863 01864 // bind the Realtime bind info here (before any computeVertex, and before bind too). 01865 sint i; 01866 for(i=0;i<4;i++) 01867 { 01868 // just Copy zone (if not NULL). 01869 _BindZoneNeighbor[i]= Edges[i].Zone; 01870 } 01871 01872 01873 if(!rebind) 01874 { 01875 // Just recompute base vertices. 01876 CTessVertex *a= BaseVertices[0]; 01877 CTessVertex *b= BaseVertices[1]; 01878 CTessVertex *c= BaseVertices[2]; 01879 CTessVertex *d= BaseVertices[3]; 01880 // Set positions. 01881 a->Pos= a->StartPos= a->EndPos= computeVertex(0,0); 01882 b->Pos= b->StartPos= b->EndPos= computeVertex(0,1); 01883 c->Pos= c->StartPos= c->EndPos= computeVertex(1,1); 01884 d->Pos= d->StartPos= d->EndPos= computeVertex(1,0); 01885 // NB: no propagation problem, since the patch has root only (since has to be unbound!!!) 01886 // Recompute centers. 01887 Son0->computeSplitPoint(); 01888 Son1->computeSplitPoint(); 01889 } 01890 else 01891 { 01892 // Keep old Vertices as computed from neighbors, but reFill the 4 FarVertices. 01893 // NB: don't do it on NearVertices because suppose that Near is Off when a bind occurs (often far away). 01894 checkFillVertexVBFar(Son0->FVBase); 01895 checkFillVertexVBFar(Son0->FVLeft); 01896 checkFillVertexVBFar(Son0->FVRight); 01897 checkFillVertexVBFar(Son1->FVBase); 01898 } 01899 01900 01901 // Bind the roots. 01902 for(i=0;i<4;i++) 01903 { 01904 CBindInfo &bind= Edges[i]; 01905 01906 nlassert(bind.NPatchs==0 || bind.NPatchs==1 || bind.NPatchs==2 || bind.NPatchs==4 || bind.NPatchs==5); 01907 if(bind.NPatchs==1) 01908 { 01909 // Bind me on Next. 01910 this->changeEdgeNeighbor(i, bind.Next[0]->getRootFaceForEdge(bind.Edge[0])); 01911 // Bind Next on me. 01912 bind.Next[0]->changeEdgeNeighbor(bind.Edge[0], this->getRootFaceForEdge(i)); 01913 } 01914 else if(bind.NPatchs==2) 01915 { 01916 // Setup multiple bind. 01917 this->changeEdgeNeighbor(i, bind1_2+i); 01918 bind1_2[i].FBase= this->getRootFaceForEdge(i); 01919 // Setup the multiple face. 01920 // Follow the conventions! Make a draw for understand. Small Patchs are numbered in CCW. 01921 bind1_2[i].SonRight= bind.Next[0]->getRootFaceForEdge(bind.Edge[0]); 01922 bind1_2[i].SonLeft= bind.Next[1]->getRootFaceForEdge(bind.Edge[1]); 01923 bind1_2[i].VBase= bind.Next[0]->getRootVertexForEdge(bind.Edge[0]); 01924 // Set a "flag" to neighbors, so they know what edge is to be bind on me. 01925 bind.Next[0]->changeEdgeNeighbor(bind.Edge[0], &CTessFace::MultipleBindFace); 01926 bind.Next[1]->changeEdgeNeighbor(bind.Edge[1], &CTessFace::MultipleBindFace); 01927 } 01928 else if(bind.NPatchs==4) 01929 { 01930 // Setup multiple bind level 0. 01931 this->changeEdgeNeighbor(i, bind1_2+i); 01932 bind1_2[i].FBase= this->getRootFaceForEdge(i); 01933 01934 // Setup multiple bind level 1. 01935 // Follow the conventions! Make a draw for understand. Small Patchs are numbered in CCW. 01936 bind1_2[i].SonRight= bind1_4 + 2*i+0; 01937 bind1_2[i].SonLeft= bind1_4 + 2*i+1; 01938 bind1_2[i].VBase= bind.Next[1]->getRootVertexForEdge(bind.Edge[1]); 01939 // Make first multiple face bind level1. 01940 bind1_4[2*i+0].FBase= &CTessFace::MultipleBindFace; // to link correctly when the root face will be splitted. 01941 bind1_4[2*i+0].SonRight= bind.Next[0]->getRootFaceForEdge(bind.Edge[0]); 01942 bind1_4[2*i+0].SonLeft= bind.Next[1]->getRootFaceForEdge(bind.Edge[1]); 01943 bind1_4[2*i+0].VBase= bind.Next[0]->getRootVertexForEdge(bind.Edge[0]); 01944 // Make second multiple face bind level1. 01945 bind1_4[2*i+1].FBase= &CTessFace::MultipleBindFace; // to link correctly when the root face will be splitted. 01946 bind1_4[2*i+1].SonRight= bind.Next[2]->getRootFaceForEdge(bind.Edge[2]); 01947 bind1_4[2*i+1].SonLeft= bind.Next[3]->getRootFaceForEdge(bind.Edge[3]); 01948 bind1_4[2*i+1].VBase= bind.Next[2]->getRootVertexForEdge(bind.Edge[2]); 01949 01950 // Set a "flag" to neighbors, so they know what edge is to be bind on me. 01951 bind.Next[0]->changeEdgeNeighbor(bind.Edge[0], &CTessFace::MultipleBindFace); 01952 bind.Next[1]->changeEdgeNeighbor(bind.Edge[1], &CTessFace::MultipleBindFace); 01953 bind.Next[2]->changeEdgeNeighbor(bind.Edge[2], &CTessFace::MultipleBindFace); 01954 bind.Next[3]->changeEdgeNeighbor(bind.Edge[3], &CTessFace::MultipleBindFace); 01955 } 01956 else if(bind.NPatchs==5) 01957 { 01958 /* I am binded to a bigger patch and this one has already done the binding on me => 01959 It must be correclty tesselated. Note also that bind 1/X are only possible on interior of zone. 01960 */ 01961 01962 // First, make the link with the face to which I must connect. 01963 // ----------------- 01964 01965 // Get the coordinate of the current edge of this patch 01966 CVector2f uvi0, uvi1; 01967 switch(i) 01968 { 01969 case 0: uvi0.set(0,0); uvi1.set(0,1); break; 01970 case 1: uvi0.set(0,1); uvi1.set(1,1); break; 01971 case 2: uvi0.set(1,1); uvi1.set(1,0); break; 01972 case 3: uvi0.set(1,0); uvi1.set(0,0); break; 01973 }; 01974 // mul by OrderS/OrderT for CPatchUVLocator 01975 uvi0.x*= OrderS; 01976 uvi0.y*= OrderT; 01977 uvi1.x*= OrderS; 01978 uvi1.y*= OrderT; 01979 // build a CPatchUVLocator to transpose coorindate ot this edge in coordinate on the bigger Neighbor patch. 01980 CBindInfo bindInfo; 01981 getBindNeighbor(i, bindInfo); 01982 nlassert(bindInfo.Zone!=NULL && bindInfo.NPatchs==1); 01983 CPatchUVLocator puvloc; 01984 puvloc.build(this, i, bindInfo); 01985 01986 // transpose from this patch coord in neighbor patch coord. 01987 CVector2f uvo0, uvo1; 01988 uint pid; 01989 CPatch *patchNeighbor; 01990 // Do it for uvi0 01991 pid= puvloc.selectPatch(uvi0); 01992 puvloc.locateUV(uvi0, pid, patchNeighbor, uvo0); 01993 nlassert(patchNeighbor == bindInfo.Next[0]); 01994 // Do it for uvi1 01995 pid= puvloc.selectPatch(uvi1); 01996 puvloc.locateUV(uvi1, pid, patchNeighbor, uvo1); 01997 nlassert(patchNeighbor == bindInfo.Next[0]); 01998 // Rescale to have uv in 0,1 basis. 01999 uvo0.x/= patchNeighbor->OrderS; 02000 uvo0.y/= patchNeighbor->OrderT; 02001 uvo1.x/= patchNeighbor->OrderS; 02002 uvo1.y/= patchNeighbor->OrderT; 02003 02004 // Now, traverse the tesselation and find the first CTessFace which use this edge. 02005 CTessFace *faceNeighbor; 02006 faceNeighbor= patchNeighbor->linkTessFaceWithEdge(uvo0, uvo1, this->getRootFaceForEdge(i)); 02007 nlassert(faceNeighbor); 02008 // Bind me on Next. 02009 this->changeEdgeNeighbor(i, faceNeighbor); 02010 } 02011 02012 } 02013 02014 // Propagate the binds to sons. 02015 Son0->updateBind(); 02016 Son1->updateBind(); 02017 02018 } |
|
Build the bbox of the patch, according to ctrl points, and displacement map max value.
Definition at line 257 of file patch.cpp. References buildBBoxFromBezierPatch(), and unpackIntoCache(). Referenced by NL3D::CLandscape::addZone(), and NL3D::CZone::compile().
00258 { 00259 CBezierPatch &p= *unpackIntoCache(); 00260 00261 // Compute Bounding Box. (easiest way...) 00262 CAABBox ret; 00263 buildBBoxFromBezierPatch(p, ret); 00264 00265 return ret; 00266 } |
|
build a bbox from the convex hull of a bezier patch, enlarged with noise.
Definition at line 221 of file patch.cpp. References NL3D::CBezierPatch::Interiors, NLMISC::CVector::maxof(), NLMISC::CVector::minof(), NL3D_NOISE_MAX, NLMISC::CAABBox::setMinMax(), sint, NL3D::CBezierPatch::Tangents, and NL3D::CBezierPatch::Vertices. Referenced by addPatchBlocksInBBoxRecurs(), addTrianglesInBBoxRecurs(), and buildBBox().
00222 { 00223 // Because of the structure of CAABBox, extend() is not fast enough for us. first compute bmin, bmax, 00224 // then compute the bbox. 00225 CVector bmin= p.Vertices[0]; 00226 CVector bmax= bmin; 00227 00228 sint i; 00229 for(i=0;i<4;i++) 00230 { 00231 bmin.minof(bmin, p.Vertices[i]); 00232 bmax.maxof(bmax, p.Vertices[i]); 00233 } 00234 for(i=0;i<8;i++) 00235 { 00236 bmin.minof(bmin, p.Tangents[i]); 00237 bmax.maxof(bmax, p.Tangents[i]); 00238 } 00239 for(i=0;i<4;i++) 00240 { 00241 bmin.minof(bmin, p.Interiors[i]); 00242 bmax.maxof(bmax, p.Interiors[i]); 00243 } 00244 00245 // Modulate with the maximum displacement map (usefull for patch clipping). 00246 static CVector vectorNoiseMax(NL3D_NOISE_MAX, NL3D_NOISE_MAX, NL3D_NOISE_MAX); 00247 bmin-= vectorNoiseMax; 00248 bmax+= vectorNoiseMax; 00249 // NB: this is not very optimal, since the BBox may be very too big. eg: patch 16mx16m => bbox 18mx18m. 00250 // But remind that tessblocks do not use this BBox, and are computed with the real geometry. 00251 00252 ret.setMinMax(bmin, bmax); 00253 } |
|
Definition at line 1805 of file patch.cpp. References NL3D::CTessFace::FLeft, NL3D::CTessFace::FRight, nlassert, sint, Son0, and Son1. Referenced by bind().
01806 { 01807 nlassert(edge>=0 && edge<=3); 01808 01809 // See tessellation rules. 01810 if(OrderS>=OrderT) 01811 { 01812 switch(edge) 01813 { 01814 case 0: Son0->FRight= to; break; 01815 case 1: Son0->FLeft= to; break; 01816 case 2: Son1->FRight= to; break; 01817 case 3: Son1->FLeft= to; break; 01818 } 01819 } 01820 else 01821 { 01822 switch(edge) 01823 { 01824 case 0: Son0->FLeft= to; break; 01825 case 1: Son1->FRight= to; break; 01826 case 2: Son1->FLeft= to; break; 01827 case 3: Son0->FRight= to; break; 01828 } 01829 } 01830 } |
|
Definition at line 1502 of file patch_render.cpp. References NL3D::CTessFarVertex::Index0, NL3D::CTessFarVertex::Index1, isRenderClipped(), nlassert, NL3D::CTessFarVertex::OwnerBlock, NL3D::CTessBlock::visibleFar0(), and NL3D::CTessBlock::visibleFar1(). Referenced by NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
01503 { 01504 nlassert(pVert); 01505 // If visible, and Far0 in !Tile Mode, allocate. 01506 // NB: must test Far0>0 because vertices are reallocated in preRender() if a change of Far occurs. 01507 if(!isRenderClipped() && Far0>0 && pVert->OwnerBlock->visibleFar0() ) 01508 { 01509 pVert->Index0= CLandscapeGlobals::CurrentFar0VBAllocator->allocateVertex(); 01510 } 01511 01512 // Idem for Far1 01513 if(!isRenderClipped() && Far1>0 && pVert->OwnerBlock->visibleFar1()) 01514 { 01515 pVert->Index1= CLandscapeGlobals::CurrentFar1VBAllocator->allocateVertex(); 01516 } 01517 01518 } |
|
Definition at line 1543 of file patch_render.cpp. References NL3D::CTessNearVertex::Index, isRenderClipped(), nlassert, NL3D::CTessNearVertex::OwnerBlock, and NL3D::CTessBlock::visibleTile(). Referenced by NL3D::CTessFace::checkCreateFillTileVB().
01544 { 01545 nlassert(pVert); 01546 // If visible, and Far0 in Tile Mode, allocate. 01547 // NB: must test Far0==0 because vertices are reallocated in preRender() if a change of Far occurs. 01548 if(!isRenderClipped() && Far0==0 && pVert->OwnerBlock->visibleTile()) 01549 { 01550 pVert->Index= CLandscapeGlobals::CurrentTileVBAllocator->allocateVertex(); 01551 } 01552 } |
|
Definition at line 1571 of file patch_render.cpp. References NL3D::CTessFarVertex::Index0, NL3D::CTessFarVertex::Index1, isRenderClipped(), nlassert, NL3D::CTessFarVertex::OwnerBlock, NL3D::CTessBlock::visibleFar0(), and NL3D::CTessBlock::visibleFar1(). Referenced by NL3D::CTessFace::doMerge().
01572 { 01573 nlassert(pVert); 01574 // If visible, and Far0 in !Tile Mode, ok, the vertex exist in VB, so delete. 01575 // NB: must test Far0>0 because vertices are deleted in preRender() if a change of Far occurs. 01576 if(!isRenderClipped() && Far0>0 && pVert->OwnerBlock->visibleFar0() ) 01577 { 01578 CLandscapeGlobals::CurrentFar0VBAllocator->deleteVertex(pVert->Index0); 01579 } 01580 01581 // Idem for Far1 01582 if(!isRenderClipped() && Far1>0 && pVert->OwnerBlock->visibleFar1() ) 01583 { 01584 CLandscapeGlobals::CurrentFar1VBAllocator->deleteVertex(pVert->Index1); 01585 } 01586 } |
|
Definition at line 1589 of file patch_render.cpp. References NL3D::CTessNearVertex::Index, isRenderClipped(), nlassert, NL3D::CTessNearVertex::OwnerBlock, and NL3D::CTessBlock::visibleTile(). Referenced by NL3D::CTessFace::deleteTileUv().
01590 { 01591 nlassert(pVert); 01592 // If visible, and Far0 in Tile Mode, ok, the vertex exist in VB, so delete. 01593 // NB: must test Far0==0 because vertices are deleted in preRender() if a change of Far occurs. 01594 if(!isRenderClipped() && Far0==0 && pVert->OwnerBlock->visibleTile() ) 01595 { 01596 CLandscapeGlobals::CurrentTileVBAllocator->deleteVertex(pVert->Index); 01597 } 01598 } |
|
Definition at line 1522 of file patch_render.cpp. References fillFar0VertexVB(), fillFar1VertexVB(), isRenderClipped(), nlassert, NL3D::CTessFarVertex::OwnerBlock, NL3D::CTessBlock::visibleFar0(), and NL3D::CTessBlock::visibleFar1(). Referenced by bind(), NL3D::CTessFace::split(), NL3D::CTessFace::splitRectangular(), and NL3D::CTessFace::updateNearFarVertices().
01523 { 01524 nlassert(pVert); 01525 // If visible, and Far0 in !Tile Mode, try to fill. 01526 // NB: must test Far0>0 because vertices are reallocated in preRender() if a change of Far occurs. 01527 if(!isRenderClipped() && Far0>0 && pVert->OwnerBlock->visibleFar0()) 01528 { 01529 if( !CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs() ) 01530 fillFar0VertexVB(pVert); 01531 } 01532 01533 // Idem for Far1 01534 if(!isRenderClipped() && Far1>0 && pVert->OwnerBlock->visibleFar1()) 01535 { 01536 if( !CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs() ) 01537 fillFar1VertexVB(pVert); 01538 } 01539 } |
|
Definition at line 1556 of file patch_render.cpp. References fillTileVertexVB(), isRenderClipped(), nlassert, NL3D::CTessNearVertex::OwnerBlock, and NL3D::CTessBlock::visibleTile(). Referenced by NL3D::CTessFace::checkCreateFillTileVB(), NL3D::CTessFace::checkFillTileVB(), and NL3D::CTessFace::updateNearFarVertices().
01557 { 01558 nlassert(pVert); 01559 // If visible, and Far0 in Tile Mode, try to fill. 01560 // NB: must test Far0==0 because vertices are reallocated in preRender() if a change of Far occurs. 01561 if(!isRenderClipped()&& Far0==0 && pVert->OwnerBlock->visibleTile() ) 01562 { 01563 // try to fill. 01564 if( !CLandscapeGlobals::CurrentTileVBAllocator->reallocationOccurs() ) 01565 fillTileVertexVB(pVert); 01566 } 01567 } |
|
Definition at line 669 of file patch.cpp. References NL3D::CLandscape::_VegetableManager, deleteAllVegetableIgs(), NL3D::CVegetableManager::deleteClipBlock(), getLandscape(), TessBlockRefCount, TessBlocks, uint, NL3D::CLandscape::unlinkPatchFromNearUL(), and VegetableClipBlocks. Referenced by decRefTessBlocks(), makeRoots(), and release().
00670 { 00671 uint i; 00672 00673 // Vegetable management 00674 //========== 00675 // if compiled. 00676 if(Zone) 00677 { 00678 CVegetableManager *vegetableManager= getLandscape()->_VegetableManager; 00679 00680 // delete still existing vegetable Igs. 00681 deleteAllVegetableIgs(); 00682 00683 // delete ClipBlocks. 00684 for(i=0; i<VegetableClipBlocks.size(); i++) 00685 { 00686 vegetableManager->deleteClipBlock(VegetableClipBlocks[i]); 00687 } 00688 contReset(VegetableClipBlocks); 00689 } 00690 00691 00692 // updateLighting management. 00693 //========== 00694 if(Zone) 00695 { 00696 // remove patch from Near updateLighting, since no more TessBlock lightmap can exist. 00697 getLandscape()->unlinkPatchFromNearUL(this); 00698 } 00699 00700 00701 // Delete TessBlocks 00702 //========== 00703 TessBlockRefCount=0; 00704 contReset(TessBlocks); 00705 } |
|
compile a valid patch. (init) Call this method before any other. Zone and Control points must be valid before calling compile().
Definition at line 1283 of file patch.cpp. References _ULNearNext, _ULNearPrec, BaseVertices, computeDefaultErrorSize(), ErrorSize, NLMISC::getPowerOf2(), NL3D::CTessBlock::init(), makeRoots(), MasterBlock, min, nlassert, sint, SquareLimitLevel, TessBlockLimitLevel, TileLimitLevel, uint, uint16, uint8, and z. Referenced by NL3D::CZone::compile().
01284 { 01285 nlassert(z); 01286 Zone= z; 01287 01288 // For updateLighting, get the correct pointer now. 01289 // Init UL circular list to me 01290 _ULNearPrec= this; 01291 _ULNearNext= this; 01292 01293 01294 // Once the patch is inserted and compiled in a zone, it is ready to be rendered. 01295 // init the MasterBlock. 01296 MasterBlock.init(this); 01297 01298 // only 65536 patch per zone allowed. 01299 nlassert(patchId<0x10000); 01300 PatchId= (uint16)patchId; 01301 01302 if(errorSize==0) 01303 computeDefaultErrorSize(); 01304 else 01305 ErrorSize= errorSize; 01306 01307 nlassert(orderS==2 || orderS==4 || orderS==8 || orderS==16); 01308 nlassert(orderT==2 || orderT==4 || orderT==8 || orderT==16); 01309 nlassert (OrderS==orderS); 01310 nlassert (OrderT==orderT); 01311 01312 // Compile additional infos. 01313 sint ps= getPowerOf2(orderS) , pt= getPowerOf2(orderT); 01314 sint pmin= min(ps,pt); 01315 sint pmax= max(ps,pt); 01316 // Rectangular patch OK. 01317 // Work, since patch 1xX are illegal. => The TileLimitLevel is at least 2 level distant from the time where 01318 // the rectangular patch is said "un-rectangular-ed" (tesselation looks like square). Hence, there is no problem 01319 // with rectangular UV geomorph (well don't bother me, make a draw :) ). 01320 TileLimitLevel= pmin*2 + pmax-pmin; 01321 // A TessBlock is a 2*2 tile. This simple formula works because patch 1xX are illegal. 01322 TessBlockLimitLevel= TileLimitLevel-2; 01323 // This tell us when the tess face is "un-rectangular-ed" (to say a square). Before, it is a "rectangular" face, 01324 // which has a strange fxxxxxg split. 01325 // If patch is square, then SquareLimitLevel=0 (ok!!). 01326 SquareLimitLevel= pmax-pmin; 01327 01328 // Bind vertices, to zone base vertices. 01329 BaseVertices[0]= baseVertices[0]; 01330 BaseVertices[1]= baseVertices[1]; 01331 BaseVertices[2]= baseVertices[2]; 01332 BaseVertices[3]= baseVertices[3]; 01333 01334 // build Sons. 01335 makeRoots(); 01336 } |
|
Same as computeVertex, but special accurate version for CVisualCollisionEntity. If on a corner of the patch (0,0), (0,1) ...., take directly the BaseVertices[] result if on a border of a patch (ie s==0, s==1, t==0 or t==1), also compute the vertex of the neighbor patch (if any), and then average the result. This ensure that tesselation generated is perfectly continous, even across patchs of same or different zones. This feature is very important for CVisualCollisionEntity::snapToGround() Definition at line 1363 of file patch.cpp. References BaseVertices, NL3D::CPatchUVLocator::build(), computeVertex(), computeVertexButCorner(), NL3D::CTessVertex::EndPos, getBindNeighbor(), getOrderS(), getOrderT(), NL3D::CPatchUVLocator::locateUV(), nlassert, nlstop, s, NL3D::CPatchUVLocator::selectPatch(), sint, t, uint, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone.
01364 { 01365 // must be compiled 01366 nlassert(Zone); 01367 01368 // Test is on a edge/corner of the patch 01369 sint edgeIdS= -1; 01370 sint edgeIdT= -1; 01371 if(s==0) edgeIdS= 0; 01372 else if(s==1) edgeIdS= 2; 01373 if(t==0) edgeIdT= 3; 01374 else if(t==1) edgeIdT= 1; 01375 01376 // test if on a corner 01377 if(edgeIdS>=0 && edgeIdT>=0) 01378 { 01379 // return the baseVertex according to edge falgs 01380 if(edgeIdS==0 && edgeIdT==3) return BaseVertices[0]->EndPos; 01381 if(edgeIdS==0 && edgeIdT==1) return BaseVertices[1]->EndPos; 01382 if(edgeIdS==2 && edgeIdT==1) return BaseVertices[2]->EndPos; 01383 if(edgeIdS==2 && edgeIdT==3) return BaseVertices[3]->EndPos; 01384 nlstop; 01385 // Error, but Avoid warning 01386 return CVector::Null; 01387 } 01388 // test if on an edge 01389 else if(edgeIdS>=0 || edgeIdT>=0) 01390 { 01391 // Yes, must compute myslef 01392 CVector vertexOnMe= computeVertex(s,t); 01393 01394 // Then, must compute my neighbor. 01395 sint edgeId; 01396 if(edgeIdS>=0) 01397 edgeId= edgeIdS; 01398 else 01399 edgeId= edgeIdT; 01400 01401 // Get my neighbor, if any. 01402 CBindInfo bindInfo; 01403 getBindNeighbor(edgeId, bindInfo); 01404 // Fast reject: if no neighbor on the edge, just return my pos. 01405 if(!bindInfo.Zone) 01406 { 01407 return vertexOnMe; 01408 } 01409 // else must get vertex pos of my neighbor, and average. 01410 else 01411 { 01412 // use a CPatchUVLocator to get UV in neighbor patch 01413 CPatchUVLocator uvLocator; 01414 uvLocator.build(this, edgeId, bindInfo); 01415 01416 // UVlocator use OrderS/OrderT coordinate system. 01417 CVector2f stTileIn, stTileOut; 01418 stTileIn.x= s * getOrderS(); 01419 stTileIn.y= t * getOrderT(); 01420 01421 // transform coordinate to get into the neigbhor patch 01422 uint pid= uvLocator.selectPatch(stTileIn); 01423 CPatch *nebPatch; 01424 uvLocator.locateUV(stTileIn, pid, nebPatch, stTileOut); 01425 01426 // transform neigbhor coord in 0..1 coordinate space. 01427 stTileOut.x/= nebPatch->getOrderS(); 01428 stTileOut.y/= nebPatch->getOrderT(); 01429 01430 // and compute vertex. NB: if binded on 2 or 4 patch, it is then possible that stTileOut is on a 01431 // a corner ( (0,0), (0,1) ...). 01432 // In this case, we must use the precomputed Vertex pos, for completeness. 01433 bool onCorner; 01434 CVector vertexOnNeb= nebPatch->computeVertexButCorner(stTileOut.x, stTileOut.y, onCorner); 01435 01436 // If the neighbor is on a corner, then use its corner value. 01437 if(onCorner) 01438 return vertexOnNeb; 01439 else 01440 { 01441 // Average the 2 and return this result. 01442 vertexOnMe+= vertexOnNeb; 01443 vertexOnMe/= 2; 01444 return vertexOnMe; 01445 } 01446 } 01447 01448 } 01449 // else, std case 01450 else 01451 return computeVertex(s, t); 01452 } |
|
For CTextureFar, compute current TLI Lightmap at tile level. array should be allocated of at least sqr(NL_MAX_TILES_BY_PATCH_EDGE+1). Definition at line 1805 of file patch_lightmap.cpp. References NLMISC::CRGBA::B, NLMISC::CRGBA::G, NLMISC::CRGBA::R, uint, x, and y. Referenced by NL3D::CTextureFar::rebuildPatch().
01806 { 01807 // Size of TileLightInfluences 01808 uint wTLI= (OrderS>>1)+1; 01809 uint hTLI= (OrderT>>1)+1; 01810 // colros at corners of tiles size. 01811 uint wTC= OrderS+1; 01812 uint wTCx2= wTC*2; 01813 uint hTC= OrderT+1; 01814 uint x, y; 01815 01816 // Compute TLI colors at each corner of each TessBlocks. 01817 //============= 01818 for(y=0;y<hTLI;y++) 01819 { 01820 // store every 2 tiles corners. 01821 CRGBA *dst= array + y*2*wTC; 01822 for(x=0;x<wTLI;x++) 01823 { 01824 *dst= getCurrentTLIColor(x, y); 01825 dst->R >>= 1; 01826 dst->G >>= 1; 01827 dst->B >>= 1; 01828 // skip 2 tiles corners. 01829 dst++; 01830 dst++; 01831 } 01832 } 01833 01834 // Compute TLI colors at each corner of each Tiles. 01835 //============= 01836 01837 // Compute corner at middle of vertical TessBlock edges. 01838 for(y=0;y<hTC-1;y+=2) 01839 { 01840 CRGBA *dst= array + y*wTC; 01841 for(x=0;x<wTC;x+=2) 01842 { 01843 // Average midlle with cur and next. 01844 (dst+wTC)->avg2RGBOnly(*dst, *(dst + wTCx2) ); 01845 01846 // skip 2 tiles corners. 01847 dst++; 01848 dst++; 01849 } 01850 } 01851 01852 // Compute corner at middle of horizontal TessBlock edges, and at middle of TessBlock. 01853 for(y=0;y<hTC;y++) 01854 { 01855 CRGBA *dst= array + y*wTC; 01856 for(x=0;x<wTC-1;x+=2) 01857 { 01858 // Average midlle with cur and next. 01859 (dst+1)->avg2RGBOnly(*dst, *(dst+2)); 01860 01861 // skip 2 tiles corners. 01862 dst++; 01863 dst++; 01864 } 01865 } 01866 01867 01868 } |
|
Definition at line 206 of file patch.cpp. References ErrorSize, unpackIntoCache(), and NL3D::CBezierPatch::Vertices. Referenced by compile().
00207 { 00208 CBezierPatch &p= *unpackIntoCache(); 00209 CVector &v0= p.Vertices[0]; 00210 CVector &v1= p.Vertices[1]; 00211 CVector &v2= p.Vertices[2]; 00212 00213 // \todo yoyo: TODO_NOISE: modulate this value with tangents (roundiness of patch), and with the displacement map. 00214 ErrorSize= ((v1 - v0)^(v2 - v0)).norm(); 00215 00216 } |
|
compute the smoothed displacement for s,t ([0;OrderS], [0;OrderT]). Special case on corner. Definition at line 471 of file patch_noise.cpp. References NL3D::CPatchUVLocator::build(), NL3D::computeDisplaceBilinear(), computeDisplaceInteriorSmooth(), computeDisplaceRaw(), computeDisplaceRawOnNeighbor(), getBindNeighbor(), NL3D::CPatchUVLocator::locateUV(), nlassert, nlstop, NL3D::noiseFloor(), s, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint8, t, uint, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeNoise().
00472 { 00473 // compute the value across the corner (enjoy!!) 00474 // NB: Only corners with Edges==4 and corners on a bind are correclty supported. 00475 // ignore problems with corner which nbEdges!=4, because Blend of normals blend to 0 on corner (see computenoise()). 00476 00477 float sTile= s; 00478 float tTile= t; 00479 CBindInfo bindInfoX; 00480 CBindInfo bindInfoY; 00481 uint edgeX=0; 00482 uint edgeY=0; 00483 00484 // both must be not null 00485 nlassert( (smoothBorderX!=0) && (smoothBorderY!=0) ); 00486 00487 00488 // Get the edge against we must share displace. 00489 if(smoothBorderX==-1) edgeX=0; 00490 else if(smoothBorderX==1) edgeX=2; 00491 else nlstop; 00492 if(smoothBorderY==1) edgeY=1; 00493 else if(smoothBorderY==-1) edgeY=3; 00494 else nlstop; 00495 00496 // Build the bindInfo against those 2 edge. 00497 getBindNeighbor(edgeX, bindInfoX); 00498 getBindNeighbor(edgeY, bindInfoY); 00499 00500 // Fast reject: if no neighbor on one of the edge, just do a simple computeDisplaceInteriorSmooth. 00501 if(!bindInfoX.Zone || !bindInfoY.Zone) 00502 return computeDisplaceInteriorSmooth(s, t); 00503 else 00504 { 00505 float ret; 00506 00507 00508 // compute bi-linear weight factors. 00509 float sInc, tInc, sa, ta, sa1, ta1; 00510 computeDisplaceBilinear(sTile, tTile, sInc, tInc, sa, ta, sa1, ta1); 00511 // Manage limit case: if bilinear has not chosen the good direction (because of floor and orientation). 00512 // eg on Right edge: This case arise if sDecimal==0, so if sa==sa1==0.5f. result is that 00513 // smoothBorderX is != than sInc on right border. same reasoning with downBorder (smoothBorderY=1). 00514 00515 // NO NEED TO DO HERE, because sInc or tInc are not used at all. 00516 00517 00518 00519 // compute Neighboring info. 00520 CPatchUVLocator uvLocatorX; 00521 CPatchUVLocator uvLocatorY; 00522 uvLocatorX.build(this, edgeX, bindInfoX); 00523 uvLocatorY.build(this, edgeY, bindInfoY); 00524 00525 00526 /* NB: see floor problems note in computeDisplaceEdgeSmooth(); 00527 */ 00528 sTile= noiseFloor(sTile) + 0.5f; 00529 tTile= noiseFloor(tTile) + 0.5f; 00530 // If we were exactly on the superior edge, prec compute is false... so correct this here. 00531 if(sTile>OrderS) sTile--; 00532 if(tTile>OrderT) tTile--; 00533 00534 00535 // Bilinear across a corner. 00536 CVector2f stTileIn, stIn; 00537 CVector2f stTileOut, stOut; 00538 CPatch *patchOut; 00539 uint patchId; 00540 00541 00542 // compute contribution of our patch. 00543 ret = computeDisplaceRaw(sTile,tTile, s,t) * sa * ta; 00544 00545 // compute contribution of the patch on the left/right side. same reasoning as in computeDisplaceEdgeSmooth(); 00546 stIn.set(s, t); 00547 stTileIn.set(sTile+smoothBorderX, tTile); 00548 patchId= uvLocatorX.selectPatch(stTileIn); 00549 uvLocatorX.locateUV(stTileIn, patchId, patchOut, stTileOut); 00550 uvLocatorX.locateUV(stIn, patchId, patchOut, stOut); 00551 ret+= patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa1 * ta; 00552 00553 00554 // compute contribution of the patch on the up/down side. same reasoning as in computeDisplaceEdgeSmooth(); 00555 stIn.set(s, t); 00556 stTileIn.set(sTile, tTile+smoothBorderY); 00557 patchId= uvLocatorY.selectPatch(stTileIn); 00558 uvLocatorY.locateUV(stTileIn, patchId, patchOut, stTileOut); 00559 uvLocatorY.locateUV(stIn, patchId, patchOut, stOut); 00560 ret+= patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa * ta1; 00561 00562 00563 /* compute contribution of the patch adjacent to me. 00564 There is multiple case to consider here. Take example with corner=0 (ie smBdX=smBdY=-1): 00565 - if we are a normal corner with 4 edges, take the result from the left patch of our top patch. 00566 - if the corner is on a bind Edge, the top patch may be the bigger patch, so don't take the result 00567 from his neighbor (of course). 00568 - if we are a normal corner with N!=4 edges, just do same thing than if N==4. this is false but don't bother. 00569 00570 To solve smoothly cases 1 and 2, use computeDisplaceRawOnNeighbor(). 00571 This method, if nessecary, look on his neighbor to compute the value. 00572 */ 00573 stIn.set(s, t); 00574 stTileIn.set(sTile+smoothBorderX, tTile+smoothBorderY); 00575 // look on our "top" patch (this is arbitrary). 00576 patchId= uvLocatorY.selectPatch(stTileIn); 00577 uvLocatorY.locateUV(stTileIn, patchId, patchOut, stTileOut); 00578 uvLocatorY.locateUV(stIn, patchId, patchOut, stOut); 00579 ret+= patchOut->computeDisplaceRawOnNeighbor(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa1 * ta1; 00580 00581 00582 return ret; 00583 } 00584 00585 } |
|
compute the smoothed displacement for s,t ([0;OrderS], [0;OrderT]). Special case on edge. Definition at line 288 of file patch_noise.cpp. References NL3D::CPatchUVLocator::build(), NL3D::computeDisplaceBilinear(), computeDisplaceInteriorSmooth(), computeDisplaceRaw(), getBindNeighbor(), NL3D::CPatchUVLocator::locateUV(), nlassert, nlstop, NL3D::noiseFloor(), s, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint8, t, uint, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeNoise().
00289 { 00290 float sTile= s; 00291 float tTile= t; 00292 CBindInfo bindInfo; 00293 uint edge=0; 00294 00295 // only one must be not null 00296 nlassert( (smoothBorderX==0) != (smoothBorderY==0) ); 00297 00298 00299 // Get the edge against we must share displace. 00300 if(smoothBorderX==-1) edge=0; 00301 else if(smoothBorderY==1) edge=1; 00302 else if(smoothBorderX==1) edge=2; 00303 else if(smoothBorderY==-1) edge=3; 00304 else nlstop; 00305 00306 // Build the bindInfo against this edge. 00307 getBindNeighbor(edge, bindInfo); 00308 00309 // Fast reject: if no neighbor, just do a simple computeDisplaceInteriorSmooth. 00310 if(!bindInfo.Zone) 00311 return computeDisplaceInteriorSmooth(s, t); 00312 // else, look for result in neighborhood. 00313 else 00314 { 00315 float ret; 00316 00317 00318 // compute bi-linear weight factors. 00319 float sInc, tInc, sa, ta, sa1, ta1; 00320 computeDisplaceBilinear(sTile, tTile, sInc, tInc, sa, ta, sa1, ta1); 00321 // Manage limit case: if bilinear has not chosen the good direction (because of floor and orientation). 00322 // eg on Right edge: This case arise if sDecimal==0, so if sa==sa1==0.5f. result is that 00323 // smoothBorderX is != than sInc on right border. same reasoning with downBorder (smoothBorderY=1). 00324 00325 // NO NEED TO DO HERE, because sInc or tInc is not used if it is bad (smoothBorder? used instead). 00326 // and no need to correct sa, sa1, because in this case they are both equal to 0.5. 00327 00328 00329 // compute Neighboring info. 00330 CPatchUVLocator uvLocator; 00331 uvLocator.build(this, edge, bindInfo); 00332 00333 /* NB: there is floor problems with neighbors: 00334 - difference of orientation => uv.v=1. This point to the 1th tile. But this is not the same, if 00335 v goes to up, or goes to down. 00336 - if multiple bind, problem at limit (eg a bind 1/2 on edge 0 with OrdertT=8, when uv.v= 4). 00337 because, selection of the patch is dependent of orientation too. 00338 To avoid them, just take center of (sTile, tTile) to remove ambiguity. 00339 This works because computeDisplaceRaw() use sTile, tTile to get the noiseMap, so the decimal part is not 00340 used. 00341 00342 Notice that we do this AFTER computeDisplaceBilinear() of course. 00343 */ 00344 sTile= noiseFloor(sTile) + 0.5f; 00345 tTile= noiseFloor(tTile) + 0.5f; 00346 // If we were exactly on the superior edge, prec compute is false... so correct this here. 00347 if(sTile>OrderS) sTile--; 00348 if(tTile>OrderT) tTile--; 00349 00350 00351 // Bilinear across an edge (enjoy!!). 00352 CVector2f stTileIn, stIn; 00353 CVector2f stTileOut, stOut; 00354 CPatch *patchOut; 00355 uint patchId; 00356 00357 00358 // if vertical edge. 00359 if(smoothBorderX!=0) 00360 { 00361 // compute contribution of our patch. 00362 ret = computeDisplaceRaw(sTile,tTile, s,t) * sa * ta; 00363 ret+= computeDisplaceRaw(sTile,tTile+tInc, s,t) * sa * ta1; 00364 00365 // compute contribution of next(s) patchs. 00366 00367 // contribution of next at tTile. 00368 // Keep the same coordinate. 00369 stIn.set(s, t); 00370 // But look for the neighbor noise tile. 00371 stTileIn.set(sTile+smoothBorderX, tTile); 00372 // change basis: find the s,t on the neighbor patch. 00373 patchId= uvLocator.selectPatch(stTileIn); 00374 uvLocator.locateUV(stTileIn, patchId, patchOut, stTileOut); 00375 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00376 // Compute displace, and bi-linear on the neighbor patch. 00377 ret+= patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa1 * ta; 00378 00379 // contribution of next at tTile+tInc (same reasoning). 00380 stIn.set(s, t); 00381 stTileIn.set(sTile+smoothBorderX, tTile+tInc); 00382 patchId= uvLocator.selectPatch(stTileIn); 00383 uvLocator.locateUV(stTileIn, patchId, patchOut, stTileOut); 00384 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00385 ret+= patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa1 * ta1; 00386 00387 } 00388 // else if horizontal edge. 00389 else 00390 { 00391 // same reasoning as above. 00392 00393 // compute contribution of our patch. 00394 ret = computeDisplaceRaw(sTile, tTile, s,t) * sa * ta; 00395 ret+= computeDisplaceRaw(sTile+sInc,tTile, s,t) * sa1 * ta; 00396 00397 // compute contribution of next(s) patchs. 00398 // contribution of next at tTile. 00399 stIn.set(s, t); 00400 stTileIn.set(sTile, tTile+smoothBorderY); 00401 patchId= uvLocator.selectPatch(stTileIn); 00402 uvLocator.locateUV(stTileIn, patchId, patchOut, stTileOut); 00403 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00404 ret+= patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa * ta1; 00405 00406 // contribution of next at tTile+tInc (same reasoning). 00407 stIn.set(s, t); 00408 stTileIn.set(sTile+sInc, tTile+smoothBorderY); 00409 patchId= uvLocator.selectPatch(stTileIn); 00410 uvLocator.locateUV(stTileIn, patchId, patchOut, stTileOut); 00411 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00412 ret+= patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y) * sa1 * ta1; 00413 } 00414 00415 return ret; 00416 } 00417 00418 } |
|
compute the smoothed displacement for s,t ([0;OrderS], [0;OrderT]). Definition at line 258 of file patch_noise.cpp. References NL3D::computeDisplaceBilinear(), computeDisplaceRawCoordinates(), computeDisplaceRawInteger(), s, sint, and t. Referenced by computeDisplaceCornerSmooth(), computeDisplaceEdgeSmooth(), and computeNoise().
00259 { 00260 float sTile= s; 00261 float tTile= t; 00262 float ret; 00263 00264 // compute bi-linear weight factors. 00265 float sInc, tInc, sa, ta, sa1, ta1; 00266 computeDisplaceBilinear(sTile, tTile, sInc, tInc, sa, ta, sa1, ta1); 00267 00268 00269 // NB: to have smooth transition, must keep the same (s,t), so we do a transition with the noise tile of 00270 // our neigbhor, but under us. 00271 00272 // speed up, using just one computeDisplaceRawCoordinates(), and multiple computeDisplaceRawInteger(). 00273 sint ts,tt,ms,mt; 00274 computeDisplaceRawCoordinates(sTile, tTile, s, t, ts, tt, ms, mt); 00275 00276 sint sIncInt= (sint) sInc; 00277 sint tIncInt= (sint) tInc; 00278 ret = computeDisplaceRawInteger(ts, tt, ms,mt) * sa * ta; 00279 ret+= computeDisplaceRawInteger(ts+sIncInt, tt, ms,mt) * sa1 * ta; 00280 ret+= computeDisplaceRawInteger(ts, tt+tIncInt, ms,mt) * sa * ta1; 00281 ret+= computeDisplaceRawInteger(ts+sIncInt, tt+tIncInt, ms,mt) * sa1 * ta1; 00282 00283 return ret; 00284 } |
|
compute the displacement for s,t ([0;OrderS], [0;OrderT]) (sTile, tTile) choose what NoiseMap to use, and (s,t) choose the coordinate in the patch to compute this NoiseMap. Any rotation of the NoiseMap is included in this method. NB: s,t does not have to be clamped to ([0;OrderS], [0;OrderT]). Definition at line 219 of file patch_noise.cpp. References computeDisplaceRawCoordinates(), computeDisplaceRawInteger(), s, sint, and t. Referenced by computeDisplaceCornerSmooth(), computeDisplaceEdgeSmooth(), and computeDisplaceRawOnNeighbor().
00220 { 00221 sint ts,tt,ms,mt; 00222 computeDisplaceRawCoordinates(sTile, tTile, s, t, ts, tt, ms, mt); 00223 return computeDisplaceRawInteger(ts, tt, ms, mt); 00224 00225 } |
|
compute the smoothed displacement for s,t ([0;OrderS], [0;OrderT]). Special case on corner. Definition at line 168 of file patch_noise.cpp. References NL3D_TILE_NOISE_MAP_SIZE, NL3D_TILE_NOISE_MAP_TILE_FACTOR, NL3D::noiseFloor(), NoiseRotation, s, sint, t, NLMISC::CUV::U, NLMISC::CUV::V, and v. Referenced by computeDisplaceInteriorSmooth(), and computeDisplaceRaw().
00170 { 00171 // Choose the noiseMap. 00172 // =============================== 00173 // Compute coordinate in the patch. 00174 ts= noiseFloor(sTile); 00175 tt= noiseFloor(tTile); 00176 00177 00178 // Sample the noiseMap with (s,t). 00179 // =============================== 00180 00181 // scale the map. 00182 float u= s * NL3D_TILE_NOISE_MAP_TILE_FACTOR; 00183 float v= t * NL3D_TILE_NOISE_MAP_TILE_FACTOR; 00184 00185 // Speed rotation. 00186 CUV uv; 00187 switch(NoiseRotation & 3) 00188 { 00189 case 0: 00190 uv.U= u; 00191 uv.V= v; 00192 break; 00193 case 1: 00194 uv.U= NL3D_TILE_NOISE_MAP_SIZE-v; 00195 uv.V= u; 00196 break; 00197 case 2: 00198 uv.U= NL3D_TILE_NOISE_MAP_SIZE-u; 00199 uv.V= NL3D_TILE_NOISE_MAP_SIZE-v; 00200 break; 00201 case 3: 00202 uv.U= v; 00203 uv.V= NL3D_TILE_NOISE_MAP_SIZE-u; 00204 break; 00205 } 00206 00207 // direct map (no bilinear, no round, the case where s,t < 1/4 of a tile is very rare). 00208 ms= noiseFloor(uv.U); 00209 mt= noiseFloor(uv.V); 00210 00211 // Manage Tiling (add NL3D_TILE_NOISE_MAP_SIZE*1 should be sufficient, but take margin). 00212 ms= (ms + (NL3D_TILE_NOISE_MAP_SIZE*256)) & (NL3D_TILE_NOISE_MAP_SIZE-1); 00213 mt= (mt + (NL3D_TILE_NOISE_MAP_SIZE*256)) & (NL3D_TILE_NOISE_MAP_SIZE-1); 00214 } |
|
compute the smoothed displacement for s,t ([0;OrderS], [0;OrderT]). Special case on corner. Definition at line 136 of file patch_noise.cpp. References NLMISC::clamp(), NL3D::CZone::getLandscape(), NL3D::CTileBank::getTileNoiseMap(), getZone(), NL3D_NOISE_MAX, NL3D_TILE_NOISE_MAP_SIZE, NL3D::CTileNoiseMap::Pixels, sint, sint8, NL3D::CLandscape::TileBank, Tiles, and uint. Referenced by computeDisplaceInteriorSmooth(), and computeDisplaceRaw().
00137 { 00138 // Choose the noiseMap. 00139 // =============================== 00140 clamp(ts, 0, OrderS-1); 00141 clamp(tt, 0, OrderT-1); 00142 00143 uint tileId= tt*OrderS + ts; 00144 // Get the tile for pass0. This is the principal tile, and this one tells what noise to take. 00145 sint tileNumber= Tiles[tileId].Tile[0]; 00146 // Get the subNoise from tileElement. 00147 uint tileSubNoise= Tiles[tileId].getTileSubNoise(); 00148 00149 // retrieve the wanted noiseMap. 00150 CTileNoiseMap *noiseMap; 00151 noiseMap = getZone()->getLandscape()->TileBank.getTileNoiseMap (tileNumber, tileSubNoise); 00152 00153 if (noiseMap == NULL) 00154 return 0.0f; 00155 00156 // Sample the noiseMap with (s,t). 00157 // =============================== 00158 00159 // sample from map. 00160 sint8 pix= noiseMap->Pixels[mt*NL3D_TILE_NOISE_MAP_SIZE + ms]; 00161 00162 // normalize. 00163 return (float)pix * (NL3D_NOISE_MAX / 127.f); 00164 } |
|
usefull only for computeDisplaceCornerSmooth(). This method, if nessecary (ie sTile or tTile <0 or >Order), look on his neighbor to compute the value. Definition at line 422 of file patch_noise.cpp. References NL3D::CPatchUVLocator::build(), computeDisplaceRaw(), getBindNeighbor(), NL3D::CPatchUVLocator::locateUV(), s, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint, t, uint, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeDisplaceCornerSmooth().
00423 { 00424 sint edge= -1; 00425 00426 // look on what neighbor patch we must find the value (if any). 00427 if(sTile<0) edge=0; 00428 else if(tTile>OrderT) edge=1; 00429 else if(sTile>OrderS) edge=2; 00430 else if(tTile<0) edge=3; 00431 00432 // If the location is In the patch, just return normal value. 00433 if(edge==-1) 00434 return computeDisplaceRaw(sTile, tTile, s, t); 00435 // else must find on neighbor. 00436 else 00437 { 00438 CBindInfo bindInfo; 00439 getBindNeighbor(edge, bindInfo); 00440 00441 // Fast reject: if no neighbor on the edge, just do a simple computeDisplaceRaw() 00442 if(!bindInfo.Zone) 00443 { 00444 return computeDisplaceRaw(sTile, tTile, s, t); 00445 } 00446 // else must find on neighbor. 00447 else 00448 { 00449 CPatchUVLocator uvLocator; 00450 uvLocator.build(this, edge, bindInfo); 00451 00452 CVector2f stTileIn, stIn; 00453 CVector2f stTileOut, stOut; 00454 CPatch *patchOut; 00455 uint patchId; 00456 00457 // look on neighbor. same reasoning as in computeDisplaceEdgeSmooth(); 00458 stIn.set(s, t); 00459 stTileIn.set(sTile, tTile); 00460 patchId= uvLocator.selectPatch(stTileIn); 00461 uvLocator.locateUV(stTileIn, patchId, patchOut, stTileOut); 00462 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00463 return patchOut->computeDisplaceRaw(stTileOut.x, stTileOut.y, stOut.x, stOut.y); 00464 } 00465 00466 } 00467 } |
|
Definition at line 1329 of file patch_render.cpp. References NLMISC::CRGBA::A, NL3D::CTessList< T >::begin(), NLMISC::clamp(), NL3D::CTessFarVertex::Index1, NL3D::CTessNodeList::Next, OOTransitionSqrDelta, NL3D::CTessVertex::Pos, NL3D::CTessFarVertex::Src, TransitionSqrMin, and uint8. Referenced by computeSoftwareGeomorphAndAlpha().
01330 { 01331 // Traverse the vertList. 01332 CTessFarVertex *pVert; 01333 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01334 { 01335 static uint8 *CurVBPtr; 01336 // Compute/build the new vertex. 01337 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar1VBInfo.VertexCoordPointer; 01338 CurVBPtr+= pVert->Index1 * CLandscapeGlobals::CurrentFar1VBInfo.VertexSize; 01339 01340 // NB: the filling order of data is important, for AGP write combiners. 01341 01342 // Set Geomorphed Position. Set it local to the current center of landscape 01343 *(CVector*)CurVBPtr= pVert->Src->Pos - CLandscapeGlobals::PZBModelPosition; 01344 01345 // Set Alpha color. 01346 static CRGBA col(255,255,255,255); 01347 // For Far1, use alpha fro transition. 01348 // Prefer Use Pos, because of caching. So little difference between Soft and VertexProgram mode. 01349 float f= (pVert->Src->Pos - CLandscapeGlobals::RefineCenter).sqrnorm(); 01350 f= (f-TransitionSqrMin) * OOTransitionSqrDelta; 01351 clamp(f,0,1); 01352 col.A= (uint8)(f*255); 01353 *(CRGBA*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.ColorOff)= col; 01354 } 01355 } |
|
Definition at line 1311 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessFarVertex::Index0, NL3D::CTessNodeList::Next, NL3D::CTessVertex::Pos, NL3D::CTessFarVertex::Src, and uint8. Referenced by computeSoftwareGeomorphAndAlpha().
01312 { 01313 // Traverse the vertList. 01314 CTessFarVertex *pVert; 01315 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01316 { 01317 static uint8 *CurVBPtr; 01318 // Compute/build the new vertex. 01319 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar0VBInfo.VertexCoordPointer; 01320 CurVBPtr+= pVert->Index0 * CLandscapeGlobals::CurrentFar0VBInfo.VertexSize; 01321 01322 // Set Geomorphed Position. Set it local to the current center of landscape 01323 *(CVector*)CurVBPtr= pVert->Src->Pos - CLandscapeGlobals::PZBModelPosition; 01324 } 01325 } |
|
Definition at line 1359 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessNearVertex::Index, NL3D::CTessNodeList::Next, NL3D::CTessVertex::Pos, NL3D::CTessNearVertex::Src, and uint8. Referenced by computeSoftwareGeomorphAndAlpha().
01360 { 01361 // Traverse the vertList. 01362 CTessNearVertex *pVert; 01363 for(pVert= vertList.begin(); pVert; pVert= (CTessNearVertex*)pVert->Next) 01364 { 01365 static uint8 *CurVBPtr; 01366 // Compute/build the new vertex. 01367 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentTileVBInfo.VertexCoordPointer; 01368 CurVBPtr+= pVert->Index * CLandscapeGlobals::CurrentTileVBInfo.VertexSize; 01369 01370 // Set Geomorphed Position. Set it local to the current center of landscape 01371 *(CVector*)CurVBPtr= pVert->Src->Pos - CLandscapeGlobals::PZBModelPosition; 01372 } 01373 } |
|
Definition at line 1298 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessVertex::computeGeomPos(), NL3D::CTessNodeList::Next, and NL3D::CTessFarVertex::Src. Referenced by computeSoftwareGeomorphAndAlpha().
01299 { 01300 // Traverse the vertList. 01301 CTessFarVertex *pVert; 01302 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01303 { 01304 // compute geomorph. 01305 pVert->Src->computeGeomPos(); 01306 } 01307 } |
|
Definition at line 864 of file patch_lightmap.cpp. References NL3D::CPatchUVLocator::build(), computeTileLightmap(), computeTileLightmapEdge(), computeTileLightmapPixel(), computeTileLightmapPixelAroundCorner(), NL3D::CPatch::CBindInfo::Edge, getBindNeighbor(), getCornerSmoothFlag(), getSmoothFlag(), NL3D::CPatchUVLocator::locateUV(), NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE_SHIFT, NL_TILE_LIGHTMAP_SIZE, nlassert, NL3D::CPatchUVLocator::sameEdgeOrder(), NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint, src, stride, uint, v, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by getTileLightMap(), and updateTessBlockLighting().
00865 { 00866 sint ts= uts; 00867 sint tt= utt; 00868 00869 // hardcoded for 10x10. 00870 nlassert(NL_TILE_LIGHTMAP_SIZE==10); 00871 CRGBA *dest; 00872 uint edge; 00873 uint corner; 00874 00875 // Compute center of the TessBlock: the 2x2 tiles. 00876 //================= 00877 // compute tile 0,0 of the tessBlock. must decal of 1 pixel. 00878 dest= lightText+NL_TILE_LIGHTMAP_SIZE+1; 00879 computeTileLightmap(ts, tt, dest, NL_TILE_LIGHTMAP_SIZE); 00880 // compute tile 1,0 of the tessBlock. must decal of 1 pixel. 00881 dest= lightText + NL_LUMEL_BY_TILE + NL_TILE_LIGHTMAP_SIZE+1 ; 00882 computeTileLightmap(ts+1, tt, dest, NL_TILE_LIGHTMAP_SIZE); 00883 // compute tile 0,1 of the tessBlock. must decal of 1 pixel. 00884 dest= lightText + NL_LUMEL_BY_TILE*NL_TILE_LIGHTMAP_SIZE + NL_TILE_LIGHTMAP_SIZE+1 ; 00885 computeTileLightmap(ts, tt+1, dest, NL_TILE_LIGHTMAP_SIZE); 00886 // compute tile 1,1 of the tessBlock. must decal of 1 pixel. 00887 dest= lightText + NL_LUMEL_BY_TILE*NL_TILE_LIGHTMAP_SIZE + NL_LUMEL_BY_TILE + NL_TILE_LIGHTMAP_SIZE+1 ; 00888 computeTileLightmap(ts+1, tt+1, dest, NL_TILE_LIGHTMAP_SIZE); 00889 00890 00891 // Compute edges of the TessBlock. 00892 //================= 00893 bool edgeBorder[4]; 00894 // where are we on a border of a patch?? 00895 edgeBorder[0]= ( ts==0 ); 00896 edgeBorder[1]= ( tt == OrderT-2 ); 00897 edgeBorder[2]= ( ts == OrderS-2 ); 00898 edgeBorder[3]= ( tt==0 ); 00899 00900 // For all edges. 00901 for(edge=0; edge<4; edge++) 00902 { 00903 // compute dest info. 00904 //============== 00905 // Are we on a vertical edge or horizontal edge?? 00906 uint stride= (edge&1)==0? NL_TILE_LIGHTMAP_SIZE : 1; 00907 00908 // must compute on which tile we must find info. 00909 sint decalS=0; 00910 sint decalT=0; 00911 // and must compute ptr, where we store the result of the edge. 00912 switch(edge) 00913 { 00914 case 0: decalS=-1; dest= lightText + 0 + NL_TILE_LIGHTMAP_SIZE; break; 00915 case 1: decalT= 2; dest= lightText + 1 + (NL_TILE_LIGHTMAP_SIZE-1)*NL_TILE_LIGHTMAP_SIZE; break; 00916 case 2: decalS= 2; dest= lightText + (NL_TILE_LIGHTMAP_SIZE-1) + NL_TILE_LIGHTMAP_SIZE; break; 00917 case 3: decalT=-1; dest= lightText + 1; break; 00918 }; 00919 00920 // compute the second tile dest info. 00921 CRGBA *dest2; 00922 sint decalS2; 00923 sint decalT2; 00924 // if vertical edge. 00925 if((edge&1)==0) 00926 { 00927 // Next Y tile. 00928 dest2= dest + NL_LUMEL_BY_TILE*NL_TILE_LIGHTMAP_SIZE; 00929 decalS2= decalS; 00930 decalT2= decalT+1; 00931 } 00932 else 00933 { 00934 // Next X tile. 00935 dest2= dest + NL_LUMEL_BY_TILE; 00936 decalS2= decalS+1; 00937 decalT2= decalT; 00938 } 00939 00940 00941 // If we are not on a border of a patch, just compute on the interior of the patch. 00942 //============== 00943 if(!edgeBorder[edge]) 00944 { 00945 // find the result on the mirrored border of us. First tile. 00946 computeTileLightmapEdge(ts+decalS, tt+decalT, (edge+2)&3, dest, stride, false); 00947 00948 // find the result on the mirrored border of us. Second Tile. 00949 computeTileLightmapEdge(ts+decalS2, tt+decalT2, (edge+2)&3, dest2, stride, false); 00950 00951 } 00952 // else, slightly complicated, must find the result on neighbor patch(s). 00953 //============== 00954 else 00955 { 00956 CPatchUVLocator uvLocator; 00957 CBindInfo bindInfo; 00958 bindInfo.Zone= NULL; 00959 00960 // if smoothed edge, search the neighbor. 00961 if(getSmoothFlag(edge)) 00962 { 00963 // Build the bindInfo against this edge. 00964 getBindNeighbor(edge, bindInfo); 00965 00966 // if ok, build the uv info against this edge. 00967 if(bindInfo.Zone) 00968 { 00969 uvLocator.build(this, edge, bindInfo); 00970 // if there is not same tile order across the edge, invalidate the smooth. 00971 // This is rare, so don't bother. 00972 if(!uvLocator.sameEdgeOrder()) 00973 bindInfo.Zone= NULL; 00974 } 00975 } 00976 00977 00978 // Fast reject: if no neighbor, or if not smoothed, or if edge order pb, just copy from my interior. 00979 if(!bindInfo.Zone) 00980 { 00981 CRGBA *src=0; 00982 switch(edge) 00983 { 00984 case 0: src= dest + 1; break; 00985 case 1: src= dest - NL_TILE_LIGHTMAP_SIZE; break; 00986 case 2: src= dest - 1; break; 00987 case 3: src= dest + NL_TILE_LIGHTMAP_SIZE; break; 00988 }; 00989 00990 // fill the NL_LUMEL_BY_TILE*2 (8) pixels. 00991 for(uint n=NL_LUMEL_BY_TILE*2; n>0; n--, src+=stride, dest+=stride) 00992 *dest= *src; 00993 } 00994 // else, ok, get from neighbor. 00995 else 00996 { 00997 CVector2f stIn, stOut; 00998 CPatch *patchOut; 00999 uint patchId; 01000 uint edgeOut; 01001 bool inverse; 01002 01003 // First Tile. 01004 //========= 01005 // to remove floor pbs, take the center of the wanted tile. 01006 stIn.set(ts+decalS + 0.5f, tt+decalT + 0.5f); 01007 patchId= uvLocator.selectPatch(stIn); 01008 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 01009 // must find what edge on neighbor to compute, and if we must inverse (swap) result. 01010 // easy: the edge of the tile is the edge of the patch where we are binded. 01011 edgeOut= bindInfo.Edge[patchId]; 01012 // edge0 is oriented in T increasing order. edge1 is oriented in S increasing order. 01013 // edge2 is oriented in T decreasing order. edge3 is oriented in S decreasing order. 01014 // inverse is true if same sens on both edges (because of mirroring, sens should be different). 01015 inverse= (edge>>1)==(edgeOut>>1); 01016 // compute the lightmap on the edge of the neighbor. 01017 patchOut->computeTileLightmapEdge((sint)floor(stOut.x), (sint)floor(stOut.y), edgeOut, dest, stride, inverse); 01018 01019 // Second Tile. 01020 //========= 01021 // same reasoning. 01022 stIn.set(ts+decalS2 + 0.5f, tt+decalT2 + 0.5f); 01023 patchId= uvLocator.selectPatch(stIn); 01024 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 01025 edgeOut= bindInfo.Edge[patchId]; 01026 inverse= (edge>>1)==(edgeOut>>1); 01027 patchOut->computeTileLightmapEdge((sint)floor(stOut.x), (sint)floor(stOut.y), edgeOut, dest2, stride, inverse); 01028 } 01029 01030 } 01031 } 01032 01033 01034 // Compute corners of the TessBlock. 01035 //================= 01036 bool cornerOnPatchEdge[4]; 01037 bool cornerOnPatchCorner[4]; 01038 // where are we on a edge border of a patch?? 01039 cornerOnPatchEdge[0]= edgeBorder[3] != edgeBorder[0]; 01040 cornerOnPatchEdge[1]= edgeBorder[0] != edgeBorder[1]; 01041 cornerOnPatchEdge[2]= edgeBorder[1] != edgeBorder[2]; 01042 cornerOnPatchEdge[3]= edgeBorder[2] != edgeBorder[3]; 01043 // where are we on a corner border of a patch?? 01044 cornerOnPatchCorner[0]= edgeBorder[3] && edgeBorder[0]; 01045 cornerOnPatchCorner[1]= edgeBorder[0] && edgeBorder[1]; 01046 cornerOnPatchCorner[2]= edgeBorder[1] && edgeBorder[2]; 01047 cornerOnPatchCorner[3]= edgeBorder[2] && edgeBorder[3]; 01048 01049 // For all corners. 01050 for(corner=0; corner<4; corner++) 01051 { 01052 // compute dest info. 01053 //============== 01054 // must compute on which tile we must find info. 01055 sint decalS=0; 01056 sint decalT=0; 01057 // and must compute ptr, where we store the result of the corner. 01058 switch(corner) 01059 { 01060 case 0: decalS=-1; decalT=-1; dest= lightText + 0 + 0; break; 01061 case 1: decalS=-1; decalT= 2; dest= lightText + 0 + (NL_TILE_LIGHTMAP_SIZE-1)*NL_TILE_LIGHTMAP_SIZE; break; 01062 case 2: decalS= 2; decalT= 2; dest= lightText + (NL_TILE_LIGHTMAP_SIZE-1) + (NL_TILE_LIGHTMAP_SIZE-1)*NL_TILE_LIGHTMAP_SIZE; break; 01063 case 3: decalS= 2; decalT=-1; dest= lightText + (NL_TILE_LIGHTMAP_SIZE-1) + 0; break; 01064 }; 01065 01066 01067 // If we are not on a border of a patch, just compute on the interior of the patch. 01068 //============== 01069 // if the corner is IN the patch. 01070 if(!cornerOnPatchCorner[corner] && !cornerOnPatchEdge[corner]) 01071 { 01072 // what pixel to read. 01073 uint subS, subT; 01074 if(decalS==-1) subS= NL_LUMEL_BY_TILE-1; 01075 else subS= 0; 01076 if(decalT==-1) subT= NL_LUMEL_BY_TILE-1; 01077 else subT= 0; 01078 01079 // find the result on the corner of the neighbor tile. 01080 computeTileLightmapPixel(ts+decalS, tt+decalT, subS, subT, dest); 01081 } 01082 else 01083 { 01084 // By default, fill the corner with our interior corner. Because other methods may fail. 01085 CRGBA *src=0; 01086 switch(corner) 01087 { 01088 case 0: src= dest + 1 + NL_TILE_LIGHTMAP_SIZE; break; 01089 case 1: src= dest + 1 - NL_TILE_LIGHTMAP_SIZE; break; 01090 case 2: src= dest - 1 - NL_TILE_LIGHTMAP_SIZE; break; 01091 case 3: src= dest - 1 + NL_TILE_LIGHTMAP_SIZE; break; 01092 }; 01093 01094 // fill the pixel. 01095 *dest= *src; 01096 01097 // get the coordinate of the corner, in our [0,Order] basis. get it at the center of the pixel. 01098 CBindInfo bindInfo; 01099 CPatchUVLocator uvLocator; 01100 CVector2f stIn, stOut; 01101 CPatch *patchOut; 01102 uint patchId; 01103 float decX, decY; 01104 static const float lumelSize= 1.f/NL_LUMEL_BY_TILE; 01105 static const float semiLumelSize= 0.5f*lumelSize; 01106 01107 if(decalS==-1) decX= - semiLumelSize; 01108 else decX= 2+ semiLumelSize; 01109 if(decalT==-1) decY= - semiLumelSize; 01110 else decY= 2+ semiLumelSize; 01111 stIn.set( ts+decX, tt+decY); 01112 01113 01114 // if the corner is on One edge only of the patch. 01115 if(cornerOnPatchEdge[corner]) 01116 { 01117 // find the edge where to read this corner: hard edge after or before this corner. 01118 if(edgeBorder[corner]) edge= corner; 01119 else edge= (corner+4-1) & 3; 01120 01121 // if this edge is smoothed, find on neighbor. 01122 if(getSmoothFlag(edge)) 01123 { 01124 // retrieve neigbhor info. 01125 getBindNeighbor(edge, bindInfo); 01126 01127 // if neighbor present. 01128 if(bindInfo.Zone) 01129 { 01130 // Ok, search uv on this patch. 01131 uvLocator.build(this, edge, bindInfo); 01132 patchId= uvLocator.selectPatch(stIn); 01133 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 01134 01135 // Get the Uv, in [0,Order?*NL_LUMEL_BY_TILE] basis (ie lumel basis), and get from neighbor patch 01136 sint u, v; 01137 u= (sint)floor(stOut.x*NL_LUMEL_BY_TILE); 01138 v= (sint)floor(stOut.y*NL_LUMEL_BY_TILE); 01139 patchOut->computeTileLightmapPixel(u>>NL_LUMEL_BY_TILE_SHIFT, v>>NL_LUMEL_BY_TILE_SHIFT, u&(NL_LUMEL_BY_TILE-1), v&(NL_LUMEL_BY_TILE-1), dest); 01140 } 01141 } 01142 // else we must still smooth with our lumel on this patch, so get it from neighbor on edge. 01143 else 01144 { 01145 // first, clamp to our patch (recenter on the previous pixel) 01146 if(stIn.x<0) stIn.x+= lumelSize; 01147 else if(stIn.x>OrderS) stIn.x-= lumelSize; 01148 else if(stIn.y<0) stIn.y+= lumelSize; 01149 else if(stIn.y>OrderT) stIn.y-= lumelSize; 01150 01151 // Get the Uv, in [0,Order?*NL_LUMEL_BY_TILE] basis (ie lumel basis), and get from this patch 01152 sint u, v; 01153 u= (sint)floor(stIn.x*NL_LUMEL_BY_TILE); 01154 v= (sint)floor(stIn.y*NL_LUMEL_BY_TILE); 01155 computeTileLightmapPixel(u>>NL_LUMEL_BY_TILE_SHIFT, v>>NL_LUMEL_BY_TILE_SHIFT, u&(NL_LUMEL_BY_TILE-1), v&(NL_LUMEL_BY_TILE-1), dest); 01156 } 01157 } 01158 // else it is on a corner of the patch. 01159 else 01160 { 01161 // if the corner of the patch (same as tile corner) is smoothed, find on neighbor 01162 if(getCornerSmoothFlag(corner)) 01163 { 01164 // retrieve neigbhor info. NB: use edgeId=corner, (corner X is the start of the edge X)it works. 01165 getBindNeighbor(corner, bindInfo); 01166 01167 // if neighbor present. 01168 if(bindInfo.Zone) 01169 { 01170 // Ok, search uv on this patch. 01171 uvLocator.build(this, corner, bindInfo); 01172 patchId= uvLocator.selectPatch(stIn); 01173 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 01174 01175 // same reasoning as in computeDisplaceCornerSmooth(), must find the pixel on the neighbor 01176 // of our neighbor. But the current corner may be a corner on a bind X/1. All is managed by doing 01177 // this way. 01178 patchOut->computeTileLightmapPixelAroundCorner(stOut, dest, true); 01179 } 01180 } 01181 } 01182 } 01183 01184 } 01185 01186 01187 } |
|
Definition at line 54 of file patch_render.cpp. References _PatchRdrPassFar0, _PatchRdrPassFar1, NLMISC::CBSphere::Center, Far0UBias, Far0UScale, Far0VBias, Far0VScale, Far1UBias, Far1UScale, Far1VBias, Far1VScale, NL3D::CLandscape::freeFarRenderPass(), NL3D::CLandscape::getFarRenderPass(), NL3D::CZone::Landscape, NL_PATCH_FAR0_ROTATED, NL_PATCH_FAR1_ROTATED, nlassert, nlstop, OOTransitionSqrDelta, r, NLMISC::CBSphere::Radius, sint, NLMISC::sqr(), TransitionSqrMin, and uint8. Referenced by preRender(), and updateTextureFarOnly().
00055 { 00056 // Classify the patch. 00057 //======================== 00058 float r= (CLandscapeGlobals::RefineCenter-patchSphere.Center).norm() - patchSphere.Radius; 00059 float rr=0.0; 00060 if(r<CLandscapeGlobals::TileDistNear) 00061 rr= r-CLandscapeGlobals::TileDistNear, newFar0= 0; 00062 else if(r<CLandscapeGlobals::Far0Dist) 00063 rr= r-CLandscapeGlobals::Far0Dist, newFar0= 1; 00064 else if(r<CLandscapeGlobals::Far1Dist) 00065 rr= r-CLandscapeGlobals::Far1Dist, newFar0= 2; 00066 else 00067 newFar0= 3; 00068 // Transition with the next level. 00069 newFar1=0; 00070 if(newFar0<3 && rr>-(CLandscapeGlobals::FarTransition+2*patchSphere.Radius)) 00071 { 00072 newFar1= newFar0+1; 00073 } 00074 00075 00076 // Update Texture Info. 00077 //======================== 00078 if(newFar0!=Far0 || newFar1!=Far1) 00079 { 00080 // Backup old pass0 00081 CPatchRdrPass *oldPass0=_PatchRdrPassFar0; 00082 CPatchRdrPass *oldPass1=_PatchRdrPassFar1; 00083 00084 // Checks 00085 if (oldPass0==NULL) 00086 nlassert (Far0<=0); 00087 if (oldPass1==NULL) 00088 nlassert (Far1<=0); 00089 00090 float oldFar0UScale=Far0UScale; 00091 float oldFar0VScale=Far0VScale; 00092 float oldFar0UBias=Far0UBias; 00093 float oldFar0VBias=Far0VBias; 00094 uint8 oldFlags=Flags; 00095 00096 00097 // Don't delete the pass0 if the new newFar1 will use it 00098 if ((newFar1==Far0)&&(Far0>0)) 00099 _PatchRdrPassFar0=NULL; 00100 00101 // Don't delete the pass1 if the new newFar0 will use it 00102 if ((newFar0==Far1)&&(Far1>0)) 00103 _PatchRdrPassFar1=NULL; 00104 00105 // Pass0 have changed ? 00106 if (newFar0!=Far0) 00107 { 00108 // Compute / get the texture Far. 00109 if(newFar0>0) 00110 { 00111 // Free the old pass, don't used any more 00112 if (_PatchRdrPassFar0) 00113 Zone->Landscape->freeFarRenderPass (this, _PatchRdrPassFar0, Far0); 00114 00115 // Can we use the old pass1 ? 00116 if (newFar0==Far1) 00117 { 00118 // Yes, recycle it! 00119 _PatchRdrPassFar0=oldPass1; 00120 00121 // Copy uv coordinates 00122 Far0UScale=Far1UScale; 00123 Far0VScale=Far1VScale; 00124 Far0UBias=Far1UBias; 00125 Far0VBias=Far1VBias; 00126 00127 // Copy rotation flag 00128 Flags&=~NL_PATCH_FAR0_ROTATED; // erase it 00129 if (Flags&NL_PATCH_FAR1_ROTATED) 00130 Flags|=NL_PATCH_FAR0_ROTATED; // copy it 00131 } 00132 else // get a new render pass 00133 { 00134 // Rotation boolean 00135 bool bRot; 00136 _PatchRdrPassFar0=Zone->Landscape->getFarRenderPass(this, newFar0, Far0UScale, Far0VScale, Far0UBias, Far0VBias, bRot); 00137 00138 // Flags is set if the far texture is rotated of 90deg to the left 00139 if (bRot) 00140 Flags|=NL_PATCH_FAR0_ROTATED; 00141 else 00142 Flags&=~NL_PATCH_FAR0_ROTATED; 00143 } 00144 } 00145 else // no more far pass0 00146 { 00147 if (_PatchRdrPassFar0) 00148 { 00149 Zone->Landscape->freeFarRenderPass (this, _PatchRdrPassFar0, Far0); 00150 _PatchRdrPassFar0=NULL; 00151 } 00152 } 00153 } 00154 00155 // Pass1 have changed ? 00156 if (newFar1!=Far1) 00157 { 00158 // Now let's go with pass1 00159 if(newFar1>0) 00160 { 00161 // Delete the pass1 if not used any more 00162 if (_PatchRdrPassFar1) 00163 Zone->Landscape->freeFarRenderPass (this, _PatchRdrPassFar1, Far1); 00164 00165 // Can we use the old pass1 ? 00166 if (newFar1==Far0) 00167 { 00168 // Yes, recycle it! 00169 _PatchRdrPassFar1= oldPass0; 00170 nlassert (_PatchRdrPassFar1); 00171 00172 // Copy uv coordinates 00173 Far1UScale=oldFar0UScale; 00174 Far1VScale=oldFar0VScale; 00175 Far1UBias=oldFar0UBias; 00176 Far1VBias=oldFar0VBias; 00177 00178 // Copy rotation flag 00179 Flags&=~NL_PATCH_FAR1_ROTATED; // erase it 00180 if (oldFlags&NL_PATCH_FAR0_ROTATED) 00181 Flags|=NL_PATCH_FAR1_ROTATED; // copy it 00182 } 00183 else // get a new render pass 00184 { 00185 // Rotation boolean 00186 bool bRot; 00187 _PatchRdrPassFar1=Zone->Landscape->getFarRenderPass(this, newFar1, Far1UScale, Far1VScale, Far1UBias, Far1VBias, bRot); 00188 nlassert (_PatchRdrPassFar1); 00189 00190 // Flags is set if the far texture is rotated of 90deg to the left 00191 if (bRot) 00192 Flags|=NL_PATCH_FAR1_ROTATED; 00193 else 00194 Flags&=~NL_PATCH_FAR1_ROTATED; 00195 } 00196 00197 // Compute info for transition. 00198 float farDist; 00199 switch(newFar1) 00200 { 00201 case 1: farDist= CLandscapeGlobals::TileDistNear; break; 00202 case 2: farDist= CLandscapeGlobals::Far0Dist; break; 00203 case 3: farDist= CLandscapeGlobals::Far1Dist; break; 00204 default: nlstop; 00205 }; 00206 TransitionSqrMin= sqr(farDist-CLandscapeGlobals::FarTransition); 00207 OOTransitionSqrDelta= 1.0f/(sqr(farDist)-TransitionSqrMin); 00208 } 00209 else // no more far pass1 00210 { 00211 if (_PatchRdrPassFar1) 00212 { 00213 Zone->Landscape->freeFarRenderPass (this, _PatchRdrPassFar1, Far1); 00214 _PatchRdrPassFar1=NULL; 00215 } 00216 } 00217 } 00218 00219 } 00220 00221 // Don't copy Far0 and Far1. 00222 } |
|
compute the Final displacement for s,t ([0;1], [0;1]). This is the top call. displace.norm() should be <= NL3D_NOISE_MAX. Definition at line 874 of file patch_noise.cpp. References computeDisplaceCornerSmooth(), computeDisplaceEdgeSmooth(), computeDisplaceInteriorSmooth(), computeNormalCornerSmooth(), computeNormalEdgeSmooth(), NL3D::CBezierPatch::evalNormal(), s, sint8, t, and unpackIntoCache(). Referenced by computeVertex().
00875 { 00876 float so= s*OrderS; 00877 float to= t*OrderT; 00878 00879 00880 // Pre-Compute Border Smothing. 00881 //========================= 00882 // If we are on a border, flag it. 00883 sint8 smoothNormalBorderX= 0; 00884 sint8 smoothNormalBorderY= 0; 00885 // NB: because OrderS and OrderT >=2, smoothNormalBorderX=-1 and smoothNormalBorderX=1 are exclusive (as smoothNormalBorderY). 00886 if(so < 1) smoothNormalBorderX= -1; 00887 else if(so > OrderS-1) smoothNormalBorderX= 1; 00888 if(to < 1) smoothNormalBorderY= -1; 00889 else if(to > OrderT-1) smoothNormalBorderY= 1; 00890 00891 bool smoothNormalEdge= (smoothNormalBorderX!=0) != (smoothNormalBorderY!=0); 00892 bool smoothNormalCorner= (smoothNormalBorderX!=0) && (smoothNormalBorderY!=0); 00893 00894 00895 // Do same thing, but to know if we must compute a displace on an interior, on an edge or on a corner. 00896 sint8 smoothDisplaceBorderX= 0; 00897 sint8 smoothDisplaceBorderY= 0; 00898 // NB: because OrderS and OrderT >=2, smoothBorderX=-1 and smoothBorderX=1 are exclusive (as smoothBorderY). 00899 if(so < 0.5) smoothDisplaceBorderX= -1; 00900 else if(so > OrderS-0.5) smoothDisplaceBorderX= 1; 00901 if(to < 0.5) smoothDisplaceBorderY= -1; 00902 else if(to > OrderT-0.5) smoothDisplaceBorderY= 1; 00903 00904 bool smoothDisplaceEdge= (smoothDisplaceBorderX!=0) != (smoothDisplaceBorderY!=0); 00905 bool smoothDisplaceCorner= (smoothDisplaceBorderX!=0) && (smoothDisplaceBorderY!=0); 00906 00907 00908 // Compute Displace value. 00909 //========================= 00910 float displaceValue; 00911 00912 if(smoothDisplaceCorner) 00913 displaceValue= computeDisplaceCornerSmooth(so, to, smoothDisplaceBorderX, smoothDisplaceBorderY); 00914 else if(smoothDisplaceEdge) 00915 displaceValue= computeDisplaceEdgeSmooth(so, to, smoothDisplaceBorderX, smoothDisplaceBorderY); 00916 else 00917 displaceValue= computeDisplaceInteriorSmooth(so, to); 00918 00919 00920 00921 // Compute Displace normal. 00922 //========================= 00923 00924 // Evaluate the normal. 00925 CVector displaceNormal; 00926 00927 00928 // smooth on edges and on corners. 00929 if(smoothNormalCorner) 00930 displaceNormal= computeNormalCornerSmooth(so, to, smoothNormalBorderX, smoothNormalBorderY); 00931 else if(smoothNormalEdge) 00932 displaceNormal= computeNormalEdgeSmooth(so, to, smoothNormalBorderX, smoothNormalBorderY); 00933 else 00934 { 00935 // unpack... 00936 CBezierPatch *bpatch= unpackIntoCache(); 00937 // eval. 00938 displaceNormal= bpatch->evalNormal(s, t); 00939 } 00940 00941 00942 00943 // Final result. 00944 //========================= 00945 displace= displaceNormal * displaceValue; 00946 } |
|
compute the smoothed normal for s,t ([0;OrderS], [0;OrderT]). Special case on corner. Definition at line 728 of file patch_noise.cpp. References NL3D::CPatchUVLocator::build(), computeNormalEdgeSmooth(), computeNormalOnNeighbor(), NL3D::CPatch::CBindInfo::Edge, NL3D::CBezierPatch::evalNormal(), getBindNeighbor(), getCornerSmoothFlag(), getOrderS(), getOrderT(), NL3D::CPatchUVLocator::locateUV(), nlassert, nlstop, NL3D::noiseCeilF(), NL3D::noiseFloorF(), s, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint8, t, uint, unpackIntoCache(), NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeNoise().
00729 { 00730 CBindInfo bindInfoX; 00731 CBindInfo bindInfoY; 00732 uint edgeX=0; 00733 uint edgeY=0; 00734 uint corner; 00735 CBezierPatch *bpatch; 00736 bpatch= unpackIntoCache(); 00737 00738 // both must be not null 00739 nlassert( (smoothBorderX!=0) && (smoothBorderY!=0) ); 00740 00741 00742 // Get the edge against we must share displace. 00743 if(smoothBorderX==-1) edgeX=0; 00744 else if(smoothBorderX==1) edgeX=2; 00745 else nlstop; 00746 if(smoothBorderY==1) edgeY=1; 00747 else if(smoothBorderY==-1) edgeY=3; 00748 else nlstop; 00749 00750 // Get the corner against we must share displace. 00751 if(smoothBorderX==-1) 00752 { 00753 if(smoothBorderY==-1) corner=0; 00754 else corner=1; 00755 } 00756 else 00757 { 00758 if(smoothBorderY==-1) corner=3; 00759 else corner=2; 00760 } 00761 00762 // If this corner is smoothed, blend with 4 neighbors patchs. 00763 if(getCornerSmoothFlag(corner)) 00764 { 00765 // Build the bindInfo against the 2 edge. 00766 getBindNeighbor(edgeX, bindInfoX); 00767 getBindNeighbor(edgeY, bindInfoY); 00768 00769 // Fast reject: if no neighbor, just do a simple computeDisplaceInteriorSmooth. 00770 if(!bindInfoX.Zone || !bindInfoY.Zone) 00771 return bpatch->evalNormal(s/getOrderS(), t/getOrderT()); 00772 else 00773 { 00774 CVector ret; 00775 00776 00777 // Compute the coordinate on the border of the edge, and the coef of the blend. 00778 float se=s; 00779 float te=t; 00780 float coefX; 00781 float coefY; 00782 if(smoothBorderX==-1) se= noiseFloorF(se), coefX=s-se; 00783 else se= noiseCeilF(se), coefX=se-s; 00784 if(smoothBorderY==-1) te= noiseFloorF(te), coefY=t-te; 00785 else te= noiseCeilF(te), coefY=te-t; 00786 coefX= 0.5f + coefX*0.5f; 00787 coefY= 0.5f + coefY*0.5f; 00788 00789 00790 // Compute our contribution. 00791 ret= bpatch->evalNormal(s/getOrderS(), t/getOrderT()) *coefX*coefY; 00792 00793 00794 // compute Neighboring info. 00795 CPatchUVLocator uvLocatorX; 00796 CPatchUVLocator uvLocatorY; 00797 CVector2f stIn, stOut; 00798 CPatch *patchOut; 00799 uint patchId; 00800 00801 uvLocatorX.build(this, edgeX, bindInfoX); 00802 uvLocatorY.build(this, edgeY, bindInfoY); 00803 00804 // Patch on our X side. 00805 stIn.set(se, te); 00806 patchId= uvLocatorX.selectPatch(stIn); 00807 uvLocatorX.locateUV(stIn, patchId, patchOut, stOut); 00808 bpatch= patchOut->unpackIntoCache(); 00809 ret+= bpatch->evalNormal(stOut.x/patchOut->getOrderS(), stOut.y/patchOut->getOrderT()) *(1-coefX)*coefY; 00810 00811 // Patch on our Y side. 00812 stIn.set(se, te); 00813 patchId= uvLocatorY.selectPatch(stIn); 00814 uvLocatorY.locateUV(stIn, patchId, patchOut, stOut); 00815 bpatch= patchOut->unpackIntoCache(); 00816 ret+= bpatch->evalNormal(stOut.x/patchOut->getOrderS(), stOut.y/patchOut->getOrderT()) *coefX*(1-coefY); 00817 00818 /* compute contribution of the patch adjacent to me. 00819 Same reasoning as in computeDisplaceCornerSmooth(). 00820 */ 00821 stIn.set(se, te); 00822 patchId= uvLocatorY.selectPatch(stIn); 00823 uvLocatorY.locateUV(stIn, patchId, patchOut, stOut); 00824 // Because we compute the normal exactly on the edge, we must inform this method not to take us as neighbor. 00825 // ugly but simpler. 00826 ret+= patchOut->computeNormalOnNeighbor(stOut.x, stOut.y, bindInfoY.Edge[patchId]) *(1-coefX)*(1-coefY); 00827 00828 return ret; 00829 } 00830 } 00831 // else must blend with 0. 00832 else 00833 { 00834 // compute coef. 00835 float se=s; 00836 float te=t; 00837 float coefX; 00838 float coefY; 00839 if(smoothBorderX==-1) se= noiseFloorF(se), coefX=s-se; 00840 else se= noiseCeilF(se), coefX=se-s; 00841 if(smoothBorderY==-1) te= noiseFloorF(te), coefY=t-te; 00842 else te= noiseCeilF(te), coefY=te-t; 00843 00844 00845 // To have smooth continuities with smooth on edge (if any), we must do this. 00846 CVector rx, ry; 00847 // Compute a smooth with my X neighbor. 00848 rx= computeNormalEdgeSmooth(s, t, smoothBorderX, 0); 00849 // Compute a smooth with my Y neighbor. 00850 ry= computeNormalEdgeSmooth(s, t, 0, smoothBorderY); 00851 00852 // Blend the 2 result. 00853 if(coefY + coefX>0) 00854 { 00855 // This the weight used to blend to 0. 00856 float maxCoef= max(coefY, coefX); 00857 // This the weight used to blend beetween rx and ry. 00858 float ooSum= 1.0f / (coefY + coefX); 00859 float blendCoefX= coefX * ooSum; 00860 float blendCoefY= coefY * ooSum; 00861 00862 return maxCoef* (rx*blendCoefY + ry*blendCoefX); 00863 } 00864 else 00865 { 00866 return CVector::Null; 00867 } 00868 } 00869 } |
|
compute the smoothed normal for s,t ([0;OrderS], [0;OrderT]). Special case on edge. Definition at line 588 of file patch_noise.cpp. References NL3D::CPatchUVLocator::build(), NL3D::CBezierPatch::evalNormal(), getBindNeighbor(), getOrderS(), getOrderT(), getSmoothFlag(), NL3D::CPatchUVLocator::locateUV(), nlassert, nlstop, NL3D::noiseCeilF(), NL3D::noiseFloorF(), s, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint8, t, uint, unpackIntoCache(), NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeNoise(), and computeNormalCornerSmooth().
00589 { 00590 CBindInfo bindInfo; 00591 uint edge=0; 00592 CBezierPatch *bpatch; 00593 bpatch= unpackIntoCache(); 00594 00595 // only one must be not null 00596 nlassert( (smoothBorderX==0) != (smoothBorderY==0) ); 00597 00598 00599 // Get the edge against we must share displace. 00600 if(smoothBorderX==-1) edge=0; 00601 else if(smoothBorderY==1) edge=1; 00602 else if(smoothBorderX==1) edge=2; 00603 else if(smoothBorderY==-1) edge=3; 00604 else nlstop; 00605 00606 // If the edge is smoothed, blend with neighbor. 00607 if(getSmoothFlag(edge)) 00608 { 00609 // Build the bindInfo against this edge. 00610 getBindNeighbor(edge, bindInfo); 00611 00612 // Fast reject: if no neighbor, just do a simple computeDisplaceInteriorSmooth. 00613 if(!bindInfo.Zone) 00614 return bpatch->evalNormal(s/getOrderS(), t/getOrderT()); 00615 else 00616 { 00617 CVector r0, r1; 00618 00619 // Compute our contribution. 00620 r0= bpatch->evalNormal(s/getOrderS(), t/getOrderT()); 00621 00622 // Compute the coordinate on the border of the edge, and the coef of the blend. 00623 float se=s; 00624 float te=t; 00625 float coef=0.0; 00626 if(smoothBorderX==-1) se= noiseFloorF(se), coef=s-se; 00627 else if(smoothBorderX==1) se= noiseCeilF(se), coef=se-s; 00628 else if(smoothBorderY==-1) te= noiseFloorF(te), coef=t-te; 00629 else if(smoothBorderY==1) te= noiseCeilF(te), coef=te-t; 00630 coef= 0.5f + coef*0.5f; 00631 00632 // Compute contribution of the normal on the neighbor, on the border of the edge. 00633 CPatchUVLocator uvLocator; 00634 CVector2f stIn, stOut; 00635 CPatch *patchOut; 00636 uint patchId; 00637 00638 uvLocator.build(this, edge, bindInfo); 00639 stIn.set(se, te); 00640 patchId= uvLocator.selectPatch(stIn); 00641 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00642 00643 bpatch= patchOut->unpackIntoCache(); 00644 r1= bpatch->evalNormal(stOut.x/patchOut->getOrderS(), stOut.y/patchOut->getOrderT()); 00645 00646 // NB: don't bother problems with bind 1/X and the choice of the patch, because bind are C1, so normal is C0. 00647 00648 // Blend 2 result. For speed optim, don't normalize. 00649 return r0*coef + r1*(1-coef); 00650 } 00651 } 00652 // else blend with vector Null. 00653 else 00654 { 00655 // compute coef. 00656 float se=s; 00657 float te=t; 00658 float coef=0.0; 00659 if(smoothBorderX==-1) se= noiseFloorF(se), coef=s-se; 00660 else if(smoothBorderX==1) se= noiseCeilF(se), coef=se-s; 00661 else if(smoothBorderY==-1) te= noiseFloorF(te), coef=t-te; 00662 else if(smoothBorderY==1) te= noiseCeilF(te), coef=te-t; 00663 00664 // Compute our contribution. 00665 CVector r0; 00666 r0= bpatch->evalNormal(s/getOrderS(), t/getOrderT()); 00667 00668 // Blend with 0. 00669 return r0*coef; 00670 } 00671 } |
|
same reasoning as in computeDisplaceRawOnNeighbor(). Definition at line 675 of file patch_noise.cpp. References NL3D::CPatchUVLocator::build(), NL3D::CBezierPatch::evalNormal(), getBindNeighbor(), getOrderS(), getOrderT(), NL3D::CPatchUVLocator::locateUV(), s, NL3D::CPatchUVLocator::selectPatch(), NLMISC::CVector2f::set(), sint, t, uint, unpackIntoCache(), NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeNormalCornerSmooth().
00676 { 00677 sint edge= -1; 00678 00679 // look on what neighbor patch we must find the value (if any). 00680 if(s<1 && edgeExclude!=0) edge=0; 00681 else if(t>OrderT-1 && edgeExclude!=1) edge=1; 00682 else if(s>OrderS-1 && edgeExclude!=2) edge=2; 00683 else if(t<1 && edgeExclude!=3) edge=3; 00684 00685 00686 // If the location is In the patch, just return normal value. (case of a bind 1/X). 00687 if(edge==-1) 00688 { 00689 CBezierPatch *bpatch= unpackIntoCache(); 00690 return bpatch->evalNormal(s/getOrderS(), t/getOrderT()); 00691 } 00692 // else must find on neighbor. 00693 else 00694 { 00695 CBindInfo bindInfo; 00696 getBindNeighbor(edge, bindInfo); 00697 00698 // Fast reject: if no neighbor on the edge, just do a simple computeDisplaceRaw() 00699 if(!bindInfo.Zone) 00700 { 00701 CBezierPatch *bpatch= unpackIntoCache(); 00702 return bpatch->evalNormal(s/getOrderS(), t/getOrderT()); 00703 } 00704 // else must find on neighbor. 00705 else 00706 { 00707 CPatchUVLocator uvLocator; 00708 uvLocator.build(this, edge, bindInfo); 00709 00710 CVector2f stIn; 00711 CVector2f stOut; 00712 CPatch *patchOut; 00713 uint patchId; 00714 00715 // look on neighbor. same reasoning as in computeDisplaceEdgeSmooth(); 00716 stIn.set(s, t); 00717 patchId= uvLocator.selectPatch(stIn); 00718 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00719 CBezierPatch *bpatch= patchOut->unpackIntoCache(); 00720 return bpatch->evalNormal(stOut.x/patchOut->getOrderS(), stOut.y/patchOut->getOrderT()); 00721 } 00722 00723 } 00724 } |
|
Definition at line 1378 of file patch_render.cpp. References computeGeomorphAlphaFar1VertexListVB(), computeGeomorphFar0VertexListVB(), computeGeomorphTileVertexListVB(), computeGeomorphVertexList(), NL3D::CTessBlock::FarVertexList, NL3D::CTessBlock::getClipped(), isRenderClipped(), MasterBlock, NL3D::CTessBlock::NearVertexList, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, NL3D::CTessBlock::visibleFar0(), NL3D::CTessBlock::visibleFar1(), and NL3D::CTessBlock::visibleTile(). Referenced by NL3D::CLandscape::render().
01379 { 01380 if(isRenderClipped()) 01381 return; 01382 01383 // Compute Geomorph. 01384 //======= 01385 // Need only to fill CTessVertex, so do it only for FarVertices 01386 // Hence Geomorph is done twice on edges of patches!!. 01387 // If not too near for precise, fast compute of geomorph. 01388 if( TessBlocks.size()==0 ) 01389 { 01390 // Just update all vertices of master block. 01391 computeGeomorphVertexList(MasterBlock.FarVertexList); 01392 } 01393 else 01394 { 01395 // update all vertices of master block. 01396 computeGeomorphVertexList(MasterBlock.FarVertexList); 01397 // update vertices of others block. 01398 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01399 { 01400 CTessBlock &tblock= TessBlocks[i]; 01401 // Precise Clip. 01402 if(!tblock.getClipped()) 01403 { 01404 // compute the geomorph of the vertices in the tessblock. 01405 computeGeomorphVertexList(tblock.FarVertexList); 01406 } 01407 } 01408 } 01409 01410 01411 // Fill Far0. 01412 //======= 01413 if(Far0>0) 01414 { 01415 // Fill Far0 VB. 01416 computeGeomorphFar0VertexListVB(MasterBlock.FarVertexList); 01417 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01418 { 01419 CTessBlock &tblock= TessBlocks[i]; 01420 // Precise Clip. 01421 if( tblock.visibleFar0() ) 01422 computeGeomorphFar0VertexListVB(tblock.FarVertexList); 01423 } 01424 } 01425 else if(Far0==0) 01426 { 01427 // Fill Tile VB. 01428 // No Tiles in MasterBlock!! 01429 // Traverse the TessBlocks to compute vertices. 01430 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01431 { 01432 CTessBlock &tblock= TessBlocks[i]; 01433 // Precise Clip. 01434 if( tblock.visibleTile() ) 01435 computeGeomorphTileVertexListVB(tblock.NearVertexList); 01436 } 01437 } 01438 01439 // Fill Far1. 01440 //======= 01441 if(Far1>0) 01442 { 01443 // Fill VB. 01444 computeGeomorphAlphaFar1VertexListVB(MasterBlock.FarVertexList); 01445 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01446 { 01447 CTessBlock &tblock= TessBlocks[i]; 01448 // Precise Clip. 01449 if( tblock.visibleFar1() ) 01450 computeGeomorphAlphaFar1VertexListVB(tblock.FarVertexList); 01451 } 01452 } 01453 } |
|
Definition at line 942 of file patch.cpp. Referenced by appendNearVertexToRenderList(), appendTileMaterialToRenderList(), getTileLightMap(), getTileLightMapUvInfo(), releaseTileLightMap(), removeNearVertexFromRenderList(), and removeTileMaterialFromRenderList().
|
|
Definition at line 750 of file patch_lightmap.cpp. References addTileLightmapWithTLI(), computeTileLightmapAutomatic(), computeTileLightmapPrecomputed(), NL3D::CLandscape::getAutomaticLighting(), getLandscape(), modulateTileLightmapWithTileColors(), stride, and uint. Referenced by computeNearBlockLightmap().
00751 { 00752 if(getLandscape()->getAutomaticLighting()) 00753 computeTileLightmapAutomatic(ts, tt, dest, stride); 00754 else 00755 { 00756 computeTileLightmapPrecomputed(ts, tt, dest, stride); 00757 // Add the inlufence of TLI. 00758 addTileLightmapWithTLI(ts, tt, dest, stride); 00759 } 00760 00761 // modulate dest with tileColors (at center of lumels). 00762 modulateTileLightmapWithTileColors(ts, tt, dest, stride); 00763 } |
|
Definition at line 557 of file patch_lightmap.cpp. References computeTileLightmapPixelAutomatic(), NL_LUMEL_BY_TILE, stride, uint, x, and y. Referenced by computeTileLightmap().
00558 { 00559 uint x, y; 00560 for(y=0; y<NL_LUMEL_BY_TILE; y++) 00561 { 00562 for(x=0; x<NL_LUMEL_BY_TILE; x++) 00563 { 00564 // compute this pixel. 00565 computeTileLightmapPixelAutomatic(ts, tt, x, y, dest+ y*stride + x); 00566 } 00567 } 00568 } |
|
Definition at line 765 of file patch_lightmap.cpp. References addTileLightmapEdgeWithTLI(), computeTileLightmapEdgeAutomatic(), computeTileLightmapEdgePrecomputed(), NL3D::CLandscape::getAutomaticLighting(), getLandscape(), modulateTileLightmapEdgeWithTileColors(), stride, and uint. Referenced by computeNearBlockLightmap().
00766 { 00767 if(getLandscape()->getAutomaticLighting()) 00768 computeTileLightmapEdgeAutomatic(ts, tt, edge, dest, stride, inverse); 00769 else 00770 { 00771 computeTileLightmapEdgePrecomputed(ts, tt, edge, dest, stride, inverse); 00772 // Add the inlufence of TLI. 00773 addTileLightmapEdgeWithTLI(ts, tt, edge, dest, stride, inverse); 00774 } 00775 00776 // modulate dest with tileColors (at center of lumels). 00777 modulateTileLightmapEdgeWithTileColors(ts, tt, edge, dest, stride, inverse); 00778 } |
|
Definition at line 571 of file patch_lightmap.cpp. References computeTileLightmapPixelAutomatic(), NL_LUMEL_BY_TILE, stride, uint, x, and y. Referenced by computeTileLightmapEdge().
00572 { 00573 // get coordinate according to edge. 00574 uint x=0,y=0; 00575 switch(edge) 00576 { 00577 case 0: x= 0; break; 00578 case 1: y= NL_LUMEL_BY_TILE-1; break; 00579 case 2: x= NL_LUMEL_BY_TILE-1; break; 00580 case 3: y= 0; break; 00581 }; 00582 00583 uint i; 00584 for(i=0; i<NL_LUMEL_BY_TILE; i++) 00585 { 00586 // if vertical edge 00587 if( (edge&1)==0 ) y= i; 00588 // else horizontal edge 00589 else x= i; 00590 00591 // manage inverse. 00592 uint where; 00593 if(inverse) where= (NL_LUMEL_BY_TILE-1)-i; 00594 else where= i; 00595 // compute this pixel. 00596 computeTileLightmapPixelAutomatic(ts, tt, x, y, dest+ where*stride); 00597 } 00598 } |
|
Definition at line 704 of file patch_lightmap.cpp. References CompressedLumels, getLandscape(), NL3D::CLandscape::getStaticLight(), NL3D::getUnpackLumelBlock(), NL3D::NL3DDeltaLumel, NL3D::NL3DPixelStartLumel, NL_BLOCK_LUMEL_COMPRESSED_SIZE, src, stride, uint, uint8, and x. Referenced by computeTileLightmapEdge().
00705 { 00706 // Lumel table 00707 const CRGBA* colorTable=getLandscape ()->getStaticLight (); 00708 00709 // Witch corner to start ? 00710 uint pixel=NL3DPixelStartLumel[edge]; 00711 uint delta=NL3DDeltaLumel[edge]; 00712 00713 // For each lumels 00714 const uint8 *src=&(CompressedLumels[(ts + (tt*OrderS))*NL_BLOCK_LUMEL_COMPRESSED_SIZE]); 00715 uint x; 00716 if (inverse) 00717 { 00718 uint inverseStride=stride*(4-1); 00719 for(x=0; x<4; x++) 00720 { 00721 // lumel 00722 dest[inverseStride-x*stride]=colorTable[getUnpackLumelBlock (src, pixel)]; 00723 pixel+=delta; 00724 } 00725 } 00726 else 00727 { 00728 for(x=0; x<4; x++) 00729 { 00730 // lumel 00731 dest[x*stride]=colorTable[getUnpackLumelBlock (src, pixel)]; 00732 pixel+=delta; 00733 } 00734 } 00735 } |
|
Definition at line 782 of file patch_lightmap.cpp. References addTileLightmapPixelWithTLI(), computeTileLightmapPixelAutomatic(), computeTileLightmapPixelPrecomputed(), NL3D::CLandscape::getAutomaticLighting(), getLandscape(), modulateTileLightmapPixelWithTileColors(), s, t, and uint. Referenced by computeNearBlockLightmap(), and computeTileLightmapPixelAroundCorner().
00783 { 00784 if(getLandscape()->getAutomaticLighting()) 00785 computeTileLightmapPixelAutomatic(ts, tt, s, t, dest); 00786 else 00787 { 00788 computeTileLightmapPixelPrecomputed(ts, tt, s, t, dest); 00789 // Add the inlufence of TLI. 00790 addTileLightmapPixelWithTLI(ts, tt, s, t, dest); 00791 } 00792 00793 // modulate dest with tileColors (at center of lumels). 00794 modulateTileLightmapPixelWithTileColors(ts, tt, s, t, dest); 00795 } |
|
Definition at line 799 of file patch_lightmap.cpp. References NL3D::CPatchUVLocator::build(), computeTileLightmapPixel(), getBindNeighbor(), NL3D::CPatchUVLocator::locateUV(), NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE_SHIFT, NL3D::CPatchUVLocator::selectPatch(), sint, uint, v, NLMISC::CVector2f::x, NLMISC::CVector2f::y, and NL3D::CPatch::CBindInfo::Zone. Referenced by computeNearBlockLightmap().
00800 { 00801 bool mustLookOnNeighbor= false; 00802 00803 // Get the Uv, in [0,Order?*NL_LUMEL_BY_TILE] basis (ie lumel basis). 00804 sint u, v; 00805 u= (sint)floor(stIn.x*NL_LUMEL_BY_TILE); 00806 v= (sint)floor(stIn.y*NL_LUMEL_BY_TILE); 00807 00808 // if allowed, try to go on neighbor patch. 00809 if(lookAround) 00810 { 00811 // try to know if we must go on a neighbor patch (maybe false with bind X/1). 00812 if( u<0 || u>=OrderS*NL_LUMEL_BY_TILE || v<0 || v>=OrderT*NL_LUMEL_BY_TILE) 00813 mustLookOnNeighbor= true; 00814 } 00815 00816 00817 // If we must get (if possible) the pixel in the current patch, do it. 00818 if(!mustLookOnNeighbor) 00819 { 00820 // if out this patch, abort. 00821 if( u<0 || u>=OrderS*NL_LUMEL_BY_TILE || v<0 || v>=OrderT*NL_LUMEL_BY_TILE) 00822 return; 00823 else 00824 { 00825 // get this pixel. 00826 computeTileLightmapPixel(u>>NL_LUMEL_BY_TILE_SHIFT, v>>NL_LUMEL_BY_TILE_SHIFT, u&(NL_LUMEL_BY_TILE-1), v&(NL_LUMEL_BY_TILE-1), dest); 00827 } 00828 } 00829 // else get from the best neighbor patch. 00830 else 00831 { 00832 // choose against which edge we must find the pixel. 00833 uint edge=0; 00834 if(u<0) edge=0; 00835 else if(v>=OrderT*NL_LUMEL_BY_TILE) edge=1; 00836 else if(u>=OrderS*NL_LUMEL_BY_TILE) edge=2; 00837 else if(v<0) edge=3; 00838 00839 // retrieve info on neighbor. 00840 CBindInfo bindInfo; 00841 getBindNeighbor(edge, bindInfo); 00842 00843 // if neighbor present. 00844 if(bindInfo.Zone) 00845 { 00846 CVector2f stOut; 00847 CPatch *patchOut; 00848 uint patchId; 00849 00850 // Ok, search uv on this patch. 00851 CPatchUVLocator uvLocator; 00852 uvLocator.build(this, edge, bindInfo); 00853 patchId= uvLocator.selectPatch(stIn); 00854 uvLocator.locateUV(stIn, patchId, patchOut, stOut); 00855 00856 // retry only one time, so at next call, must find the data IN htis patch (else abort). 00857 patchOut->computeTileLightmapPixelAroundCorner(stOut, dest, false); 00858 } 00859 } 00860 } |
|
Definition at line 601 of file patch_lightmap.cpp. References NLMISC::clamp(), computeVertex(), NL3D::CLandscape::getAutomaticLightDir(), getLandscape(), NL3D::CLandscape::getStaticLight(), NL_LUMEL_BY_TILE, NLMISC::CVector::normalize(), s, sint, t, uint, and v. Referenced by computeTileLightmapAutomatic(), computeTileLightmapEdgeAutomatic(), and computeTileLightmapPixel().
00602 { 00603 float u,v; 00604 static const float lumelSize= 1.f/NL_LUMEL_BY_TILE; 00605 00606 // use 3 computeVertex to compute a normal. This is slow.... 00607 CVector p0, p1 ,p2; 00608 // 1st vert. Top-left of the lumel. 00609 u= (ts + s*lumelSize )/OrderS; 00610 v= (tt + t*lumelSize )/OrderT; 00611 p0= computeVertex(u, v); 00612 // 2nd vert. Bottom-left of the lumel. 00613 u= (ts + s*lumelSize )/OrderS; 00614 v= (tt + (t+1)*lumelSize )/OrderT; 00615 p1= computeVertex(u, v); 00616 // 3rd vert. Center-Right of the lumel. 00617 u= (ts + (s+1)*lumelSize )/OrderS; 00618 v= (tt + (t+0.5f)*lumelSize )/OrderT; 00619 p2= computeVertex(u, v); 00620 00621 // the normal. 00622 CVector normal; 00623 normal= (p1-p0)^(p2-p0); 00624 normal.normalize(); 00625 00626 // lighting. 00627 float c= -normal*getLandscape()->getAutomaticLightDir(); 00628 c= max(c, 0.f); 00629 sint ic; 00630 00631 #ifdef NL_OS_WINDOWS 00632 // FastFloor using fistp. Don't care convention. 00633 float fc= c*256; 00634 _asm 00635 { 00636 fld fc 00637 fistp ic 00638 } 00639 #else 00640 ic= (sint)floor(c*256); 00641 #endif 00642 clamp(ic, 0, 255); 00643 00644 // ambiant/diffuse lighting. 00645 *dest= getLandscape()->getStaticLight()[ic]; 00646 } |
|
Definition at line 738 of file patch_lightmap.cpp. References CompressedLumels, getLandscape(), NL3D::CLandscape::getStaticLight(), NL3D::getUnpackLumelBlock(), NL_BLOCK_LUMEL_COMPRESSED_SIZE, s, t, and uint. Referenced by computeTileLightmapPixel().
00739 { 00740 // Lumel table 00741 const CRGBA* colorTable=getLandscape ()->getStaticLight (); 00742 00743 // Return the lumel 00744 *dest=colorTable[getUnpackLumelBlock (&(CompressedLumels[(ts + (tt*OrderS))*NL_BLOCK_LUMEL_COMPRESSED_SIZE]), s+(t<<2))]; 00745 } |
|
Definition at line 678 of file patch_lightmap.cpp. References buffer, CompressedLumels, getLandscape(), NL3D::CLandscape::getStaticLight(), NL_BLOCK_LUMEL_COMPRESSED_SIZE, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE_SHIFT, stride, uint, uint8, unpackLumelBlock(), x, and y. Referenced by computeTileLightmap().
00679 { 00680 // Lumel table 00681 const CRGBA* colorTable=getLandscape ()->getStaticLight (); 00682 // Unpack the lumels 00683 uint8 buffer[NL_LUMEL_BY_TILE*NL_LUMEL_BY_TILE]; 00684 unpackLumelBlock (buffer, &(CompressedLumels[(ts + (tt*OrderS))*NL_BLOCK_LUMEL_COMPRESSED_SIZE])); 00685 00686 // Retrun it 00687 uint x, y; 00688 for(y=0; y<NL_LUMEL_BY_TILE; y++) 00689 { 00690 for(x=0; x<NL_LUMEL_BY_TILE; x++) 00691 { 00692 // lumel 00693 dest[y*stride + x]=colorTable[buffer[x+(y<<NL_LUMEL_BY_TILE_SHIFT)]]; 00694 } 00695 } 00696 } |
|
Compute a vertex. Compute a vertex according to:
Patch UV geometric correction.
Definition at line 1338 of file patch.cpp. References computeNoise(), NL3D::CBezierPatch::eval(), getLandscape(), NL3D::CLandscape::getNoiseMode(), s, t, and unpackIntoCache(). Referenced by addTileTrianglesInBBox(), NL3D::CTessFace::averageTesselationVertices(), averageTesselationVertices(), bind(), NL3D::CLandscape::buildCollideFaces(), computeContinousVertex(), computeTileLightmapPixelAutomatic(), computeVertexButCorner(), NL3D::CLandscapeVegetableBlockCreateContext::eval(), makeRoots(), NL3D::CZoneLighter::processZonePointLightRT(), NL3D::CTessFace::refreshTesselationGeometry(), refreshTesselationGeometry(), NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
01339 { 01340 // \todo yoyo: TODO_UVCORRECT: use UV correction. 01341 01342 if(getLandscape()->getNoiseMode()) 01343 { 01344 // compute displacement map to disturb result. 01345 CVector displace; 01346 computeNoise(s,t, displace); 01347 01348 // return patch(s,t) + dispalcement result. 01349 // unpack. Do it after computeNoise(), because this last may change the cache. 01350 CBezierPatch *patch= unpackIntoCache(); 01351 return patch->eval(s,t) + displace; 01352 } 01353 else 01354 { 01355 // unpack and return patch(s,t). 01356 CBezierPatch *patch= unpackIntoCache(); 01357 return patch->eval(s,t); 01358 } 01359 } |
|
Used by computeContinousVertex().
Definition at line 1456 of file patch.cpp. References BaseVertices, computeVertex(), NL3D::CTessVertex::EndPos, nlassert, nlstop, s, sint, and t. Referenced by computeContinousVertex().
01457 { 01458 // must be compiled 01459 nlassert(Zone); 01460 01461 // Test is on a edge/corner of the patch 01462 sint edgeIdS= -1; 01463 sint edgeIdT= -1; 01464 if(s==0) edgeIdS= 0; 01465 else if(s==1) edgeIdS= 2; 01466 if(t==0) edgeIdT= 3; 01467 else if(t==1) edgeIdT= 1; 01468 01469 // test if on a corner 01470 if(edgeIdS>=0 && edgeIdT>=0) 01471 { 01472 // indicate that yes, we are on a corner 01473 onCorner= true; 01474 // return the baseVertex according to edge falgs 01475 if(edgeIdS==0 && edgeIdT==3) return BaseVertices[0]->EndPos; 01476 if(edgeIdS==0 && edgeIdT==1) return BaseVertices[1]->EndPos; 01477 if(edgeIdS==2 && edgeIdT==1) return BaseVertices[2]->EndPos; 01478 if(edgeIdS==2 && edgeIdT==3) return BaseVertices[3]->EndPos; 01479 nlstop; 01480 // Error, but Avoid warning 01481 return CVector::Null; 01482 } 01483 // else, std case 01484 else 01485 { 01486 onCorner= false; 01487 return computeVertex(s, t); 01488 } 01489 } |
|
Set this patch flags from an other one. The patchs must match Definition at line 2245 of file patch.cpp. References nlassert, src, Tiles, and uint. Referenced by NL3D::CZone::copyTilesFlags().
|
|
|
|
Definition at line 663 of file patch_render.cpp. References NL3D::CTessBlock::createFaceVectorFar0(), getLandscape(), MasterBlock, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by allocateVBAndFaceVector().
00664 { 00665 // If Far Mode. 00666 if(Far0>0) 00667 { 00668 // Create the face for all TessBlocks. 00669 MasterBlock.createFaceVectorFar0(getLandscape()->_FaceVectorManager); 00670 for(uint i=0; i<TessBlocks.size(); i++) 00671 TessBlocks[i].createFaceVectorFar0(getLandscape()->_FaceVectorManager); 00672 } 00673 // Or If Tile Mode. 00674 else if(Far0==0) 00675 { 00676 // Create the face for all TessBlocks. 00677 // No tiles in MasterBlock! 00678 for(uint i=0; i<TessBlocks.size(); i++) 00679 TessBlocks[i].createFaceVectorTile(getLandscape()->_FaceVectorManager); 00680 } 00681 } |
|
Definition at line 641 of file patch_render.cpp. References NL3D::CTessBlock::createFaceVectorFar1(), getLandscape(), MasterBlock, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by allocateVBAndFaceVector(), and allocateVBAndFaceVectorFar1Only().
00642 { 00643 if(Far1>0) 00644 { 00645 // Create the face for all TessBlocks. 00646 MasterBlock.createFaceVectorFar1(getLandscape()->_FaceVectorManager); 00647 for(uint i=0; i<TessBlocks.size(); i++) 00648 TessBlocks[i].createFaceVectorFar1(getLandscape()->_FaceVectorManager); 00649 } 00650 } |
|
Create / init the vegetableBlock in the corresponding TessBlock. TessBlocks must exist.
Definition at line 294 of file patch_vegetable.cpp. References NL3D::CBezierPatch::eval(), getLandscape(), NL3D::CLandscapeVegetableBlock::init(), NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK, NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT, TessBlocks, uint, unpackIntoCache(), and VegetableClipBlocks. Referenced by appendTileMaterialToRenderList(), and recreateAllVegetableIgs().
00295 { 00296 // TessBlock width 00297 uint tbWidth= OrderS >> 1; 00298 // clipBlock width 00299 uint nTbPerCb= NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK; 00300 uint cbWidth= (tbWidth + nTbPerCb-1) >> NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT; 00301 00302 // compute tessBlock coordinate. 00303 uint tbs ,tbt; 00304 tbs= ts >> 1; 00305 tbt= tt >> 1; 00306 // compute clipBlock coordinate. 00307 uint cbs,cbt; 00308 cbs= tbs >> NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT; 00309 cbt= tbt >> NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT; 00310 00311 // create the vegetable block. 00312 CLandscapeVegetableBlock *vegetBlock= new CLandscapeVegetableBlock; 00313 // Init / append to list. 00314 // compute center of the vegetableBlock (approx). 00315 CBezierPatch *bpatch= unpackIntoCache(); 00316 CVector center= bpatch->eval( (float)(tbs*2+1)/OrderS, (float)(tbt*2+1)/OrderT ); 00317 // Lower-Left tile is (tbs*2, tbt*2) 00318 vegetBlock->init(center, getLandscape()->_VegetableManager, VegetableClipBlocks[cbt *cbWidth + cbs], this, tbs*2, tbt*2, getLandscape()->_VegetableBlockList); 00319 00320 // set in the tessBlock 00321 TessBlocks[numTb].VegetableBlock= vegetBlock; 00322 } |
|
Definition at line 914 of file patch_render.cpp. References debugAllocationMarkIndicesFarList(), debugAllocationMarkIndicesNearList(), NL3D::CTessBlock::FarVertexList, MasterBlock, NL3D::CTessBlock::NearVertexList, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint.
00915 { 00916 sint i; 00917 00918 // Do it For Far. 00919 debugAllocationMarkIndicesFarList(MasterBlock.FarVertexList, marker); 00920 for(i=0; i<(sint)TessBlocks.size(); i++) 00921 { 00922 CTessBlock &tblock= TessBlocks[i]; 00923 debugAllocationMarkIndicesFarList(tblock.FarVertexList, marker); 00924 } 00925 // Do it For Near. 00926 // No Tiles in MasterBlock!! 00927 for(i=0; i<(sint)TessBlocks.size(); i++) 00928 { 00929 CTessBlock &tblock= TessBlocks[i]; 00930 debugAllocationMarkIndicesNearList(tblock.NearVertexList, marker); 00931 } 00932 00933 } |
|
Definition at line 893 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessFarVertex::Index0, NL3D::CTessFarVertex::Index1, NL3D::CTessNodeList::Next, and uint. Referenced by debugAllocationMarkIndices().
00894 { 00895 // Traverse the vertList. 00896 CTessFarVertex *pVert; 00897 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 00898 { 00899 pVert->Index0= marker; 00900 pVert->Index1= marker; 00901 } 00902 } |
|
Definition at line 904 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessNearVertex::Index, NL3D::CTessNodeList::Next, and uint. Referenced by debugAllocationMarkIndices().
00905 { 00906 // Traverse the vertList. 00907 CTessNearVertex *pVert; 00908 for(pVert= vertList.begin(); pVert; pVert= (CTessNearVertex*)pVert->Next) 00909 { 00910 pVert->Index= marker; 00911 } 00912 } |
|
Dec a ref count to the DLMContext, deleting it if refCount== 0.
Definition at line 1977 of file patch_lightmap.cpp. References _DLMContext, _DLMContextRefCount, count, fillVBFarsDLMUvOnly(), isRenderClipped(), nlassert, and uint. Referenced by endDLMLighting(), and removeTileMaterialFromRenderList().
01978 { 01979 // the patch must be compiled. 01980 nlassert(Zone); 01981 nlassert(_DLMContextRefCount>0); 01982 01983 // dec Ref. 01984 _DLMContextRefCount-= count; 01985 nlassert(_DLMContextRefCount>=0); 01986 01987 // If 0, delete the context. 01988 if(_DLMContextRefCount==0) 01989 { 01990 delete _DLMContext; 01991 _DLMContext= NULL; 01992 01993 // If the patch is visible, it may have Far Vertices created, 01994 // hence, we must reset their DLM Uvs (to point to black pixel) 01995 if(!isRenderClipped()) 01996 { 01997 // setup DLM Uv with new _DLMContext 01998 fillVBFarsDLMUvOnly(); 01999 } 02000 } 02001 } |
|
Definition at line 658 of file patch.cpp. References clearTessBlocks(), nlassert, and TessBlockRefCount. Referenced by removeFaceFromRenderList(), removeFarVertexFromRenderList(), removeNearVertexFromRenderList(), and removeTileMaterialFromRenderList().
00659 { 00660 TessBlockRefCount--; 00661 // If no loinger need the tessblocks, delete them. 00662 if(TessBlockRefCount==0) 00663 clearTessBlocks(); 00664 nlassert(TessBlockRefCount>=0); 00665 } |
|
Delete any vegetable Ig still existing in this patch.
Definition at line 282 of file patch_vegetable.cpp. References releaseVegetableBlock(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by clearTessBlocks(), and NL3D::CLandscape::enableVegetable().
00283 { 00284 // For all TessBlocks, try to release their VegetableBlock 00285 for(uint i=0; i<TessBlocks.size(); i++) 00286 { 00287 releaseVegetableBlock(i); 00288 } 00289 00290 } |
|
Definition at line 683 of file patch_render.cpp. References NL3D::CTessBlock::deleteFaceVectorFar0(), getLandscape(), MasterBlock, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by deleteVBAndFaceVector().
00684 { 00685 // If Far Mode. 00686 if(Far0>0) 00687 { 00688 // delete the face for all TessBlocks. 00689 MasterBlock.deleteFaceVectorFar0(getLandscape()->_FaceVectorManager); 00690 for(uint i=0; i<TessBlocks.size(); i++) 00691 TessBlocks[i].deleteFaceVectorFar0(getLandscape()->_FaceVectorManager); 00692 } 00693 // Or If Tile Mode. 00694 else if(Far0==0) 00695 { 00696 // delete the face for all TessBlocks. 00697 // No tiles in MasterBlock! 00698 for(uint i=0; i<TessBlocks.size(); i++) 00699 TessBlocks[i].deleteFaceVectorTile(getLandscape()->_FaceVectorManager); 00700 } 00701 } |
|
Definition at line 652 of file patch_render.cpp. References NL3D::CTessBlock::deleteFaceVectorFar1(), getLandscape(), MasterBlock, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by deleteVBAndFaceVector(), and deleteVBAndFaceVectorFar1Only().
00653 { 00654 if(Far1>0) 00655 { 00656 // delete the face for all TessBlocks. 00657 MasterBlock.deleteFaceVectorFar1(getLandscape()->_FaceVectorManager); 00658 for(uint i=0; i<TessBlocks.size(); i++) 00659 TessBlocks[i].deleteFaceVectorFar1(getLandscape()->_FaceVectorManager); 00660 } 00661 } |
|
Definition at line 2142 of file patch.cpp. References NL3D::CTessFace::deleteTileUvs(), Son0, and Son1.
|
|
Definition at line 837 of file patch_render.cpp. References deleteFaceVectorFar0OrTile(), deleteFaceVectorFar1(), and updateVBAlloc(). Referenced by preRender(), release(), and updateClipPatchVB().
00838 { 00839 updateVBAlloc(false); 00840 deleteFaceVectorFar1(); 00841 deleteFaceVectorFar0OrTile(); 00842 } |
|
Definition at line 854 of file patch_render.cpp. References deleteFaceVectorFar1(), NL3D::CTessBlock::FarVertexList, MasterBlock, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, updateFar1VBAlloc(), and NL3D::CTessBlock::visibleFar1(). Referenced by preRender().
00855 { 00856 if(Far1>0) 00857 { 00858 // alloc VB. 00859 updateFar1VBAlloc(MasterBlock.FarVertexList, false); 00860 for(sint i=0; i<(sint)TessBlocks.size(); i++) 00861 { 00862 CTessBlock &tblock= TessBlocks[i]; 00863 // need update VB only if tessBlock is visible. 00864 if( tblock.visibleFar1() ) 00865 updateFar1VBAlloc(tblock.FarVertexList, false); 00866 } 00867 } 00868 00869 deleteFaceVectorFar1(); 00870 } |
|
Definition at line 783 of file patch.cpp. References NL3D::CTessBlock::appendToModifyListAndDeleteFaceVector(), getLandscape(), NL3D::CTessBlock::isInModifyList(), and isRenderClipped(). Referenced by appendFaceToRenderList(), appendFaceToTileRenderList(), removeFaceFromRenderList(), and removeFaceFromTileRenderList().
00784 { 00785 // If patch is visible, block's faceVector should exist, but are no more valid. 00786 if(!isRenderClipped()) 00787 { 00788 // If this tessBlock not already notified to modification. 00789 if(!tb.isInModifyList()) 00790 { 00791 // Then append, and delete all FaceVector. 00792 // NB: delete FaceVector now, because the TessBlock himself may disapear soon. 00793 tb.appendToModifyListAndDeleteFaceVector(getLandscape()->_TessBlockModificationRoot, getLandscape()->_FaceVectorManager); 00794 } 00795 } 00796 } |
|
end Dynamic light Process, deleting the DLMContext if necessary. NB: _DLMContext->compileLighting() is not called, since done during render phase. Called by CLandscape. _DLMContext must exist Definition at line 2035 of file patch_lightmap.cpp. References _DLMContext, decRefDLMContext(), nlassert, and NL3D::CPatchDLMContext::OldPointLightCount. Referenced by NL3D::CLandscape::computeDynamicLighting().
02036 { 02037 nlassert(_DLMContext); 02038 02039 // delete reference from old pointLight influences, at prec render() pass. _DLMContext may be deleted here, 02040 // if no more lights use it, and if the patch is not in Near. 02041 decRefDLMContext(_DLMContext->OldPointLightCount); 02042 } |
|
Eval an uncompressed 4x4 block against the original
Definition at line 244 of file patch_lightmap.cpp. References height, sint, uint, uint8, v, and width. Referenced by packShadowMap().
|
|
Definition at line 766 of file patch.cpp. References NL3D::CTessVertex::EndPos, getNumTessBlock(), NL3D::CTessFace::Level, TessBlockLimitLevel, TessBlocks, uint, NL3D::CTessFace::VBase, NL3D::CTessFace::VLeft, and NL3D::CTessFace::VRight. Referenced by NL3D::CTessFace::refreshTesselationGeometry().
00767 { 00768 if(face->Level>=TessBlockLimitLevel) 00769 { 00770 // get the tessBlock of the face. 00771 uint numtb= getNumTessBlock(face); 00772 00773 // Must enlarge the BSphere of the tesblock!! 00774 TessBlocks[numtb].extendSphereFirst(face->VBase->EndPos); 00775 TessBlocks[numtb].extendSphereAdd(face->VLeft->EndPos); 00776 TessBlocks[numtb].extendSphereAdd(face->VRight->EndPos); 00777 TessBlocks[numtb].extendSphereCompile(); 00778 } 00779 } |
|
Definition at line 1609 of file patch_render.cpp. References _DLMContext, NL3D::CTessList< T >::begin(), NL3D::CPatchDLMContext::DLMUBias, NL3D::CPatchDLMContext::DLMUScale, NL3D::CPatchDLMContext::DLMVBias, NL3D::CPatchDLMContext::DLMVScale, NL3D::CParamCoord::getS(), NL3D::CParamCoord::getT(), NL3D::CTessFarVertex::Index0, NL3D::CTessNodeList::Next, nlassert, NL3D::CTessFarVertex::PCoord, NLMISC::CUV::U, uint8, and NLMISC::CUV::V. Referenced by fillVBFarsDLMUvOnly().
01610 { 01611 // The Buffers must have been locked 01612 nlassert(CLandscapeGlobals::CurrentFar0VBAllocator); 01613 nlassert(CLandscapeGlobals::CurrentFar0VBAllocator->bufferLocked()); 01614 // VBInfo must be OK. 01615 nlassert(!CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs()); 01616 01617 static uint8 *CurVBPtr; 01618 static CUV uvDLM; 01619 01620 // If the DLMContext exist 01621 if(_DLMContext) 01622 { 01623 // Traverse the vertList, to compute new uvDLM 01624 CTessFarVertex *pVert; 01625 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01626 { 01627 // Compute/build the new vertex. 01628 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar0VBInfo.VertexCoordPointer; 01629 CurVBPtr+= pVert->Index0 * CLandscapeGlobals::CurrentFar0VBInfo.VertexSize; 01630 01631 // compute Uvs. 01632 CParamCoord pc= pVert->PCoord; 01633 01634 // compute Dynamic lightmap Uv with DLM context info. 01635 uvDLM.U= pc.getS()* _DLMContext->DLMUScale + _DLMContext->DLMUBias; 01636 uvDLM.V= pc.getT()* _DLMContext->DLMVScale + _DLMContext->DLMVBias; 01637 01638 // Set Uv DLM only (NB: same code for VertexProgram or not, only TexCoordOff1 may change). 01639 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.TexCoordOff1)= uvDLM; 01640 } 01641 } 01642 // else, reset all Uvs 01643 else 01644 { 01645 // just set UV so the vertex point to a black pixel (see CTextureDLM). 01646 uvDLM.U= 1; 01647 uvDLM.V= 1; 01648 01649 // Traverse the vertList, to reset uv 01650 CTessFarVertex *pVert; 01651 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01652 { 01653 // Compute/build the new vertex. 01654 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar0VBInfo.VertexCoordPointer; 01655 CurVBPtr+= pVert->Index0 * CLandscapeGlobals::CurrentFar0VBInfo.VertexSize; 01656 01657 // Set Uv DLM only (NB: same code for VertexProgram or not, only TexCoordOff1 may change). 01658 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.TexCoordOff1)= uvDLM; 01659 } 01660 } 01661 } |
|
Definition at line 1161 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), fillFar0VertexVB(), and NL3D::CTessNodeList::Next. Referenced by fillVB(), fillVBFar0Only(), and preRender().
01162 { 01163 // Traverse the vertList. 01164 CTessFarVertex *pVert; 01165 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01166 { 01167 fillFar0VertexVB(pVert); 01168 } 01169 } |
|
Definition at line 946 of file patch_render.cpp. References _DLMContext, NL3D::CPatchDLMContext::DLMUBias, NL3D::CPatchDLMContext::DLMUScale, NL3D::CPatchDLMContext::DLMVBias, NL3D::CPatchDLMContext::DLMVScale, NL3D::CTessVertex::EndPos, Far0UBias, Far0UScale, Far0VBias, Far0VScale, NL3D::CParamCoord::getS(), NL3D::CParamCoord::getT(), NL3D::CTessFarVertex::Index0, NL3D::CTessVertex::MaxFaceSize, NL3D::CTessVertex::MaxNearLimit, NL_PATCH_FAR0_ROTATED, nlassert, NL3D::CTessFarVertex::PCoord, NL3D::CTessVertex::Pos, NL3D::CTessFarVertex::Src, NL3D::CTessVertex::StartPos, NLMISC::CUV::U, uint8, and NLMISC::CUV::V. Referenced by checkFillVertexVBFar(), and fillFar0VertexListVB().
00947 { 00948 // The Buffers must have been locked 00949 nlassert(CLandscapeGlobals::CurrentFar0VBAllocator); 00950 nlassert(CLandscapeGlobals::CurrentFar0VBAllocator->bufferLocked()); 00951 // VBInfo must be OK. 00952 nlassert(!CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs()); 00953 00954 static uint8 *CurVBPtr; 00955 // Compute/build the new vertex. 00956 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar0VBInfo.VertexCoordPointer; 00957 CurVBPtr+= pVert->Index0 * CLandscapeGlobals::CurrentFar0VBInfo.VertexSize; 00958 00959 // NB: the filling order of data is important, for AGP write combiners. 00960 00961 // compute Uvs. 00962 static CUV uv; 00963 CParamCoord pc= pVert->PCoord; 00964 if (Flags&NL_PATCH_FAR0_ROTATED) 00965 { 00966 uv.U= pc.getT()* Far0UScale + Far0UBias; 00967 uv.V= (1.f-pc.getS())* Far0VScale + Far0VBias; 00968 } 00969 else 00970 { 00971 uv.U= pc.getS()* Far0UScale + Far0UBias; 00972 uv.V= pc.getT()* Far0VScale + Far0VBias; 00973 } 00974 00975 // compute Dynamic lightmap Uv. 00976 static CUV uvDLM; 00977 if(_DLMContext) // (NB: Suppose BTB kill this test). 00978 { 00979 // compute UV with DLM context info. 00980 uvDLM.U= pc.getS()* _DLMContext->DLMUScale + _DLMContext->DLMUBias; 00981 uvDLM.V= pc.getT()* _DLMContext->DLMVScale + _DLMContext->DLMVBias; 00982 } 00983 else 00984 { 00985 // just set UV so the vertex point to a black pixel (see CTextureDLM). 00986 uvDLM.U= 1; 00987 uvDLM.V= 1; 00988 } 00989 00990 // If not VertexProgram (NB: Suppose BTB kill this test). 00991 if( !CLandscapeGlobals::VertexProgramEnabled ) 00992 { 00993 // Set Pos. Set it local to the current center of landscape 00994 *(CVector*)CurVBPtr= pVert->Src->Pos - CLandscapeGlobals::PZBModelPosition; 00995 // Set Uvs. 00996 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.TexCoordOff0)= uv; 00997 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.TexCoordOff1)= uvDLM; 00998 } 00999 else 01000 { 01001 // Else must setup Vertex program inputs 01002 // v[0]== StartPos. 01003 *(CVector*)CurVBPtr= pVert->Src->StartPos; 01004 // v[8]== Tex0 01005 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.TexCoordOff0)= uv; 01006 // v[9]== Tex1 01007 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.TexCoordOff1)= uvDLM; 01008 01009 // v[10]== GeomInfo. 01010 static CUV geomInfo; 01011 geomInfo.U= pVert->Src->MaxFaceSize * CLandscapeGlobals::OORefineThreshold; 01012 geomInfo.V= pVert->Src->MaxNearLimit; 01013 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.GeomInfoOff)= geomInfo; 01014 01015 // v[11]== EndPos - StartPos 01016 *(CVector*)(CurVBPtr + CLandscapeGlobals::CurrentFar0VBInfo.DeltaPosOff)= 01017 pVert->Src->EndPos - pVert->Src->StartPos; 01018 } 01019 } |
|
Definition at line 1664 of file patch_render.cpp. References _DLMContext, NL3D::CTessList< T >::begin(), NL3D::CPatchDLMContext::DLMUBias, NL3D::CPatchDLMContext::DLMUScale, NL3D::CPatchDLMContext::DLMVBias, NL3D::CPatchDLMContext::DLMVScale, NL3D::CParamCoord::getS(), NL3D::CParamCoord::getT(), NL3D::CTessFarVertex::Index1, NL3D::CTessNodeList::Next, nlassert, NL3D::CTessFarVertex::PCoord, NLMISC::CUV::U, uint8, and NLMISC::CUV::V. Referenced by fillVBFarsDLMUvOnly().
01665 { 01666 // The Buffers must have been locked 01667 nlassert(CLandscapeGlobals::CurrentFar1VBAllocator); 01668 nlassert(CLandscapeGlobals::CurrentFar1VBAllocator->bufferLocked()); 01669 // VBInfo must be OK. 01670 nlassert(!CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs()); 01671 01672 static uint8 *CurVBPtr; 01673 static CUV uvDLM; 01674 01675 // If the DLMContext exist 01676 if(_DLMContext) 01677 { 01678 // Traverse the vertList, to compute new uvDLM 01679 CTessFarVertex *pVert; 01680 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01681 { 01682 // Compute/build the new vertex. 01683 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar1VBInfo.VertexCoordPointer; 01684 CurVBPtr+= pVert->Index1 * CLandscapeGlobals::CurrentFar1VBInfo.VertexSize; 01685 01686 // compute Uvs. 01687 CParamCoord pc= pVert->PCoord; 01688 01689 // compute Dynamic lightmap Uv with DLM context info. 01690 uvDLM.U= pc.getS()* _DLMContext->DLMUScale + _DLMContext->DLMUBias; 01691 uvDLM.V= pc.getT()* _DLMContext->DLMVScale + _DLMContext->DLMVBias; 01692 01693 // Set Uv DLM only (NB: same code for VertexProgram or not, only TexCoordOff1 may change). 01694 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.TexCoordOff1)= uvDLM; 01695 } 01696 } 01697 // else, reset all Uvs 01698 else 01699 { 01700 // just set UV so the vertex point to a black pixel (see CTextureDLM). 01701 uvDLM.U= 1; 01702 uvDLM.V= 1; 01703 01704 // Traverse the vertList, to reset uv 01705 CTessFarVertex *pVert; 01706 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01707 { 01708 // Compute/build the new vertex. 01709 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar1VBInfo.VertexCoordPointer; 01710 CurVBPtr+= pVert->Index1 * CLandscapeGlobals::CurrentFar1VBInfo.VertexSize; 01711 01712 // Set Uv DLM only (NB: same code for VertexProgram or not, only TexCoordOff1 may change). 01713 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.TexCoordOff1)= uvDLM; 01714 } 01715 } 01716 } |
|
Definition at line 1173 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), fillFar1VertexVB(), and NL3D::CTessNodeList::Next. Referenced by fillVB(), fillVBFar1Only(), and preRender().
01174 { 01175 // Traverse the vertList. 01176 CTessFarVertex *pVert; 01177 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 01178 { 01179 fillFar1VertexVB(pVert); 01180 } 01181 } |
|
Definition at line 1022 of file patch_render.cpp. References _DLMContext, NL3D::CPatchDLMContext::DLMUBias, NL3D::CPatchDLMContext::DLMUScale, NL3D::CPatchDLMContext::DLMVBias, NL3D::CPatchDLMContext::DLMVScale, NL3D::CTessVertex::EndPos, Far1UBias, Far1UScale, Far1VBias, Far1VScale, NL3D::CParamCoord::getS(), NL3D::CParamCoord::getT(), NL3D::CTessFarVertex::Index1, NL3D::CTessVertex::MaxFaceSize, NL3D::CTessVertex::MaxNearLimit, NL_PATCH_FAR1_ROTATED, nlassert, OOTransitionSqrDelta, NL3D::CTessFarVertex::PCoord, NL3D::CTessVertex::Pos, NL3D::CTessFarVertex::Src, NL3D::CTessVertex::StartPos, TransitionSqrMin, NLMISC::CUV::U, uint8, and NLMISC::CUV::V. Referenced by checkFillVertexVBFar(), and fillFar1VertexListVB().
01023 { 01024 // The Buffers must have been locked 01025 nlassert(CLandscapeGlobals::CurrentFar1VBAllocator); 01026 nlassert(CLandscapeGlobals::CurrentFar1VBAllocator->bufferLocked()); 01027 // VBInfo must be OK. 01028 nlassert(!CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs()); 01029 01030 static uint8 *CurVBPtr; 01031 // Compute/build the new vertex. 01032 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentFar1VBInfo.VertexCoordPointer; 01033 CurVBPtr+= pVert->Index1 * CLandscapeGlobals::CurrentFar1VBInfo.VertexSize; 01034 01035 // NB: the filling order of data is important, for AGP write combiners. 01036 01037 // compute Uvs. 01038 static CUV uv; 01039 CParamCoord pc= pVert->PCoord; 01040 if (Flags&NL_PATCH_FAR1_ROTATED) 01041 { 01042 uv.U= pc.getT()* Far1UScale + Far1UBias; 01043 uv.V= (1.f-pc.getS())* Far1VScale + Far1VBias; 01044 } 01045 else 01046 { 01047 uv.U= pc.getS()* Far1UScale + Far1UBias; 01048 uv.V= pc.getT()* Far1VScale + Far1VBias; 01049 } 01050 01051 // compute Dynamic lightmap Uv. 01052 static CUV uvDLM; 01053 if(_DLMContext) // (NB: Suppose BTB kill this test). 01054 { 01055 // compute UV with DLM context info. 01056 uvDLM.U= pc.getS()* _DLMContext->DLMUScale + _DLMContext->DLMUBias; 01057 uvDLM.V= pc.getT()* _DLMContext->DLMVScale + _DLMContext->DLMVBias; 01058 } 01059 else 01060 { 01061 // just set UV so the vertex point to a black pixel (see CTextureDLM). 01062 uvDLM.U= 1; 01063 uvDLM.V= 1; 01064 } 01065 01066 // If not VertexProgram (NB: Suppose BTB kill this test). 01067 if( !CLandscapeGlobals::VertexProgramEnabled ) 01068 { 01069 // Set Pos. Set it local to the current center of landscape 01070 *(CVector*)CurVBPtr= pVert->Src->Pos - CLandscapeGlobals::PZBModelPosition; 01071 // Set Uvs. 01072 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.TexCoordOff0)= uv; 01073 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.TexCoordOff1)= uvDLM; 01074 // Set default color. 01075 static CRGBA col(255,255,255,255); 01076 *(CRGBA*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.ColorOff)= col; 01077 } 01078 else 01079 { 01080 // Else must setup Vertex program inputs 01081 // v[0]== StartPos. 01082 *(CVector*)CurVBPtr= pVert->Src->StartPos; 01083 // v[8]== Tex0 01084 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.TexCoordOff0)= uv; 01085 // v[9]== Tex1 01086 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.TexCoordOff1)= uvDLM; 01087 01088 // v[10]== GeomInfo. 01089 static CUV geomInfo; 01090 geomInfo.U= pVert->Src->MaxFaceSize * CLandscapeGlobals::OORefineThreshold; 01091 geomInfo.V= pVert->Src->MaxNearLimit; 01092 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.GeomInfoOff)= geomInfo; 01093 01094 // v[11]== EndPos - StartPos 01095 *(CVector*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.DeltaPosOff)= 01096 pVert->Src->EndPos - pVert->Src->StartPos; 01097 01098 // v[12]== Alpha information 01099 // Hopefully, fillVBFar1Only() is called each Time the Far1 change, in preRender(). 01100 // So TransitionSqrMin and OOTransitionSqrDelta in CPath are valid. 01101 geomInfo.U= TransitionSqrMin; 01102 geomInfo.V= OOTransitionSqrDelta; 01103 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentFar1VBInfo.AlphaInfoOff)= geomInfo; 01104 01105 } 01106 } |
|
Fill a CPatchQuadBlock, from its required PatchId. nlassert(PatchId size is less than NL_PATCH_BLOCK_MAX_QUAD) Definition at line 460 of file patch.cpp. References NL_PATCH_BLOCK_MAX_QUAD, NL_PATCH_BLOCK_MAX_VERTEX, nlassert, NL3D::CPatchBlockIdent::OrderS, NL3D::CPatchBlockIdent::OrderT, NL3D::CPatchBlockIdent::S0, NL3D::CPatchBlockIdent::S1, NL3D::CPatchBlockIdent::T0, NL3D::CPatchBlockIdent::T1, and uint. Referenced by NL3D::CLandscape::fillPatchQuadBlock().
00461 { 00462 CPatchBlockIdent &pbId= quadBlock.PatchBlockId; 00463 uint lenS= pbId.S1-pbId.S0; 00464 uint lenT= pbId.T1-pbId.T0; 00465 nlassert( pbId.OrderS==OrderS ); 00466 nlassert( pbId.OrderT==OrderT ); 00467 nlassert( pbId.S1<=OrderS ); 00468 nlassert( pbId.T1<=OrderT ); 00469 nlassert( pbId.S0<pbId.S1 ); 00470 nlassert( pbId.T0<pbId.T1 ); 00471 nlassert( lenS<=NL_PATCH_BLOCK_MAX_QUAD ); 00472 nlassert( lenT<=NL_PATCH_BLOCK_MAX_QUAD ); 00473 00474 // Fill vertices. 00475 uint s0= pbId.S0; 00476 uint t0= pbId.T0; 00477 // some preca. 00478 float startS0= (float)s0 / (float)(OrderS); 00479 float startT0= (float)t0 / (float)(OrderT); 00480 float ds= 1.0f/(float)(OrderS); 00481 float dt= 1.0f/(float)(OrderT); 00482 00483 // Parse all quads vertices corner. 00484 uint sl,tl; 00485 for(tl=0; tl<lenT+1; tl++) 00486 { 00487 float fs, ft; 00488 // compute t patch coordinates. 00489 ft= startT0 + (float)tl * dt ; 00490 for(sl=0; sl<lenS+1; sl++) 00491 { 00492 // compute s patch coordinates. 00493 fs= startS0 + (float)sl * ds ; 00494 00495 // Must use computeContinousVertex, to ensure continous coordinate on patch edges 00496 quadBlock.Vertices[sl + tl*NL_PATCH_BLOCK_MAX_VERTEX]= computeContinousVertex(fs, ft); 00497 } 00498 } 00499 00500 } |
|
Definition at line 1185 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), fillTileVertexVB(), and NL3D::CTessNodeList::Next. Referenced by fillVB(), and preRender().
01186 { 01187 // Traverse the vertList. 01188 CTessNearVertex *pVert; 01189 for(pVert= vertList.begin(); pVert; pVert= (CTessNearVertex*)pVert->Next) 01190 { 01191 fillTileVertexVB(pVert); 01192 } 01193 } |
|
Definition at line 1109 of file patch_render.cpp. References NL3D::CTessVertex::EndPos, NL3D::CTessNearVertex::Index, NL3D::CTessVertex::MaxFaceSize, NL3D::CTessVertex::MaxNearLimit, nlassert, NL3D::CTessVertex::Pos, NL3D::CTessNearVertex::PUv0, NL3D::CTessNearVertex::PUv1, NL3D::CTessNearVertex::PUv2, NL3D::CTessNearVertex::Src, NL3D::CTessVertex::StartPos, NLMISC::CUV::U, uint8, and NLMISC::CUV::V. Referenced by checkFillVertexVBNear(), and fillTileVertexListVB().
01110 { 01111 // The Buffers must have been locked 01112 nlassert(CLandscapeGlobals::CurrentTileVBAllocator); 01113 nlassert(CLandscapeGlobals::CurrentTileVBAllocator->bufferLocked()); 01114 // VBInfo must be OK. 01115 nlassert(!CLandscapeGlobals::CurrentTileVBAllocator->reallocationOccurs()); 01116 01117 static uint8 *CurVBPtr; 01118 // Compute/build the new vertex. 01119 CurVBPtr= (uint8*)CLandscapeGlobals::CurrentTileVBInfo.VertexCoordPointer; 01120 CurVBPtr+= pVert->Index * CLandscapeGlobals::CurrentTileVBInfo.VertexSize; 01121 01122 01123 // NB: the filling order of data is important, for AGP write combiners. 01124 01125 // If not VertexProgram (NB: Suppose BTB kill this test). 01126 if( !CLandscapeGlobals::VertexProgramEnabled ) 01127 { 01128 // Set Pos. Set it local to the current center of landscape 01129 *(CVector*)CurVBPtr= pVert->Src->Pos - CLandscapeGlobals::PZBModelPosition; 01130 // Set Uvs. 01131 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.TexCoordOff0)= pVert->PUv0; 01132 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.TexCoordOff1)= pVert->PUv1; 01133 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.TexCoordOff2)= pVert->PUv2; 01134 } 01135 else 01136 { 01137 // Else must setup Vertex program inputs 01138 // v[0]== StartPos. 01139 *(CVector*)CurVBPtr= pVert->Src->StartPos; 01140 // v[8]== Tex0 01141 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.TexCoordOff0)= pVert->PUv0; 01142 // v[9]== Tex1 01143 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.TexCoordOff1)= pVert->PUv1; 01144 // v[13]== Tex2 01145 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.TexCoordOff2)= pVert->PUv2; 01146 01147 // v[10]== GeomInfo. 01148 static CUV geomInfo; 01149 geomInfo.U= pVert->Src->MaxFaceSize * CLandscapeGlobals::OORefineThreshold; 01150 geomInfo.V= pVert->Src->MaxNearLimit; 01151 *(CUV*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.GeomInfoOff)= geomInfo; 01152 01153 // v[11]== EndPos - StartPos 01154 *(CVector*)(CurVBPtr + CLandscapeGlobals::CurrentTileVBInfo.DeltaPosOff)= 01155 pVert->Src->EndPos - pVert->Src->StartPos; 01156 } 01157 } |
|
Definition at line 1198 of file patch_render.cpp. References NL3D::CTessBlock::FarVertexList, fillFar0VertexListVB(), fillFar1VertexListVB(), fillTileVertexListVB(), MasterBlock, NL3D::CTessBlock::NearVertexList, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, NL3D::CTessBlock::visibleFar0(), NL3D::CTessBlock::visibleFar1(), and NL3D::CTessBlock::visibleTile(). Referenced by fillVBIfVisible(), preRender(), and updateClipPatchVB().
01199 { 01200 // Fill Far0. 01201 //======= 01202 // fill only if no reallcoation occurs 01203 if(Far0>0 && !CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs() ) 01204 { 01205 // Fill Far0 VB. 01206 fillFar0VertexListVB(MasterBlock.FarVertexList); 01207 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01208 { 01209 CTessBlock &tblock= TessBlocks[i]; 01210 // fill only if tblock visible. 01211 if( tblock.visibleFar0() ) 01212 fillFar0VertexListVB(tblock.FarVertexList); 01213 } 01214 } 01215 else if(Far0==0 && !CLandscapeGlobals::CurrentTileVBAllocator->reallocationOccurs() ) 01216 { 01217 // Fill Tile VB. 01218 // No Tiles in MasterBlock!! 01219 // Traverse the TessBlocks to add vertices. 01220 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01221 { 01222 CTessBlock &tblock= TessBlocks[i]; 01223 // fill only if tblock visible. 01224 if( tblock.visibleTile() ) 01225 fillTileVertexListVB(tblock.NearVertexList); 01226 } 01227 } 01228 01229 // Fill Far1. 01230 //======= 01231 if(Far1>0 && !CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs() ) 01232 { 01233 // Fill VB. 01234 fillFar1VertexListVB(MasterBlock.FarVertexList); 01235 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01236 { 01237 CTessBlock &tblock= TessBlocks[i]; 01238 // fill only if tblock visible. 01239 if( tblock.visibleFar1() ) 01240 fillFar1VertexListVB(tblock.FarVertexList); 01241 } 01242 } 01243 01244 } |
|
Definition at line 1256 of file patch_render.cpp. References NL3D::CTessBlock::FarVertexList, fillFar0VertexListVB(), MasterBlock, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and NL3D::CTessBlock::visibleFar0(). Referenced by preRender().
01257 { 01258 if(Far0>0 && !CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs() ) 01259 { 01260 // Fill Far0 VB. 01261 fillFar0VertexListVB(MasterBlock.FarVertexList); 01262 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01263 { 01264 CTessBlock &tblock= TessBlocks[i]; 01265 // fill only if tblock visible. 01266 if( tblock.visibleFar0() ) 01267 fillFar0VertexListVB(tblock.FarVertexList); 01268 } 01269 } 01270 } |
|
Definition at line 1274 of file patch_render.cpp. References NL3D::CTessBlock::FarVertexList, fillFar1VertexListVB(), MasterBlock, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and NL3D::CTessBlock::visibleFar1(). Referenced by preRender().
01275 { 01276 if(Far1>0 && !CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs() ) 01277 { 01278 // Fill VB. 01279 fillFar1VertexListVB(MasterBlock.FarVertexList); 01280 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01281 { 01282 CTessBlock &tblock= TessBlocks[i]; 01283 // fill only if tblock visible. 01284 if( tblock.visibleFar1() ) 01285 fillFar1VertexListVB(tblock.FarVertexList); 01286 } 01287 } 01288 } |
|
Definition at line 1720 of file patch_render.cpp. References NL3D::CTessBlock::FarVertexList, fillFar0DLMUvOnlyVertexListVB(), fillFar1DLMUvOnlyVertexListVB(), MasterBlock, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, NL3D::CTessBlock::visibleFar0(), and NL3D::CTessBlock::visibleFar1(). Referenced by addRefDLMContext(), and decRefDLMContext().
01721 { 01722 // Do it for Far0. 01723 if(Far0>0 && !CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs() ) 01724 { 01725 // Fill Far0 VB. 01726 fillFar0DLMUvOnlyVertexListVB(MasterBlock.FarVertexList); 01727 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01728 { 01729 CTessBlock &tblock= TessBlocks[i]; 01730 // fill only if tblock visible. 01731 if( tblock.visibleFar0() ) 01732 fillFar0DLMUvOnlyVertexListVB(tblock.FarVertexList); 01733 } 01734 } 01735 01736 // Do it for Far1. 01737 if(Far1>0 && !CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs() ) 01738 { 01739 // Fill VB. 01740 fillFar1DLMUvOnlyVertexListVB(MasterBlock.FarVertexList); 01741 for(sint i=0; i<(sint)TessBlocks.size(); i++) 01742 { 01743 CTessBlock &tblock= TessBlocks[i]; 01744 // fill only if tblock visible. 01745 if( tblock.visibleFar1() ) 01746 fillFar1DLMUvOnlyVertexListVB(tblock.FarVertexList); 01747 } 01748 } 01749 } |
|
Definition at line 1248 of file patch_render.cpp. References fillVB(), and isRenderClipped(). Referenced by NL3D::CLandscape::render().
01249 { 01250 if(isRenderClipped()==false) 01251 fillVB(); 01252 } |
|
For changing TileMaxSubdivision. force tesselation to be under tile.
Definition at line 2022 of file patch.cpp. References NL3D::CTessFace::forceMergeAtTileLevel(), nlassert, Son0, and Son1. Referenced by NL3D::CZone::forceMergeAtTileLevel().
|
|
Create / init the vegetableBlock in the corresponding TessBlock. TessBlocks must exist.
Definition at line 50 of file patch_vegetable.cpp. References _DLMContext, NL3D::CLandscape::_VegetableManager, NLMISC::CRGBAF::A, appendTileLightInfluences(), NLMISC::CRGBAF::B, NLMISC::clamp(), NL3D::CVegetableLightEx::computeCurrentColors(), NL3D::CPointLight::computeLinearAttenuation(), NL3D::CVegetableLightEx::Direction, NL3D::CPatchDLMContext::DLMUBias, NL3D::CPatchDLMContext::DLMUScale, NL3D::CPatchDLMContext::DLMVBias, NL3D::CPatchDLMContext::DLMVScale, NL3D::CLandscapeVegetableBlockCreateContext::eval(), NL3D::CBezierPatch::eval(), NL3D::CBezierPatch::evalNormal(), NLMISC::CRGBAF::G, NL3D::CVegetable::generateGroupBiLinear(), NL3D::CVegetable::generateInstance(), getLandscape(), NL3D::CPointLight::getPosition(), getTileLumelmapPrecomputed(), NL3D::CLandscape::getTileVegetableDesc(), NL3D::CTileVegetableDesc::getVegetableList(), NL3D::CTileVegetableDesc::getVegetableSeed(), NL3D::CPatchDLMContext::MaxU8, NL3D::CPatchDLMContext::MaxV8, min, NL3D::CPatchDLMContext::MinU8, NL3D::CPatchDLMContext::MinV8, NL3D_PATCH_TILE_AREA, NL3D_VEGETABLE_BLOCK_ELTDIST, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE_SHIFT, nlassert, NLMISC::CVector::normalize(), NLMISC::CMatrix::normalize(), NL3D::CVegetableLightEx::NumLights, NLMISC::OptFastFloor(), NL3D::CVegetableLightEx::PointLight, NL3D::CVegetableLightEx::PointLightFactor, NLMISC::CRGBAF::R, NL3D::CVegetable::reserveIgAddInstances(), NL3D::CVegetableManager::reserveIgCompile(), NLMISC::CMatrix::setPos(), NLMISC::CMatrix::setRot(), sint, size, Tiles, NL3D::CVegetableUV8::U, NLMISC::CUV::U, uint, uint8, unpackIntoCache(), NL3D::CVegetableUV8::V, NLMISC::CUV::V, NL3D::CVegetableInstanceGroup::VegetableLightEx, x, NLMISC::CVector::x, y, and NLMISC::CVector::y. Referenced by NL3D::CLandscapeVegetableBlock::createVegetableIGForDistType().
00052 { 00053 uint i; 00054 00055 // Get tile infos for vegetable 00056 // ========================= 00057 00058 // Get the state for this vegetable tile 00059 CTileElement::TVegetableInfo vegetWaterState= Tiles[tt * OrderS + ts].getVegetableState(); 00060 // If vegetable disabled, skip! 00061 if(vegetWaterState == CTileElement::VegetableDisabled) 00062 return; 00063 00064 // get the tileId under this tile (<=> the tile material) 00065 uint tileId= Tiles[tt * OrderS + ts].Tile[0]; 00066 00067 // get list of vegetable for this tile, and for hist distanceType category. 00068 const CTileVegetableDesc &tileVegetDesc= getLandscape()->getTileVegetableDesc(tileId); 00069 const std::vector<CVegetable> &vegetableList= tileVegetDesc.getVegetableList(distType); 00070 uint distAddSeed= tileVegetDesc.getVegetableSeed(distType); 00071 uint numVegetable= vegetableList.size(); 00072 00073 // If no vegetables at all, skip. 00074 if(numVegetable==0) 00075 return; 00076 00077 // compute approximate tile position and normal: get the middle 00078 float tileU= (ts + 0.5f) / (float)OrderS; 00079 float tileV= (tt + 0.5f) / (float)OrderT; 00080 CBezierPatch *bpatch= unpackIntoCache(); 00081 // Get approximate position for the tile (usefull for noise). NB: eval() is faster than computeVertex(). 00082 CVector tilePos= bpatch->eval(tileU, tileV); 00083 // Get also the normal used for all instances on this tile (not precise, 00084 // don't take noise into account, but faster). 00085 CVector tileNormal= bpatch->evalNormal(tileU, tileV); 00086 00087 // Compute also position on middle of 4 edges of this tile, for generateGroupBiLinear(). 00088 CVector tilePosBiLinear[4]; 00089 float OOos= 1.0f / OrderS; 00090 float OOot= 1.0f / OrderT; 00091 tilePosBiLinear[0]= bpatch->eval( (ts + 0.0f) * OOos, (tt + 0.5f) * OOot); 00092 tilePosBiLinear[1]= bpatch->eval( (ts + 1.0f) * OOos, (tt + 0.5f) * OOot); 00093 tilePosBiLinear[2]= bpatch->eval( (ts + 0.5f) * OOos, (tt + 0.0f) * OOot); 00094 tilePosBiLinear[3]= bpatch->eval( (ts + 0.5f) * OOos, (tt + 1.0f) * OOot); 00095 00096 00097 // compute a rotation matrix with the normal 00098 CMatrix matInstance; 00099 matInstance.setRot(CVector::I, CVector::J, tileNormal); 00100 // must normalize the matrix. use the vector which is the most orthogonal to tileNormal 00101 // If tileNormal is much more a J vector, then use plane (I,tileNormal), and vice-versa 00102 if(fabs(tileNormal.y) > fabs(tileNormal.x)) 00103 matInstance.normalize(CMatrix::ZXY); 00104 else 00105 matInstance.normalize(CMatrix::ZYX); 00106 00107 00108 // prepare color / lighting 00109 // ========================= 00110 00111 // say that ambient never change. VegetableManager handle the ambient and diffuse itself (for precomputeLighting) 00112 CRGBAF ambientF= CRGBAF(1,1,1,1); 00113 00114 // Compute the tileLightmap (not modified by tileColor). 00115 static uint8 tileLumelmap[NL_LUMEL_BY_TILE * NL_LUMEL_BY_TILE]; 00116 getTileLumelmapPrecomputed(ts, tt, tileLumelmap, NL_LUMEL_BY_TILE); 00117 // compute diffuse color by substracting from ambient. 00118 CRGBAF diffuseColorF[NL_LUMEL_BY_TILE * NL_LUMEL_BY_TILE]; 00119 // TODO_VEGET_OPTIM: optimize this. 00120 // For all lumel of this tile. 00121 for(i= 0; i<NL_LUMEL_BY_TILE*NL_LUMEL_BY_TILE; i++) 00122 { 00123 // mul by 2, because shade is done twice here: by vertex, and by landscape. 00124 sint tileLumel= 2*tileLumelmap[i]; 00125 tileLumel= min(tileLumel, 255); 00126 float tlf= tileLumel / 255.f; 00127 diffuseColorF[i].R= tlf; 00128 diffuseColorF[i].G= tlf; 00129 diffuseColorF[i].B= tlf; 00130 diffuseColorF[i].A= 1; 00131 } 00132 00133 // Compute The CVegetableLightEx, adding pointLight effect to vegetation 00134 // First get pointLight at this tiles. 00135 static vector<CPointLightInfluence> lightList; 00136 lightList.clear(); 00137 appendTileLightInfluences( CUV(tileU, tileV), lightList); 00138 // for each light, modulate the factor of influence 00139 for(i=0; i<lightList.size();i++) 00140 { 00141 CPointLight *pl= lightList[i].PointLight; 00142 // compute the attenuation to the pos of the tile 00143 float att= pl->computeLinearAttenuation(tilePos); 00144 // modulate the influence with this factor 00145 lightList[i].BkupInfluence= lightList[i].Influence; 00146 lightList[i].Influence*= att; 00147 } 00148 // sort the light by influence 00149 sort(lightList.begin(), lightList.end()); 00150 // Setup the vegetLex directly in the ig. 00151 CVegetableLightEx &vegetLex= vegetIg->VegetableLightEx; 00152 // take only 2 first, computing direction to tilePos and computing attenuation. 00153 vegetLex.NumLights= min((uint)CVegetableLightEx::MaxNumLight, (uint)lightList.size()); 00154 for(i=0;i<vegetLex.NumLights;i++) 00155 { 00156 // WARNING: can C cast to CPointLightNamed here because comes from CPatch::appendTileLightInfluences() only! 00157 CPointLightNamed *pl= (CPointLightNamed*)(lightList[i].PointLight); 00158 // copy to vegetLex. 00159 vegetLex.PointLight[i]= pl; 00160 // get the attenuation 00161 vegetLex.PointLightFactor[i]= (uint)(256* lightList[i].Influence); 00162 // Setup the direction from pointLight. 00163 vegetLex.Direction[i]= tilePos - pl->getPosition(); 00164 vegetLex.Direction[i].normalize(); 00165 } 00166 // compute now the current colors of the vegetLex. 00167 vegetLex.computeCurrentColors(); 00168 00169 00170 // Compute Dynamic Lightmap UV for this tile. 00171 nlassert(_DLMContext); 00172 CUV dlmUV; 00173 // get coordinate in 0..1 in texture. 00174 dlmUV.U= _DLMContext->DLMUBias + _DLMContext->DLMUScale * tileU; 00175 dlmUV.V= _DLMContext->DLMVBias + _DLMContext->DLMVScale * tileV; 00176 // get coordinate in 0..255. 00177 CVegetableUV8 dlmUV8; 00178 dlmUV8.U= (uint8)NLMISC::OptFastFloor(dlmUV.U * 255 + 0.5f); 00179 dlmUV8.V= (uint8)NLMISC::OptFastFloor(dlmUV.V * 255 + 0.5f); 00180 // bound them, ensuring 8Bits UV "uncompressed" by driver are in the lightmap area. 00181 clamp(dlmUV8.U, _DLMContext->MinU8, _DLMContext->MaxU8); 00182 clamp(dlmUV8.V, _DLMContext->MinV8, _DLMContext->MaxV8); 00183 00184 00185 // for all vegetable of this list, generate instances. 00186 // ========================= 00187 00188 // Get an array for each vegetable (static for speed). 00189 typedef std::vector<NLMISC::CVector2f> TPositionVector; 00190 static std::vector<TPositionVector> instanceUVArray; 00191 // realloc if necessary. 00192 if(instanceUVArray.size() < numVegetable) 00193 { 00194 // clean. 00195 contReset(instanceUVArray); 00196 // realloc. 00197 instanceUVArray.resize(numVegetable); 00198 } 00199 00200 // First, for each vegetable, generate the number of instance to create, and their relative position. 00201 for(i= 0; i<numVegetable; i++) 00202 { 00203 // get the vegetable 00204 const CVegetable &veget= vegetableList[i]; 00205 00206 // generate instance for this vegetable. 00207 veget.generateGroupBiLinear(tilePos, tilePosBiLinear, tileNormal, NL3D_PATCH_TILE_AREA, i + distAddSeed, instanceUVArray[i]); 00208 } 00209 00210 // Then, now that we kno how many instance to generate for each vegetable, reserve space. 00211 CVegetableInstanceGroupReserve vegetIgReserve; 00212 for(i= 0; i<numVegetable; i++) 00213 { 00214 // get the vegetable 00215 const CVegetable &veget= vegetableList[i]; 00216 00217 // reseve instance space for this vegetable. 00218 // instanceUVArray[i].size() is the number of instances to create. 00219 veget.reserveIgAddInstances(vegetIgReserve, (CVegetable::TVegetableWater)vegetWaterState, instanceUVArray[i].size()); 00220 } 00221 // actual reseve memory of the ig. 00222 getLandscape()->_VegetableManager->reserveIgCompile(vegetIg, vegetIgReserve); 00223 00224 00225 // generate the instances for all the vegetables. 00226 for(i= 0; i<numVegetable; i++) 00227 { 00228 // get the vegetable 00229 const CVegetable &veget= vegetableList[i]; 00230 00231 // get the relatives position of the instances 00232 std::vector<CVector2f> &instanceUV= instanceUVArray[i]; 00233 00234 // For all instance, generate the real instances. 00235 for(uint j=0; j<instanceUV.size(); j++) 00236 { 00237 // generate the position in world Space. 00238 // instanceUV is in [0..1] interval, which maps to a tile, so explode to the patch 00239 CVector instancePos; 00240 vbCreateCtx.eval(ts, tt, instanceUV[j].x, instanceUV[j].y, instancePos); 00241 // NB: use same normal for rotation for all instances in a same tile. 00242 matInstance.setPos( instancePos ); 00243 00244 // peek color into the lightmap. 00245 sint lumelS= NLMISC::OptFastFloor(instanceUV[j].x * NL_LUMEL_BY_TILE); 00246 sint lumelT= NLMISC::OptFastFloor(instanceUV[j].y * NL_LUMEL_BY_TILE); 00247 clamp(lumelS, 0, NL_LUMEL_BY_TILE-1); 00248 clamp(lumelT, 0, NL_LUMEL_BY_TILE-1); 00249 00250 // generate the instance of the vegetable 00251 veget.generateInstance(vegetIg, matInstance, ambientF, 00252 diffuseColorF[ (lumelT<<NL_LUMEL_BY_TILE_SHIFT) + lumelS ], 00253 (distType+1) * NL3D_VEGETABLE_BLOCK_ELTDIST, (CVegetable::TVegetableWater)vegetWaterState, dlmUV8); 00254 } 00255 } 00256 } |
|
|
Definition at line 962 of file patch_noise.cpp. References _CornerSmoothFlag, nlassert, and uint. Referenced by computeNearBlockLightmap(), computeNormalCornerSmooth(), and NL3D::CZone::retrieve().
00963 { 00964 nlassert(corner<=3); 00965 uint mask= 1<<corner; 00966 return (_CornerSmoothFlag& mask)!=0; 00967 } |
|
Definition at line 659 of file patch.h. References BaseVertices, and uint. Referenced by NL3D::CZoneCornerSmoother::computeAllCornerSmoothFlags().
00660 { 00661 return BaseVertices[corner]; 00662 } |
|
Definition at line 1655 of file patch_lightmap.cpp. References NL3D::CZone::_PointLightArray, NLMISC::CRGBA::avg2RGBOnly(), NL3D::CPointLightNamedArray::getPointLights(), getZone(), uint, x, and y. Referenced by addTileLightmapEdgeWithTLI(), addTileLightmapPixelWithTLI(), and addTileLightmapWithTLI().
01656 { 01657 // Get ref on array of PointLightNamed. 01658 if( getZone()->_PointLightArray.getPointLights().size() >0 ) 01659 { 01660 // get coord of the tessBlock 01661 uint tbs= ts>>1; 01662 uint tbt= tt>>1; 01663 // get tile id local to tessBlock. 01664 uint tls= ts-(tbs<<1); 01665 uint tlt= tt-(tbt<<1); 01666 01667 // For each corner of the tessBlock, compute lighting with pointLights. 01668 CRGBA tbCorners[4]; 01669 for(uint y=0;y<2;y++) 01670 { 01671 for(uint x=0;x<2;x++) 01672 { 01673 CRGBA &cornerCol= tbCorners[y*2+x]; 01674 cornerCol= getCurrentTLIColor(tbs+x, tbt+y); 01675 } 01676 } 01677 01678 // Then biLinear to tile Level (tessBlock==2x2 tiles). 01679 CRGBA tbEdges[4]; 01680 CRGBA tbMiddle; 01681 // left. 01682 tbEdges[0].avg2RGBOnly(tbCorners[0], tbCorners[2]); 01683 // bottom 01684 tbEdges[1].avg2RGBOnly(tbCorners[2], tbCorners[3]); 01685 // right 01686 tbEdges[2].avg2RGBOnly(tbCorners[1], tbCorners[3]); 01687 // up 01688 tbEdges[3].avg2RGBOnly(tbCorners[0], tbCorners[1]); 01689 // middle. 01690 tbMiddle.avg2RGBOnly(tbEdges[0], tbEdges[2]); 01691 01692 // just copy result according to tile pos in tessBlock. 01693 if(tlt==0) 01694 { 01695 if(tls==0) 01696 { 01697 corners[0]= tbCorners[0]; 01698 corners[1]= tbEdges[3]; 01699 corners[2]= tbEdges[0]; 01700 corners[3]= tbMiddle; 01701 } 01702 else 01703 { 01704 corners[0]= tbEdges[3]; 01705 corners[1]= tbCorners[1]; 01706 corners[2]= tbMiddle; 01707 corners[3]= tbEdges[2]; 01708 } 01709 } 01710 else 01711 { 01712 if(tls==0) 01713 { 01714 corners[0]= tbEdges[0]; 01715 corners[1]= tbMiddle; 01716 corners[2]= tbCorners[2]; 01717 corners[3]= tbEdges[1]; 01718 } 01719 else 01720 { 01721 corners[0]= tbMiddle; 01722 corners[1]= tbEdges[2]; 01723 corners[2]= tbEdges[1]; 01724 corners[3]= tbCorners[3]; 01725 } 01726 } 01727 } 01728 else 01729 { 01730 // Just fill with 0s. 01731 corners[0]= CRGBA::Black; 01732 corners[1]= CRGBA::Black; 01733 corners[2]= CRGBA::Black; 01734 corners[3]= CRGBA::Black; 01735 } 01736 } |
|
Definition at line 395 of file patch.h. References ErrorSize.
00395 {return ErrorSize;} |
|
Definition at line 396 of file patch.h. References sint. Referenced by NL3D::CLandscape::render().
00396 {return Far0;} |
|
Definition at line 397 of file patch.h. References sint. Referenced by NL3D::CLandscape::render().
00397 {return Far1;} |
|
|
Get the lumel under the position.
Definition at line 1499 of file patch_lightmap.cpp. References NLMISC::clamp(), getTileLumelmapPixelPrecomputed(), NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE_SHIFT, NLMISC::OptFastFloor(), sint, NLMISC::CUV::U, uint8, NLMISC::CUV::V, and w. Referenced by NL3D::CLandscape::getLumel().
01500 { 01501 // compute tile coord and lumel coord. 01502 sint ts, tt; 01503 // get in lumel coord. 01504 sint w= (OrderS<<NL_LUMEL_BY_TILE_SHIFT); 01505 sint h= (OrderT<<NL_LUMEL_BY_TILE_SHIFT); 01506 // fastFloor: use a precision of 256 to avoid doing OptFastFloorBegin. 01507 // add 128, to round and get cneter of lumel. 01508 ts= NLMISC::OptFastFloor(uv.U* (w<<8) + 128); ts>>=8; 01509 tt= NLMISC::OptFastFloor(uv.V* (h<<8) + 128); tt>>=8; 01510 clamp(ts, 0, w-1); 01511 clamp(tt, 0, h-1); 01512 // get the lumel 01513 uint8 ret; 01514 getTileLumelmapPixelPrecomputed(ts>>NL_LUMEL_BY_TILE_SHIFT, tt>>NL_LUMEL_BY_TILE_SHIFT, 01515 ts&(NL_LUMEL_BY_TILE-1), tt&(NL_LUMEL_BY_TILE-1), ret); 01516 01517 return ret; 01518 } |
|
Definition at line 465 of file patch.h. References _NextRdrFar0. Referenced by NL3D::CLandscape::render().
00465 {return _NextRdrFar0;} |
|
Definition at line 467 of file patch.h. References _NextRdrFar1. Referenced by NL3D::CLandscape::render().
00467 {return _NextRdrFar1;} |
|
For lighting update, get Next (CiruclarList). If ==this, then list is empty.
Definition at line 750 of file patch.h. References _ULNearNext. Referenced by NL3D::CLandscape::unlinkPatchFromNearUL(), and NL3D::CLandscape::updateLightingTextureNear().
00750 {return _ULNearNext;} |
|
get the number of Near TessBlocks. Actually OrderS/2*OrderT/2.
Definition at line 753 of file patch.h. References NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by NL3D::CLandscape::updateLightingTextureNear().
00753 {return TessBlocks.size();} |
|
Definition at line 738 of file patch.cpp. References FVMasterBlock, FVTessBlock, FVTessBlockEdge, NL3D::CParamCoord::S, NL3D::CParamCoord::T, type, and uint.
00739 { 00740 uint tboS= (uint)(OrderS>>1); 00741 uint tboT= (uint)(OrderT>>1); 00742 00743 // Coordinate of the tessblock (2*2 a tile!! so the >>1). 00744 uint ts= ((uint)pc.S * tboS) / 0x8000; 00745 uint tt= ((uint)pc.T * tboT) / 0x8000; 00746 numtb= tt*tboS + ts; 00747 00748 bool edgeS= (ts*0x8000) == ((uint)pc.S * tboS); 00749 bool edgeT= (tt*0x8000) == ((uint)pc.T * tboT); 00750 00751 // Does this vertex lies on a corner of a TessBlock? 00752 if(edgeS && edgeT) 00753 type= FVMasterBlock; 00754 // Does this vertex lies on a edge of a TessBlock? 00755 else if(edgeS || edgeT) 00756 type= FVTessBlockEdge; 00757 // Else it lies exclusively IN a TessBlock. 00758 else 00759 type= FVTessBlock; 00760 00761 } |
|
Definition at line 722 of file patch.cpp. References NL3D::CTessFace::PVBase, NL3D::CTessFace::PVLeft, NL3D::CTessFace::PVRight, NL3D::CParamCoord::S, NL3D::CParamCoord::T, and uint. Referenced by appendFaceToRenderList(), appendFaceToTileRenderList(), appendFarVertexToRenderList(), extendTessBlockWithEndPos(), removeFaceFromRenderList(), removeFaceFromTileRenderList(), and removeFarVertexFromRenderList().
00723 { 00724 // To which tessBlocks link the face? 00725 // compute an approx middle of the face. 00726 CParamCoord edgeMid(face->PVLeft, face->PVRight); 00727 CParamCoord middle(edgeMid, face->PVBase); 00728 // Coordinate of the tessblock (2*2 a tile!! so the >>1). 00729 uint ts= ((uint)middle.S * (uint)(OrderS>>1)) / 0x8000; 00730 uint tt= ((uint)middle.T * (uint)(OrderT>>1)) / 0x8000; 00731 uint numtb= tt*(uint)(OrderS>>1) + ts; 00732 00733 return numtb; 00734 } |
|
Definition at line 2196 of file patch.cpp. References sint, sint8, uint, and uint8. Referenced by NL3D::CPatchUVLocator::build().
|
|
|
|
Definition at line 398 of file patch.h. References uint16. Referenced by NL3D::CZoneLighter::buildZoneInformation(), NL3D::CLandscape::computeDynamicLighting(), NL3D::CZoneLighter::getNormal(), and NL3D::CZoneLighter::isLumelOnEdgeMustBeOversample().
00398 {return PatchId;} |
|
Definition at line 1751 of file patch.cpp. References nlassert, sint, Son0, and Son1. Referenced by bind().
01752 { 01753 nlassert(edge>=0 && edge<=3); 01754 01755 // See tessellation rules. 01756 if(OrderS>=OrderT) 01757 { 01758 if(edge==0 || edge==1) 01759 return Son0; 01760 else 01761 return Son1; 01762 } 01763 else 01764 { 01765 if(edge==0 || edge==3) 01766 return Son0; 01767 else 01768 return Son1; 01769 } 01770 } |
|
Definition at line 1773 of file patch.cpp. References nlassert, sint, Son0, Son1, NL3D::CTessFace::VBase, NL3D::CTessFace::VLeft, and NL3D::CTessFace::VRight. Referenced by bind().
01774 { 01775 // Return the vertex which is the start of edge. 01776 nlassert(edge>=0 && edge<=3); 01777 01778 // See tessellation rules. 01779 if(OrderS>=OrderT) 01780 { 01781 switch(edge) 01782 { 01783 case 0: return Son0->VRight; 01784 case 1: return Son0->VBase; 01785 case 2: return Son0->VLeft; 01786 case 3: return Son1->VBase; 01787 default: return NULL; 01788 } 01789 } 01790 else 01791 { 01792 switch(edge) 01793 { 01794 case 0: return Son0->VBase; 01795 case 1: return Son0->VLeft; 01796 case 2: return Son1->VBase; 01797 case 3: return Son0->VRight; 01798 default: return NULL; 01799 } 01800 } 01801 } |
|
Get the smooth flag for the n-th edge. Return true if this edge must by smoothed, false else. Definition at line 579 of file patch.h. References NL_PATCH_SMOOTH_FLAG_SHIFT, and uint. Referenced by NL3D::CZoneCornerSmoother::buildPatchBindInfo(), computeNearBlockLightmap(), computeNormalEdgeSmooth(), and NL3D::CZoneLighter::getNormal().
00580 { 00581 // Test it 00582 return ((Flags&(1<<(edge+NL_PATCH_SMOOTH_FLAG_SHIFT)))!=0); 00583 } |
|
From the current tesselation of this patch, and a UV in this patch, return tesselated position. Definition at line 579 of file patch.cpp. References NLMISC::clamp(), NL3D::CTessFace::getTesselatedPos(), Son0, Son1, NLMISC::CUV::U, and NLMISC::CUV::V. Referenced by NL3D::CLandscape::getTesselatedPos().
|
|
Get the lumel under the position.
Definition at line 2265 of file patch.cpp. References NLMISC::clamp(), NLMISC::OptFastFloor(), sint, Tiles, NLMISC::CUV::U, and NLMISC::CUV::V. Referenced by NL3D::CLandscape::getTileElement().
02266 { 02267 // compute tile coord and lumel coord. 02268 sint ts, tt; 02269 02270 // fastFloor: use a precision of 256 to avoid doing OptFastFloorBegin. 02271 // add 128, to round and get cneter of lumel. 02272 ts= NLMISC::OptFastFloor(uv.U* (OrderS<<8) + 128); ts>>=8; 02273 tt= NLMISC::OptFastFloor(uv.V* (OrderT<<8) + 128); tt>>=8; 02274 clamp(ts, 0, OrderS-1); 02275 clamp(tt, 0, OrderT-1); 02276 02277 // get the lumel 02278 return &(Tiles[ts+tt*OrderS]); 02279 } |
|
Definition at line 1191 of file patch_lightmap.cpp. References computeNearBlockLightmap(), computeTbTm(), NL3D::CLandscape::getTileLightMap(), NL3D::CZone::Landscape, NL3D::CTessBlock::LightMapId, NL3D::CTessBlock::LightMapRdrPass, NL3D::CTessBlock::LightMapRefCount, NL_TILE_LIGHTMAP_SIZE, nlassert, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint.
01192 { 01193 // TessBlocks must have been allocated. 01194 nlassert(TessBlocks.size()!=0); 01195 01196 // get what tessBlock to use. 01197 uint numtb, numtm; 01198 computeTbTm(numtb, numtm, ts, tt); 01199 CTessBlock &tessBlock= TessBlocks[numtb]; 01200 01201 // If the lightmap Id has not been computed, compute it. 01202 if(tessBlock.LightMapRefCount==0) 01203 { 01204 // Compute the lightmap texture, with help of TileColors, with neighboring info etc... 01205 CRGBA lightText[NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE]; 01206 computeNearBlockLightmap(ts&(~1), tt&(~1), lightText); 01207 01208 // Create a rdrPass with this texture, donlod to Driver etc... 01209 tessBlock.LightMapId= Zone->Landscape->getTileLightMap(lightText, rdrpass); 01210 01211 // store this rdrpass ptr. 01212 tessBlock.LightMapRdrPass= rdrpass; 01213 } 01214 01215 // We are using this 2x2 tiles lightmap. 01216 tessBlock.LightMapRefCount++; 01217 01218 01219 // get the rdrpass ptr of the tessBlock lightmap 01220 rdrpass= tessBlock.LightMapRdrPass; 01221 } |
|
Definition at line 1225 of file patch_lightmap.cpp. References computeTbTm(), NL3D::CLandscape::getTileLightMapUvInfo(), NL3D::CZone::Landscape, NL3D::CTessBlock::LightMapId, nlassert, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, uint, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NL3D::CTessFace::initTileUvLightmap().
01226 { 01227 // TessBlocks must have been allocated. 01228 nlassert(TessBlocks.size()!=0); 01229 01230 // get what tessBlock to use. 01231 uint numtb, numtm; 01232 computeTbTm(numtb, numtm, ts, tt); 01233 CTessBlock &tessBlock= TessBlocks[numtb]; 01234 01235 // Get the uvScaleBias for the tile 0,0 of the block. 01236 Zone->Landscape->getTileLightMapUvInfo(tessBlock.LightMapId, uvScaleBias); 01237 01238 // Must increment the bias, for the good tile in the 2x2 block Lightmap. 01239 uint tsDec= ts & 1; 01240 uint ttDec= tt & 1; 01241 uvScaleBias.x+= tsDec * uvScaleBias.z; 01242 uvScaleBias.y+= ttDec * uvScaleBias.z; 01243 } |
|
same as computeTileLightmapPixelPrecomputed, but brut result, not modified by colorTable. Actually used for Lightmap get interface. Definition at line 670 of file patch_lightmap.cpp. References CompressedLumels, NL3D::getUnpackLumelBlock(), NL_BLOCK_LUMEL_COMPRESSED_SIZE, s, t, uint, and uint8. Referenced by getLumel().
00671 { 00672 // Return the lumel 00673 dest= getUnpackLumelBlock (&(CompressedLumels[(ts + (tt*OrderS))*NL_BLOCK_LUMEL_COMPRESSED_SIZE]), s+(t<<2)); 00674 } |
|
Create / init the vegetableBlock in the corresponding TessBlock. TessBlocks must exist.
Definition at line 650 of file patch_lightmap.cpp. References buffer, CompressedLumels, NL_BLOCK_LUMEL_COMPRESSED_SIZE, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE_SHIFT, stride, uint, uint8, unpackLumelBlock(), x, and y. Referenced by generateTileVegetable().
00651 { 00652 // Unpack the lumels 00653 uint8 buffer[NL_LUMEL_BY_TILE*NL_LUMEL_BY_TILE]; 00654 unpackLumelBlock (buffer, &(CompressedLumels[(ts + (tt*OrderS))*NL_BLOCK_LUMEL_COMPRESSED_SIZE])); 00655 00656 // Retrun it 00657 uint x, y; 00658 for(y=0; y<NL_LUMEL_BY_TILE; y++) 00659 { 00660 for(x=0; x<NL_LUMEL_BY_TILE; x++) 00661 { 00662 // lumel 00663 dest[y*stride + x]= buffer[x+(y<<NL_LUMEL_BY_TILE_SHIFT)]; 00664 } 00665 } 00666 } |
|
Get number of TileMaterial created in this Patch.
Definition at line 788 of file patch.h. References MasterBlock, NL3D::CTessBlock::TileMaterialRefCount, and uint. Referenced by NL3D::CLandscape::render().
00788 {return MasterBlock.TileMaterialRefCount;} |
|
Definition at line 2040 of file patch.cpp. References NL3D::CLandscape::getTileRenderPass(), NL3D::CZone::Landscape, NL3D_TILE_PASS_ADD, NL3D_TILE_PASS_RGB0, NL3D_TILE_PASS_RGB1, NL3D_TILE_PASS_RGB2, nlassert, sint, and Tiles.
02041 { 02042 // All but lightmap. 02043 nlassert(pass==NL3D_TILE_PASS_RGB0 || pass==NL3D_TILE_PASS_RGB1 || pass==NL3D_TILE_PASS_RGB2 || 02044 pass==NL3D_TILE_PASS_ADD); 02045 02046 bool additive= (pass==NL3D_TILE_PASS_ADD); 02047 sint passNum= pass-NL3D_TILE_PASS_RGB0; 02048 // If additive, take the additve tile of bigger existing pass. 02049 if(additive) 02050 { 02051 // Default: take addtive of pass 0. 02052 passNum= 0; 02053 // If the pass1 is not empty, may take its tile. 02054 if(Tiles[tileId].Tile[1]!=0xFFFF) 02055 { 02056 passNum= 1; 02057 // If the pass2 is not empty, take its tile. 02058 if(Tiles[tileId].Tile[2]!=0xFFFF) 02059 passNum= 2; 02060 } 02061 } 02062 02063 sint tileNumber= Tiles[tileId].Tile[passNum]; 02064 if(tileNumber==0xFFFF) 02065 { 02066 // Display a "fake" only if pass 0. 02067 if(pass==NL3D_TILE_PASS_RGB0) 02068 return Zone->Landscape->getTileRenderPass(0xFFFF, false); 02069 // Else, this tile do not have such a pass (not a transition). 02070 return NULL; 02071 } 02072 else 02073 { 02074 // return still may be NULL, in additive case. 02075 return Zone->Landscape->getTileRenderPass(tileNumber, additive); 02076 } 02077 } |
|
Definition at line 345 of file patch_lightmap.cpp. References NL3D::CTileColor::Color565, NLMISC::CRGBA::set565(), sint, TileColors, and uint. Referenced by modulateTileLightmapEdgeWithTileColors(), modulateTileLightmapPixelWithTileColors(), and modulateTileLightmapWithTileColors().
00346 { 00347 for(sint i=0;i<4;i++) 00348 { 00349 CTileColor &tcol= TileColors[ (tt+(i>>1))*(OrderS+1) + (ts+(i&1)) ]; 00350 CRGBA &col= corners[i]; 00351 col.set565 (tcol.Color565); 00352 } 00353 } |
|
Definition at line 2080 of file patch.cpp. References alpha, NL3D::CLandscape::getTileUvScaleBiasRot(), NL3D::CZone::Landscape, NL3D_TILE_PASS_ADD, NL3D_TILE_PASS_RGB0, NL3D_TILE_PASS_RGB1, NL3D_TILE_PASS_RGB2, nlassert, sint, Tiles, type, uint8, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NL3D::CTessFace::initTileUvRGBA().
02081 { 02082 // All but lightmap. 02083 nlassert(pass==NL3D_TILE_PASS_RGB0 || pass==NL3D_TILE_PASS_RGB1 || pass==NL3D_TILE_PASS_RGB2 || 02084 pass==NL3D_TILE_PASS_ADD); 02085 02086 bool additive= (pass==NL3D_TILE_PASS_ADD); 02087 sint passNum= pass-NL3D_TILE_PASS_RGB0; 02088 // If additive, take the additve tile of bigger existing pass. 02089 if(additive) 02090 { 02091 // Default: take addtive of pass 0. 02092 passNum= 0; 02093 // If the pass1 is not empty, may take its tile. 02094 if(Tiles[tileId].Tile[1]!=0xFFFF) 02095 { 02096 passNum= 1; 02097 // If the pass2 is not empty, take its tile. 02098 if(Tiles[tileId].Tile[2]!=0xFFFF) 02099 passNum= 2; 02100 } 02101 } 02102 02103 sint tileNumber= Tiles[tileId].Tile[passNum]; 02104 if(tileNumber==0xFFFF) 02105 { 02106 // dummy... Should not be called here. 02107 orient= 0; 02108 uvScaleBias.x=0; 02109 uvScaleBias.y=0; 02110 uvScaleBias.z=1; 02111 is256x256=false; 02112 uvOff=0; 02113 } 02114 else 02115 { 02116 orient= Tiles[tileId].getTileOrient(passNum); 02117 Tiles[tileId].getTile256Info(is256x256, uvOff); 02118 CTile::TBitmap type; 02119 // If alpha wanted, return its UV info (works either for Alpha in Diffuse Pass and Alpha in Additive Pass) 02120 if(alpha) 02121 type= CTile::alpha; 02122 else 02123 { 02124 if(additive) 02125 type= CTile::additive; 02126 else 02127 type= CTile::diffuse; 02128 } 02129 02130 uint8 rotalpha; 02131 Zone->Landscape->getTileUvScaleBiasRot(tileNumber, type, uvScaleBias, rotalpha); 02132 02133 // Add the special rotation of alpha. 02134 if(alpha) 02135 orient= (orient+rotalpha)&3; 02136 } 02137 02138 } |
|
Definition at line 391 of file patch.h. Referenced by appendTileLightInfluences(), NL3D::CZoneLighter::buildZoneInformation(), computeDisplaceRawInteger(), NL3D::CLandscape::computeDynamicLighting(), getBindNeighbor(), getCurrentTileTLIColors(), NL3D::CZoneLighter::getNormal(), and NL3D::CTextureFar::rebuildPatch().
00391 {return Zone;} |
|
|
For lighting update, insert this before patchNext (CiruclarList). textNext must be !NULL.
Definition at line 1880 of file patch_lightmap.cpp. References _ULNearNext, _ULNearPrec, and nlassert. Referenced by NL3D::CLandscape::linkPatchToNearUL().
01881 { 01882 nlassert(patchNext); 01883 01884 // first, unlink others from me. NB: works even if _ULNearPrec==_ULNearNext==this. 01885 _ULNearNext->_ULNearPrec= _ULNearPrec; 01886 _ULNearPrec->_ULNearNext= _ULNearNext; 01887 // link to igNext. 01888 _ULNearNext= patchNext; 01889 _ULNearPrec= patchNext->_ULNearPrec; 01890 // link others to me. 01891 _ULNearNext->_ULNearPrec= this; 01892 _ULNearPrec->_ULNearNext= this; 01893 } |
|
Used by bind(). Search in the tesselation the first face which own the edge uv0-uv1. link it with linkTo, and return it. NULL if not found (obviously because not so tesselated) Definition at line 1834 of file patch.cpp. References NL3D::CTessFace::linkTessFaceWithEdge(), nlassert, Son0, and Son1. Referenced by bind().
|
|
Definition at line 1124 of file patch.cpp. References appendFaceToRenderList(), appendFarVertexToRenderList(), BaseFarVertices, BaseVertices, clearTessBlocks(), NL3D::CTessFace::computeSplitPoint(), computeVertex(), NL3D::CTessVertex::EndPos, ErrorSize, NL3D::CTessFace::FBase, NL3D::CTessFace::FLeft, NL3D::CTessFace::FRight, NL3D::CTessFace::FVBase, NL3D::CTessFace::FVLeft, NL3D::CTessFace::FVRight, getLandscape(), isRenderClipped(), NL3D::CTessFace::Level, NL3D::CTessVertex::MaxFaceSize, NL3D::CTessVertex::MaxNearLimit, NL3D::CLandscape::newTessFace(), nlassert, NL3D::CTessFace::Patch, NL3D::CTessFarVertex::PCoord, NL3D::CTessVertex::Pos, NL3D::CTessFace::PVBase, NL3D::CTessFace::PVLeft, NL3D::CTessFace::PVRight, resetMasterBlock(), NL3D::CParamCoord::setST(), NL3D::CTessFace::Size, Son0, Son1, NL3D::CTessFarVertex::Src, NL3D::CTessVertex::StartPos, NL3D::CTessFace::VBase, NL3D::CTessFace::VLeft, and NL3D::CTessFace::VRight. Referenced by compile().
01125 { 01126 CTessVertex *a= BaseVertices[0]; 01127 CTessVertex *b= BaseVertices[1]; 01128 CTessVertex *c= BaseVertices[2]; 01129 CTessVertex *d= BaseVertices[3]; 01130 01131 // Set positions. 01132 a->Pos= a->StartPos= a->EndPos= computeVertex(0,0); 01133 b->Pos= b->StartPos= b->EndPos= computeVertex(0,1); 01134 c->Pos= c->StartPos= c->EndPos= computeVertex(1,1); 01135 d->Pos= d->StartPos= d->EndPos= computeVertex(1,0); 01136 01137 // Init Far vetices. 01138 CTessFarVertex *fa= &BaseFarVertices[0]; 01139 CTessFarVertex *fb= &BaseFarVertices[1]; 01140 CTessFarVertex *fc= &BaseFarVertices[2]; 01141 CTessFarVertex *fd= &BaseFarVertices[3]; 01142 fa->Src= a; 01143 fa->PCoord.setST(0,0); 01144 fb->Src= b; 01145 fb->PCoord.setST(0,1); 01146 fc->Src= c; 01147 fc->PCoord.setST(1,1); 01148 fd->Src= d; 01149 fd->PCoord.setST(1,0); 01150 01151 // We don't have to fill the Far vertices VB here, because this patch is still not visible. 01152 // NB: we can't because we don't have any driver here. 01153 nlassert(isRenderClipped()==true); 01154 01155 01156 // Make Roots. 01157 /* 01158 Tesselation layout. For Square Face, and if OrderS>=OrderT. 01159 01160 A-------D 01161 |\ Son1 | 01162 | \ | 01163 | \ | 01164 | Son0 \| 01165 B-------C 01166 01167 For rectangles whith OrderT>OrderS. It is VERY IMPORTANT, for splitRectangular() reasons. 01168 01169 A-------D 01170 | Son0 /| 01171 | / | 01172 | / | 01173 |/ Son1 | 01174 B-------C 01175 01176 */ 01177 nlassert(Son0==NULL); 01178 nlassert(Son1==NULL); 01179 Son0= getLandscape()->newTessFace(); 01180 Son1= getLandscape()->newTessFace(); 01181 01182 // Son0. 01183 Son0->Patch= this; 01184 Son0->Level= 0; 01185 if(OrderS>=OrderT) 01186 { 01187 Son0->VBase= b; 01188 Son0->VLeft= c; 01189 Son0->VRight= a; 01190 Son0->FVBase= fb; 01191 Son0->FVLeft= fc; 01192 Son0->FVRight= fa; 01193 Son0->PVBase.setST(0, 1); 01194 Son0->PVLeft.setST(1, 1); 01195 Son0->PVRight.setST(0, 0); 01196 } 01197 else 01198 { 01199 Son0->VBase= a; 01200 Son0->VLeft= b; 01201 Son0->VRight= d; 01202 Son0->FVBase= fa; 01203 Son0->FVLeft= fb; 01204 Son0->FVRight= fd; 01205 Son0->PVBase.setST(0, 0); 01206 Son0->PVLeft.setST(0, 1); 01207 Son0->PVRight.setST(1, 0); 01208 } 01209 Son0->FBase= Son1; 01210 Son0->FLeft= NULL; 01211 Son0->FRight= NULL; 01212 // No tile info. 01213 Son0->Size= ErrorSize/2; 01214 Son0->computeSplitPoint(); 01215 01216 // Son1. 01217 Son1->Patch= this; 01218 Son1->Level= 0; 01219 if(OrderS>=OrderT) 01220 { 01221 Son1->VBase= d; 01222 Son1->VLeft= a; 01223 Son1->VRight= c; 01224 Son1->FVBase= fd; 01225 Son1->FVLeft= fa; 01226 Son1->FVRight= fc; 01227 Son1->PVBase.setST(1, 0); 01228 Son1->PVLeft.setST(0, 0); 01229 Son1->PVRight.setST(1, 1); 01230 } 01231 else 01232 { 01233 Son1->VBase= c; 01234 Son1->VLeft= d; 01235 Son1->VRight= b; 01236 Son1->FVBase= fc; 01237 Son1->FVLeft= fd; 01238 Son1->FVRight= fb; 01239 Son1->PVBase.setST(1, 1); 01240 Son1->PVLeft.setST(1, 0); 01241 Son1->PVRight.setST(0, 1); 01242 } 01243 Son1->FBase= Son0; 01244 Son1->FLeft= NULL; 01245 Son1->FRight= NULL; 01246 // No tile info. 01247 Son1->Size= ErrorSize/2; 01248 Son1->computeSplitPoint(); 01249 01250 01251 // Prepare the render list... 01252 clearTessBlocks(); 01253 resetMasterBlock(); 01254 appendFarVertexToRenderList(fa); 01255 appendFarVertexToRenderList(fb); 01256 appendFarVertexToRenderList(fc); 01257 appendFarVertexToRenderList(fd); 01258 appendFaceToRenderList(Son0); 01259 appendFaceToRenderList(Son1); 01260 01261 // Usefull for geomorph: Init 2 root faces MaxNearLimit, and MaxFaceSize 01262 // NB: since no geomorph is made on endpoints (StartPos==EndPos) of patchs, this is not usefull. 01263 // but it is important to ensure the VP or software geomorph won't crash with bad float values. 01264 // Init MaxFaceSize. 01265 Son0->VBase->MaxFaceSize= 1; 01266 Son0->VLeft->MaxFaceSize= 1; 01267 Son0->VRight->MaxFaceSize= 1; 01268 Son1->VBase->MaxFaceSize= 1; 01269 Son1->VLeft->MaxFaceSize= 1; 01270 Son1->VRight->MaxFaceSize= 1; 01271 // Init MaxNearLimit. 01272 Son0->VBase->MaxNearLimit= 1; 01273 Son0->VLeft->MaxNearLimit= 1; 01274 Son0->VRight->MaxNearLimit= 1; 01275 Son1->VBase->MaxNearLimit= 1; 01276 Son1->VLeft->MaxNearLimit= 1; 01277 Son1->VRight->MaxNearLimit= 1; 01278 01279 } |
|
Definition at line 508 of file patch_lightmap.cpp. References NL3D::bilinearColorAndModulatex2(), getTileTileColors(), NL_LUMEL_BY_TILE, stride, uint, x, and y. Referenced by computeTileLightmapEdge().
00509 { 00510 // Get the tileColors around this tile 00511 CRGBA corners[4]; 00512 getTileTileColors(ts, tt, corners); 00513 00514 // get coordinate according to edge. 00515 uint x=0,y=0; 00516 switch(edge) 00517 { 00518 case 0: x= 0; break; 00519 case 1: y= NL_LUMEL_BY_TILE-1; break; 00520 case 2: x= NL_LUMEL_BY_TILE-1; break; 00521 case 3: y= 0; break; 00522 }; 00523 00524 // For all lumel of the edge, bilinear. 00525 uint i; 00526 for(i=0; i<NL_LUMEL_BY_TILE; i++) 00527 { 00528 // if vertical edge 00529 if( (edge&1)==0 ) y= i; 00530 // else horizontal edge 00531 else x= i; 00532 00533 // manage inverse. 00534 uint where; 00535 if(inverse) where= (NL_LUMEL_BY_TILE-1)-i; 00536 else where= i; 00537 // compute this pixel, and modulate 00538 bilinearColorAndModulatex2(corners, x, y, dest[where*stride]); 00539 } 00540 } |
|
Definition at line 544 of file patch_lightmap.cpp. References NL3D::bilinearColorAndModulatex2(), getTileTileColors(), s, t, and uint. Referenced by computeTileLightmapPixel().
00545 { 00546 // Get the tileColors around this tile 00547 CRGBA corners[4]; 00548 getTileTileColors(ts, tt, corners); 00549 00550 // compute this pixel, and modulate 00551 bilinearColorAndModulatex2(corners, s, t, *dest); 00552 } |
|
Definition at line 488 of file patch_lightmap.cpp. References NL3D::bilinearColorAndModulatex2(), getTileTileColors(), NL_LUMEL_BY_TILE, stride, uint, x, and y. Referenced by computeTileLightmap().
00489 { 00490 // Get the tileColors around this tile 00491 CRGBA corners[4]; 00492 getTileTileColors(ts, tt, corners); 00493 00494 // For all lumel, bilinear. 00495 uint x, y; 00496 for(y=0; y<NL_LUMEL_BY_TILE; y++) 00497 { 00498 for(x=0; x<NL_LUMEL_BY_TILE; x++) 00499 { 00500 // compute this pixel, and modulate 00501 bilinearColorAndModulatex2(corners, x, y, dest[y*stride + x]); 00502 } 00503 } 00504 } |
|
Pack a 4x4 lumel block
Definition at line 261 of file patch_lightmap.cpp. References NL3D::NL3DDecompressLumelFactor0Case0, NL3D::NL3DDecompressLumelFactor0Case1, NL3D::NL3DDecompressLumelFactor1Case0, NL3D::NL3DDecompressLumelFactor1Case1, sint, uint, uint8, and value. Referenced by packShadowMap().
00262 { 00263 // Precalc the height values.. 00264 uint8 value[8]; 00265 00266 // For each value 00267 uint i; 00268 for (i=0; i<8; i++) 00269 { 00270 // Case 0 or 1 ? 00271 if (alpha0>alpha1) 00272 // Case 0 00273 value[i]=(NL3DDecompressLumelFactor0Case0[i]*alpha0+NL3DDecompressLumelFactor1Case0[i]*alpha1)/7; 00274 else 00275 { 00276 if (i<6) 00277 value[i]=(NL3DDecompressLumelFactor0Case1[i]*alpha0+NL3DDecompressLumelFactor1Case1[i]*alpha1)/5; 00278 else if (i==6) 00279 value[i]=0; 00280 else 00281 value[i]=255; 00282 } 00283 } 00284 00285 // Store alpha value 00286 dest[0]=alpha0; 00287 dest[1]=alpha1; 00288 00289 // Clear dest codes 00290 for (i=0; i<6; i++) 00291 { 00292 // Clear the code 00293 dest[2+i]=0; 00294 } 00295 00296 // For each original select the best 00297 uint codeOffset=2; 00298 sint codeShift=5; 00299 for (i=0; i<16; i++) 00300 { 00301 // Best dist and code 00302 uint bestDist=10000; 00303 uint8 bestCode=0; 00304 00305 // Calc distance 00306 for (uint code=0; code<8; code++) 00307 { 00308 // Distance from original value 00309 uint dist=abs ((sint)(source[i])-(sint)(value[code])); 00310 00311 // The best ? 00312 if (dist<bestDist) 00313 { 00314 // New best 00315 bestDist=dist; 00316 bestCode=code; 00317 } 00318 00319 // Perfect, stop searching 00320 if (dist==0) 00321 break; 00322 } 00323 00324 // Store the best 00325 if (codeShift>=0) 00326 dest[codeOffset]|=bestCode<<codeShift; 00327 else 00328 { 00329 dest[codeOffset]|=bestCode>>(-codeShift); 00330 dest[codeOffset+1]|=bestCode<<(8+codeShift); 00331 } 00332 00333 00334 // Next shift 00335 codeShift-=3; 00336 if (codeShift<=-3) 00337 { 00338 codeOffset++; 00339 codeShift+=8; 00340 } 00341 } 00342 } |
|
Pack the lumels of the patches. Lumels are classes that describe the lighting environnement at a given texel of the lightmap. It is used to compute the shadow map of the patch, compress it and uncompress it. This method compress the lumels passed in parameter and stored them in its Lumels member.
Definition at line 1267 of file patch_lightmap.cpp. References CompressedLumels, evalLumelBlock(), NL_BLOCK_LUMEL_COMPRESSED_SIZE, NL_LUMEL_BY_TILE, nlassert, packLumelBlock(), uint, uint8, unpackLumelBlock(), and v. Referenced by NL3D::CZone::build().
01268 { 01269 // Number of lumel by lines 01270 uint lumelCount=OrderS*NL_LUMEL_BY_TILE; 01271 01272 // Number of block in a line 01273 nlassert ((lumelCount&0x3)==0); 01274 uint numLumelBlock=lumelCount>>2; 01275 01276 // Number of line 01277 uint lineCount=OrderT*NL_LUMEL_BY_TILE; 01278 01279 // Number of block line 01280 nlassert ((lineCount&0x3)==0); 01281 uint numLineBlock=lineCount>>2; 01282 01283 // Resize the compressed buffer 01284 CompressedLumels.resize (numLumelBlock*numLineBlock*NL_BLOCK_LUMEL_COMPRESSED_SIZE); 01285 01286 // Input of compresed data 01287 uint8 *compressedData=&CompressedLumels[0]; 01288 01289 // Each line block 01290 for (uint lineBlock=0; lineBlock<numLineBlock; lineBlock++) 01291 { 01292 // Block pointer 01293 const uint8 *blockLine=pLumelSrc; 01294 01295 // Each lumel block 01296 for (uint lumelBlock=0; lumelBlock<numLumelBlock; lumelBlock++) 01297 { 01298 // *** Unpack the block 01299 uint countU; 01300 01301 // Last block ? 01302 if (lumelBlock==numLumelBlock-1) 01303 countU=lumelCount&3; 01304 else 01305 countU=4; 01306 01307 // Destination lumel 01308 const uint8 *blockSrc=blockLine; 01309 01310 // Temp block 01311 uint8 originalBlock[4*4]; 01312 01313 // Copy the lumels in the bloc 01314 for (uint v=0; v<NL_LUMEL_BY_TILE; v++) 01315 { 01316 for (uint u=0; u<NL_LUMEL_BY_TILE; u++) 01317 { 01318 // Copy the lumel 01319 originalBlock[(v<<2)+u]=blockSrc[u]; 01320 } 01321 01322 // Next line 01323 blockSrc+=lumelCount; 01324 } 01325 01326 // Get min and max alpha 01327 uint8 alphaMin=255; 01328 uint8 alphaMax=0; 01329 01330 // Scan 01331 for (uint i=0; i<16; i++) 01332 { 01333 // Min ? 01334 if (originalBlock[i]<alphaMin) 01335 alphaMin=originalBlock[i]; 01336 if (originalBlock[i]>alphaMax) 01337 alphaMax=originalBlock[i]; 01338 } 01339 01340 // *** Try to compress by 2 methods 01341 01342 // Blcok uncompressed 01343 uint8 uncompressedBlock[4*4]; 01344 01345 // Pack the block 01346 packLumelBlock (compressedData, originalBlock, alphaMin, alphaMax); 01347 01348 // Unpack the block 01349 unpackLumelBlock (uncompressedBlock, compressedData); 01350 01351 // Eval error 01352 uint firstMethod=evalLumelBlock (originalBlock, uncompressedBlock, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE); 01353 01354 // second compression 01355 uint8 secondCompressedBlock[NL_BLOCK_LUMEL_COMPRESSED_SIZE]; 01356 packLumelBlock (secondCompressedBlock, originalBlock, alphaMax, alphaMin); 01357 01358 // Unpack the block 01359 unpackLumelBlock (uncompressedBlock, secondCompressedBlock); 01360 01361 // Eval error 01362 uint secondMethod=evalLumelBlock (originalBlock, uncompressedBlock, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE); 01363 01364 // Second best ? 01365 if (secondMethod<firstMethod) 01366 { 01367 // Copy compressed data 01368 memcpy (compressedData, secondCompressedBlock, NL_BLOCK_LUMEL_COMPRESSED_SIZE); 01369 } 01370 01371 // Next source block 01372 compressedData+=NL_BLOCK_LUMEL_COMPRESSED_SIZE; 01373 01374 // Next block on the line 01375 blockLine+=4; 01376 } 01377 01378 // Next line of block 01379 pLumelSrc+=lumelCount*4; 01380 } 01381 } |
|
preRender this patch. Build Max faces / pass etc...
Definition at line 249 of file patch_render.cpp. References _PatchRdrPassFar0, _PatchRdrPassFar1, allocateVBAndFaceVector(), allocateVBAndFaceVectorFar1Only(), NL3D::CPatchRdrPass::appendRdrPatchFar0(), NL3D::CPatchRdrPass::appendRdrPatchFar1(), NL3D::CTileMaterial::appendTileToEachRenderPass(), NL3D::CTessBlock::clip(), NL3D::CTessBlock::clipFar(), computeNewFar(), deleteVBAndFaceVector(), deleteVBAndFaceVectorFar1Only(), NL3D::CTessBlock::FaceTileMaterialRefCount, NL3D::CTessBlock::FarVertexList, fillFar0VertexListVB(), fillFar1VertexListVB(), fillTileVertexListVB(), fillVB(), fillVBFar0Only(), fillVBFar1Only(), NL3D::CTessBlock::forceClip(), NL3D::CTessBlock::NearVertexList, NL3D_TESSBLOCK_TILESIZE, NumRenderableFaces, NL3D::CTessBlock::RdrTileRoot, NL3D::CTessBlock::refillFaceVectorFar0(), NL3D::CTessBlock::refillFaceVectorFar1(), NL3D::CTessBlock::refillFaceVectorTile(), NL3D::CTessBlock::resetClip(), sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, uint, updateFar0VBAlloc(), updateFar1VBAlloc(), updateTileVBAlloc(), NL3D::CTessBlock::visibleFar0(), NL3D::CTessBlock::visibleFar1(), and NL3D::CTessBlock::visibleTile().
00250 { 00251 // 0. Classify the patch, and update TextureInfo. 00252 //======================= 00253 sint newFar0,newFar1; 00254 // compute new Far0 and new Far1. 00255 computeNewFar(patchSphere, newFar0, newFar1); 00256 00257 00258 // 2. Update vertices in VB 00259 //======================== 00260 sint oldFar0= Far0, oldFar1= Far1; 00261 00262 // Test if go in or go out tileMode. 00263 bool changeTileMode; 00264 // this is true if a change is made, and if old or current is in TileMode. 00265 changeTileMode= (newFar0!=oldFar0) && (newFar0==0 || oldFar0==0); 00266 // Or this is true if Far0 / Far1 was invalid before. 00267 changeTileMode= changeTileMode || oldFar0==-1 || oldFar1==-1; 00268 00269 // Pre VB change. 00270 //------------------ 00271 // In this case, major change: delete all VB, then recreate after. 00272 if(changeTileMode) 00273 { 00274 // delete the old VB (NB: isRenderClipped()==false here). 00275 // NB: Far0 and Far1 are still unmodified, so deleteVB() will do the good job. 00276 deleteVBAndFaceVector(); 00277 } 00278 else 00279 { 00280 // minor change: Far0 UV, or Far1. 00281 // Far0 UV: do nothing here. 00282 // If change in Far1, must delete Far1 00283 if(newFar1!=oldFar1) 00284 { 00285 // NB: Far1 is still unmodified, so deleteVB() will do the good job. 00286 deleteVBAndFaceVectorFar1Only(); 00287 } 00288 } 00289 00290 // Far change. 00291 //------------------ 00292 // Set new far values 00293 Far0= newFar0; 00294 Far1= newFar1; 00295 00296 00297 // Post VB change. 00298 //------------------ 00299 if(changeTileMode) 00300 { 00301 // major change: recreate all the VB. 00302 allocateVBAndFaceVector(); 00303 // Then try to refill if possible. 00304 fillVB(); 00305 } 00306 else 00307 { 00308 // minor change: Far0 UV, or Far1. 00309 // If change in Far0 00310 if(newFar0!=oldFar0) 00311 { 00312 // Then must recompute VB with good UVs. 00313 // An optimisation is to check if UVs had really change (see UScale ...) 00314 // but the case they don't change is very rare: 1/16. 00315 fillVBFar0Only(); 00316 } 00317 00318 // If change in Far1, must allcoate and recompute UVs. 00319 if(newFar1!=oldFar1) 00320 { 00321 allocateVBAndFaceVectorFar1Only(); 00322 // try to fill if no reallocation problem 00323 fillVBFar1Only(); 00324 } 00325 } 00326 00327 00328 // 3. Append patch to renderList. 00329 //===================== 00330 // This patch is visible. So if good far, append. 00331 if(Far0>0) 00332 { 00333 _PatchRdrPassFar0->appendRdrPatchFar0(this); 00334 } 00335 // Same for Far1. 00336 if(Far1>0) 00337 { 00338 _PatchRdrPassFar1->appendRdrPatchFar1(this); 00339 } 00340 00341 00342 // 4. Clip tess blocks. 00343 //===================== 00344 // If we are in Tile/FarTransition 00345 bool doClipFar= Far0==0 && Far1==1; 00346 // Parse all TessBlocks. 00347 uint nTessBlock= TessBlocks.size(); 00348 CTessBlock *pTessBlock= nTessBlock>0? &TessBlocks[0]: NULL ; 00349 for(; nTessBlock>0; pTessBlock++, nTessBlock--) 00350 { 00351 CTessBlock &tblock= *pTessBlock; 00352 00353 // bkup the old result for clipping 00354 bool oldVisibleFar0= tblock.visibleFar0(); 00355 bool oldVisibleTile= tblock.visibleTile(); 00356 bool oldVisibleFar1= tblock.visibleFar1(); 00357 00358 // If this TessBlock is empty, do not need to clip 00359 if(tblock.FaceTileMaterialRefCount==0) 00360 { 00361 // Simply force the clip. 00362 tblock.forceClip(); 00363 } 00364 else 00365 { 00366 // clip the tessBlock. 00367 tblock.resetClip(); 00368 tblock.clip(); 00369 // If we are in Tile/FarTransition 00370 if(doClipFar) 00371 tblock.clipFar(CLandscapeGlobals::RefineCenter, CLandscapeGlobals::TileDistNear, CLandscapeGlobals::FarTransition); 00372 00373 // If TileMode, and if tile visible 00374 if(Far0==0 && tblock.visibleTile() ) 00375 { 00376 // Append all tiles (if any) to the renderPass list! 00377 for(uint j=0;j<NL3D_TESSBLOCK_TILESIZE; j++) 00378 { 00379 // If tile exist 00380 if(tblock.RdrTileRoot[j]) 00381 // add it to the renderList 00382 tblock.RdrTileRoot[j]->appendTileToEachRenderPass(NumRenderableFaces); 00383 } 00384 } 00385 } 00386 00387 // If change of clip in tessBlock, must update the tessBlock 00388 if( Far0> 0 && oldVisibleFar0 != tblock.visibleFar0() ) 00389 { 00390 if( tblock.visibleFar0() ) 00391 { 00392 // allocate 00393 updateFar0VBAlloc(tblock.FarVertexList, true); 00394 // fill only if possible. 00395 if(!CLandscapeGlobals::CurrentFar0VBAllocator->reallocationOccurs()) 00396 fillFar0VertexListVB(tblock.FarVertexList); 00397 // rebuild triangles index list. 00398 tblock.refillFaceVectorFar0(); 00399 } 00400 else 00401 { 00402 // delete 00403 updateFar0VBAlloc(tblock.FarVertexList, false); 00404 } 00405 } 00406 if( Far0==0 && oldVisibleTile != tblock.visibleTile() ) 00407 { 00408 if( tblock.visibleTile() ) 00409 { 00410 // allocate 00411 updateTileVBAlloc(tblock.NearVertexList, true); 00412 // fill only if possible. 00413 if(!CLandscapeGlobals::CurrentTileVBAllocator->reallocationOccurs()) 00414 fillTileVertexListVB(tblock.NearVertexList); 00415 // rebuild triangles index list. 00416 tblock.refillFaceVectorTile(); 00417 } 00418 else 00419 { 00420 // delete 00421 updateTileVBAlloc(tblock.NearVertexList, false); 00422 } 00423 } 00424 if( Far1> 0 && oldVisibleFar1 != tblock.visibleFar1() ) 00425 { 00426 if( tblock.visibleFar1() ) 00427 { 00428 // allocate 00429 updateFar1VBAlloc(tblock.FarVertexList, true); 00430 // fill only if possible. 00431 if(!CLandscapeGlobals::CurrentFar1VBAllocator->reallocationOccurs()) 00432 fillFar1VertexListVB(tblock.FarVertexList); 00433 // rebuild triangles index list. 00434 tblock.refillFaceVectorFar1(); 00435 } 00436 else 00437 { 00438 // delete 00439 updateFar1VBAlloc(tblock.FarVertexList, false); 00440 } 00441 } 00442 } 00443 00444 } |
|
Process a Dynamic light, creating the DLMContext if necessary. Increment RefCount. Called by CLandscape. Definition at line 2021 of file patch_lightmap.cpp. References _DLMContext, NL3D::CPatchDLMContext::addPointLightInfluence(), addRefDLMContext(), NL3D::CPatchDLMContext::CurPointLightCount, and isRenderClipped().
02022 { 02023 // add reference to currentLight, creating DLMContext if needed 02024 addRefDLMContext(); 02025 02026 // add curLight counter 02027 _DLMContext->CurPointLightCount++; 02028 02029 // compute lighting, only if patch is visible 02030 if(!isRenderClipped()) 02031 _DLMContext->addPointLightInfluence(pl); 02032 } |
|
Recreate any vegetable block (as possible) in this patch. (usefull for edition).
Definition at line 260 of file patch_vegetable.cpp. References createVegetableBlock(), getLandscape(), NL3D::CLandscape::isVegetableActive(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by NL3D::CLandscape::enableVegetable().
00261 { 00262 // For all TessBlocks, try to release their VegetableBlock 00263 for(uint numtb=0; numtb<TessBlocks.size(); numtb++) 00264 { 00265 // if the vegetableBlock is deleted, and if there is at least one Material in the tessBlock, and if possible 00266 if( TessBlocks[numtb].VegetableBlock==NULL && TessBlocks[numtb].TileMaterialRefCount>0 00267 && getLandscape()->isVegetableActive()) 00268 { 00269 // compute tessBlock coordinate 00270 uint tbWidth= OrderS>>1; 00271 uint ts= numtb&(tbWidth-1); 00272 uint tt= numtb/tbWidth; 00273 // crate the vegetable with tilecooridante (ie tessBlock coord *2); 00274 createVegetableBlock(numtb, ts*2, tt*2); 00275 } 00276 } 00277 00278 } |
|
Definition at line 705 of file patch_render.cpp. References NL3D::CTessBlock::createFaceVectorFar0(), NL3D::CTessBlock::createFaceVectorFar1(), NL3D::CTessBlock::createFaceVectorTile(), getLandscape(), isRenderClipped(), and MasterBlock. Referenced by NL3D::CLandscape::updateTessBlocksFaceVector().
00706 { 00707 // Do it Only if patch is visible. 00708 if(!isRenderClipped()) 00709 { 00710 // Far0. 00711 // If Far Mode. 00712 if(Far0>0) 00713 { 00714 // Create the face for this TessBlock only. 00715 block.createFaceVectorFar0(getLandscape()->_FaceVectorManager); 00716 } 00717 // Or If Tile Mode. 00718 else if(Far0==0) 00719 { 00720 // No tiles in MasterBlock! So no need to call createFaceVectorTile(), if this block is the MasterBlock. 00721 if(&block != &MasterBlock) 00722 block.createFaceVectorTile(getLandscape()->_FaceVectorManager); 00723 } 00724 00725 // Far1. 00726 if(Far1>0) 00727 { 00728 // Create the face for this TessBlock only. 00729 block.createFaceVectorFar1(getLandscape()->_FaceVectorManager); 00730 } 00731 } 00732 00733 } |
|
Definition at line 2150 of file patch.cpp. References NL3D::CTessList< CTileFace >::clear(), NLMISC::CObjectVector< CTessBlock >::clear(), NL3D_MAX_TILE_FACE, NL3D_TESSBLOCK_TILESIZE, NL3D::CTessFace::recreateTileUvs(), sint, NLMISC::CObjectVector< CTessBlock >::size(), Son0, Son1, TessBlocks, and NL3D::CTileMaterial::TileFaceList.
02151 { 02152 // Reset the Tile rdr list. 02153 for(sint tb=0; tb<(sint)TessBlocks.size();tb++) 02154 { 02155 // Vertices must all be reseted. 02156 TessBlocks[tb].NearVertexList.clear(); 02157 for(sint i=0;i<NL3D_TESSBLOCK_TILESIZE;i++) 02158 { 02159 CTileMaterial *tm= TessBlocks[tb].RdrTileRoot[i]; 02160 if(tm) 02161 { 02162 for(sint pass=0;pass<NL3D_MAX_TILE_FACE;pass++) 02163 { 02164 tm->TileFaceList[pass].clear(); 02165 } 02166 } 02167 } 02168 } 02169 02170 Son0->recreateTileUvs(); 02171 Son1->recreateTileUvs(); 02172 } |
|
Refine this patch. Even if clipped. Refine all nodes.
Definition at line 1493 of file patch.cpp. References nlassert, NL3D::CTessFace::refineAll(), Son0, and Son1. Referenced by NL3D::CZone::refineAll().
|
|
Definition at line 1531 of file patch.cpp. References BaseVertices, computeVertex(), NL3D::CTessVertex::EndPos, nlassert, NL3D::CTessVertex::Pos, NL3D::CTessFace::refreshTesselationGeometry(), Son0, Son1, and NL3D::CTessVertex::StartPos.
01532 { 01533 nlassert(Son0); 01534 nlassert(Son1); 01535 01536 // Recompute the BaseVertices. 01537 CTessVertex *a= BaseVertices[0]; 01538 CTessVertex *b= BaseVertices[1]; 01539 CTessVertex *c= BaseVertices[2]; 01540 CTessVertex *d= BaseVertices[3]; 01541 // Set positions. 01542 a->Pos= a->StartPos= a->EndPos= computeVertex(0,0); 01543 b->Pos= b->StartPos= b->EndPos= computeVertex(0,1); 01544 c->Pos= c->StartPos= c->EndPos= computeVertex(1,1); 01545 d->Pos= d->StartPos= d->EndPos= computeVertex(1,0); 01546 01547 01548 // refresh the tesselation of sons. 01549 Son0->refreshTesselationGeometry(); 01550 Son1->refreshTesselationGeometry(); 01551 } |
|
Un-compile a patch. Tesselation is deleted. if patch is not compiled, no - op.
Definition at line 115 of file patch.cpp. References _DLMContext, _DLMContextRefCount, NL3D::CZone::_PatchOldRenderClipped, NL3D::CZone::_PatchRenderClipped, _ULNearNext, _ULNearPrec, clearTessBlocks(), NL3D::CLandscape::deleteTessFace(), deleteVBAndFaceVector(), NL3D::CTessFace::FLeft, NL3D::CTessFace::FRight, getLandscape(), NL3D::CTessFace::isLeaf(), isRenderClipped(), nlassert, resetMasterBlock(), resetRenderFar(), NLMISC::CBitSet::set(), Son0, and Son1. Referenced by NL3D::CZone::release(), and ~CPatch().
00116 { 00117 if(Zone) 00118 { 00119 // First, delete the VB if the zone was removed while the patch is visible. 00120 if(!isRenderClipped()) 00121 { 00122 // release VertexBuffer. 00123 deleteVBAndFaceVector(); 00124 // Flag RenderClipped in Zone 00125 Zone->_PatchRenderClipped.set(PatchId, true); 00126 } 00127 00128 // THIS PATCH MSUT BE UNBOUND FIRST!!!!! 00129 nlassert(Son0 && Son1); 00130 nlassert(Son0->isLeaf() && Son1->isLeaf()); 00131 nlassert(Son0->FLeft == NULL); 00132 nlassert(Son0->FRight == NULL); 00133 nlassert(Son1->FLeft == NULL); 00134 nlassert(Son1->FRight == NULL); 00135 00136 // Free renderPass of landscape, and maybe force computation of texture info on next preRender(). 00137 // Must do it here, before deletion of Zone, OrderS/T etc... 00138 resetRenderFar(); 00139 00140 getLandscape()->deleteTessFace(Son0); 00141 getLandscape()->deleteTessFace(Son1); 00142 // Vertices are smartptr/deleted in zone. 00143 } 00144 00145 // Flag the fact that this patch can't be rendered. 00146 OrderS=0; 00147 OrderT=0; 00148 Son0=NULL; 00149 Son1=NULL; 00150 clearTessBlocks(); 00151 resetMasterBlock(); 00152 // Flag RenderClipped in Zone 00153 if(Zone) 00154 { 00155 Zone->_PatchRenderClipped.set( PatchId, true); 00156 Zone->_PatchOldRenderClipped.set( PatchId, true); 00157 } 00158 00159 // the pathc is uncompiled. must do it after clearTessBlocks(), because may use it 00160 // for vegetable manager, and for updateLighting 00161 Zone= NULL; 00162 00163 // uncompile: reset UpdateLighting circular list to NULL. 00164 if(_ULNearPrec!= NULL) 00165 { 00166 // verify the patch is correctly unlinked from any ciruclar list. 00167 nlassert(_ULNearPrec==this && _ULNearNext==this); 00168 } 00169 _ULNearPrec= NULL; 00170 _ULNearNext= NULL; 00171 00172 // DynamciLightMap: release the _DLMContext if still exist. 00173 if(_DLMContext) 00174 delete _DLMContext; 00175 // reset 00176 _DLMContext= NULL; 00177 _DLMContextRefCount= 0; 00178 } |
|
Definition at line 1247 of file patch_lightmap.cpp. References computeTbTm(), NL3D::CZone::Landscape, NL3D::CTessBlock::LightMapId, NL3D::CTessBlock::LightMapRefCount, nlassert, NL3D::CLandscape::releaseTileLightMap(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by NL3D::CTessFace::releaseTileMaterial().
01248 { 01249 // TessBlocks must have been allocated. 01250 nlassert(TessBlocks.size()!=0); 01251 01252 // get what tessBlock to use. 01253 uint numtb, numtm; 01254 computeTbTm(numtb, numtm, ts, tt); 01255 CTessBlock &tessBlock= TessBlocks[numtb]; 01256 01257 // If no more tileMaterial use this lightmap, release it. 01258 nlassert(tessBlock.LightMapRefCount>0); 01259 tessBlock.LightMapRefCount--; 01260 if(tessBlock.LightMapRefCount==0) 01261 { 01262 Zone->Landscape->releaseTileLightMap(tessBlock.LightMapId); 01263 } 01264 } |
|
release the vegetableBlock in the corresponding TessBlock. TessBlocks must exist
Definition at line 326 of file patch_vegetable.cpp. References getLandscape(), TessBlocks, and uint. Referenced by deleteAllVegetableIgs(), and removeTileMaterialFromRenderList().
00327 { 00328 // if exist, must delete the VegetableBlock. 00329 if(TessBlocks[numTb].VegetableBlock) 00330 { 00331 // delete Igs, and remove from list. 00332 TessBlocks[numTb].VegetableBlock->release(getLandscape()->_VegetableManager, getLandscape()->_VegetableBlockList); 00333 // delete. 00334 delete TessBlocks[numTb].VegetableBlock; 00335 TessBlocks[numTb].VegetableBlock= NULL; 00336 } 00337 } |
|
Definition at line 848 of file patch.cpp. References decRefTessBlocks(), dirtTessBlockFaceVector(), NL3D::CTessBlock::FaceTileMaterialRefCount, NL3D::CTessBlock::FarFaceList, getNumTessBlock(), NL3D::CTessFace::Level, MasterBlock, nlassert, NumRenderableFaces, NL3D::CTessList< CTessFace >::remove(), removeFaceFromTileRenderList(), TessBlockLimitLevel, TessBlocks, and uint. Referenced by NL3D::CTessFace::doMerge(), NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
00849 { 00850 // Update the number of renderable Faces 00851 NumRenderableFaces--; 00852 nlassert(NumRenderableFaces>=0); 00853 00854 // Update Gnal render. 00855 //==================== 00856 if(face->Level<TessBlockLimitLevel) 00857 { 00858 MasterBlock.FarFaceList.remove(face); 00859 MasterBlock.FaceTileMaterialRefCount--; 00860 00861 // The facelist is modified, so we must update the faceVector, if visible. 00862 dirtTessBlockFaceVector(MasterBlock); 00863 } 00864 else 00865 { 00866 // link the face to the good tessblock. 00867 uint numtb= getNumTessBlock(face); 00868 TessBlocks[numtb].FarFaceList.remove(face); 00869 TessBlocks[numtb].FaceTileMaterialRefCount--; 00870 00871 // The facelist is modified, so we must update the faceVector, if visible. 00872 dirtTessBlockFaceVector(TessBlocks[numtb]); 00873 00874 // Update Tile render (no need to do it if face not at least at tessblock level). 00875 removeFaceFromTileRenderList(face); 00876 00877 // Destroy if necessary the TessBlocks. 00878 decRefTessBlocks(); 00879 } 00880 } |
|
Definition at line 913 of file patch.cpp. References dirtTessBlockFaceVector(), getLandscape(), getNumTessBlock(), NL3D_MAX_TILE_FACE, nlassert, NL3D::CTileMaterial::Pass, NL3D::CRdrTileId::PatchRdrPass, NL3D::CTessList< CTileFace >::remove(), NL3D::CLandscape::removeFromShadowPolyReceiver(), sint, TessBlocks, NL3D::CTileMaterial::TileFaceList, NL3D::CTessFace::TileFaces, NL3D::CTessFace::TileMaterial, and uint. Referenced by NL3D::CTessFace::deleteTileUvs(), and removeFaceFromRenderList().
00914 { 00915 if(face->TileMaterial) 00916 { 00917 // For all valid faces, update their links. 00918 // Do not do this for lightmap, since it use same face from RGB0 pass. 00919 for(sint i=0;i<NL3D_MAX_TILE_FACE;i++) 00920 { 00921 CPatchRdrPass *tilePass= face->TileMaterial->Pass[i].PatchRdrPass; 00922 // If tile i enabled. 00923 if(tilePass) 00924 { 00925 // a face should have created for this pass. 00926 nlassert(face->TileFaces[i]); 00927 face->TileMaterial->TileFaceList[i].remove(face->TileFaces[i]); 00928 } 00929 } 00930 00931 // The facelist is modified, so we must update the faceVector, if visible. 00932 uint numtb= getNumTessBlock(face); 00933 dirtTessBlockFaceVector(TessBlocks[numtb]); 00934 00935 // Shadow: remove it from the Shadow Triangles. 00936 getLandscape()->removeFromShadowPolyReceiver(face); 00937 } 00938 } |
|
Definition at line 1062 of file patch.cpp. References decRefTessBlocks(), NL3D::CTessBlock::FarVertexList, FVMasterBlock, FVTessBlockEdge, getNumTessBlock(), MasterBlock, NL3D::CTessFarVertex::OwnerBlock, NL3D::CTessFarVertex::PCoord, NL3D::CTessList< CTessFarVertex >::remove(), TessBlocks, TFarVertType, type, and uint. Referenced by NL3D::CTessFace::doMerge().
01063 { 01064 TFarVertType type; 01065 uint numtb; 01066 getNumTessBlock(fv->PCoord, type, numtb); 01067 01068 01069 if(type==FVMasterBlock || type==FVTessBlockEdge) 01070 { 01071 MasterBlock.FarVertexList.remove(fv); 01072 fv->OwnerBlock= NULL; 01073 } 01074 else 01075 { 01076 TessBlocks[numtb].FarVertexList.remove(fv); 01077 fv->OwnerBlock= NULL; 01078 01079 // Destroy if necessary the TessBlocks. 01080 decRefTessBlocks(); 01081 } 01082 } |
|
Definition at line 1099 of file patch.cpp. References computeTbTm(), decRefTessBlocks(), nlassert, NL3D::CTessNearVertex::OwnerBlock, TessBlocks, NL3D::CTileMaterial::TileS, NL3D::CTileMaterial::TileT, and uint. Referenced by NL3D::CTessFace::deleteTileUv().
01100 { 01101 nlassert(tileMat); 01102 01103 uint numtb, numtm; 01104 computeTbTm(numtb, numtm, tileMat->TileS, tileMat->TileT); 01105 TessBlocks[numtb].NearVertexList.remove(nv); 01106 nv->OwnerBlock= NULL; 01107 01108 // Destroy if necessary the TessBlocks. 01109 decRefTessBlocks(); 01110 } |
|
Definition at line 1002 of file patch.cpp. References computeTbTm(), decRefDLMContext(), decRefTessBlocks(), getLandscape(), NL3D::CLandscape::getTileCallback(), MasterBlock, nlassert, releaseVegetableBlock(), TessBlocks, NL3D::CTessBlock::TileMaterialRefCount, NL3D::ULandscapeTileCallback::tileRemoved(), NL3D::CTileMaterial::TileS, NL3D::CTileMaterial::TileT, uint, and uint64. Referenced by NL3D::CTessFace::releaseTileMaterial().
01003 { 01004 nlassert(tm); 01005 01006 uint numtb, numtm; 01007 computeTbTm(numtb, numtm, tm->TileS, tm->TileT); 01008 TessBlocks[numtb].RdrTileRoot[numtm]= NULL; 01009 TessBlocks[numtb].FaceTileMaterialRefCount--; 01010 TessBlocks[numtb].TileMaterialRefCount--; 01011 // The master block contains the whole patch TileMaterialRefCount 01012 MasterBlock.TileMaterialRefCount--; 01013 01014 // if no more tiles in this tessBlock, delete the vegetable Block. 01015 //========== 01016 // if no more tiles in this tessBlock 01017 if( TessBlocks[numtb].TileMaterialRefCount==0 ) 01018 { 01019 // release the vegetableBlock (if any) 01020 releaseVegetableBlock(numtb); 01021 } 01022 01023 // Destroy if necessary the TessBlocks. 01024 decRefTessBlocks(); 01025 01026 // DynamicLighting. When in near, must compute the context, to have good UVs. 01027 //========== 01028 // dec ref the context, deleting it if needed. 01029 decRefDLMContext(); 01030 01031 ULandscapeTileCallback *tileCallback = getLandscape()->getTileCallback(); 01032 if (tileCallback) 01033 { 01034 tileCallback->tileRemoved((uint64) tm); // pointer to tile material serves as a unique identifier 01035 } 01036 } |
|
Render this patch, if not clipped. Call PatchCurrentDriver->renderSimpleTriangles().
Definition at line 528 of file patch_render.cpp. References _PatchRdrPassFar0, NL3D::CTessBlock::Far0FaceVector, isRenderClipped(), MasterBlock, NL3D_PROFILE_LAND_ADD, NL3D_PROFILE_LAND_ADD_FACE_VECTOR, nlassert, NL3D::ProfNPatchRdrFar0, NL3D::ProfNRdrFar0, NL3D::renderFaceVector(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, uint, and NL3D::CTessBlock::visibleFar0(). Referenced by NL3D::CLandscape::render().
00529 { 00530 NL3D_PROFILE_LAND_ADD(ProfNPatchRdrFar0, 1); 00531 00532 #ifdef NL_DEBUG 00533 // Must be visible, and must be called only if the RdrPass is enabled. 00534 nlassert(!isRenderClipped() && _PatchRdrPassFar0); 00535 #endif 00536 00537 // Render tris of MasterBlock. 00538 renderFaceVector(MasterBlock.Far0FaceVector); 00539 // profile 00540 NL3D_PROFILE_LAND_ADD_FACE_VECTOR(ProfNRdrFar0, MasterBlock.Far0FaceVector); 00541 00542 // Render tris of TessBlocks. 00543 uint nTessBlock= TessBlocks.size(); 00544 CTessBlock *pTessBlock= nTessBlock>0? &TessBlocks[0]: NULL ; 00545 for(; nTessBlock>0; pTessBlock++, nTessBlock--) 00546 { 00547 CTessBlock &tblock= *pTessBlock; 00548 // if block visible, render 00549 if( tblock.visibleFar0() ) 00550 { 00551 renderFaceVector(tblock.Far0FaceVector); 00552 // profile 00553 NL3D_PROFILE_LAND_ADD_FACE_VECTOR(ProfNRdrFar0, tblock.Far0FaceVector); 00554 } 00555 } 00556 } |
|
Definition at line 560 of file patch_render.cpp. References _PatchRdrPassFar1, NL3D::CTessBlock::Far1FaceVector, isRenderClipped(), MasterBlock, NL3D_PROFILE_LAND_ADD, NL3D_PROFILE_LAND_ADD_FACE_VECTOR, nlassert, NL3D::ProfNPatchRdrFar1, NL3D::ProfNRdrFar1, NL3D::renderFaceVector(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, uint, and NL3D::CTessBlock::visibleFar1(). Referenced by NL3D::CLandscape::render().
00561 { 00562 NL3D_PROFILE_LAND_ADD(ProfNPatchRdrFar1, 1); 00563 00564 #ifdef NL_DEBUG 00565 // Must be visible, and must be called only if the RdrPass is enabled. 00566 nlassert(!isRenderClipped() && _PatchRdrPassFar1); 00567 #endif 00568 00569 // Render tris of MasterBlock. 00570 renderFaceVector(MasterBlock.Far1FaceVector); 00571 // profile. 00572 NL3D_PROFILE_LAND_ADD_FACE_VECTOR(ProfNRdrFar1, MasterBlock.Far1FaceVector); 00573 00574 // Render tris of TessBlocks. 00575 uint nTessBlock= TessBlocks.size(); 00576 CTessBlock *pTessBlock= nTessBlock>0? &TessBlocks[0]: NULL ; 00577 for(; nTessBlock>0; pTessBlock++, nTessBlock--) 00578 { 00579 CTessBlock &tblock= *pTessBlock; 00580 // if block visible, render 00581 if( tblock.visibleFar1() ) 00582 { 00583 renderFaceVector(tblock.Far1FaceVector); 00584 // profile. 00585 NL3D_PROFILE_LAND_ADD_FACE_VECTOR(ProfNRdrFar1, tblock.Far1FaceVector); 00586 } 00587 } 00588 } |
|
Rebuild the packed lumels without shadow. Only the interpolated color will be used.
Definition at line 1384 of file patch_lightmap.cpp. References CompressedLumels, NL_LUMEL_BY_TILE, nlassert, size, and uint. Referenced by NL3D::CZone::build().
01385 { 01386 // Number of lumel by lines 01387 uint lumelCount=OrderS*NL_LUMEL_BY_TILE; 01388 01389 // Number of block in a line 01390 nlassert ((lumelCount&0x3)==0); 01391 uint numLumelBlock=lumelCount>>2; 01392 01393 // Number of line 01394 uint lineCount=OrderT*NL_LUMEL_BY_TILE; 01395 01396 // Number of block line 01397 nlassert ((lineCount&0x3)==0); 01398 uint numLineBlock=lineCount>>2; 01399 01400 // Size of the lumel array 01401 uint size=numLineBlock*numLumelBlock*8; 01402 01403 // 4 bits per lumel 01404 CompressedLumels.resize (size); 01405 01406 // No line have shadows. 01407 memset (&CompressedLumels[0], 0, size); 01408 } |
|
Definition at line 709 of file patch.cpp. References NL3D::CTessList< CTessFace >::clear(), NL3D::CTessList< CTessFarVertex >::clear(), NL3D::CTessBlock::FarFaceList, NL3D::CTessBlock::FarVertexList, isRenderClipped(), MasterBlock, NL3D::CTessBlock::NearVertexList, nlassert, NumRenderableFaces, and NL3D::CTessList< CTessNearVertex >::size(). Referenced by makeRoots(), and release().
00710 { 00711 // We should be not visible so FaceVector no more exist. 00712 nlassert(isRenderClipped()); 00713 00714 MasterBlock.FarVertexList.clear(); 00715 MasterBlock.FarFaceList.clear(); 00716 NumRenderableFaces= 0; 00717 // no tiles should be here!! 00718 nlassert(MasterBlock.NearVertexList.size()==0); 00719 } |
|
Definition at line 1555 of file patch.cpp. References _PatchRdrPassFar0, _PatchRdrPassFar1, NL3D::CLandscape::freeFarRenderPass(), and NL3D::CZone::Landscape. Referenced by release().
01556 { 01557 if (_PatchRdrPassFar0) 01558 { 01559 // free the render pass. 01560 Zone->Landscape->freeFarRenderPass (this, _PatchRdrPassFar0, Far0); 01561 _PatchRdrPassFar0= NULL; 01562 } 01563 if (_PatchRdrPassFar1) 01564 { 01565 // free the render pass. 01566 Zone->Landscape->freeFarRenderPass (this, _PatchRdrPassFar1, Far1); 01567 _PatchRdrPassFar1= NULL; 01568 } 01569 01570 Far0= -1; 01571 Far1= -1; 01572 } |
|
make a valid empty array of TileLightInfluences (ie resized to good size, but with empty light influences Definition at line 1529 of file patch_lightmap.cpp. References TileLightInfluences, and uint. Referenced by NL3D::CZone::build(), NL3D::CLandscape::removeAllPointLights(), and serial().
01530 { 01531 // Fill default. 01532 TileLightInfluences.resize((OrderS/2 +1) * (OrderT/2 +1)); 01533 // Disable All light influence on all points 01534 for(uint i=0;i <TileLightInfluences.size(); i++) 01535 { 01536 // Disable all light influence on this point. 01537 TileLightInfluences[i].Light[0]= 0xFF; 01538 } 01539 } |
|
Definition at line 1576 of file patch.cpp. References _CornerSmoothFlag, _Version, NL3D::CTileColor::Color565, CompressedLumels, NLMISC::IStream::isReading(), NL_PATCH_SMOOTH_FLAG_MASK, nlassert, NoiseRotation, resetTileLightInfluences(), NLMISC::IStream::serial(), NLMISC::IStream::serialCont(), NLMISC::IStream::serialVersion(), size, TileColors, TileLightInfluences, Tiles, uint, NLMISC::IStream::xmlPop(), NLMISC::IStream::xmlPush(), and NLMISC::IStream::xmlSerial().
01577 { 01578 /* 01579 Version 7: 01580 - remove unused information from CTileColor. just keep 565 color 01581 Version 6: 01582 - default UnderWater flags for tileElements before version 6. 01583 Version 5: 01584 - TileLightInfluences serialized. 01585 Version 4: 01586 - Smooth flag serialized 01587 Version 3: 01588 - NoiseRotation. 01589 - NoiseSmooth. 01590 Version 2: 01591 - Lumels. 01592 Version 1: 01593 - Tile color. 01594 Version 0: 01595 - base version. 01596 */ 01597 uint ver= f.serialVersion(_Version); 01598 01599 // No more compatibility before version 2, because OrderS / OrderT not serialized in preceding version 01600 // Doens't matter since CZone::serial() do not support it too. 01601 if (ver<2) 01602 { 01603 throw EOlderStream(f); 01604 } 01605 01606 f.xmlSerial (Vertices[0], Vertices[1], Vertices[2], Vertices[3], "VERTICIES"); 01607 01608 f.xmlPush ("TANGENTS"); 01609 f.serial (Tangents[0], Tangents[1], Tangents[2], Tangents[3]); 01610 f.serial (Tangents[4], Tangents[5], Tangents[6], Tangents[7]); 01611 f.xmlPop (); 01612 01613 f.xmlSerial (Interiors[0], Interiors[1], Interiors[2], Interiors[3], "INTERIORS"); 01614 01615 f.xmlPush ("TILES"); 01616 f.serialCont(Tiles); 01617 f.xmlPop (); 01618 01619 if(ver>=1) 01620 { 01621 // Read/Write TileColors. 01622 if(ver<=6) 01623 { 01624 nlassert(f.isReading()); 01625 01626 // read old version of tilesColors (ie with LightX/LightY/LightZ, which are deprecated now) 01627 vector<CTileColorOldPatchVersion6> tmpArray; 01628 f.xmlPush ("TILE_COLORS"); 01629 f.serialCont(tmpArray); 01630 f.xmlPop (); 01631 01632 // then just copy to TileColors. 01633 TileColors.resize(tmpArray.size()); 01634 if(TileColors.size()>0) 01635 { 01636 memcpy(&TileColors[0], &tmpArray[0], TileColors.size()*sizeof(CTileColor)); 01637 } 01638 } 01639 else 01640 { 01641 // version >=7, just serial array of TileColors (16 bits TileColor only) 01642 f.xmlPush ("TILE_COLORS"); 01643 f.serialCont(TileColors); 01644 #ifdef NEL_FORCE_NO_USER_COLOR 01645 CTileColor color; 01646 color.Color565 = 0xffff; 01647 uint size = TileColors.size (); 01648 TileColors.resize (0); 01649 TileColors.resize (size, color); 01650 #endif // NEL_FORCE_NO_USER_COLOR 01651 f.xmlPop (); 01652 } 01653 } 01654 if(ver>=2) 01655 { 01656 f.xmlSerial (OrderS, "ORDER_S"); 01657 f.xmlSerial (OrderT, "ORDER_T"); 01658 01659 f.xmlPush ("COMPRESSED_LUMELS"); 01660 f.serialCont(CompressedLumels); 01661 f.xmlPop (); 01662 } 01663 // Else cannot create here the TileColors, because we need the OrderS/OrderT information... Done into CZone serial. 01664 if(ver>=3) 01665 { 01666 f.xmlSerial (NoiseRotation, "NOISE_ROTATION"); 01667 f.xmlSerial (_CornerSmoothFlag, "CORNER_SMOOTH_FLAG"); 01668 } 01669 else 01670 { 01671 // No Rotation / not smooth by default. 01672 NoiseRotation= 0; 01673 _CornerSmoothFlag= 0; 01674 } 01675 if(ver>=4) 01676 { 01677 f.xmlSerial(Flags, "FLAGS"); 01678 } 01679 else 01680 { 01681 Flags=NL_PATCH_SMOOTH_FLAG_MASK; 01682 } 01683 01684 // Serialize TileLightInfluences 01685 if(ver>=5) 01686 { 01687 f.xmlPush ("TILE_LIGHT_INFLUENCES"); 01688 f.serialCont(TileLightInfluences); 01689 f.xmlPop (); 01690 } 01691 else 01692 { 01693 if(f.isReading()) 01694 { 01695 // Fill default. 01696 resetTileLightInfluences(); 01697 } 01698 } 01699 01700 // if read a too old version, 01701 if(ver<6 && f.isReading()) 01702 { 01703 // reset tileElements vegetableState to AboveWater. 01704 for(uint i=0; i<Tiles.size(); i++) 01705 { 01706 Tiles[i].setVegetableState(CTileElement::AboveWater); 01707 } 01708 } 01709 01710 01711 } |
|
setup Smooth flags for Noise on corner: used for Noise geometry and for lighting. NB: convention: corner0==A, corner1==B ... Definition at line 951 of file patch_noise.cpp. References _CornerSmoothFlag, nlassert, and uint. Referenced by NL3D::CZone::build(), and NL3D::CZoneCornerSmoother::computeAllCornerSmoothFlags().
00952 { 00953 nlassert(corner<=3); 00954 uint mask= 1<<corner; 00955 if(smooth) 00956 _CornerSmoothFlag|= mask; 00957 else 00958 _CornerSmoothFlag&= ~mask; 00959 } |
|
Set the smooth flag for the n-th edge. flag is false if this edge must by smoothed, true else. Definition at line 567 of file patch.h. References NL_PATCH_SMOOTH_FLAG_SHIFT, and uint.
00568 { 00569 // Erase it 00570 Flags&=~(1<<(edge+NL_PATCH_SMOOTH_FLAG_SHIFT)); 00571 00572 // Set it 00573 Flags|=(((uint)flag)<<(edge+NL_PATCH_SMOOTH_FLAG_SHIFT)); 00574 } |
|
debug coloring Debug purpose only : setup the colors of this patch so that it shows which tiles have vegetable disabled, or are above, below water. User provides a table with 4 colors for each state : color 0 = above water color 1 = underwater color 2 = intersect water color 3 = vegetable disabled Definition at line 2231 of file patch.cpp. References NLMISC::CRGBA::get565(), index, min, s, t, TileColors, Tiles, and uint.
02232 { 02233 for (uint s = 0; s <= OrderS; ++s) 02234 { 02235 for (uint t = 0; t <= OrderT; ++t) 02236 { 02237 uint index = std::min(t, (uint) (OrderT - 1)) * OrderS 02238 + std::min(s, (uint) (OrderS - 1)); 02239 TileColors[s + t * (OrderS + 1)].Color565 = colors[(uint) (Tiles[index].getVegetableState())].get565(); 02240 } 02241 } 02242 } |
|
unbind the patch from All neighbors. neighbors patchs links are modified too. The tesselation is forcemerged. Definition at line 1724 of file patch.cpp. References _BindZoneNeighbor, NL3D::CTessFace::FLeft, NL3D::CTessFace::forceMerge(), NL3D::CTessFace::FRight, NL3D::CTessFace::isLeaf(), nlassert, Son0, Son1, and NL3D::CTessFace::unbind(). Referenced by NL3D::CZone::bindPatch(), and NL3D::CZone::unbindPatch().
01725 { 01726 nlassert(Son0 && Son1); 01727 01728 Son0->unbind(); 01729 Son1->unbind(); 01730 Son0->forceMerge(); 01731 Son1->forceMerge(); 01732 // forcemerge should have be completed. 01733 nlassert(Son0->isLeaf() && Son1->isLeaf()); 01734 // unbind should have be completed. 01735 nlassert(Son0->FLeft == NULL); 01736 nlassert(Son0->FRight == NULL); 01737 nlassert(Son1->FLeft == NULL); 01738 nlassert(Son1->FRight == NULL); 01739 01740 01741 // unbind Noise. 01742 _BindZoneNeighbor[0]= NULL; 01743 _BindZoneNeighbor[1]= NULL; 01744 _BindZoneNeighbor[2]= NULL; 01745 _BindZoneNeighbor[3]= NULL; 01746 01747 } |
|
For lighting update, unlink (CiruclarList).
Definition at line 1897 of file patch_lightmap.cpp. References _ULNearNext, and _ULNearPrec. Referenced by NL3D::CLandscape::unlinkPatchFromNearUL().
01898 { 01899 // first, unlink others from me. NB: works even if _ULNearPrec==_ULNearNext==this. 01900 _ULNearNext->_ULNearPrec= _ULNearPrec; 01901 _ULNearPrec->_ULNearNext= _ULNearNext; 01902 // reset 01903 _ULNearPrec= this; 01904 _ULNearNext= this; 01905 } |
|
Definition at line 192 of file patch.cpp. References NL3D::CZone::getPatchBias(), NL3D::CZone::getPatchScale(), NL3D::CBezierPatch::Interiors, sint, NL3D::CBezierPatch::Tangents, NL3D::CVector3s::unpack(), and NL3D::CBezierPatch::Vertices. Referenced by unpackIntoCache().
00193 { 00194 sint i; 00195 const CVector &bias= Zone->getPatchBias(); 00196 float scale= Zone->getPatchScale(); 00197 00198 for(i=0;i<4;i++) 00199 Vertices[i].unpack(p.Vertices[i], bias, scale); 00200 for(i=0;i<8;i++) 00201 Tangents[i].unpack(p.Tangents[i], bias, scale); 00202 for(i=0;i<4;i++) 00203 Interiors[i].unpack(p.Interiors[i], bias, scale); 00204 } |
|
Definition at line 182 of file patch.cpp. References CachePatch, LastPatch, and unpack(). Referenced by addPatchBlocksInBBox(), addTrianglesInBBox(), appendTileMaterialToRenderList(), buildBBox(), NL3D::CZoneLighter::buildZoneInformation(), computeDefaultErrorSize(), computeNoise(), computeNormalCornerSmooth(), computeNormalEdgeSmooth(), computeNormalOnNeighbor(), computeVertex(), createVegetableBlock(), NL3D::CPatchDLMContext::generate(), generateTileVegetable(), NL3D::CLandscapeVegetableBlock::init(), and NL3D::CZoneLighter::processZonePointLightRT().
00183 { 00184 if(LastPatch!=this) 00185 { 00186 unpack(CachePatch); 00187 LastPatch=this; 00188 } 00189 return &CachePatch; 00190 } |
|
Unpack a 4x4 lumel block
Definition at line 70 of file patch_lightmap.cpp. References src, uint, and uint8. Referenced by computeTileLightmapPrecomputed(), getTileLumelmapPrecomputed(), packShadowMap(), and unpackShadowMap().
00071 { 00072 // Take the two alpha values 00073 uint alpha0=src[0]; 00074 uint alpha1=src[1]; 00075 00076 // precompute the 8 possible values, for each possible code. 00077 // ------------------ 00078 uint8 values[8]; 00079 // Case 0 00080 if (alpha0>alpha1) 00081 { 00082 // unrolled, and hardcoded for faster compute 00083 values[0]= alpha0; 00084 values[1]= alpha1; 00085 values[2]= (uint8) ( (alpha0*219 + alpha1*37 ) >>8 ) ; // 6*256/7 00086 values[3]= (uint8) ( (alpha0*183 + alpha1*73 ) >>8 ) ; // 5*256/7 00087 values[4]= (uint8) ( (alpha0*146 + alpha1*110) >>8 ) ; // 4*256/7 00088 values[5]= (uint8) ( (alpha0*110 + alpha1*146) >>8 ) ; // 3*256/7 00089 values[6]= (uint8) ( (alpha0*73 + alpha1*183) >>8 ) ; // 2*256/7 00090 values[7]= (uint8) ( (alpha0*37 + alpha1*219) >>8 ) ; // 1*256/7 00091 } 00092 // Case 1 00093 else 00094 { 00095 // unrolled, and hardcoded for faster compute 00096 values[0]= alpha0; 00097 values[1]= alpha1; 00098 values[2]= (uint8) ( (alpha0*205 + alpha1*51 ) >>8 ) ; // 4*256/5 00099 values[3]= (uint8) ( (alpha0*154 + alpha1*102) >>8 ) ; // 3*256/5 00100 values[4]= (uint8) ( (alpha0*102 + alpha1*154) >>8 ) ; // 2*256/5 00101 values[5]= (uint8) ( (alpha0*51 + alpha1*205) >>8 ) ; // 1*256/5 00102 values[6]= 0; 00103 values[7]= 255; 00104 } 00105 00106 00107 // For each pixel, set the value according to the code 00108 // ------------------ 00109 uint block8Pixs[2]; 00110 // Split the 48 bits data in 2 24 bits pass. 00111 block8Pixs[0]= ((uint)src[2]<<16) + ((uint)src[3]<<8) + ((uint)src[4]) ; 00112 block8Pixs[1]= ((uint)src[5]<<16) + ((uint)src[6]<<8) + ((uint)src[7]) ; 00113 00114 // write all lumels 00115 for(uint i=0; i<2; i++) 00116 { 00117 uint blockPix= block8Pixs[i]; 00118 // parse the 8 pixs, and write seq to dest 00119 for(uint n=8; n>0; n--, dest++) 00120 { 00121 uint code= (blockPix>>21)&0x7; 00122 00123 // read LUT, and store 00124 *dest= values[code]; 00125 00126 // shift the block 00127 blockPix<<= 3; 00128 } 00129 } 00130 00131 } |
|
Unpack the lumels of the patches. Lumels are classes that describe the lighting environnement at a given texel of the lightmap. It is used to compute the shadow map of the patch, compress it and uncompress it. This method uncompress the lumels stored in its Lumels member.
Definition at line 170 of file patch_lightmap.cpp. References CompressedLumels, NL_BLOCK_LUMEL_COMPRESSED_SIZE, NL_LUMEL_BY_TILE, nlassert, uint, uint8, unpackLumelBlock(), and v. Referenced by NL3D::CTextureFar::rebuildPatch(), and NL3D::CZone::retrieve().
00171 { 00172 // Input of compresed data 00173 uint8 *compressedData=&CompressedLumels[0]; 00174 00175 // Number of lumel by lines 00176 uint lumelCount=OrderS*NL_LUMEL_BY_TILE; 00177 00178 // Number of block in a line 00179 nlassert ((lumelCount&0x3)==0); 00180 uint numLumelBlock=lumelCount>>2; 00181 00182 // Number of line 00183 uint lineCount=OrderT*NL_LUMEL_BY_TILE; 00184 00185 // Number of block line 00186 nlassert ((lineCount&0x3)==0); 00187 uint numLineBlock=lineCount>>2; 00188 00189 // Destination lumel block size 00190 uint lumelDestBlockSize=4; 00191 00192 // Destination lumel line block size 00193 uint lumelDestLineBlockSize=lumelCount*lumelDestBlockSize; 00194 00195 // Each line block 00196 for (uint lineBlock=0; lineBlock<numLineBlock; lineBlock++) 00197 { 00198 uint countVx4=16; 00199 00200 // Block pointer 00201 uint8 *blockLine=pLumelDest; 00202 00203 // Each lumel block 00204 for (uint lumelBlock=0; lumelBlock<numLumelBlock; lumelBlock++) 00205 { 00206 // *** Unpack the block 00207 uint countU=4; 00208 00209 // Destination lumel 00210 uint8 *blockDest=blockLine; 00211 00212 // Temp block 00213 uint8 block[4*4]; 00214 00215 // Block unpacking... 00216 unpackLumelBlock (block, compressedData); 00217 00218 // Copy the lumels 00219 for (uint v=0; v<countVx4; v+=4) 00220 { 00221 for (uint u=0; u<countU; u++) 00222 { 00223 // Copy the lumel 00224 blockDest[u]=block[v+u]; 00225 } 00226 00227 // Next line 00228 blockDest+=lumelCount; 00229 } 00230 00231 // Next source block 00232 compressedData+=NL_BLOCK_LUMEL_COMPRESSED_SIZE; 00233 00234 // Next block on the line 00235 blockLine+=lumelDestBlockSize; 00236 } 00237 00238 // Next line of block 00239 pLumelDest+=lumelDestLineBlockSize; 00240 } 00241 } |
|
Definition at line 1464 of file patch_render.cpp. References allocateVBAndFaceVector(), deleteVBAndFaceVector(), NLMISC::CObjectVector< CTessBlock >::empty(), fillVB(), NL3D::CTessBlock::forceClip(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint.
01465 { 01466 // If now the patch is invisible 01467 if(renderClipped) 01468 { 01469 // Then delete vertices. 01470 deleteVBAndFaceVector(); 01471 01472 // Now, all vertices in VB are deleted. 01473 // Force clip state of all TessBlocks, so no allocation will be done on Vertices in VB. 01474 if(!TessBlocks.empty()) 01475 { 01476 for(uint i=0; i<TessBlocks.size();i++) 01477 { 01478 CTessBlock &tblock= TessBlocks[i]; 01479 tblock.forceClip(); 01480 } 01481 } 01482 } 01483 else 01484 { 01485 // else allocate / fill them. 01486 allocateVBAndFaceVector(); 01487 // NB: fillVB() test if any reallocation occurs. 01488 fillVB(); 01489 } 01490 } |
|
Definition at line 744 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessFarVertex::Index0, and NL3D::CTessNodeList::Next. Referenced by preRender(), and updateVBAlloc().
00745 { 00746 // Traverse the vertList. 00747 CTessFarVertex *pVert; 00748 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 00749 { 00750 if(alloc) 00751 pVert->Index0= CLandscapeGlobals::CurrentFar0VBAllocator->allocateVertex(); 00752 else 00753 CLandscapeGlobals::CurrentFar0VBAllocator->deleteVertex(pVert->Index0); 00754 } 00755 } |
|
Definition at line 759 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessFarVertex::Index1, and NL3D::CTessNodeList::Next. Referenced by allocateVBAndFaceVectorFar1Only(), deleteVBAndFaceVectorFar1Only(), preRender(), and updateVBAlloc().
00760 { 00761 // Traverse the vertList. 00762 CTessFarVertex *pVert; 00763 for(pVert= vertList.begin(); pVert; pVert= (CTessFarVertex*)pVert->Next) 00764 { 00765 if(alloc) 00766 pVert->Index1= CLandscapeGlobals::CurrentFar1VBAllocator->allocateVertex(); 00767 else 00768 CLandscapeGlobals::CurrentFar1VBAllocator->deleteVertex(pVert->Index1); 00769 } 00770 } |
|
recompute the near lightmap of tessBlock "numTb". return the number of pixels updated by computing of this tessBlock. Actually 0 if the tessBlock lightmap is not computed, or 100 (NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE) pixels. Definition at line 1909 of file patch_lightmap.cpp. References computeNearBlockLightmap(), NL3D::CZone::Landscape, NL3D::CTessBlock::LightMapId, NL3D::CTessBlock::LightMapRefCount, NL_TILE_LIGHTMAP_SIZE, nlassert, NL3D::CLandscape::refillTileLightMap(), NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, and uint. Referenced by NL3D::CLandscape::updateLightingTextureNear().
01910 { 01911 // TessBlocks must have been allocated and tessBlockId must be ok. 01912 nlassert(numTb<TessBlocks.size()); 01913 01914 // compute tessBlock coordinate 01915 uint tbWidth= OrderS>>1; 01916 uint ts= numTb&(tbWidth-1); 01917 uint tt= numTb/tbWidth; 01918 // expand to tile coordinate. 01919 ts*= 2; 01920 tt*= 2; 01921 01922 // get what tessBlock to use. 01923 CTessBlock &tessBlock= TessBlocks[numTb]; 01924 01925 // If the lightmap Id has not been computed, quit 01926 if(tessBlock.LightMapRefCount==0) 01927 return 0; 01928 else 01929 { 01930 // Recompute the lightmap texture, with help of TileColors, with neighboring info etc... 01931 CRGBA lightText[NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE]; 01932 computeNearBlockLightmap(ts&(~1), tt&(~1), lightText); 01933 01934 // donlod this texture to Driver etc... 01935 Zone->Landscape->refillTileLightMap(tessBlock.LightMapId, lightText); 01936 01937 // return number of pixels computed. 01938 return NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE; 01939 } 01940 } |
|
Definition at line 226 of file patch_render.cpp. References computeNewFar(), and sint.
00227 { 00228 sint newFar0,newFar1; 00229 // compute new Far0 and new Far1. 00230 computeNewFar(patchSphere, newFar0, newFar1); 00231 00232 // Far change. 00233 //------------------ 00234 // Set new far values 00235 Far0= newFar0; 00236 Far1= newFar1; 00237 } |
|
Definition at line 774 of file patch_render.cpp. References NL3D::CTessList< T >::begin(), NL3D::CTessNearVertex::Index, and NL3D::CTessNodeList::Next. Referenced by preRender(), and updateVBAlloc().
00775 { 00776 // Traverse the vertList. 00777 CTessNearVertex *pVert; 00778 for(pVert= vertList.begin(); pVert; pVert= (CTessNearVertex*)pVert->Next) 00779 { 00780 if(alloc) 00781 pVert->Index= CLandscapeGlobals::CurrentTileVBAllocator->allocateVertex(); 00782 else 00783 CLandscapeGlobals::CurrentTileVBAllocator->deleteVertex(pVert->Index); 00784 } 00785 } |
|
Definition at line 789 of file patch_render.cpp. References NL3D::CTessBlock::FarVertexList, MasterBlock, NL3D::CTessBlock::NearVertexList, sint, NLMISC::CObjectVector< CTessBlock >::size(), TessBlocks, updateFar0VBAlloc(), updateFar1VBAlloc(), updateTileVBAlloc(), NL3D::CTessBlock::visibleFar0(), NL3D::CTessBlock::visibleFar1(), and NL3D::CTessBlock::visibleTile(). Referenced by allocateVBAndFaceVector(), and deleteVBAndFaceVector().
00790 { 00791 // update Far0. 00792 //======= 00793 if(Far0>0) 00794 { 00795 // alloc Far0 VB. 00796 updateFar0VBAlloc(MasterBlock.FarVertexList, alloc); 00797 for(sint i=0; i<(sint)TessBlocks.size(); i++) 00798 { 00799 CTessBlock &tblock= TessBlocks[i]; 00800 // need update VB only if tessBlock is visible. 00801 if( tblock.visibleFar0() ) 00802 updateFar0VBAlloc(tblock.FarVertexList, alloc); 00803 } 00804 } 00805 else if (Far0==0) 00806 { 00807 // alloc Tile VB. 00808 // No Tiles in MasterBlock!! 00809 // Traverse the TessBlocks to add vertices. 00810 for(sint i=0; i<(sint)TessBlocks.size(); i++) 00811 { 00812 CTessBlock &tblock= TessBlocks[i]; 00813 // Add the vertices. 00814 // need update VB only if tessBlock is visible. 00815 if( tblock.visibleTile() ) 00816 updateTileVBAlloc(tblock.NearVertexList, alloc); 00817 } 00818 } 00819 00820 // update Far1. 00821 //======= 00822 if(Far1>0) 00823 { 00824 // alloc VB. 00825 updateFar1VBAlloc(MasterBlock.FarVertexList, alloc); 00826 for(sint i=0; i<(sint)TessBlocks.size(); i++) 00827 { 00828 CTessBlock &tblock= TessBlocks[i]; 00829 // need update VB only if tessBlock is visible. 00830 if( tblock.visibleFar1() ) 00831 updateFar1VBAlloc(tblock.FarVertexList, alloc); 00832 } 00833 } 00834 } |
|
|
|
|
|
|
|
|
|
The 4 neighbors zone of this patch (setuped at bind() time). NB: NULL if zone not loaded, or if no patch near us.
Definition at line 1110 of file patch.h. Referenced by bind(), CPatch(), getBindNeighbor(), and unbind(). |
|
Put here for packing with NoiseRotation.
Definition at line 362 of file patch.h. Referenced by CPatch(), getCornerSmoothFlag(), serial(), and setCornerSmoothFlag(). |
|
The Dynamic LightMap context. created only when compiled, AND (when in Near OR (when in Far AND touched by pointLight)) else NULL. Definition at line 1214 of file patch.h. Referenced by addRefDLMContext(), beginDLMLighting(), CPatch(), decRefDLMContext(), endDLMLighting(), fillFar0DLMUvOnlyVertexListVB(), fillFar0VertexVB(), fillFar1DLMUvOnlyVertexListVB(), fillFar1VertexVB(), generateTileVegetable(), NL3D::CTessFace::initTileUvDLM(), processDLMLight(), and release(). |
|
The reference count for DLMContext. Each TileMaterial created add a reference. Each pointLight wich touch the patch too. Definition at line 1219 of file patch.h. Referenced by addRefDLMContext(), CPatch(), decRefDLMContext(), and release(). |
|
Definition at line 872 of file patch.h. Referenced by NL3D::CPatchRdrPass::appendRdrPatchFar0(), CPatch(), and getNextFar0ToRdr(). |
|
Definition at line 874 of file patch.h. Referenced by NL3D::CPatchRdrPass::appendRdrPatchFar1(), CPatch(), and getNextFar1ToRdr(). |
|
Definition at line 871 of file patch.h. Referenced by computeNewFar(), CPatch(), preRender(), renderFar0(), and resetRenderFar(). |
|
Definition at line 873 of file patch.h. Referenced by computeNewFar(), CPatch(), preRender(), renderFar1(), and resetRenderFar(). |
|
Definition at line 1203 of file patch.h. Referenced by compile(), CPatch(), getNextNearUL(), linkBeforeNearUL(), release(), and unlinkNearUL(). |
|
Definition at line 1202 of file patch.h. Referenced by compile(), CPatch(), linkBeforeNearUL(), release(), and unlinkNearUL(). |
|
Stream version of the class. Definition at line 57 of file patch.cpp. Referenced by serial(). |
|
Definition at line 822 of file patch.h. Referenced by makeRoots(). |
|
Definition at line 820 of file patch.h. Referenced by averageTesselationVertices(), bind(), compile(), computeContinousVertex(), computeVertexButCorner(), getCornerVertex(), makeRoots(), and refreshTesselationGeometry(). |
|
Definition at line 55 of file patch.cpp. Referenced by unpackIntoCache(). |
|
Definition at line 337 of file patch.h. Referenced by computeTileLightmapEdgePrecomputed(), computeTileLightmapPixelPrecomputed(), computeTileLightmapPrecomputed(), getTileLumelmapPixelPrecomputed(), getTileLumelmapPrecomputed(), packShadowMap(), resetCompressedLumels(), serial(), and unpackShadowMap(). |
|
Definition at line 816 of file patch.h. Referenced by compile(), computeDefaultErrorSize(), getErrorSize(), and makeRoots(). |
|
Definition at line 807 of file patch.h. Referenced by CPatch(), and NL3D::CZone::refineAll(). |
|
|
|
Definition at line 827 of file patch.h. Referenced by computeNewFar(), and fillFar0VertexVB(). |
|
Definition at line 827 of file patch.h. Referenced by computeNewFar(), and fillFar0VertexVB(). |
|
Definition at line 827 of file patch.h. Referenced by computeNewFar(), and fillFar0VertexVB(). |
|
Definition at line 827 of file patch.h. Referenced by computeNewFar(), and fillFar0VertexVB(). |
|
|
|
Definition at line 828 of file patch.h. Referenced by computeNewFar(), and fillFar1VertexVB(). |
|
Definition at line 828 of file patch.h. Referenced by computeNewFar(), and fillFar1VertexVB(). |
|
Definition at line 828 of file patch.h. Referenced by computeNewFar(), and fillFar1VertexVB(). |
|
Definition at line 828 of file patch.h. Referenced by computeNewFar(), and fillFar1VertexVB(). |
|
Flags NL_PATCH_FAR0_ROTATED and NL_PATCH_FAR1_ROTATED NL_PATCH_FAR0_ROTATED for Far0, NL_PATCH_FAR1_ROTATED for Far1 If the flag is set, the far texture of the patch is rotated of 1 (to the left of course) Flags NL_PATCH_SMOOTH_FLAG_MASK 4 flag for smooth edge. Same as CPatchInfo::CBindInfo shifted by (<<NL_PATCH_SMOOTH_FLAG_SHIFT). See CPatchInfo::CBindInfo::Flags for details. Definition at line 840 of file patch.h. Referenced by NL3D::CZone::build(), and NL3D::CZone::retrieve(). |
|
Definition at line 329 of file patch.h. Referenced by NL3D::CZone::applyHeightField(), NL3D::CZone::build(), and NL3D::CZone::retrieve(). |
|
Definition at line 56 of file patch.cpp. Referenced by unpackIntoCache(). |
|
|
The orientation of the NoiseMap. 0,1,2,3. This represent a CCW rotation of the NoiseMap.
Definition at line 352 of file patch.h. Referenced by NL3D::CZone::build(), computeDisplaceRawCoordinates(), CPatch(), NL3D::CZone::retrieve(), and serial(). |
|
Definition at line 879 of file patch.h. Referenced by appendFaceToRenderList(), NL3D::CPatchRdrPass::appendRdrPatchFar0(), NL3D::CPatchRdrPass::appendRdrPatchFar1(), CPatch(), preRender(), removeFaceFromRenderList(), and resetMasterBlock(). |
|
Definition at line 845 of file patch.h. Referenced by computeGeomorphAlphaFar1VertexListVB(), computeNewFar(), and fillFar1VertexVB(). |
|
Definition at line 804 of file patch.h. Referenced by bind(), NL3D::CZone::build(), NL3D::CZone::compile(), NL3D::CTessFace::computeTileMaterial(), and NL3D::CZone::retrieve(). |
|
Definition at line 804 of file patch.h. Referenced by bind(), NL3D::CZone::build(), NL3D::CZone::compile(), NL3D::CTessFace::computeTileMaterial(), and NL3D::CZone::retrieve(). |
|
|
|
Definition at line 818 of file patch.h. Referenced by appendTessellationLeaves(), averageTesselationVertices(), bind(), changeEdgeNeighbor(), CPatch(), deleteTileUvs(), forceMergeAtTileLevel(), getRootFaceForEdge(), getRootVertexForEdge(), getTesselatedPos(), linkTessFaceWithEdge(), makeRoots(), recreateTileUvs(), refineAll(), refreshTesselationGeometry(), release(), and unbind(). |
|
Definition at line 818 of file patch.h. Referenced by appendTessellationLeaves(), averageTesselationVertices(), bind(), changeEdgeNeighbor(), CPatch(), deleteTileUvs(), forceMergeAtTileLevel(), getRootFaceForEdge(), getRootVertexForEdge(), getTesselatedPos(), linkTessFaceWithEdge(), makeRoots(), recreateTileUvs(), refineAll(), refreshTesselationGeometry(), release(), and unbind(). |
|
Definition at line 814 of file patch.h. Referenced by compile(), and NL3D::CTessFace::isRectangular(). |
|
Definition at line 328 of file patch.h. Referenced by NL3D::CZone::applyHeightField(), NL3D::CZone::build(), and NL3D::CZone::retrieve(). |
|
Definition at line 810 of file patch.h. Referenced by appendFaceToRenderList(), compile(), extendTessBlockWithEndPos(), and removeFaceFromRenderList(). |
|
Definition at line 886 of file patch.h. Referenced by addRefTessBlocks(), clearTessBlocks(), CPatch(), and decRefTessBlocks(). |
|
|
Definition at line 343 of file patch.h. Referenced by NL3D::CZone::build(), NL3D::CPatchDLMContext::compileLighting(), NL3D::CPatchDLMContext::computeTextureFar(), NL3D::CPatchDLMContext::generate(), getTileTileColors(), NL3D::CTextureFar::rebuildPatch(), NL3D::CZone::retrieve(), serial(), and setupColorsFromTileFlags(). |
|
Definition at line 346 of file patch.h. Referenced by appendTileLightInfluences(), NL3D::CZone::build(), resetTileLightInfluences(), NL3D::CZone::retrieve(), and serial(). |
|
|
|
Definition at line 844 of file patch.h. Referenced by computeGeomorphAlphaFar1VertexListVB(), computeNewFar(), and fillFar1VertexVB(). |
|
list of vegetable clipBlocks, created/destroyed at same time as TessBlocks.
Definition at line 893 of file patch.h. Referenced by addRefTessBlocks(), clearTessBlocks(), and createVegetableBlock(). |
|
The patch coordinates (see CBezierPatch).
Definition at line 327 of file patch.h. Referenced by NL3D::CZone::applyHeightField(), NL3D::CZone::build(), and NL3D::CZone::retrieve(). |
|
|