Skip to content

Commit

Permalink
Merge branch 'main' into protocol-squad
Browse files Browse the repository at this point in the history
Signed-off-by: Lean Mendoza <[email protected]>
  • Loading branch information
leanmendoza authored Sep 18, 2024
2 parents 1be6793 + 5bfdcc5 commit 0959ddd
Show file tree
Hide file tree
Showing 37 changed files with 616 additions and 2,148 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ jobs:
run: make prepare

- name: 'Upload Artifact'
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: built-artifacts
path: 'packages/**/*.tgz'
Expand Down
54 changes: 54 additions & 0 deletions packages/@dcl/ecs/src/components/extended/VirtualCamera.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { IEngine, LastWriteWinElementSetComponentDefinition } from '../../engine'
import { PBVirtualCamera, VirtualCamera } from '../generated/index.gen'
import { CameraTransition } from '../generated/pb/decentraland/sdk/components/common/camera_transition.gen'

/**
* @public
*/
export interface CameraTransitionHelper {
/**
* @returns a CameraTransition speed
*/
Speed: (speed: number) => CameraTransition['transitionMode']
/**
* @returns a CameraTransition time
*/
Time: (time: number) => CameraTransition['transitionMode']
}

/**
* @public
*/
export interface VirtualCameraComponentDefinitionExtended
extends LastWriteWinElementSetComponentDefinition<PBVirtualCamera> {
/**
* Camera transition helper for time and speed modes
*/
Transition: CameraTransitionHelper
}

const CameraTransitionHelper: CameraTransitionHelper = {
Speed(speed) {
return {
$case: 'speed' as const,
speed
}
},
Time(time) {
return {
$case: 'time' as const,
time
}
}
}

export function defineVirtualCameraComponent(
engine: Pick<IEngine, 'defineComponentFromSchema'>
): VirtualCameraComponentDefinitionExtended {
const theComponent = VirtualCamera(engine)

return {
...theComponent,
Transition: CameraTransitionHelper
}
}
5 changes: 5 additions & 0 deletions packages/@dcl/ecs/src/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import defineNetworkParent, { INetowrkParentType } from './manual/NetworkParent'
import { defineTransformComponent, TransformComponentExtended } from './manual/Transform'
import { AudioStreamComponentDefinitionExtended, defineAudioStreamComponent } from './extended/AudioStream'
import { MediaState } from './generated/pb/decentraland/sdk/components/common/media_state.gen'
import { defineVirtualCameraComponent, VirtualCameraComponentDefinitionExtended } from './extended/VirtualCamera'

export * from './generated/index.gen'

Expand Down Expand Up @@ -55,6 +56,10 @@ export const MeshCollider: LwwComponentGetter<MeshColliderComponentDefinitionExt
/* @__PURE__ */
export const Tween: LwwComponentGetter<TweenComponentDefinitionExtended> = (engine) => defineTweenComponent(engine)

/* @__PURE__ */
export const VirtualCamera: LwwComponentGetter<VirtualCameraComponentDefinitionExtended> = (engine) =>
defineVirtualCameraComponent(engine)

