Repository navigation
Releases: OpenDroneMap/Obj2Tiles
Releases · OpenDroneMap/Obj2Tiles
Release list
v1.6.2
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_WriteToNamedFilefrom ANSI (LPStr) to UTF-8 (LPUTF8Str), resolving file-not-found errors on Windows when encoding KTX2 textures to paths with non-ASCII characters - Added
ToNativeLongPathhelper that prepends the\\?\extended-length prefix on Windows, lifting the 260-characterMAX_PATHlimitation that causedKTX_FILE_OPEN_FAILED(code 3) errors when writing deeply nested.b3dmtile output - Ensured output directory is created before
ktxTexture2_WriteToNamedFileis called, avoiding silent failures when the target folder does not yet exist
v1.6.1
Highlights
- Fixed OBJ parser to handle files with leading whitespace on directive lines
- Corrected
--divisionsparameter documentation to accurately describe binary splitting behavior
Added
- Added
--divisionsparameter clarification: this is a recursion depth for binary splitting along each axis, producing(2^divisions)^2tiles per LOD (notdivisions^2as 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, andusemtl. OBJ exporters may produce files with leading tabs, which previously caused themtllibdirective to be unrecognized, resulting in empty materials and"Material X not found"errors on everyusemtlline.
Docs
- Corrected octree tile count table from
divisions^2to(2^divisions)^2grid 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
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
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
--octreeflag 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--zsplitfor true 8-way octree. - Added
--lod-texture-scaleflag 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
- @spwoodcock made their first contribution in #94
- @pragmaware made their first contribution in #95
Full Changelog: v1.4.0...v1.5.0
v1.4.0
Highlights
- Added a new
VertexMediansplit strategy and--split-strategyparameter for more balanced mesh tiling (#92). - Improved the mesh simplification algorithm for better LOD generation (#91, #23).
- Added
--localparameter and fixed coordinate scaling issues (#92, #73).
Added / Changed
- Added new
VertexMediansplit strategy that partitions meshes based on vertex median position, producing more evenly distributed tiles (#92). - Added
--split-strategyparameter to select the mesh splitting method at runtime (#92). - Added
--localparameter 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
- Updated simplification algorithm by @HeDo88TH in #91
- New mesh split strategy and fixes by @HeDo88TH in #92
Full Changelog: v1.3.0...v1.4.0
v1.3.0
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
usemtldirectives with no subsequent faces.
Added / Changed
- Added fan triangulation for quad and n-gon faces (
fwith 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 throwingNotSupportedException(#64). - The default material inserted by
ObjParsernow carriesName = "default"so thatGetMaterialIndexOrDefaultresolves 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 requiredsegs.Length == 3instead 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 amap_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 exceed1.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 trailingusemtldirectives without subsequent faces (#54). - Fixed orphan
usemtlentries inObjMesh.ReadFilethat caused a mismatch betweenSubMeshMaterialsandSubMeshIndices, crashingWriteFile. - Fixed various nullable reference warnings throughout the codebase.
Full Changelog: v1.2.0...v1.3.0
v1.2.0
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
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
- @dknezevic made their first contribution in #78
- @tgdflav made their first contribution in #74
Full Changelog: v1.0.13...v1.1.0
v1.0.13
What's Changed
- Changes to support coordinate system that use units other than meters. by @andreiveselov in #52
- added support for meshes with diffuse AND normal map by @charly-perspectives in #51
- Minor improvements by @HeDo88TH in #56
- Consider remapping uv range [0, 1] to image pixel range [0, w-1] (or [0, h-1]) in MeshT.BinPackTextures by @EzioHelios in #57
- Y up translation by @dashenxian in #63
- Support texture coordinates greater than1 by @dashenxian in #62
- Target .NET 8.0 by @amiuhle in #70
- Minor improvements, refactor and cleanup by @HeDo88TH in #71
- Update linux-arm.pubxml to build arm ELF in 64bit by @cjgarson in #72
New Contributors
- @andreiveselov made their first contribution in #52
- @charly-perspectives made their first contribution in #51
- @EzioHelios made their first contribution in #57
- @dashenxian made their first contribution in #63
- @amiuhle made their first contribution in #70
- @cjgarson made their first contribution in #72
Full Changelog: v1.0.12...v1.0.13