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;
}
}
}
|