Skip to content

v0.2.0

Choose a tag to compare

@rawframe-release rawframe-release released this 28 Oct 15:34
db1e651

0.2.0 (2026-10-28)

Tile bytes, fingerprints, paths and velocities do not change, and no
tile format rises: tiles baked by 0.1.0 load as they are. Flow fields
change for one call sequence (see Fixed).

Added

  • A misuse count on every object, read with mnavGetNavmeshMisuse,
    mnavGetQueryMisuse, mnavGetBakerMisuse, mnavGetTileCacheMisuse,
    mnavGetTileIndexMisuse, mnavGetHierarchyMisuse,
    mnavGetFlowFieldMisuse, mnavGetNavFlowMisuse,
    mnavGetAvoidanceMisuse, mnavGetFlightBakerMisuse and
    mnavGetFlightVolumeMisuse. A count rises for each call refused with
    mnav_errorInvalid or mnav_errorBusy, so a release build can catch
    a host's bugs.
    (#141,
    #145,
    #148)

Changed

  • Breaking: the results take the Maul family's numbering:
    mnav_errorInvalid -1, mnav_errorCapacity -2, mnav_errorStale -3,
    mnav_errorUnsupported -4, mnav_errorState -6, mnav_errorVersion
    -7, mnav_errorFormat -8, mnav_errorLimit -9, mnav_errorBusy -10,
    and maul-nav's own mnav_errorNotLoaded -32 and mnav_errorOutside
    -33. A host that stored or compared the numbers compares the names.
    Some calls refuse with a different result:

    • A limit the caller sets (a def's limits and memory, a query's
      nodes), mnavBakeLimits and mnavFlightLimits included, is
      mnav_errorCapacity; it was mnav_errorLimit.
    • mnav_errorRange is removed. A coordinate past the extent is
      mnav_errorLimit, as is any value past a published MNAV_MAX_* or
      MNAV_MIN_* bound. MNAV_MAX_PIECE_CORNERS,
      MNAV_MAX_CLIP_CORNERS, MNAV_MAX_INDEX_ENTRIES and
      MNAV_MAX_FLIGHT_VOXELS are new public bounds.
    • Every check on tile and flight tile bytes is mnav_errorFormat.
    • A search or field not begun, not ended or out of date after a
      commit, and a link read before its commit, is mnav_errorState.
    • A NaN is mnav_errorInvalid. An infinity is mnav_errorLimit past
      a published bound, and mnav_errorInvalid elsewhere.
    • mnavIsFlightOpen refuses a point more than 2^28 voxels from the
      origin, as the other flight calls do; it took up to 2^30.

    (#135)

  • Breaking: mnav_errorTier is removed. A staged tile, area change
    or link toggle that the navmesh's tier does not allow is refused with
    mnav_errorUnsupported.
    (#138)

  • Breaking: host code may not call into the objects of a running
    call. That is an allocator, a baker's clock or a link generation's
    clearance test. Such a call is refused with mnav_errorBusy when it
    returns a status, does nothing when it returns nothing, and counts one
    misuse. This holds for the object the host code serves and for the
    other objects the running call uses: the baker, tile index and tile
    cache of a bake or rebuild, and the context and navmesh of a
    hierarchy's build or update. It also holds for the release of an
    object's own memory. A clearance test or a hierarchy's allocator may
    still call mnavStageTile and mnavStageTileRemoval. Before, such a
    call could read freed memory.
    (#141,
    #145,
    #147)

  • Breaking: a call refused with mnav_errorInvalid counts one
    misuse on the first object it is given. Input geometry a bake refuses
    and its report names counts none.
    (#148)

  • Breaking: a place outside what an object covers is
    mnav_errorOutside, not mnav_errorInvalid, and counts no misuse.
    This covers:

    • mnavGetHeight for a point off the polygon
    • mnavFlowAt and mnavNavFlowAt for a cell or polygon outside the
      field's region
    • mnavIsFlightOpen, mnavFindFlightPath and mnavBeginFlightPath
      for a point below or above the flight volume

    A host that handled these as mnav_errorInvalid handles
    mnav_errorOutside. The outputs stay as they were, but
    mnavIsFlightOpen sets openOut to false.
    (#148,
    #150)

  • The troubleshooting table lists the new numbering and results. The
    getting-started and baking pages say what host code may call.

Fixed

  • Breaking: a flow field repaired after mnavBeginFlowField cut an
    earlier repair short now matches a fresh build, as
    mnavUpdateFlowField promises. Before, cells the earlier repair had
    marked could keep their old costs and next cells. Flow fields change
    for that sequence only.
    (#130)
  • mnavStageLink refuses a link with mnav_errorLimit when a crossing
    would take a link slot its attachment key cannot hold. This can happen
    at MNAV_MAX_LINKS links once a slot has worn out. Before, the link
    took a slot that wrapped to slot 0, and a search crossed the wrong
    link or read out of bounds.
    (#122)