Files
sbox-public/engine/Sandbox.Tools
Garry Newman 4fd85ce69d Add SkinnedModelRenderer.SpeakSound with baked viseme lipsync; remove dead native code (#5306)
// SkinnedModelRenderer - the only new entry point for speaking
SoundHandle SpeakSound( SoundEvent sound, GameObject mouth = null )
SoundHandle SpeakSound( SoundFile sound, float volume = 1, float pitch = 1, GameObject mouth = null )

// SoundFile - the authored lipsync track, read from the compiled vsnd
VisemeTrack Visemes { get; }   // null = no track (or not loaded yet, see IsValidForPlayback)

// VisemeTrack - visemes over time, authored in the sound editor
IReadOnlyList<VisemeFrame> Frames { get; }
float Duration { get; }
bool Sample( float time, Span<float> weights )

// VisemeFrame - one viseme span (struct: Viseme, StartTime, EndTime)

// Visemes - the standard 15-viseme table, OVR order
static IReadOnlyList<string> MorphNames { get; }
static int Count { get; }

// MorphCollection - the one shared viseme blend (sounds, voice chat, editor preview)
void ApplyVisemes( ReadOnlySpan<float> visemeWeights, float scale = 1, float smoothTime = 0 )

// ModelMorphs - per-model viseme weight table, cached managed-side (no interop on lookups)
float GetVisemeMorph( int viseme, int morph )
float GetVisemeMorph( string viseme, int morph )

// ResourceCompileContext - inject managed data into natively-compiled resources
void WriteBlock( string blockName, ReadOnlySpan<byte> data )   // four-char block names, eg "LIPS"
void WriteBlockJson( string blockName, object obj )
JsonObject ReadMeta()                                          // the asset's .meta, registers a compile dependency
T ReadMeta<T>( string key, T defaultValue = default )

// ResourceLoadContext - read blocks back when the resource loads (Resource.OnLoaded, engine-internal for now)
// public ref struct, only valid during the load callback
bool Exists( string blockName )
ReadOnlySpan<byte> ReadData( string blockName )
string ReadString( string blockName )
T ReadJson<T>( string blockName, T defaultValue = default )
2026-07-09 20:04:02 +01:00
..
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2026-07-06 10:37:25 +01:00
2026-06-12 13:23:50 +01:00
2025-11-24 09:05:18 +00:00
2026-07-09 12:22:48 +01:00
2026-03-17 11:35:37 +00:00
2026-06-12 13:23:50 +01:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2026-07-06 10:37:25 +01:00
2025-11-24 09:05:18 +00:00
2026-04-15 17:26:15 +02:00
2026-07-02 07:29:38 +02:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2025-11-24 09:05:18 +00:00
2026-07-06 10:37:25 +01:00