Browse Source

VertexBuffer: unsigned to signed

1vanK 3 years ago
parent
commit
ac19ee070f

+ 1 - 1
Source/Urho3D/AngelScript/Generated_GlobalVariables.cpp

@@ -100,7 +100,7 @@ void ASRegisterGeneratedGlobalVariables(asIScriptEngine* engine)
     // static const unsigned DRAWABLE_ZONE | File: ../Graphics/Drawable.h
     engine->RegisterGlobalProperty("const uint DRAWABLE_ZONE", (void*)&DRAWABLE_ZONE);
 
-    // const u32 ELEMENT_TYPESIZES[] | File: ../GraphicsAPI/GraphicsDefs.h
+    // const i32 ELEMENT_TYPESIZES[] | File: ../GraphicsAPI/GraphicsDefs.h
     // Not registered because array
 
     // constexpr i32 ENDPOS | File: ../Container/Vector.h

+ 21 - 21
Source/Urho3D/AngelScript/Generated_Members.h

@@ -12393,8 +12393,8 @@ template <class T> CScriptArray* VertexBuffer_constspVectorlesVertexElementgream
     return VectorToArray(result, "Array<VertexElement>");
 }
 
-// bool VertexBuffer::SetSize(unsigned vertexCount, const Vector<VertexElement>& elements, bool dynamic = false)
-template <class T> bool VertexBuffer_bool_SetSize_unsigned_constspVectorlesVertexElementgreamp_bool_template(T* _ptr, unsigned vertexCount, CScriptArray* elements_conv, bool dynamic)
+// bool VertexBuffer::SetSize(i32 vertexCount, const Vector<VertexElement>& elements, bool dynamic = false)
+template <class T> bool VertexBuffer_bool_SetSize_i32_constspVectorlesVertexElementgreamp_bool_template(T* _ptr, i32 vertexCount, CScriptArray* elements_conv, bool dynamic)
 {
     Vector<VertexElement> elements = ArrayToVector<VertexElement>(elements_conv);
     bool result = _ptr->SetSize(vertexCount, elements, dynamic);
@@ -12424,11 +12424,11 @@ template <class T> CScriptArray* VertexBuffer_VectorlesVertexElementgre_GetEleme
     return VectorToArray(result, "Array<VertexElement>");
 }
 
-// static unsigned VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
-template <class T> unsigned VertexBuffer_unsigned_GetVertexSize_constspVectorlesVertexElementgreamp(CScriptArray* elements_conv)
+// static i32 VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
+template <class T> i32 VertexBuffer_i32_GetVertexSize_constspVectorlesVertexElementgreamp(CScriptArray* elements_conv)
 {
     Vector<VertexElement> elements = ArrayToVector<VertexElement>(elements_conv);
-    unsigned result = T::GetVertexSize(elements);
+    i32 result = T::GetVertexSize(elements);
     return result;
 }
 
