From a077eb38b01292611f4f6031b75e3e2c1c20f06e Mon Sep 17 00:00:00 2001
From: chai <chaifix@163.com>
Date: Fri, 16 Aug 2019 08:54:08 +0800
Subject: *misc

---
 .../Graphics/binding/GPUBuffer.binding.cpp         | 118 +++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100644 Source/modules/asura-core/Graphics/binding/GPUBuffer.binding.cpp

(limited to 'Source/modules/asura-core/Graphics/binding/GPUBuffer.binding.cpp')

diff --git a/Source/modules/asura-core/Graphics/binding/GPUBuffer.binding.cpp b/Source/modules/asura-core/Graphics/binding/GPUBuffer.binding.cpp
new file mode 100644
index 0000000..8c39a59
--- /dev/null
+++ b/Source/modules/asura-core/Graphics/binding/GPUBuffer.binding.cpp
@@ -0,0 +1,118 @@
+#include <stdlib.h>
+
+#include "../image.h"
+#include "../GPUBuffer.h"
+
+using namespace std;
+using namespace Luax;
+
+namespace_begin(AsuraEngine)
+namespace_begin(Graphics)
+
+		
+		LUAX_REGISTRY(GPUBuffer)
+		{
+			LUAX_REGISTER_METHODS(state,
+				{ "Fill",     _Fill     },
+				{ "GetSize",  _GetSize  },
+				{ "GetCount", _GetCount }
+			);
+		}
+
+		LUAX_POSTPROCESS(GPUBuffer)
+		{
+			LUAX_REGISTER_ENUM(state, "EBufferType",
+				{ "VERTEX", BUFFER_TYPE_VERTEX },
+				{ "INDEX",  BUFFER_TYPE_INDEX  }
+			);
+			LUAX_REGISTER_ENUM(state, "EBufferUsage",
+				{ "STREAM",  BUFFER_USAGE_STREAM  },
+				{ "DYNAMIC", BUFFER_USAGE_DYNAMIC },
+				{ "STATIC",  BUFFER_USAGE_STATIC  }
+			);
+			LUAX_REGISTER_ENUM(state, "EBufferDataType",
+				{ "INT",           BUFFER_DATA_TYPE_INT           },
+				{ "FLOAT",         BUFFER_DATA_TYPE_FLOAT         },
+				{ "UNSIGNED_BYTE", BUFFER_DATA_TYPE_UNSIGNED_BYTE }
+			);
+
+		}
+
+		// buffer = GPUBuffer.New(bufferType, bufferUsage, bufferDataType, size)
+		// buffer = GPUBuffer.New(image) 
+		// buffer = GPUBuffer.New(mesh2d)
+		// buffer = GPUBuffer.New(canvas)
+		// buffer = GPUBuffer.New(shape)
+		//LUAX_IMPL_METHOD(GPUBuffer, _New)
+		//{
+		//	LUAX_STATE(L);
+
+		//	return 0;
+		//}
+
+		// gpubuffer:Fill({data_unit_list}, offseti)
+		//    data_unit_list ��������ݵ�table 
+		//    offseti        : ��ʼ���ǵĵط����ڵ�����(��0��ʼ��
+		LUAX_IMPL_METHOD(GPUBuffer, _Fill)
+		{
+			LUAX_PREPARE(L, GPUBuffer);
+
+			// ʹ��buffer��Ӧ�����������޸�buffer���ڵ�һ�ε���ʱ���ʼ��size��С��buffer��Ȼ����䡣
+			int offset = state.GetValue(3, 0);
+			int count = lua_objlen(L, 2);
+			int size = count * self->GetDataTypeSize();
+			byte* data = (byte*)malloc(size);
+			int unit = self->GetDataTypeSize();
+			int i = 1;
+			lua_rawgeti(L, 2, i);
+			while (!lua_isnil(L, -1))
+			{
+				switch (self->m_DataType)
+				{
+					case GL_INT: 
+					{
+						int n = state.CheckValue<int>(-1);
+						memcpy(data + (i - 1)*unit, &n, unit);
+						break; 
+					}
+					case GL_FLOAT: 
+					{
+						float n = state.CheckValue<float>(-1); 
+						memcpy(data + (i - 1)*unit, &n, unit);
+						break;
+					}
+					case GL_UNSIGNED_BYTE: 
+					{
+						unsigned char n = state.CheckValue<unsigned char>(-1);
+						memcpy(data + (i - 1)*unit, &n, unit);
+						break;
+					}
+				}
+				state.Pop(1); // value
+				lua_rawgeti(L, 2, ++i);
+			}
+			state.Pop(); // nil
+
+			self->Fill(data, size, offset * unit);
+
+			free(data);
+			return 0;
+		}
+
+		// gpubuffer:GetSize()
+		LUAX_IMPL_METHOD(GPUBuffer, _GetSize)
+		{
+			LUAX_PREPARE(L, GPUBuffer);
+			state.Push(self->m_Size);
+			return 0;
+		}
+
+		LUAX_IMPL_METHOD(GPUBuffer, _GetCount)
+		{
+			LUAX_PREPARE(L, GPUBuffer);
+			state.Push(self->m_Size / self->GetDataTypeSize());
+			return 0;
+		}
+
+	}
+}
-- 
cgit v1.1-26-g67d0