50#define DEFAULT_VB_SIZE 5000
52static bool _DynamicSortingVertexArrayInUse=
false;
55static unsigned short _DynamicSortingVertexArraySize=0;
56static unsigned short _DynamicSortingVertexArrayOffset=0;
58static bool _DynamicDX8VertexBufferInUse=
false;
61static unsigned short _DynamicDX8VertexBufferOffset=0;
65static int _DX8VertexBufferCount=0;
67static int _VertexBufferCount;
68static int _VertexBufferTotalVertices;
69static int _VertexBufferTotalSize;
86 WWASSERT((FVF!=0 && vertex_size==0) || (FVF==0 && vertex_size!=0));
92#ifdef VERTEX_BUFFER_LOG
94 WWDEBUG_SAY((
"Total VB count: %d, total %d vertices, total size %d bytes\n",
96 _VertexBufferTotalVertices,
97 _VertexBufferTotalSize));
105 _VertexBufferCount--;
109#ifdef VERTEX_BUFFER_LOG
111 WWDEBUG_SAY((
"Total VB count: %d, total %d vertices, total size %d bytes\n",
113 _VertexBufferTotalVertices,
114 _VertexBufferTotalSize));
121 return _VertexBufferCount;
126 return _VertexBufferTotalVertices;
131 return _VertexBufferTotalSize;
166#ifdef VERTEX_BUFFER_LOG
170 WWDEBUG_SAY((
"VertexBuffer->Lock(start_index: 0, index_range: 0(%d), fvf_size: %d, fvf: %s)\n",
199#ifdef VERTEX_BUFFER_LOG
231#ifdef VERTEX_BUFFER_LOG
235 WWDEBUG_SAY((
"VertexBuffer->Lock(start_index: %d, index_range: %d, fvf_size: %d, fvf: %s)\n",
266#ifdef VERTEX_BUFFER_LOG
298 delete[] VertexBuffer;
402#ifdef VERTEX_BUFFER_LOG
404 _DX8VertexBufferCount--;
405 WWDEBUG_SAY((
"Current vertex buffer count: %d\n",_DX8VertexBufferCount));
421#ifdef VERTEX_BUFFER_LOG
424 WWDEBUG_SAY((
"CreateVertexBuffer(fvfsize=%d, vertex_count=%d, D3DUSAGE_WRITEONLY|%s|%s, fvf: %s, %s)\n",
430 (usage&
USAGE_DYNAMIC) ?
"D3DPOOL_DEFAULT" :
"D3DPOOL_MANAGED"));
431 _DX8VertexBufferCount++;
432 WWDEBUG_SAY((
"Current vertex buffer count: %d\n",_DX8VertexBufferCount));
435 unsigned usage_flags=
441 usage_flags|=D3DUSAGE_SOFTWAREPROCESSING;
446 usage_flags|=D3DUSAGE_SOFTWAREPROCESSING;
455 if (SUCCEEDED(ret)) {
459 WWDEBUG_SAY((
"Vertex buffer creation failed, trying to release assets...\n"));
480 if (SUCCEEDED(ret)) {
481 WWDEBUG_SAY((
"...Vertex buffer creation succesful\n"));
510 for (
unsigned v=0;v<count;++v) {
511 verts[v].
x=(*loc)[0];
512 verts[v].
y=(*loc)[1];
513 verts[v].
z=(*loc++)[2];
514 verts[v].
nx=(*norm)[0];
515 verts[v].
ny=(*norm)[1];
516 verts[v].
nz=(*norm++)[2];
517 verts[v].
u1=(*uv)[0];
518 verts[v].
v1=(*uv++)[1];
524 for (
unsigned v=0;v<count;++v) {
525 verts[v].
x=(*loc)[0];
526 verts[v].
y=(*loc)[1];
527 verts[v].
z=(*loc++)[2];
528 verts[v].
nx=(*norm)[0];
529 verts[v].
ny=(*norm)[1];
530 verts[v].
nz=(*norm++)[2];
531 verts[v].
u1=(*uv)[0];
532 verts[v].
v1=(*uv++)[1];
548 for (
unsigned v=0;v<count;++v) {
549 verts[v].
x=(*loc)[0];
550 verts[v].
y=(*loc)[1];
551 verts[v].
z=(*loc++)[2];
557 for (
unsigned v=0;v<count;++v) {
558 verts[v].
x=(*loc)[0];
559 verts[v].
y=(*loc)[1];
560 verts[v].
z=(*loc++)[2];
578 for (
unsigned v=0;v<count;++v) {
579 verts[v].
x=(*loc)[0];
580 verts[v].
y=(*loc)[1];
581 verts[v].
z=(*loc++)[2];
582 verts[v].
u1=(*uv)[0];
583 verts[v].
v1=(*uv++)[1];
589 for (
unsigned v=0;v<count;++v) {
590 verts[v].
x=(*loc)[0];
591 verts[v].
y=(*loc)[1];
592 verts[v].
z=(*loc++)[2];
593 verts[v].
u1=(*uv)[0];
594 verts[v].
v1=(*uv++)[1];
611 for (
unsigned v=0;v<count;++v) {
612 verts[v].
x=(*loc)[0];
613 verts[v].
y=(*loc)[1];
614 verts[v].
z=(*loc++)[2];
615 verts[v].
nx=(*norm)[0];
616 verts[v].
ny=(*norm)[1];
617 verts[v].
nz=(*norm++)[2];
623 for (
unsigned v=0;v<count;++v) {
624 verts[v].
x=(*loc)[0];
625 verts[v].
y=(*loc)[1];
626 verts[v].
z=(*loc++)[2];
627 verts[v].
nx=(*norm)[0];
628 verts[v].
ny=(*norm)[1];
629 verts[v].
nz=(*norm++)[2];
648 for (
unsigned v=0;v<count;++v) {
649 verts[v].
x=(*loc)[0];
650 verts[v].
y=(*loc)[1];
651 verts[v].
z=(*loc++)[2];
652 verts[v].
nx=(*norm)[0];
653 verts[v].
ny=(*norm)[1];
654 verts[v].
nz=(*norm++)[2];
655 verts[v].
u1=(*uv)[0];
656 verts[v].
v1=(*uv++)[1];
663 for (
unsigned v=0;v<count;++v) {
664 verts[v].
x=(*loc)[0];
665 verts[v].
y=(*loc)[1];
666 verts[v].
z=(*loc++)[2];
667 verts[v].
nx=(*norm)[0];
668 verts[v].
ny=(*norm)[1];
669 verts[v].
nz=(*norm++)[2];
670 verts[v].
u1=(*uv)[0];
671 verts[v].
v1=(*uv++)[1];
690 for (
unsigned v=0;v<count;++v) {
691 verts[v].
x=(*loc)[0];
692 verts[v].
y=(*loc)[1];
693 verts[v].
z=(*loc++)[2];
694 verts[v].
u1=(*uv)[0];
695 verts[v].
v1=(*uv++)[1];
702 for (
unsigned v=0;v<count;++v) {
703 verts[v].
x=(*loc)[0];
704 verts[v].
y=(*loc)[1];
705 verts[v].
z=(*loc++)[2];
706 verts[v].
u1=(*uv)[0];
707 verts[v].
v1=(*uv++)[1];
722 FVFInfo(_DynamicFVFInfo),
723 VertexCount(vertex_count_),
730 Allocate_DX8_Dynamic_Buffer();
733 Allocate_Sorting_Dynamic_Buffer();
740 _DynamicDX8VertexBufferInUse=
false;
741 _DynamicDX8VertexBufferOffset+=(unsigned) VertexCount;
744 _DynamicSortingVertexArrayInUse=
false;
745 _DynamicSortingVertexArrayOffset+=VertexCount;
755 WWASSERT ((_DynamicDX8VertexBuffer ==
NULL) || (_DynamicDX8VertexBuffer->Num_Refs() == 1));
757 _DynamicDX8VertexBufferInUse=
false;
759 _DynamicDX8VertexBufferOffset=0;
761 WWASSERT ((_DynamicSortingVertexArray ==
NULL) || (_DynamicSortingVertexArray->Num_Refs() == 1));
763 WWASSERT(!_DynamicSortingVertexArrayInUse);
764 _DynamicSortingVertexArrayInUse=
false;
765 _DynamicSortingVertexArraySize=0;
766 _DynamicSortingVertexArrayOffset=0;
769void DynamicVBAccessClass::Allocate_DX8_Dynamic_Buffer()
772 WWASSERT(!_DynamicDX8VertexBufferInUse);
773 _DynamicDX8VertexBufferInUse=
true;
777 if (VertexCount>_DynamicDX8VertexBufferSize) {
779 _DynamicDX8VertexBufferSize=VertexCount;
784 if (!_DynamicDX8VertexBuffer) {
790 _DynamicDX8VertexBuffer=
NEW_REF(DX8VertexBufferClass,(
792 _DynamicDX8VertexBufferSize,
794 _DynamicDX8VertexBufferOffset=0;
798 if (((
unsigned)VertexCount+_DynamicDX8VertexBufferOffset)>_DynamicDX8VertexBufferSize) {
799 _DynamicDX8VertexBufferOffset=0;
803 VertexBufferOffset=_DynamicDX8VertexBufferOffset;
806void DynamicVBAccessClass::Allocate_Sorting_Dynamic_Buffer()
809 WWASSERT(!_DynamicSortingVertexArrayInUse);
810 _DynamicSortingVertexArrayInUse=
true;
812 unsigned new_vertex_count=_DynamicSortingVertexArrayOffset+VertexCount;
814 if (new_vertex_count>_DynamicSortingVertexArraySize) {
816 _DynamicSortingVertexArraySize=new_vertex_count;
820 if (!_DynamicSortingVertexArray) {
821 _DynamicSortingVertexArray=
NEW_REF(SortingVertexBufferClass,(_DynamicSortingVertexArraySize));
822 _DynamicSortingVertexArrayOffset=0;
825 REF_PTR_SET(VertexBuffer,_DynamicSortingVertexArray);
826 VertexBufferOffset=_DynamicSortingVertexArrayOffset;
833 DynamicVBAccess(dynamic_vb_access_)
836 switch (DynamicVBAccess->Get_Type()) {
838#ifdef VERTEX_BUFFER_LOG
858 DynamicVBAccess->VertexBufferOffset*_DynamicDX8VertexBuffer->FVF_Info().Get_FVF_Size(),
859 DynamicVBAccess->Get_Vertex_Count()*DynamicVBAccess->VertexBuffer->FVF_Info().Get_FVF_Size(),
860 (
unsigned char**)&Vertices,
861 D3DLOCK_NOSYSLOCK | (!DynamicVBAccess->VertexBufferOffset ? D3DLOCK_DISCARD : D3DLOCK_NOOVERWRITE)));
865 Vertices+=DynamicVBAccess->VertexBufferOffset;
879 switch (DynamicVBAccess->Get_Type()) {
881#ifdef VERTEX_BUFFER_LOG
902 _DynamicSortingVertexArrayOffset=0;
903 if (frame_changed) _DynamicDX8VertexBufferOffset=0;
908 return _DynamicDX8VertexBufferSize;
DX8VertexBufferClass(unsigned FVF, unsigned short VertexCount, UsageType usage=USAGE_DEFAULT, unsigned vertex_size=0)
@ USAGE_SOFTWAREPROCESSING
void Create_Vertex_Buffer(UsageType usage)
IDirect3DVertexBuffer8 * VertexBuffer
IDirect3DVertexBuffer8 * Get_DX8_Vertex_Buffer()
void Copy(const Vector3 *loc, unsigned first_vertex, unsigned count)
static IDirect3DDevice8 * _Get_D3D_Device8()
static const DX8Caps * Get_Current_Caps()
static Vector4 Convert_Color(unsigned color)
WriteLockClass(DynamicVBAccessClass *vb_access)
static unsigned short Get_Default_Vertex_Count(void)
current size of dynamic vertex buffer
static void _Reset(bool frame_changed)
DynamicVBAccessClass(unsigned type, unsigned fvf, unsigned short vertex_count)
void Get_FVF_Name(StringClass &fvfname) const
~SortingVertexBufferClass()
SortingVertexBufferClass(unsigned short VertexCount)
static void Invalidate_Old_Unused_Textures(unsigned inactive_time_override)
Invalidate old unused textures.
AppendLockClass(VertexBufferClass *vertex_buffer, unsigned start_index, unsigned index_range)
WriteLockClass(VertexBufferClass *vertex_buffer, int flags=0)
virtual ~VertexBufferClass()
unsigned short VertexCount
unsigned short Get_Vertex_Count() const
static unsigned Get_Total_Allocated_Vertices()
VertexBufferClass(unsigned type, unsigned FVF, unsigned short VertexCount, unsigned vertex_size=0)
void Release_Engine_Ref() const
static unsigned Get_Total_Allocated_Memory()
static unsigned Get_Total_Buffer_Count()
void Add_Engine_Ref() const
const FVFInfoClass & FVF_Info() const
void * Get_Vertex_Array()
VertexBufferClass * VertexBuffer
VertexBufferLockClass(VertexBufferClass *vertex_buffer_)
static void _Invalidate_Mesh_Cache()
const unsigned dynamic_fvf_type
@ BUFFER_TYPE_DYNAMIC_DX8
@ BUFFER_TYPE_DYNAMIC_SORTING
#define DX8_THREAD_ASSERT()
WWINLINE void DX8_ErrorCode(unsigned res)
#define REF_PTR_RELEASE(x)
#define REF_PTR_SET(dst, src)
#define WWMEMLOG(category)