Talos docs

GET /feel

Since 0.6

What an agent that cannot look or listen needs to judge how the game feels: animator state and pose, whether the camera's near plane is inside a collider, whether the player is in view, sounds started and animator names that resolved to nothing.

Plain text

?section= keeps some of the top-level sections; ?id=, ?name= and ?tag= keep the animators (and animator misses) of those entities; ?fields= keeps some of each animator's fields; ?limit= and ?cursor= page the animators.

Request

Query parameters

ParameterShapeMeaning
sectioncamera,animatorskeep only these top-level sections: player, camera, animators, audio, particles, haptics, animator_misses, and clips (below); frame is always kept
id (or entity)hero,crab*only the animators, animator misses, emitters and the burst and rumble records of these entities (a record with no entity goes with an unfiltered answer only); patterns as on /entities
namepatternof entities whose name matches
tagstringof entities carrying this tag
fieldsstates,clipskeep only these fields of each animator: position, states, joints, bind_deviation, pose, feet, foot_joints, feet_from, feet_method, feet_confidence, feet_reason, feet_unknown, rig_joints, clips, loop_seams, loop_ranges, pops, or the groups gait (feet, foot_joints, feet_from, feet_unknown) and rig (joints, rig_joints, pose, bind_deviation); entity is always kept
limit, cursorinteger, the last page's x-argus-next-cursorpage the animators; x-argus-total counts them

Response

Response: FeelView

GET /feel — the game-feel numbers for the tick this answers on.

FieldTypePresentDescription
frameintegeralwaysThe frame these numbers describe.
playerFeelPlayersometimesThe entity player input drives: the scene's spawn { for: "player" }, else the first character controller. Absent when there is neither.
cameraFeelCamerasometimesThe view the frame is drawn from. Absent when the scene has no camera at all.
animatorsFeelAnimator[]alwaysEvery entity with a live animator, in entity order.
audioFeelAudioalwaysSounds started since load.
particlesFeelParticlessometimesParticle emissions since load.
hapticsFeelHapticssometimesRumble calls since load.
animator_missesAnimatorMiss[]alwaysNames ctx.animator.set / ctx.animator.play asked for that the animator does not have, since load. set used to drop them without a word.

Response: AnimatorMiss

A state or clip name the animator did not have.

FieldTypePresentDescription
entitystringalwaysThe entity whose animator was asked.
callstringalways"set" or "play".
namestringalwaysThe name asked for.
countintegeralwaysHow many times, since load.
statesstring[]alwaysThe states the animator does have, sorted.

Response: FeelAnimator

One animator, this tick.

FieldTypePresentDescription
entitystringalwaysThe entity the animator is on.
positionnumber[3]alwaysThe entity's world position.
statesstring[]alwaysEvery state the animator declares, sorted. Which one is playing, the clip, the playhead and the parameters are the entity's own anim on GET /entities, not repeated here.
jointsintegeralwaysJoints in the rig.
bind_deviationnumberalwaysHow far the pose carries any joint, or a point 10 cm from one, from where the bind pose puts it, metres. Near zero is the bind (T-)pose: nothing is being applied to the skeleton.
posenumber[3][]alwaysUp to 32 points in the rig's own frame, metres: each rides one joint, 10 cm from its origin off every axis, so it moves when the joint turns as well as when it travels. Sampled evenly through the skeleton, the same joints on every read of the same animator: diff two reads to see how much the pose moved.
feetnumber[3][]alwaysThe feet, world space, in the same order on every read, at most four: the joints the animator's feet names, or else the ones the engine found (feet_method): joints named foot, toe or ankle; else the leaf joints a looping clip plants on the ground and lifts in turn; else the lowest end of each limb near the ground at bind (toe ends on a humanoid, paws on a quadruped).
foot_jointsstring[]alwaysTheir joint names, in the same order.
feet_fromstringalways"animator" when the feet are the ones animator.feet names, "auto" when the engine found them (feet_method says how).
feet_methodstringsometimesHow the feet were found: animator (named in animator.feet), names (joints named foot, toe or ankle), motion (planted in turn by a looping clip), bind (lowest at bind, nothing better to go on) or none.
feet_confidencenumbersometimes0..1, how sure the engine is these are the feet: 1 for animator, 0.95 for names a clip also plants, 0.4 for the bind pose alone. Under a half, name them in animator.feet.
feet_reasonstringsometimesOne sentence naming the evidence: the names, the clip that plants them, the bind heights.
feet_unknownstring[]alwaysNames in animator.feet the rig does not have. With fewer than two found, the feet are chosen by height instead.
rig_jointsstring[]sometimesEvery joint of the rig, by name, in joint order: the names animator.feet, an IK chain, a look-at and a retarget map are written with.
clipsFeelClip[]sometimesEvery clip the animator can play, as measured when it was built: length, whether it loops cleanly, and the ground speed it was authored at.
loop_seamsFeelLoopSeam[]sometimesLooping states whose clips do not meet end to start: each one jumps at the wrap (animator-loop-seam). For a state that plays clips, also each hand-over from one to the next that jumps.
loop_rangesFeelLoopRange[]sometimesEvery clip a state or blend point loops over part of (loopStart/loopEnd), measured over that part.
stridesFeelStride[]sometimesEvery point of a stride-matched blend tree: the ground speed it plays against, measured or authored (refSpeed), and the rate that gives it on its own coordinate.
popsFeelPopssometimesPose discontinuities since the animator was built: ticks on which a joint turned far more than on the ticks either side. Absent when there have been none.

