Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 43 additions & 5 deletions dist/legacy/index.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ var getShadow = (shadowMap, array) => {
if (ArrayBuffer.isView(array)) {
shadow = new array.constructor(array.length);
} else {
shadow = new Array(array.length).fill(0);
shadow = new Array(array.length);
}
shadowMap.set(array, shadow);
}
Expand All @@ -252,8 +252,20 @@ var getShadow = (shadowMap, array) => {
var hasChanged = (shadowMap, array, index, epsilon = 1e-4) => {
const shadow = getShadow(shadowMap, array);
const currentValue = array[index];
const shadowValue = shadow[index];
if (currentValue === void 0 && shadowValue === void 0) {
return false;
}
if (shadowValue === void 0) {
shadow[index] = currentValue;
return true;
}
if (currentValue === void 0) {
shadow[index] = void 0;
return true;
}
const actualEpsilon = getEpsilonForType(array, epsilon);
const changed = actualEpsilon > 0 ? Math.abs(shadow[index] - currentValue) > actualEpsilon : shadow[index] !== currentValue;
const changed = actualEpsilon > 0 ? Math.abs(shadowValue - currentValue) > actualEpsilon : shadowValue !== currentValue;
shadow[index] = currentValue;
return changed;
};
Expand Down Expand Up @@ -420,16 +432,27 @@ var createComponentDeserializer = (component, diff = false) => {
return bytesRead;
};
};
var clearEntityShadow = (shadowMap, eid) => {
for (const shadow of shadowMap.values()) {
shadow[eid] = void 0;
}
};
var createSoASerializer = (components, options = {}) => {
const {
diff = false,
buffer = new ArrayBuffer(1024 * 1024 * 100),
epsilon = 1e-4
epsilon = 1e-4,
getRemovals
} = options;
const view = new DataView(buffer);
const shadowMap = diff ? /* @__PURE__ */ new Map() : void 0;
const componentSerializers = components.map((component) => createComponentSerializer(component, diff, shadowMap, epsilon));
return (indices) => {
const serialize = (indices) => {
if (diff && shadowMap && getRemovals) {
for (const eid of getRemovals()) {
clearEntityShadow(shadowMap, eid);
}
}
let offset = 0;
for (let i = 0; i < indices.length; i++) {
const index = indices[i];
Expand All @@ -439,6 +462,11 @@ var createSoASerializer = (components, options = {}) => {
}
return buffer.slice(0, offset);
};
const result = serialize;
if (diff && shadowMap) {
result.clearEntity = (eid) => clearEntityShadow(shadowMap, eid);
}
return result;
};
var createSoADeserializer = (components, options = {}) => {
const { diff = false } = options;
Expand Down Expand Up @@ -569,12 +597,14 @@ var createObserverSerializer = (world, networkedTag, components, options = {}) =
let offset = 0;
const queue = [];
const relationTargets = /* @__PURE__ */ new Map();
const removedEntities = /* @__PURE__ */ new Set();
(0, import_bitecs.observe)(world, (0, import_bitecs.onAdd)(networkedTag), (eid) => {
queue.push([eid, 0 /* AddEntity */, -1]);
});
(0, import_bitecs.observe)(world, (0, import_bitecs.onRemove)(networkedTag), (eid) => {
queue.push([eid, 1 /* RemoveEntity */, -1]);
relationTargets.delete(eid);
removedEntities.add(eid);
});
components.forEach((component, i) => {
if ((0, import_bitecs.isRelation)(component)) {
Expand Down Expand Up @@ -611,7 +641,7 @@ var createObserverSerializer = (world, networkedTag, components, options = {}) =
});
}
});
return () => {
const serialize = () => {
offset = 0;
for (let i = 0; i < queue.length; i++) {
const [entityId, type, componentId, targetId, relationData] = queue[i];
Expand All @@ -634,6 +664,14 @@ var createObserverSerializer = (world, networkedTag, components, options = {}) =
queue.length = 0;
return backingBuffer.slice(0, offset);
};
const getRemovals = () => {
const result = new Set(removedEntities);
removedEntities.clear();
return result;
};
const serializerFn = serialize;
serializerFn.getRemovals = getRemovals;
return serializerFn;
};
var createObserverDeserializer = (world, networkedTag, components, options = {}) => {
let entityIdMapping = options.idMap || /* @__PURE__ */ new Map();
Expand Down
4 changes: 2 additions & 2 deletions dist/legacy/index.cjs.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/legacy/index.min.cjs

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dist/legacy/index.min.cjs.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/legacy/index.min.mjs

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dist/legacy/index.min.mjs.map

Large diffs are not rendered by default.

48 changes: 43 additions & 5 deletions dist/legacy/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ var getShadow = (shadowMap, array) => {
if (ArrayBuffer.isView(array)) {
shadow = new array.constructor(array.length);
} else {
shadow = new Array(array.length).fill(0);
shadow = new Array(array.length);
}
shadowMap.set(array, shadow);
}
Expand All @@ -235,8 +235,20 @@ var getShadow = (shadowMap, array) => {
var hasChanged = (shadowMap, array, index, epsilon = 1e-4) => {
const shadow = getShadow(shadowMap, array);
const currentValue = array[index];
const shadowValue = shadow[index];
if (currentValue === void 0 && shadowValue === void 0) {
return false;
}
if (shadowValue === void 0) {
shadow[index] = currentValue;
return true;
}
if (currentValue === void 0) {
shadow[index] = void 0;
return true;
}
const actualEpsilon = getEpsilonForType(array, epsilon);
const changed = actualEpsilon > 0 ? Math.abs(shadow[index] - currentValue) > actualEpsilon : shadow[index] !== currentValue;
const changed = actualEpsilon > 0 ? Math.abs(shadowValue - currentValue) > actualEpsilon : shadowValue !== currentValue;
shadow[index] = currentValue;
return changed;
};
Expand Down Expand Up @@ -403,16 +415,27 @@ var createComponentDeserializer = (component, diff = false) => {
return bytesRead;
};
};
var clearEntityShadow = (shadowMap, eid) => {
for (const shadow of shadowMap.values()) {
shadow[eid] = void 0;
}
};
var createSoASerializer = (components, options = {}) => {
const {
diff = false,
buffer = new ArrayBuffer(1024 * 1024 * 100),
epsilon = 1e-4
epsilon = 1e-4,
getRemovals
} = options;
const view = new DataView(buffer);
const shadowMap = diff ? /* @__PURE__ */ new Map() : void 0;
const componentSerializers = components.map((component) => createComponentSerializer(component, diff, shadowMap, epsilon));
return (indices) => {
const serialize = (indices) => {
if (diff && shadowMap && getRemovals) {
for (const eid of getRemovals()) {
clearEntityShadow(shadowMap, eid);
}
}
let offset = 0;
for (let i = 0; i < indices.length; i++) {
const index = indices[i];
Expand All @@ -422,6 +445,11 @@ var createSoASerializer = (components, options = {}) => {
}
return buffer.slice(0, offset);
};
const result = serialize;
if (diff && shadowMap) {
result.clearEntity = (eid) => clearEntityShadow(shadowMap, eid);
}
return result;
};
var createSoADeserializer = (components, options = {}) => {
const { diff = false } = options;
Expand Down Expand Up @@ -552,12 +580,14 @@ var createObserverSerializer = (world, networkedTag, components, options = {}) =
let offset = 0;
const queue = [];
const relationTargets = /* @__PURE__ */ new Map();
const removedEntities = /* @__PURE__ */ new Set();
observe(world, onAdd(networkedTag), (eid) => {
queue.push([eid, 0 /* AddEntity */, -1]);
});
observe(world, onRemove(networkedTag), (eid) => {
queue.push([eid, 1 /* RemoveEntity */, -1]);
relationTargets.delete(eid);
removedEntities.add(eid);
});
components.forEach((component, i) => {
if (isRelation(component)) {
Expand Down Expand Up @@ -594,7 +624,7 @@ var createObserverSerializer = (world, networkedTag, components, options = {}) =
});
}
});
return () => {
const serialize = () => {
offset = 0;
for (let i = 0; i < queue.length; i++) {
const [entityId, type, componentId, targetId, relationData] = queue[i];
Expand All @@ -617,6 +647,14 @@ var createObserverSerializer = (world, networkedTag, components, options = {}) =
queue.length = 0;
return backingBuffer.slice(0, offset);
};
const getRemovals = () => {
const result = new Set(removedEntities);
removedEntities.clear();
return result;
};
const serializerFn = serialize;
serializerFn.getRemovals = getRemovals;
return serializerFn;
};
var createObserverDeserializer = (world, networkedTag, components, options = {}) => {
let entityIdMapping = options.idMap || /* @__PURE__ */ new Map();
Expand Down
4 changes: 2 additions & 2 deletions dist/legacy/index.mjs.map

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion dist/serialization/ObserverSerializer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { World, ComponentRef } from 'bitecs';
export type ObserverSerializerOptions = {
buffer?: ArrayBuffer;
};
export declare const createObserverSerializer: (world: World, networkedTag: ComponentRef, components: ComponentRef[], options?: ObserverSerializerOptions) => () => ArrayBuffer;
export declare const createObserverSerializer: (world: World, networkedTag: ComponentRef, components: ComponentRef[], options?: ObserverSerializerOptions) => ObserverSerializerFunction;
export type ObserverSerializerFunction = {
(): ArrayBuffer;
getRemovals: () => Set<number>;
};
export type ObserverDeserializerOptions = {
idMap?: Map<number, number>;
};
Expand Down
2 changes: 1 addition & 1 deletion dist/serialization/ObserverSerializer.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion dist/serialization/SoASerializer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ export type SoASerializerOptions = {
diff?: boolean;
buffer?: ArrayBuffer;
epsilon?: number;
getRemovals?: () => Set<number>;
};
export declare const createSoASerializer: (components: (ComponentRef | PrimitiveBrand | TypedArray | ArrayType<any>)[], options?: SoASerializerOptions) => SoASerializerFunction;
export type SoASerializerFunction = {
(indices: number[] | readonly number[]): ArrayBuffer;
clearEntity?: (eid: number) => void;
};
export declare const createSoASerializer: (components: (ComponentRef | PrimitiveBrand | TypedArray | ArrayType<any>)[], options?: SoASerializerOptions) => (indices: number[] | readonly number[]) => ArrayBuffer;
export type SoADeserializerOptions = {
diff?: boolean;
};
Expand Down
2 changes: 1 addition & 1 deletion dist/serialization/SoASerializer.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading