1 | "use strict";
|
2 | var constants = require("@pixi/constants"), runner = require("@pixi/runner"), utils = require("@pixi/utils"), Attribute = require("./Attribute.js"), Buffer = require("./Buffer.js"), interleaveTypedArrays = require("./utils/interleaveTypedArrays.js");
|
3 | const byteSizeMap = { 5126: 4, 5123: 2, 5121: 1 };
|
4 | let UID = 0;
|
5 | const map = {
|
6 | Float32Array,
|
7 | Uint32Array,
|
8 | Int32Array,
|
9 | Uint8Array,
|
10 | Uint16Array
|
11 | };
|
12 | class Geometry {
|
13 | |
14 |
|
15 |
|
16 |
|
17 | constructor(buffers = [], attributes = {}) {
|
18 | this.buffers = buffers, this.indexBuffer = null, this.attributes = attributes, this.glVertexArrayObjects = {}, this.id = UID++, this.instanced = !1, this.instanceCount = 1, this.disposeRunner = new runner.Runner("disposeGeometry"), this.refCount = 0;
|
19 | }
|
20 | |
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 | addAttribute(id, buffer, size = 0, normalized = !1, type, stride, start, instance = !1) {
|
35 | if (!buffer)
|
36 | throw new Error("You must pass a buffer when creating an attribute");
|
37 | buffer instanceof Buffer.Buffer || (buffer instanceof Array && (buffer = new Float32Array(buffer)), buffer = new Buffer.Buffer(buffer));
|
38 | const ids = id.split("|");
|
39 | if (ids.length > 1) {
|
40 | for (let i = 0; i < ids.length; i++)
|
41 | this.addAttribute(ids[i], buffer, size, normalized, type);
|
42 | return this;
|
43 | }
|
44 | let bufferIndex = this.buffers.indexOf(buffer);
|
45 | return bufferIndex === -1 && (this.buffers.push(buffer), bufferIndex = this.buffers.length - 1), this.attributes[id] = new Attribute.Attribute(bufferIndex, size, normalized, type, stride, start, instance), this.instanced = this.instanced || instance, this;
|
46 | }
|
47 | |
48 |
|
49 |
|
50 |
|
51 |
|
52 | getAttribute(id) {
|
53 | return this.attributes[id];
|
54 | }
|
55 | |
56 |
|
57 |
|
58 |
|
59 |
|
60 | getBuffer(id) {
|
61 | return this.buffers[this.getAttribute(id).buffer];
|
62 | }
|
63 | |
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | addIndex(buffer) {
|
71 | return buffer instanceof Buffer.Buffer || (buffer instanceof Array && (buffer = new Uint16Array(buffer)), buffer = new Buffer.Buffer(buffer)), buffer.type = constants.BUFFER_TYPE.ELEMENT_ARRAY_BUFFER, this.indexBuffer = buffer, this.buffers.includes(buffer) || this.buffers.push(buffer), this;
|
72 | }
|
73 | |
74 |
|
75 |
|
76 |
|
77 | getIndex() {
|
78 | return this.indexBuffer;
|
79 | }
|
80 | |
81 |
|
82 |
|
83 |
|
84 |
|
85 | interleave() {
|
86 | if (this.buffers.length === 1 || this.buffers.length === 2 && this.indexBuffer)
|
87 | return this;
|
88 | const arrays = [], sizes = [], interleavedBuffer = new Buffer.Buffer();
|
89 | let i;
|
90 | for (i in this.attributes) {
|
91 | const attribute = this.attributes[i], buffer = this.buffers[attribute.buffer];
|
92 | arrays.push(buffer.data), sizes.push(attribute.size * byteSizeMap[attribute.type] / 4), attribute.buffer = 0;
|
93 | }
|
94 | for (interleavedBuffer.data = interleaveTypedArrays.interleaveTypedArrays(arrays, sizes), i = 0; i < this.buffers.length; i++)
|
95 | this.buffers[i] !== this.indexBuffer && this.buffers[i].destroy();
|
96 | return this.buffers = [interleavedBuffer], this.indexBuffer && this.buffers.push(this.indexBuffer), this;
|
97 | }
|
98 |
|
99 | getSize() {
|
100 | for (const i in this.attributes) {
|
101 | const attribute = this.attributes[i];
|
102 | return this.buffers[attribute.buffer].data.length / (attribute.stride / 4 || attribute.size);
|
103 | }
|
104 | return 0;
|
105 | }
|
106 |
|
107 | dispose() {
|
108 | this.disposeRunner.emit(this, !1);
|
109 | }
|
110 |
|
111 | destroy() {
|
112 | this.dispose(), this.buffers = null, this.indexBuffer = null, this.attributes = null;
|
113 | }
|
114 | |
115 |
|
116 |
|
117 |
|
118 | clone() {
|
119 | const geometry = new Geometry();
|
120 | for (let i = 0; i < this.buffers.length; i++)
|
121 | geometry.buffers[i] = new Buffer.Buffer(this.buffers[i].data.slice(0));
|
122 | for (const i in this.attributes) {
|
123 | const attrib = this.attributes[i];
|
124 | geometry.attributes[i] = new Attribute.Attribute(
|
125 | attrib.buffer,
|
126 | attrib.size,
|
127 | attrib.normalized,
|
128 | attrib.type,
|
129 | attrib.stride,
|
130 | attrib.start,
|
131 | attrib.instance
|
132 | );
|
133 | }
|
134 | return this.indexBuffer && (geometry.indexBuffer = geometry.buffers[this.buffers.indexOf(this.indexBuffer)], geometry.indexBuffer.type = constants.BUFFER_TYPE.ELEMENT_ARRAY_BUFFER), geometry;
|
135 | }
|
136 | |
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 | static merge(geometries) {
|
144 | const geometryOut = new Geometry(), arrays = [], sizes = [], offsets = [];
|
145 | let geometry;
|
146 | for (let i = 0; i < geometries.length; i++) {
|
147 | geometry = geometries[i];
|
148 | for (let j = 0; j < geometry.buffers.length; j++)
|
149 | sizes[j] = sizes[j] || 0, sizes[j] += geometry.buffers[j].data.length, offsets[j] = 0;
|
150 | }
|
151 | for (let i = 0; i < geometry.buffers.length; i++)
|
152 | arrays[i] = new map[utils.getBufferType(geometry.buffers[i].data)](sizes[i]), geometryOut.buffers[i] = new Buffer.Buffer(arrays[i]);
|
153 | for (let i = 0; i < geometries.length; i++) {
|
154 | geometry = geometries[i];
|
155 | for (let j = 0; j < geometry.buffers.length; j++)
|
156 | arrays[j].set(geometry.buffers[j].data, offsets[j]), offsets[j] += geometry.buffers[j].data.length;
|
157 | }
|
158 | if (geometryOut.attributes = geometry.attributes, geometry.indexBuffer) {
|
159 | geometryOut.indexBuffer = geometryOut.buffers[geometry.buffers.indexOf(geometry.indexBuffer)], geometryOut.indexBuffer.type = constants.BUFFER_TYPE.ELEMENT_ARRAY_BUFFER;
|
160 | let offset = 0, stride = 0, offset2 = 0, bufferIndexToCount = 0;
|
161 | for (let i = 0; i < geometry.buffers.length; i++)
|
162 | if (geometry.buffers[i] !== geometry.indexBuffer) {
|
163 | bufferIndexToCount = i;
|
164 | break;
|
165 | }
|
166 | for (const i in geometry.attributes) {
|
167 | const attribute = geometry.attributes[i];
|
168 | (attribute.buffer | 0) === bufferIndexToCount && (stride += attribute.size * byteSizeMap[attribute.type] / 4);
|
169 | }
|
170 | for (let i = 0; i < geometries.length; i++) {
|
171 | const indexBufferData = geometries[i].indexBuffer.data;
|
172 | for (let j = 0; j < indexBufferData.length; j++)
|
173 | geometryOut.indexBuffer.data[j + offset2] += offset;
|
174 | offset += geometries[i].buffers[bufferIndexToCount].data.length / stride, offset2 += indexBufferData.length;
|
175 | }
|
176 | }
|
177 | return geometryOut;
|
178 | }
|
179 | }
|
180 | exports.Geometry = Geometry;
|
181 |
|