com.amanotes.curve2
v1.0.0
Published
Adaptive tessellation curve system with segment-based composition and binary split caching
Readme
Curve2
Version: 1.0.0
Unity: 2022.3+
Adaptive tessellation curve system with segment-based composition and binary split caching.
Features
- Segment-based composition: Build complex paths from curve templates
- Adaptive binary tessellation: Subdivides only when queried, caches in binary tree
- Curve templates: Predefined curves (linear, up, down, left, right, swirl)
- Smooth connections: Automatic alignment of position and tangent between segments
- Full orientation: Position + rotation (tangent, normal, binormal)
- Performance: Lazy evaluation, minimal memory until needed
Quick Start
using Amanotes.Curve2;
// Create path with multiple segments
var path = new Curve2Path();
path.AddSegment("linear");
path.AddSegment("up");
path.AddSegment("right");
path.AddSegment("swirl");
path.Initialize();
// Get position and orientation at distance from start
WarpPoint warp = path.GetWarpPoint(5.5f);
transform.position = warp.position;
transform.rotation = warp.rotation;API
Curve2Path
// Add segments
path.AddSegment(string curveId); // Built-in preset
path.AddSegment(CurveTemplate template); // Custom template
// Initialize (call after adding segments)
path.Initialize();
// Query
WarpPoint GetWarpPoint(float distance);
float TotalLength { get; }Built-in Presets
"linear"- Straight forward"up"- Curve upward"down"- Curve downward"left"- Curve left"right"- Curve right"swirl"- 90° spiral
Custom Templates
Create via Assets > Create > Curve2 > Curve Template:
[CreateAssetMenu(menuName = "Curve2/Curve Template")]
public class CurveTemplate : ScriptableObject
{
public Vector3 p0, p1, p2, p3; // Bezier control points
}Architecture
Curve2Path
├─ segments: List<Segment>
│ ├─ curveId: string (template reference)
│ ├─ transformedCurve: BezierCurve (aligned to previous)
│ └─ startDistance, endDistance: float
│
└─ GetWarpPoint(distance) → WarpPoint
BezierCurve
├─ p0, p1, p2, p3: Vector3 (control points)
├─ TessellationCache (binary tree, lazy subdivision)
└─ GetWarpPointByDistance(distance) → WarpPoint
WarpPoint
├─ position: Vector3
└─ rotation: Quaternion (tangent + normal + binormal)Binary Tessellation
- Starts with single segment [0, 1]
- Subdivides only when linear interpolation error > tolerance
- Caches split points in binary tree
- Deeper levels created on-demand when queried
Example:
Query at 0.5 → Split [0, 1] → Cache 0.5
Query at 0.25 → Split [0, 0.5] → Cache 0.25
Query at 0.75 → Split [0.5, 1] → Cache 0.75Performance
- Lazy evaluation: No computation until
GetWarpPoint()called - Adaptive caching: Only subdivides where needed
- Memory efficient: Binary tree grows on-demand
- Inline optimized: Critical paths use
AggressiveInlining
Migration from Existing Systems
From DRCurve/DRRoad:
// Old
float warpedZ = drCurve.Evaluate(time);
// New
WarpPoint warp = curve2Path.GetWarpPoint(distance);
transform.position = warp.position;
transform.rotation = warp.rotation;From AnimationCurve:
// Old
float y = animCurve.Evaluate(x);
// New
var path = new Curve2Path();
path.AddSegment(customTemplate);
path.Initialize();
WarpPoint warp = path.GetWarpPoint(x);License
Copyright © Amanotes. All rights reserved.
