xatlas.js is a wrapper for xatlas for js. It uses emcc
to compile WASM from C++ codebase and can be used as a simple js module or as a webworker with comlink
xatlas is a small C++11 library with no external dependencies that generates unique texture coordinates suitable for baking lightmaps or texture painting. It is an independent fork of thekla_atlas, used by The Witness.
Check out xatlas-three package to directly use xatlasjs in three.js with web-workers.
- Add library to your
package.json
or donpm install xatlasjs
"devDependencies": {
"xatlasjs": "^0.1.0"
}
- Import or require class
XAtlasAPI
(fromdist/xatlas_web.js
) in your codebase and use wrapper functions for xatlas. See comments insource/web/index.js
. - Copy the file
dist/xatlas_web.wasm
, eg for webpack, install CopyPlugin and add this to the config
new CopyPlugin({
patterns: [
{ from: path.resolve('node_modules', 'xatlasjs','dist','xatlas_web.wasm'), to: path.resolve(BUILD_PATH, 'libs/') },
],
})
- Need to
locateFile
parameter function to theXAtlasAPI
constructor if thewasm
file is renamed or is not available from the website root.
- Install emscripten 2. (Tested with 2.0.7 on macOS).
- Run
npm install
- Run
npm run build
- this should generate files in thedist
folder.
First import the API class import {XAtlasAPI} from "xatlasjs"
and create an object.
const xAtlas = new XAtlasAPI(()=>{
console.log("on module loadede");
}, (path, dir)=>{
if (path === "xatlas_web.wasm") return "libs/" + path;
return dir + path;
}, (mode, progress)=>{
console.log("on progress ", mode, progress);
}
);
Use the object xAtlas
as:
- Create an empty atlas with
createAtlas
. - Add one or more meshes with
addMesh
. - Call
generateAtlas
. Meshes are segmented into charts, which are parameterized and packed into an atlas. The updated vertex and index buffers are returned along with the mesh object. - See
source/web/index.js
for complete API and example. The returned buffers are of different size than the inputs. Cleanup withdestroyAtlas
. This also does a leak check if enabled inbuild-web.sh
. see line 40.
This should be preferable, does not hang the web browser tab. Load the xatlas_web.js file as web worker. For webpack, add to config:
rules: [
{
test: /\.worker\.js/,
use: {
loader: "worker-loader",
options: { fallback: true }
}
}
]
Use in js example:
import { wrap, proxy } from "comlink";
import XAtlasWorker from "xatlasjs";
/**
* @class XAtlasAPI
*/
const XAtlasAPI = wrap(new XAtlasWorker());
let xAtlas = null;
// use in function
async () => {
if(xAtlas == null){
xAtlas = await new XAtlasAPI(
proxy(()=>console.log("loaded")),
proxy((path, dir)=>(path === "xatlas_web.wasm" ? "http://localhost:8000/libs/"+path:null)),
proxy((mode, progress)=> console.log("on progress ", mode, progress))
);
}
while (!(await xAtlas.loaded)){
await new Promise(r => setTimeout(r, 500)); // wait for load
}
await xAtlas.createAtlas();
// Add mesh
await xAtlas.addMesh(arguments);
let meshes = await xAtlas.generateAtlas(chartOptions, packOptions, true);
// Process meshes
await xAtlas.destroyAtlas();
}
Full Readme of xatlas
at its main repository.
Ignacio Castaño's blog post on thekla_atlas
P. Sander, J. Snyder, S. Gortler, and H. Hoppe. Texture Mapping Progressive Meshes
K. Hormann, B. Lévy, and A. Sheffer. Mesh Parameterization: Theory and Practice
P. Sander, Z. Wood, S. Gortler, J. Snyder, and H. Hoppe. Multi-Chart Geometry Images
D. Julius, V. Kraevoy, and A. Sheffer. D-Charts: Quasi-Developable Mesh Segmentation
B. Lévy, S. Petitjean, N. Ray, and J. Maillot. Least Squares Conformal Maps for Automatic Texture Atlas Generation
O. Sorkine, D. Cohen-Or, R. Goldenthal, and D. Lischinski. Bounded-distortion Piecewise Mesh Parameterization
Y. O’Donnell. Precomputed Global Illumination in Frostbite
aobaker - Ambient occlusion baking. Uses thekla_atlas.
Lightmapper - Hemicube based lightmap baking. The example model texture coordinates were generated by thekla_atlas.
Microsoft's UVAtlas - isochart texture atlasing.
Ministry of Flat - Commercial automated UV unwrapper.
seamoptimizer - A C/C++ single-file library that minimizes the hard transition errors of disjoint edges in lightmaps.
simpleuv - Automatic UV Unwrapping Library for Dust3D.