23
#include "GLResource.h"
24
#include "GLResourceManager.h"
25
#include "GLDeviceObjects.h"
26
#include "GLDeviceFactory.h"
27
#include "GLVertexResourceManager.h"
29
#include "NuxMesh/NMeshObject.h"
30
#include "OpenGLEngine.h"
34
IMPLEMENT_OBJECT_TYPE(NVertexBuffer);
35
IMPLEMENT_OBJECT_TYPE(NIndexBuffer);
36
IMPLEMENT_OBJECT_TYPE(NMesh);
37
IMPLEMENT_OBJECT_TYPE(NStaticMesh);
38
IMPLEMENT_OBJECT_TYPE(NVertexDeclaration);
40
IMPLEMENT_OBJECT_TYPE(NGLVertexBuffer);
41
IMPLEMENT_OBJECT_TYPE(NGLIndexBuffer);
42
//IMPLEMENT_OBJECT_TYPE(NGLMesh);
43
IMPLEMENT_OBJECT_TYPE(NGLStaticMesh);
44
IMPLEMENT_OBJECT_TYPE(NGLVertexDeclaration);
47
NVertexBuffer::NVertexBuffer()
52
NVertexBuffer::~NVertexBuffer()
57
NVertexBuffer::NVertexBuffer(int Size, int Stride)
59
Allocate(Size, Stride);
63
NVertexBuffer::NVertexBuffer(const NVertexBuffer& Other)
66
_Stride = Other._Stride;
69
//! Assignment constructor
70
NVertexBuffer& NVertexBuffer::operator = (const NVertexBuffer& Other)
73
_Stride = Other._Stride;
77
void NVertexBuffer::Allocate(int Size, int Stride)
80
nuxAssert(Stride > 0);
81
if((Stride <= 0) || (Size <= 0))
88
// Make sure Size is a multiple of Stride
89
int sz = Align<int>(Size, Stride);
96
int NVertexBuffer::GetSize() const
101
int NVertexBuffer::GetStride() const
106
int NVertexBuffer::GetNumElement() const
108
return _Data.size() / _Stride;
111
const t_u8* NVertexBuffer::GetPtrRawData() const
113
if(_Data.size() == 0)
115
return INL_STATIC_CAST(const t_u8*, &_Data[0]);
118
t_u8* NVertexBuffer::GetPtrRawData()
120
if(_Data.size() == 0)
122
return INL_CONST_CAST(t_u8*, ((INL_CONST_CAST(const NVertexBuffer*, this))->GetPtrRawData()));
125
//////////////////////////////////////////////////////////////////////////
126
NIndexBuffer::NIndexBuffer()
131
NIndexBuffer::~NIndexBuffer()
136
NIndexBuffer::NIndexBuffer(int Size, int Stride)
138
Allocate(Size, Stride);
142
NIndexBuffer::NIndexBuffer(const NIndexBuffer& Other)
145
_Stride = Other._Stride;
148
//! Assignment constructor
149
NIndexBuffer& NIndexBuffer::operator = (const NIndexBuffer& Other)
152
_Stride = Other._Stride;
156
void NIndexBuffer::Allocate(int Size, int Stride)
159
nuxAssert(Stride > 0);
160
if((Stride <= 0) || (Size <= 0))
166
// Make sure Size is a multiple of Stride
167
int sz = Align<int>(Size, Stride);
174
int NIndexBuffer::GetSize() const
179
int NIndexBuffer::GetStride() const
184
int NIndexBuffer::GetNumElement() const
186
return _Data.size() / _Stride;
189
const t_u8* NIndexBuffer::GetPtrRawData() const
191
return INL_STATIC_CAST(const t_u8*, &_Data[0]);
194
t_u8* NIndexBuffer::GetPtrRawData()
196
return INL_CONST_CAST(t_u8*, ((INL_CONST_CAST(const NIndexBuffer*, this))->GetPtrRawData()));
199
//////////////////////////////////////////////////////////////////////////
200
NVertexDeclaration::NVertexDeclaration()
202
m_Declaration.clear();
205
NVertexDeclaration::~NVertexDeclaration()
207
m_Declaration.clear();
210
void NVertexDeclaration::AddVertexComponent(VERTEXELEMENT Component)
212
m_Declaration.push_back(Component);
214
//////////////////////////////////////////////////////////////////////////
217
NMeshComponent::NMeshComponent()
218
: _Type(ATTRIB_DECLTYPE_UNKNOWN)
224
NMeshComponent::NMeshComponent(const NMeshComponent& Other)
225
: _Type(ATTRIB_DECLTYPE_UNKNOWN)
230
_Offset = Other._Offset;
231
_StreamIndex = Other._StreamIndex;
234
NMeshComponent::NMeshComponent(int StreamIndex/*TRefGL<NVertexBuffer> VtxBuffer*/, int Offset, ATTRIB_DECL_TYPE Type)
236
nuxAssert(Offset >= 0);
239
_StreamIndex = StreamIndex;
242
NMeshComponent::~NMeshComponent()
246
NMeshComponent& NMeshComponent::operator = (const NMeshComponent& Other)
249
_Offset = Other._Offset;
250
_StreamIndex = Other._StreamIndex;
254
int NMeshComponent::GetStreamIndex() const
259
// int NMeshComponent::GetStride()
261
// return _VtxBuffer->GetStride();
264
int NMeshComponent::GetOffset()
269
//////////////////////////////////////////////////////////////////////////
270
NGLVertexBuffer::NGLVertexBuffer(NResourceSet* ResourceManager, NVertexBuffer* SourceVtxBuffer)
271
: NGLResource(ResourceManager)
275
UpdateResource(SourceVtxBuffer);
278
NGLVertexBuffer::~NGLVertexBuffer()
280
// Not necessary for a smart pointer but do it anyway to be clear;
284
bool NGLVertexBuffer::UpdateResource(NResource* Source)
289
m_VtxBuffer.Release();
293
NVertexBuffer* SourceVtxBuffer = 0;
294
nuxAssert(Source->Type().IsDerivedFromType(NVertexBuffer::StaticObjectType));
295
if(Source->Type().IsDerivedFromType(NVertexBuffer::StaticObjectType))
297
SourceVtxBuffer = INL_STATIC_CAST(NVertexBuffer*, Source);
304
if((SourceVtxBuffer->GetSize() == 0) || (SourceVtxBuffer->GetStride() == 0))
307
m_VtxBuffer.Release();
311
if(_Size != SourceVtxBuffer->GetSize())
313
_Size = SourceVtxBuffer->GetSize();
314
_Stride = SourceVtxBuffer->GetStride();
316
//Release the previous vertex buffer if any.
317
m_VtxBuffer.Release();
318
m_VtxBuffer = GetThreadGLDeviceFactory()->CreateVertexBuffer(_Size, VBO_USAGE_DYNAMIC);
319
LoadVertexData(SourceVtxBuffer);
323
_Stride = SourceVtxBuffer->GetStride();
324
LoadVertexData(SourceVtxBuffer);
329
void NGLVertexBuffer::LoadVertexData(NVertexBuffer* SourceVtxBuffer)
331
if((SourceVtxBuffer == 0) || (SourceVtxBuffer->GetSize() == 0) || (SourceVtxBuffer->GetStride() == 0))
338
m_VtxBuffer->Lock(0, 0, (void**)&pData);
339
Memcpy(pData, SourceVtxBuffer->GetPtrRawData(), SourceVtxBuffer->GetSize());
340
m_VtxBuffer->Unlock();
343
//////////////////////////////////////////////////////////////////////////
344
NGLIndexBuffer::NGLIndexBuffer(NResourceSet* ResourceManager, NIndexBuffer* SourceIdxBuffer)
345
: NGLResource(ResourceManager)
349
UpdateResource(SourceIdxBuffer);
352
NGLIndexBuffer::~NGLIndexBuffer()
354
// Not necessary for a smart pointer but do it anyway to be clear;
358
bool NGLIndexBuffer::UpdateResource(NResource* Source)
364
m_IdxBuffer.Release();
367
NIndexBuffer* SourceIdxBuffer = 0;
368
nuxAssert(Source->Type().IsDerivedFromType(NIndexBuffer::StaticObjectType));
369
if(Source->Type().IsDerivedFromType(NIndexBuffer::StaticObjectType))
371
SourceIdxBuffer = INL_STATIC_CAST(NIndexBuffer*, Source);
378
if((SourceIdxBuffer->GetSize() == 0) || (SourceIdxBuffer->GetStride() == 0))
382
m_IdxBuffer.Release();
386
if(_Size != SourceIdxBuffer->GetSize())
388
_Size = SourceIdxBuffer->GetSize();
389
_Stride = SourceIdxBuffer->GetStride();
391
//Release the previous vertex buffer if any.
392
m_IdxBuffer.Release();
393
m_IdxBuffer = GetThreadGLDeviceFactory()->CreateIndexBuffer(_Size, VBO_USAGE_DYNAMIC,
394
(SourceIdxBuffer->GetStride() == 2)? INDEX_FORMAT_USHORT : INDEX_FORMAT_UINT);
395
LoadIndexData(SourceIdxBuffer);
399
_Stride = SourceIdxBuffer->GetStride();
400
LoadIndexData(SourceIdxBuffer);
405
void NGLIndexBuffer::LoadIndexData(NIndexBuffer* SourceIdxBuffer)
407
if((SourceIdxBuffer == 0) || (SourceIdxBuffer->GetSize() == 0) || (SourceIdxBuffer->GetStride() == 0))
413
m_IdxBuffer->Lock(0, 0, (void**)&pData);
414
Memcpy(pData, SourceIdxBuffer->GetPtrRawData(), SourceIdxBuffer->GetSize());
415
m_IdxBuffer->Unlock();
418
NGLVertexDeclaration::NGLVertexDeclaration(NResourceSet* ResourceManager, NVertexDeclaration* SourceVertexDeclaration)
419
: NGLResource(ResourceManager)
421
UpdateResource(SourceVertexDeclaration);
424
NGLVertexDeclaration::~NGLVertexDeclaration()
426
m_VtxDeclaration = 0;
429
bool NGLVertexDeclaration::UpdateResource(NResource* Source)
433
m_VtxDeclaration = 0;
436
NVertexDeclaration* SourceVertexDeclaration = 0;
437
nuxAssert(Source->Type().IsDerivedFromType(NVertexDeclaration::StaticObjectType));
438
if(Source->Type().IsDerivedFromType(NVertexDeclaration::StaticObjectType))
440
SourceVertexDeclaration = INL_STATIC_CAST(NVertexDeclaration*, Source);
447
if(SourceVertexDeclaration == 0)
449
m_VtxDeclaration = 0;
452
m_VtxDeclaration = GetThreadGLDeviceFactory()->CreateVertexDeclaration(&SourceVertexDeclaration->m_Declaration[0]);
467
NStaticMesh::NStaticMesh(NMeshObject* Object)
473
int hasTextureCoord = 0;
477
int OffsetToNormal = 0;
478
int OffsetToColor = 0;
479
int OffsetToTextureCoord = 0;
480
int OffsetToBinormal = 0;
481
int OffsetToTangent = 0;
483
int buffersize = Object->GetVertexBufferSize();
484
int vtxsize = sizeof(Vec4<float>);
486
if(Object->HasNormal())
489
OffsetToNormal = vtxsize;
490
buffersize += Object->GetNormalBufferSize();
491
vtxsize += sizeof(Vec3<float>);
494
if(Object->HasColor())
497
OffsetToColor = vtxsize;
498
buffersize += Object->GetColorBufferSize();
499
vtxsize += sizeof(Vec4<float>);
502
if(Object->HasBinormal())
505
OffsetToBinormal = vtxsize;
506
buffersize += Object->GetNormalBufferSize();
507
vtxsize += sizeof(Vec3<float>);
510
if(Object->HasTangent())
513
OffsetToTangent = vtxsize;
514
buffersize += Object->GetNormalBufferSize();
515
vtxsize += sizeof(Vec3<float>);
518
if(Object->HasTexCoord())
521
OffsetToTextureCoord = vtxsize;
522
buffersize += Object->GetTextureBufferSize();
523
vtxsize += sizeof(Vec2<float>);
526
NVertexBuffer* vb = new NVertexBuffer(buffersize, vtxsize);
528
t_byte* data = vb->GetPtrRawData();
529
for(unsigned int i = 0; i < Object->GetNumPolygon(); i++)
531
Memcpy(data, &(Object->m_VertexArray[i]), sizeof(Vec4<float>));
534
Memcpy(data + OffsetToNormal, &(Object->m_NormalArray[0][i]), sizeof(Vec3<float>));
538
Memcpy(data + OffsetToBinormal, &(Object->m_BinormalArrayXSI[0][i]), sizeof(Vec3<float>));
542
Memcpy(data + OffsetToTangent, &(Object->m_TangentArrayXSI[0][i]), sizeof(Vec3<float>));
546
Memcpy(data + OffsetToColor, &(Object->m_ColorArray[0][i]), sizeof(Vec4<float>));
550
Memcpy(data + OffsetToTextureCoord, &(Object->m_TextureArray[0][i]), sizeof(Vec2<float>));
554
m_pVertexStreamArray.push_back(vb);
557
m_pVertexDeclaration = new NVertexDeclaration();
559
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, 0, ATTRIB_CT_FLOAT, 4, ATTRIB_USAGE_DECL_POSITION, 0, 0));
562
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToNormal, ATTRIB_CT_FLOAT, 3, ATTRIB_USAGE_DECL_NORMAL, 0, 0));
566
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToBinormal, ATTRIB_CT_FLOAT, 3, ATTRIB_USAGE_DECL_BINORMAL, 0, 0));
570
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToTangent, ATTRIB_CT_FLOAT, 3, ATTRIB_USAGE_DECL_TANGENT, 0, 0));
574
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToColor, ATTRIB_CT_FLOAT, 4, ATTRIB_USAGE_DECL_COLOR, 0, 0));
578
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToTextureCoord, ATTRIB_CT_FLOAT, 2, ATTRIB_USAGE_DECL_TEXCOORD, 0, 0));
581
m_pVertexDeclaration->AddVertexComponent(DECL_END);
586
NIndexBuffer* ib = new NIndexBuffer(Object->m_IndexArray.size(), 4);
587
Memcpy(ib->GetPtrRawData(), &Object->m_IndexArray[0], Object->m_IndexArray.size());
591
NStaticMesh::~NStaticMesh()
593
delete m_pVertexDeclaration;
595
for(int i = 0; i < m_pVertexStreamArray.size(); i++)
597
delete m_pVertexStreamArray[i];
601
int NStaticMesh::GetNumStreams() const
603
return m_pVertexStreamArray.size();
606
NGLStaticMesh::NGLStaticMesh(NResourceSet* ResourceManager, NStaticMesh* StaticMesh)
607
: NGLResource(ResourceManager)
609
int NumStreams = StaticMesh->GetNumStreams();
611
for(int s = 0; s < NumStreams; s++)
613
m_VertexBufferArray.push_back(GetThreadGraphicsContext()->CacheResource(StaticMesh->m_pVertexStreamArray[s]));
616
m_Index = GetThreadGraphicsContext()->CacheResource(StaticMesh->m_pIndex);
617
m_VertexDeclaration = GetThreadGraphicsContext()->CacheResource(StaticMesh->m_pVertexDeclaration);
620
NGLStaticMesh::~NGLStaticMesh()
625
bool NGLStaticMesh::UpdateResource(NResource* Source)
629
int NumStreams = m_VertexBufferArray.size();
630
for(int s = 0; s < NumStreams; s++)
632
m_VertexBufferArray[s]->UpdateResource(0);
634
m_Index->UpdateResource(0);
635
m_VertexDeclaration->UpdateResource(0);
639
NStaticMesh* StaticMesh = 0;
640
nuxAssert(Source->Type().IsDerivedFromType(NStaticMesh::StaticObjectType));
641
if(Source->Type().IsDerivedFromType(NStaticMesh::StaticObjectType))
643
StaticMesh = INL_STATIC_CAST(NStaticMesh*, Source);
650
int NumStreams = StaticMesh->GetNumStreams();
651
for(int s = 0; s < NumStreams; s++)
653
GetThreadGraphicsContext()->UpdateResource(StaticMesh->m_pVertexStreamArray[s]);
656
GetThreadGraphicsContext()->UpdateResource(StaticMesh->m_pIndex);
657
GetThreadGraphicsContext()->UpdateResource(StaticMesh->m_pVertexDeclaration);
662
// static void sWriteFloat(float** Ptr, float a, float b, float c, float d)
664
// *Ptr[0] = a; *Ptr[1] = b; *Ptr[2] = c; *Ptr[3] = d;
668
// NStaticMesh::NStaticMesh()
674
// NCubeVertexBuffer::NCubeVertexBuffer()
676
// VERTEXELEMENT decl [] =
678
// {0/*Stream*/, 0/*Offset*/, ATTRIB_CT_FLOAT/*Type*/, 4/*NumComponent*/, ATTRIB_USAGE_DECL_POSITION/*Usage*/, 0/*UsageIndex*/, 0 /*CgParameter*/},
682
// while(decl[i].Stream != 0xFF)
684
// _DeclarationsArray.push_back(decl[i]);
699
// float width_ = 1.0f;
700
// float height_ = 1.0f;
701
// float depth_ = 1.0f;
704
// Vector4 v0, v1, v2;
706
// v0 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
707
// v1 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
708
// v2 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
709
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
711
// v0 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
712
// v1 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
713
// v2 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
714
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
717
// v0 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
718
// v1 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
719
// v2 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
720
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
722
// v0 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
723
// v1 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
724
// v2 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
725
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
728
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
729
// v1 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
730
// v2 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
731
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
733
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
734
// v1 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
735
// v2 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
736
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
739
// v0 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
740
// v1 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
741
// v2 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
742
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
744
// v0 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
745
// v1 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
746
// v2 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
747
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
750
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
751
// v1 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
752
// v2 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
753
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
755
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
756
// v1 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
757
// v2 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
758
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
761
// v0 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
762
// v1 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
763
// v2 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
764
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
766
// v0 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
767
// v1 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
768
// v2 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
769
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
771
// m_Size = (INT)m_Vertex.size() * 4 * 4; // bytes
775
// NCubeVertexBuffer::~NCubeVertexBuffer()
779
// void NCubeVertexBuffer::GetData(void* Buffer)
781
// nuxAssert(Buffer);
783
// float *Ptr = (float*)Buffer;
786
// for(i = 0; i < (INT)m_Vertex.size(); i++)
788
// *Ptr++ = m_Vertex[i].x;
789
// *Ptr++ = m_Vertex[i].y;
790
// *Ptr++ = m_Vertex[i].z;
791
// *Ptr++ = m_Vertex[i].w;
795
// INT NCubeVertexBuffer::GetSize()
797
// return m_Size; // bytes
800
// VERTEXELEMENT NCubeVertexBuffer::GetDeclaration(INT i)
802
// if(i < (INT)_DeclarationsArray.size())
804
// return _DeclarationsArray[i];
806
// VERTEXELEMENT decl = DECL_END;
23
#include "GLResource.h"
24
#include "GLResourceManager.h"
25
#include "GLDeviceObjects.h"
26
#include "GLDeviceFactory.h"
27
#include "GLVertexResourceManager.h"
29
#include "NuxMesh/NMeshObject.h"
30
#include "OpenGLEngine.h"
34
IMPLEMENT_OBJECT_TYPE(NVertexBuffer);
35
IMPLEMENT_OBJECT_TYPE(NIndexBuffer);
36
IMPLEMENT_OBJECT_TYPE(NMesh);
37
IMPLEMENT_OBJECT_TYPE(NStaticMesh);
38
IMPLEMENT_OBJECT_TYPE(NVertexDeclaration);
40
IMPLEMENT_OBJECT_TYPE(NGLVertexBuffer);
41
IMPLEMENT_OBJECT_TYPE(NGLIndexBuffer);
42
//IMPLEMENT_OBJECT_TYPE(NGLMesh);
43
IMPLEMENT_OBJECT_TYPE(NGLStaticMesh);
44
IMPLEMENT_OBJECT_TYPE(NGLVertexDeclaration);
47
NVertexBuffer::NVertexBuffer()
52
NVertexBuffer::~NVertexBuffer()
57
NVertexBuffer::NVertexBuffer(int Size, int Stride)
59
Allocate(Size, Stride);
63
NVertexBuffer::NVertexBuffer(const NVertexBuffer& Other)
66
_Stride = Other._Stride;
69
//! Assignment constructor
70
NVertexBuffer& NVertexBuffer::operator = (const NVertexBuffer& Other)
73
_Stride = Other._Stride;
77
void NVertexBuffer::Allocate(int Size, int Stride)
80
nuxAssert(Stride > 0);
81
if((Stride <= 0) || (Size <= 0))
88
// Make sure Size is a multiple of Stride
89
int sz = Align<int>(Size, Stride);
96
int NVertexBuffer::GetSize() const
101
int NVertexBuffer::GetStride() const
106
int NVertexBuffer::GetNumElement() const
108
return _Data.size() / _Stride;
111
const t_u8* NVertexBuffer::GetPtrRawData() const
113
if(_Data.size() == 0)
115
return INL_STATIC_CAST(const t_u8*, &_Data[0]);
118
t_u8* NVertexBuffer::GetPtrRawData()
120
if(_Data.size() == 0)
122
return INL_CONST_CAST(t_u8*, ((INL_CONST_CAST(const NVertexBuffer*, this))->GetPtrRawData()));
125
//////////////////////////////////////////////////////////////////////////
126
NIndexBuffer::NIndexBuffer()
131
NIndexBuffer::~NIndexBuffer()
136
NIndexBuffer::NIndexBuffer(int Size, int Stride)
138
Allocate(Size, Stride);
142
NIndexBuffer::NIndexBuffer(const NIndexBuffer& Other)
145
_Stride = Other._Stride;
148
//! Assignment constructor
149
NIndexBuffer& NIndexBuffer::operator = (const NIndexBuffer& Other)
152
_Stride = Other._Stride;
156
void NIndexBuffer::Allocate(int Size, int Stride)
159
nuxAssert(Stride > 0);
160
if((Stride <= 0) || (Size <= 0))
166
// Make sure Size is a multiple of Stride
167
int sz = Align<int>(Size, Stride);
174
int NIndexBuffer::GetSize() const
179
int NIndexBuffer::GetStride() const
184
int NIndexBuffer::GetNumElement() const
186
return _Data.size() / _Stride;
189
const t_u8* NIndexBuffer::GetPtrRawData() const
191
return INL_STATIC_CAST(const t_u8*, &_Data[0]);
194
t_u8* NIndexBuffer::GetPtrRawData()
196
return INL_CONST_CAST(t_u8*, ((INL_CONST_CAST(const NIndexBuffer*, this))->GetPtrRawData()));
199
//////////////////////////////////////////////////////////////////////////
200
NVertexDeclaration::NVertexDeclaration()
202
m_Declaration.clear();
205
NVertexDeclaration::~NVertexDeclaration()
207
m_Declaration.clear();
210
void NVertexDeclaration::AddVertexComponent(VERTEXELEMENT Component)
212
m_Declaration.push_back(Component);
214
//////////////////////////////////////////////////////////////////////////
217
NMeshComponent::NMeshComponent()
218
: _Type(ATTRIB_DECLTYPE_UNKNOWN)
224
NMeshComponent::NMeshComponent(const NMeshComponent& Other)
225
: _Type(ATTRIB_DECLTYPE_UNKNOWN)
230
_Offset = Other._Offset;
231
_StreamIndex = Other._StreamIndex;
234
NMeshComponent::NMeshComponent(int StreamIndex/*TRefGL<NVertexBuffer> VtxBuffer*/, int Offset, ATTRIB_DECL_TYPE Type)
236
nuxAssert(Offset >= 0);
239
_StreamIndex = StreamIndex;
242
NMeshComponent::~NMeshComponent()
246
NMeshComponent& NMeshComponent::operator = (const NMeshComponent& Other)
249
_Offset = Other._Offset;
250
_StreamIndex = Other._StreamIndex;
254
int NMeshComponent::GetStreamIndex() const
259
// int NMeshComponent::GetStride()
261
// return _VtxBuffer->GetStride();
264
int NMeshComponent::GetOffset()
269
//////////////////////////////////////////////////////////////////////////
270
NGLVertexBuffer::NGLVertexBuffer(NResourceSet* ResourceManager, NVertexBuffer* SourceVtxBuffer)
271
: NGLResource(ResourceManager)
275
UpdateResource(SourceVtxBuffer);
278
NGLVertexBuffer::~NGLVertexBuffer()
280
// Not necessary for a smart pointer but do it anyway to be clear;
284
bool NGLVertexBuffer::UpdateResource(NResource* Source)
289
m_VtxBuffer.Release();
293
NVertexBuffer* SourceVtxBuffer = 0;
294
nuxAssert(Source->Type().IsDerivedFromType(NVertexBuffer::StaticObjectType));
295
if(Source->Type().IsDerivedFromType(NVertexBuffer::StaticObjectType))
297
SourceVtxBuffer = INL_STATIC_CAST(NVertexBuffer*, Source);
304
if((SourceVtxBuffer->GetSize() == 0) || (SourceVtxBuffer->GetStride() == 0))
307
m_VtxBuffer.Release();
311
if(_Size != SourceVtxBuffer->GetSize())
313
_Size = SourceVtxBuffer->GetSize();
314
_Stride = SourceVtxBuffer->GetStride();
316
//Release the previous vertex buffer if any.
317
m_VtxBuffer.Release();
318
m_VtxBuffer = GetThreadGLDeviceFactory()->CreateVertexBuffer(_Size, VBO_USAGE_DYNAMIC);
319
LoadVertexData(SourceVtxBuffer);
323
_Stride = SourceVtxBuffer->GetStride();
324
LoadVertexData(SourceVtxBuffer);
329
void NGLVertexBuffer::LoadVertexData(NVertexBuffer* SourceVtxBuffer)
331
if((SourceVtxBuffer == 0) || (SourceVtxBuffer->GetSize() == 0) || (SourceVtxBuffer->GetStride() == 0))
338
m_VtxBuffer->Lock(0, 0, (void**)&pData);
339
Memcpy(pData, SourceVtxBuffer->GetPtrRawData(), SourceVtxBuffer->GetSize());
340
m_VtxBuffer->Unlock();
343
//////////////////////////////////////////////////////////////////////////
344
NGLIndexBuffer::NGLIndexBuffer(NResourceSet* ResourceManager, NIndexBuffer* SourceIdxBuffer)
345
: NGLResource(ResourceManager)
349
UpdateResource(SourceIdxBuffer);
352
NGLIndexBuffer::~NGLIndexBuffer()
354
// Not necessary for a smart pointer but do it anyway to be clear;
358
bool NGLIndexBuffer::UpdateResource(NResource* Source)
364
m_IdxBuffer.Release();
367
NIndexBuffer* SourceIdxBuffer = 0;
368
nuxAssert(Source->Type().IsDerivedFromType(NIndexBuffer::StaticObjectType));
369
if(Source->Type().IsDerivedFromType(NIndexBuffer::StaticObjectType))
371
SourceIdxBuffer = INL_STATIC_CAST(NIndexBuffer*, Source);
378
if((SourceIdxBuffer->GetSize() == 0) || (SourceIdxBuffer->GetStride() == 0))
382
m_IdxBuffer.Release();
386
if(_Size != SourceIdxBuffer->GetSize())
388
_Size = SourceIdxBuffer->GetSize();
389
_Stride = SourceIdxBuffer->GetStride();
391
//Release the previous vertex buffer if any.
392
m_IdxBuffer.Release();
393
m_IdxBuffer = GetThreadGLDeviceFactory()->CreateIndexBuffer(_Size, VBO_USAGE_DYNAMIC,
394
(SourceIdxBuffer->GetStride() == 2)? INDEX_FORMAT_USHORT : INDEX_FORMAT_UINT);
395
LoadIndexData(SourceIdxBuffer);
399
_Stride = SourceIdxBuffer->GetStride();
400
LoadIndexData(SourceIdxBuffer);
405
void NGLIndexBuffer::LoadIndexData(NIndexBuffer* SourceIdxBuffer)
407
if((SourceIdxBuffer == 0) || (SourceIdxBuffer->GetSize() == 0) || (SourceIdxBuffer->GetStride() == 0))
413
m_IdxBuffer->Lock(0, 0, (void**)&pData);
414
Memcpy(pData, SourceIdxBuffer->GetPtrRawData(), SourceIdxBuffer->GetSize());
415
m_IdxBuffer->Unlock();
418
NGLVertexDeclaration::NGLVertexDeclaration(NResourceSet* ResourceManager, NVertexDeclaration* SourceVertexDeclaration)
419
: NGLResource(ResourceManager)
421
UpdateResource(SourceVertexDeclaration);
424
NGLVertexDeclaration::~NGLVertexDeclaration()
426
m_VtxDeclaration = 0;
429
bool NGLVertexDeclaration::UpdateResource(NResource* Source)
433
m_VtxDeclaration = 0;
436
NVertexDeclaration* SourceVertexDeclaration = 0;
437
nuxAssert(Source->Type().IsDerivedFromType(NVertexDeclaration::StaticObjectType));
438
if(Source->Type().IsDerivedFromType(NVertexDeclaration::StaticObjectType))
440
SourceVertexDeclaration = INL_STATIC_CAST(NVertexDeclaration*, Source);
447
if(SourceVertexDeclaration == 0)
449
m_VtxDeclaration = 0;
452
m_VtxDeclaration = GetThreadGLDeviceFactory()->CreateVertexDeclaration(&SourceVertexDeclaration->m_Declaration[0]);
467
NStaticMesh::NStaticMesh(NMeshObject* Object)
473
int hasTextureCoord = 0;
477
int OffsetToNormal = 0;
478
int OffsetToColor = 0;
479
int OffsetToTextureCoord = 0;
480
int OffsetToBinormal = 0;
481
int OffsetToTangent = 0;
483
int buffersize = Object->GetVertexBufferSize();
484
int vtxsize = sizeof(Vec4<float>);
486
if(Object->HasNormal())
489
OffsetToNormal = vtxsize;
490
buffersize += Object->GetNormalBufferSize();
491
vtxsize += sizeof(Vec3<float>);
494
if(Object->HasColor())
497
OffsetToColor = vtxsize;
498
buffersize += Object->GetColorBufferSize();
499
vtxsize += sizeof(Vec4<float>);
502
if(Object->HasBinormal())
505
OffsetToBinormal = vtxsize;
506
buffersize += Object->GetNormalBufferSize();
507
vtxsize += sizeof(Vec3<float>);
510
if(Object->HasTangent())
513
OffsetToTangent = vtxsize;
514
buffersize += Object->GetNormalBufferSize();
515
vtxsize += sizeof(Vec3<float>);
518
if(Object->HasTexCoord())
521
OffsetToTextureCoord = vtxsize;
522
buffersize += Object->GetTextureBufferSize();
523
vtxsize += sizeof(Vec2<float>);
526
NVertexBuffer* vb = new NVertexBuffer(buffersize, vtxsize);
528
t_byte* data = vb->GetPtrRawData();
529
for(unsigned int i = 0; i < Object->GetNumPolygon(); i++)
531
Memcpy(data, &(Object->m_VertexArray[i]), sizeof(Vec4<float>));
534
Memcpy(data + OffsetToNormal, &(Object->m_NormalArray[0][i]), sizeof(Vec3<float>));
538
Memcpy(data + OffsetToBinormal, &(Object->m_BinormalArrayXSI[0][i]), sizeof(Vec3<float>));
542
Memcpy(data + OffsetToTangent, &(Object->m_TangentArrayXSI[0][i]), sizeof(Vec3<float>));
546
Memcpy(data + OffsetToColor, &(Object->m_ColorArray[0][i]), sizeof(Vec4<float>));
550
Memcpy(data + OffsetToTextureCoord, &(Object->m_TextureArray[0][i]), sizeof(Vec2<float>));
554
m_pVertexStreamArray.push_back(vb);
557
m_pVertexDeclaration = new NVertexDeclaration();
559
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, 0, ATTRIB_CT_FLOAT, 4, ATTRIB_USAGE_DECL_POSITION, 0, 0));
562
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToNormal, ATTRIB_CT_FLOAT, 3, ATTRIB_USAGE_DECL_NORMAL, 0, 0));
566
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToBinormal, ATTRIB_CT_FLOAT, 3, ATTRIB_USAGE_DECL_BINORMAL, 0, 0));
570
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToTangent, ATTRIB_CT_FLOAT, 3, ATTRIB_USAGE_DECL_TANGENT, 0, 0));
574
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToColor, ATTRIB_CT_FLOAT, 4, ATTRIB_USAGE_DECL_COLOR, 0, 0));
578
m_pVertexDeclaration->AddVertexComponent(VERTEXELEMENT(0, OffsetToTextureCoord, ATTRIB_CT_FLOAT, 2, ATTRIB_USAGE_DECL_TEXCOORD, 0, 0));
581
m_pVertexDeclaration->AddVertexComponent(DECL_END);
586
NIndexBuffer* ib = new NIndexBuffer(Object->m_IndexArray.size(), 4);
587
Memcpy(ib->GetPtrRawData(), &Object->m_IndexArray[0], Object->m_IndexArray.size());
591
NStaticMesh::~NStaticMesh()
593
delete m_pVertexDeclaration;
595
for(int i = 0; i < m_pVertexStreamArray.size(); i++)
597
delete m_pVertexStreamArray[i];
601
int NStaticMesh::GetNumStreams() const
603
return m_pVertexStreamArray.size();
606
NGLStaticMesh::NGLStaticMesh(NResourceSet* ResourceManager, NStaticMesh* StaticMesh)
607
: NGLResource(ResourceManager)
609
int NumStreams = StaticMesh->GetNumStreams();
611
for(int s = 0; s < NumStreams; s++)
613
m_VertexBufferArray.push_back(GetThreadGraphicsContext()->CacheResource(StaticMesh->m_pVertexStreamArray[s]));
616
m_Index = GetThreadGraphicsContext()->CacheResource(StaticMesh->m_pIndex);
617
m_VertexDeclaration = GetThreadGraphicsContext()->CacheResource(StaticMesh->m_pVertexDeclaration);
620
NGLStaticMesh::~NGLStaticMesh()
625
bool NGLStaticMesh::UpdateResource(NResource* Source)
629
int NumStreams = m_VertexBufferArray.size();
630
for(int s = 0; s < NumStreams; s++)
632
m_VertexBufferArray[s]->UpdateResource(0);
634
m_Index->UpdateResource(0);
635
m_VertexDeclaration->UpdateResource(0);
639
NStaticMesh* StaticMesh = 0;
640
nuxAssert(Source->Type().IsDerivedFromType(NStaticMesh::StaticObjectType));
641
if(Source->Type().IsDerivedFromType(NStaticMesh::StaticObjectType))
643
StaticMesh = INL_STATIC_CAST(NStaticMesh*, Source);
650
int NumStreams = StaticMesh->GetNumStreams();
651
for(int s = 0; s < NumStreams; s++)
653
GetThreadGraphicsContext()->UpdateResource(StaticMesh->m_pVertexStreamArray[s]);
656
GetThreadGraphicsContext()->UpdateResource(StaticMesh->m_pIndex);
657
GetThreadGraphicsContext()->UpdateResource(StaticMesh->m_pVertexDeclaration);
662
// static void sWriteFloat(float** Ptr, float a, float b, float c, float d)
664
// *Ptr[0] = a; *Ptr[1] = b; *Ptr[2] = c; *Ptr[3] = d;
668
// NStaticMesh::NStaticMesh()
674
// NCubeVertexBuffer::NCubeVertexBuffer()
676
// VERTEXELEMENT decl [] =
678
// {0/*Stream*/, 0/*Offset*/, ATTRIB_CT_FLOAT/*Type*/, 4/*NumComponent*/, ATTRIB_USAGE_DECL_POSITION/*Usage*/, 0/*UsageIndex*/, 0 /*CgParameter*/},
682
// while(decl[i].Stream != 0xFF)
684
// _DeclarationsArray.push_back(decl[i]);
699
// float width_ = 1.0f;
700
// float height_ = 1.0f;
701
// float depth_ = 1.0f;
704
// Vector4 v0, v1, v2;
706
// v0 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
707
// v1 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
708
// v2 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
709
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
711
// v0 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
712
// v1 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
713
// v2 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
714
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
717
// v0 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
718
// v1 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
719
// v2 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
720
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
722
// v0 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
723
// v1 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
724
// v2 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
725
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
728
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
729
// v1 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
730
// v2 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
731
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
733
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
734
// v1 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
735
// v2 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
736
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
739
// v0 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
740
// v1 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
741
// v2 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
742
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
744
// v0 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
745
// v1 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
746
// v2 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
747
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
750
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
751
// v1 = Vector4(-width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 5
752
// v2 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
753
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
755
// v0 = Vector4(-width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 4
756
// v1 = Vector4(-width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 1
757
// v2 = Vector4(-width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 0
758
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
761
// v0 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
762
// v1 = Vector4(width_/2.0f, -height_/2.0f, depth_/2.0f, w_); // 2
763
// v2 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
764
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
766
// v0 = Vector4(width_/2.0f, height_/2.0f, depth_/2.0f, w_); // 3
767
// v1 = Vector4(width_/2.0f, -height_/2.0f, -depth_/2.0f, w_); // 6
768
// v2 = Vector4(width_/2.0f, height_/2.0f, -depth_/2.0f, w_); // 7
769
// m_Vertex.push_back(v0); m_Vertex.push_back(v1); m_Vertex.push_back(v2);
771
// m_Size = (INT)m_Vertex.size() * 4 * 4; // bytes
775
// NCubeVertexBuffer::~NCubeVertexBuffer()
779
// void NCubeVertexBuffer::GetData(void* Buffer)
781
// nuxAssert(Buffer);
783
// float *Ptr = (float*)Buffer;
786
// for(i = 0; i < (INT)m_Vertex.size(); i++)
788
// *Ptr++ = m_Vertex[i].x;
789
// *Ptr++ = m_Vertex[i].y;
790
// *Ptr++ = m_Vertex[i].z;
791
// *Ptr++ = m_Vertex[i].w;
795
// INT NCubeVertexBuffer::GetSize()
797
// return m_Size; // bytes
800
// VERTEXELEMENT NCubeVertexBuffer::GetDeclaration(INT i)
802
// if(i < (INT)_DeclarationsArray.size())
804
// return _DeclarationsArray[i];
806
// VERTEXELEMENT decl = DECL_END;