00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "3d/vegetable_blend_layer_model.h"
00029 #include "3d/vegetable_manager.h"
00030 #include "3d/vegetable_sort_block.h"
00031 #include "3d/render_trav.h"
00032 #include "3d/clip_trav.h"
00033 #include "nel/misc/debug.h"
00034 #include "nel/misc/hierarchical_timer.h"
00035
00036
00037 using namespace NLMISC;
00038
00039 namespace NL3D {
00040
00041
00042
00043 void CVegetableBlendLayerModel::registerBasic()
00044 {
00045 CMOT::registerModel(VegetableBlendLayerModelId, TransformId, CVegetableBlendLayerModel::creator);
00046 CMOT::registerObs(RenderTravId, VegetableBlendLayerModelId, CVegetableBlendLayerRenderObs::creator);
00047 CMOT::registerObs(ClipTravId, VegetableBlendLayerModelId, CVegetableBlendLayerClipObs::creator);
00048 }
00049
00050
00051
00052 CVegetableBlendLayerModel::CVegetableBlendLayerModel()
00053 {
00054 VegetableManager= NULL;
00055
00056
00057 setTransparency(true);
00058 setOpacity(false);
00059
00060
00061 CTransform::setIsRenderable(true);
00062 }
00063
00064
00065
00066 void CVegetableBlendLayerModel::initModel()
00067 {
00068 CTransform::initModel();
00069
00070 _HrcObs= safe_cast<CTransformHrcObs *>(getObs(HrcTravId));
00071 }
00072
00073
00074
00075 void CVegetableBlendLayerModel::setWorldPos(const CVector &pos)
00076 {
00077
00078 _HrcObs->LocalMatrix.setPos(pos);
00079
00080
00081 _HrcObs->WorldMatrix.setPos(pos);
00082
00083 }
00084
00085
00086
00087 void CVegetableBlendLayerModel::render(IDriver *driver)
00088 {
00089 H_AUTO( NL3D_Vegetable_Render );
00090
00091 nlassert(VegetableManager);
00092
00093 if(SortBlocks.size()==0)
00094 return;
00095
00096
00097
00098 VegetableManager->setupRenderStateForBlendLayerModel(driver);
00099
00100
00101
00102
00103 uint rdrPass= NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT;
00104
00105
00106 bool precVBHardMode= true;
00107 CVegetableVBAllocator *vbAllocator= &VegetableManager->getVBAllocatorForRdrPassAndVBHardMode(rdrPass, 1);
00108 vbAllocator->activate();
00109
00110
00111 CPrimitiveProfile ppIn, ppOut;
00112 driver->profileRenderedPrimitives(ppIn, ppOut);
00113 uint precNTriRdr= ppOut.NTriangles;
00114
00115
00116 for(uint i=0; i<SortBlocks.size();i++)
00117 {
00118 CVegetableSortBlock *ptrSortBlock= SortBlocks[i];
00119
00120
00121 if(ptrSortBlock->ZSortHardMode != precVBHardMode)
00122 {
00123
00124 CVegetableVBAllocator *vbAllocator= &VegetableManager->getVBAllocatorForRdrPassAndVBHardMode(rdrPass, ptrSortBlock->ZSortHardMode);
00125 vbAllocator->activate();
00126
00127 precVBHardMode= ptrSortBlock->ZSortHardMode;
00128 }
00129
00130
00131 driver->renderSimpleTriangles(
00132 ptrSortBlock->_SortedTriangleIndices[ptrSortBlock->_QuadrantId],
00133 ptrSortBlock->_NTriangles);
00134 }
00135
00136
00137 driver->profileRenderedPrimitives(ppIn, ppOut);
00138 VegetableManager->_NumVegetableFaceRendered+= ppOut.NTriangles-precNTriRdr;
00139
00140
00141
00142
00143
00144 SortBlocks.clear();
00145
00146
00147
00148
00149 VegetableManager->exitRenderStateForBlendLayerModel(driver);
00150
00151 }
00152
00153
00154
00155 void CVegetableBlendLayerRenderObs::traverse(IObs *caller)
00156 {
00157 CRenderTrav *rTrav= safe_cast<CRenderTrav*>(Trav);
00158 safe_cast<CVegetableBlendLayerModel*>(Model)->render(rTrav->getDriver());
00159 }
00160
00161
00162 }