diff --git a/src/Magnum/Buffer.h b/src/Magnum/Buffer.h index cba405540..f805ed620 100644 --- a/src/Magnum/Buffer.h +++ b/src/Magnum/Buffer.h @@ -154,7 +154,7 @@ Then you can map the buffer to client memory and operate with the memory directly. After you are done with the operation, call @ref unmap() to unmap the buffer again. @code -Vector3* data = static_cast(buffer.map(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::InvalidateBuffer)); +Vector3* data = buffer.map(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::InvalidateBuffer); for(std::size_t i = 0; i != 200; ++i) data[i] = ...; CORRADE_INTERNAL_ASSERT_OUTPUT(buffer.unmap()); @@ -163,7 +163,7 @@ If you are updating only a few discrete portions of the buffer, you can use @ref MapFlag::FlushExplicit and @ref flushMappedRange() to reduce number of memory operations performed by OpenGL on unmapping. Example: @code -Vector3* data = static_cast(buffer.map(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit)); +Vector3* data = buffer.map(0, 200*sizeof(Vector3), Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit); for(std::size_t i: {7, 27, 56, 128}) { data[i] = ...; buffer.flushMappedRange(i*sizeof(Vector3), sizeof(Vector3)); @@ -1075,6 +1075,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { */ void* map(MapAccess access); + /** @overload */ + template T* map(MapAccess access) { + return static_cast(map(access)); + } + #if defined(MAGNUM_TARGET_GLES2) || defined(DOXYGEN_GENERATING_OUTPUT) /** * @brief Map portion of buffer to client memory @@ -1095,6 +1100,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * instead, as it has more complete set of features. */ void* mapSub(GLintptr offset, GLsizeiptr length, MapAccess access); + + /** @overload */ + template T* mapSub(GLintptr offset, GLsizeiptr length, MapAccess access) { + return static_cast(mapSub(offset, length, access)); + } #endif /** @@ -1120,6 +1130,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { */ void* map(GLintptr offset, GLsizeiptr length, MapFlags flags); + /** @overload */ + template T* map(GLintptr offset, GLsizeiptr length, MapFlags flags) { + return static_cast(map(offset, length, flags)); + } + /** * @brief Flush mapped range * @param offset Offset relative to start of mapped range diff --git a/src/Magnum/Test/BufferGLTest.cpp b/src/Magnum/Test/BufferGLTest.cpp index 07d4f944d..7b7d9a8e2 100644 --- a/src/Magnum/Test/BufferGLTest.cpp +++ b/src/Magnum/Test/BufferGLTest.cpp @@ -265,9 +265,9 @@ void BufferGLTest::map() { buffer.setData(data, BufferUsage::StaticDraw); #ifndef MAGNUM_TARGET_GLES - char* contents = reinterpret_cast(buffer.map(Buffer::MapAccess::ReadWrite)); + char* contents = buffer.map(Buffer::MapAccess::ReadWrite); #else - char* contents = reinterpret_cast(buffer.map(Buffer::MapAccess::WriteOnly)); + char* contents = buffer.map(Buffer::MapAccess::WriteOnly); #endif MAGNUM_VERIFY_NO_ERROR(); @@ -324,7 +324,7 @@ void BufferGLTest::mapRange() { Buffer buffer; buffer.setData(data, BufferUsage::StaticDraw); - char* contents = reinterpret_cast(buffer.map(1, 4, Buffer::MapFlag::Read|Buffer::MapFlag::Write)); + char* contents = buffer.map(1, 4, Buffer::MapFlag::Read|Buffer::MapFlag::Write); MAGNUM_VERIFY_NO_ERROR(); CORRADE_VERIFY(contents); @@ -356,7 +356,7 @@ void BufferGLTest::mapRangeExplicitFlush() { buffer.setData(data, BufferUsage::StaticDraw); /* Map, set byte, don't flush and unmap */ - char* contents = reinterpret_cast(buffer.map(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit)); + char* contents = buffer.map(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit); CORRADE_VERIFY(contents); contents[2] = 99; CORRADE_VERIFY(buffer.unmap()); @@ -365,7 +365,7 @@ void BufferGLTest::mapRangeExplicitFlush() { /* Unflushed range _might_ not be changed, thus nothing to test */ /* Map, set byte, flush and unmap */ - contents = reinterpret_cast(buffer.map(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit)); + contents = buffer.map(1, 4, Buffer::MapFlag::Write|Buffer::MapFlag::FlushExplicit); CORRADE_VERIFY(contents); contents[3] = 107; buffer.flushMappedRange(3, 1); diff --git a/src/Magnum/Test/TransformFeedbackGLTest.cpp b/src/Magnum/Test/TransformFeedbackGLTest.cpp index 202af4b47..d52096553 100644 --- a/src/Magnum/Test/TransformFeedbackGLTest.cpp +++ b/src/Magnum/Test/TransformFeedbackGLTest.cpp @@ -185,7 +185,7 @@ void TransformFeedbackGLTest::attachBase() { MAGNUM_VERIFY_NO_ERROR(); - Vector2* data = reinterpret_cast(output.map(0, 2*sizeof(Vector2), Buffer::MapFlag::Read)); + Vector2* data = output.map(0, 2*sizeof(Vector2), Buffer::MapFlag::Read); CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f)); CORRADE_COMPARE(data[1], Vector2(0.0f, 0.0f)); output.unmap(); @@ -216,7 +216,7 @@ void TransformFeedbackGLTest::attachRange() { MAGNUM_VERIFY_NO_ERROR(); - Vector2* data = reinterpret_cast(output.map(256, 2*sizeof(Vector2), Buffer::MapFlag::Read)); + Vector2* data = output.map(256, 2*sizeof(Vector2), Buffer::MapFlag::Read); CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f)); CORRADE_COMPARE(data[1], Vector2(0.0f, 0.0f)); output.unmap(); @@ -285,12 +285,12 @@ void TransformFeedbackGLTest::attachBases() { MAGNUM_VERIFY_NO_ERROR(); - Vector2* data1 = reinterpret_cast(output1.map(0, 2*sizeof(Vector2), Buffer::MapFlag::Read)); + Vector2* data1 = output1.map(0, 2*sizeof(Vector2), Buffer::MapFlag::Read); CORRADE_COMPARE(data1[0], Vector2(1.0f, -1.0f)); CORRADE_COMPARE(data1[1], Vector2(0.0f, 0.0f)); output1.unmap(); - Float* data2 = reinterpret_cast(output2.map(0, 2*sizeof(Float), Buffer::MapFlag::Read)); + Float* data2 = output2.map(0, 2*sizeof(Float), Buffer::MapFlag::Read); CORRADE_COMPARE(data2[0], 0.0f); CORRADE_COMPARE(data2[1], -2.0f); output2.unmap(); @@ -325,12 +325,12 @@ void TransformFeedbackGLTest::attachRanges() { MAGNUM_VERIFY_NO_ERROR(); - Vector2* data1 = reinterpret_cast(output1.map(256, 2*sizeof(Vector2), Buffer::MapFlag::Read)); + Vector2* data1 = output1.map(256, 2*sizeof(Vector2), Buffer::MapFlag::Read); CORRADE_COMPARE(data1[0], Vector2(1.0f, -1.0f)); CORRADE_COMPARE(data1[1], Vector2(0.0f, 0.0f)); output1.unmap(); - Float* data2 = reinterpret_cast(output2.map(512, 2*sizeof(Float), Buffer::MapFlag::Read)); + Float* data2 = output2.map(512, 2*sizeof(Float), Buffer::MapFlag::Read); CORRADE_COMPARE(data2[0], 0.0f); CORRADE_COMPARE(data2[1], -2.0f); output2.unmap(); @@ -390,7 +390,7 @@ void TransformFeedbackGLTest::interleaved() { MAGNUM_VERIFY_NO_ERROR(); - Vector2* data = reinterpret_cast(output.map(0, 4*sizeof(Vector2), Buffer::MapFlag::Read)); + Vector2* data = output.map(0, 4*sizeof(Vector2), Buffer::MapFlag::Read); CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f)); CORRADE_COMPARE(data[1].y(), 5.0f); CORRADE_COMPARE(data[2], Vector2(0.0f, 0.0f));