Skip to content

Releases: OpenDroneMap/Obj2Tiles

v1.6.2

Choose a tag to compare

@github-actions github-actions released this 25 Jul 10:42

Highlights

  • Fixed KTX2 encoding failures on Windows when output paths exceed the 260-character MAX_PATH limit or contain non-ASCII characters

Fixed

  • Fixed P/Invoke marshalling of ktxTexture2_WriteToNamedFile from ANSI (LPStr) to UTF-8 (LPUTF8Str), resolving file-not-found errors on Windows when encoding KTX2 textures to paths with non-ASCII characters
  • Added ToNativeLongPath helper that prepends the \\?\ extended-length prefix on Windows, lifting the 260-character MAX_PATH limitation that caused KTX_FILE_OPEN_FAILED (code 3) errors when writing deeply nested .b3dm tile output
  • Ensured output directory is created before ktxTexture2_WriteToNamedFile is called, avoiding silent failures when the target folder does not yet exist

v1.6.1

Choose a tag to compare

@github-actions github-actions released this 22 Jul 12:23

Highlights

  • Fixed OBJ parser to handle files with leading whitespace on directive lines
  • Corrected --divisions parameter documentation to accurately describe binary splitting behavior

Added

  • Added --divisions parameter clarification: this is a recursion depth for binary splitting along each axis, producing (2^divisions)^2 tiles per LOD (not divisions^2 as previously stated)
  • Added explicit per-LOD depth formula for octree mode: lodDivisions = divisions + lods - index - 1, with updated example table showing correct tile counts

Fixed

  • Fixed OBJ parser silently skipping lines with leading whitespace (tabs or spaces) before directive keywords like v, vt, vn, f, mtllib, and usemtl. OBJ exporters may produce files with leading tabs, which previously caused the mtllib directive to be unrecognized, resulting in empty materials and "Material X not found" errors on every usemtl line.

Docs

  • Corrected octree tile count table from divisions^2 to (2^divisions)^2 grid per LOD, matching actual splitting behavior
  • Updated CLI examples to reflect correct tile counts for --divisions 3 (8x8 grid, 64 tiles per LOD instead of 9)

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 20 Jul 16:37

Highlights

  • Added support for 3TZ output format, enabling packaged 3D Tiles archives for easier distribution.
  • Added KTX2 texture compression support for smaller tile payloads.
  • Added WebP texture output with a configurable texture size cap for improved performance.

