Browse Source

Add a Data object variant of love.graphics.newIndexBuffer

Alex Szpakowski 5 years ago
parent
commit
77834d8e6c
1 changed files with 29 additions and 11 deletions
  1. 29 11
      src/modules/graphics/wrap_Graphics.cpp

+ 29 - 11
src/modules/graphics/wrap_Graphics.cpp

@@ -1519,32 +1519,45 @@ int w_newIndexBuffer(lua_State *L)
 	Buffer::Settings settings(Buffer::TYPEFLAG_INDEX, Buffer::MAP_EXPLICIT_RANGE_MODIFY, BUFFERUSAGE_DYNAMIC);
 	luax_optbuffersettings(L, 3, settings);
 
-	int arraylength = 0;
+	size_t arraylength = 0;
+	size_t bytesize = 0;
 	DataFormat format = DATAFORMAT_UINT16;
+	Data *data = nullptr;
+
+	if (luax_istype(L, 1, Data::type))
+	{
+		data = luax_checktype<Data>(L, 1);
+		bytesize = data->getSize();
+	}
 
 	if (lua_istable(L, 1))
 	{
-		arraylength = (int) luax_objlen(L, 1);
+		arraylength = (size_t) luax_objlen(L, 1);
 
 		// Scan array for invalid types and the max value.
 		lua_Integer maxvalue = 0;
-		for (int i = 0; i < arraylength; i++)
+		for (size_t i = 0; i < arraylength; i++)
 		{
 			lua_rawgeti(L, 1, i + 1);
-			lua_Integer v = luaL_checkinteger(L, -1);
+			lua_Integer v = luaL_checkinteger(L, -1) - 1;
 			lua_pop(L, 1);
 			if (v < 0)
-				return luaL_argerror(L, 1, "expected non-negative integer values in array");
+				return luaL_argerror(L, 1, "expected positive integer values in array");
 			else
 				maxvalue = std::max(maxvalue, v);
 		}
 
 		format = getIndexDataFormat(getIndexDataTypeFromMax(maxvalue));
 	}
-	else
-		arraylength = (int) luaL_checkinteger(L, 1);
+	else if (data == nullptr)
+	{
+		lua_Integer len = luaL_checkinteger(L, 1);
+		if (len <= 0)
+			return luaL_argerror(L, 1, "number of elements must be greater than 0");
+		arraylength = (size_t) len;
+	}
 
-	if (!lua_isnoneornil(L, 2))
+	if (data != nullptr || !lua_isnoneornil(L, 2))
 	{
 		const char *formatstr = luaL_checkstring(L, 2);
 		if (!getConstant(formatstr, format))
@@ -1552,7 +1565,7 @@ int w_newIndexBuffer(lua_State *L)
 	}
 
 	Buffer *b = nullptr;
-	luax_catchexcept(L, [&] { b = instance()->newBuffer(settings, format, nullptr, 0, arraylength); });
+	luax_catchexcept(L, [&] { b = instance()->newBuffer(settings, format, nullptr, bytesize, arraylength); });
 
 	if (lua_istable(L, 1))
 	{
@@ -1560,10 +1573,10 @@ int w_newIndexBuffer(lua_State *L)
 		uint16 *u16data = (uint16 *) mapper.data;
 		uint32 *u32data = (uint32 *) mapper.data;
 
-		for (int i = 0; i < arraylength; i++)
+		for (size_t i = 0; i < arraylength; i++)
 		{
 			lua_rawgeti(L, 1, i + 1);
-			lua_Integer v = luaL_checkinteger(L, -1);
+			lua_Integer v = luaL_checkinteger(L, -1) - 1;
 			lua_pop(L, 1);
 			if (format == DATAFORMAT_UINT16)
 				u16data[i] = (uint16) v;
@@ -1571,6 +1584,11 @@ int w_newIndexBuffer(lua_State *L)
 				u32data[i] = (uint32) v;
 		}
 	}
+	else if (data != nullptr)
+	{
+		Buffer::Mapper mapper(*b);
+		memcpy(mapper.data, data->getData(), std::min(data->getSize(), b->getSize()));
+	}
 
 	luax_pushtype(L, b);
 	b->release();