Skip to main content
Loss of provenance

A previous release had provenance metadata, but this release does not. View details.

almeshmerge

High-performance OBJ merge and atlas generation library.

Build

chcp 65001 && uv build --wheel --out-dir dist

Local Build Matrix (Windows host + Docker Desktop)

Use this when you want to avoid GitHub Actions quota and build all wheels locally.

Target matrix:

  • Windows: cp311, cp312, cp313, cp314
  • Linux (manylinux via Docker): cp311, cp312, cp313, cp314

One-command build:

powershell -ExecutionPolicy Bypass -File .\scripts\build_local_wheels.ps1

The script will:

  • build Windows wheels with local Python 3.11~3.14
  • build Linux wheels with cibuildwheel in Docker
  • copy all wheels to a host folder like artifacts/wheelhouse/<timestamp>

Optional arguments:

# custom output folder on host
powershell -ExecutionPolicy Bypass -File .\scripts\build_local_wheels.ps1 -OutputDir "D:\wheel-output"

# build only Linux wheels
powershell -ExecutionPolicy Bypass -File .\scripts\build_local_wheels.ps1 -SkipWindows

# build only Windows wheels
powershell -ExecutionPolicy Bypass -File .\scripts\build_local_wheels.ps1 -SkipLinux

# build then upload from host (requires host-side PyPI credentials)
powershell -ExecutionPolicy Bypass -File .\scripts\build_local_wheels.ps1 -UploadToPyPI

If you prefer manual upload, run:

powershell -ExecutionPolicy Bypass -File .\scripts\upload_wheels.ps1 -WheelDir ".\artifacts\wheelhouse\<timestamp>"

CI Release (GitHub Actions)

  • Workflow: .github/workflows/release.yml
  • Trigger:
    • Push tag: v* (recommended, for example v0.1.29)
    • Manual run: workflow_dispatch
  • Build matrix:
    • OS: Linux (ubuntu-latest) and Windows (windows-latest)
    • Python: 3.11, 3.12, 3.13, 3.14 (wheel via cibuildwheel)
  • Publish:
    • Uses PyPI Trusted Publisher (OIDC), no API token required in repository secrets.
    • A pre-publish guard checks that tag version matches pyproject.toml version.

Recommended release commands:

git tag v0.1.29
git push github v0.1.29

If a run fails due to transient CI issues, rerun the failed jobs from the GitHub Actions UI or use workflow_dispatch.

Python API

from almeshmerge import merge_obj_to_atlas

result = merge_obj_to_atlas(
    input_objs=["a.obj", "b.obj"],
    output_dir="out",
    split_o=True,
    split_g=True,
    atlas_max_size=8192,
    atlas_padding=4,
    atlas_pow2=True,
    atlas_allow_rotate_90=True,
    atlas_max_count=0,
    spatial_cluster_radius=-1.0,
    atlas_target_utilization=0.92,
    uv_repeat_exclude_merge=True,
    simplify_ratio=0.8,
    vertex_key_mode="pos",  # default: keep topology vertex count stable
)
print(result)

Parameters

  • split_o: Whether to split by o objects.
  • split_g: Whether to split by g groups.
  • front_axis / up_axis: Input axis convention, defaults to Y-front and Z-up.
  • right_handed: Use right-handed axis transform.
  • atlas_max_size: Max atlas side length.
  • atlas_padding: Padding pixels between packed textures.
    • Default is 4.
    • For Blender viewport preview, 8 or higher is often safer if you see tile-edge bleed.
    • In Blender, prefer Image Texture Extension=Extend or Clip for atlas materials.
  • atlas_pow2: Force atlas width/height to powers of two.
  • atlas_allow_rotate_90: Allow 90-degree placement rotation.
  • atlas_max_count: Max number of generated atlases (0 means unlimited).
  • spatial_cluster_radius: Spatial clustering radius for unit-wise texture packing (<=0 disables clustering).
  • atlas_target_utilization: Target utilization threshold used to trigger extra packing refinement.
  • uv_repeat_exclude_merge: Exclude UV-repeat units from merge and keep them as original textures.
  • simplify_ratio: Mesh simplification ratio before export.
  • vertex_key_mode: Export dedup key mode. pos is default and keeps topology vertex count stable while writing split v/vt/vn indices; pos_uv ignores normal in dedup; full keeps position+UV+normal in a unified index.

Diagnostics for Atlas Stability

merge_obj_to_atlas() now returns extra diagnostics that help locate parameter-sensitive texture issues:

  • diagnostics.atlas_rot90_count / diagnostics.atlas_rot90_ratio
  • diagnostics.uv_edge_01_hits / diagnostics.uv_near_edge_hits
  • compose_diagnostics.crop_size_mismatch_count
  • compose_diagnostics.crop_size_mismatches (first 20 samples)

Interpretation:

  • crop_size_mismatch_count == 0 means C++ crop estimation and Python crop execution are consistent.
  • uv_edge_01_hits == 0 means remapped UVs do not collapse to exact 0/1 boundaries.
  • Large changes in atlas_rot90_ratio across parameter sets are expected and indicate different packing paths.

