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/vertex_buffer_heap.h"
00029 #include "nel/misc/common.h"
00030
00031 using namespace NLMISC;
00032
00033
00034 namespace NL3D
00035 {
00036
00037
00038 CVertexBufferHeap::CVertexBufferHeap()
00039 {
00040 _Enabled= false;
00041 _HardMode= false;
00042
00043 _HeapStart= NULL;
00044 _VertexFormat= 0;
00045 _VertexSize= 0;
00046 _MaxVertices= 0;
00047 }
00048
00049
00050 CVertexBufferHeap::~CVertexBufferHeap()
00051 {
00052 release();
00053 }
00054
00055
00056 void CVertexBufferHeap::init(IDriver *driver, uint vertexFormat, uint maxVertices)
00057 {
00058 nlassert(driver);
00059
00060 release();
00061
00062
00063 _Driver= driver;
00064
00065
00066 _VBSoft.setVertexFormat(vertexFormat);
00067
00068 nlassert( (_VBSoft.getVertexSize()&3) == 0)
00069
00070
00071 _VBHard= driver->createVertexBufferHard(_VBSoft.getVertexFormat(), _VBSoft.getValueTypePointer(), maxVertices, IDriver::VBHardAGP);
00072
00073
00074 _Enabled= true;
00075 _VertexFormat= _VBSoft.getVertexFormat();
00076 _VertexSize= _VBSoft.getVertexSize();
00077 _MaxVertices= maxVertices;
00078
00079
00080 if(_VBHard)
00081 {
00082 _HardMode= true;
00083
00084 _HeapStart= (uint8*)_VBHard->lock();
00085
00086 _VBHard->unlock(0,0);
00087 }
00088 else
00089 {
00090 _HardMode= false;
00091
00092 _VBSoft.setNumVertices(maxVertices);
00093
00094 _HeapStart= (uint8*)_VBSoft.getVertexCoordPointer();
00095 }
00096
00097
00098 _HeapManager.initHeap(_HeapStart, _MaxVertices*_VertexSize);
00099 }
00100
00101 void CVertexBufferHeap::release()
00102 {
00103 if(_VBHard)
00104 {
00105 nlassert(_Driver);
00106 _Driver->deleteVertexBufferHard(_VBHard);
00107 }
00108 _VBHard= NULL;
00109 _Driver= NULL;
00110 _HeapStart= NULL;
00111
00112 contReset(_VBSoft);
00113 contReset(_HeapManager);
00114
00115 _Enabled= false;
00116 _HardMode= false;
00117 _VertexFormat= 0;
00118 _VertexSize= 0;
00119 _MaxVertices= 0;
00120 }
00121
00122
00123 bool CVertexBufferHeap::allocate(uint numVertices, uint &indexStart)
00124 {
00125 nlassert(enabled());
00126
00127
00128 uint8 *ptr= (uint8*)_HeapManager.allocate(numVertices*getVertexSize());
00129 if(!ptr)
00130 return false;
00131 else
00132 {
00133
00134 indexStart= (uint)(ptr-_HeapStart);
00135 indexStart/= _VertexSize;
00136 return true;
00137 }
00138 }
00139
00140 void CVertexBufferHeap::free(uint indexStart)
00141 {
00142 nlassert(enabled());
00143
00144
00145 uint8 *ptr= _HeapStart + indexStart*_VertexSize;
00146
00147 _HeapManager.free(ptr);
00148 }
00149
00150
00151 uint8 *CVertexBufferHeap::lock(uint indexStart)
00152 {
00153 nlassert(enabled());
00154
00155 uint8 *ptr;
00156 if(_HardMode)
00157 {
00158
00159 ptr= (uint8*)_VBHard->lock();
00160 nlassert(ptr==_HeapStart);
00161 }
00162 else
00163 ptr= _HeapStart;
00164
00165
00166 return ptr + indexStart*_VertexSize;
00167 }
00168
00169 void CVertexBufferHeap::unlock(uint startVert, uint endVert)
00170 {
00171 nlassert(enabled());
00172
00173 if(_HardMode)
00174 _VBHard->unlock(startVert, endVert);
00175 }
00176
00177 void CVertexBufferHeap::activate()
00178 {
00179 nlassert(enabled());
00180
00181 if(_HardMode)
00182 _Driver->activeVertexBufferHard(_VBHard);
00183 else
00184 _Driver->activeVertexBuffer(_VBSoft);
00185 }
00186
00187
00188 }