Changelog
=========

Version 0.15.1 (2024-12-23)
---------------------------

- Install licenses with the rest of the library.
- Clarify some comments in examples.

Version 0.15.0 (2024-12-01)
---------------------------

- Allow users to specify the transformation matrix of a model manually.
- Fix a devkitARM Makefile in an example.

Version 0.14.0 (2024-09-10)
---------------------------

- Use ``stdint.h`` types instead of libnds types.
- Update BlocksDS makefiles.
- Update libdsf to v0.1.3.
- Fix some memory leaks/use-after-free bugs in the RichText module.

Version 0.13.0 (2024-06-08)
---------------------------

- Define BlocksDS as the main toolchain to use with Nitro Engine.
- Simplify build and installation instructions of the library.
- Update ``md5_2_dsma`` to correctly export the base animation of models.
- Stop using ``NE_RGB5`` in the examples, this format is discouraged.
- Optimize copy of ``NE_RGB5`` textures to VRAM.

Version 0.12.0 (2024-03-30)
---------------------------

- Deprecate ``NE_ShadingEnable()``. The name was misleading. All examples that
  use it have stopped calling it.
- For sprites, add a way to specify texture coordinates inside the material to
  use a small part of the texture instead of the whole texture:
  ``NE_SpriteSetMaterialCanvas()``. This is now used in the sprites example.
- Stop using global variables in most examples. Instead, the rendering functions
  get values through the arguments of ``NE_ProcessArg()`` and
  ``NE_ProcessDualArg()``.
- Don't expect palette objects when loading GRF files if the file doesn't
  contain a palette.
- Allow loading BMFont fonts from RAM, not just nitroFS. Add an example of
  using rich text fonts from RAM.
- Added a function to reset the rich text font system. Also add a function to
  return the size that a specific text string would have if drawn.
- Add shadow volume example.
- Build some functions that do lots of multiplications as ARM to increase
  performance.
- Fix compilation with devkitARM.
- Fix linker invocation for C++ with BlocksDS.
- Update libDSF to version 0.1.2, with some speed improvements.
- Relicensed libDSF under "Zlib OR MIT" to simplify licensing with Nitro Engine.
- Some minor documentation improvements.

Version 0.11.0 (2024-03-02)
---------------------------

- Added a rich text system. This allows the user to draw non-monospaced text,
  and it's based on `BMFont <https://www.angelcode.com/products/bmfont/>`_. An
  example has been added to show how to use it to render text. It can render
  text by using one quad per character, or by rendering to a texture which is
  then drawn as a single quad.
- Fix "properties" typo. This involves renaming some functions, but compatibilty
  definitions have been added.
- Update calls to GRF libnds functions after their prototypes have changed.
- Cleanup setup of dual 3D modes that involve setting up 2D sprites to be used
  as a framebuffer.
- Now the size of a sprite is set to the size of the material it is assigned. It
  can be modified later as usual.

Version 0.10.0 (2024-01-28)
---------------------------

- Create variants of ``NE_Process()`` and ``NE_ProcessDual()`` that can pass an
  argument to the screen draw callbacks.

- Add function to load textures in GRF format (BlocksDS only).

- Add functions to load compressed textures (Texel 4x4 format).

- Add examples to load assets from the filesystem, both in binary and GRF
  function.

- Cleanup code style: Use stdint types, turn some functions ``static inline``...

- Remove unneeded call to ``DC_FlushAll()``.

- ``obj2dl``: Improve error message. Fix vertical coordinates being flipped.

- ``img2ds``: Deprecate it except for generating ``DEPTHBMP`` binaries.

- The makefile for BlocksDS now installs the tools to ``/opt/blockds/external``,
  not only the library and headers.

- Migrate all examples to using ``grit`` instead of ``img2ds``.

Version 0.9.1 (2023-11-12)
--------------------------

- Update Makefiles to build on BlocksDS.

- Fix functions used to load assets from FAT.

Version 0.9.0 (2023-10-19)
--------------------------

- Introduce two new dual 3D modes. They are resilient and they will always show
  the same output on both screens even if the framerate drops. This isn't the
  case with the previous dual 3D mode.

- Fix 2D projection used to display 3D sprites. The Y coordinate didn't work
  correctly for numbers close to 192. This means that an ugly hack to apply an
  offset to the texture coordinates of 2D polygons is no longer needed.

- Fix initialization of the library. Sometimes, depending on the loader, the
  game would start in a different time in the screen rendering cycle. This would
  swap the images of the screens until the framerate dropped when loading
  assets, for example.

- The code that switches between screens in dual 3D mode has been more reliable.
  Nitro Engine now swaps screens after they are actually drawn, not in the
  vertical blanking interrupt handler, when it switched every frame even if no
  new frame had been drawn by the game.

- Switch a lot of assert() in the library into permanent runtime checks. Several
  functions now return error codes instead of not returning any value.

