#include <vegetable_manager.h>
Because during render(), it uses and setup special "Vegetable Blend Layer models" to render transparents alpha blended vegetables. Toses models are transparent so they are drawn during the transparent pass of the renderTrav's CScene (so after the Opaque pass).
Nevrax France
Definition at line 75 of file vegetable_manager.h.
UpdateLighting management | |
| void | doUpdateLighting () |
| update lighting according to _ULNVerticesToUpdate | |
| uint | updateInstanceLighting (CVegetableInstanceGroup *ig, uint rdrPassId, uint instanceId) |
| bool | updateLightingIGPart () |
| uint | _ULCurrentIgInstance |
| update lighting according to _ULNVerticesToUpdate | |
| uint | _ULCurrentIgRdrPass |
| Current instance to render in the first ig to update: rdrpass/instanceId. | |
| float | _ULFrequency |
| Frequency of update. | |
| uint | _ULNTotalVertices |
| Sum of all ig vertices to update. | |
| float | _ULNVerticesToUpdate |
| Current number of vertices to update. If negative, I have some advance. | |
| double | _ULPrecTime |
| bool | _ULPrecTimeInit |
| update lighting according to _ULNVerticesToUpdate | |
| CVegetableInstanceGroup * | _ULRootIg |
| the priority list of ig to update | |
| double | _ULTime |
| update lighting according to _ULNVerticesToUpdate | |
CVegetableBlendLayerModel mgt. | |
| void | exitRenderStateForBlendLayerModel (IDriver *driver) |
| void | setupRenderStateForBlendLayerModel (IDriver *driver) |
| called by CVegetableBlendLayerModel. | |
| uint | _NumZSortBlendLayers |
| For Alpha Blend rdrPass, ordering into layers. | |
| float | _ZSortLayerDistMax |
| std::vector< CVegetableBlendLayerModel * > | _ZSortModelLayers |
| std::vector< CVegetableBlendLayerModel * > | _ZSortModelLayersUW |
| CScene * | _ZSortScene |
Public Types | |
| enum | TVegetableWater { AboveWater = 0, UnderWater, IntersectWater, VegetInfoLast } |
| Micro vegetation position against Water. Above water is the default. More... | |
Public Member Functions | |
| void | createVegetableBlendLayersModels (CScene *scene) |
| CVegetableManager (uint maxVertexVbHardUnlit, uint maxVertexVbHardLighted, uint nbBlendLayers=20, float blendLayerDistMax=60.f) | |
| ~CVegetableManager () | |
Adding Instances to an Ig. | |
| void | addInstance (CVegetableInstanceGroup *ig, CVegetableShape *shape, const NLMISC::CMatrix &mat, const NLMISC::CRGBAF &ambientColor, const NLMISC::CRGBAF &diffuseColor, float bendFactor, float bendPhase, float bendFreqFactor, float blendDistMax, TVegetableWater vegetWaterState, CVegetableUV8 dlmUV) |
| void | reserveIgAddInstances (CVegetableInstanceGroupReserve &vegetIgReserve, CVegetableShape *shape, TVegetableWater vegetWaterState, uint numInstances) |
| void | reserveIgCompile (CVegetableInstanceGroup *ig, const CVegetableInstanceGroupReserve &vegetIgReserve) |
instance management | |
| CVegetableClipBlock * | createClipBlock () |
| Create a clipBlock where SortBlock will be created. | |
| CVegetableInstanceGroup * | createIg (CVegetableSortBlock *sortBlock) |
| CVegetableSortBlock * | createSortBlock (CVegetableClipBlock *clipBlock, const CVector ¢er, float radius) |
| void | deleteClipBlock (CVegetableClipBlock *clipBlock) |
| delete such a clipBlock. all sortBlocks and so all ig must be deleted before. | |
| void | deleteIg (CVegetableInstanceGroup *ig) |
| void | deleteSortBlock (CVegetableSortBlock *sortBlock) |
| delete such a SortBlock. all ig must be deleted before. | |
Profile | |
| uint | getNumVegetableFaceRendered () const |
| get the number of faces rendered by the vegetable manager | |
| void | resetNumVegetableFaceRendered () |
| set to 0 the number of faces rendered | |
Shape management | |
| CVegetableShape * | getVegetableShape (const std::string &shape) |
| Load a shape if necessary, and return a shapeId for this shape. | |
render | |
| void | loadTexture (ITexture *itex) |
| setup a global texture used for all vegetables (smartPtr-ized). | |
| void | loadTexture (const std::string &texName) |
| load a global texture used for all vegetables (lookup into CPath). | |
| void | lockBuffers () |
| void | render (const CVector &viewCenter, const CVector &frontVector, const std::vector< CPlane > &pyramid, ITexture *textureDLM, IDriver *driver) |
| void | setDirectionalLight (const CRGBA &ambient, const CRGBA &diffuse, const CVector &light) |
| setup the directional light | |
| void | unlockBuffers () |
| unlock any AGP vertex buffers | |
| void | updateDriver (IDriver *driver) |
| must give a driver to the vegetableManager, before any addInstance(). | |
Wind animation | |
| void | setTime (double time) |
| void | setWind (const CVector &windDir, float windFreq, float windPower, float windBendMin) |
UpdateLighting management | |
| void | setUpdateLightingFrequency (float freq) |
| void | setUpdateLightingTime (double time) |
| void | updateLighting () |
| void | updateLightingAll () |
Private Types | |
| typedef TShapeMap::iterator | ItShapeMap |
| typedef std::map< std::string, CVegetableShape > | TShapeMap |
Private Member Functions | |
| uint | getRdrPassInfoForShape (CVegetableShape *shape, TVegetableWater vegetWaterState, bool &instanceLighted, bool &instanceDoubleSided, bool &instanceZSort, bool &destLighted, bool &precomputeLighting) |
| get the rdrPass and other info for a given shape. | |
| CVegetableVBAllocator & | getVBAllocatorForRdrPassAndVBHardMode (uint rdrPass, uint vbHardMode) |
| Get the good allocator for the appropriate rdr pass. | |
| void | initVertexProgram (uint vpType) |
| init the ith vertexProgram. | |
| void | setupVertexProgramConstants (IDriver *driver) |
| setup the vertexProgram constants. | |
| void | swapIgRdrPassHardMode (CVegetableInstanceGroup *, uint rdrPass) |
Static Private Member Functions | |
| bool | doubleSidedRdrPass (uint rdrPass) |
Private Attributes | |
| CTessList< CVegetableClipBlock > | _ClipBlockList |
| NLMISC::CBlockMemory< CVegetableClipBlock > | _ClipBlockMemory |
| CVector | _DirectionalLight |
| CTessList< CVegetableClipBlock > | _EmptyClipBlockList |
| NLMISC::CRGBA | _GlobalAmbient |
| NLMISC::CRGBA | _GlobalDiffuse |
| NLMISC::CBlockMemory< CVegetableInstanceGroup > | _InstanceGroupMemory |
| NLMISC::CRefPtr< IDriver > | _LastDriver |
| uint | _NumVegetableFaceRendered |
| profile | |
| TShapeMap | _ShapeMap |
| NLMISC::CBlockMemory< CVegetableSortBlock > | _SortBlockMemory |
| CVegetableVBAllocator | _VBHardAllocator [CVegetableVBAllocator::VBTypeCount] |
| CVegetableVBAllocator | _VBSoftAllocator [CVegetableVBAllocator::VBTypeCount] |
| CMaterial | _VegetableMaterial |
| CVertexProgram * | _VertexProgram [NL3D_VEGETABLE_NRDRPASS] |
Misc data to setup renderState (computed at each render()) | |
| CVector | _AngleAxis |
| bool | _BkupFog |
| NLMISC::CMatrix | _ManagerMatrix |
| CVector | _ViewCenter |
Wind animation | |
| float | _CosTable [NL3D_VEGETABLE_VP_LUT_SIZE] |
| double | _Time |
| double | _WindAnimTime |
| float | _WindBendMin |
| NLMISC::CVector2f | _WindDeltaTable [NL3D_VEGETABLE_VP_LUT_SIZE] |
| CVector | _WindDirection |
| float | _WindFrequency |
| float | _WindPower |
| double | _WindPrecRenderTime |
| NLMISC::CVector2f | _WindTable [NL3D_VEGETABLE_VP_LUT_SIZE] |
Friends | |
| class | CVegetableBlendLayerModel |
|
|
Definition at line 301 of file vegetable_manager.h. Referenced by getVegetableShape(). |
|
|
Definition at line 300 of file vegetable_manager.h. |
|
|
Micro vegetation position against Water. Above water is the default.
Definition at line 79 of file vegetable_manager.h.
00079 { AboveWater = 0, UnderWater, IntersectWater, VegetInfoLast };
|
|
||||||||||||||||||||
|
Definition at line 58 of file vegetable_manager.cpp. References _DirectionalLight, _GlobalAmbient, _GlobalDiffuse, _NumVegetableFaceRendered, _NumZSortBlendLayers, _ULCurrentIgInstance, _ULCurrentIgRdrPass, _ULNTotalVertices, _ULNVerticesToUpdate, _ULRootIg, _VBHardAllocator, _VBSoftAllocator, _VegetableMaterial, _WindAnimTime, _WindBendMin, _WindDirection, _WindFrequency, _WindPower, _WindPrecRenderTime, _ZSortModelLayers, _ZSortModelLayersUW, NL3D::CVegetableVBAllocator::init(), NL3D::CMaterial::initUnlit(), NL3D_VEGETABLE_CLIP_BLOCK_BLOCKSIZE, NL3D_VEGETABLE_INSTANCE_GROUP_BLOCKSIZE, NL3D_VEGETABLE_NRDRPASS, NL3D_VEGETABLE_SORT_BLOCK_BLOCKSIZE, NL3D_VEGETABLE_VP_LUT_SIZE, nlassert, NLMISC::CVector::normed(), NLMISC::Pi, NLMISC::CVector::set(), NLMISC::CRGBA::set(), NL3D::CMaterial::setAlphaTest(), NL3D::CMaterial::setBlendFunc(), and uint.
00059 : 00060 _ClipBlockMemory(NL3D_VEGETABLE_CLIP_BLOCK_BLOCKSIZE), 00061 _SortBlockMemory(NL3D_VEGETABLE_SORT_BLOCK_BLOCKSIZE), 00062 _InstanceGroupMemory(NL3D_VEGETABLE_INSTANCE_GROUP_BLOCKSIZE), 00063 _NumZSortBlendLayers(nbBlendLayers), _ZSortLayerDistMax(blendLayerDistMax), 00064 _ZSortScene(NULL) 00065 { 00066 uint i; 00067 00068 // Init all the allocators 00069 nlassert((uint)(CVegetableVBAllocator::VBTypeCount) == 2); 00070 _VBHardAllocator[CVegetableVBAllocator::VBTypeLighted].init( CVegetableVBAllocator::VBTypeLighted, maxVertexVbHardLighted ); 00071 _VBHardAllocator[CVegetableVBAllocator::VBTypeUnlit].init( CVegetableVBAllocator::VBTypeUnlit, maxVertexVbHardUnlit ); 00072 // Init soft one, with no vbHard vertices. 00073 _VBSoftAllocator[CVegetableVBAllocator::VBTypeLighted].init( CVegetableVBAllocator::VBTypeLighted, 0 ); 00074 _VBSoftAllocator[CVegetableVBAllocator::VBTypeUnlit].init( CVegetableVBAllocator::VBTypeUnlit, 0 ); 00075 00076 // NB Vertex programs are initilized during the first call to update driver. 00077 00078 // setup the material. Unlit (doesn't matter, lighting in VP) Alpha Test. 00079 _VegetableMaterial.initUnlit(); 00080 _VegetableMaterial.setAlphaTest(true); 00081 _VegetableMaterial.setBlendFunc(CMaterial::srcalpha, CMaterial::invsrcalpha); 00082 00083 // default light. 00084 _DirectionalLight= (CVector(0,1, -1)).normed(); 00085 _GlobalAmbient.set(64, 64, 64, 255); 00086 _GlobalDiffuse.set(150, 150, 150, 255); 00087 00088 // Wind. 00089 _WindDirection.set(1,0,0); 00090 _WindFrequency= 1; 00091 _WindPower= 1; 00092 _WindBendMin= 0; 00093 _Time= 0; 00094 _WindPrecRenderTime= 0; 00095 _WindAnimTime= 0; 00096 00097 // Init CosTable. 00098 for(i=0; i<NL3D_VEGETABLE_VP_LUT_SIZE; i++) 00099 { 00100 _CosTable[i]= (float)cos( i*2*Pi / NL3D_VEGETABLE_VP_LUT_SIZE ); 00101 } 00102 00103 // init to NULL _ZSortModelLayers. 00104 _NumZSortBlendLayers= max(1U, _NumZSortBlendLayers); 00105 _ZSortModelLayers.resize(_NumZSortBlendLayers, NULL); 00106 _ZSortModelLayersUW.resize(_NumZSortBlendLayers, NULL); 00107 00108 00109 // UL 00110 _ULFrequency= 0; 00111 _ULNVerticesToUpdate=0; 00112 _ULNTotalVertices= 0; 00113 _ULRootIg= NULL; 00114 _ULCurrentIgRdrPass= 0; 00115 _ULCurrentIgInstance= 0; 00116 _ULPrecTime= 0; 00117 _ULPrecTimeInit= false; 00118 _ULTime= 0; 00119 00120 // Misc. 00121 _NumVegetableFaceRendered= 0; 00122 00123 std::fill(_VertexProgram, _VertexProgram + NL3D_VEGETABLE_NRDRPASS, (CVertexProgram *) NULL); 00124 00125 } |
|
|
Definition at line 129 of file vegetable_manager.cpp. References _NumZSortBlendLayers, _ZSortModelLayers, _ZSortModelLayersUW, _ZSortScene, NL3D::CScene::deleteModel(), NL3D_VEGETABLE_NRDRPASS, sint, and uint.
00130 {
00131 // delete All VP
00132 for(sint i=0; i <NL3D_VEGETABLE_NRDRPASS; i++)
00133 {
00134 delete _VertexProgram[i];
00135 _VertexProgram[i]= NULL;
00136 }
00137
00138 // delete ZSort models.
00139 if(_ZSortScene)
00140 {
00141 // remove models from scene.
00142 for(uint i= 0; i<_NumZSortBlendLayers; i++)
00143 {
00144 _ZSortScene->deleteModel(_ZSortModelLayers[i]);
00145 _ZSortModelLayers[i]= NULL;
00146 _ZSortScene->deleteModel(_ZSortModelLayersUW[i]);
00147 _ZSortModelLayersUW[i]= NULL;
00148 }
00149
00150 _ZSortScene= NULL;
00151 }
00152 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
add an instance to an ig, enlarging the associated clipBlock bbox. If the shape is not lighted, then only diffuseColor is used, to setup color per vertex. Warning! Use OptFastFloor()! So call must be enclosed with a OptFastFloorBegin()/OptFastFloorEnd(). Also, buffer must be locked. ambientColor and diffuseColor should be in [0..1] (no clamp), else uint8 will wrap... nlassert() if no sufficient space reserved in reserveIgCompile().
Definition at line 1036 of file vegetable_manager.cpp. References NL3D::CVegetableSortBlock::_Center, NL3D::CVegetableInstanceGroup::_ClipOwner, _DirectionalLight, NL3D::CVegetableSortBlock::_Dirty, _GlobalAmbient, _GlobalDiffuse, NL3D::CVegetableInstanceGroup::_HasZSortPassInstances, NL3D::CVegetableSortBlock::_InstanceGroupList, NL3D::CVegetableSortBlock::_Radius, NL3D::CVegetableInstanceGroup::_RdrPass, NL3D::CVegetableInstanceGroup::_SortOwner, NL3D::CVegetableInstanceGroup::_TriangleQuadrantOrderNumTriangles, NL3D::CVegetableInstanceGroup::_TriangleQuadrantOrders, _ULNTotalVertices, NL3D::CVegetableInstanceGroup::_ULNumVertices, _ULRootIg, NL3D::CVegetableSortBlock::_UnderWater, NLMISC::CRGBA::A, NL3D::CVegetableVBAllocator::allocateVertex(), NLMISC::CRGBAF::B, NLMISC::CRGBA::B, NL3D::CTessList< CVegetableInstanceGroup >::begin(), NL3D::CVegetableShape::BendCenterMode, NL3D::CVegetableShape::BestSidedPreComputeLighting, NL3D::CVegetableLightEx::Color, NL3D::computeVegetVertexLighting(), NL3D::computeVegetVertexLightingForceBestSided(), NLMISC::CObjectVector< uint32, false >::copy(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::DlmUV, NL3D::CVegetableVBAllocator::exceedMaxVertexInBufferHard(), NL3D::CVegetableClipBlock::extendBBoxOnly(), NL3D::CVegetableClipBlock::extendSphere(), NL3D::CVegetableVBAllocator::flushVertex(), NLMISC::CRGBAF::G, NLMISC::CRGBA::G, NL3D::CVertexBuffer::getNormalOff(), NL3D::CVertexBuffer::getNumVertices(), NLMISC::CMatrix::getPos(), getRdrPassInfoForShape(), NL3D::CVegetableVBAllocator::getSoftwareVertexBuffer(), NL3D::CVertexBuffer::getTexCoordOff(), NL3D::CVertexBuffer::getValueOffEx(), getVBAllocatorForRdrPassAndVBHardMode(), NL3D::CVertexBuffer::getVertexCoordPointer(), NL3D::CVegetableVBAllocator::getVertexPointer(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::HardMode, NL3D::CVegetableShape::InstanceVertices, NLMISC::CMatrix::invert(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::LightedInstances, NL3D::CVegetableInstanceGroup::linkBeforeUL(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::MatAmbient, NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::MatDiffuse, NLMISC::CRGBA::modulateFromColorRGBOnly(), NLMISC::CMatrix::mulVector(), NL3D::CTessNodeList::Next, NL3D_VEGETABLE_BLOCK_BLEND_TRANSITION_DIST, NL3D_VEGETABLE_FREQUENCY_FACTOR_PREC, NL3D_VEGETABLE_NUM_QUADRANT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, NL3D_VEGETABLE_VPPOS_BENDINFO, NL3D_VEGETABLE_VPPOS_CENTER, NL3D_VEGETABLE_VPPOS_COLOR0, NL3D_VEGETABLE_VPPOS_COLOR1, NL3D_VEGETABLE_VPPOS_NORMAL, NL3D_VEGETABLE_VPPOS_TEX0, nlassert, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NLightedInstances, NLMISC::CVector::norm(), NLMISC::CVector::normalize(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::NormalMat, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NTriangles, NL3D::CVegetableLightEx::NumLights, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NVertices, NLMISC::OptFastFloor(), NLMISC::CRGBAF::R, NLMISC::CRGBA::R, NLMISC::CMatrix::setRot(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::Shape, sint, sint16, NLMISC::CObjectVector< CVegetableLightedInstance >::size(), NLMISC::CObjectVector< uint32, false >::size(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::StartIdInRdrPass, swapIgRdrPassHardMode(), NLMISC::CMatrix::transpose(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleIndices, NL3D::CVegetableShape::TriangleIndices, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleLocalIndices, NL3D::CVegetableUV8::U, uint, uint8, NL3D::CVegetableClipBlock::updateSphere(), v, NL3D::CVegetableUV8::V, NL3D::CVegetableShape::VB, NL3D::CVegetableInstanceGroup::VegetableLightEx, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::Vertices, NLMISC::CVectorH::w, NLMISC::CVector::x, NLMISC::CVector::y, NLMISC::CVector::z, and NL3D::CVegetableSortBlock::ZSortHardMode. Referenced by NL3D::CVegetable::generateInstance().
01041 {
01042 sint i;
01043
01044
01045 // Some setup.
01046 //--------------------
01047 bool instanceLighted;
01048 bool instanceDoubleSided;
01049 bool instanceZSort;
01050 bool destLighted;
01051 bool precomputeLighting;
01052
01053 // get correct rdrPass / info
01054 uint rdrPass;
01055 rdrPass= getRdrPassInfoForShape(shape, vegetWaterState, instanceLighted, instanceDoubleSided,
01056 instanceZSort, destLighted, precomputeLighting);
01057 // bestSided Precompute lighting or not??
01058 bool bestSidedPrecomputeLighting= precomputeLighting && shape->BestSidedPreComputeLighting;
01059
01060
01061 // veget rdrPass
01062 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ig->_RdrPass[rdrPass];
01063
01064 // color.
01065 // setup using OptFastFloor.
01066 CRGBA ambientRGBA, diffuseRGBA;
01067 CRGBA primaryRGBA, secondaryRGBA;
01068 // diffuseColor
01069 diffuseRGBA.R= (uint8)NLMISC::OptFastFloor(diffuseColor.R*255);
01070 diffuseRGBA.G= (uint8)NLMISC::OptFastFloor(diffuseColor.G*255);
01071 diffuseRGBA.B= (uint8)NLMISC::OptFastFloor(diffuseColor.B*255);
01072 diffuseRGBA.A= 255;
01073 // ambientColor
01074 ambientRGBA.R= (uint8)NLMISC::OptFastFloor(ambientColor.R*255);
01075 ambientRGBA.G= (uint8)NLMISC::OptFastFloor(ambientColor.G*255);
01076 ambientRGBA.B= (uint8)NLMISC::OptFastFloor(ambientColor.B*255);
01077 ambientRGBA.A= 255;
01078
01079 // For Lighted, modulate with global light.
01080 if(instanceLighted)
01081 {
01082 primaryRGBA.modulateFromColorRGBOnly(diffuseRGBA, _GlobalDiffuse);
01083 secondaryRGBA.modulateFromColorRGBOnly(ambientRGBA, _GlobalAmbient);
01084 }
01085 // if the instance is not lighted, then don't take care of lighting
01086 else
01087 {
01088 primaryRGBA.R= diffuseRGBA.R;
01089 primaryRGBA.G= diffuseRGBA.G;
01090 primaryRGBA.B= diffuseRGBA.B;
01091 // may not be useFull (2Sided lighting no more supported)
01092 secondaryRGBA= primaryRGBA;
01093 }
01094
01095 // Copy Dynamic Lightmap UV in Alpha part (save memory for an extra cost of 1 VP instruction)
01096 primaryRGBA.A= dlmUV.U;
01097 secondaryRGBA.A= dlmUV.V;
01098
01099 // get ref on the vegetLex.
01100 CVegetableLightEx &vegetLex= ig->VegetableLightEx;
01101 // Color of pointLights modulated by diffuse.
01102 CRGBA diffusePL[2];
01103 if(vegetLex.NumLights>=1)
01104 {
01105 diffusePL[0].modulateFromColorRGBOnly(diffuseRGBA, vegetLex.Color[0]);
01106 if(vegetLex.NumLights>=2)
01107 {
01108 diffusePL[1].modulateFromColorRGBOnly(diffuseRGBA, vegetLex.Color[1]);
01109 }
01110 }
01111
01112 // normalize bendFreqFactor
01113 bendFreqFactor*= NL3D_VEGETABLE_FREQUENCY_FACTOR_PREC;
01114 bendFreqFactor= (float)floor(bendFreqFactor + 0.5f);
01115 bendFreqFactor/= NL3D_VEGETABLE_FREQUENCY_FACTOR_PREC;
01116
01117
01118 // Get allocator, and manage VBhard overriding.
01119 //--------------------
01120 CVegetableVBAllocator *allocator;
01121 // if still in Sfot mode, keep it.
01122 if(!vegetRdrPass.HardMode)
01123 {
01124 // get the soft allocator.
01125 allocator= &getVBAllocatorForRdrPassAndVBHardMode(rdrPass, 0);
01126 }
01127 else
01128 {
01129 // Get VB allocator Hard for this rdrPass
01130 allocator= &getVBAllocatorForRdrPassAndVBHardMode(rdrPass, 1);
01131 // Test if the instance don't add too many vertices for this VBHard
01132 if(allocator->exceedMaxVertexInBufferHard(shape->VB.getNumVertices()))
01133 {
01134 // if exceed, then must pass ALL the IG in software mode. vertices/faces are correclty updated.
01135 // special: if rdrPass is the ZSort one,
01136 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
01137 {
01138 nlassert(ig->_SortOwner->ZSortHardMode);
01139
01140 // must do it on ALL igs of the sortBlock, for less VBuffer mode switching.
01141 CVegetableInstanceGroup *pIg= ig->_SortOwner->_InstanceGroupList.begin();
01142 while(pIg)
01143 {
01144 // let's pass them in software mode.
01145 swapIgRdrPassHardMode(pIg, rdrPass);
01146 // next
01147 pIg= (CVegetableInstanceGroup*)pIg->Next;
01148 }
01149
01150 // Then all The sortBlock is in SoftMode.
01151 ig->_SortOwner->ZSortHardMode= false;
01152 }
01153 else
01154 {
01155 // just do it on this Ig (can mix hardMode in a SortBlock for normal rdrPass)
01156 swapIgRdrPassHardMode(ig, rdrPass);
01157 }
01158
01159 // now, we can use the software only Allocator to append our instance
01160 allocator= &getVBAllocatorForRdrPassAndVBHardMode(rdrPass, 0);
01161 }
01162 }
01163
01164
01165 // get correct dstVB
01166 const CVertexBuffer &dstVBInfo= allocator->getSoftwareVertexBuffer();
01167
01168
01169 // Transform vertices to a vegetable instance, and enlarge clipBlock
01170 //--------------------
01171 // compute matrix to multiply normals, ie (M-1)t
01172 CMatrix normalMat;
01173 // need just rotation scale matrix.
01174 normalMat.setRot(mat);
01175 normalMat.invert();
01176 normalMat.transpose();
01177 // compute Instance position
01178 CVector instancePos;
01179 mat.getPos(instancePos);
01180
01181
01182 // At least, the bbox of the clipBlock must include the center of the shape.
01183 ig->_ClipOwner->extendSphere(instancePos);
01184
01185
01186 // Vertex/triangle Info.
01187 uint numNewVertices= shape->VB.getNumVertices();
01188 uint numNewTris= shape->TriangleIndices.size()/3;
01189 uint numNewIndices= shape->TriangleIndices.size();
01190
01191 // src info.
01192 uint srcNormalOff= (instanceLighted? shape->VB.getNormalOff() : 0);
01193 uint srcTex0Off= shape->VB.getTexCoordOff(0);
01194 uint srcTex1Off= shape->VB.getTexCoordOff(1);
01195
01196 // dst info
01197 uint dstNormalOff= (destLighted? dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_NORMAL) : 0);
01198 uint dstColor0Off= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_COLOR0);
01199 uint dstColor1Off= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_COLOR1);
01200 uint dstTex0Off= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_TEX0);
01201 uint dstBendOff= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_BENDINFO);
01202 uint dstCenterOff= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_CENTER);
01203
01204
01205 // Usefull For !destLighted only.
01206 CVector deltaPos;
01207 float deltaPosNorm=0.0;
01208
01209
01210 // UseFull for ZSORT rdrPass, the worldVertices.
01211 static vector<CVector> worldVertices;
01212 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
01213 {
01214 worldVertices.resize(numNewVertices);
01215 }
01216
01217
01218 // For all vertices of shape, transform and store manager indices in temp shape.
01219 for(i=0; i<(sint)numNewVertices;i++)
01220 {
01221 // allocate a Vertex
01222 uint vid= allocator->allocateVertex();
01223 // store in tmp shape.
01224 shape->InstanceVertices[i]= vid;
01225
01226 // Fill this vertex.
01227 uint8 *srcPtr= (uint8*)shape->VB.getVertexCoordPointer(i);
01228 uint8 *dstPtr= (uint8*)allocator->getVertexPointer(vid);
01229
01230 // Get bendWeight for this vertex.
01231 float vertexBendWeight= ((CUV*)(srcPtr + srcTex1Off))->U * bendFactor;
01232
01233 // Pos.
01234 //-------
01235 // Separate Center and relative pos.
01236 CVector relPos= mat.mulVector(*(CVector*)srcPtr); // mulVector, because translation in v[center]
01237 // compute bendCenterPos
01238 CVector bendCenterPos;
01239 if(shape->BendCenterMode == CVegetableShapeBuild::BendCenterNull)
01240 bendCenterPos= CVector::Null;
01241 else
01242 {
01243 CVector v= *(CVector*)srcPtr;
01244 v.z= 0;
01245 bendCenterPos= mat.mulVector(v); // mulVector, because translation in v[center]
01246 }
01247 // copy
01248 deltaPos= relPos-bendCenterPos;
01249 *(CVector*)dstPtr= deltaPos;
01250 *(CVector*)(dstPtr + dstCenterOff)= instancePos + bendCenterPos;
01251 // if !destLighted, then VP is different
01252 if(!destLighted)
01253 {
01254 deltaPosNorm= deltaPos.norm();
01255 // copy bendWeight in v.w
01256 CVectorH *vh= (CVectorH*)dstPtr;
01257 // Mul by deltaPosNorm, to draw an arc circle.
01258 vh->w= vertexBendWeight * deltaPosNorm;
01259 }
01260
01261 // Enlarge the clipBlock of the IG.
01262 // Since small shape, enlarge with each vertices. simpler and maybe faster.
01263 // TODO_VEGET: bend and clipping ...
01264 ig->_ClipOwner->extendBBoxOnly(instancePos + relPos);
01265
01266 // prepare for ZSort
01267 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
01268 {
01269 worldVertices[i]= instancePos + relPos;
01270 }
01271
01272
01273 // Color-ligthing.
01274 //-------
01275 if(!precomputeLighting)
01276 {
01277 // just copy the primary color (means diffuse part if lighted)
01278 *(CRGBA*)(dstPtr + dstColor0Off)= primaryRGBA;
01279 // normal and secondary color
01280 if(destLighted)
01281 {
01282 // normal
01283 *(CVector*)(dstPtr + dstNormalOff)= normalMat.mulVector( *(CVector*)(srcPtr + srcNormalOff) );
01284 }
01285 // If destLighted, secondaryRGBA is the ambient
01286 // else secondaryRGBA is used only for Alpha (DLM uv.v).
01287 *(CRGBA*)(dstPtr + dstColor1Off)= secondaryRGBA;
01288 }
01289 else
01290 {
01291 nlassert(!destLighted);
01292
01293 // compute normal.
01294 CVector rotNormal= normalMat.mulVector( *(CVector*)(srcPtr + srcNormalOff) );
01295 // must normalize() because scale is possible.
01296 rotNormal.normalize();
01297
01298 // Do the compute.
01299 if(!bestSidedPrecomputeLighting)
01300 {
01301 computeVegetVertexLighting(rotNormal,
01302 _DirectionalLight, primaryRGBA, secondaryRGBA,
01303 vegetLex, diffusePL, (CRGBA*)(dstPtr + dstColor0Off) );
01304 }
01305 else
01306 {
01307 computeVegetVertexLightingForceBestSided(rotNormal,
01308 _DirectionalLight, primaryRGBA, secondaryRGBA,
01309 vegetLex, diffusePL, (CRGBA*)(dstPtr + dstColor0Off) );
01310 }
01311
01312 // copy secondaryRGBA, used only for Alpha (DLM uv.v).
01313 *(CRGBA*)(dstPtr + dstColor1Off)= secondaryRGBA;
01314 }
01315
01316
01317 // Texture.
01318 //-------
01319 *(CUV*)(dstPtr + dstTex0Off)= *(CUV*)(srcPtr + srcTex0Off);
01320
01321 // Bend.
01322 //-------
01323 CVector *dstBendPtr= (CVector*)(dstPtr + dstBendOff);
01324 // setup bend Phase.
01325 dstBendPtr->y= bendPhase;
01326 // setup bend Weight.
01327 // if !destLighted, then VP is different, vertexBendWeight is stored in v[0].w
01328 if(destLighted)
01329 dstBendPtr->x= vertexBendWeight;
01330 else
01331 // the VP need the norm of relPos in v[9].x
01332 dstBendPtr->x= deltaPosNorm;
01333 // setup bendFreqFactor
01334 dstBendPtr->z= bendFreqFactor;
01336 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
01337 {
01338 // get ptr on v[9].w NB: in Unlit mode, it has 4 components.
01339 CVectorH *dstBendPtr= (CVectorH*)(dstPtr + dstBendOff);
01340 // setup the constant of linear formula:
01341 // Alpha= -1/blendTransDist * dist + blendDistMax/blendTransDist
01342 dstBendPtr->w= blendDistMax/NL3D_VEGETABLE_BLOCK_BLEND_TRANSITION_DIST;
01343 }
01344
01345
01346 // fill the vertex in AGP.
01347 //-------
01348 allocator->flushVertex(vid);
01349 }
01350
01351
01352 // must recompute the sphere according to the bbox.
01353 ig->_ClipOwner->updateSphere();
01354
01355
01356 // If ZSort, compute Triangle Centers and Orders for quadrant
01357 //--------------------
01358 if(rdrPass==NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
01359 {
01360 // inform the SB that it must be updated.
01361 ig->_SortOwner->_Dirty= true;
01362 // For deletion, inform the ig that it has instances which impact the SB.
01363 ig->_HasZSortPassInstances= true;
01364
01365 // change UnderWater falg of the SB
01366 if(vegetWaterState == AboveWater)
01367 ig->_SortOwner->_UnderWater= false;
01368 else if(vegetWaterState == UnderWater)
01369 ig->_SortOwner->_UnderWater= true;
01370
01371 // static to avoid reallocation
01372 static vector<CVector> triangleCenters;
01373 triangleCenters.resize(numNewTris);
01374
01375 // compute triangle centers
01376 for(uint i=0; i<numNewTris; i++)
01377 {
01378 // get index in shape.
01379 uint v0= shape->TriangleIndices[i*3+0];
01380 uint v1= shape->TriangleIndices[i*3+1];
01381 uint v2= shape->TriangleIndices[i*3+2];
01382
01383 // get world coord.
01384 const CVector &vert0= worldVertices[v0];
01385 const CVector &vert1= worldVertices[v1];
01386 const CVector &vert2= worldVertices[v2];
01387
01388 // compute center
01389 triangleCenters[i]= (vert0 + vert1 + vert2) / 3;
01390 // relative to center of the sortBlock (for sint16 compression)
01391 triangleCenters[i]-= ig->_SortOwner->_Center;
01392 }
01393
01394
01395 // resize the array. Actually only modify the number of triangles really setuped.
01396 uint offTri= ig->_TriangleQuadrantOrderNumTriangles;
01397 ig->_TriangleQuadrantOrderNumTriangles+= numNewTris;
01398 // verify user has correclty used reserveIg system.
01399 nlassert(ig->_TriangleQuadrantOrderNumTriangles * NL3D_VEGETABLE_NUM_QUADRANT <= ig->_TriangleQuadrantOrderArray.size());
01400
01401
01402 // compute distance for each quadrant. Since we are not sure of the sortBlockSize, mul with a (big: 16) security.
01403 // NB: for landscape practical usage, this left us with more than 1mm precision.
01404 float distFactor=32768/(16*ig->_SortOwner->_Radius);
01405 for(uint quadId=0; quadId<NL3D_VEGETABLE_NUM_QUADRANT; quadId++)
01406 {
01407 const CVector &quadDir= CVegetableQuadrant::Dirs[quadId];
01408
01409 // For all tris.
01410 for(uint i=0; i<numNewTris; i++)
01411 {
01412 // compute the distance with orientation of the quadrant. (DotProduct)
01413 float dist= triangleCenters[i] * quadDir;
01414 // compress to sint16.
01415 ig->_TriangleQuadrantOrders[quadId][offTri + i]= (sint16)NLMISC::OptFastFloor(dist*distFactor);
01416 }
01417 }
01418 }
01419
01420
01421 // Append list of indices and list of triangles to the IG
01422 //--------------------
01423
01424 // TODO_VEGET_OPTIM: system reallocation of array is very bad...
01425
01426
01427 // compute dest start idx.
01428 uint offVertex= vegetRdrPass.NVertices;
01429 uint offTri= vegetRdrPass.NTriangles;
01430 uint offTriIdx= offTri*3;
01431
01432 // verify user has correclty used reserveIg system.
01433 nlassert(offVertex + numNewVertices <= vegetRdrPass.Vertices.size());
01434 nlassert(offTriIdx + numNewIndices <= vegetRdrPass.TriangleIndices.size());
01435 nlassert(offTriIdx + numNewIndices <= vegetRdrPass.TriangleLocalIndices.size());
01436
01437
01438 // insert list of vertices to delete in ig vertices.
01439 vegetRdrPass.Vertices.copy(offVertex, offVertex+numNewVertices, &shape->InstanceVertices[0]);
01440
01441 // insert array of triangles in ig.
01442 // for all indices, fill IG
01443 for(i=0; i<(sint)numNewIndices; i++)
01444 {
01445 // get the index of the vertex in the shape
01446 uint vid= shape->TriangleIndices[i];
01447 // re-direction, using InstanceVertices;
01448 vegetRdrPass.TriangleIndices[offTriIdx + i]= shape->InstanceVertices[vid];
01449 // local re-direction: adding vertexOffset.
01450 vegetRdrPass.TriangleLocalIndices[offTriIdx + i]= offVertex + vid;
01451 }
01452
01453 // new triangle and vertex size.
01454 vegetRdrPass.NTriangles+= numNewTris;
01455 vegetRdrPass.NVertices+= numNewVertices;
01456
01457
01458 // if lighted, must add a lightedInstance for lighting update.
01459 //--------------------
01460 if(instanceLighted)
01461 {
01462 // first, update Ig.
01463 ig->_ULNumVertices+= numNewVertices;
01464 // and update the vegetable manager.
01465 _ULNTotalVertices+= numNewVertices;
01466 // link at the end of the circular list: link before the current root.
01467 if(_ULRootIg==NULL)
01468 _ULRootIg= ig;
01469 else
01470 ig->linkBeforeUL(_ULRootIg);
01471
01472 // check good use of reserveIg.
01473 nlassert(vegetRdrPass.NLightedInstances < vegetRdrPass.LightedInstances.size());
01474
01475 // Fill instance info
01476 CVegetableInstanceGroup::CVegetableLightedInstance &vli=
01477 vegetRdrPass.LightedInstances[vegetRdrPass.NLightedInstances];
01478 vli.Shape= shape;
01479 vli.NormalMat= normalMat;
01480 // copy colors unmodulated by global light.
01481 vli.MatAmbient= ambientRGBA;
01482 vli.MatDiffuse= diffuseRGBA;
01483 // store dynamic lightmap UV
01484 vli.DlmUV= dlmUV;
01485 // where vertices of this instances are wrote in the VegetRdrPass
01486 vli.StartIdInRdrPass= offVertex;
01487
01488 // Inc size setuped.
01489 vegetRdrPass.NLightedInstances++;
01490 }
01491
01492 }
|
|
|
Create a clipBlock where SortBlock will be created.
Definition at line 607 of file vegetable_manager.cpp. References _ClipBlockMemory, _EmptyClipBlockList, NLMISC::CBlockMemory< CVegetableClipBlock >::allocate(), and NL3D::CTessList< CVegetableClipBlock >::append(). Referenced by NL3D::CPatch::addRefTessBlocks().
00608 {
00609 // create a clipblock
00610 CVegetableClipBlock *ret;
00611 ret= _ClipBlockMemory.allocate();
00612
00613 // append to list.
00614 _EmptyClipBlockList.append(ret);
00615
00616 return ret;
00617 }
|
|
|
create an instance group in a sortBlock, where instances will be created. Instances will be frustum-clipped by the clipBlock, and sorted (for the ZSort rdrPass only) by sortBlock. Definition at line 672 of file vegetable_manager.cpp. References _ClipBlockList, NL3D::CVegetableInstanceGroup::_ClipOwner, _EmptyClipBlockList, NL3D::CVegetableSortBlock::_InstanceGroupList, _InstanceGroupMemory, NL3D::CVegetableClipBlock::_NumIgs, NL3D::CVegetableSortBlock::_Owner, NL3D::CVegetableInstanceGroup::_RdrPass, NL3D::CVegetableInstanceGroup::_SortOwner, NLMISC::CBlockMemory< CVegetableInstanceGroup >::allocate(), NL3D::CTessList< CVegetableInstanceGroup >::append(), NL3D::CTessList< CVegetableClipBlock >::append(), NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlassert, NL3D::CTessList< CVegetableClipBlock >::remove(), and NL3D::CVegetableSortBlock::ZSortHardMode. Referenced by NL3D::CLandscapeVegetableBlock::createVegetableIGForDistType().
00673 {
00674 nlassert(sortBlock);
00675 CVegetableClipBlock *clipBlock= sortBlock->_Owner;
00676
00677
00678 // create an IG
00679 CVegetableInstanceGroup *ret;
00680 ret= _InstanceGroupMemory.allocate();
00681 ret->_SortOwner= sortBlock;
00682 ret->_ClipOwner= clipBlock;
00683
00684 // if the clipBlock is empty, change list, because won't be no more.
00685 if(clipBlock->_NumIgs==0)
00686 {
00687 // remove from empty list
00688 _EmptyClipBlockList.remove(clipBlock);
00689 // and append to not empty one.
00690 _ClipBlockList.append(clipBlock);
00691 }
00692
00693 // inc the number of igs appended to the clipBlock.
00694 clipBlock->_NumIgs++;
00695
00696 // link ig to sortBlock.
00697 sortBlock->_InstanceGroupList.append(ret);
00698
00699 // Special Init: The ZSort rdrPass must start with the same HardMode than SortBlock.
00700 ret->_RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT].HardMode= sortBlock->ZSortHardMode;
00701
00702 return ret;
00703 }
|
|
||||||||||||||||
|
Create a SortBlock in a clipBlock where instance group (ig) will be created. All AlphaBlend instances created in a SortBlock should have the same vegetWaterState: AboveWater or UnderWater. Each time an instance is added to the sortBlock it changes the _UnderWater state of the sortBlock.
Definition at line 637 of file vegetable_manager.cpp. References NL3D::CVegetableSortBlock::_Center, NL3D::CVegetableSortBlock::_Owner, NL3D::CVegetableSortBlock::_Radius, NL3D::CVegetableClipBlock::_SortBlockList, _SortBlockMemory, NLMISC::CBlockMemory< CVegetableSortBlock >::allocate(), NL3D::CTessList< CVegetableSortBlock >::append(), and nlassert. Referenced by NL3D::CLandscapeVegetableBlock::init().
00638 {
00639 nlassert(clipBlock);
00640
00641 // create a clipblock
00642 CVegetableSortBlock *ret;
00643 ret= _SortBlockMemory.allocate();
00644 ret->_Owner= clipBlock;
00645 ret->_Center= center;
00646 ret->_Radius= radius;
00647
00648 // append to list.
00649 clipBlock->_SortBlockList.append(ret);
00650
00651 return ret;
00652 }
|
|
|
Before any render(), you must call this method (else nlassert). It creates the necessary models in the scene, to manage AlphaBlending correctly. Those models are deleted in the object dtor. Definition at line 156 of file vegetable_manager.cpp. References _NumZSortBlendLayers, _ZSortModelLayers, _ZSortModelLayersUW, _ZSortScene, nlassert, uint, and NL3D::VegetableBlendLayerModelId. Referenced by NL3D::CLandscape::createVegetableBlendLayersModels().
00157 {
00158 // setup scene
00159 nlassert(scene);
00160 _ZSortScene= scene;
00161
00162 // create the layers models.
00163 for(uint i=0;i<_NumZSortBlendLayers; i++)
00164 {
00165 // assert not already done.
00166 nlassert(_ZSortModelLayers[i]==NULL);
00167 nlassert(_ZSortModelLayersUW[i]==NULL);
00168
00169 _ZSortModelLayers[i]= (CVegetableBlendLayerModel*)scene->createModel(VegetableBlendLayerModelId);
00170 _ZSortModelLayersUW[i]= (CVegetableBlendLayerModel*)scene->createModel(VegetableBlendLayerModelId);
00171 // init owner.
00172 _ZSortModelLayers[i]->VegetableManager= this;
00173 _ZSortModelLayersUW[i]->VegetableManager= this;
00174
00175 // Set UnderWater layer for _ZSortModelLayersUW
00176 _ZSortModelLayersUW[i]->setOrderingLayer(2);
00177 }
00178 }
|
|
|
delete such a clipBlock. all sortBlocks and so all ig must be deleted before.
Definition at line 620 of file vegetable_manager.cpp. References _ClipBlockMemory, _EmptyClipBlockList, NL3D::CVegetableClipBlock::_SortBlockList, NLMISC::CBlockMemory< CVegetableClipBlock >::free(), nlassert, NL3D::CTessList< CVegetableClipBlock >::remove(), and NL3D::CTessList< CVegetableSortBlock >::size(). Referenced by NL3D::CPatch::clearTessBlocks().
00621 {
00622 if(!clipBlock)
00623 return;
00624
00625 // verify no more sortBlocks in this clipblock
00626 nlassert(clipBlock->_SortBlockList.size() == 0);
00627
00628 // unlink from _EmptyClipBlockList, because _InstanceGroupList.size() == 0 ...
00629 _EmptyClipBlockList.remove(clipBlock);
00630
00631 // delete
00632 _ClipBlockMemory.free(clipBlock);
00633 }
|
|
|
delete such an ig. After doing this, you must call igSortBlockOwner->updateSortBlock() If the sortBlock has many Igs, you can do it after deleting all your igs. Definition at line 706 of file vegetable_manager.cpp. References _ClipBlockList, NL3D::CVegetableInstanceGroup::_ClipOwner, NL3D::CVegetableSortBlock::_Dirty, _EmptyClipBlockList, NL3D::CVegetableInstanceGroup::_HasZSortPassInstances, NL3D::CVegetableSortBlock::_InstanceGroupList, _InstanceGroupMemory, NL3D::CVegetableClipBlock::_NumIgs, NL3D::CVegetableInstanceGroup::_RdrPass, NL3D::CVegetableInstanceGroup::_SortOwner, _ULCurrentIgInstance, _ULCurrentIgRdrPass, NL3D::CVegetableInstanceGroup::_ULNext, _ULNTotalVertices, NL3D::CVegetableInstanceGroup::_ULNumVertices, _ULRootIg, NL3D::CTessList< CVegetableClipBlock >::append(), NLMISC::CObjectVector< uint32, false >::clear(), NL3D::CVegetableVBAllocator::deleteVertex(), NLMISC::CBlockMemory< CVegetableInstanceGroup >::free(), getVBAllocatorForRdrPassAndVBHardMode(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::HardMode, NL3D_VEGETABLE_NRDRPASS, nlassert, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NVertices, NL3D::CTessList< CVegetableClipBlock >::remove(), NL3D::CTessList< CVegetableInstanceGroup >::remove(), sint, NLMISC::CObjectVector< uint32, false >::size(), uint, NL3D::CVegetableInstanceGroup::unlinkUL(), and NL3D::CVegetableInstanceGroup::CVegetableRdrPass::Vertices. Referenced by NL3D::CLandscapeVegetableBlock::createVegetableIGForDistType(), NL3D::CLandscapeVegetableBlock::release(), and NL3D::CLandscapeVegetableBlock::update().
00707 {
00708 if(!ig)
00709 return;
00710
00711 // update lighting mgt: no more vertices.
00712 // -----------
00713 // If I delete the ig which is the current root
00714 if(_ULRootIg == ig)
00715 {
00716 // switch to next
00717 _ULRootIg= ig->_ULNext;
00718 // if still the same, it means that the circular list is now empty
00719 if(_ULRootIg == ig)
00720 _ULRootIg= NULL;
00721 // Reset UL instance info.
00722 _ULCurrentIgRdrPass= 0;
00723 _ULCurrentIgInstance= 0;
00724 }
00725 // remove UL vertex count of the deleted ig
00726 _ULNTotalVertices-= ig->_ULNumVertices;
00727 // unlink the ig for lighting update.
00728 ig->unlinkUL();
00729
00730
00731 // For all render pass of this instance, delete his vertices
00732 // -----------
00733 for(sint rdrPass=0; rdrPass < NL3D_VEGETABLE_NRDRPASS; rdrPass++)
00734 {
00735 // rdrPass
00736 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ig->_RdrPass[rdrPass];
00737 // which allocator?
00738 CVegetableVBAllocator &vbAllocator= getVBAllocatorForRdrPassAndVBHardMode(rdrPass, vegetRdrPass.HardMode);
00739
00740 // For all vertices of this rdrPass, delete it
00741 sint numVertices;
00742 numVertices= vegetRdrPass.Vertices.size();
00743 // all vertices must have been setuped.
00744 nlassert((uint)numVertices == vegetRdrPass.NVertices);
00745 for(sint i=0; i<numVertices;i++)
00746 {
00747 vbAllocator.deleteVertex(vegetRdrPass.Vertices[i]);
00748 }
00749 vegetRdrPass.Vertices.clear();
00750 }
00751
00752 CVegetableClipBlock *clipBlock= ig->_ClipOwner;
00753 CVegetableSortBlock *sortBlock= ig->_SortOwner;
00754
00755 // If I have got some faces in ZSort rdrPass
00756 if(ig->_HasZSortPassInstances)
00757 // after my deletion, the sortBlock must be updated.
00758 sortBlock->_Dirty= true;
00759
00760
00761 // unlink from sortBlock, and delete.
00762 sortBlock->_InstanceGroupList.remove(ig);
00763 _InstanceGroupMemory.free(ig);
00764
00765
00766 // decRef the clipBlock
00767 clipBlock->_NumIgs--;
00768 // if the clipBlock is now empty, change list
00769 if(clipBlock->_NumIgs==0)
00770 {
00771 // remove from normal list
00772 _ClipBlockList.remove(clipBlock);
00773 // and append to empty list.
00774 _EmptyClipBlockList.append(clipBlock);
00775 }
00776
00777 }
|
|
|
delete such a SortBlock. all ig must be deleted before.
Definition at line 655 of file vegetable_manager.cpp. References NL3D::CVegetableSortBlock::_InstanceGroupList, NL3D::CVegetableSortBlock::_Owner, NL3D::CVegetableClipBlock::_SortBlockList, _SortBlockMemory, NLMISC::CBlockMemory< CVegetableSortBlock >::free(), nlassert, NL3D::CTessList< CVegetableSortBlock >::remove(), and NL3D::CTessList< CVegetableInstanceGroup >::size(). Referenced by NL3D::CLandscapeVegetableBlock::release().
00656 {
00657 if(!sortBlock)
00658 return;
00659
00660 // verify no more IGs in this sortblock
00661 nlassert(sortBlock->_InstanceGroupList.size() == 0);
00662
00663 // unlink from clipBlock
00664 sortBlock->_Owner->_SortBlockList.remove(sortBlock);
00665
00666 // delete
00667 _SortBlockMemory.free(sortBlock);
00668 }
|
|
|
Definition at line 1560 of file vegetable_manager.cpp. References NL3D_VEGETABLE_NRDRPASS, NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlassert, and uint. Referenced by render(), and setupRenderStateForBlendLayerModel().
01561 {
01562 nlassert(rdrPass<NL3D_VEGETABLE_NRDRPASS);
01563 return (rdrPass == NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED) ||
01564 (rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED) ||
01565 (rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT);
01566 }
|
|
|
update lighting according to _ULNVerticesToUpdate
Definition at line 2262 of file vegetable_manager.cpp. References NL3D::CVegetableInstanceGroup::_ULNext, _ULNVerticesToUpdate, _ULRootIg, and updateLightingIGPart(). Referenced by updateLighting(), and updateLightingAll().
02263 {
02264 // while there is still some vertices to update.
02265 while(_ULNVerticesToUpdate > 0 && _ULRootIg)
02266 {
02267 // update the current ig. if all updated, skip to next one.
02268 if(updateLightingIGPart())
02269 {
02270 // next
02271 _ULRootIg= _ULRootIg->_ULNext;
02272 }
02273 }
02274
02275 // Now, _ULNVerticesToUpdate should be <=0. (most of the time < 0)
02276 }
|
|
|
Definition at line 2180 of file vegetable_manager.cpp. References _BkupFog, NL3D::IDriver::activeVertexProgram(), and NL3D::IDriver::enableFog(). Referenced by NL3D::CVegetableBlendLayerModel::render().
02181 {
02182 // disable VertexProgram.
02183 driver->activeVertexProgram(NULL);
02184
02185 // restore Fog.
02186 driver->enableFog(_BkupFog);
02187 }
|
|
|
get the number of faces rendered by the vegetable manager
Definition at line 2173 of file vegetable_manager.cpp. References _NumVegetableFaceRendered, and uint. Referenced by NL3D::CLandscape::getNumVegetableFaceRendered().
02174 {
02175 return _NumVegetableFaceRendered;
02176 }
|
|
||||||||||||||||||||||||||||||||
|
get the rdrPass and other info for a given shape.
Definition at line 817 of file vegetable_manager.cpp. References NL3D::CVegetableShape::AlphaBlend, NL3D::CVegetableShape::DoubleSided, NL3D::CVegetableShape::Lighted, NL3D_VEGETABLE_RDRPASS_LIGHTED, NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, NL3D::CVegetableShape::PreComputeLighting, and uint. Referenced by addInstance(), and reserveIgAddInstances().
00820 {
00821 instanceLighted= shape->Lighted;
00822 instanceDoubleSided= shape->DoubleSided;
00823 // Disable ZSorting when we intersect water.
00824 instanceZSort= shape->AlphaBlend && vegetWaterState!=IntersectWater;
00825 destLighted= instanceLighted && !shape->PreComputeLighting;
00826 precomputeLighting= instanceLighted && shape->PreComputeLighting;
00827
00828 // get correct rdrPass
00829 uint rdrPass;
00830 // get according to lighted / doubleSided state
00831 if(destLighted)
00832 {
00833 if(instanceDoubleSided)
00834 rdrPass= NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED;
00835 else
00836 rdrPass= NL3D_VEGETABLE_RDRPASS_LIGHTED;
00837 }
00838 else
00839 {
00840 if(instanceDoubleSided)
00841 {
00842 if(instanceZSort)
00843 rdrPass= NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT;
00844 else
00845 rdrPass= NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED;
00846 }
00847 else
00848 rdrPass= NL3D_VEGETABLE_RDRPASS_UNLIT;
00849 }
00850
00851 return rdrPass;
00852 }
|
|
||||||||||||
|
Get the good allocator for the appropriate rdr pass.
Definition at line 182 of file vegetable_manager.cpp. References _VBHardAllocator, _VBSoftAllocator, NL3D_VEGETABLE_RDRPASS_LIGHTED, NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlstop, and uint. Referenced by addInstance(), deleteIg(), render(), NL3D::CVegetableBlendLayerModel::render(), swapIgRdrPassHardMode(), and updateInstanceLighting().
00183 {
00184 // If software VB
00185 if(vbHardMode==0)
00186 {
00187 if(rdrPass == NL3D_VEGETABLE_RDRPASS_LIGHTED)
00188 return _VBSoftAllocator[CVegetableVBAllocator::VBTypeLighted];
00189 if(rdrPass == NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED)
00190 return _VBSoftAllocator[CVegetableVBAllocator::VBTypeLighted];
00191 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT)
00192 return _VBSoftAllocator[CVegetableVBAllocator::VBTypeUnlit];
00193 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED)
00194 return _VBSoftAllocator[CVegetableVBAllocator::VBTypeUnlit];
00195 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
00196 return _VBSoftAllocator[CVegetableVBAllocator::VBTypeUnlit];
00197 }
00198 // If hard VB
00199 else
00200 {
00201 if(rdrPass == NL3D_VEGETABLE_RDRPASS_LIGHTED)
00202 return _VBHardAllocator[CVegetableVBAllocator::VBTypeLighted];
00203 if(rdrPass == NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED)
00204 return _VBHardAllocator[CVegetableVBAllocator::VBTypeLighted];
00205 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT)
00206 return _VBHardAllocator[CVegetableVBAllocator::VBTypeUnlit];
00207 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED)
00208 return _VBHardAllocator[CVegetableVBAllocator::VBTypeUnlit];
00209 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
00210 return _VBHardAllocator[CVegetableVBAllocator::VBTypeUnlit];
00211 }
00212
00213 // abnormal case
00214 nlstop;
00215 // To avoid warning;
00216 return _VBSoftAllocator[0];
00217 }
|
|
|
Load a shape if necessary, and return a shapeId for this shape.
Definition at line 781 of file vegetable_manager.cpp. References ItShapeMap, NL3D::CVegetableShape::loadShape(), and nlwarning. Referenced by NL3D::CVegetable::registerToManager().
00782 {
00783 ItShapeMap it= _ShapeMap.find(shape);
00784 // if found
00785 if(it != _ShapeMap.end())
00786 return &it->second;
00787 // else insert
00788 {
00789 // insert.
00790 CVegetableShape *ret;
00791 it= ( _ShapeMap.insert(make_pair(shape, CVegetableShape()) ) ).first;
00792 ret= &it->second;
00793
00794 // fill.
00795 try
00796 {
00797 ret->loadShape(shape);
00798 }
00799 catch (Exception &e)
00800 {
00801 // Warning
00802 nlwarning ("CVegetableManager::getVegetableShape error while loading shape file '%s' : '%s'", shape.c_str (), e.what ());
00803
00804 // Remove from map
00805 _ShapeMap.erase (shape);
00806
00807 // Return NULL
00808 ret = NULL;
00809 }
00810
00811 return ret;
00812 }
00813 }
|
|
|
init the ith vertexProgram.
Definition at line 562 of file vegetable_manager.cpp. References _LastDriver, NL3D::NL3D_BendProgram, NL3D::NL3D_CommonEndVegetableProgram, NL3D::NL3D_FastBendProgram, NL3D::NL3D_LightedStartVegetableProgram, NL3D::NL3D_UnlitAlphaBlendVegetableProgram, NL3D::NL3D_UnlitStartVegetableProgram, NL3D_VEGETABLE_RDRPASS_LIGHTED, NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlassert, and uint. Referenced by updateDriver().
00563 {
00564 nlassert(_LastDriver); // update driver should have been called at least once !
00565 // Init the Vertex Program.
00566 string vpgram;
00567 // start always with Bend.
00568 if( vpType==NL3D_VEGETABLE_RDRPASS_LIGHTED || vpType==NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED )
00569 vpgram= NL3D_BendProgram;
00570 else
00571 vpgram= NL3D_FastBendProgram;
00572
00573 // combine the VP according to Type
00574 switch(vpType)
00575 {
00576 case NL3D_VEGETABLE_RDRPASS_LIGHTED:
00577 case NL3D_VEGETABLE_RDRPASS_LIGHTED_2SIDED:
00578 vpgram+= string(NL3D_LightedStartVegetableProgram);
00579 break;
00580 case NL3D_VEGETABLE_RDRPASS_UNLIT:
00581 case NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED:
00582 vpgram+= string(NL3D_UnlitStartVegetableProgram);
00583 break;
00584 case NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT:
00585 vpgram+= string(NL3D_UnlitStartVegetableProgram);
00586 vpgram+= string(NL3D_UnlitAlphaBlendVegetableProgram);
00587 break;
00588 }
00589
00590 // common end of VP
00591 vpgram+= string(NL3D_CommonEndVegetableProgram);
00592
00593 // create VP.
00594 _VertexProgram[vpType]= new CVertexProgram(vpgram.c_str());
00595
00596 }
|
|
|
setup a global texture used for all vegetables (smartPtr-ized).
Definition at line 1604 of file vegetable_manager.cpp. References _VegetableMaterial, and NL3D::CMaterial::setTexture().
01605 {
01606 // setup a ITexture (smartPtr-ized).
01607 // Store in stage1, for dynamicLightmaping
01608 _VegetableMaterial.setTexture(1, itex);
01609 }
|
|
|
load a global texture used for all vegetables (lookup into CPath).
Definition at line 1592 of file vegetable_manager.cpp. References NL3D::ITexture::setFilterMode(), NL3D::ITexture::setWrapS(), and NL3D::ITexture::setWrapT(). Referenced by NL3D::CLandscape::loadVegetableTexture().
01593 {
01594 // setup a CTextureFile (smartPtr-ized).
01595 ITexture *tex= new CTextureFile(texName);
01596 loadTexture(tex);
01597 // setup good params.
01598 tex->setFilterMode(ITexture::Linear, ITexture::LinearMipMapLinear);
01599 tex->setWrapS(ITexture::Clamp);
01600 tex->setWrapT(ITexture::Clamp);
01601 }
|
|
|
lock any AGP vertex buffers. Do it wisely (just one time before refine as example). You MUST enclose calls to addInstance() (and so CVegetable::generateInstance()) with lockBuffers() / unlockBuffers(). Definition at line 1622 of file vegetable_manager.cpp. References _VBHardAllocator, _VBSoftAllocator, NL3D::CVegetableVBAllocator::lockBuffer(), and uint. Referenced by NL3D::CLandscape::lockBuffers().
01623 {
01624 // lock all buffers
01625 for(uint i=0; i <CVegetableVBAllocator::VBTypeCount; i++)
01626 {
01627 _VBHardAllocator[i].lockBuffer();
01628 _VBSoftAllocator[i].lockBuffer();
01629 }
01630 }
|
|
||||||||||||||||||||||||
|
render the manager into a driver, with current viewMatrix/frustum/fog setuped Buffers should be unlocked.
Definition at line 1713 of file vegetable_manager.cpp. References _AngleAxis, NL3D::CVegetableSortBlock::_Center, _ClipBlockList, NL3D::CVegetableSortBlock::_InstanceGroupList, _ManagerMatrix, NL3D::CVegetableSortBlock::_NTriangles, _NumVegetableFaceRendered, _NumZSortBlendLayers, NL3D::CVegetableSortBlock::_QuadrantId, NL3D::CVegetableSortBlock::_Radius, NL3D::CVegetableInstanceGroup::_RdrPass, NL3D::CVegetableClipBlock::_RenderNext, NL3D::CVegetableClipBlock::_SortBlockList, NL3D::CVegetableSortBlock::_SortKey, NL3D::CVegetableSortBlock::_UnderWater, _VegetableMaterial, _ViewCenter, _WindAnimTime, _WindBendMin, _WindDeltaTable, _WindDirection, _WindFrequency, _WindPower, _WindPrecRenderTime, _WindTable, _ZSortLayerDistMax, _ZSortModelLayers, _ZSortModelLayersUW, NL3D::CVegetableVBAllocator::activate(), NL3D::IDriver::activeVertexProgram(), NL3D::CTessList< CVegetableInstanceGroup >::begin(), NL3D::CTessList< CVegetableSortBlock >::begin(), NL3D::CTessList< CVegetableClipBlock >::begin(), NLMISC::clamp(), NL3D::CVegetableClipBlock::clip(), doubleSidedRdrPass(), NL3D::IDriver::enableFog(), NL3D::IDriver::fogEnabled(), NL3D::CVegetableVBAllocator::getNumUserVerticesAllocated(), getVBAllocatorForRdrPassAndVBHardMode(), H_AUTO, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::HardMode, NLMISC::CMatrix::identity(), NL3D::CTessNodeList::Next, NL3D_VEGETABLE_FREQUENCY_FACTOR_PREC, NL3D_VEGETABLE_NRDRPASS, NL3D_VEGETABLE_NUM_QUADRANT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, NL3D_VEGETABLE_VP_LUT_SIZE, nlassert, nlverify, NLMISC::CVector::norm(), NLMISC::CVector::normed(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NTriangles, NL3D::CPrimitiveProfile::NTriangles, NLMISC::OptFastFloor(), NL3D::IDriver::profileRenderedPrimitives(), NL3D::IDriver::renderSimpleTriangles(), NLMISC::CVector::set(), NL3D::CMaterial::setAlphaTestThreshold(), NL3D::CMaterial::setBlend(), NL3D::CMaterial::setDoubleSided(), NLMISC::CMatrix::setPos(), NL3D::CMaterial::setTexture(), NL3D::IDriver::setupMaterial(), NL3D::IDriver::setupModelMatrix(), setupVertexProgramConstants(), NL3D::CMaterial::setZWrite(), sint, NL3D::CMaterial::texEnvArg0Alpha(), NL3D::CMaterial::texEnvArg0RGB(), NL3D::CMaterial::texEnvArg1Alpha(), NL3D::CMaterial::texEnvArg1RGB(), NL3D::CMaterial::texEnvOpAlpha(), NL3D::CMaterial::texEnvOpRGB(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleIndices, uint, updateDriver(), NLMISC::CVector::x, NLMISC::CVector::y, and z. Referenced by NL3D::CLandscape::render().
01715 {
01716 H_AUTO( NL3D_Vegetable_Render );
01717
01718 CVegetableClipBlock *rootToRender= NULL;
01719
01720 // get normalized front vector.
01721 CVector frontVectorNormed= frontVector.normed();
01722
01723 // For Speed debug only.
01724 /*extern bool YOYO_ATTest;
01725 if(YOYO_ATTest)
01726 return;
01727 */
01728
01729 // Clip.
01730 //--------------------
01731 // For all current not empty clipBlocks, clip against pyramid, and insert visibles in list.
01732 CVegetableClipBlock *ptrClipBlock= _ClipBlockList.begin();
01733 while(ptrClipBlock)
01734 {
01735 // if the clipBlock is visible and not empty
01736 if(ptrClipBlock->clip(pyramid))
01737 {
01738 // insert into visible list.
01739 ptrClipBlock->_RenderNext= rootToRender;
01740 rootToRender= ptrClipBlock;
01741 }
01742
01743 // next
01744 ptrClipBlock= (CVegetableClipBlock*)ptrClipBlock->Next;
01745 }
01746
01747
01748 // If no clip block visible, just skip!!
01749 if(rootToRender==NULL)
01750 return;
01751
01752
01753 // Prepare Render
01754 //--------------------
01755
01756 // profile.
01757 CPrimitiveProfile ppIn, ppOut;
01758 driver->profileRenderedPrimitives(ppIn, ppOut);
01759 uint precNTriRdr= ppOut.NTriangles;
01760
01761
01762 // Disable Fog.
01763 bool bkupFog;
01764 bkupFog= driver->fogEnabled();
01765 driver->enableFog(false);
01766
01767
01768 // Used by setupVertexProgramConstants(). The center of camera.
01769 // Used for AlphaBlending, and for ZBuffer precision problems.
01770 _ViewCenter= viewCenter;
01771
01772
01773 // The manager is identity in essence. But for ZBuffer improvements, must set it as close
01774 // to the camera. In the VertexProgram, _ViewCenter is substracted from bent vertex pos. So take it as position.
01775 _ManagerMatrix.identity();
01776 _ManagerMatrix.setPos(_ViewCenter);
01777
01778
01779 // set model matrix to the manager matrix.
01780 driver->setupModelMatrix(_ManagerMatrix);
01781
01782
01783 // set the driver for all allocators
01784 updateDriver(driver);
01785
01786
01787 // Compute Bend Anim.
01788
01789 // AnimFrequency factor.
01790 // Doing it incrementaly allow change of of frequency each frame with good results.
01791 _WindAnimTime+= (_Time - _WindPrecRenderTime)*_WindFrequency;
01792 _WindAnimTime= fmod(_WindAnimTime, (float)NL3D_VEGETABLE_FREQUENCY_FACTOR_PREC);
01793 // NB: Leave timeBend (_WindAnimTime) as a time (ie [0..1]), because VP do a "EXP time".
01794 // For incremental computing.
01795 _WindPrecRenderTime= _Time;
01796
01797
01798 // compute the angleAxis corresponding to direction
01799 // perform a 90deg rotation to get correct angleAxis
01800 _AngleAxis.set(-_WindDirection.y,_WindDirection.x,0);
01801
01802
01803 // Fill LUT WindTable.
01804 uint i;
01805 for(i=0; i<NL3D_VEGETABLE_VP_LUT_SIZE; i++)
01806 {
01807 /* NB: this formula works quite well, because vertex BendFactor is expressed in Radian/2.
01808 And since animFactor==(_CosTable[i] + 1) E [0..2], we have here an arc-cirle computing:
01809 dmove= Radius * AngleRadian/2 * animFactor. So at max of animFactor (ie 2), we have:
01810 dmove= Radius * AngleRadian, which is by definition an arc-cirle computing...
01811 And so this approximate the Bend-quaternion Vertex Program.
01812 */
01813 float windForce= (_CosTable[(i+32)%64] + 1);
01814 // Modify with _WindPower / _WindBendMin.
01815 windForce= _WindBendMin*2 + windForce * (1-_WindBendMin);
01816 windForce*= _WindPower;
01817 // Compute direction of the wind, and multiply by windForce.
01818 _WindTable[i]= CVector2f(_WindDirection.x, _WindDirection.y) * windForce;
01819 }
01820 // compute delta
01821 for(i=0; i<NL3D_VEGETABLE_VP_LUT_SIZE; i++)
01822 {
01823 CVector2f cur= _WindTable[i];
01824 CVector2f delta= _WindTable[ (i+1)%NL3D_VEGETABLE_VP_LUT_SIZE ] - cur;
01825 _WindDeltaTable[i]= delta;
01826 }
01827
01828
01829 // setup VP constants.
01830 setupVertexProgramConstants(driver);
01831
01832
01833 // Setup TexEnvs for Dynamic lightmapping
01834 //--------------------
01835 // if the dynamic lightmap is provided
01836 if(textureDLM)
01837 {
01838 // stage0 RGB is Diffuse + DLM.
01839 _VegetableMaterial.setTexture(0, textureDLM);
01840 _VegetableMaterial.texEnvOpRGB(0, CMaterial::Add);
01841 _VegetableMaterial.texEnvArg0RGB(0, CMaterial::Texture, CMaterial::SrcColor);
01842 _VegetableMaterial.texEnvArg1RGB(0, CMaterial::Diffuse, CMaterial::SrcColor);
01843 // stage1 RGB is Previous * Texture
01844 _VegetableMaterial.texEnvOpRGB(1, CMaterial::Modulate);
01845 _VegetableMaterial.texEnvArg0RGB(1, CMaterial::Texture, CMaterial::SrcColor);
01846 _VegetableMaterial.texEnvArg1RGB(1, CMaterial::Previous, CMaterial::SrcColor);
01847 }
01848 else
01849 {
01850 // reset stage0 (to skip it)
01851 _VegetableMaterial.setTexture(0, NULL);
01852 // stage1 RGB is Diffuse * Texture
01853 _VegetableMaterial.texEnvOpRGB(1, CMaterial::Modulate);
01854 _VegetableMaterial.texEnvArg0RGB(1, CMaterial::Texture, CMaterial::SrcColor);
01855 _VegetableMaterial.texEnvArg1RGB(1, CMaterial::Diffuse, CMaterial::SrcColor);
01856 }
01857 // stage1 Alpha is always "Modulate texture with diffuse Alpha"
01858 _VegetableMaterial.texEnvOpAlpha(1, CMaterial::Modulate);
01859 _VegetableMaterial.texEnvArg0Alpha(1, CMaterial::Texture, CMaterial::SrcAlpha);
01860 _VegetableMaterial.texEnvArg1Alpha(1, CMaterial::Diffuse, CMaterial::SrcAlpha);
01861
01862
01863
01864 // Render !ZSORT pass
01865 //--------------------
01866
01867 // setup material (may have change because of ZSORT / alphaBlend pass)
01868 _VegetableMaterial.setBlend(false);
01869 _VegetableMaterial.setZWrite(true);
01870 _VegetableMaterial.setAlphaTestThreshold(0.5f);
01871
01872
01873 /*
01874 Prefer sort with Soft / Hard first.
01875 Also, Prefer do VBsoft last, for better GPU //ism with Landscape.
01876 */
01877 // For both allocators: Hard(1) then Soft(0)
01878 for(sint vbHardMode= 1; vbHardMode>=0; vbHardMode--)
01879 {
01880 // For all renderPass.
01881 for(sint rdrPass=0; rdrPass < NL3D_VEGETABLE_NRDRPASS; rdrPass++)
01882 {
01883 // skip ZSORT rdrPass, done after.
01884 if(rdrPass == NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT)
01885 continue;
01886
01887 // which allocator?
01888 CVegetableVBAllocator &vbAllocator= getVBAllocatorForRdrPassAndVBHardMode(rdrPass, vbHardMode);
01889
01890 // Do the pass only if there is some vertices to draw.
01891 if(vbAllocator.getNumUserVerticesAllocated()>0)
01892 {
01893 // additional setup to the material
01894 bool doubleSided= doubleSidedRdrPass(rdrPass);
01895 // set the 2Sided flag in the material
01896 _VegetableMaterial.setDoubleSided( doubleSided );
01897
01898
01899 // Activate the unique material.
01900 driver->setupMaterial(_VegetableMaterial);
01901
01902 // activate Vertex program first.
01903 //nlinfo("\nSTARTVP\n%s\nENDVP\n", _VertexProgram[rdrPass]->getProgram().c_str());
01904 nlverify(driver->activeVertexProgram(_VertexProgram[rdrPass]));
01905
01906 // Activate the good VBuffer
01907 vbAllocator.activate();
01908
01909 // For all visibles clipBlock, render their instance groups.
01910 ptrClipBlock= rootToRender;
01911 while(ptrClipBlock)
01912 {
01913 // For all sortBlock of the clipBlock
01914 CVegetableSortBlock *ptrSortBlock= ptrClipBlock->_SortBlockList.begin();
01915 while(ptrSortBlock)
01916 {
01917 // For all igs of the sortBlock
01918 CVegetableInstanceGroup *ptrIg= ptrSortBlock->_InstanceGroupList.begin();
01919 while(ptrIg)
01920 {
01921 // rdrPass
01922 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ptrIg->_RdrPass[rdrPass];
01923
01924 // if this rdrPass is in same HardMode as we process now.
01925 if( (vegetRdrPass.HardMode && vbHardMode==1) || (!vegetRdrPass.HardMode && vbHardMode==0) )
01926 {
01927 // Ok, Render the faces.
01928 if(vegetRdrPass.NTriangles)
01929 {
01930 driver->renderSimpleTriangles(&vegetRdrPass.TriangleIndices[0],
01931 vegetRdrPass.NTriangles);
01932 }
01933 }
01934
01935 // next ig.
01936 ptrIg= (CVegetableInstanceGroup*)ptrIg->Next;
01937 }
01938
01939 // next sortBlock
01940 ptrSortBlock= (CVegetableSortBlock *)(ptrSortBlock->Next);
01941 }
01942
01943 // next clipBlock to render
01944 ptrClipBlock= ptrClipBlock->_RenderNext;
01945 }
01946 }
01947
01948 }
01949
01950 }
01951
01952 // Render ZSort pass.
01953 //--------------------
01954
01955 // Debug Quadrants.
01956 /*static vector<CVector> p0DebugLines;
01957 static vector<CVector> p1DebugLines;
01958 p0DebugLines.clear();
01959 p1DebugLines.clear();*/
01960
01961 // For all Blend model Layers, clear Sort Block list and setup.
01962 for(i=0; i<_NumZSortBlendLayers;i++)
01963 {
01964 // must have been created.
01965 nlassert(_ZSortModelLayers[i]);
01966 nlassert(_ZSortModelLayersUW[i]);
01967 // NB: don't refresh list, it is done in CVegetableBlendLayerModel.
01968 // We must do it here, because if vegetableManger::render() is no more called (eg: disabled),
01969 // then the models must do nothing.
01970
01971 // To get layers correclty sorted from fornt to back, must init their pos
01972 // because it is the renderTraversal which sort them.
01973 // compute distance to camera of this layer.
01974 float layerZ= i * _ZSortLayerDistMax / _NumZSortBlendLayers;
01975 // compute position of this layer.
01976 CVector pos= viewCenter + frontVector * layerZ;
01977 // special setup in the layer.
01978 _ZSortModelLayers[i]->setWorldPos(pos);
01979 _ZSortModelLayersUW[i]->setWorldPos(pos);
01980 }
01981
01982 // If some vertices in arrays for ZSort rdrPass
01983 if( getVBAllocatorForRdrPassAndVBHardMode(NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, 0).getNumUserVerticesAllocated()>0 ||
01984 getVBAllocatorForRdrPassAndVBHardMode(NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, 1).getNumUserVerticesAllocated()>0 )
01985 {
01986 uint rdrPass= NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT;
01987
01988 // sort
01989 //-------------
01990 // Array for sorting. (static to avoid reallocation)
01991 static vector<CSortVSB> sortVegetSbs;
01992 sortVegetSbs.clear();
01993
01994 // For all visibles clipBlock
01995 ptrClipBlock= rootToRender;
01996 while(ptrClipBlock)
01997 {
01998 // For all sortBlock, prepare to sort them
01999 CVegetableSortBlock *ptrSortBlock= ptrClipBlock->_SortBlockList.begin();
02000 while(ptrSortBlock)
02001 {
02002 // if the sortBlock has some sorted faces to render
02003 if(ptrSortBlock->_NTriangles != 0)
02004 {
02005 // Compute Distance to Viewer.
02006 /* NB: compute radial distance (with norm()) instead of linear distance
02007 (DotProduct with front vector) get less "ZSort poping".
02008 */
02009 CVector dirToSb= ptrSortBlock->_Center - viewCenter;
02010 float distToViewer= dirToSb.norm();
02011 // SortKey change if the center is behind the camera.
02012 if(dirToSb * frontVectorNormed<0)
02013 {
02014 ptrSortBlock->_SortKey= - distToViewer;
02015 }
02016 else
02017 {
02018 ptrSortBlock->_SortKey= distToViewer;
02019 }
02020
02021 // Choose the quadrant for this sortBlock
02022 sint bestDirIdx= 0;
02023 float bestDirVal= -FLT_MAX;
02024 // If too near, must take the frontVector as key, to get better sort.
02025 // use ptrSortBlock->_SortKey to get correct negative values.
02026 if(ptrSortBlock->_SortKey < ptrSortBlock->_Radius)
02027 {
02028 dirToSb= frontVectorNormed;
02029 }
02030
02031 // NB: no need to normalize dirToSb, because need only to sort with DP
02032 // choose the good list of triangles according to quadrant.
02033 for(uint dirIdx=0; dirIdx<NL3D_VEGETABLE_NUM_QUADRANT; dirIdx++)
02034 {
02035 float dirVal= CVegetableQuadrant::Dirs[dirIdx] * dirToSb;
02036 if(dirVal>bestDirVal)
02037 {
02038 bestDirVal= dirVal;
02039 bestDirIdx= dirIdx;
02040 }
02041 }
02042
02043 // set the result.
02044 ptrSortBlock->_QuadrantId= bestDirIdx;
02045
02046 // insert in list to sort.
02047 sortVegetSbs.push_back(CSortVSB(ptrSortBlock));
02048
02049 // Debug Quadrants
02050 /*p0DebugLines.push_back(ptrSortBlock->_Center);
02051 p1DebugLines.push_back(ptrSortBlock->_Center + CVegetableQuadrant::Dirs[bestDirIdx]);*/
02052 }
02053
02054 // next sortBlock
02055 ptrSortBlock= (CVegetableSortBlock *)(ptrSortBlock->Next);
02056 }
02057
02058 // next clipBlock to render
02059 ptrClipBlock= ptrClipBlock->_RenderNext;
02060 }
02061
02062 // sort!
02063 // QSort. (I tried, better than radix sort, guckk!!)
02064 sort(sortVegetSbs.begin(), sortVegetSbs.end());
02065
02066
02067 // setup material for this rdrPass. NB: rendered after (in LayerModels).
02068 //-------------
02069 bool doubleSided= doubleSidedRdrPass(rdrPass);
02070 // set the 2Sided flag in the material
02071 _VegetableMaterial.setDoubleSided( doubleSided );
02072
02073 // setup the unique material.
02074 _VegetableMaterial.setBlend(true);
02075 _VegetableMaterial.setZWrite(false);
02076 // leave AlphaTest but still kick low alpha values (for fillRate performance)
02077 _VegetableMaterial.setAlphaTestThreshold(0.1f);
02078
02079
02080
02081 // order them in Layers.
02082 //-------------
02083
02084 // render from back to front, to keep correct Z order in a single layer.
02085 for(uint i=0; i<sortVegetSbs.size();i++)
02086 {
02087 CVegetableSortBlock *ptrSortBlock= sortVegetSbs[i].Sb;
02088
02089 float z= ptrSortBlock->_SortKey;
02090 // compute in which layer must store this SB.
02091 z= z*_NumZSortBlendLayers / _ZSortLayerDistMax;
02092 // Avoid a floor(), using an OptFastFloor, but without the OptFastFloorBegin() End() group.
02093 // => avoid the imprecision with such a trick; *256, then divide the integer by 256.
02094 sint layer= NLMISC::OptFastFloor(z*256) >> 8;
02095 clamp(layer, 0, (sint)_NumZSortBlendLayers-1);
02096
02097 // Range in correct layer, according to water ordering
02098 if(ptrSortBlock->_UnderWater)
02099 // range in the correct layermodel (NB: keep the same layer internal order).
02100 _ZSortModelLayersUW[layer]->SortBlocks.push_back(ptrSortBlock);
02101 else
02102 _ZSortModelLayers[layer]->SortBlocks.push_back(ptrSortBlock);
02103 }
02104
02105 }
02106
02107
02108 // Quit
02109 //--------------------
02110
02111 // disable VertexProgram.
02112 driver->activeVertexProgram(NULL);
02113
02114
02115 // restore Fog.
02116 driver->enableFog(bkupFog);
02117
02118
02119 // Debug Quadrants
02120 /*for(uint l=0; l<p0DebugLines.size();l++)
02121 {
02122 CVector dv= CVector::K;
02123 CDRU::drawLine(p0DebugLines[l]+dv, p1DebugLines[l]+dv, CRGBA(255,0,0), *driver);
02124 }*/
02125
02126 // profile: compute number of triangles rendered with vegetable manager.
02127 driver->profileRenderedPrimitives(ppIn, ppOut);
02128 _NumVegetableFaceRendered= ppOut.NTriangles-precNTriRdr;
02129
02130 }
|
|
||||||||||||||||||||
|
reserve some instance space in an Ig. nothing is really done here, after doing this for all shapes of your ig, you must call reserveIgCompile()
Definition at line 856 of file vegetable_manager.cpp. References NL3D::CVegetableInstanceGroupReserve::_RdrPass, NL3D::CVertexBuffer::getNumVertices(), getRdrPassInfoForShape(), NL3D::CVegetableInstanceGroupReserve::CVegetableRdrPass::NLightedInstances, NL3D::CVegetableInstanceGroupReserve::CVegetableRdrPass::NTriangles, NL3D::CVegetableInstanceGroupReserve::CVegetableRdrPass::NVertices, NL3D::CVegetableShape::TriangleIndices, uint, and NL3D::CVegetableShape::VB. Referenced by NL3D::CVegetable::reserveIgAddInstances().
00857 {
00858 bool instanceLighted;
00859 bool instanceDoubleSided;
00860 bool instanceZSort;
00861 bool destLighted;
00862 bool precomputeLighting;
00863
00864 // get correct rdrPass / info
00865 uint rdrPass;
00866 rdrPass= getRdrPassInfoForShape(shape, vegetWaterState, instanceLighted, instanceDoubleSided,
00867 instanceZSort, destLighted, precomputeLighting);
00868
00869 // veget rdrPass
00870 CVegetableInstanceGroupReserve::CVegetableRdrPass &vegetRdrPass= vegetIgReserve._RdrPass[rdrPass];
00871
00872 // Reserve space in the rdrPass.
00873 vegetRdrPass.NVertices+= numInstances * shape->VB.getNumVertices();
00874 vegetRdrPass.NTriangles+= numInstances * shape->TriangleIndices.size()/3;
00875 // if the instances are lighted, reserve space for lighting updates
00876 if(instanceLighted)
00877 vegetRdrPass.NLightedInstances+= numInstances;
00878 }
|
|
||||||||||||
|
reserve the space in the ig. nlassert() if the ig is not empty.
Definition at line 882 of file vegetable_manager.cpp. References NL3D::CVegetableInstanceGroupReserve::_RdrPass, NL3D::CVegetableInstanceGroup::_RdrPass, NL3D::CVegetableInstanceGroup::_TriangleQuadrantOrderArray, NL3D::CVegetableInstanceGroup::_TriangleQuadrantOrderNumTriangles, NL3D::CVegetableInstanceGroup::_TriangleQuadrantOrders, NLMISC::CObjectVector< sint16, false >::getPtr(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::LightedInstances, NL3D_VEGETABLE_NRDRPASS, NL3D_VEGETABLE_NUM_QUADRANT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlassert, NLMISC::CObjectVector< sint16, false >::resize(), NLMISC::CObjectVector< CVegetableLightedInstance >::resize(), NLMISC::CObjectVector< uint32, false >::resize(), sint16, NLMISC::CObjectVector< sint16, false >::size(), NLMISC::CObjectVector< CVegetableLightedInstance >::size(), NLMISC::CObjectVector< uint32, false >::size(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleIndices, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleLocalIndices, uint, and NL3D::CVegetableInstanceGroup::CVegetableRdrPass::Vertices. Referenced by NL3D::CPatch::generateTileVegetable().
00883 {
00884 uint rdrPass;
00885
00886
00887 // Check.
00888 //===========
00889 // For all rdrPass of the ig, check empty
00890 for(rdrPass= 0; rdrPass<NL3D_VEGETABLE_NRDRPASS; rdrPass++)
00891 {
00892 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ig->_RdrPass[rdrPass];
00893 nlassert(vegetRdrPass.TriangleIndices.size()==0);
00894 nlassert(vegetRdrPass.TriangleLocalIndices.size()==0);
00895 nlassert(vegetRdrPass.Vertices.size()==0);
00896 nlassert(vegetRdrPass.LightedInstances.size()==0);
00897 }
00898 // Do the same for all quadrants of the zsort rdrPass.
00899 nlassert(ig->_TriangleQuadrantOrderArray.size()==0);
00900 nlassert(ig->_TriangleQuadrantOrderNumTriangles==0);
00901
00902
00903 // Reserve.
00904 //===========
00905 // For all rdrPass of the ig, reserve.
00906 for(rdrPass= 0; rdrPass<NL3D_VEGETABLE_NRDRPASS; rdrPass++)
00907 {
00908 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ig->_RdrPass[rdrPass];
00909 uint numVertices= vegetIgReserve._RdrPass[rdrPass].NVertices;
00910 uint numTris= vegetIgReserve._RdrPass[rdrPass].NTriangles;
00911 uint numLightedInstances= vegetIgReserve._RdrPass[rdrPass].NLightedInstances;
00912 // reserve triangles indices and vertices for this rdrPass.
00913 vegetRdrPass.TriangleIndices.resize(numTris*3);
00914 vegetRdrPass.TriangleLocalIndices.resize(numTris*3);
00915 vegetRdrPass.Vertices.resize(numVertices);
00916 // reserve ligthedinstances space.
00917 vegetRdrPass.LightedInstances.resize(numLightedInstances);
00918 }
00919
00920 // Reserve space for the zsort rdrPass sorting.
00921 uint numZSortTris= vegetIgReserve._RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT].NTriangles;
00922 // allocate sufficient space for all quadrants (1 alloc for all quadrants).
00923 ig->_TriangleQuadrantOrderArray.resize(numZSortTris * NL3D_VEGETABLE_NUM_QUADRANT);
00924
00925 // And init ptrs.
00926 if(numZSortTris>0)
00927 {
00928 sint16 *start= ig->_TriangleQuadrantOrderArray.getPtr();
00929 // init ptr to each qaudrant
00930 for(uint i=0; i<NL3D_VEGETABLE_NUM_QUADRANT; i++)
00931 {
00932 ig->_TriangleQuadrantOrders[i]= start + i*numZSortTris;
00933 }
00934 }
00935 }
|
|
|
set to 0 the number of faces rendered
Definition at line 2166 of file vegetable_manager.cpp. References _NumVegetableFaceRendered. Referenced by NL3D::CLandscape::render().
02167 {
02168 _NumVegetableFaceRendered= 0;
02169 }
|
|
||||||||||||||||
|
setup the directional light
Definition at line 1612 of file vegetable_manager.cpp. References _DirectionalLight, _GlobalAmbient, _GlobalDiffuse, and NLMISC::CVector::normalize(). Referenced by NL3D::CLandscape::setupVegetableLighting().
01613 {
01614 _DirectionalLight= light;
01615 _DirectionalLight.normalize();
01616 // Setup ambient/Diffuse.
01617 _GlobalAmbient= ambient;
01618 _GlobalDiffuse= diffuse;
01619 }
|
|
|
set the current Time (in seconds). For Wind animation Definition at line 2206 of file vegetable_manager.cpp. Referenced by NL3D::CLandscape::setVegetableTime().
02207 {
02208 // copy time
02209 _Time= time;
02210 }
|
|
|
set the frequency of lighting update. If freq==1, ALL lighted igs are updated each second. e.g: if 1/20, then every 20 seconds, all Igs are updated. If you set 0, no update will be done at all (this is the default setup!!). Definition at line 2280 of file vegetable_manager.cpp. Referenced by NL3D::CLandscape::setVegetableUpdateLightingFrequency().
02281 {
02282 freq= max(freq, 0.f);
02283 _ULFrequency= freq;
02284 }
|
|
|
set the vegetable manager System Time (in seconds) This time is used for lighting update, and is independent of setTime() Definition at line 2221 of file vegetable_manager.cpp. Referenced by NL3D::CLandscape::setVegetableUpdateLightingTime().
02222 {
02223 _ULTime= time;
02224 }
|
|
|
called by CVegetableBlendLayerModel.
Definition at line 2134 of file vegetable_manager.cpp. References _BkupFog, _ManagerMatrix, _VegetableMaterial, NL3D::IDriver::activeVertexProgram(), doubleSidedRdrPass(), NL3D::IDriver::enableFog(), NL3D::IDriver::fogEnabled(), NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlverify, NL3D::IDriver::setupMaterial(), NL3D::IDriver::setupModelMatrix(), setupVertexProgramConstants(), and uint. Referenced by NL3D::CVegetableBlendLayerModel::render().
02135 {
02136 // Setup Global.
02137 //=============
02138 // disable fog, for faster VP.
02139 _BkupFog= driver->fogEnabled();
02140 driver->enableFog(false);
02141
02142 // set model matrix to the manager matrix.
02143 driver->setupModelMatrix(_ManagerMatrix);
02144
02145 // setup VP constants.
02146 setupVertexProgramConstants(driver);
02147
02148 // Setup RdrPass.
02149 //=============
02150 uint rdrPass= NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT;
02151
02152 // setup doubleSidedmaterial for this rdrPass.
02153 bool doubleSided= doubleSidedRdrPass(rdrPass);
02154
02155 // Activate the unique material (correclty setuped for AlphaBlend in render()).
02156 driver->setupMaterial(_VegetableMaterial);
02157
02158 // activate Vertex program first.
02159 //nlinfo("\nSTARTVP\n%s\nENDVP\n", _VertexProgram[rdrPass]->getProgram().c_str());
02160 nlverify(driver->activeVertexProgram(_VertexProgram[rdrPass]));
02161
02162 }
|
|
|
setup the vertexProgram constants.
Definition at line 1664 of file vegetable_manager.cpp. References _AngleAxis, _DirectionalLight, _ViewCenter, _WindAnimTime, _WindBendMin, _WindDeltaTable, _WindPower, _WindTable, NL3D_VEGETABLE_BLOCK_BLEND_TRANSITION_DIST, NL3D_VEGETABLE_VP_LUT_SIZE, NLMISC::Pi, NL3D::IDriver::setConstant(), NL3D::IDriver::setConstantMatrix(), uint, NLMISC::CVector2f::x, NLMISC::CVector::x, NLMISC::CVector2f::y, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by render(), and setupRenderStateForBlendLayerModel().
01665 {
01666 // Standard
01667 // setup VertexProgram constants.
01668 // c[0..3] take the ModelViewProjection Matrix. After setupModelMatrix();
01669 driver->setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity);
01670 // c[4..7] take the ModelView Matrix. After setupModelMatrix();
01671 driver->setConstantMatrix(4, IDriver::ModelView, IDriver::Identity);
01672 // c[8] take usefull constants.
01673 driver->setConstant(8, 0, 1, 0.5f, 2);
01674 // c[9] take normalized directional light
01675 driver->setConstant(9, _DirectionalLight);
01676 // c[10] take pos of camera
01677 driver->setConstant(10, _ViewCenter);
01678 // c[11] take factor for Blend formula
01679 driver->setConstant(11, -1.f/NL3D_VEGETABLE_BLOCK_BLEND_TRANSITION_DIST, 0, 0, 0);
01680
01681
01682
01683 // Bend.
01684 // c[16]= quaternion axis. w==1, and z must be 0
01685 driver->setConstant( 16, _AngleAxis.x, _AngleAxis.y, _AngleAxis.z, 1);
01686 // c[17]= {timeAnim, WindPower, WindPower*(1-WindBendMin)/2, 0)}
01687 driver->setConstant( 17, (float)_WindAnimTime, _WindPower, _WindPower*(1-_WindBendMin)/2, 0 );
01688 // c[18]= High order Taylor cos coefficient: { -1/2, 1/24, -1/720, 1/40320 }
01689 driver->setConstant( 18, -1/2.f, 1/24.f, -1/720.f, 1/40320.f );
01690 // c[19]= Low order Taylor cos coefficient: { 1, -1/2, 1/24, -1/720 }
01691 driver->setConstant( 19, 1, -1/2.f, 1/24.f, -1/720.f );
01692 // c[20]= Low order Taylor sin coefficient: { 1, -1/6, 1/120, -1/5040 }
01693 driver->setConstant( 20, 1, -1/6.f, 1/120.f, -1/5040.f );
01694 // c[21]= Special constant vector for quatToMatrix: { 0, 1, -1, 0 }
01695 driver->setConstant( 21, 0.f, 1.f, -1.f, 0.f);
01696 // c[22]= {0.5f, Pi, 2*Pi, 1/(2*Pi)}
01697 driver->setConstant( 22, 0.5f, (float)Pi, (float)(2*Pi), (float)(1/(2*Pi)) );
01698 // c[23]= {NL3D_VEGETABLE_VP_LUT_SIZE, 0, 0, 0}. NL3D_VEGETABLE_VP_LUT_SIZE==64.
01699 driver->setConstant( 23, NL3D_VEGETABLE_VP_LUT_SIZE, 0.f, 0.f, 0.f );
01700
01701
01702 // Fill constant. Start at 32.
01703 for(uint i=0; i<NL3D_VEGETABLE_VP_LUT_SIZE; i++)
01704 {
01705 CVector2f cur= _WindTable[i];
01706 CVector2f delta= _WindDeltaTable[i];
01707 driver->setConstant( 32+i, cur.x, cur.y, delta.x, delta.y );
01708 }
01709 }
|
|
||||||||||||||||||||
|
set the Wind for animation. All thoses variables may be modified each frame without penalty.
Definition at line 2192 of file vegetable_manager.cpp. References _WindBendMin, _WindDirection, _WindFrequency, _WindPower, NLMISC::clamp(), NLMISC::CVector::normalize(), and NLMISC::CVector::z. Referenced by NL3D::CLandscape::setVegetableWind().
02193 {
02194 // Keep only XY component of the Wind direction (because VP only support z==0 quaternions).
02195 _WindDirection= windDir;
02196 _WindDirection.z= 0;
02197 _WindDirection.normalize();
02198 // copy setup
02199 _WindFrequency= windFreq;
02200 _WindPower= windPower;
02201 _WindBendMin= windBendMin;
02202 clamp(_WindBendMin, 0, 1);
02203 }
|
|
||||||||||||
|
swap the RdrPass type (hard or soft) of the rdrPass of an instance group. vertices are allocated in other VBallocator, copied and freed in the old VBallocator. Definition at line 1496 of file vegetable_manager.cpp. References NL3D::CVegetableInstanceGroup::_RdrPass, NL3D::CVegetableVBAllocator::allocateVertex(), NL3D::CVegetableVBAllocator::deleteVertex(), NL3D::CVegetableVBAllocator::flushVertex(), NL3D::CVegetableVBAllocator::getSoftwareVertexBuffer(), getVBAllocatorForRdrPassAndVBHardMode(), NL3D::CVegetableVBAllocator::getVertexPointer(), NL3D::CVertexBuffer::getVertexSize(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::HardMode, nlassert, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NTriangles, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NVertices, NLMISC::CObjectVector< uint32, false >::size(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleIndices, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleLocalIndices, uint, and NL3D::CVegetableInstanceGroup::CVegetableRdrPass::Vertices. Referenced by addInstance().
01497 {
01498 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ig->_RdrPass[rdrPass];
01499
01500 // the allocator where vertices come from
01501 CVegetableVBAllocator &srcAllocator= getVBAllocatorForRdrPassAndVBHardMode(rdrPass, vegetRdrPass.HardMode);
01502 // the allocator where vertices will go
01503 CVegetableVBAllocator &dstAllocator= getVBAllocatorForRdrPassAndVBHardMode(rdrPass, !vegetRdrPass.HardMode);
01504
01505 // vertex size
01506 uint vbSize= srcAllocator.getSoftwareVertexBuffer().getVertexSize();
01507 nlassert(vbSize == dstAllocator.getSoftwareVertexBuffer().getVertexSize());
01508
01509 // for all vertices of the IG, change of VBAllocator
01510 uint i;
01511 // Do it only for current Vertices setuped!!! because a swapIgRdrPassHardMode awlays arise when the ig is
01512 // in construcion.
01513 // Hence here, we may have vegetRdrPass.NVertices < vegetRdrPass.Vertices.size() !!!
01514 for(i=0;i<vegetRdrPass.NVertices;i++)
01515 {
01516 // get idx in src allocator.
01517 uint srcId= vegetRdrPass.Vertices[i];
01518 // allocate a verex in the dst allocator.
01519 uint dstId= dstAllocator.allocateVertex();
01520
01521 // copy from VBsoft of src to dst.
01522 void *vbSrc= srcAllocator.getVertexPointer(srcId);
01523 void *vbDst= dstAllocator.getVertexPointer(dstId);
01524 memcpy(vbDst, vbSrc, vbSize);
01525 // release src vertex.
01526 srcAllocator.deleteVertex(srcId);
01527
01528 // and copy new dest id in Vertices array.
01529 vegetRdrPass.Vertices[i]= dstId;
01530
01531 // and flush this vertex into VBHard (if dst is aVBHard).
01532 dstAllocator.flushVertex(dstId);
01533 }
01534
01535 // For all triangles, bind correct triangles.
01536 nlassert(vegetRdrPass.TriangleIndices.size() == vegetRdrPass.TriangleLocalIndices.size());
01537 // Do it only for current Triangles setuped!!! same reason as vertices
01538 // For all setuped triangles indices
01539 for(i=0;i<vegetRdrPass.NTriangles*3;i++)
01540 {
01541 // get the index in Vertices.
01542 uint localVid= vegetRdrPass.TriangleLocalIndices[i];
01543 // get the index in new VBufffer (dstAllocator), and copy to TriangleIndices
01544 vegetRdrPass.TriangleIndices[i]= vegetRdrPass.Vertices[localVid];
01545 }
01546
01547 // Since change is made, flag the IG rdrpass
01548 vegetRdrPass.HardMode= !vegetRdrPass.HardMode;
01549 }
|
|
|
unlock any AGP vertex buffers
Definition at line 1633 of file vegetable_manager.cpp. References _VBHardAllocator, _VBSoftAllocator, uint, and NL3D::CVegetableVBAllocator::unlockBuffer(). Referenced by NL3D::CLandscape::unlockBuffers().
01634 {
01635 // unlock all buffers
01636 for(uint i=0; i <CVegetableVBAllocator::VBTypeCount; i++)
01637 {
01638 _VBHardAllocator[i].unlockBuffer();
01639 _VBSoftAllocator[i].unlockBuffer();
01640 }
01641 }
|
|
|
must give a driver to the vegetableManager, before any addInstance().
Definition at line 1569 of file vegetable_manager.cpp. References _LastDriver, _VBHardAllocator, _VBSoftAllocator, initVertexProgram(), NL3D_VEGETABLE_NRDRPASS, uint, and NL3D::CVegetableVBAllocator::updateDriver(). Referenced by render(), and NL3D::CLandscape::updateGlobalsAndLockBuffers().
01570 {
01571 // update all driver
01572 uint i;
01573 for(i=0; i <CVegetableVBAllocator::VBTypeCount; i++)
01574 {
01575 _VBHardAllocator[i].updateDriver(driver);
01576 _VBSoftAllocator[i].updateDriver(driver);
01577 }
01578
01579 // if driver changed, recreate vertex programs
01580 if (driver != _LastDriver)
01581 {
01582 _LastDriver = driver;
01583 for(i=0; i <NL3D_VEGETABLE_NRDRPASS; i++)
01584 {
01585 initVertexProgram(i);
01586 }
01587 }
01588 }
|
|
||||||||||||||||
|
update part of an ig. Do not use/modify _UL* return number of vertices processed (nb vertices of the shape) Definition at line 2354 of file vegetable_manager.cpp. References _DirectionalLight, _GlobalAmbient, _GlobalDiffuse, NL3D::CVegetableInstanceGroup::_RdrPass, NLMISC::CRGBA::A, NL3D::CVegetableShape::BestSidedPreComputeLighting, NL3D::CVegetableLightEx::Color, NL3D::computeVegetVertexLighting(), NL3D::computeVegetVertexLightingForceBestSided(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::DlmUV, NL3D::CVegetableShape::DoubleSided, NL3D::CVegetableVBAllocator::flushVertex(), NL3D::CVertexBuffer::getNormalOff(), NLMISC::CObjectVector< uint32, false >::getPtr(), NL3D::CVegetableVBAllocator::getSoftwareVertexBuffer(), NL3D::CVertexBuffer::getValueOffEx(), getVBAllocatorForRdrPassAndVBHardMode(), NL3D::CVertexBuffer::getVertexCoordPointer(), NL3D::CVegetableVBAllocator::getVertexPointer(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::HardMode, NL3D::CVegetableShape::InstanceVertices, NL3D::CVegetableShape::Lighted, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::LightedInstances, NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::MatAmbient, NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::MatDiffuse, NLMISC::CRGBA::modulateFromColorRGBOnly(), NLMISC::CMatrix::mulVector(), NL3D_VEGETABLE_NRDRPASS, NL3D_VEGETABLE_VPPOS_COLOR0, NL3D_VEGETABLE_VPPOS_COLOR1, nlassert, NLMISC::CVector::normalize(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::NormalMat, NL3D::CVegetableLightEx::NumLights, NL3D::CVegetableShape::PreComputeLighting, NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::Shape, sint, NLMISC::CObjectVector< CVegetableLightedInstance >::size(), NL3D::CVegetableInstanceGroup::CVegetableLightedInstance::StartIdInRdrPass, NL3D::CVegetableUV8::U, uint, uint32, uint8, NL3D::CVegetableUV8::V, NL3D::CVegetableShape::VB, NL3D::CVegetableInstanceGroup::VegetableLightEx, and NL3D::CVegetableInstanceGroup::CVegetableRdrPass::Vertices. Referenced by updateLightingIGPart().
02355 {
02356 nlassert(ig);
02357 // get the rdrPass.
02358 nlassert(rdrPassId<NL3D_VEGETABLE_NRDRPASS);
02359 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= ig->_RdrPass[rdrPassId];
02360 // get the lighted instance.
02361 nlassert(instanceId<vegetRdrPass.LightedInstances.size());
02362 CVegetableInstanceGroup::CVegetableLightedInstance &vegetLI= vegetRdrPass.LightedInstances[instanceId];
02363
02364 // get the shape
02365 CVegetableShape *shape= vegetLI.Shape;
02366 // it must be lighted.
02367 nlassert(shape->Lighted);
02368 bool instanceLighted= true;
02369
02370
02371 // get ref on the vegetLex.
02372 CVegetableLightEx &vegetLex= ig->VegetableLightEx;
02373 // Color of pointLights modulated by diffuse.
02374 CRGBA diffusePL[2];
02375 if(vegetLex.NumLights>=1)
02376 {
02377 diffusePL[0].modulateFromColorRGBOnly(vegetLI.MatDiffuse, vegetLex.Color[0]);
02378 if(vegetLex.NumLights>=2)
02379 {
02380 diffusePL[1].modulateFromColorRGBOnly(vegetLI.MatDiffuse, vegetLex.Color[1]);
02381 }
02382 }
02383
02384 // Recompute lighting
02385 //===========
02386
02387 // setup for this instance.
02388 //---------
02389 // 2Sided
02390 bool instanceDoubleSided= shape->DoubleSided;
02391 // Precompute lighting or not??
02392 bool precomputeLighting= instanceLighted && shape->PreComputeLighting;
02393 // bestSided Precompute lighting or not??
02394 bool bestSidedPrecomputeLighting= precomputeLighting && shape->BestSidedPreComputeLighting;
02395 // destLighted?
02396 bool destLighted= instanceLighted && !shape->PreComputeLighting;
02397 // Diffuse and ambient, modulated by current GlobalAmbient and GlobalDiffuse.
02398 CRGBA primaryRGBA, secondaryRGBA;
02399 primaryRGBA.modulateFromColorRGBOnly(vegetLI.MatDiffuse, _GlobalDiffuse);
02400 secondaryRGBA.modulateFromColorRGBOnly(vegetLI.MatAmbient, _GlobalAmbient);
02401 // get normal matrix
02402 CMatrix &normalMat= vegetLI.NormalMat;
02403 // array of vertex id to update
02404 uint32 *ptrVid= vegetRdrPass.Vertices.getPtr() + vegetLI.StartIdInRdrPass;
02405 uint numVertices= shape->InstanceVertices.size();
02406
02407 // Copy Dynamic Lightmap UV in Alpha part (save memory for an extra cost of 1 VP instruction)
02408 primaryRGBA.A= vegetLI.DlmUV.U;
02409 secondaryRGBA.A= vegetLI.DlmUV.V;
02410
02411
02412 // get VertexBuffer info.
02413 CVegetableVBAllocator *allocator;
02414 allocator= &getVBAllocatorForRdrPassAndVBHardMode(rdrPassId, vegetRdrPass.HardMode);
02415 const CVertexBuffer &dstVBInfo= allocator->getSoftwareVertexBuffer();
02416
02417 uint srcNormalOff= (instanceLighted? shape->VB.getNormalOff() : 0);
02418 uint dstColor0Off= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_COLOR0);
02419 uint dstColor1Off= dstVBInfo.getValueOffEx(NL3D_VEGETABLE_VPPOS_COLOR1);
02420
02421
02422
02423 // For all vertices, recompute lighting.
02424 //---------
02425 for(sint i=0; i<(sint)numVertices;i++)
02426 {
02427 // get the Vertex in the VB.
02428 uint vid= ptrVid[i];
02429 // store in tmp shape.
02430 shape->InstanceVertices[i]= vid;
02431
02432 // Fill this vertex.
02433 uint8 *srcPtr= (uint8*)shape->VB.getVertexCoordPointer(i);
02434 uint8 *dstPtr= (uint8*)allocator->getVertexPointer(vid);
02435
02436
02437 // if !precomputeLighting (means destLighted...)
02438 if(!precomputeLighting)
02439 {
02440 // just copy the primary and secondary color
02441 *(CRGBA*)(dstPtr + dstColor0Off)= primaryRGBA;
02442 *(CRGBA*)(dstPtr + dstColor1Off)= secondaryRGBA;
02443 }
02444 else
02445 {
02446 nlassert(!destLighted);
02447
02448 // compute normal.
02449 CVector rotNormal= normalMat.mulVector( *(CVector*)(srcPtr + srcNormalOff) );
02450 // must normalize() because scale is possible.
02451 rotNormal.normalize();
02452
02453 // Do the compute.
02454 if(!bestSidedPrecomputeLighting)
02455 {
02456 computeVegetVertexLighting(rotNormal,
02457 _DirectionalLight, primaryRGBA, secondaryRGBA,
02458 vegetLex, diffusePL, (CRGBA*)(dstPtr + dstColor0Off) );
02459 }
02460 else
02461 {
02462 computeVegetVertexLightingForceBestSided(rotNormal,
02463 _DirectionalLight, primaryRGBA, secondaryRGBA,
02464 vegetLex, diffusePL, (CRGBA*)(dstPtr + dstColor0Off) );
02465 }
02466
02467 }
02468
02469 // flust the vertex in AGP.
02470 allocator->flushVertex(vid);
02471 }
02472
02473
02474 // numVertices vertices are updated
02475 return numVertices;
02476 }
|
|
|
update the lighting of Igs, within a certain amount of time. You MUST enclose calls to updateLighting() with lockBuffers() / unlockBuffers(). Definition at line 2228 of file vegetable_manager.cpp. References _ULNTotalVertices, _ULNVerticesToUpdate, doUpdateLighting(), and min. Referenced by NL3D::CLandscape::refine().
02229 {
02230 // first time in this method??
02231 if(!_ULPrecTimeInit)
02232 {
02233 _ULPrecTimeInit= true;
02234 _ULPrecTime= _ULTime;
02235 }
02236 // compute delta time from last update.
02237 float dt= float(_ULTime - _ULPrecTime);
02238 _ULPrecTime= _ULTime;
02239
02240 // compute number of vertices to update.
02241 _ULNVerticesToUpdate+= dt*_ULFrequency * _ULNTotalVertices;
02242 // maximize, so at max, it computes all Igs, just one time.
02243 _ULNVerticesToUpdate= min(_ULNVerticesToUpdate, (float)_ULNTotalVertices);
02244
02245 // go.
02246 doUpdateLighting();
02247 }
|
|
|
like updateLighting(), but update ALL vegetable You MUST enclose calls to updateLighting() with lockBuffers() / unlockBuffers(). Definition at line 2251 of file vegetable_manager.cpp. References _ULNTotalVertices, _ULNVerticesToUpdate, and doUpdateLighting(). Referenced by NL3D::CLandscape::updateLightingAll().
02252 {
02253 // maximize, so at max, it computes all Igs
02254 _ULNVerticesToUpdate= (float)_ULNTotalVertices;
02255
02256 // go.
02257 doUpdateLighting();
02258 }
|
|
|
update part of the RootIg, according to _ULNVerticesToUpdate (while > 0) if all Ig is updated, return true and _ULCurrentIgRdrPass and _ULCurrentIgInstance is updated. Definition at line 2288 of file vegetable_manager.cpp. References NL3D::CVegetableInstanceGroup::_RdrPass, _ULCurrentIgInstance, _ULCurrentIgRdrPass, _ULNVerticesToUpdate, _ULRootIg, NL3D::CVegetableLightEx::computeCurrentColors(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::LightedInstances, NL3D_VEGETABLE_NRDRPASS, nlassert, NLMISC::CObjectVector< CVegetableLightedInstance >::size(), updateInstanceLighting(), and NL3D::CVegetableInstanceGroup::VegetableLightEx. Referenced by doUpdateLighting().
02289 {
02290 nlassert(_ULRootIg);
02291
02292
02293 // First, update lighting info global to the ig, ie update current
02294 // colros of the PointLights which influence the ig.
02295 _ULRootIg->VegetableLightEx.computeCurrentColors();
02296
02297 // while there is some vertices to update
02298 while(_ULNVerticesToUpdate>0)
02299 {
02300 // if all rdrPass of the ig are processed.
02301 if(_ULCurrentIgRdrPass>= NL3D_VEGETABLE_NRDRPASS)
02302 {
02303 // All this Ig is updated.
02304 _ULCurrentIgRdrPass= 0;
02305 _ULCurrentIgInstance= 0;
02306 // skip to next Ig.
02307 return true;
02308 }
02309 CVegetableInstanceGroup::CVegetableRdrPass &vegetRdrPass= _ULRootIg->_RdrPass[_ULCurrentIgRdrPass];
02310
02311 // if all instances are processed for this pass (especially if size()==0 !!)
02312 if(_ULCurrentIgInstance>= vegetRdrPass.LightedInstances.size())
02313 {
02314 // skip to the next rdrPass.
02315 _ULCurrentIgRdrPass++;
02316 _ULCurrentIgInstance= 0;
02317 continue;
02318 }
02319
02320 // Process this instance.
02321 _ULNVerticesToUpdate-= updateInstanceLighting(_ULRootIg, _ULCurrentIgRdrPass, _ULCurrentIgInstance);
02322
02323 // next instance.
02324 _ULCurrentIgInstance++;
02325
02326 // if all instances are processed for this pass
02327 if(_ULCurrentIgInstance>= vegetRdrPass.LightedInstances.size())
02328 {
02329 // skip to the next rdrPass.
02330 _ULCurrentIgRdrPass++;
02331 _ULCurrentIgInstance= 0;
02332 }
02333 }
02334
02335 // If all rdrPass of the ig are processed.
02336 if(_ULCurrentIgRdrPass>= NL3D_VEGETABLE_NRDRPASS)
02337 {
02338 // All this Ig is updated.
02339 _ULCurrentIgRdrPass= 0;
02340 _ULCurrentIgInstance= 0;
02341 // skip to next Ig.
02342 return true;
02343 }
02344 else
02345 {
02346 // The Ig is not entirely updated.
02347 return false;
02348 }
02349
02350 }
|
|
|
Definition at line 287 of file vegetable_manager.h. |
|
|
Definition at line 378 of file vegetable_manager.h. Referenced by render(), and setupVertexProgramConstants(). |
|
|
Definition at line 380 of file vegetable_manager.h. Referenced by exitRenderStateForBlendLayerModel(), and setupRenderStateForBlendLayerModel(). |
|
|
Definition at line 294 of file vegetable_manager.h. Referenced by createIg(), deleteIg(), and render(). |
|
|
Definition at line 289 of file vegetable_manager.h. Referenced by createClipBlock(), and deleteClipBlock(). |
|
|
Definition at line 366 of file vegetable_manager.h. |
|
|
Definition at line 316 of file vegetable_manager.h. Referenced by addInstance(), CVegetableManager(), setDirectionalLight(), setupVertexProgramConstants(), and updateInstanceLighting(). |
|
|
Definition at line 296 of file vegetable_manager.h. Referenced by createClipBlock(), createIg(), deleteClipBlock(), and deleteIg(). |
|
|
Definition at line 317 of file vegetable_manager.h. Referenced by addInstance(), CVegetableManager(), setDirectionalLight(), and updateInstanceLighting(). |
|
|
Definition at line 318 of file vegetable_manager.h. Referenced by addInstance(), CVegetableManager(), setDirectionalLight(), and updateInstanceLighting(). |
|
|
Definition at line 291 of file vegetable_manager.h. Referenced by createIg(), and deleteIg(). |
|
|
Definition at line 448 of file vegetable_manager.h. Referenced by initVertexProgram(), and updateDriver(). |
|
|
Definition at line 382 of file vegetable_manager.h. Referenced by render(), and setupRenderStateForBlendLayerModel(). |
|
|
profile
Definition at line 322 of file vegetable_manager.h. Referenced by CVegetableManager(), getNumVegetableFaceRendered(), render(), NL3D::CVegetableBlendLayerModel::render(), and resetNumVegetableFaceRendered(). |
|
|
For Alpha Blend rdrPass, ordering into layers.
Definition at line 392 of file vegetable_manager.h. Referenced by createVegetableBlendLayersModels(), CVegetableManager(), render(), and ~CVegetableManager(). |
|
|
Definition at line 302 of file vegetable_manager.h. |
|
|
Definition at line 290 of file vegetable_manager.h. Referenced by createSortBlock(), and deleteSortBlock(). |
|
|
Definition at line 360 of file vegetable_manager.h. |
|
|
update lighting according to _ULNVerticesToUpdate
Definition at line 428 of file vegetable_manager.h. Referenced by CVegetableManager(), deleteIg(), and updateLightingIGPart(). |
|
|
Current instance to render in the first ig to update: rdrpass/instanceId.
Definition at line 427 of file vegetable_manager.h. Referenced by CVegetableManager(), deleteIg(), and updateLightingIGPart(). |
|
|
Frequency of update.
Definition at line 419 of file vegetable_manager.h. |
|
|
Sum of all ig vertices to update.
Definition at line 423 of file vegetable_manager.h. Referenced by addInstance(), CVegetableManager(), deleteIg(), updateLighting(), and updateLightingAll(). |
|
|
Current number of vertices to update. If negative, I have some advance.
Definition at line 421 of file vegetable_manager.h. Referenced by CVegetableManager(), doUpdateLighting(), updateLighting(), updateLightingAll(), and updateLightingIGPart(). |
|
|
NB: we update at the precision of a shape (a dozen of vertices). Definition at line 414 of file vegetable_manager.h. |
|
|
update lighting according to _ULNVerticesToUpdate
Definition at line 415 of file vegetable_manager.h. |
|
|
the priority list of ig to update
Definition at line 425 of file vegetable_manager.h. Referenced by addInstance(), CVegetableManager(), deleteIg(), doUpdateLighting(), and updateLightingIGPart(). |
|
|
update lighting according to _ULNVerticesToUpdate
Definition at line 416 of file vegetable_manager.h. |
|
|
Definition at line 306 of file vegetable_manager.h. Referenced by CVegetableManager(), getVBAllocatorForRdrPassAndVBHardMode(), lockBuffers(), unlockBuffers(), and updateDriver(). |
|
|
Definition at line 308 of file vegetable_manager.h. Referenced by CVegetableManager(), getVBAllocatorForRdrPassAndVBHardMode(), lockBuffers(), unlockBuffers(), and updateDriver(). |
|
|
Definition at line 314 of file vegetable_manager.h. Referenced by CVegetableManager(), loadTexture(), render(), and setupRenderStateForBlendLayerModel(). |
|
|
Definition at line 310 of file vegetable_manager.h. |
|
|
Definition at line 379 of file vegetable_manager.h. Referenced by render(), and setupVertexProgramConstants(). |
|
|
Definition at line 363 of file vegetable_manager.h. Referenced by CVegetableManager(), render(), and setupVertexProgramConstants(). |
|
|
Definition at line 358 of file vegetable_manager.h. Referenced by CVegetableManager(), render(), setupVertexProgramConstants(), and setWind(). |
|
|
Definition at line 369 of file vegetable_manager.h. Referenced by render(), and setupVertexProgramConstants(). |
|
|
Definition at line 355 of file vegetable_manager.h. Referenced by CVegetableManager(), render(), and setWind(). |
|
|
Definition at line 356 of file vegetable_manager.h. Referenced by CVegetableManager(), render(), and setWind(). |
|
|
Definition at line 357 of file vegetable_manager.h. Referenced by CVegetableManager(), render(), setupVertexProgramConstants(), and setWind(). |
|
|
Definition at line 361 of file vegetable_manager.h. Referenced by CVegetableManager(), and render(). |
|
|
Definition at line 368 of file vegetable_manager.h. Referenced by render(), and setupVertexProgramConstants(). |
|
|
Definition at line 393 of file vegetable_manager.h. Referenced by render(). |
|
|
Definition at line 395 of file vegetable_manager.h. Referenced by createVegetableBlendLayersModels(), CVegetableManager(), render(), and ~CVegetableManager(). |
|
|
Definition at line 397 of file vegetable_manager.h. Referenced by createVegetableBlendLayersModels(), CVegetableManager(), render(), and ~CVegetableManager(). |
|
|
Definition at line 394 of file vegetable_manager.h. Referenced by createVegetableBlendLayersModels(), and ~CVegetableManager(). |
1.3.6