diff --git a/packages/functional-tests/src/tests/physics-dynamic-and-kinematic.ts b/packages/functional-tests/src/tests/physics-dynamic-and-kinematic.ts index 6854aa829..ae8621630 100644 --- a/packages/functional-tests/src/tests/physics-dynamic-and-kinematic.ts +++ b/packages/functional-tests/src/tests/physics-dynamic-and-kinematic.ts @@ -7,8 +7,6 @@ import * as MRE from '@microsoft/mixed-reality-extension-sdk'; import { App } from '../app'; import { Test } from '../test'; -import { Vector3, Actor } from '@microsoft/mixed-reality-extension-sdk'; -import { int } from '../../../common/src/math/types'; export default class PhysicsDynamicVsKinematicTest extends Test { diff --git a/packages/sdk/src/actor/physics/physicsBridge.ts b/packages/sdk/src/actor/physics/physicsBridge.ts index 9d43b951b..fa14c3b50 100644 --- a/packages/sdk/src/actor/physics/physicsBridge.ts +++ b/packages/sdk/src/actor/physics/physicsBridge.ts @@ -4,6 +4,7 @@ */ import { Guid } from "../../util"; +import { TransformLike } from ".."; export type PhysicsBridgeTransformUpdate = { id: Guid; @@ -12,3 +13,15 @@ export type PhysicsBridgeTransformUpdate = { flags: number; transformsBlob: string; } + +export type PhysicsServerOneTransformsUpdate = { + localTransform: TransformLike; + appTransform: TransformLike; + actorGuid: Guid; +} + +export type PhysicsUploadServerTransformsUpdate = { + id: Guid; + transformCount: number; + updates: PhysicsServerOneTransformsUpdate[]; +} diff --git a/packages/sdk/src/core/contextInternal.ts b/packages/sdk/src/core/contextInternal.ts index 630a938af..894e6e432 100644 --- a/packages/sdk/src/core/contextInternal.ts +++ b/packages/sdk/src/core/contextInternal.ts @@ -35,7 +35,7 @@ import { Payloads, Protocols, } from '../internal'; -import { PhysicsBridgeTransformUpdate } from '../actor/physics/physicsBridge'; +import { PhysicsBridgeTransformUpdate, PhysicsUploadServerTransformsUpdate } from '../actor/physics/physicsBridge'; /** * @hidden @@ -290,6 +290,8 @@ export class ContextInternal { execution.on('protocol.update-user', this.updateUser.bind(this)); execution.on('protocol.perform-action', this.performAction.bind(this)); execution.on('protocol.physicsbridge-update-transforms', this.updatePhysicsBridgeTransforms.bind(this)); + execution.on('protocol.physicsbridge-server-transforms-upload', + this.updatePhysicsServerTransformsUpload.bind(this)); execution.on('protocol.receive-rpc', this.receiveRPC.bind(this)); execution.on('protocol.collision-event-raised', this.collisionEventRaised.bind(this)); execution.on('protocol.trigger-event-raised', this.triggerEventRaised.bind(this)); @@ -437,6 +439,11 @@ export class ContextInternal { this.context.emitter.emit('physicsbridge-transforms-update', transforms); } + public updatePhysicsServerTransformsUpload(transforms: Partial){ + if (!transforms) { return; } + this.context.emitter.emit('physicsbridge-server-transforms-upload', transforms); + } + public updateAnimations(animPatches: Array>) { if (!animPatches) { return; } const newAnims: Animation[] = []; diff --git a/packages/sdk/src/internal/adapters/multipeer/rules.ts b/packages/sdk/src/internal/adapters/multipeer/rules.ts index 032e608ba..baad9111c 100644 --- a/packages/sdk/src/internal/adapters/multipeer/rules.ts +++ b/packages/sdk/src/internal/adapters/multipeer/rules.ts @@ -823,6 +823,62 @@ export const Rules: { [id in Payloads.PayloadType]: Rule } = { } }, + // ======================================================================== + 'physicsbridge-server-transforms-upload': { + ...DefaultRule, + synchronization: { + stage: 'always', + before: 'ignore', + during: 'queue', + after: 'allow' + }, + client: { + ...DefaultRule.client, + beforeQueueMessageForClient: ( + session: Session, + client: Client, + message: Message, + promise: ExportedPromise + ) => { + + return message; + }, + shouldSendToUser: (message: Message, userId, session, client) => { + // this is just upload do not sending anything to clients + return false; + } + }, + session: { + ...DefaultRule.session, + beforeReceiveFromApp: ( + session: Session, + message: Message + ) => { + + return message; + }, + beforeReceiveFromClient: ( + session: Session, + client: Client, + message: Message + ) => { + // update directly the transforms + for (const entry of message.payload.physicsTranformServer.updates) { + const syncActor = session.actorSet.get(entry.actorGuid); + if (syncActor) { + syncActor.initialization.message.payload.actor.transform.app = entry.appTransform; + syncActor.initialization.message.payload.actor.transform.local.position = + entry.localTransform.position; + syncActor.initialization.message.payload.actor.transform.local.rotation = + entry.localTransform.rotation; + } + } + + return message; + } + } + }, + // ======================================================================== 'rigidbody-add-force': { ...DefaultRule, diff --git a/packages/sdk/src/internal/payloads/payloads.ts b/packages/sdk/src/internal/payloads/payloads.ts index 7062f0322..5563fcfff 100644 --- a/packages/sdk/src/internal/payloads/payloads.ts +++ b/packages/sdk/src/internal/payloads/payloads.ts @@ -50,6 +50,7 @@ export type PayloadType | 'operation-result' | 'perform-action' | 'physicsbridge-transforms-update' + | 'physicsbridge-server-transforms-upload' | 'rigidbody-add-force' | 'rigidbody-add-force-at-position' | 'rigidbody-add-relative-torque' diff --git a/packages/sdk/src/internal/payloads/physics.ts b/packages/sdk/src/internal/payloads/physics.ts index 065a9dc55..c86389f4b 100644 --- a/packages/sdk/src/internal/payloads/physics.ts +++ b/packages/sdk/src/internal/payloads/physics.ts @@ -13,7 +13,8 @@ import { Vector3Like } from '../..'; import { - PhysicsBridgeTransformUpdate + PhysicsBridgeTransformUpdate, + PhysicsUploadServerTransformsUpdate } from '../../actor/physics/physicsBridge'; /** @@ -106,4 +107,9 @@ export type TriggerEventRaised = Payloads.Payload & { export type PhysicsBridgeUpdate = Payloads.Payload & { type: 'physicsbridge-transforms-update'; transforms: Partial; -} +}; + +export type PhysicsUploadServerUpdate = Payloads.Payload & { + type: 'physicsbridge-server-transforms-upload'; + physicsTranformServer: Partial; +}; diff --git a/packages/sdk/src/internal/protocols/execution.ts b/packages/sdk/src/internal/protocols/execution.ts index 1d5e88a84..39410ef6c 100644 --- a/packages/sdk/src/internal/protocols/execution.ts +++ b/packages/sdk/src/internal/protocols/execution.ts @@ -121,6 +121,11 @@ export class Execution extends Protocol { this.emit('protocol.physicsbridge-update-transforms', [payload.transforms]); }; + /** @private */ + public 'recv-physicsbridge-server-transforms-upload' = (payload: Payloads.PhysicsUploadServerUpdate) => { + this.emit('protocol.physicsbridge-server-transforms-upload', [payload.physicsTranformServer]); + }; + /** @private */ public 'recv-collision-event-raised' = (payload: Payloads.CollisionEventRaised) => { this.emit('protocol.collision-event-raised', {