- Use safe DMA copy functions if the libnds of the toolchain provides them (they
  are only available in BlocksDS at the moment).

- The library now supports sending display lists to the GPU in different ways to
  work around a hardware bug in the ARM9 DMA when it is set to GFX FIFO mode.

- Fix debug build of the library.

- Fix build of the NFlib template with devkitPro libraries.

- Update examples and add some more, particularly about comparisons between dual
  3D modes.

Version 0.8.2 (2023-04-20)
--------------------------

- Decouple mesh objects from model objects. This simplifies cloning models.
  Previously it was needed to preserve the original object as long as you wanted
  to use the clones. Now, it can be deleted and Nitro Engine won't free the mesh
  until all clones have been deleted.

- Support vertex color commands in ``obj2dl``. This can't be used at the same
  time as normals.

- Improve examples. A script has been added to convert all assets used by the
  examples. Also, the NFlib example has been updated to work with upstream
  NFlib.

- Support BlocksDS.

- A few minor fixes.

Version 0.8.1 (2022-11-10)
--------------------------

Models and materials:

- Improve support of specular properties of materials and add an example of how
  to use it for metalic objects.

- Fix material cloning:

  - Copy material properties apart from just the texture.

  - Assign palettes to materials instead of textures, so that a single texture
    can have multiple textures. You can load a texture to a material, clone the
    material, and assign a different palette to the cloned material.

- Support loading compressed textures and add an example of how to load them.
  Note that ``img2ds`` doesn't support this format yet. Until that support is
  added, compressed texture support should be considered experimental.

- Add example of how to use NFlib at the same time as Nitro Engine. NFlib is a
  library that has support for 2D graphics, which complements the 3D hardware
  support of Nitro Engine.

Other:

- Rename a few functions for consistency. The old names have been kept for
  compatibility, but they will be removed.

- Added some enumerations to help remember the names to be used as function
  arguments.

- The general-purpose allocator has been improved a lot to support compressed
  textures. This is needed due to the special way to load them to VRAM.
  Extensive tests for the allocator have also been added.

- Many internal changes to simplify the code and remove dependencies on libnds
  functions.

Version 0.8.0 (2022-10-21)
--------------------------

Models and materials:

- Add support for MD5 animated models (thanks to
  https://github.com/AntonioND/dsma-library): Introduce tool ``md5_to_dsma`` to
  convert them to a format that Nitro Engine can use.

- Add support for OBJ static models: Introduce tool obj2dl to convert them to a
  format that Nitro Engine can use.

- Introduce tool ``img2ds`` to convert images in many popular formats (PNG, JPG,
  BMP, etc) to DS textures (PNG is still recommended over other formats, as it
  supports alpha better than other formats).

- Drop support for MD2 models (static or animated).

- Remove NDS Model Exporter, Nitro Texture Converter, md2_to_bin and md2_to_nea.
  The animation system has been refactored (but NEA files don't work anymore, so
  you need to update your code anyway).

General:

- Huge cleanup of code style of the codebase.

- Cleanup of all examples. Add the original assets and textures used in all
  examples to the repository, along scripts to convert them to the formats used
  by Nitro Engine.

- Implement a better way to have debug and release builds of the library.

Notes:

- You can still use textures converted with Nitro Texture Converter or NDS Model
  Exporter, and you can still use any model exported with NDS Model Exporter or
  ``md2_to_bin``. However, support for NEA files has been removed (it had awful
  performance, and it was just a bad way to do things), so any file converted by
  ``md2_to_nea`` won't work anymore.

- The reason to replace most tools is that several people had issues building
  them. All the new tools are written in Python, so they don't need to be
  compiled.

Version 0.7.0 (2019-6-14)
-------------------------

- Pushed to GitHub.

- Major cleanup of code.

- Clarify license.

- Reworked tools to build under Linux and Windows.

Version 0.6.1 (2011-9-1)
------------------------

- Fixed identation in all code. Now it isn't a pain to read it (not as much as
  before, :P). Also, a few warnings fixed (related to libnds new versions).

Version 0.6.0 (2009-6-30)
-------------------------

- The functions used to modify textures and palettes now return a pointer to the
  data so that you can modify them easily.

- Each material can have different properties (amient, diffuse...). You can set
  the default ones, the properties each new material will have, and then you
  can set each material's properties individually.

- New texture and palette allocation system, it is faster and better.
  Defragmenting functions don't work now, but I'll fix them for the next
  version.

- Added a debug system. You can compile Nitro Engine in "debug mode" and it will
  send error messages to the function you want. Once you have finished debugging
  or whatever, just recompile Nitro Engine without debug mode.

- Window system renamed to Sprite system. You can set a rotation and a scale for
  each one.

- The most important thing... The animation system has been improved, and now
  animated models are drawn using linear interpolation (you can disable it,
  anyway).