@@ -12446,11 +12446,11 @@ template <class T> void RegisterMembers_VertexBuffer(asIScriptEngine* engine, co
     // Error: type "u8*" can not automatically bind
     // SharedArrayPtr<u8> VertexBuffer::GetShadowDataShared() const
     // Error: type "SharedArrayPtr<u8>" can not automatically bind
-    // void* VertexBuffer::Lock(unsigned start, unsigned count, bool discard = false)
+    // void* VertexBuffer::Lock(i32 start, i32 count, bool discard = false)
     // Error: type "void*" can not automatically bind
     // bool VertexBuffer::SetData(const void* data)
     // Error: type "const void*" can not automatically bind
-    // bool VertexBuffer::SetDataRange(const void* data, unsigned start, unsigned count, bool discard = false)
+    // bool VertexBuffer::SetDataRange(const void* data, i32 start, i32 count, bool discard = false)
     // Error: type "const void*" can not automatically bind
 
     // u64 VertexBuffer::GetBufferHash(i32 streamIndex)
@@ -12470,13 +12470,13 @@ template <class T> void RegisterMembers_VertexBuffer(asIScriptEngine* engine, co
     engine->RegisterObjectMethod(className, "Array<VertexElement>@ GetElements() const", AS_FUNCTION_OBJFIRST(VertexBuffer_constspVectorlesVertexElementgreamp_GetElements_void_template<VertexBuffer>), AS_CALL_CDECL_OBJFIRST);
     engine->RegisterObjectMethod(className, "Array<VertexElement>@ get_elements() const", AS_FUNCTION_OBJFIRST(VertexBuffer_constspVectorlesVertexElementgreamp_GetElements_void_template<VertexBuffer>), AS_CALL_CDECL_OBJFIRST);
 
-    // unsigned VertexBuffer::GetVertexCount() const
-    engine->RegisterObjectMethod(className, "uint GetVertexCount() const", AS_METHODPR(T, GetVertexCount, () const, unsigned), AS_CALL_THISCALL);
-    engine->RegisterObjectMethod(className, "uint get_vertexCount() const", AS_METHODPR(T, GetVertexCount, () const, unsigned), AS_CALL_THISCALL);
+    // i32 VertexBuffer::GetVertexCount() const
+    engine->RegisterObjectMethod(className, "int GetVertexCount() const", AS_METHODPR(T, GetVertexCount, () const, i32), AS_CALL_THISCALL);
+    engine->RegisterObjectMethod(className, "int get_vertexCount() const", AS_METHODPR(T, GetVertexCount, () const, i32), AS_CALL_THISCALL);
 
-    // unsigned VertexBuffer::GetVertexSize() const
-    engine->RegisterObjectMethod(className, "uint GetVertexSize() const", AS_METHODPR(T, GetVertexSize, () const, unsigned), AS_CALL_THISCALL);
-    engine->RegisterObjectMethod(className, "uint get_vertexSize() const", AS_METHODPR(T, GetVertexSize, () const, unsigned), AS_CALL_THISCALL);
+    // i32 VertexBuffer::GetVertexSize() const
+    engine->RegisterObjectMethod(className, "int GetVertexSize() const", AS_METHODPR(T, GetVertexSize, () const, i32), AS_CALL_THISCALL);
+    engine->RegisterObjectMethod(className, "int get_vertexSize() const", AS_METHODPR(T, GetVertexSize, () const, i32), AS_CALL_THISCALL);
 
     // bool VertexBuffer::HasElement(VertexElementSemantic semantic, i8 index = 0) const
     engine->RegisterObjectMethod(className, "bool HasElement(VertexElementSemantic, int8 = 0) const", AS_METHODPR(T, HasElement, (VertexElementSemantic, i8) const, bool), AS_CALL_THISCALL);
@@ -12499,11 +12499,11 @@ template <class T> void RegisterMembers_VertexBuffer(asIScriptEngine* engine, co
     engine->RegisterObjectMethod(className, "void SetShadowed(bool)", AS_METHODPR(T, SetShadowed, (bool), void), AS_CALL_THISCALL);
     engine->RegisterObjectMethod(className, "void set_shadowed(bool)", AS_METHODPR(T, SetShadowed, (bool), void), AS_CALL_THISCALL);
 
-    // bool VertexBuffer::SetSize(unsigned vertexCount, const Vector<VertexElement>& elements, bool dynamic = false)
-    engine->RegisterObjectMethod(className, "bool SetSize(uint, Array<VertexElement>@+, bool = false)", AS_FUNCTION_OBJFIRST(VertexBuffer_bool_SetSize_unsigned_constspVectorlesVertexElementgreamp_bool_template<VertexBuffer>), AS_CALL_CDECL_OBJFIRST);
+    // bool VertexBuffer::SetSize(i32 vertexCount, const Vector<VertexElement>& elements, bool dynamic = false)
+    engine->RegisterObjectMethod(className, "bool SetSize(int, Array<VertexElement>@+, bool = false)", AS_FUNCTION_OBJFIRST(VertexBuffer_bool_SetSize_i32_constspVectorlesVertexElementgreamp_bool_template<VertexBuffer>), AS_CALL_CDECL_OBJFIRST);
 
-    // bool VertexBuffer::SetSize(unsigned vertexCount, unsigned elementMask, bool dynamic = false)
-    engine->RegisterObjectMethod(className, "bool SetSize(uint, uint, bool = false)", AS_METHODPR(T, SetSize, (unsigned, unsigned, bool), bool), AS_CALL_THISCALL);
+    // bool VertexBuffer::SetSize(i32 vertexCount, unsigned elementMask, bool dynamic = false)
+    engine->RegisterObjectMethod(className, "bool SetSize(int, uint, bool = false)", AS_METHODPR(T, SetSize, (i32, unsigned, bool), bool), AS_CALL_THISCALL);
 
     // void VertexBuffer::Unlock()
     engine->RegisterObjectMethod(className, "void Unlock()", AS_METHODPR(T, Unlock, (), void), AS_CALL_THISCALL);
@@ -12522,11 +12522,11 @@ template <class T> void RegisterMembers_VertexBuffer(asIScriptEngine* engine, co
     // static Vector<VertexElement> VertexBuffer::GetElements(unsigned elementMask)
     engine->SetDefaultNamespace(className);engine->RegisterGlobalFunction("Array<VertexElement>@ GetElements(uint)", AS_FUNCTION(VertexBuffer_VectorlesVertexElementgre_GetElements_unsigned<VertexBuffer>), AS_CALL_CDECL);engine->SetDefaultNamespace("");
 
-    // static unsigned VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
-    engine->SetDefaultNamespace(className);engine->RegisterGlobalFunction("uint GetVertexSize(Array<VertexElement>@+)", AS_FUNCTION(VertexBuffer_unsigned_GetVertexSize_constspVectorlesVertexElementgreamp<VertexBuffer>), AS_CALL_CDECL);engine->SetDefaultNamespace("");
+    // static i32 VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
+    engine->SetDefaultNamespace(className);engine->RegisterGlobalFunction("int GetVertexSize(Array<VertexElement>@+)", AS_FUNCTION(VertexBuffer_i32_GetVertexSize_constspVectorlesVertexElementgreamp<VertexBuffer>), AS_CALL_CDECL);engine->SetDefaultNamespace("");
 
-    // static unsigned VertexBuffer::GetVertexSize(unsigned elementMask)
-    engine->SetDefaultNamespace(className);engine->RegisterGlobalFunction("uint GetVertexSize(uint)", AS_FUNCTIONPR(T::GetVertexSize, (unsigned), unsigned), AS_CALL_CDECL);engine->SetDefaultNamespace("");
+    // static i32 VertexBuffer::GetVertexSize(unsigned elementMask)
+    engine->SetDefaultNamespace(className);engine->RegisterGlobalFunction("int GetVertexSize(uint)", AS_FUNCTIONPR(T::GetVertexSize, (unsigned), i32), AS_CALL_CDECL);engine->SetDefaultNamespace("");
 
     #ifdef REGISTER_MEMBERS_MANUAL_PART_VertexBuffer
         REGISTER_MEMBERS_MANUAL_PART_VertexBuffer();

+ 4 - 0
Source/Urho3D/Base/PrimitiveTypes.h

@@ -26,3 +26,7 @@ typedef uint64_t u64;
 // Unicode code point (UTF-32 code unit)
 static_assert(sizeof(char32_t) == 4);
 typedef char32_t c32;
+
+// Pointer arithmetics
+static_assert(sizeof(void*) == sizeof(ptrdiff_t));
+static_assert(sizeof(void*) == sizeof(intptr_t));

+ 21 - 15
Source/Urho3D/GraphicsAPI/Direct3D11/D3D11VertexBuffer.cpp

@@ -29,7 +29,7 @@ void VertexBuffer::Release_D3D11()
 
     if (graphics_)
     {
-        for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i)
+        for (i32 i = 0; i < MAX_VERTEX_STREAMS; ++i)
         {
             if (graphics_->GetVertexBuffer(i) == this)
                 graphics_->SetVertexBuffer(nullptr);
@@ -54,7 +54,7 @@ bool VertexBuffer::SetData_D3D11(const void* data)
     }
 
     if (shadowData_ && data != shadowData_.Get())
-        memcpy(shadowData_.Get(), data, vertexCount_ * vertexSize_);
+        memcpy(shadowData_.Get(), data, (size_t)vertexCount_ * vertexSize_);
 
     if (object_.ptr_)
     {
@@ -63,7 +63,7 @@ bool VertexBuffer::SetData_D3D11(const void* data)
             void* hwData = MapBuffer_D3D11(0, vertexCount_, true);
             if (hwData)
             {
-                memcpy(hwData, data, vertexCount_ * vertexSize_);
+                memcpy(hwData, data, (size_t)vertexCount_ * vertexSize_);
                 UnmapBuffer_D3D11();
             }
             else
@@ -73,7 +73,7 @@ bool VertexBuffer::SetData_D3D11(const void* data)
         {
             D3D11_BOX destBox;
             destBox.left = 0;
-            destBox.right = vertexCount_ * vertexSize_;
+            destBox.right = (UINT)vertexCount_ * vertexSize_;
             destBox.top = 0;
             destBox.bottom = 1;
             destBox.front = 0;
@@ -86,8 +86,10 @@ bool VertexBuffer::SetData_D3D11(const void* data)
     return true;
 }
 
-bool VertexBuffer::SetDataRange_D3D11(const void* data, unsigned start, unsigned count, bool discard)
+bool VertexBuffer::SetDataRange_D3D11(const void* data, i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
+
     if (start == 0 && count == vertexCount_)
         return SetData_D3D11(data);
 
@@ -112,8 +114,9 @@ bool VertexBuffer::SetDataRange_D3D11(const void* data, unsigned start, unsigned
     if (!count)
         return true;
 
-    if (shadowData_ && shadowData_.Get() + start * vertexSize_ != data)
-        memcpy(shadowData_.Get() + start * vertexSize_, data, count * vertexSize_);
+    u8* dst = shadowData_.Get() + (intptr_t)start * vertexSize_;
+    if (shadowData_ && dst != data)
+        memcpy(dst, data, (size_t)count * vertexSize_);
 
     if (object_.ptr_)
     {
@@ -122,7 +125,7 @@ bool VertexBuffer::SetDataRange_D3D11(const void* data, unsigned start, unsigned
             void* hwData = MapBuffer_D3D11(start, count, discard);
             if (hwData)
             {
-                memcpy(hwData, data, count * vertexSize_);
+                memcpy(hwData, data, (size_t)count * vertexSize_);
                 UnmapBuffer_D3D11();
             }
             else
@@ -131,8 +134,8 @@ bool VertexBuffer::SetDataRange_D3D11(const void* data, unsigned start, unsigned
         else
         {
             D3D11_BOX destBox;
-            destBox.left = start * vertexSize_;
-            destBox.right = destBox.left + count * vertexSize_;
+            destBox.left = (UINT)start * vertexSize_;
+            destBox.right = destBox.left + (UINT)count * vertexSize_;
             destBox.top = 0;
             destBox.bottom = 1;
             destBox.front = 0;
@@ -145,8 +148,10 @@ bool VertexBuffer::SetDataRange_D3D11(const void* data, unsigned start, unsigned
     return true;
 }
 
-void* VertexBuffer::Lock_D3D11(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::Lock_D3D11(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
+
     if (lockState_ != LOCK_NONE)
     {
         URHO3D_LOGERROR("Vertex buffer already locked");
@@ -177,7 +182,7 @@ void* VertexBuffer::Lock_D3D11(unsigned start, unsigned count, bool discard)
     else if (shadowData_)
     {
         lockState_ = LOCK_SHADOW;
-        return shadowData_.Get() + start * vertexSize_;
+        return shadowData_.Get() + (intptr_t)start * vertexSize_;
     }
     else if (graphics_)
     {
@@ -198,7 +203,7 @@ void VertexBuffer::Unlock_D3D11()
         break;
 
     case LOCK_SHADOW:
-        SetDataRange_D3D11(shadowData_.Get() + lockStart_ * vertexSize_, lockStart_, lockCount_);
+        SetDataRange_D3D11(shadowData_.Get() + (intptr_t)lockStart_ * vertexSize_, lockStart_, lockCount_);
         lockState_ = LOCK_NONE;
         break;
 
@@ -228,7 +233,7 @@ bool VertexBuffer::Create_D3D11()
         bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
         bufferDesc.CPUAccessFlags = dynamic_ ? D3D11_CPU_ACCESS_WRITE : 0;
         bufferDesc.Usage = dynamic_ ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT;
-        bufferDesc.ByteWidth = (UINT)(vertexCount_ * vertexSize_);
+        bufferDesc.ByteWidth = (UINT)vertexCount_ * vertexSize_;
 
         HRESULT hr = graphics_->GetImpl_D3D11()->GetDevice()->CreateBuffer(&bufferDesc, nullptr, (ID3D11Buffer**)&object_.ptr_);
         if (FAILED(hr))
@@ -250,8 +255,9 @@ bool VertexBuffer::UpdateToGPU_D3D11()
         return false;
 }
 
-void* VertexBuffer::MapBuffer_D3D11(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::MapBuffer_D3D11(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
     void* hwData = nullptr;
 
     if (object_.ptr_)

+ 22 - 16
Source/Urho3D/GraphicsAPI/Direct3D9/D3D9VertexBuffer.cpp

@@ -40,7 +40,7 @@ void VertexBuffer::Release_D3D9()
 
     if (graphics_)
     {
-        for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i)
+        for (i32 i = 0; i < MAX_VERTEX_STREAMS; ++i)
         {
             if (graphics_->GetVertexBuffer(i) == this)
                 graphics_->SetVertexBuffer(nullptr);
@@ -65,7 +65,7 @@ bool VertexBuffer::SetData_D3D9(const void* data)
     }
 
     if (shadowData_ && data != shadowData_.Get())
-        memcpy(shadowData_.Get(), data, vertexCount_ * vertexSize_);
+        memcpy(shadowData_.Get(), data, (size_t)vertexCount_ * vertexSize_);
 
     if (object_.ptr_)
     {
@@ -79,7 +79,7 @@ bool VertexBuffer::SetData_D3D9(const void* data)
         void* hwData = MapBuffer_D3D9(0, vertexCount_, true);
         if (hwData)
         {
-            memcpy(hwData, data, vertexCount_ * vertexSize_);
+            memcpy(hwData, data, (size_t)vertexCount_ * vertexSize_);
             UnmapBuffer_D3D9();
         }
         else
@@ -90,8 +90,10 @@ bool VertexBuffer::SetData_D3D9(const void* data)
     return true;
 }
 
-bool VertexBuffer::SetDataRange_D3D9(const void* data, unsigned start, unsigned count, bool discard)
+bool VertexBuffer::SetDataRange_D3D9(const void* data, i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
+
     if (start == 0 && count == vertexCount_)
         return SetData_D3D9(data);
 
@@ -116,8 +118,9 @@ bool VertexBuffer::SetDataRange_D3D9(const void* data, unsigned start, unsigned
     if (!count)
         return true;
 
-    if (shadowData_ && shadowData_.Get() + start * vertexSize_ != data)
-        memcpy(shadowData_.Get() + start * vertexSize_, data, count * vertexSize_);
+    u8* dst = shadowData_.Get() + (intptr_t)start * vertexSize_;
+    if (shadowData_ && dst != data)
+        memcpy(dst, data, (size_t)count * vertexSize_);
 
     if (object_.ptr_)
     {
@@ -131,7 +134,7 @@ bool VertexBuffer::SetDataRange_D3D9(const void* data, unsigned start, unsigned
         void* hwData = MapBuffer_D3D9(start, count, discard);
         if (hwData)
         {
-            memcpy(hwData, data, count * vertexSize_);
+            memcpy(hwData, data, (size_t)count * vertexSize_);
             UnmapBuffer_D3D9();
         }
         else
@@ -141,8 +144,10 @@ bool VertexBuffer::SetDataRange_D3D9(const void* data, unsigned start, unsigned
     return true;
 }
 
-void* VertexBuffer::Lock_D3D9(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::Lock_D3D9(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
+
     if (lockState_ != LOCK_NONE)
     {
         URHO3D_LOGERROR("Vertex buffer already locked");
@@ -173,7 +178,7 @@ void* VertexBuffer::Lock_D3D9(unsigned start, unsigned count, bool discard)
     else if (shadowData_)
     {
         lockState_ = LOCK_SHADOW;
-        return shadowData_.Get() + start * vertexSize_;
+        return shadowData_.Get() + (intptr_t)start * vertexSize_;
     }
     else if (graphics_)
     {
@@ -194,7 +199,7 @@ void VertexBuffer::Unlock_D3D9()
         break;
 
     case LOCK_SHADOW:
-        SetDataRange_D3D9(shadowData_.Get() + lockStart_ * vertexSize_, lockStart_, lockCount_);
+        SetDataRange_D3D9(shadowData_.Get() + (intptr_t)lockStart_ * vertexSize_, lockStart_, lockCount_);
         lockState_ = LOCK_NONE;
         break;
 
@@ -225,15 +230,15 @@ bool VertexBuffer::Create_D3D9()
             return true;
         }
 
-        unsigned pool = dynamic_ ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED;
-        unsigned d3dUsage = dynamic_ ? D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY : 0;
+        D3DPOOL pool = dynamic_ ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED;
+        DWORD d3dUsage = dynamic_ ? D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY : 0;
 
         IDirect3DDevice9* device = graphics_->GetImpl_D3D9()->GetDevice();
         HRESULT hr = device->CreateVertexBuffer(
-            vertexCount_ * vertexSize_,
+            (UINT)vertexCount_ * vertexSize_,
             d3dUsage,
             0,
-            (D3DPOOL)pool,
+            pool,
             (IDirect3DVertexBuffer9**)&object_.ptr_,
             nullptr);
         if (FAILED(hr))
@@ -255,8 +260,9 @@ bool VertexBuffer::UpdateToGPU_D3D9()
         return false;
 }
 
-void* VertexBuffer::MapBuffer_D3D9(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::MapBuffer_D3D9(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
     void* hwData = nullptr;
 
     if (object_.ptr_)
@@ -266,7 +272,7 @@ void* VertexBuffer::MapBuffer_D3D9(unsigned start, unsigned count, bool discard)
         if (discard && dynamic_)
             flags = D3DLOCK_DISCARD;
 
-        HRESULT hr = ((IDirect3DVertexBuffer9*)object_.ptr_)->Lock(start * vertexSize_, count * vertexSize_, &hwData, flags);
+        HRESULT hr = ((IDirect3DVertexBuffer9*)object_.ptr_)->Lock((UINT)start * vertexSize_, (UINT)count * vertexSize_, &hwData, flags);
         if (FAILED(hr))
             URHO3D_LOGD3DERROR("Could not lock vertex buffer", hr);
         else

+ 1 - 1
Source/Urho3D/GraphicsAPI/GraphicsDefs.cpp

@@ -28,7 +28,7 @@ const VertexElement LEGACY_VERTEXELEMENTS[] =
     VertexElement(TYPE_INT, SEM_OBJECTINDEX, 0, false)       // Objectindex
 };
 
-const u32 ELEMENT_TYPESIZES[] =
+const i32 ELEMENT_TYPESIZES[] =
 {
     sizeof(int),
     sizeof(float),

+ 1 - 1
Source/Urho3D/GraphicsAPI/GraphicsDefs.h

@@ -214,7 +214,7 @@ struct URHO3D_API VertexElement
 };
 
 /// Sizes of vertex element types.
-extern URHO3D_API const u32 ELEMENT_TYPESIZES[];
+extern URHO3D_API const i32 ELEMENT_TYPESIZES[];
 
 /// Vertex element definitions for the legacy elements.
 extern URHO3D_API const VertexElement LEGACY_VERTEXELEMENTS[];

+ 18 - 13
Source/Urho3D/GraphicsAPI/OpenGL/OGLVertexBuffer.cpp

@@ -45,7 +45,7 @@ void VertexBuffer::Release_OGL()
 
         if (!graphics_->IsDeviceLost())
         {
-            for (unsigned i = 0; i < MAX_VERTEX_STREAMS; ++i)
+            for (i32 i = 0; i < MAX_VERTEX_STREAMS; ++i)
             {
                 if (graphics_->GetVertexBuffer(i) == this)
                     graphics_->SetVertexBuffer(nullptr);
@@ -74,14 +74,14 @@ bool VertexBuffer::SetData_OGL(const void* data)
     }
 
     if (shadowData_ && data != shadowData_.Get())
-        memcpy(shadowData_.Get(), data, vertexCount_ * (size_t)vertexSize_);
+        memcpy(shadowData_.Get(), data, (size_t)vertexCount_ * vertexSize_);
 
     if (object_.name_)
     {
         if (!graphics_->IsDeviceLost())
         {
             graphics_->SetVBO_OGL(object_.name_);
-            glBufferData(GL_ARRAY_BUFFER, vertexCount_ * (size_t)vertexSize_, data, dynamic_ ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
+            glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)vertexCount_ * vertexSize_, data, dynamic_ ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
         }
         else
         {
@@ -94,8 +94,10 @@ bool VertexBuffer::SetData_OGL(const void* data)
     return true;
 }
 
-bool VertexBuffer::SetDataRange_OGL(const void* data, unsigned start, unsigned count, bool discard)
+bool VertexBuffer::SetDataRange_OGL(const void* data, i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
+
     if (start == 0 && count == vertexCount_)
         return SetData_OGL(data);
 
@@ -120,8 +122,9 @@ bool VertexBuffer::SetDataRange_OGL(const void* data, unsigned start, unsigned c
     if (!count)
         return true;
 
-    if (shadowData_ && shadowData_.Get() + start * vertexSize_ != data)
-        memcpy(shadowData_.Get() + start * vertexSize_, data, count * (size_t)vertexSize_);
+    u8* dst = shadowData_.Get() + (intptr_t)start * vertexSize_;
+    if (shadowData_ && dst != data)
+        memcpy(dst, data, (size_t)count * vertexSize_);
 
     if (object_.name_)
     {
@@ -129,9 +132,9 @@ bool VertexBuffer::SetDataRange_OGL(const void* data, unsigned start, unsigned c
         {
             graphics_->SetVBO_OGL(object_.name_);
             if (!discard || start != 0)
-                glBufferSubData(GL_ARRAY_BUFFER, start * (size_t)vertexSize_, count * vertexSize_, data);
+                glBufferSubData(GL_ARRAY_BUFFER, (GLintptr)start * vertexSize_, (GLsizeiptr)count * vertexSize_, data);
             else
-                glBufferData(GL_ARRAY_BUFFER, count * (size_t)vertexSize_, data, dynamic_ ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
+                glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)count * vertexSize_, data, dynamic_ ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
         }
         else
         {
@@ -143,8 +146,10 @@ bool VertexBuffer::SetDataRange_OGL(const void* data, unsigned start, unsigned c
     return true;
 }
 
-void* VertexBuffer::Lock_OGL(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::Lock_OGL(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
+
     if (lockState_ != LOCK_NONE)
     {
         URHO3D_LOGERROR("Vertex buffer already locked");
@@ -173,7 +178,7 @@ void* VertexBuffer::Lock_OGL(unsigned start, unsigned count, bool discard)
     if (shadowData_)
     {
         lockState_ = LOCK_SHADOW;
-        return shadowData_.Get() + start * vertexSize_;
+        return shadowData_.Get() + (intptr_t)start * vertexSize_;
     }
     else if (graphics_)
     {
@@ -190,7 +195,7 @@ void VertexBuffer::Unlock_OGL()
     switch (lockState_)
     {
     case LOCK_SHADOW:
-        SetDataRange_OGL(shadowData_.Get() + lockStart_ * vertexSize_, lockStart_, lockCount_, discardLock_);
+        SetDataRange_OGL(shadowData_.Get() + (intptr_t)lockStart_ * vertexSize_, lockStart_, lockCount_, discardLock_);
         lockState_ = LOCK_NONE;
         break;
 
@@ -232,7 +237,7 @@ bool VertexBuffer::Create_OGL()
         }
 
         graphics_->SetVBO_OGL(object_.name_);
-        glBufferData(GL_ARRAY_BUFFER, vertexCount_ * (size_t)vertexSize_, nullptr, dynamic_ ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
+        glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)vertexCount_ * vertexSize_, nullptr, dynamic_ ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
     }
 
     return true;
@@ -246,7 +251,7 @@ bool VertexBuffer::UpdateToGPU_OGL()
         return false;
 }
 
-void* VertexBuffer::MapBuffer_OGL(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::MapBuffer_OGL(i32 start, i32 count, bool discard)
 {
     // Never called on OpenGL
     return nullptr;

+ 29 - 24
Source/Urho3D/GraphicsAPI/VertexBuffer.cpp

@@ -39,7 +39,7 @@ void VertexBuffer::SetShadowed(bool enable)
     if (enable != shadowed_)
     {
         if (enable && vertexSize_ && vertexCount_)
-            shadowData_ = new u8[vertexCount_ * vertexSize_];
+            shadowData_ = new u8[(size_t)vertexCount_ * vertexSize_];
         else
             shadowData_.Reset();
 
@@ -47,13 +47,15 @@ void VertexBuffer::SetShadowed(bool enable)
     }
 }
 
-bool VertexBuffer::SetSize(unsigned vertexCount, unsigned elementMask, bool dynamic)
+bool VertexBuffer::SetSize(i32 vertexCount, unsigned elementMask, bool dynamic)
 {
+    assert(vertexCount >= 0);
     return SetSize(vertexCount, GetElements(elementMask), dynamic);
 }
 
-bool VertexBuffer::SetSize(unsigned vertexCount, const Vector<VertexElement>& elements, bool dynamic)
+bool VertexBuffer::SetSize(i32 vertexCount, const Vector<VertexElement>& elements, bool dynamic)
 {
+    assert(vertexCount >= 0);
     Unlock();
 
     vertexCount_ = vertexCount;
@@ -63,7 +65,7 @@ bool VertexBuffer::SetSize(unsigned vertexCount, const Vector<VertexElement>& el
     UpdateOffsets();
 
     if (shadowed_ && vertexCount_ && vertexSize_)
-        shadowData_ = new u8[vertexCount_ * vertexSize_];
+        shadowData_ = new u8[(size_t)vertexCount_ * vertexSize_];
     else
         shadowData_.Reset();
 
@@ -72,21 +74,21 @@ bool VertexBuffer::SetSize(unsigned vertexCount, const Vector<VertexElement>& el
 
 void VertexBuffer::UpdateOffsets()
 {
-    unsigned elementOffset = 0;
+    i32 elementOffset = 0;
     elementHash_ = 0;
     elementMask_ = MASK_NONE;
 
-    for (Vector<VertexElement>::Iterator i = elements_.Begin(); i != elements_.End(); ++i)
+    for (VertexElement& element : elements_)
     {
-        i->offset_ = elementOffset;
-        elementOffset += ELEMENT_TYPESIZES[i->type_];
+        element.offset_ = elementOffset;
+        elementOffset += ELEMENT_TYPESIZES[element.type_];
         elementHash_ <<= 6;
-        elementHash_ += (((int)i->type_ + 1) * ((int)i->semantic_ + 1) + i->index_);
+        elementHash_ += (u64)(((i32)element.type_ + 1) * ((i32)element.semantic_ + 1) + element.index_);
 
-        for (unsigned j = 0; j < MAX_LEGACY_VERTEX_ELEMENTS; ++j)
+        for (i32 j = 0; j < MAX_LEGACY_VERTEX_ELEMENTS; ++j)
         {
             const VertexElement& legacy = LEGACY_VERTEXELEMENTS[j];
-            if (i->type_ == legacy.type_ && i->semantic_ == legacy.semantic_ && i->index_ == legacy.index_)
+            if (element.type_ == legacy.type_ && element.semantic_ == legacy.semantic_ && element.index_ == legacy.index_)
                 elementMask_ |= VertexMaskFlags(1u << j);
         }
     }
@@ -150,7 +152,7 @@ Vector<VertexElement> VertexBuffer::GetElements(unsigned elementMask)
 {
     Vector<VertexElement> ret;
 
-    for (unsigned i = 0; i < MAX_LEGACY_VERTEX_ELEMENTS; ++i)
+    for (i32 i = 0; i < MAX_LEGACY_VERTEX_ELEMENTS; ++i)
     {
         if (elementMask & (1u << i))
             ret.Push(LEGACY_VERTEXELEMENTS[i]);
@@ -159,9 +161,9 @@ Vector<VertexElement> VertexBuffer::GetElements(unsigned elementMask)
     return ret;
 }
 
-unsigned VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
+i32 VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
 {
-    unsigned size = 0;
+    i32 size = 0;
 
     for (i32 i = 0; i < elements.Size(); ++i)
         size += ELEMENT_TYPESIZES[elements[i].type_];
@@ -169,11 +171,11 @@ unsigned VertexBuffer::GetVertexSize(const Vector<VertexElement>& elements)
     return size;
 }
 
-unsigned VertexBuffer::GetVertexSize(unsigned elementMask)
+i32 VertexBuffer::GetVertexSize(unsigned elementMask)
 {
-    unsigned size = 0;
+    i32 size = 0;
 
-    for (unsigned i = 0; i < MAX_LEGACY_VERTEX_ELEMENTS; ++i)
+    for (i32 i = 0; i < MAX_LEGACY_VERTEX_ELEMENTS; ++i)
     {
         if (elementMask & (1u << i))
             size += ELEMENT_TYPESIZES[LEGACY_VERTEXELEMENTS[i].type_];
@@ -184,12 +186,12 @@ unsigned VertexBuffer::GetVertexSize(unsigned elementMask)
 
 void VertexBuffer::UpdateOffsets(Vector<VertexElement>& elements)
 {
-    unsigned elementOffset = 0;
+    i32 elementOffset = 0;
 
-    for (Vector<VertexElement>::Iterator i = elements.Begin(); i != elements.End(); ++i)
+    for (VertexElement& element : elements)
     {
-        i->offset_ = elementOffset;
-        elementOffset += ELEMENT_TYPESIZES[i->type_];
+        element.offset_ = elementOffset;
+        elementOffset += ELEMENT_TYPESIZES[element.type_];
     }
 }
 
@@ -275,8 +277,9 @@ bool VertexBuffer::SetData(const void* data)
     return {}; // Prevent warning
 }
 
-bool VertexBuffer::SetDataRange(const void* data, unsigned start, unsigned count, bool discard)
+bool VertexBuffer::SetDataRange(const void* data, i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
     GAPI gapi = Graphics::GetGAPI();
 
 #ifdef URHO3D_OPENGL
@@ -297,8 +300,9 @@ bool VertexBuffer::SetDataRange(const void* data, unsigned start, unsigned count
     return {}; // Prevent warning
 }
 
-void* VertexBuffer::Lock(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::Lock(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
     GAPI gapi = Graphics::GetGAPI();
 
 #ifdef URHO3D_OPENGL
@@ -383,8 +387,9 @@ bool VertexBuffer::UpdateToGPU()
     return {}; // Prevent warning
 }
 
-void* VertexBuffer::MapBuffer(unsigned start, unsigned count, bool discard)
+void* VertexBuffer::MapBuffer(i32 start, i32 count, bool discard)
 {
+    assert(start >= 0 && count >= 0);
     GAPI gapi = Graphics::GetGAPI();
 
 #ifdef URHO3D_OPENGL

+ 22 - 22
Source/Urho3D/GraphicsAPI/VertexBuffer.h

@@ -33,15 +33,15 @@ public:
     /// @property
     void SetShadowed(bool enable);
     /// Set size, vertex elements and dynamic mode. Previous data will be lost.
-    bool SetSize(unsigned vertexCount, const Vector<VertexElement>& elements, bool dynamic = false);
+    bool SetSize(i32 vertexCount, const Vector<VertexElement>& elements, bool dynamic = false);
     /// Set size and vertex elements and dynamic mode using legacy element bitmask. Previous data will be lost.
-    bool SetSize(unsigned vertexCount, unsigned elementMask, bool dynamic = false);
+    bool SetSize(i32 vertexCount, unsigned elementMask, bool dynamic = false);
     /// Set all data in the buffer.
     bool SetData(const void* data);
     /// Set a data range in the buffer. Optionally discard data outside the range.
-    bool SetDataRange(const void* data, unsigned start, unsigned count, bool discard = false);
+    bool SetDataRange(const void* data, i32 start, i32 count, bool discard = false);
     /// Lock the buffer for write-only editing. Return data pointer if successful. Optionally discard data outside the range.
-    void* Lock(unsigned start, unsigned count, bool discard = false);
+    void* Lock(i32 start, i32 count, bool discard = false);
     /// Unlock the buffer and apply changes to the GPU buffer.
     void Unlock();
 
@@ -58,11 +58,11 @@ public:
 
     /// Return number of vertices.
     /// @property
-    unsigned GetVertexCount() const { return vertexCount_; }
+    i32 GetVertexCount() const { return vertexCount_; }
 
     /// Return vertex size in bytes.
     /// @property
-    unsigned GetVertexSize() const { return vertexSize_; }
+    i32 GetVertexSize() const { return vertexSize_; }
 
     /// Return vertex elements.
     /// @property
@@ -130,10 +130,10 @@ public:
     static Vector<VertexElement> GetElements(unsigned elementMask);
 
     /// Return vertex size from an element list.
-    static unsigned GetVertexSize(const Vector<VertexElement>& elements);
+    static i32 GetVertexSize(const Vector<VertexElement>& elements);
 
     /// Return vertex size for a legacy vertex element bitmask.
-    static unsigned GetVertexSize(unsigned elementMask);
+    static i32 GetVertexSize(unsigned elementMask);
 
     /// Update offsets of vertex elements.
     static void UpdateOffsets(Vector<VertexElement>& elements);
@@ -146,7 +146,7 @@ private:
     /// Update the shadow data to the GPU buffer.
     bool UpdateToGPU();
     /// Map the GPU buffer into CPU memory. Not used on OpenGL.
-    void* MapBuffer(unsigned start, unsigned count, bool discard);
+    void* MapBuffer(i32 start, i32 count, bool discard);
     /// Unmap the GPU buffer. Not used on OpenGL.
     void UnmapBuffer();
 
@@ -155,12 +155,12 @@ private:
     void OnDeviceReset_OGL();
     void Release_OGL();
     bool SetData_OGL(const void* data);
-    bool SetDataRange_OGL(const void* data, unsigned start, unsigned count, bool discard = false);
-    void* Lock_OGL(unsigned start, unsigned count, bool discard);
+    bool SetDataRange_OGL(const void* data, i32 start, i32 count, bool discard = false);
+    void* Lock_OGL(i32 start, i32 count, bool discard);
     void Unlock_OGL();
     bool Create_OGL();
     bool UpdateToGPU_OGL();
-    void* MapBuffer_OGL(unsigned start, unsigned count, bool discard);
+    void* MapBuffer_OGL(i32 start, i32 count, bool discard);
     void UnmapBuffer_OGL();
 #endif // def URHO3D_OPENGL
 
@@ -169,12 +169,12 @@ private:
     void OnDeviceReset_D3D9();
     void Release_D3D9();
     bool SetData_D3D9(const void* data);
-    bool SetDataRange_D3D9(const void* data, unsigned start, unsigned count, bool discard = false);
-    void* Lock_D3D9(unsigned start, unsigned count, bool discard);
+    bool SetDataRange_D3D9(const void* data, i32 start, i32 count, bool discard = false);
+    void* Lock_D3D9(i32 start, i32 count, bool discard);
     void Unlock_D3D9();
     bool Create_D3D9();
     bool UpdateToGPU_D3D9();
-    void* MapBuffer_D3D9(unsigned start, unsigned count, bool discard);
+    void* MapBuffer_D3D9(i32 start, i32 count, bool discard);
     void UnmapBuffer_D3D9();
 #endif // def URHO3D_D3D9
 
@@ -183,21 +183,21 @@ private:
     void OnDeviceReset_D3D11();
     void Release_D3D11();
     bool SetData_D3D11(const void* data);
-    bool SetDataRange_D3D11(const void* data, unsigned start, unsigned count, bool discard = false);
-    void* Lock_D3D11(unsigned start, unsigned count, bool discard);
+    bool SetDataRange_D3D11(const void* data, i32 start, i32 count, bool discard = false);
+    void* Lock_D3D11(i32 start, i32 count, bool discard);
     void Unlock_D3D11();
     bool Create_D3D11();
     bool UpdateToGPU_D3D11();
-    void* MapBuffer_D3D11(unsigned start, unsigned count, bool discard);
+    void* MapBuffer_D3D11(i32 start, i32 count, bool discard);
     void UnmapBuffer_D3D11();
 #endif // def URHO3D_D3D11
 
     /// Shadow data.
     SharedArrayPtr<u8> shadowData_;
     /// Number of vertices.
-    unsigned vertexCount_{};
+    i32 vertexCount_{};
     /// Vertex size.
-    unsigned vertexSize_{};
+    i32 vertexSize_{};
     /// Vertex elements.
     Vector<VertexElement> elements_;
     /// Vertex element hash.
@@ -207,9 +207,9 @@ private:
     /// Buffer locking state.
     LockState lockState_{LOCK_NONE};
     /// Lock start vertex.
-    unsigned lockStart_{};
+    i32 lockStart_{};
     /// Lock number of vertices.
-    unsigned lockCount_{};
+    i32 lockCount_{};
     /// Scratch buffer for fallback locking.
     void* lockScratchData_{};
     /// Dynamic flag.