@adobe/data 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ecs/archetype/archetype.d.ts +2 -1
- package/dist/ecs/archetype/archetype.js +14 -0
- package/dist/ecs/archetype/archetype.js.map +1 -1
- package/dist/ecs/archetype/create-archetype.d.ts +2 -2
- package/dist/ecs/archetype/create-archetype.test.js +6 -6
- package/dist/ecs/archetype/create-archetype.test.js.map +1 -1
- package/dist/ecs/archetype/delete-row.test.js +4 -4
- package/dist/ecs/archetype/delete-row.test.js.map +1 -1
- package/dist/ecs/database/transactional-store/apply-operations.js.map +1 -1
- package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
- package/dist/ecs/database/transactional-store/transactional-store.d.ts +1 -1
- package/dist/ecs/entity/entity.d.ts +8 -0
- package/dist/ecs/entity/entity.js +3 -0
- package/dist/ecs/entity/entity.js.map +1 -0
- package/dist/ecs/entity/u32.d.ts +8 -0
- package/dist/{lit/elements/service-context.js → ecs/entity/u32.js} +3 -3
- package/dist/ecs/entity/u32.js.map +1 -0
- package/dist/ecs/entity.d.ts +2 -2
- package/dist/ecs/entity.js +1 -1
- package/dist/ecs/entity.js.map +1 -1
- package/dist/ecs/index.d.ts +2 -1
- package/dist/ecs/index.js +2 -1
- package/dist/ecs/index.js.map +1 -1
- package/dist/ecs/store/core/create-core.js +2 -2
- package/dist/ecs/store/core/create-core.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/lit/hooks/use-element.d.ts +3 -0
- package/dist/lit/hooks/use-element.js +63 -5
- package/dist/lit/hooks/use-element.js.map +1 -1
- package/dist/math/f32/f32.d.ts +2 -3
- package/dist/math/f32/f32.js +2 -2
- package/dist/mutable-clone.d.ts +1 -4
- package/dist/mutable-clone.js +21 -0
- package/dist/mutable-clone.js.map +1 -1
- package/dist/mutable.d.ts +9 -0
- package/dist/mutable.js +26 -0
- package/dist/mutable.js.map +1 -0
- package/dist/samples/todo/services/state-service/create-todo-database.d.ts +2 -2
- package/dist/samples/todo/services/state-service/create-todo-store.d.ts +2 -2
- package/dist/schema/schema.d.ts +2 -0
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/to-vertex-buffer-layout.d.ts +56 -0
- package/dist/schema/to-vertex-buffer-layout.js +129 -0
- package/dist/schema/to-vertex-buffer-layout.js.map +1 -0
- package/dist/schema/to-vertex-buffer-layout.test.d.ts +1 -0
- package/dist/schema/to-vertex-buffer-layout.test.js +247 -0
- package/dist/schema/to-vertex-buffer-layout.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/typed-buffer/create-struct-buffer.js +3 -3
- package/dist/typed-buffer/create-struct-buffer.js.map +1 -1
- package/dist/typed-buffer/create-struct-buffer.test.d.ts +1 -0
- package/dist/typed-buffer/create-struct-buffer.test.js +227 -0
- package/dist/typed-buffer/create-struct-buffer.test.js.map +1 -0
- package/dist/typed-buffer/create-typed-buffer.js +3 -1
- package/dist/typed-buffer/create-typed-buffer.js.map +1 -1
- package/dist/typed-buffer/create-typed-buffer.test.d.ts +1 -0
- package/dist/typed-buffer/create-typed-buffer.test.js +148 -0
- package/dist/typed-buffer/create-typed-buffer.test.js.map +1 -0
- package/dist/typed-buffer/structs/get-struct-layout.d.ts +0 -1
- package/dist/typed-buffer/structs/get-struct-layout.js +72 -39
- package/dist/typed-buffer/structs/get-struct-layout.js.map +1 -1
- package/dist/typed-buffer/structs/get-struct-layout.test.js +137 -0
- package/dist/typed-buffer/structs/get-struct-layout.test.js.map +1 -1
- package/dist/typed-buffer/structs/struct-layout.d.ts +4 -0
- package/dist/types/types.d.ts +5 -0
- package/dist/types/types.js +3 -0
- package/dist/types/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/lit/elements/service-application.d.ts +0 -9
- package/dist/lit/elements/service-application.js +0 -55
- package/dist/lit/elements/service-application.js.map +0 -1
- package/dist/lit/elements/service-context.d.ts +0 -1
- package/dist/lit/elements/service-context.js.map +0 -1
- package/dist/lit/elements/service-element.d.ts +0 -6
- package/dist/lit/elements/service-element.js +0 -43
- package/dist/lit/elements/service-element.js.map +0 -1
|
@@ -31,11 +31,11 @@ class StructTypedBuffer extends TypedBuffer {
|
|
|
31
31
|
constructor(schema, initialCapacityOrArrayBuffer) {
|
|
32
32
|
super(schema);
|
|
33
33
|
this.type = structBufferType;
|
|
34
|
-
const
|
|
35
|
-
if (!
|
|
34
|
+
const structLayout = getStructLayout(schema);
|
|
35
|
+
if (!structLayout) {
|
|
36
36
|
throw new Error("Schema is not a valid struct schema");
|
|
37
37
|
}
|
|
38
|
-
this.layout =
|
|
38
|
+
this.layout = structLayout;
|
|
39
39
|
this.typedArrayElementSizeInBytes = this.layout.size;
|
|
40
40
|
this.arrayType = 'f32';
|
|
41
41
|
this.sizeInQuads = this.layout.size / 4;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-struct-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-struct-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AACX,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAExG,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC,MAAM,iBAAgF,SAAQ,WAA0B;IAcpH,YAAY,MAAS,EAAE,4BAAkD;QACrE,KAAK,CAAC,MAAM,CAAC,CAAC;QAdF,SAAI,GAAoB,gBAAgB,CAAC;QAgBrD,MAAM,
|
|
1
|
+
{"version":3,"file":"create-struct-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-struct-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;WAoBW;AACX,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAExG,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAEzC,MAAM,iBAAgF,SAAQ,WAA0B;IAcpH,YAAY,MAAS,EAAE,4BAAkD;QACrE,KAAK,CAAC,MAAM,CAAC,CAAC;QAdF,SAAI,GAAoB,gBAAgB,CAAC;QAgBrD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,KAAkB,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,WAAW;cACV,4BAA4B,YAAY,WAAW;gBACrD,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,uBAAuB,CAAC,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAE3D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAgB,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAgB,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAa;QACtB,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,KAAa;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,KAAoB;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,GAAW;QACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1H,CAAC;IAED,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS;QACjC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AAUD,MAAM,UAAU,kBAAkB,CAC9B,MAAS,EACT,4BAAkD;IAElD,OAAO,IAAI,iBAAiB,CAAe,MAAM,EAAE,4BAA4B,CAAC,CAAC;AACrF,CAAC;AAAA,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission<|tool▁call▁begin|>implemented in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is furnished
|
|
8
|
+
to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.*/
|
|
20
|
+
import { describe, it, expect } from "vitest";
|
|
21
|
+
import { createStructBuffer } from "./create-struct-buffer.js";
|
|
22
|
+
import { F32Schema } from "../schema/f32.js";
|
|
23
|
+
describe("createStructBuffer", () => {
|
|
24
|
+
// Helper function to create vec3 schema
|
|
25
|
+
const Vec3Schema = {
|
|
26
|
+
type: "array",
|
|
27
|
+
items: { type: "number", precision: 1 },
|
|
28
|
+
minItems: 3,
|
|
29
|
+
maxItems: 3
|
|
30
|
+
};
|
|
31
|
+
// Helper function to create vec4 schema
|
|
32
|
+
const Vec4Schema = {
|
|
33
|
+
type: "array",
|
|
34
|
+
items: { type: "number", precision: 1 },
|
|
35
|
+
minItems: 4,
|
|
36
|
+
maxItems: 4
|
|
37
|
+
};
|
|
38
|
+
describe("std140 layout (default)", () => {
|
|
39
|
+
it("should create buffer with std140 layout by default", () => {
|
|
40
|
+
const schema = {
|
|
41
|
+
type: "object",
|
|
42
|
+
properties: {
|
|
43
|
+
position: Vec3Schema,
|
|
44
|
+
color: Vec4Schema
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const buffer = createStructBuffer(schema, 1);
|
|
48
|
+
// Should use std140 layout (32 bytes: 16 + 16)
|
|
49
|
+
expect(buffer.capacity).toBe(1);
|
|
50
|
+
expect(buffer.type).toBe("struct");
|
|
51
|
+
expect(buffer.typedArrayElementSizeInBytes).toBe(32); // vec3 padded to vec4 + vec4
|
|
52
|
+
});
|
|
53
|
+
it("should explicitly accept std140 layout parameter", () => {
|
|
54
|
+
const schema = {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
position: Vec3Schema,
|
|
58
|
+
scale: F32Schema
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const buffer = createStructBuffer(schema, 1);
|
|
62
|
+
// vec3 (16 bytes padded) + f32 (4 bytes) = 20 bytes, rounded to vec4 = 20 bytes
|
|
63
|
+
expect(buffer.typedArrayElementSizeInBytes).toBeGreaterThanOrEqual(16);
|
|
64
|
+
});
|
|
65
|
+
it("should work with arrayBuffer parameter", () => {
|
|
66
|
+
const schema = {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: {
|
|
69
|
+
a: F32Schema,
|
|
70
|
+
b: F32Schema
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const arrayBuffer = new ArrayBuffer(32); // 2 * 16 bytes for std140
|
|
74
|
+
const buffer = createStructBuffer(schema, arrayBuffer);
|
|
75
|
+
expect(buffer.capacity).toBe(2); // 32 bytes / 16 bytes per element
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("packed layout", () => {
|
|
79
|
+
it("should create buffer with packed layout", () => {
|
|
80
|
+
const schema = {
|
|
81
|
+
type: "object",
|
|
82
|
+
properties: {
|
|
83
|
+
position: Vec3Schema, // 12 bytes
|
|
84
|
+
color: Vec4Schema // 16 bytes
|
|
85
|
+
},
|
|
86
|
+
layout: "packed"
|
|
87
|
+
};
|
|
88
|
+
const buffer = createStructBuffer(schema, 1);
|
|
89
|
+
// Packed layout: 12 + 16 = 28 bytes
|
|
90
|
+
expect(buffer.type).toBe("struct");
|
|
91
|
+
expect(buffer.typedArrayElementSizeInBytes).toBe(28);
|
|
92
|
+
expect(buffer.capacity).toBe(1);
|
|
93
|
+
});
|
|
94
|
+
it("should show memory efficiency difference", () => {
|
|
95
|
+
const std140Schema = {
|
|
96
|
+
type: "object",
|
|
97
|
+
properties: {
|
|
98
|
+
position: Vec3Schema, // 12 bytes
|
|
99
|
+
normal: Vec3Schema // 12 bytes
|
|
100
|
+
},
|
|
101
|
+
layout: "std140"
|
|
102
|
+
};
|
|
103
|
+
const packedSchema = {
|
|
104
|
+
type: "object",
|
|
105
|
+
properties: {
|
|
106
|
+
position: Vec3Schema, // 12 bytes
|
|
107
|
+
normal: Vec3Schema // 12 bytes
|
|
108
|
+
},
|
|
109
|
+
layout: "packed"
|
|
110
|
+
};
|
|
111
|
+
const std140Buffer = createStructBuffer(std140Schema, 100);
|
|
112
|
+
const packedBuffer = createStructBuffer(packedSchema, 100);
|
|
113
|
+
// std140: 2 * 16 bytes = 32 bytes per element
|
|
114
|
+
// packed: 12 + 12 = 24 bytes per element
|
|
115
|
+
expect(packedBuffer.typedArrayElementSizeInBytes).toBeLessThan(std140Buffer.typedArrayElementSizeInBytes);
|
|
116
|
+
expect(packedBuffer.typedArrayElementSizeInBytes).toBe(24);
|
|
117
|
+
expect(std140Buffer.typedArrayElementSizeInBytes).toBe(32);
|
|
118
|
+
});
|
|
119
|
+
it("should work with primitive fields in packed layout", () => {
|
|
120
|
+
const schema = {
|
|
121
|
+
type: "object",
|
|
122
|
+
properties: {
|
|
123
|
+
id: { type: "integer", minimum: 0, maximum: 65535 }, // u32: 4 bytes
|
|
124
|
+
weight: F32Schema
|
|
125
|
+
},
|
|
126
|
+
layout: "packed"
|
|
127
|
+
};
|
|
128
|
+
const buffer = createStructBuffer(schema, 2);
|
|
129
|
+
// Packed: 4 + 4 = 8 bytes per element
|
|
130
|
+
expect(buffer.typedArrayElementSizeInBytes).toBe(8);
|
|
131
|
+
expect(buffer.capacity).toBe(2);
|
|
132
|
+
});
|
|
133
|
+
it("should work with arrayBuffer parameter for packed layout", () => {
|
|
134
|
+
const schema = {
|
|
135
|
+
type: "object",
|
|
136
|
+
properties: {
|
|
137
|
+
position: Vec3Schema, // 12 bytes
|
|
138
|
+
scale: F32Schema // 4 bytes
|
|
139
|
+
},
|
|
140
|
+
layout: "packed"
|
|
141
|
+
};
|
|
142
|
+
const arrayBuffer = new ArrayBuffer(96); // 6 * 16 bytes
|
|
143
|
+
const buffer = createStructBuffer(schema, arrayBuffer);
|
|
144
|
+
// Packed size: 16 bytes per element, so capacity should be 6
|
|
145
|
+
expect(buffer.capacity).toBe(6);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe("type safety", () => {
|
|
149
|
+
it("should accept Layout type for enhanced type safety", () => {
|
|
150
|
+
const schema = {
|
|
151
|
+
type: "object",
|
|
152
|
+
properties: {
|
|
153
|
+
value: F32Schema
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
// Demonstrate Layout type usage
|
|
157
|
+
const layouts = ["std140", "packed"];
|
|
158
|
+
layouts.forEach(layout => {
|
|
159
|
+
const schemaWithLayout = { ...schema, layout };
|
|
160
|
+
const buffer = createStructBuffer(schemaWithLayout, 1);
|
|
161
|
+
expect(buffer.type).toBe("struct");
|
|
162
|
+
});
|
|
163
|
+
// Type safety: This would cause a TypeScript error:
|
|
164
|
+
// const invalidLayout = "invalid" as Layout; // Expected error
|
|
165
|
+
// const buffer = createStructBuffer(schema, 1, invalidLayout);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe("backwards compatibility", () => {
|
|
169
|
+
it("should default to std140 layout when no layout specified", () => {
|
|
170
|
+
const schema = {
|
|
171
|
+
type: "object",
|
|
172
|
+
properties: {
|
|
173
|
+
a: F32Schema,
|
|
174
|
+
b: F32Schema
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const buffer = createStructBuffer(schema, 1);
|
|
178
|
+
// Should default to std140 (padded to vec4 = 16 bytes)
|
|
179
|
+
expect(buffer.typedArrayElementSizeInBytes).toBe(16);
|
|
180
|
+
});
|
|
181
|
+
it("should work with existing function signatures", () => {
|
|
182
|
+
const schema = {
|
|
183
|
+
type: "object",
|
|
184
|
+
properties: {
|
|
185
|
+
value: F32Schema
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
// Test both function signature forms
|
|
189
|
+
const buffer1 = createStructBuffer(schema, 5);
|
|
190
|
+
const buffer2 = createStructBuffer(schema, new ArrayBuffer(80)); // 5 * 16 bytes
|
|
191
|
+
expect(buffer1.capacity).toBe(5);
|
|
192
|
+
expect(buffer2.capacity).toBe(5);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe("vertex buffer use case", () => {
|
|
196
|
+
it("should be optimized for vertex data with packed layout", () => {
|
|
197
|
+
// Typical vertex format: position + color
|
|
198
|
+
const std140VertexSchema = {
|
|
199
|
+
type: "object",
|
|
200
|
+
properties: {
|
|
201
|
+
position: Vec3Schema, // 12 bytes for tight vertex packing
|
|
202
|
+
color: Vec4Schema // 16 bytes
|
|
203
|
+
},
|
|
204
|
+
layout: "std140"
|
|
205
|
+
};
|
|
206
|
+
const packedVertexSchema = {
|
|
207
|
+
type: "object",
|
|
208
|
+
properties: {
|
|
209
|
+
position: Vec3Schema, // 12 bytes for tight vertex packing
|
|
210
|
+
color: Vec4Schema // 16 bytes
|
|
211
|
+
},
|
|
212
|
+
layout: "packed"
|
|
213
|
+
};
|
|
214
|
+
const std140VertexBuffer = createStructBuffer(std140VertexSchema, 1000);
|
|
215
|
+
const packedVertexBuffer = createStructBuffer(packedVertexSchema, 1000);
|
|
216
|
+
// Calculate memory usage
|
|
217
|
+
const std140Memory = std140VertexBuffer.capacity * std140VertexBuffer.typedArrayElementSizeInBytes;
|
|
218
|
+
const packedMemory = packedVertexBuffer.capacity * packedVertexBuffer.typedArrayElementSizeInBytes;
|
|
219
|
+
// Packed should use less memory
|
|
220
|
+
expect(packedMemory).toBeLessThan(std140Memory);
|
|
221
|
+
// Verify the difference is sensible (12.5% reduction for vec3 + vec4)
|
|
222
|
+
const memorySavings = (std140Memory - packedMemory) / std140Memory;
|
|
223
|
+
expect(memorySavings).toBeCloseTo(0.125, 2); // 12.5% savings
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
//# sourceMappingURL=create-struct-buffer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-struct-buffer.test.js","sourceRoot":"","sources":["../../src/typed-buffer/create-struct-buffer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,9 @@ function createTypedBufferInternal(schema, initialCapacity) {
|
|
|
20
20
|
if (schema.type === 'number' || schema.type === 'integer') {
|
|
21
21
|
return createNumberBuffer(schema, initialCapacity);
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
// If schema has layout property, it should be treated as a struct layout
|
|
24
|
+
const shouldBeStruct = schema.layout !== undefined;
|
|
25
|
+
const structLayout = getStructLayout(schema, shouldBeStruct);
|
|
24
26
|
if (structLayout) {
|
|
25
27
|
return createStructBuffer(schema, initialCapacity);
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-typed-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-typed-buffer.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAU7D,MAAM,UAAU,iBAAiB,CAC7B,MAAS,EACT,uBAAkD;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,OAAO,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,yBAAyB,CAC9B,MAAS,EACT,eAAuB;IAGvB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACrF,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"create-typed-buffer.js","sourceRoot":"","sources":["../../src/typed-buffer/create-typed-buffer.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAU7D,MAAM,UAAU,iBAAiB,CAC7B,MAAS,EACT,uBAAkD;IAElD,IAAI,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,OAAO,yBAAyB,CAAI,MAAM,EAAE,uBAAuB,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,yBAAyB,CAC9B,MAAS,EACT,eAAuB;IAGvB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAA+B,CAAC;IACrF,CAAC;IAED,yEAAyE;IACzE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;IACnD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7D,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/*MIT License
|
|
2
|
+
|
|
3
|
+
© Copyright 2025 Adobe. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.*/
|
|
22
|
+
import { describe, it, expect } from "vitest";
|
|
23
|
+
import { createTypedBuffer } from "./create-typed-buffer.js";
|
|
24
|
+
describe("createTypedBuffer", () => {
|
|
25
|
+
describe("layout property runtime validation", () => {
|
|
26
|
+
it("should enforce struct layout when layout property is present", () => {
|
|
27
|
+
// Valid struct schema with layout
|
|
28
|
+
const validStructSchema = {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
position: {
|
|
32
|
+
type: "array",
|
|
33
|
+
items: { type: "number", precision: 1 },
|
|
34
|
+
minItems: 3,
|
|
35
|
+
maxItems: 3
|
|
36
|
+
},
|
|
37
|
+
color: {
|
|
38
|
+
type: "array",
|
|
39
|
+
items: { type: "number", precision: 1 },
|
|
40
|
+
minItems: 4,
|
|
41
|
+
maxItems: 4
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
layout: "packed"
|
|
45
|
+
};
|
|
46
|
+
// Should work fine - this is a valid struct with layout
|
|
47
|
+
const buffer = createTypedBuffer(validStructSchema, 10);
|
|
48
|
+
expect(buffer.type).toBe("struct");
|
|
49
|
+
expect(buffer.capacity).toBe(10);
|
|
50
|
+
});
|
|
51
|
+
it("should throw error for invalid schemas with layout property", () => {
|
|
52
|
+
// Invalid schema: has layout but not a proper struct
|
|
53
|
+
const invalidSchema = {
|
|
54
|
+
type: "array", // Wrong type for layout property
|
|
55
|
+
items: { type: "number" },
|
|
56
|
+
layout: "packed" // This should cause error
|
|
57
|
+
};
|
|
58
|
+
// Should throw error because we're enforcing struct validation
|
|
59
|
+
expect(() => {
|
|
60
|
+
createTypedBuffer(invalidSchema, 10);
|
|
61
|
+
}).toThrow(/Array must have fixed length/);
|
|
62
|
+
});
|
|
63
|
+
it("should throw specific error for invalid array schemas with layout", () => {
|
|
64
|
+
// Array without single item type
|
|
65
|
+
const invalidArraySchema1 = {
|
|
66
|
+
type: "array",
|
|
67
|
+
layout: "packed"
|
|
68
|
+
};
|
|
69
|
+
expect(() => {
|
|
70
|
+
createTypedBuffer(invalidArraySchema1, 10);
|
|
71
|
+
}).toThrow(/Array schema must have single item type/);
|
|
72
|
+
// Array without fixed length
|
|
73
|
+
const invalidArraySchema2 = {
|
|
74
|
+
type: "array",
|
|
75
|
+
items: { type: "number" },
|
|
76
|
+
layout: "packed"
|
|
77
|
+
};
|
|
78
|
+
expect(() => {
|
|
79
|
+
createTypedBuffer(invalidArraySchema2, 10);
|
|
80
|
+
}).toThrow(/Array must have fixed length/);
|
|
81
|
+
});
|
|
82
|
+
it("should throw specific error for invalid object schemas with layout", () => {
|
|
83
|
+
// Object without properties
|
|
84
|
+
const invalidObjectSchema = {
|
|
85
|
+
type: "object",
|
|
86
|
+
layout: "packed"
|
|
87
|
+
};
|
|
88
|
+
expect(() => {
|
|
89
|
+
createTypedBuffer(invalidObjectSchema, 10);
|
|
90
|
+
}).toThrow(/Schema must be an object type with properties definition/);
|
|
91
|
+
// Object with invalid field
|
|
92
|
+
const invalidFieldSchema = {
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: {
|
|
95
|
+
invalidField: { type: "string" } // Not a valid struct type
|
|
96
|
+
},
|
|
97
|
+
layout: "packed"
|
|
98
|
+
};
|
|
99
|
+
expect(() => {
|
|
100
|
+
createTypedBuffer(invalidFieldSchema, 10);
|
|
101
|
+
}).toThrow(/Field "invalidField" is not a valid struct type/);
|
|
102
|
+
});
|
|
103
|
+
it("should work normally for schemas without layout property", () => {
|
|
104
|
+
// Schema without layout should fall back to normal logic
|
|
105
|
+
const arraySchema = {
|
|
106
|
+
type: "array",
|
|
107
|
+
items: { type: "number" }
|
|
108
|
+
};
|
|
109
|
+
const buffer = createTypedBuffer(arraySchema, 10);
|
|
110
|
+
expect(buffer.type).toBe("array");
|
|
111
|
+
expect(buffer.capacity).toBe(10);
|
|
112
|
+
});
|
|
113
|
+
it("should handle number schemas with layout property", () => {
|
|
114
|
+
// Number schema with layout should still validate properly
|
|
115
|
+
const numberSchema = {
|
|
116
|
+
type: "number",
|
|
117
|
+
layout: "packed" // This shouldn't interfere with number creation
|
|
118
|
+
};
|
|
119
|
+
// Number schemas are handled before struct validation
|
|
120
|
+
const buffer = createTypedBuffer(numberSchema, 10);
|
|
121
|
+
expect(buffer.type).toBe("number");
|
|
122
|
+
expect(buffer.capacity).toBe(10);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe("basic functionality", () => {
|
|
126
|
+
it("should create typed buffer from capacity", () => {
|
|
127
|
+
const schema = {
|
|
128
|
+
type: "array",
|
|
129
|
+
items: { type: "number" }
|
|
130
|
+
};
|
|
131
|
+
const buffer = createTypedBuffer(schema, 20);
|
|
132
|
+
expect(buffer.capacity).toBe(20);
|
|
133
|
+
});
|
|
134
|
+
it("should create typed buffer from initial values", () => {
|
|
135
|
+
const schema = {
|
|
136
|
+
type: "array",
|
|
137
|
+
items: { type: "number" }
|
|
138
|
+
};
|
|
139
|
+
const initialValues = [[1], [2], [3]];
|
|
140
|
+
const buffer = createTypedBuffer(schema, initialValues);
|
|
141
|
+
expect(buffer.capacity).toBe(3);
|
|
142
|
+
expect(buffer.get(0)).toEqual([1]);
|
|
143
|
+
expect(buffer.get(1)).toEqual([2]);
|
|
144
|
+
expect(buffer.get(2)).toEqual([3]);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=create-typed-buffer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-typed-buffer.test.js","sourceRoot":"","sources":["../../src/typed-buffer/create-typed-buffer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Schema } from "../../schema/schema.js";
|
|
2
2
|
import type { StructLayout } from "./struct-layout.js";
|
|
3
3
|
export declare function getStructLayout(schema: Schema): StructLayout;
|
|
4
|
-
export declare function getStructLayout(schema: Schema, throwError: true): StructLayout;
|
|
5
4
|
export declare function getStructLayout(schema: Schema, throwError: boolean): StructLayout | null;
|