mirror of
https://github.com/leozide/leocad
synced 2024-11-17 07:47:55 +01:00
150 lines
2.9 KiB
C++
150 lines
2.9 KiB
C++
#ifndef _LC_MESH_H_
|
|
#define _LC_MESH_H_
|
|
|
|
#include <stdlib.h>
|
|
#include "opengl.h"
|
|
#include "algebra.h"
|
|
|
|
class lcVertexBuffer
|
|
{
|
|
public:
|
|
lcVertexBuffer()
|
|
{
|
|
mData = NULL;
|
|
mSize = 0;
|
|
mBuffer = 0;
|
|
}
|
|
|
|
~lcVertexBuffer()
|
|
{
|
|
if (mBuffer)
|
|
{
|
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
|
glDeleteBuffersARB(1, &mBuffer);
|
|
}
|
|
|
|
free(mData);
|
|
}
|
|
|
|
void SetSize(int Size)
|
|
{
|
|
free(mData);
|
|
mData = malloc(Size);
|
|
mSize = Size;
|
|
}
|
|
|
|
void UpdateBuffer()
|
|
{
|
|
if (!GL_HasVertexBufferObject())
|
|
return;
|
|
|
|
if (!mBuffer)
|
|
glGenBuffersARB(1, &mBuffer);
|
|
|
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, mBuffer);
|
|
glBufferDataARB(GL_ARRAY_BUFFER_ARB, mSize, mData, GL_STATIC_DRAW_ARB);
|
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
|
}
|
|
|
|
void* mData;
|
|
int mSize;
|
|
GLuint mBuffer;
|
|
};
|
|
|
|
class lcIndexBuffer
|
|
{
|
|
public:
|
|
lcIndexBuffer()
|
|
{
|
|
mData = NULL;
|
|
mSize = 0;
|
|
mBuffer = 0;
|
|
}
|
|
|
|
~lcIndexBuffer()
|
|
{
|
|
if (mBuffer)
|
|
{
|
|
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
|
glDeleteBuffersARB(1, &mBuffer);
|
|
}
|
|
|
|
free(mData);
|
|
}
|
|
|
|
void SetSize(int Size)
|
|
{
|
|
free(mData);
|
|
mData = malloc(Size);
|
|
mSize = Size;
|
|
}
|
|
|
|
void UpdateBuffer()
|
|
{
|
|
if (!GL_HasVertexBufferObject())
|
|
return;
|
|
|
|
if (!mBuffer)
|
|
glGenBuffersARB(1, &mBuffer);
|
|
|
|
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mBuffer);
|
|
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mSize, mData, GL_STATIC_DRAW_ARB);
|
|
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
|
}
|
|
|
|
void* mData;
|
|
int mSize;
|
|
GLuint mBuffer;
|
|
};
|
|
|
|
struct lcMeshSection
|
|
{
|
|
int ColorIndex;
|
|
int IndexOffset;
|
|
int NumIndices;
|
|
int PrimitiveType;
|
|
// BoundingBox Box;
|
|
};
|
|
|
|
class lcMesh
|
|
{
|
|
public:
|
|
lcMesh();
|
|
~lcMesh();
|
|
|
|
void Create(int NumSections, int NumVertices, int NumIndices);
|
|
void CreateBox();
|
|
void Render(int ColorIdx, bool Selected, bool Focused);
|
|
|
|
template<typename IndexType>
|
|
void ExportPOVRay(lcFile& File, const char* MeshName, const char* ColorTable);
|
|
void ExportPOVRay(lcFile& File, const char* MeshName, const char* ColorTable);
|
|
|
|
template<typename IndexType>
|
|
void ExportWavefrontIndices(lcFile& File, int DefaultColorIndex, int VertexOffset);
|
|
void ExportWavefrontIndices(lcFile& File, int DefaultColorIndex, int VertexOffset);
|
|
|
|
template<typename IndexType>
|
|
bool MinIntersectDist(const Vector3& Start, const Vector3& End, float& MinDist, Vector3& Intersection);
|
|
bool MinIntersectDist(const Vector3& Start, const Vector3& End, float& MinDist, Vector3& Intersection);
|
|
|
|
template<typename IndexType>
|
|
bool IntersectsPlanes(const Vector4* Planes, int NumPlanes);
|
|
bool IntersectsPlanes(const Vector4* Planes, int NumPlanes);
|
|
|
|
void UpdateBuffers()
|
|
{
|
|
mVertexBuffer.UpdateBuffer();
|
|
mIndexBuffer.UpdateBuffer();
|
|
}
|
|
|
|
lcMeshSection* mSections;
|
|
int mNumSections;
|
|
|
|
lcVertexBuffer mVertexBuffer;
|
|
lcIndexBuffer mIndexBuffer;
|
|
int mNumVertices;
|
|
int mIndexType;
|
|
};
|
|
|
|
#endif // _LC_MESH_H_
|