Response: FeelClip

One clip, measured when its animator was built.

FieldTypePresentDescription
namestringalwaysThe clip's name, as a state's clip names it.
durationnumberalwaysSeconds.
loopablebooleanalwaysFalse when its last frame is far from its first: looped, it jumps at the wrap.
seam_degnumberalwaysThe largest joint turn from the last frame to the first, degrees.
seam_jointstringsometimesThe joint that turn is on; absent when the clip turns no joint.
max_step_degnumberalwaysThe largest joint turn between two neighbouring frames, degrees.
ground_speednumberalwaysThe ground speed it was authored at, m/s at playback rate 1, in the world at the entity's scale: the speed its planted foot slides back under the body, or its root's travel. What a blend point's at should be, and what stride matching plays against. 0 in place.
speed_fromstringalwaysfeet, root or none: where ground_speed was read.
in_placebooleansometimesTrue when the clip walks or runs in place: its feet cycle (speed_from is feet) while its root does not travel. Its ground_speed is its stance foot's pace under the body.
root_travelnumberalwaysMetres the root travels over one cycle: what rootMotion moves the character per loop.

Response: FeelLoopRange

A clip looped over part of itself, measured over that part.

FieldTypePresentDescription
statestringalwaysThe state that plays it.
pointintegersometimesThe blend point's index in the state's blend.points; absent for the state's own clip.
clipstringalwaysThe clip looped.
loop_startnumberalwaysWhere the loop begins, a fraction of the clip in 0..1: it plays from 0 once, then loops between loop_start and loop_end.
loop_endnumberalwaysWhere the loop ends and wraps back to loop_start, a fraction of the clip in 0..1.
loopablebooleanalwaysFalse when the range's end is far from its start: it jumps at every wrap.
seam_degnumberalwaysThe largest joint turn from the range's end to its start, degrees.
seam_jointstringsometimesThe joint that turn is on; absent when the clip turns no joint.
max_step_degnumberalwaysThe largest joint turn between two neighbouring frames inside the range, degrees.
ground_speednumberalwaysThe ground speed one cycle of the range covers, m/s at rate 1: what stride matching plays a ranged blend point against.

Response: FeelLoopSeam

A looping state whose clip jumps where it comes round.

FieldTypePresentDescription
statestringalwaysThe looping state.
clipstringalwaysThe clip that ends.
nextstringalwaysThe clip that follows it: the same clip for a loop, the next of a state's clips.
seam_degnumberalwaysHow far the pose jumps there, degrees, at its worst joint.
jointstringalwaysThat joint.
loop_rangenumber[2]sometimes[loopStart, loopEnd] when the state loops part of the clip: the seam is from the range's end to its start. Absent for a whole clip.

Response: FeelPops

Pose discontinuities an animator has shown.

FieldTypePresentDescription
countintegeralwaysHow many since the animator was built.
worstFeelPopalwaysThe largest.
recentFeelPop[]alwaysThe latest, oldest first, at most eight.

Response: FeelStride

One point of a stride-matched blend tree, as the tree plays it.

FieldTypePresentDescription
statestringalwaysThe state whose tree it is.
clipstringalwaysThe point's clip.
atnumberalwaysThe point's coordinate, m/s.
measurednumberalwaysThe clip's ground speed as measured, m/s at rate 1 (over its loop range, when it has one).
ref_speednumbersometimesThe point's refSpeed, which the tree plays against instead of measured; absent when the scene gives none.
ratenumberalwaysThe playback rate at at: at over the ground speed used, 1 for a point in place. Far from 1 (over 3 or under a third) is animator-stride-rate.

Response: FeelAudio

Sounds, counted since load.

