Type Definitions
All types exported from the vrm module of @hmcs/sdk.
import { Vrm, repeat, VrmEventSource } from "@hmcs/sdk";
Core
Bones
type Bones =
| "hips" | "spine" | "chest" | "neck" | "head"
| "leftShoulder" | "leftArm" | "leftForeArm" | "leftHand"
| "rightShoulder" | "rightArm" | "rightForeArm" | "rightHand"
| "leftUpLeg" | "leftLeg" | "leftFoot"
| "rightUpLeg" | "rightLeg" | "rightFoot";
PositionResponse
interface PositionResponse {
/** Global screen coordinates (multi-monitor origin at leftmost screen). Null if not visible. */
globalViewport: [number, number] | null;
/** Bevy world coordinates. */
world: Vec3;
}
SpawnVrmOptions
interface SpawnVrmOptions {
transform?: TransformArgs;
persona?: Persona;
}
VrmSnapshot
interface VrmSnapshot {
entity: number;
name: string;
state: string;
transform: Transform;
globalViewport: [number, number] | null;
expressions: ExpressionsResponse;
animations: VrmaInfo[];
lookAt: LookAtState | null;
linkedWebviews: number[];
persona: Persona;
}
VrmMetadata
interface VrmMetadata {
name: string;
entity: number;
}
MoveToArgs
/** Arguments for moving a VRM to a viewport position. */
interface MoveToArgs {
globalViewport: GlobalViewport;
}
LookAtState
type LookAtState =
| { type: "cursor" }
| { type: "target"; entity: number };
Persona
Persona
interface Persona {
/** Character profile/background description. */
profile: string;
/** Personality description in natural language. */
personality?: string | null;
/** Big Five personality parameters. */
ocean: Ocean;
/** Extension metadata for MODs. */
metadata: Record<string, unknown>;
}
Ocean
interface Ocean {
openness?: number;
conscientiousness?: number;
extraversion?: number;
agreeableness?: number;
neuroticism?: number;
}
Expressions
ExpressionsResponse
interface ExpressionsResponse {
expressions: ExpressionInfo[];
}
ExpressionInfo
interface ExpressionInfo {
name: string;
weight: number;
isBinary: boolean;
overrideBlink: OverrideType;
overrideLookAt: OverrideType;
overrideMouth: OverrideType;
}
OverrideType
type OverrideType = "none" | "blend" | "block";
Animation
VrmaInfo
interface VrmaInfo {
entity: number;
name: string;
playing: boolean;
}
VrmaPlayRequest
interface VrmaPlayRequest {
asset: string;
transitionSecs?: number;
repeat?: VrmaRepeat;
waitForCompletion?: boolean;
resetSpringBones?: boolean;
}
VrmaRepeat
interface VrmaRepeat {
type: "forever" | "never" | "count";
count?: number;
}
VrmaState
interface VrmaState {
playing: boolean;
repeat: string;
speed: number;
elapsedSecs: number;
}
VrmaSpeedBody
interface VrmaSpeedBody {
asset: string;
speed: number;
}
Spring Bone
SpringBoneChainsResponse
interface SpringBoneChainsResponse {
chains: SpringBoneChain[];
}
SpringBoneChain
interface SpringBoneChain {
entity: number;
joints: string[];
props: SpringBoneProps;
}
SpringBoneProps
interface SpringBoneProps {
stiffness: number;
dragForce: number;
gravityPower: number;
gravityDir: [number, number, number];
hitRadius: number;
}
Speech
TimelineKeyframe
interface TimelineKeyframe {
/** Duration of this keyframe in seconds. */
duration: number;
/** Expression weights to set. Keys are expression names, values are 0.0-1.0. */
targets?: Record<string, number>;
}
SpeakTimelineOptions
interface SpeakTimelineOptions {
/** If true, waits for speech to complete. Defaults to true. */
waitForCompletion?: boolean;
/** Seconds for smoothstep blending between adjacent keyframes. Defaults to 0.05. */
transitionDuration?: number;
}
Events
VrmEventSource
class VrmEventSource implements Disposable {
on<K extends keyof EventMap>(
event: K,
callback: (event: EventMap[K]) => void | Promise<void>,
): void;
close(): void;
[Symbol.dispose](): void;
}
EventMap
type EventMap = {
"drag-start": VrmPointerEvent;
"drag": VrmDragEvent;
"drag-end": VrmPointerEvent;
"pointer-press": VrmMouseEvent;
"pointer-click": VrmMouseEvent;
"pointer-release": VrmMouseEvent;
"pointer-over": VrmPointerEvent;
"pointer-out": VrmPointerEvent;
"pointer-cancel": VrmPointerEvent;
"pointer-move": VrmPointerEvent;
"state-change": VrmStateChangeEvent;
"expression-change": VrmStateChangeEvent;
"vrma-play": VrmStateChangeEvent;
"vrma-finish": VrmStateChangeEvent;
"persona-change": PersonaChangeEvent;
};
VrmPointerEvent
interface VrmPointerEvent {
globalViewport: [number, number];
}
VrmDragEvent
interface VrmDragEvent extends VrmPointerEvent {
delta: [number, number];
}
Button
type Button = "Primary" | "Secondary" | "Middle";
VrmMouseEvent
interface VrmMouseEvent extends VrmPointerEvent {
button: Button;
}
VrmStateChangeEvent
interface VrmStateChangeEvent {
state: string;
}
PersonaChangeEvent
interface PersonaChangeEvent {
persona: Persona;
}