Regression Matrix (Recommended)

For Blender preview stability, run at least:

  • atlas_padding: 4, 8
  • atlas_max_size: 2048, 4096, 8192

Pass criteria:

  • No visible large-scale texture scramble in Blender.
  • compose_diagnostics.crop_size_mismatch_count == 0.
  • diagnostics.uv_edge_01_hits == 0.

 

本地构建

# 构建全部 8 个 wheel
.\scripts\build_local_wheels.ps1

# 只构建 Windows
.\scripts\build_local_wheels.ps1 -SkipLinux

# 只构建 Linux
.\scripts\build_local_wheels.ps1 -SkipWindows

# 上传(自动找最新构建目录)
.\scripts\upload_wheels.ps1

# 构建完直接上传
.\scripts\build_local_wheels.ps1 -UploadToPyPI

本地构建 Debug 版本

# 仅构建
.\scripts\build_debug_wheel.ps1

# 构建并上传
.\scripts\build_debug_wheel.ps1 -UploadToPyPI

Metadata

Release files for almeshmerge 0.1.48

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Loss of provenance

These files do not have provenance metadata, despite files in a prior release including this data.

We recommend further investigation before installing these files. View details.

Built distributions (wheels)

Table of built distributions (wheels) for almeshmerge 0.1.48
File Actions
almeshmerge-0.1.48-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details for almeshmerge-0.1.48-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
almeshmerge-0.1.48-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for almeshmerge-0.1.48-cp313-cp313-win_amd64.whl
almeshmerge-0.1.48-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for almeshmerge-0.1.48-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
almeshmerge-0.1.48-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for almeshmerge-0.1.48-cp312-cp312-win_amd64.whl
almeshmerge-0.1.48-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for almeshmerge-0.1.48-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
almeshmerge-0.1.48-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for almeshmerge-0.1.48-cp311-cp311-win_amd64.whl
almeshmerge-0.1.48-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details for almeshmerge-0.1.48-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Total release size: 2.2 MB

Release files / almeshmerge-0.1.48-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 440.1 kB
Tags CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f117b3012ca96919a7a0e85db89b925044bb56ff9ef15c197951f9db6e189beb
BLAKE2b-256 checksum
How to use checksums
272bbc57ad398c4725494250c9e7fea9fcf816a870c6db0b1e8b0476f6ecba1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / almeshmerge-0.1.48-cp313-cp313-win_amd64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp313-cp313-win_amd64.whl
Size 141.7 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
514c80af3533be450d5f154f0cc8cc0506c5d83da6766fb8e0d2fa638089f202
BLAKE2b-256 checksum
How to use checksums
abe11ae88c8d230fbf331a4d693aa01f17eeee55e2d3fdab5c6b7ec6db9afcec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / almeshmerge-0.1.48-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 440.1 kB
Tags CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
099c587f944fd45446fb3ee780ebe40bebe0ddbd6a40a3b6afbe5d746a2e82d0
BLAKE2b-256 checksum
How to use checksums
b6ceb14b940c8886f02646eded5f3c31813dcfcbef50f3f863286031caf62fb5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / almeshmerge-0.1.48-cp312-cp312-win_amd64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp312-cp312-win_amd64.whl
Size 142.5 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
c9c0a1b795b63a63ae1daa057e470b403845d46a746f3814b2519af1beff43a2
BLAKE2b-256 checksum
How to use checksums
629e1025311039c3604b0471b3cfd78e3fbf4f98750433adb3cfe1639353d2c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / almeshmerge-0.1.48-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 440.6 kB
Tags CPython 3.12 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
4429a4aeac3047410c56bba56d0947b1ba1efbe91ae4228592a4028d4fe24c26
BLAKE2b-256 checksum
How to use checksums
5acad82462b315de969c9f86d2a6b333f7ca844c6d60ab7743d95051635f50f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / almeshmerge-0.1.48-cp311-cp311-win_amd64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp311-cp311-win_amd64.whl
Size 142.0 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
68a316b8b729503f39d8568a14789ae08ec9d0713cf3479dc0c01377d6c4b89b
BLAKE2b-256 checksum
How to use checksums
ad3f2f1f4253e9726b95d4dedeb4e89fbad27a8edb156e038779de085ee939e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / almeshmerge-0.1.48-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Loss of provenance

This file belongs to a release without provenance metadata, despite a prior release including this data.

We recommend further investigation before installing this file. View details.

Download URL almeshmerge-0.1.48-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 440.5 kB
Tags CPython 3.11 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1af5ed148ebad3ed7d991744eee662dee6234fd86b853847e633e09b9117325a
BLAKE2b-256 checksum
How to use checksums
e47e60799104b04ba069173759b8c9b590a3f7829cd7bc6f6dd29852966b664a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Security for almeshmerge 0.1.48

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Loss of provenance

A previous release of these files had provenance metadata, but this release does not.

While this could reflect a routine change by the project maintainers, it may also indicate that the release files have been compromised.

Release comparison

  • Removed 0.1.38 8 files With provenance
  • Added 0.1.48 7 files Without provenance

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page