FieldTypePresentDescription
startedintegeralwaysVoices started: ctx.audio.play cues and audio components that play at load.
musicintegeralwaysMusic layers that started.
unplayableintegeralwaysctx.audio.play calls naming an asset with no sound behind it: the game tried to make a noise and nothing played.
recentstring[]alwaysThe last few assets started, oldest first, at most 16.
outputstringsometimesWhere the mix goes: device (a real output), silent (this world never asked for one: headless, a worker, a preview, --no-audio, ARGUS_NO_AUDIO) or unavailable (asked for, and the platform refused; output_note says why). The numbers below are the same either way.
output_notestringsometimesThe device's name, or why there is none. Absent for silent.
playingintegersometimesVoices sounding now.
peak_voicesintegersometimesThe most voices that ever sounded at once.
voicesFeelVoice[]sometimesEvery voice sounding now, loudest first.
soundsFeelSound[]sometimesEvery sound that has played since load, by asset.
stackedFeelStack[]sometimesIdentical non-spatial loops of one asset sounding at once, three or more: stacked in the centre they add up to one louder copy that masks the rest of the mix. Now, by asset.
levelFeelLevelsometimesThe mix's loudness, estimated from each voice's gain and its sound's own level.
busesFeelBus[]sometimesEvery bus the mixer has, in declaration order (master, music, sfx and any the project declares in meta.audio). Absent when there is no mixer to ask or no buses.

Response: FeelBus

One mixer bus, as it is now.

FieldTypePresentDescription
namestringalwaysThe bus's name, as meta.audio and ctx.audio.bus(name) call it.
volumenumberalwaysThis bus's own linear volume, 0..1, ramps included. Its parents' volumes are not in it, so a voice's gain is this times every ancestor's.
mutedbooleanalwaysTrue when the bus is muted: it is silent whatever its volume says.

Response: FeelLevel

The mix's loudness, estimated: the mixer computes gains and never renders samples.

FieldTypePresentDescription
rmsnumberalwaysNow: every voice's gain times its sound's RMS, added as unrelated signals (power adds).
peaknumberalwaysNow: the voices' peaks added as if they lined up, the worst case. Over 1 can clip.
max_rmsnumberalwaysThe loudest rms since load.
max_peaknumberalwaysThe loudest peak since load.

Response: FeelSound

What one asset did since load.

FieldTypePresentDescription
assetstringalwaysThe asset, as the scene names it.
playsintegeralwaysVoices of it started.
peak_gainnumberalwaysThe loudest it was mixed at (a final gain, as voices[].gain).
max_overlapintegeralwaysThe most voices of it sounding at once.
max_stacked_loopsintegeralwaysThe most non-spatial loops of it sounding at once.
rmsnumbersometimesThe asset's own RMS level (0..1), measured when it was registered. Absent for a streamed sound, which is decoded only as it plays.

Response: FeelStack

Identical loops stacked now.

FieldTypePresentDescription
assetstringalwaysThe asset looping.
voicesintegeralwaysNon-spatial loops of it sounding.
gainnumberalwaysTheir gains added: what one copy would have to be mixed at to be as loud, in phase.

Response: FeelVoice

One voice sounding now, as the mixer computed it.

FieldTypePresentDescription
voiceintegeralwaysThe voice's handle, as ctx.audio.play returned it.
assetstringalwaysThe asset it plays.
busstringalwaysThe meta.audio bus it is mixed on.
gainnumberalwaysThe final linear gain: its own volume, every bus, the rolloff and any fade.
loopedbooleanalwaysPlays until stopped.
spatialbooleanalwaysPlaced in the world (at), attenuated by distance and panned.
distancenumberalwaysMetres from the listener; 0 for a non-spatial voice.
pitchnumberalwaysPlayback rate, 1 as authored.
secondsnumberalwaysSeconds it has played.

Response: FeelCamera

The view the frame is drawn from.

