summaryrefslogtreecommitdiff
path: root/Source/modules/asura-core/Graphics/binding/GPUBuffer.binding.cpp
blob: 8c39a598aa66c6696797e69394a7aa2c70fb3171 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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;
		}

	}
}