|
@@ -69,7 +69,7 @@ Mesh::Mesh(const std::vector<AttribFormat> &vertexformat, const void *data, size
|
|
, ibo(nullptr)
|
|
, ibo(nullptr)
|
|
, useIndexBuffer(false)
|
|
, useIndexBuffer(false)
|
|
, elementCount(0)
|
|
, elementCount(0)
|
|
- , elementDataType(0)
|
|
|
|
|
|
+ , elementDataType(INDEX_UINT16)
|
|
, drawMode(drawmode)
|
|
, drawMode(drawmode)
|
|
, rangeStart(-1)
|
|
, rangeStart(-1)
|
|
, rangeCount(-1)
|
|
, rangeCount(-1)
|
|
@@ -78,7 +78,7 @@ Mesh::Mesh(const std::vector<AttribFormat> &vertexformat, const void *data, size
|
|
calculateAttributeSizes();
|
|
calculateAttributeSizes();
|
|
|
|
|
|
vertexCount = datasize / vertexStride;
|
|
vertexCount = datasize / vertexStride;
|
|
- elementDataType = getGLDataTypeFromMax(vertexCount);
|
|
|
|
|
|
+ elementDataType = getIndexTypeFromMax(vertexCount);
|
|
|
|
|
|
if (vertexCount == 0)
|
|
if (vertexCount == 0)
|
|
throw love::Exception("Data size is too small for specified vertex attribute formats.");
|
|
throw love::Exception("Data size is too small for specified vertex attribute formats.");
|
|
@@ -96,7 +96,7 @@ Mesh::Mesh(const std::vector<AttribFormat> &vertexformat, int vertexcount, DrawM
|
|
, ibo(nullptr)
|
|
, ibo(nullptr)
|
|
, useIndexBuffer(false)
|
|
, useIndexBuffer(false)
|
|
, elementCount(0)
|
|
, elementCount(0)
|
|
- , elementDataType(getGLDataTypeFromMax(vertexcount))
|
|
|
|
|
|
+ , elementDataType(getIndexTypeFromMax(vertexcount))
|
|
, drawMode(drawmode)
|
|
, drawMode(drawmode)
|
|
, rangeStart(-1)
|
|
, rangeStart(-1)
|
|
, rangeCount(-1)
|
|
, rangeCount(-1)
|
|
@@ -406,10 +406,10 @@ void Mesh::setVertexMap(const std::vector<uint32> &map)
|
|
{
|
|
{
|
|
size_t maxval = getVertexCount();
|
|
size_t maxval = getVertexCount();
|
|
|
|
|
|
- GLenum datatype = getGLDataTypeFromMax(maxval);
|
|
|
|
|
|
+ IndexDataType datatype = getIndexTypeFromMax(maxval);
|
|
|
|
|
|
// Calculate the size in bytes of the index buffer data.
|
|
// Calculate the size in bytes of the index buffer data.
|
|
- size_t size = map.size() * getGLDataTypeSize(datatype);
|
|
|
|
|
|
+ size_t size = map.size() * vertex::getIndexDataSize(datatype);
|
|
|
|
|
|
if (ibo && size > ibo->getSize())
|
|
if (ibo && size > ibo->getSize())
|
|
{
|
|
{
|
|
@@ -431,10 +431,10 @@ void Mesh::setVertexMap(const std::vector<uint32> &map)
|
|
// Fill the buffer with the index values from the vector.
|
|
// Fill the buffer with the index values from the vector.
|
|
switch (datatype)
|
|
switch (datatype)
|
|
{
|
|
{
|
|
- case GL_UNSIGNED_SHORT:
|
|
|
|
|
|
+ case INDEX_UINT16:
|
|
copyToIndexBuffer<uint16>(map, ibomap, maxval);
|
|
copyToIndexBuffer<uint16>(map, ibomap, maxval);
|
|
break;
|
|
break;
|
|
- case GL_UNSIGNED_INT:
|
|
|
|
|
|
+ case INDEX_UINT32:
|
|
default:
|
|
default:
|
|
copyToIndexBuffer<uint32>(map, ibomap, maxval);
|
|
copyToIndexBuffer<uint32>(map, ibomap, maxval);
|
|
break;
|
|
break;
|
|
@@ -443,6 +443,29 @@ void Mesh::setVertexMap(const std::vector<uint32> &map)
|
|
elementDataType = datatype;
|
|
elementDataType = datatype;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void Mesh::setVertexMap(IndexDataType datatype, const void *data, size_t datasize)
|
|
|
|
+{
|
|
|
|
+ if (ibo && datasize > ibo->getSize())
|
|
|
|
+ {
|
|
|
|
+ delete ibo;
|
|
|
|
+ ibo = nullptr;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!ibo && datasize > 0)
|
|
|
|
+ ibo = new GLBuffer(datasize, nullptr, BUFFER_INDEX, vbo->getUsage());
|
|
|
|
+
|
|
|
|
+ elementCount = datasize / vertex::getIndexDataSize(datatype);
|
|
|
|
+
|
|
|
|
+ if (!ibo || elementCount == 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ GLBuffer::Mapper ibomap(*ibo);
|
|
|
|
+ memcpy(ibomap.get(), data, datasize);
|
|
|
|
+
|
|
|
|
+ useIndexBuffer = true;
|
|
|
|
+ elementDataType = datatype;
|
|
|
|
+}
|
|
|
|
+
|
|
void Mesh::setVertexMap()
|
|
void Mesh::setVertexMap()
|
|
{
|
|
{
|
|
useIndexBuffer = false;
|
|
useIndexBuffer = false;
|
|
@@ -476,10 +499,10 @@ bool Mesh::getVertexMap(std::vector<uint32> &map) const
|
|
// Fill the vector from the buffer.
|
|
// Fill the vector from the buffer.
|
|
switch (elementDataType)
|
|
switch (elementDataType)
|
|
{
|
|
{
|
|
- case GL_UNSIGNED_SHORT:
|
|
|
|
|
|
+ case INDEX_UINT16:
|
|
copyFromIndexBuffer<uint16>(buffer, elementCount, map);
|
|
copyFromIndexBuffer<uint16>(buffer, elementCount, map);
|
|
break;
|
|
break;
|
|
- case GL_UNSIGNED_INT:
|
|
|
|
|
|
+ case INDEX_UINT32:
|
|
default:
|
|
default:
|
|
copyFromIndexBuffer<uint32>(buffer, elementCount, map);
|
|
copyFromIndexBuffer<uint32>(buffer, elementCount, map);
|
|
break;
|
|
break;
|
|
@@ -626,8 +649,9 @@ void Mesh::draw(Graphics *gfx, const Matrix4 &m)
|
|
|
|
|
|
count = std::min(count, (int) elementCount - start);
|
|
count = std::min(count, (int) elementCount - start);
|
|
|
|
|
|
- GLenum type = elementDataType;
|
|
|
|
- const void *indices = ibo->getPointer(start * getGLDataTypeSize(type));
|
|
|
|
|
|
+ size_t elementsize = vertex::getIndexDataSize(elementDataType);
|
|
|
|
+ const void *indices = ibo->getPointer(start * elementsize);
|
|
|
|
+ GLenum type = OpenGL::getGLIndexDataType(elementDataType);
|
|
|
|
|
|
if (count > 0)
|
|
if (count > 0)
|
|
gl.drawElements(getGLDrawMode(drawMode), count, type, indices);
|
|
gl.drawElements(getGLDrawMode(drawMode), count, type, indices);
|
|
@@ -690,27 +714,12 @@ GLenum Mesh::getGLDataType(DataType type)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-GLenum Mesh::getGLDataTypeFromMax(size_t maxvalue)
|
|
|
|
|
|
+IndexDataType Mesh::getIndexTypeFromMax(size_t maxvalue)
|
|
{
|
|
{
|
|
if (maxvalue > LOVE_UINT16_MAX)
|
|
if (maxvalue > LOVE_UINT16_MAX)
|
|
- return GL_UNSIGNED_INT;
|
|
|
|
|
|
+ return INDEX_UINT32;
|
|
else
|
|
else
|
|
- return GL_UNSIGNED_SHORT;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-size_t Mesh::getGLDataTypeSize(GLenum datatype)
|
|
|
|
-{
|
|
|
|
- switch (datatype)
|
|
|
|
- {
|
|
|
|
- case GL_UNSIGNED_BYTE:
|
|
|
|
- return sizeof(uint8);
|
|
|
|
- case GL_UNSIGNED_SHORT:
|
|
|
|
- return sizeof(uint16);
|
|
|
|
- case GL_UNSIGNED_INT:
|
|
|
|
- return sizeof(uint32);
|
|
|
|
- default:
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
|
|
+ return INDEX_UINT16;
|
|
}
|
|
}
|
|
|
|
|
|
bool Mesh::getConstant(const char *in, Mesh::DrawMode &out)
|
|
bool Mesh::getConstant(const char *in, Mesh::DrawMode &out)
|