FieldTypePresentDescription
kindstringalways"scene" (the scene's camera entity), "fixed", "third-person", "orbit", "first-person" (a rig a script drives), or "override" (the editor's view).
sourcestringalwaysWho places the view: "rig" (the engine's camera rig, which a behaviour configured with ctx.camera.set / follow — the game's own script or a built-in such as player), "entity" (the scene's primary camera entity, wherever its transform puts it: a camera component's kind, target and distance do not move it), or "editor" (the editor's view override).
entitystringsometimesThe scene camera entity's id, when source is "entity".
positionnumber[3]alwaysThe eye, world space.
forwardnumber[3]alwaysUnit view direction, world space.
yawnumberalwaysHeading of forward about +Y, radians: 0 looks down −Z, +π/2 looks down −X. The same yaw ctx.camera.set takes.
fov_ynumberalwaysVertical field of view, degrees.
nearnumberalwaysNear clip distance, metres.
near_radiusnumberalwaysRadius of the sphere around the eye that contains the whole near plane at the widest aspect the engine draws: the probe near_clear is measured with.
near_clearbooleanalwaysFalse when that sphere overlaps a solid collider: part of the near plane is inside it and the frame shows the inside of a wall.
near_hitstringsometimesThe entity the near plane is inside, when it is.
clearancenumberalwaysMetres from the eye to the nearest solid collider, measured up to 1 m (1 means nothing within a metre). Under 0.3 m most of the frame is a surface a hand's width away.
pitchnumbersometimesVertical angle of forward, radians: 0 level, positive looks up, −π/2 straight down. The same pitch ctx.camera.set takes.
look_atnumber[3]sometimesThe world point a fixed script rig looks at (ctx.camera.set("fixed", { target })). Absent for every other rig and view.
targetstringsometimesThe entity the rig is locked or focused on, when it has one (a lock-on rig). Absent otherwise: no rig sets it yet, so a reader treats absent as "no target".
followstringsometimesThe entity a script rig follows, when it follows one.
to_playernumbersometimesMetres from the eye to the player's chest. Absent with no player.
player_visiblebooleansometimesWhether a ray from the eye reaches the player's chest before anything solid. Absent with no player.
occluderstringsometimesWhat the ray hit first, when the player is hidden.
armCameraArmViewsometimesThe follow rig's spring arm — its length, whether geometry shortened or collapsed it, the character fade — as POST /capture frames report it. Absent unless a third-person or orbit arm is the view.
shakenumbersometimesEye offset of the running ctx.camera.shake, metres; absent at rest.

Response: CameraArmView

What a follow camera's spring arm was doing: ctx.camera.arm, on the wire.

FieldTypePresentDescription
desirednumberalwaysThe length the rig asked for, metres.
lengthnumberalwaysThe length it had, pivot to eye, after collision and the recovery ease.
collapsedbooleanalwaysShorter than the arm's minimum (0.5 m): the eye was in or against the character.
blockedbooleanalwaysGeometry was shortening the arm.
blockerstringsometimesThe entity shortening it, by id.
fadenumberalways0..1, how far the followed character was faded away. Faded pixels are dropped by a dither, so they are missing from the frame's depth and id buffers as well.
probeRadiusnumberalwaysRadius of the sphere the boom swept, widened to hold the near plane.

Response: FeelHaptics

GET /feel's haptics: ctx.input.rumble, measurable with no pad attached.

FieldTypePresentDescription
totalintegeralwaysctx.input.rumble calls since load; the newest record's seq.
playedintegeralwaysOf those, the calls a connected pad that can rumble took. 0 on any headless run.
recentFeelRumble[]alwaysThe last 64 calls, oldest first.

Response: FeelRumble

One ctx.input.rumble call, after clamping.

FieldTypePresentDescription
seqintegeralways1 for the first call since load, counting up.
frameintegeralwaysThe simulation frame it was called on.
sourcestringsometimesThe entity whose behavior called it. Absent when that entity is gone.
strengthnumberalwaysThe heavy (low-frequency) motor, 0..1.
highnumberalwaysThe light (high-frequency) motor, 0..1.
secondsnumberalwaysHow long, 0..10 s.

Response: FeelParticles

GET /feel's particles: what was emitted, readable by a probe that polls every tick or every few.

FieldTypePresentDescription
burstsintegeralwaysctx.particles.emit calls since load that named a preset.
burst_particlesintegeralwaysParticles those bursts emitted (each is capped at its preset's pool).
recentFeelEmit[]alwaysThe last 64 bursts, oldest first.
emittersFeelEmitter[]alwaysEvery live particles component's emitter, in entity slot order.

Response: FeelEmit

One ctx.particles.emit burst.

FieldTypePresentDescription
seqintegeralways1 for the first burst since load, counting up.
frameintegeralwaysThe simulation frame it was emitted on.
entitystringsometimesThe entity whose behavior emitted it. Absent when that entity is gone, or the engine emitted it.
presetstringalwaysThe preset's name.
countintegeralwaysParticles emitted.
positionnumber[3]alwaysWorld position it was emitted at.

Response: FeelEmitter

One particles component's emitter.

FieldTypePresentDescription
entitystringalwaysThe entity the component is on.
presetstringalwaysThe preset it runs.
emittedintegeralwaysParticles it has emitted since it was made.
liveintegeralwaysParticles alive now.

Response: FeelPlayer

The player's body, as the character controller has it.

FieldTypePresentDescription
idstringalwaysThe entity's scene id.
positionnumber[3]alwaysFeet, world space.
velocitynumber[3]alwaysm/s, world space. Zero for a player with no controller.
groundedbooleanalwaysTrue when the controller stands on something. True for a player with no controller.
controllerbooleanalwaysWhether the entity has a character controller.
blockedbooleanalwaysTrue when the controller's last move was stopped by something in its way.

Example

curl "http://127.0.0.1:7700/feel"

Start a server with argus run --serve; the port is --port (7700 by default). The request and response fields are in the query API guide.