Added NzBuffer::SetStorage
Fixed (Index/Vertex)Buffer::(Fill/Map) not filling/mapping the entire buffer when the third argument was zero Fixed Renderer not accepting sequential index buffer
This commit is contained in:
@@ -52,14 +52,14 @@ namespace
|
||||
|
||||
if (access == nzBufferAccess_DiscardAndWrite)
|
||||
{
|
||||
GLint size;
|
||||
glGetBufferParameteriv(bufferTargetBinding[type], GL_BUFFER_SIZE, &size);
|
||||
GLint bufferSize;
|
||||
glGetBufferParameteriv(bufferTargetBinding[type], GL_BUFFER_SIZE, &bufferSize);
|
||||
|
||||
GLint usage;
|
||||
glGetBufferParameteriv(bufferTargetBinding[type], GL_BUFFER_USAGE, &usage);
|
||||
GLint bufferUsage;
|
||||
glGetBufferParameteriv(bufferTargetBinding[type], GL_BUFFER_USAGE, &bufferUsage);
|
||||
|
||||
// On discard le buffer
|
||||
glBufferData(bufferTargetBinding[type], size, nullptr, usage);
|
||||
glBufferData(bufferTargetBinding[type], bufferSize, nullptr, bufferUsage);
|
||||
}
|
||||
|
||||
void* ptr = glMapBuffer(bufferTarget[type], bufferLock[access]);
|
||||
@@ -154,8 +154,8 @@ bool NzHardwareBuffer::Fill(const void* data, unsigned int offset, unsigned int
|
||||
if (size < 32*1024)
|
||||
{
|
||||
// http://www.opengl.org/wiki/Vertex_Specification_Best_Practices
|
||||
if (size == m_parent->GetLength())
|
||||
glBufferData(bufferTarget[m_type], m_parent->GetSize(), nullptr, bufferUsage[m_parent->GetStorage()]); // Discard
|
||||
if (size == m_parent->GetSize())
|
||||
glBufferData(bufferTarget[m_type], m_parent->GetSize(), nullptr, bufferUsage[m_parent->GetUsage()]); // Discard
|
||||
|
||||
glBufferSubData(bufferTarget[m_type], offset, size, data);
|
||||
}
|
||||
@@ -198,7 +198,7 @@ bool NzHardwareBuffer::IsHardware() const
|
||||
return true;
|
||||
}
|
||||
|
||||
void* NzHardwareBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned int length)
|
||||
void* NzHardwareBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned int size)
|
||||
{
|
||||
NzContext::EnsureContext();
|
||||
|
||||
@@ -209,7 +209,7 @@ void* NzHardwareBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned
|
||||
if (previous != m_buffer)
|
||||
glBindBuffer(bufferTarget[m_type], m_buffer);
|
||||
|
||||
void* ptr = mapBuffer(m_type, access, offset, length);
|
||||
void* ptr = mapBuffer(m_type, access, offset, size);
|
||||
|
||||
// Inutile de rebinder s'il n'y avait aucun buffer (Optimise les opérrations chaînées)
|
||||
if (previous != m_buffer && previous != 0)
|
||||
|
||||
@@ -22,13 +22,13 @@ class NzHardwareBuffer : public NzBufferImpl
|
||||
bool Create(unsigned int size, nzBufferUsage usage = nzBufferUsage_Static);
|
||||
void Destroy();
|
||||
|
||||
bool Fill(const void* data, unsigned int offset, unsigned int length);
|
||||
bool Fill(const void* data, unsigned int offset, unsigned int size);
|
||||
|
||||
void* GetPointer();
|
||||
|
||||
bool IsHardware() const;
|
||||
|
||||
void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0);
|
||||
void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0);
|
||||
bool Unmap();
|
||||
|
||||
private:
|
||||
|
||||
@@ -203,29 +203,34 @@ void NzRenderer::DrawIndexedPrimitives(nzPrimitiveType primitive, unsigned int f
|
||||
return;
|
||||
}
|
||||
|
||||
nzUInt8 indexSize = m_indexBuffer->GetIndexSize();
|
||||
|
||||
GLenum type;
|
||||
switch (indexSize)
|
||||
if (m_indexBuffer->IsSequential())
|
||||
glDrawArrays(openglPrimitive[primitive], m_indexBuffer->GetStartIndex(), m_indexBuffer->GetIndexCount());
|
||||
else
|
||||
{
|
||||
case 1:
|
||||
type = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
nzUInt8 indexSize = m_indexBuffer->GetIndexSize();
|
||||
|
||||
case 2:
|
||||
type = GL_UNSIGNED_SHORT;
|
||||
break;
|
||||
GLenum type;
|
||||
switch (indexSize)
|
||||
{
|
||||
case 1:
|
||||
type = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
type = GL_UNSIGNED_INT;
|
||||
break;
|
||||
case 2:
|
||||
type = GL_UNSIGNED_SHORT;
|
||||
break;
|
||||
|
||||
default:
|
||||
NazaraError("Invalid index size (" + NzString::Number(indexSize) + ')');
|
||||
return;
|
||||
case 4:
|
||||
type = GL_UNSIGNED_INT;
|
||||
break;
|
||||
|
||||
default:
|
||||
NazaraError("Invalid index size (" + NzString::Number(indexSize) + ')');
|
||||
return;
|
||||
}
|
||||
|
||||
glDrawElements(openglPrimitive[primitive], indexCount, type, reinterpret_cast<const nzUInt8*>(m_indexBuffer->GetPointer()) + firstIndex*indexSize);
|
||||
}
|
||||
|
||||
glDrawElements(openglPrimitive[primitive], indexCount, type, reinterpret_cast<const nzUInt8*>(m_indexBuffer->GetPointer()) + firstIndex*indexSize);
|
||||
}
|
||||
|
||||
void NzRenderer::DrawPrimitives(nzPrimitiveType primitive, unsigned int firstVertex, unsigned int vertexCount)
|
||||
@@ -507,7 +512,7 @@ void NzRenderer::SetFaceFilling(nzFaceFilling fillingMode)
|
||||
bool NzRenderer::SetIndexBuffer(const NzIndexBuffer* indexBuffer)
|
||||
{
|
||||
#if NAZARA_RENDERER_SAFE
|
||||
if (indexBuffer && !indexBuffer->IsHardware())
|
||||
if (indexBuffer && !indexBuffer->IsHardware() && !indexBuffer->IsSequential())
|
||||
{
|
||||
NazaraError("Buffer must be hardware");
|
||||
return false;
|
||||
@@ -551,8 +556,6 @@ bool NzRenderer::SetShader(NzShader* shader)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_shader = nullptr;
|
||||
|
||||
m_shader = shader;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user