-
Notifications
You must be signed in to change notification settings - Fork 0
/
buffer_struct.js
127 lines (93 loc) · 2.58 KB
/
buffer_struct.js
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
119
120
121
122
123
124
125
126
127
import {array, arrayCycleIndex} from "./kits.js";
export class BufferValue {
alignment = 1;
size = 0;
allocate(arrayBuffer, offset) {
}
}
export class BufferUint32 extends BufferValue {
alignment = 4;
size = 4;
buffer;
allocate(arrayBuffer, offset) {
this.buffer = new Uint32Array(arrayBuffer, offset, 1);
}
}
export class BufferFloat32 extends BufferValue {
alignment = 4;
size = 4;
buffer;
allocate(arrayBuffer, offset) {
this.buffer = new Float32Array(arrayBuffer, offset, 1);
}
}
export class BufferVec4F32 extends BufferValue {
alignment = 16;
size = 16;
buffer;
allocate(arrayBuffer, offset) {
this.buffer = new Float32Array(arrayBuffer, offset, 4);
}
}
export class BufferMat4x4F32 extends BufferValue {
alignment = 16;
size = 64;
buffer;
allocate(arrayBuffer, offset) {
this.buffer = new Float32Array(arrayBuffer, offset, 16);
}
}
export class BufferStruct extends BufferValue {
/**
* @param {BufferValue[]} members
* @param {number} structAlignment
*/
setStruct(members, structAlignment = 1) {
this.#members = members;
this.alignment = Math.max(structAlignment, ...members.map(member => member.alignment));
let offset = 0;
for (let member of members) {
let alignment = member.alignment | 0;
let size = member.size | 0;
offset = ((((offset + alignment - 1) / alignment) | 0) * alignment) | 0;
offset += size;
}
this.size = offset;
return this;
}
/**
* @type {BufferValue[]}
*/
#members = [];
/**
* @type {number}
*/
offset = undefined;
allocate(arrayBuffer, offset) {
let alignment = this.alignment | 0;
offset = (((offset / alignment) | 0) * alignment) | 0;
this.offset = offset;
for (let member of this.#members) {
let alignment = member.alignment | 0;
let size = member.size | 0;
offset = ((((offset + alignment - 1) / alignment) | 0) * alignment) | 0;
member.allocate(arrayBuffer, offset);
offset += size;
}
}
use_size() {
return (((this.size + 15) / 16) | 0) * 16;
}
}
export class BufferArray extends BufferStruct {
constructor(type, length, arrayAlignment = 1) {
super();
this.array = array(length, _ => new type());
this.setStruct(this.array, arrayAlignment);
}
array;
/**
* @type {number}
*/
offset = undefined;
}