/**
* @alpha
*/
Expand Down
1 change: 1 addition & 0 deletions packages/@dcl/ecs/src/components/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export type { MeshRendererComponentDefinitionExtended } from './extended/MeshRen
export type { MeshColliderComponentDefinitionExtended } from './extended/MeshCollider'
export type { TextureHelper, MaterialComponentDefinitionExtended } from './extended/Material'
export type { TweenHelper, TweenComponentDefinitionExtended } from './extended/Tween'
export type { CameraTransitionHelper, VirtualCameraComponentDefinitionExtended } from './extended/VirtualCamera'
export type { TransformComponentExtended, TransformTypeWithOptionals } from './manual/Transform'
export type { NameComponent, NameType } from './manual/Name'
export type { ISyncComponents, ISyncComponentsType } from './manual/SyncComponents'
Expand Down
2 changes: 1 addition & 1 deletion packages/@dcl/ecs/src/engine/component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ export interface BaseComponent<T> {
*
* @internal
*/
__onChangeCallbacks(entity: Entity): ((value: any) => void) | undefined
__onChangeCallbacks(entity: Entity, value: T): void

/**
* @public
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export function createValueSetComponentDefinitionFromSchema<T>(
const data = new Map<Entity, InternalDatastructure>()
const dirtyIterator = new Set<Entity>()
const queuedCommands: AppendValueMessageBody[] = []
const onChangeCallbacks = new Map<Entity, (data: T | undefined) => void>()
const onChangeCallbacks = new Map<Entity, ((data: T | undefined) => void)[]>()

// only sort the array if the latest (N) element has a timestamp <= N-1
function shouldSort(row: InternalDatastructure) {
Expand Down Expand Up @@ -170,10 +170,16 @@ export function createValueSetComponentDefinitionFromSchema<T>(
}
},
onChange(entity, cb) {
onChangeCallbacks.set(entity, cb)
const cbs = onChangeCallbacks.get(entity) ?? []
cbs.push(cb)
onChangeCallbacks.set(entity, cbs)
},
__onChangeCallbacks(entity) {
return onChangeCallbacks.get(entity)
__onChangeCallbacks(entity, value) {
const cbs = onChangeCallbacks.get(entity)
if (!cbs) return
for (const cb of cbs) {
cb(value)
}
}
}

Expand Down
10 changes: 2 additions & 8 deletions packages/@dcl/ecs/src/engine/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -269,16 +269,10 @@ export function Engine(options?: IEngineOptions): IEngine {
const onChangeFunction: OnChangeFunction = (entity, operation, component, componentValue) => {
if (operation === CrdtMessageType.DELETE_ENTITY) {
for (const component of partialEngine.componentsIter()) {
const onChange = component?.__onChangeCallbacks(entity)
if (onChange) {
onChange(undefined)
}
component?.__onChangeCallbacks(entity, undefined)
}
} else {
const onChange = component?.__onChangeCallbacks(entity)
if (onChange) {
onChange(componentValue)
}
component?.__onChangeCallbacks(entity, componentValue)
}
return options?.onChangeFunction(entity, operation, component, componentValue)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ export function createComponentDefinitionFromSchema<T>(
const data = new Map<Entity, T>()
const dirtyIterator = new Set<Entity>()
const timestamps = new Map<Entity, number>()
const onChangeCallbacks = new Map<Entity, (data: T | undefined) => void>()
const onChangeCallbacks = new Map<Entity, ((data: T | undefined) => void)[]>()

return {
get componentId() {
Expand Down Expand Up @@ -319,10 +319,16 @@ export function createComponentDefinitionFromSchema<T>(
updateFromCrdt: createUpdateLwwFromCrdt(componentId, timestamps, schema, data),
dumpCrdtStateToBuffer: createDumpLwwFunctionFromCrdt(componentId, timestamps, schema, data),
onChange(entity, cb) {
onChangeCallbacks.set(entity, cb)
const cbs = onChangeCallbacks.get(entity) ?? []
cbs.push(cb)
onChangeCallbacks.set(entity, cbs)
},
__onChangeCallbacks(entity) {
return onChangeCallbacks.get(entity)
__onChangeCallbacks(entity, value) {
const cbs = onChangeCallbacks.get(entity)
if (!cbs) return
for (const cb of cbs) {
cb(value)
}
}
}
}
4 changes: 3 additions & 1 deletion packages/@dcl/ecs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ import {
ISyncComponents,
TweenComponentDefinitionExtended,
INetowrkEntity,
INetowrkParent
INetowrkParent,
VirtualCameraComponentDefinitionExtended
} from './components/types'
import { NameComponent } from './components/manual/Name'

Expand All @@ -45,6 +46,7 @@ export const MeshRenderer: MeshRendererComponentDefinitionExtended = /* @__PURE_
export const MeshCollider: MeshColliderComponentDefinitionExtended = /* @__PURE__*/ components.MeshCollider(engine)
export const Name: NameComponent = components.Name(engine)
export const Tween: TweenComponentDefinitionExtended = /* @__PURE__*/ components.Tween(engine)
export const VirtualCamera: VirtualCameraComponentDefinitionExtended = /* @__PURE__*/ components.VirtualCamera(engine)
/**
* @alpha
* This is going to be used for sync components through a server.
Expand Down
12 changes: 7 additions & 5 deletions packages/@dcl/ecs/src/serialization/crdt/network/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,23 +63,25 @@ export function localMessageToNetwork(
destinationBuffer.writeBuffer(buffer.buffer().subarray(offset, buffer.currentWriteOffset()), false)
}

const buffer = new ReadWriteByteBuffer()
/* istanbul ignore next */
export function fixTransformParent(
message: ReceiveMessage,
transformValue?: TransformType,
parent?: Entity
): Uint8Array {
buffer.resetBuffer()
let transform = transformValue
const buffer = new ReadWriteByteBuffer()

if (!transform && 'data' in message) {
buffer.writeBuffer(message.data)
transform = TransformSchema.deserialize(buffer)
buffer.resetBuffer()
transform = TransformSchema.deserialize(new ReadWriteByteBuffer(message.data))
}

if (!transform) throw new Error('Invalid parent transform')

// Generate new transform raw data with the parent
const newTransform = { ...transform, parent }
buffer.resetBuffer()

TransformSchema.serialize(newTransform, buffer)
return buffer.toBinary()
}
Loading

0 comments on commit 0959ddd

Please sign in to comment.