Added / Changed

  • Added 3TZ output format (--output-format 3tz) via #97.
  • Added KTX2 texture compression support via #97.
  • Added WebP texture output with configurable texture size cap via #97.
  • Improved texture bin-packing algorithm for better atlas utilization.
  • Improved geometric error calculation for more accurate LOD selection (#96).
  • Added root renderable content for improved compatibility with 3D Tiles viewers (#96).
  • Added script to update the bundled libktx2 vendor dependency.
  • Cleaned up CLI options and updated option descriptions.

Fixed

  • Fixed B3DM byte alignment issue causing rendering artifacts.
  • Fixed texture name collision when processing models with multiple meshes.
  • Fixed out-of-range vertex color values causing incorrect output.
  • Fixed temporary file deletion failing under certain conditions.
  • Improved input validation and robustness checks (#96).

Merged PRs

Full Changelog: v1.5.0...v1.6.0

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 01 Jul 09:35

Highlights

  • Added octree spatial subdivision mode for proper parent-child tile hierarchies in tileset.json
  • Added per-LOD texture downscaling to significantly reduce memory usage for large models
  • Parallelized tile writing and sped up texture repacking for faster overall processing

Added / Changed

  • Added --octree flag for octree spatial subdivision: each LOD gets one additional division level, producing a proper tree hierarchy in tileset.json instead of per-tile LOD chains. Combine with --zsplit for true 8-way octree.
  • Added --lod-texture-scale flag for per-LOD texture downscaling. LOD-0 always keeps full resolution; each subsequent LOD multiplies the previous atlas resolution by the given factor. Uses Lanczos resampling (ImageSharp default); LOD-0 preserves the original texture format, coarser LODs are JPEG at quality 75.
  • Parallelized tile writing across all tiles and LODs.
  • Added progress output during large texture packing to indicate the process is not stuck.
  • Improved material file (.mtl) parsing: resolve textures relative to the mtl file or the obj file; support path components with Unix or Windows separators; support spaces in file paths; fix Ka/Kd/Ks colors to use three components instead of four.
  • Added Dockerfile with multi-arch (Linux x64 and arm64) support and trimming for minimal runtime footprint.
  • Added CI workflow for building and publishing multi-arch Docker images to ghcr.io.
  • Reduced complexity of finding remaining face indexes during splitting, improving speed.
  • Rewrote README with comprehensive parameter reference tables, pipeline stage documentation, and usage examples.

Fixed

  • Fixed texture visual artefact caused by wrong padding/scaling interactions during texture repacking.
  • Fixed handling of .mtl files with spaces in the filename.
  • Added path-traversal guards in CopyObjDependencies to prevent .. from escaping the output folder.
  • Fixed final binary name casing (Obj2Tiles) in CI publish workflow.

Merged PRs

  • Add Dockerfile & ghcr container build workflow by @spwoodcock in #94
  • Add support for octree, texture downscaling and other improvements by @pragmaware in #95

New Contributors

Full Changelog: v1.4.0...v1.5.0

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 17 Mar 08:45

Highlights

  • Added a new VertexMedian split strategy and --split-strategy parameter for more balanced mesh tiling (#92).
  • Improved the mesh simplification algorithm for better LOD generation (#91, #23).
  • Added --local parameter and fixed coordinate scaling issues (#92, #73).

Added / Changed

  • Added new VertexMedian split strategy that partitions meshes based on vertex median position, producing more evenly distributed tiles (#92).
  • Added --split-strategy parameter to select the mesh splitting method at runtime (#92).
  • Added --local parameter to support local (non-georeferenced) coordinate systems (#92).
  • Updated the mesh simplification algorithm with improved vertex decimation and refactored options (#91, #23).
  • Removed dead code and cleaned up internal structure (#91).
  • Updated README documentation.
  • Expanded test suite for the new split strategies and simplification logic.

Fixed

  • Fixed coordinate scaling issues that caused incorrect tile placement (#92, #73).
  • Fixed a recursion bug in the mesh splitting pipeline (#92).
  • Fixed a bug in the split strategy logic that could produce incorrect partitions (#91).

Merged PRs

Full Changelog: v1.3.0...v1.4.0

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 16 Feb 10:31

Highlights

  • Fixed tiles generating without textures/colors for materials with only diffuse color (Kd) and no texture map.
  • Added support for quad and n-gon faces via fan triangulation.
  • OBJ files with line elements (l) are now processed without errors.
  • Negative/out-of-range UV coordinates are now wrapped instead of throwing an exception.
  • Fixed crash caused by orphan usemtl directives with no subsequent faces.

Added / Changed

  • Added fan triangulation for quad and n-gon faces (f with 4+ vertices) in the splitting-stage OBJ parser (MeshUtils.LoadMesh), resolving issues with models exported from Blender and other tools (#60).
  • UV coordinates outside the [0, 1] range are now wrapped via modulo instead of throwing an "Invalid texture coordinates" exception (#35).
  • Line elements (l) are now gracefully skipped instead of throwing NotSupportedException (#64).
  • The default material inserted by ObjParser now carries Name = "default" so that GetMaterialIndexOrDefault resolves it correctly in the glTF converter.
  • Material lookup in the glTF converter (Converter.cs) now searches by name instead of relying solely on the index, which could diverge when the default material is inserted at index 0 (#36).
  • Fixed the vn (vertex normals) parser branch that incorrectly required segs.Length == 3 instead of >= 4.
  • Bumped assembly/file version to 1.3.0.
  • Improved nullable annotations across ObjMesh, CommonUtils, MeshT, Material, and other classes to eliminate compiler warnings.
  • Significantly expanded the test suite with new test classes: ObjParsingTests, MtlParsingTests, BoundsTests, SplitMultiAxisTests, RecurseSplitTests, ObjMeshParsingTests, ObjParserGltfTests, and corresponding test data files.
  • Updated publish profiles.

Fixed

  • Fixed tiles generating without texture when the OBJ material uses only Kd (diffuse color) without a map_Kd (texture map) — the glTF output was incorrectly falling back to a grey default material (#36).
  • Fixed "Invalid texture coordinates" exception when UV coordinates are negative or exceed 1.0, common with 3ds Max exports and UDIM workflows (#35).
  • Fixed "Element not supported: 'l ...'" exception when OBJ files exported from Blender contain line elements (#64).
  • Fixed first LOD level not writing tiles during the splitting stage when quads/n-gons were present in the OBJ file (#60).
  • Fixed "The number of sub-mesh material names does not match the count of sub-mesh index arrays" crash caused by trailing usemtl directives without subsequent faces (#54).
  • Fixed orphan usemtl entries in ObjMesh.ReadFile that caused a mismatch between SubMeshMaterials and SubMeshIndices, crashing WriteFile.
  • Fixed various nullable reference warnings throughout the codebase.

Full Changelog: v1.2.0...v1.3.0

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 12 Feb 08:44

What's Changed

  • Repacking textures with bleed ring. by @dknezevic in #85
  • Added support for vertex colors by @HeDo88TH in #88
  • Upgraded to .NET 10 — All projects, CI workflows, and publish profiles now target .NET 10.0.

Full Changelog: v1.1.0...v1.2.0

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 00:08
56b236b

What's Changed

  • Taking into account missing tiles on lower LODs by @dknezevic in #78
  • fixed exception when loading obj with texture coordinates but no material assigned by @tgdflav in #74
  • Fix copy file behavior: Using trimmed line to get file path in Utils.cs by @EzioHelios in #58
  • Ensure GLB data is padded to 8-byte alignment so that validation checks pass by @dknezevic in #80
  • Housekeeping by @HeDo88TH in #83

New Contributors

Full Changelog: v1.0.13...v1.1.0

v1.0.13

Choose a tag to compare

@github-actions github-actions released this 06 Nov 09:10
359d1df

What's Changed

New Contributors

Full Changelog: v1.0.12...v1.0.13

v1.0.12

Choose a tag to compare

@github-actions github-actions released this 03 Apr 19:55
Update publish .net version