- As a result, I've modified the converters, so you'll have to convert yout
  animated models again.

Version 0.5.1 (2009-1-28)
-------------------------

- Minor bugfixes.

Version 0.5.0 (2009-1-5)
------------------------

- Text system and camera system optimized. New functions for the camera system.

- ``NE_TextPrintBox()`` and ``NE_TextPrintBoxFree()`` slightly changed. They can
  limit the text drawn to a number of characters set by the coder.

- Some functions made internal. Don't use them unless you know what you are
  doing.

- Fixed (?) at least the 2D projection.

- HBL effects fixed.

- Touch test functions.

- ``NE_UPDATE_INPUT`` removed.

- It now supports any BMP size, and BMP with 4 bits of depth.

- Arrays made pointers, so there is more memory free when you are not using
  Nitro Engine. You can also configure the number of objects of each systems you
  are going to use.

- ``NE_TextPalette`` replaced by ``NE_Palette``.

- You can clone materials to use the same texture with different colors. This
  doesn't have the problems of cloning models.

- Added functions to remove all palettes and textures.

- Fixed ``NE_End()``.

- NE can free all memory used by it, and the coder can tell NE how much memory
  to use.

- Texture drawing system improved a bit.

- ``NE_PolyFormat()`` simplified.

- Some bugfixes, code reorganized, define lists converted into enums.

- Clear bitmap supported, this is used to display an bitmap as rear plane. Each
  pixel can have different depth. This needs 2 VRAM banks to work.

- Solved some problems with 2D system and culling.

- Nomad ``NDS_Texture_Converter`` is no longer included, if you want it, look for it
  in Google.

- Added Nitro Texture Converter, made by me. Open source, and it exports various
  levels of alpha in the textures that can handle it. It does only accept PNG
  files.

- NE now accepts any texture size. ``NE_SIZE_XXX`` defines removed as they are
  not needed now.

- Added a couple of examples.

Version 0.4.2 (2008-12-14)
--------------------------

- Fixed 2D system (textures were displaying wrong on 2D quads) and text system
  (paletted textures sometimes were drawn without palette).

- Modified ``MD2_2_NEA``, ``MD2_2_BIN`` and ``bin2nea`` to work in linux. Thanks
  to nintendork32.

- Added a couple of examples.

Version 0.4.1 (2008-12-12)
--------------------------

- Lots of bugfixes. Specially, UV coordinates swapping fixed.

- Added a function to draw on RGBA textures ^_^.

- Fixed ``MD2_2_NEA`` and ``MD2_2_BIN``. You'll have to convert again your
  models.

- Updated to work with latest libnds. There is a define in case you want to use
  an older version.

Version 0.4.0 (2008-10-15)
--------------------------

- Added ``MD2_2_NEA`` (converts an MD2 model into a NEA file that can used by
  Nitro Engine) and ``MD2_2_BIN`` (Converts the first frame of an MD2 model
  into a display list). Display lists created by them are really optimized.

- Updated ``DisplayList_Fixer``. Now it can remove normal commands too.

- Added a text system. It can use fonts of any size. ^^

- Added some simple API functions (buttons, check boxes, radio buttons and slide
  bars).

- Fixed 2D projection.

- Removed some internal unused functions to save space, and made 'inline' some
  of the rest.

- Functions that used float parameters modified so they use integers now. You
  can still use some wrappers if you want to use floats. This will let the
  compiler try to optimize the code.

- Animated and static models are now the same. You can move, rotate, etc them
  with the same functions.

- Now, you can 'clone' models so you can save a lot of RAM if they are repeated.

- Renamed lots of model functions. Take a look at new examples or documentation.

- ``NE_Color`` struct removed (I don't even know why I created it...).

- Examples updated to work with last version and added examples of clonning
  models, API and text system.

- libnds' console is not inited with Nitro Engine. You will have to init it
  yourself with ``NE_InitConsole()`` or libnds' functions.

Version 0.3.0 (2008-9-16)
-------------------------

- Support for animated models (NEA format) and a program to make a new NEA file
  from many models (in bin format).

- 2D over 3D system. You can draw easily quads (with or without texture) as if
  they were drawn using 2D.

- Basic physics engine (gravity, friction and collitions). It does only support
  bounding boxes for now.

- Added a function to delete all models, animated or not.

- Window system, very simple. I will make some API functions in next versions.

- Nitro Engine compiled as a library to include it easier in projects and save
  space.

- Examples folder organized a bit and added some new examples.

- Nitro Engine is now licensed under the BSD license.

Version 0.2.0 (2008-8-31)
-------------------------

- Added effects like fog and shading, functions to load BMP files and convert
  them in textures and more examples.

Version 0.1 (2008-8-24)
-----------------------

- Includes 2 examples, documentation, tools to export models from the PC, the
  license and full source.
