Files

116 lines
3.9 KiB
Markdown

---
id: curves
icon: vec.angular
group: gameplay
title: Curves
order: 4
---
# Curves
A curve maps time to a value. Component fields of type `curve.Curve` describe falloffs, speed ramps and fades; a tween can follow a curve instead of an easing.
---
id: curves/shape
icon: code.hints
parent: curves
order: 1
title: Presets and keys
---
# Presets and keys
A curve is either a preset or a list of keys.
- **Preset.** An easing on time `0..1`: `linear` and the `in`/`out`/`inOut` family of quad, cubic, sine, expo, back, elastic and bounce.
- **Keys.** Each key has a time, a value, two slopes, a segment mode and a tangent mode.
| Segment | From this key to the next |
|---|---|
| Bezier | smooth, shaped by the slopes |
| Linear | a straight line |
| Step | holds this key's value |
| Tangent | Slopes |
|---|---|
| Auto | follow the neighbours and never overshoot them |
| Linear | point at the neighbouring keys |
| Free | set by hand; In and Out may differ |
**Before** and **After** decide what happens outside the keys: `Clamp` holds the end value, `Loop` repeats, `Ping-pong` repeats mirrored. Curves are float32 and evaluate identically on every platform.
---
id: curves/editor
icon: edit.rename
parent: curves
order: 2
title: Editing curves
---
# Editing curves
The Inspector draws the curve inside the field; a click opens the curve editor.
- **Preset** switches between presets and **Keys**. Choosing Keys on a preset turns it into editable keys of the same shape.
- **Double-click** the graph to add a key on the curve, **right-click** a key to remove it, drag a key or a slope handle to change it.
- Hold **Ctrl** (Cmd on macOS) to snap to a 1/20 grid of the view, hold **Shift** while dragging a slope handle to move one side only.
- **Time**, **Value**, **Segment** and **Tangent** edit the selected key; dragging a handle makes its tangent Free.
Every drag is one undo step. Prefab instances show an overridden curve like any other field.
---
id: curves/scripts
icon: file.script
parent: curves
order: 3
title: Curves in scripts
---
# Curves in scripts
A script reads a curve field of a component and evaluates it with `aego/curve`:
import "aego/curve"
func Update(dt float) {
age += dt
fade := node.Get<Fader>().Alpha
sr.Tint.A = curve.Eval(fade, age / curve.Duration(fade))
}
| Function | |
|---|---|
| `Eval(c, t) float` | the value at `t`, wrapped by Before and After |
| `EvalClamped(c, t) float` | the value at `t` clamped to the first and last key |
| `Duration(c) float` | time from the first to the last key, 1 for a preset |
| `Ease(e, t) float` | a preset easing at `t` clamped to `0..1` |
The constants `curve.Linear`, `curve.OutQuad` and the rest have the type `curve.Easing` and are the `ease` argument of tweens.
A `Curve` value is a read-only view of the field, not a copy: it sees edits made after it was read. Scripts cannot build curves or export curve fields. A view whose node or component is gone faults with `AES6004`.
---
id: curves/go
icon: code.brackets
parent: curves
order: 4
title: Curves in Go
---
# Curves in Go
type Fader struct {
Alpha curve.Curve `aego:"alpha"`
}
c := curve.Keyed(curve.Key{T: 0, V: 1}, curve.Key{T: 0.5, V: 1, Interp: curve.InterpLinear}, curve.Key{T: 1, V: 0})
v := c.Eval(0.75)
| Function | |
|---|---|
| `FromEasing(e)`, `Line(t0, v0, t1, v1)`, `Constant(v)`, `Keyed(keys...)` | construction |
| `Eval`, `EvalClamped`, `Span`, `Duration`, `Range(samples)` | reading |
| `Fix`, `Smooth`, `Normalize`, `Bake(samples)` | editing helpers |
`Keyed` and `Fix` sort the keys, drop keys with NaN and keep the last of two keys at the same time. Change `Keys` directly only together with `Fix` or `Smooth`.
In scenes and prefabs a curve is written as a struct; defaults are omitted and a preset has no keys:
falloff={ ease=outQuad post=pingPong }
alpha={ keys=[[0, 1, 0, 0, bezier, auto], [1, 0, -2, -2, linear, free]] }