@dcl/ecs
Version:
Decentraland ECS
107 lines (106 loc) • 3.45 kB
JavaScript
/**
* @internal
*/
export const COMPONENT_ID = 1;
/** @internal */
export const TRANSFORM_LENGTH = 44;
/** @internal */
export const TransformSchema = {
serialize(value, builder) {
const ptr = builder.incrementWriteOffset(TRANSFORM_LENGTH);
builder.setFloat32(ptr, value.position.x);
builder.setFloat32(ptr + 4, value.position.y);
builder.setFloat32(ptr + 8, value.position.z);
builder.setFloat32(ptr + 12, value.rotation.x);
builder.setFloat32(ptr + 16, value.rotation.y);
builder.setFloat32(ptr + 20, value.rotation.z);
builder.setFloat32(ptr + 24, value.rotation.w);
builder.setFloat32(ptr + 28, value.scale.x);
builder.setFloat32(ptr + 32, value.scale.y);
builder.setFloat32(ptr + 36, value.scale.z);
builder.setUint32(ptr + 40, value.parent || 0);
},
deserialize(reader) {
const ptr = reader.incrementReadOffset(TRANSFORM_LENGTH);
return {
position: {
x: reader.getFloat32(ptr),
y: reader.getFloat32(ptr + 4),
z: reader.getFloat32(ptr + 8)
},
rotation: {
x: reader.getFloat32(ptr + 12),
y: reader.getFloat32(ptr + 16),
z: reader.getFloat32(ptr + 20),
w: reader.getFloat32(ptr + 24)
},
scale: {
x: reader.getFloat32(ptr + 28),
y: reader.getFloat32(ptr + 32),
z: reader.getFloat32(ptr + 36)
},
parent: reader.getUint32(ptr + 40)
};
},
create() {
return {
position: { x: 0, y: 0, z: 0 },
scale: { x: 1, y: 1, z: 1 },
rotation: { x: 0, y: 0, z: 0, w: 1 },
parent: 0
};
},
extend(value) {
return {
position: { x: 0, y: 0, z: 0 },
scale: { x: 1, y: 1, z: 1 },
rotation: { x: 0, y: 0, z: 0, w: 1 },
parent: 0,
...value
};
},
jsonSchema: {
type: 'object',
properties: {
position: {
type: 'object',
properties: {
x: { type: 'number' },
y: { type: 'number' },
z: { type: 'number' }
}
},
scale: {
type: 'object',
properties: {
x: { type: 'number' },
y: { type: 'number' },
z: { type: 'number' }
}
},
rotation: {
type: 'object',
properties: {
x: { type: 'number' },
y: { type: 'number' },
z: { type: 'number' },
w: { type: 'number' }
}
},
parent: { type: 'integer' }
},
serializationType: 'transform'
}
};
export function defineTransformComponent(engine) {
const transformDef = engine.defineComponentFromSchema('core::Transform', TransformSchema);
return {
...transformDef,
create(entity, val) {
return transformDef.create(entity, TransformSchema.extend(val));
},
createOrReplace(entity, val) {
return transformDef.createOrReplace(entity, TransformSchema.extend(val));
}
};
}