/*
* Copyright 2010 Inalogic® Inc.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License, as
* published by the Free Software Foundation; either version 2.1 or 3.0
* of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License along with this program. If not, see
*
* Authored by: Jay Taoko
*
*/
#ifndef GLVERTEXRESOURCEMANAGER_H
#define GLVERTEXRESOURCEMANAGER_H
#include "GLResourceManager.h"
#include "IOpenGLVertexBuffer.h"
#include "IOpenGLIndexBuffer.h"
#include "IOpenGLVertexDeclaration.h"
#include "MeshData.h"
namespace nux
{
class VertexBuffer: public ResourceData
{
NUX_DECLARE_OBJECT_TYPE (VertexBuffer, ResourceData);
public:
VertexBuffer();
virtual ~VertexBuffer();
VertexBuffer (int Size, int Stride);
//! Copy constructor
VertexBuffer (const VertexBuffer &);
//! Assignment constructor
VertexBuffer &operator = (const VertexBuffer &);
//! Allocate space for a "num_element", each of size "size".
/*!
@param num_element Number of elements.
@param size Number of byte for every element.
*/
void Allocate(int num_index, int size);
int GetSize() const;
int GetStride() const;
int GetNumElement() const;
const void* GetPtrRawData() const;
void* GetPtrRawData();
public:
std::vector _Data;
int _Stride;
};
class IndexBuffer: public ResourceData
{
NUX_DECLARE_OBJECT_TYPE (IndexBuffer, ResourceData);
// IndexBuffer is very similar to MeshBuffer except that vertex indices
// are not inter-mixed with other vertex data. So the Stride here should be 2 bytes or 4 bytes.
public:
IndexBuffer();
virtual ~IndexBuffer();
IndexBuffer (int Size, int Stride);
//! Copy constructor
IndexBuffer (const IndexBuffer &);
//! Assignment constructor
IndexBuffer &operator = (const IndexBuffer &);
void Allocate (int Size, int Stride);
int GetSize() const;
int GetStride() const;
int GetNumIndex() const;
const void* GetPtrRawData() const;
void* GetPtrRawData();
public:
std::vector _Data;
int _Stride;
int _num_index;
};
class VertexDeclaration: public ResourceData
{
NUX_DECLARE_OBJECT_TYPE (NVertexDeclaration, ResourceData);
public:
VertexDeclaration();
~VertexDeclaration();
void AddVertexComponent(VERTEXELEMENT);
std::vector _declaration;
};
class CachedVertexBuffer: public CachedResourceData
{
NUX_DECLARE_OBJECT_TYPE(CachedVertexBuffer, CachedResourceData);
public:
CachedVertexBuffer(NResourceSet* ResourceManager, VertexBuffer* resource);
~CachedVertexBuffer();
ObjectPtr _vertex_buffer;
bool UpdateResource(ResourceData* Resource);
int GetElementSize() const;
int GetBufferStride() const;
private:
void LoadVertexData(VertexBuffer* vertex_buffer);
int _Size;
int _Stride;
};
class CachedIndexBuffer: public CachedResourceData
{
NUX_DECLARE_OBJECT_TYPE(CachedIndexBuffer, CachedResourceData);
public:
CachedIndexBuffer(NResourceSet* ResourceManager, IndexBuffer* resource);
~CachedIndexBuffer();
ObjectPtr _index_buffer;
bool UpdateResource(ResourceData* Resource);
int GetElementSize() const;
int GetBufferStride() const;
int GetNumIndex() const;
private:
void LoadIndexData(IndexBuffer* index_buffer);
int _Size;
int _Stride;
int _num_index;
};
class CachedVertexDeclaration: public CachedResourceData
{
NUX_DECLARE_OBJECT_TYPE(CachedVertexDeclaration, CachedResourceData);
public:
CachedVertexDeclaration(NResourceSet* ResourceManager, VertexDeclaration* Resource);
~CachedVertexDeclaration();
bool UpdateResource(ResourceData* Resource);
ObjectPtr _declaration;
};
// class NMeshComponent
// {
// public:
// NMeshComponent();
// NMeshComponent (const NMeshComponent &);
// NMeshComponent (int StreamIndex/*ObjectPtr VtxBuffer*/, int Offset, ATTRIB_DECL_TYPE Type);
//
// NMeshComponent &operator = (const NMeshComponent &);
//
// virtual ~NMeshComponent();
//
// int GetStreamIndex() const;
// // int GetStride();
// int GetOffset();
// private:
// ATTRIB_DECL_TYPE _Type;
// int _StreamIndex;
// int _Offset;
// };
//
// class NMesh: public ResourceData
// {
// NUX_DECLARE_OBJECT_TYPE (NStaticMesh, ResourceData);
//
// NMesh();
// virtual ~NMesh();
// };
//
// class NStaticMesh: public NMesh
// {
// NUX_DECLARE_OBJECT_TYPE (NStaticMesh, NMesh);
// public:
// NStaticMesh(NMeshObject *Object);
// ~NStaticMesh();
//
// int GetNumStreams() const;
//
// std::vector m_pVertexStreamArray; // up to 8 stream of buffers on most GPU
// NIndexBuffer *m_pIndex;
// NVertexDeclaration *m_pVertexDeclaration;
// };
//
// class NGLStaticMesh: public CachedResourceData
// {
// NUX_DECLARE_OBJECT_TYPE(NGLStaticMesh, CachedResourceData);
// public:
// NGLStaticMesh(NResourceSet *ResourceManager, NStaticMesh *);
// ~NGLStaticMesh();
// bool UpdateResource(ResourceData *Resource);
//
// std::vector > m_VertexBufferArray;
// ObjectPtr m_Index;
// ObjectPtr m_VertexDeclaration;
// };
class CachedMeshBuffer;
class MeshBuffer: public ResourceData
{
NUX_DECLARE_OBJECT_TYPE(MeshBuffer, ResourceData);
public:
MeshBuffer(NUX_FILE_LINE_PROTO);
virtual ~MeshBuffer();
bool Update(const MeshData* mesh_data);
//ObjectPtr GetCachedMeshBuffer();
public:
VertexBuffer *_vertex_buffer;
IndexBuffer *_index_buffer;
VertexDeclaration *_vertex_declaration;
NuxMeshPrimitiveType _mesh_primitive_type;
};
class CachedMeshBuffer: public CachedResourceData
{
NUX_DECLARE_OBJECT_TYPE(CachedMeshBuffer, CachedResourceData);
public:
ObjectPtr _cached_vertex_buffer;
ObjectPtr _cached_vertex_declaration;
ObjectPtr _cached_index_buffer;
NuxMeshPrimitiveType _mesh_primitive_type;
CachedMeshBuffer(NResourceSet* ResourceManager, MeshBuffer* resource);
~CachedMeshBuffer();
bool UpdateResource(ResourceData* Resource);
};
}
#endif // GLVERTEXRESOURCEMANAGER_H