{"id":17250104,"url":"https://github.com/stephengold/monkeywrench","last_synced_at":"2025-10-13T15:08:39.561Z","repository":{"id":193927368,"uuid":"689721330","full_name":"stephengold/MonkeyWrench","owner":"stephengold","description":"A versatile library for loading 3-D assets into JMonkeyEngine  (code has New BSD license) ","archived":false,"fork":false,"pushed_at":"2025-09-29T18:33:11.000Z","size":59588,"stargazers_count":19,"open_issues_count":1,"forks_count":1,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-09-29T20:41:29.443Z","etag":null,"topics":["3d-models","asset-loader","assimp","importer","java","jme3","jmonkeyengine","jmonkeyengine3","jvm-library","lwjgl3","open-source"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stephengold.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-09-10T17:42:54.000Z","updated_at":"2025-09-29T18:33:14.000Z","dependencies_parsed_at":"2023-09-10T20:35:43.013Z","dependency_job_id":"e8e4b659-1fa0-49b9-803f-939c615f828d","html_url":"https://github.com/stephengold/MonkeyWrench","commit_stats":null,"previous_names":["stephengold/monkeywrench"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/stephengold/MonkeyWrench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMonkeyWrench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMonkeyWrench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMonkeyWrench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMonkeyWrench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stephengold","download_url":"https://codeload.github.com/stephengold/MonkeyWrench/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMonkeyWrench/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279015904,"owners_count":26085777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d-models","asset-loader","assimp","importer","java","jme3","jmonkeyengine","jmonkeyengine3","jvm-library","lwjgl3","open-source"],"created_at":"2024-10-15T06:46:13.217Z","updated_at":"2025-10-13T15:08:39.553Z","avatar_url":"https://github.com/stephengold.png","language":"Java","readme":"\u003cimg height=\"150\" src=\"https://i.imgur.com/ivp31XQ.png\" alt=\"MonkeyWrench Project logo\"\u003e\n\n[The MonkeyWrench Project][project] is developing\na software library to load 3-D assets into [JMonkeyEngine][jme].\n\nIt contains 2 subprojects:\n\n1. lib: the MonkeyWrench [JVM] runtime library based on lwjgl-assimp\n2. apps: related applications,\n   including examples and non-automated test software\n\nMonkeyWrench attempts to load 3-D models and animations\nin a wide variety of formats, including:\n\n+ [3D Studio Max (.3ds)][3ds]\n+ [3-D Manufacturing Format (.3mf)][3mf]\n+ [Blender] (.blend) *Support for this format is deprecated.*\n+ [Biovision Hierarchy (.bvh)][bvh]\n+ [COLLADA] (.dae)\n+ [Autodesk Filmbox (.fbx)][fbx] *best for versions 7.1 through 7.4; other versions are unsupported*\n+ [Khronos glTF (.glb and .gltf)][gltf], including Draco, version 1.0, and version 2.0\n+ [LightWave Model (.lwo)][lwo]\n+ [Ogre mesh (.mesh.xml)][ogre] (but not .scene files)\n+ [Wavefront (.obj)][obj]\n+ [Polygon File Format (.ply)][ply], both ASCII and binary\n+ [Stereolithography (.stl)][stl], both ASCII and binary\n\nComplete source code (in [Java]) is provided under\n[a 3-clause BSD license][license].\n\n\n\u003ca name=\"toc\"\u003e\u003c/a\u003e\n\n## Contents of this document\n\n+ [How to add MonkeyWrench to an existing project](#add)\n+ [How to build MonkeyWrench from source](#build)\n+ [Related applications](#apps)\n+ [Acknowledgments](#acks)\n\n\n\u003ca name=\"add\"\u003e\u003c/a\u003e\n\n## How to add MonkeyWrench to an existing project\n\nMonkeyWrench comes pre-built as a single library that depends on:\n+ [LWJGL version 3][lwjgl],\n+ lwjgl-assimp,\n+ jme3-core,\n+ jme3-desktop,\n+ jme3-lwjgl3,\n+ [imageio-tga][twelve],\n+ [imageio-webp][twelve],\n+ [Heart], and\n+ [Wes].\n\n(Since MonkeyWrench depends on jme3-desktop and jme3-lwjgl3,\nit incompatible with LWJGL version 2 (jme3-lwjgl),\nnor will it run on mobile platforms such as Android.\nHowever, loaded assets can be saved as J3O for use in any JME application.)\n\nAdding MonkeyWrench to an existing [jMonkeyEngine][jme] project\nbegins with ensuring that these libraries are on the classpath.\n\nFor projects built using [Maven] or [Gradle], it is sufficient to add a\ndependency on the MonkeyWrench Library.\nThe build tool should automatically resolve the remaining dependencies.\n\n### Gradle-built projects\n\nAdd to the project’s \"build.gradle\" or \"build.gradle.kts\" file:\n\n    repositories {\n        mavenCentral()\n    }\n    dependencies {\n        implementation(\"com.github.stephengold:MonkeyWrench:1.0.0\")\n    }\n\nFor some older versions of Gradle,\nit's necessary to replace `implementation` with `compile`.\n\n### Maven-built projects\n\nAdd to the project’s \"pom.xml\" file:\n\n    \u003crepositories\u003e\n      \u003crepository\u003e\n        \u003cid\u003emvnrepository\u003c/id\u003e\n        \u003curl\u003ehttps://repo1.maven.org/maven2/\u003c/url\u003e\n      \u003c/repository\u003e\n    \u003c/repositories\u003e\n\n    \u003cdependency\u003e\n      \u003cgroupId\u003ecom.github.stephengold\u003c/groupId\u003e\n      \u003cartifactId\u003eMonkeyWrench\u003c/artifactId\u003e\n      \u003cversion\u003e1.0.0\u003c/version\u003e\n    \u003c/dependency\u003e\n\n### Configuring the asset manager\n\nThe MonkeyWrench loader class is named `LwjglAssetLoader`.\n\nOnce the classpath is configured, the next step is to\nconfigure the application's `AssetManager`\nto use `LwjglAssetLoader` in place of its default loaders.\nIn Java:\n\n    import com.github.stephengold.wrench.LwjglAssetLoader;\n    // ...\n    assetManager.registerLoader(LwjglAssetLoader.class,\n            \"3ds\", \"3mf\", \"blend\", \"bvh\", \"dae\", \"fbx\", \"glb\", \"gltf\",\n            \"lwo\", \"meshxml\", \"mesh.xml\", \"obj\", \"ply\", \"stl\");\n\n### Further considerations\n\n#### Verbose logging\n\nFor more diagnostic information while loading assets,\ninvoke `loadModel()` on an `LwjglAssetKey` with verbose logging enabled.\nIn Java:\n\n    LwjglAssetKey key = new LwjglAssetKey(\"Models/m/m.mesh.xml\");\n    key.setVerboseLogging(true);\n    Spatial m = assetManager.loadModel(key);\n\n#### Choice of file format\n\nIf the asset to be loaded is available in multiple file formats,\nthe best choice would be glTF version 2.0 (either .glb or .gltf format).\nFor best results, convert assets in .blend or .fbx format\nto glTF _before_ loading them using MonkeyWrench.\n\nThe next-best choice would be Collada (.dae) format.\n\nThe most efficient format\nfor loading model assets into JMonkeyEngine is \".j3o\".\nBest practice is to convert assets to .j3o at build time, not during gameplay.\n\n#### Structure of loaded assets\n\nAn asset loaded using MonkeyWrench might be structured differently from\nthe same asset loaded using jme3-core or jme3-plugins.\nIn particular:\n\n+ MonkeyWrench always uses\n  JMonkeyEngine's new animation system (com.jme3.anim package),\n  not the old one (com.jme3.animation package).\n  Jme-plugins still uses the old animation system when loading some assets.\n+ Scene-graph controls (such as `AnimComposer` and `SkinningControl`)\n  might be added to different spatials.\n+ It might have a different number of nodes, joints, or mesh vertices.\n+ Its spatials, materials, animation clips, joints, lights,\n  and cameras might not have the same names or indices.\n\nJMonkeyEngine applications\nshould minimize their assumptions about asset structure.\n\n#### Finding external textures\n\nMany 3-D models rely on textures\nstored in separate files and referenced by name.\nIf the files get moved around or converted to different formats,\nthe filenames stored in the main asset may become outdated.\nEven though the textures are available, the asset manager doesn't find them,\nso it replaces them with placeholders.\n\nTo address this issue,\nMonkeyWrench embeds a configurable `TextureLoader` in each `LwjglAssetKey`.\nThe `TextureLoader` manipulates texture filenames\nto help MonkeyWrench find textures.\n\nA `TextureLoader` consists of 2 parts:\n+ a preliminary transformation, encoded as a `PathEdit` enum value and\n+ a search path, consisting of one or more\n  [format strings](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html).\n\nBefore the preliminary transformation is applied, the texture filename\nis URL encoded (converting each blank to \"%20\", for instance).\n\nThe preliminary transformation is either:\n+ `NoOp` which does nothing or\n+ `LastComponent` which, if the filename contains backslash,\n  deletes everything up to and including the final backslash.\n\nAfter the preliminary transformation is applied,\nthe filename is split into 2 parts:\n+ the base name (the part before the final \".\") and\n+ the extension (the final \".\" and everything after it)\n\nFinally, the `TextureLoader` attempts to load the texture\nusing the filenames generated by each format string in its search path.\n\nIn this context, format strings have the following semantics:\n+ \"%1$s\" is replaced by\n  the name of the folder from which the main asset was loaded\n+ \"%2$s\" is replaced by the texture's base name\n+ \"%3$s\" is replaced by the texture's extension\n+ \"%4$s\" is replaced by the name of the main asset with its extension removed\n+ \"%5$s\" is replaced by the texture's base name converted to lowercase\n\nFor example, if the main asset was loaded using\n\n    TextureLoader textureLoader\n            = new TextureLoader(PathEdit.LastComponent,\n                    \"%s%s%s\",\n                    \"%stextures/%s.JPG\",\n                    \"Textures/%2$s%3$s\");\n    LwjglAssetKey key = new LwjglAssetKey(\"source/diorama.fbx\", textureLoader);\n\nand the stored filename is \"C:\\My Documents\\UV_Barn_Assets.psd\", then\n\n+ \"%1$s\" will be replaced by \"source/\",\n+ \"%2$s\" will be replaced by \"UV_Barn_Assets\",\n+ \"%3$s\" will be replaced by \".psd\",\n+ \"%4$s\" will be replaced by \"source/diorama\", and\n+ \"%5$s\" will be replaced by \"uv_barn_assets\".\n\nMonkeyWrench will try the following filenames, in sequence:\n\n1. \"source/UV_Barn_Assets.psd\"\n2. \"source/textures/UV_Barn_Assets.JPG\"\n3. \"Textures/UV_Barn_Assets.psd\"\n\nMonkeyWrench will generate a placeholder\nonly if no texture is found at any of those filenames.\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"build\"\u003e\u003c/a\u003e\n\n## How to build MonkeyWrench from source\n\n1. Install a [Java Development Kit (JDK)][adoptium],\n   version 17 or higher,\n   if you don't already have one.\n2. Point the `JAVA_HOME` environment variable to your JDK installation:\n   (In other words, set it to the path of a directory/folder\n   containing a \"bin\" that contains a Java executable.\n   That path might look something like\n   \"C:\\Program Files\\Eclipse Adoptium\\jdk-17.0.3.7-hotspot\"\n   or \"/usr/lib/jvm/java-17-openjdk-amd64/\" or\n   \"/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home\" .)\n  + using Bash or Zsh: `export JAVA_HOME=\"` *path to installation* `\"`\n  + using [Fish]: `set -g JAVA_HOME \"` *path to installation* `\"`\n  + using Windows Command Prompt: `set JAVA_HOME=\"` *path to installation* `\"`\n  + using PowerShell: `$env:JAVA_HOME = '` *path to installation* `'`\n3. Download and extract the MonkeyWrench source code from GitHub:\n  + using [Git]:\n    + `git clone https://github.com/stephengold/MonkeyWrench.git`\n    + `cd MonkeyWrench`\n    + `git checkout -b latest 1.0.0`\n  + using a web browser:\n    + browse to [the latest release][latest]\n    + follow the \"Source code (zip)\" link\n    + save the ZIP file\n    + extract the contents of the saved ZIP file\n    + `cd` to the extracted directory/folder\n4. Run the [Gradle] wrapper:\n  + using Bash or Fish or PowerShell or Zsh: `./gradlew build`\n  + using Windows Command Prompt: `.\\gradlew build`\n\nAfter a successful build,\nMaven artifacts will be found in \"lib/build/libs\".\n\nYou can install the artifacts to your local Maven repository:\n+ using Bash or Fish or PowerShell or Zsh: `./gradlew install`\n+ using Windows Command Prompt: `.\\gradlew install`\n\nYou can restore the project to a pristine state:\n+ using Bash or Fish or PowerShell or Zsh: `./gradlew clean cleanDownloads`\n+ using Windows Command Prompt: `.\\gradlew clean cleanDownloads`\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"apps\"\u003e\u003c/a\u003e\n\n## Related applications\n\nThe following desktop applications are found in the \"apps\" subproject:\n\n### ImportMixamo\n\nA console application to import characters and animations from [Mixamo],\nfor use with JMonkeyEngine.\n\nBefore running it, download a single character (and any desired\nanimations for that character) to the \"downloads/Mixamo/dae/\" directory.\n\nAll assets should be downloaded in Collada (.dae) format.\nMixamo automatically archives each downloaded asset using \"zip\".\n\n`ImportMixamo` expects each zip archive\nto contain a .dae file with the same name.\nIf any downloaded assets get renamed (due to filename conflicts)\nyou'll need to unzip them, rename the .dae files, and re-zip them.\nOther than that, it shouldn't be necessary to modify downloaded assets.\n\nThe character should be downloaded in \"T-pose\".\nEach animation should be downloaded \"in place\" (if possible) and without\nskin.\n\nYou can run the application from the command line:\n+ using Bash or Fish or PowerShell or Zsh: `./gradlew ImportMixamo`\n+ using Windows Command Prompt: `.\\gradlew ImportMixamo`\n\nAfterwards, the imported assets should be in the\n\"apps/Written Assets\" directory.\n\n### CompareLoaders\n\nA graphical tool for comparing MonkeyWrench\nto the asset loaders built into JMonkeyEngine.\n\nYou can run it from the command line:\n+ using Bash or Fish or PowerShell or Zsh: `./gradlew CompareLoaders`\n+ using Windows Command Prompt: `.\\gradlew CompareLoaders`\n\n#### Test data\n\nThe first time CompareLoaders is run,\nthe buildscript downloads about 230 MBytes of test data from maven.org .\nOn subsequent runs, startup should go more quickly.\n\nThe application also looks for (optional) test data in\n\"../ext/assimp-mdb/model-db\" relative to the project root.\nThese data (about 10 MBytes) can be installed using Bash and [Git]:\n+ `mkdir -p ../ext`\n+ `cd ../ext`\n+ `git clone https://github.com/assimp/assimp-mdb.git`\n+ `cd ../CompareLoaders`\n\nThe application also looks for (optional) test data in\n\"../ext/glTF-Sample-Assets\" relative to the project root.\nThese data (about 1.9 GBytes) can be installed using Bash and [Git]:\n+ `mkdir -p ../ext`\n+ `cd ../ext`\n+ `git clone https://github.com/KhronosGroup/glTF-Sample-Assets.git`\n+ `cd ../CompareLoaders`\n\nThe application also looks for (optional) test data in\n\"../ext/glTF-Sample-Models\" relative to the project root.\nThese data (about 3.7 GBytes) can be installed using Bash and [Git]:\n+ `mkdir -p ../ext`\n+ `cd ../ext`\n+ `git clone https://github.com/KhronosGroup/glTF-Sample-Models.git`\n+ `cd ../CompareLoaders`\n\nYou can also install (optional) test data (about 890 MBytes)\nfrom the Amazon Lumberyard:\n+ using Bash or Fish or PowerShell or Zsh: `./gradlew bistro`\n+ using Windows Command Prompt: `.\\gradlew bistro`\n\n#### Test status\n\nThe application opens a window and displays status using 8 lines of text\nin its upper left corner.\n\n\u003cimg height=\"400\" src=\"https://i.imgur.com/Xl1luE4.png\"\n  alt=\"Rectangular window with a light blue background\n       showing 2 green-skinned humanoids, 3 axis arrows, and 8 lines of text\n       (7 on the left and one on the right)\"\u003e\n\nAt any given time, one text line is selected, indicated by a yellow arrow.\nLines that can be selected are hereafter referred to as _fields_.\n\nThe status lines indicate:\n+ which asset loader(s) are selected:\n  + \"Default\" for jme3-core, jme3-blender, and jme3-plugins\n  + \"Lwjgl\" for MonkeyWrench\n  + \"LwjglVerbose\" for MonkeyWrench with verbose logging enabled\n  + \"SideBySide\" to compare \"Default\" and \"Lwjgl\" side-by-side\n+ which asset group is selected\n+ which asset in the group is selected for loading\n+ which animation (if any) in the loaded assets (if any) is running\n+ which material(s) in the loaded assets (if any) are rendered\n+ the brightness of the ambient light source\n+ whether hardware (GPU) skinning is used\n\n#### User controls\n\nThe CompareLoaders application is designed for use with a keyboard and mouse.\n\nThe documentation below assumes a keyboard with the \"US\" (QWERTY) layout.\nOn keyboards with other layouts, some keys may be labeled differently.\nRefer to the help overlay (F1) for localized key labels.\n\n##### Selecting fields and values\n\n+ DownArrow or Numpad2 : selects the next field (cyclic)\n+ UpArrow or Numpad8 : selects the previous field (cyclic)\n+ Tab or \"=\" or Numpad6 : selects the next value for the selected field (cyclic)\n+ Backspace or \"-\" or Numpad4 :\n  selects the previous value for the selected field (cyclic)\n+ Numpad7 : sets the selected field back by 7 values (cyclic)\n+ Numpad9 : advances the selected field by 7 values (cyclic)\n\n##### Running tests\n\n+ L or Return or Numpad5 : loads the selected asset using the selected loader\n+ N : advances to the next animation (if any) in the loaded asset (if any)\n\n##### Controlling the camera (viewpoint)\n\n+ W and S : dollies the camera forward and backward, respectively\n+ A and D : strafes the camera left and right, respectively\n+ Q and Z : moves the camera up and down, respectively\n+ LeftArrow and RightArrow :\n  causes the camera to orbit left and right, respectively\n+ R or F7 : resets the camera to its initial position\n+ F8 : toggles between orthographic and perspective views\n\nTo rotate the camera, drag with the left mouse button (LMB).\n\nTo zoom the camera, turn the scroll wheel.\n\n##### Other useful keys\n\n+ H or F1: toggles the help overlay between minimized and full-sized versions\n+ Esc : closes the window and ends the application\n+ P : prints the scene graph to standard output\n+ Shift+P : prints a more detailed description of the scene graph\n+ Ctrl+P : prints an even more detailed description of the scene graph\n+ Spacebar : toggles the world axes between visible and hidden\n+ V or F3: toggles the armatures (if any) between visible and hidden\n+ \".\" or Pause : toggles the loaded animation (if any) between paused and running\n+ C : print details about the default `Camera` (viewpoint) to standard output\n+ M : print details heap usage (memory) to standard output\n\n### TestIssue5232\n\nA console app to reproduce [Assimp issue 5232](https://github.com/assimp/assimp/issues/5232).\n\n### TestIssue5253\n\nA console app to reproduce [Assimp issue 5253](https://github.com/assimp/assimp/issues/5253).\n\n### TestIssue5289\n\nA console app to reproduce [Assimp issue 5289](https://github.com/assimp/assimp/issues/5289).\n\n### TestIssue5303\n\nA console app to test for [Assimp issue 5303](https://github.com/assimp/assimp/issues/5303).\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"acks\"\u003e\u003c/a\u003e\n\n## Acknowledgments\n\nWyatt Gillette (a.k.a capdevon) kindly contributed\nthe \"AssimpProcessFlag.java\" file (pull request #4).\n\nLike most projects, MonkeyWrench builds on the work of many who\nhave gone before.  I therefore acknowledge\nthe creators of (and contributors to) the following software:\n\n+ the [Open Asset Importer Library][assimp]\n+ the [Checkstyle] tool\n+ the [Firefox] web browser\n+ the [Git] revision-control system and GitK commit viewer\n+ the [GitKraken] client\n+ the [Gradle] build tool\n+ the [IntelliJ IDEA][idea] and [NetBeans] integrated development environments\n+ the [Java] compiler, standard doclet, and runtime environment\n+ [jMonkeyEngine][jme] and the jME3 Software Development Kit\n+ the [Linux Mint][mint] operating system\n+ [LWJGL], the Lightweight Java Game Library\n+ the [Markdown] document-conversion tool\n+ the [Meld] visual merge tool\n+ Microsoft Windows\n+ the [TwelveMonkeys ImageIO library][twelve]\n\nI am grateful to [GitHub], [Sonatype], and [Imgur]\nfor providing free hosting for this project\nand many other open-source projects.\n\nI'm also grateful to my dear Holly, for keeping me sane.\n\nIf I've misattributed anything or left anyone out, please let me know, so I can\ncorrect the situation: sgold@sonic.net\n\n[Jump to the table of contents](#toc)\n\n\n[3ds]: https://en.wikipedia.org/wiki/Autodesk_3ds_Max \"Autodesk 3ds Max\"\n[3mf]: https://3mf.io/ \"The 3MF Consortium\"\n[acorus]: https://stephengold.github.io/Acorus \"Acorus Project\"\n[adoptium]: https://adoptium.net/releases.html \"Adoptium Project\"\n[assimp]: https://www.assimp.org/ \"The Open Asset Importer Library\"\n[bvh]: https://en.wikipedia.org/wiki/Biovision_Hierarchy \"Biovision Hierachy\"\n[blender]: https://docs.blender.org \"Blender Project\"\n[checkstyle]: https://checkstyle.org \"Checkstyle\"\n[collada]: https://en.wikipedia.org/wiki/COLLADA \"COLLADA file format\"\n[fbx]: https://en.wikipedia.org/wiki/FBX \"Autodesk FBX file format\"\n[firefox]: https://www.mozilla.org/en-US/firefox \"Firefox\"\n[fish]: https://fishshell.com/ \"Fish command-line shell\"\n[git]: https://git-scm.com \"Git\"\n[github]: https://github.com \"GitHub\"\n[gitkraken]: https://www.gitkraken.com \"GitKraken client\"\n[gltf]: https://www.khronos.org/gltf \"glTF Project\"\n[gradle]: https://gradle.org \"Gradle Project\"\n[heart]: https://github.com/stephengold/Heart \"Heart Project\"\n[idea]: https://www.jetbrains.com/idea/ \"IntelliJ IDEA\"\n[imgur]: https://imgur.com/ \"Imgur\"\n[java]: https://en.wikipedia.org/wiki/Java_(programming_language) \"Java programming language\"\n[jme]: https://jmonkeyengine.org \"jMonkeyEngine Project\"\n[jvm]: https://en.wikipedia.org/wiki/Java_virtual_machine \"Java virtual machine\"\n[latest]: https://github.com/stephengold/MonkeyWrench/releases/latest \"latest release\"\n[license]: https://github.com/stephengold/MonkeyWrench/blob/master/LICENSE \"MonkeyWrench license\"\n[log]: https://github.com/stephengold/MonkeyWrench/blob/master/lib/release-log.md \"release log\"\n[lwjgl]: https://www.lwjgl.org \"Lightweight Java Game Library\"\n[lwo]: https://lightwave3d.com/assets/plugins/entry/lwo3-loader/ \"LightWave file format\"\n[markdown]: https://daringfireball.net/projects/markdown \"Markdown Project\"\n[maven]: https://maven.apache.org \"Maven Project\"\n[meld]: https://meldmerge.org \"Meld merge tool\"\n[mint]: https://linuxmint.com \"Linux Mint Project\"\n[mixamo]: https://www.mixamo.com \"Mixamo Project\"\n[netbeans]: https://netbeans.org \"NetBeans Project\"\n[obj]: https://en.wikipedia.org/wiki/Wavefront_.obj_file \"Wavefront OBJ file format\"\n[ogre]: http://www.ogre3d.org \"Ogre Project\"\n[ply]: https://en.wikipedia.org/wiki/PLY_(file_format) \"PLY file format\"\n[project]: https://github.com/stephengold/MonkeyWrench \"MonkeyWrench Project\"\n[sonatype]: https://www.sonatype.com \"Sonatype\"\n[stl]: https://en.wikipedia.org/wiki/STL_(file_format) \"STL file format\"\n[twelve]: https://github.com/haraldk/TwelveMonkeys \"Twelve Monkeys\"\n[wes]: https://github.com/stephengold/Wes \"Wes Project\"\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephengold%2Fmonkeywrench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstephengold%2Fmonkeywrench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephengold%2Fmonkeywrench/lists"}