Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ jobs:
- uses: actions/checkout@v4
- name: Pinned GitHub Action refs match CMakeLists.txt
run: ./scripts/sync-doc-versions-from-cmake.sh --check
- name: File association packaging files present
run: chmod +x ./scripts/verify-file-associations.sh && ./scripts/verify-file-associations.sh

####################################################################
# Asset Scan (runs first, before all builds)
Expand Down Expand Up @@ -485,11 +487,33 @@ jobs:
name: QtMeshEditor-${{github.ref_name}}-bin-Windows
path: ${{github.workspace}}/bin

- name: Bundle Windows file-association helper
run: |
New-Item -ItemType Directory -Force -Path "${{github.workspace}}/bin/scripts" | Out-Null
Copy-Item "${{github.workspace}}/scripts/register-windows-file-associations.ps1" "${{github.workspace}}/bin/scripts/"
shell: powershell

- name: Compress File
if: github.event_name == 'release' && github.event.action == 'published'
run: Compress-Archive ${{github.workspace}}/bin QtMeshEditor-${{github.ref_name}}-bin-Windows.zip
shell: powershell

- name: Build Windows installer (Inno Setup)
if: github.event_name == 'release' && github.event.action == 'published'
shell: powershell
run: |
choco install innosetup -y --no-progress
$isccPath = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
if (-not (Test-Path $isccPath)) {
Write-Error "Inno Setup installation failed or ISCC.exe not found at $isccPath"
exit 1
}
$version = "${{ github.ref_name }}".TrimStart("v")
$iss = Get-Content "${{github.workspace}}/packaging/windows/QtMeshEditor.iss" -Raw
$iss = $iss.Replace("@PROJECT_VERSION@", $version)
Set-Content -Path "${{github.workspace}}/packaging/windows/QtMeshEditor.build.iss" -Value $iss
& $isccPath "${{github.workspace}}/packaging/windows/QtMeshEditor.build.iss"

- name: Smoke-test CLI from zip
if: github.event_name == 'release' && github.event.action == 'published'
shell: powershell
Expand Down Expand Up @@ -528,6 +552,17 @@ jobs:
overwrite: false
verbose: true

- name: Upload Windows installer to release
if: github.event_name == 'release' && github.event.action == 'published'
uses: xresloader/upload-to-github-release@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
file: QtMeshEditor-${{github.ref_name}}-setup-Windows.exe
update_latest_release: true
overwrite: false
verbose: true

####################################################################
# Linux Deploy
####################################################################
Expand Down Expand Up @@ -771,8 +806,14 @@ jobs:
mkdir -p ./pack-deb/usr/share/qtmesheditor/platforms/
mkdir -p ./pack-deb/usr/lib/qtmesheditor/
mkdir -p ./pack-deb/usr/share/doc/qtmesheditor/
mkdir -p ./pack-deb/usr/share/applications/
mkdir -p ./pack-deb/usr/share/mime/packages/
mkdir ./pack-deb/DEBIAN/
cp ./bin/DEBIAN-control ./pack-deb/DEBIAN/control
cp ./packaging/linux/qtmesheditor.desktop ./pack-deb/usr/share/applications/
cp ./packaging/linux/qtmesheditor-mimetypes.xml ./pack-deb/usr/share/mime/packages/
cp ./packaging/linux/DEBIAN-postinst ./pack-deb/DEBIAN/postinst
chmod 755 ./pack-deb/DEBIAN/postinst
cp ./bin/QtMeshEditor ./pack-deb/usr/share/qtmesheditor/qtmesheditor

# Create proper launcher script
Expand Down Expand Up @@ -2055,6 +2096,17 @@ jobs:
sed -i "s/version '.*'/version '$VERSION'/" "$CASK_FILE"
sed -i "s/sha256 '.*'/sha256 '$SHA256'/" "$CASK_FILE"

# Ensure Finder picks up CFBundleDocumentTypes after install (#664).
if ! grep -q 'lsregister' "$CASK_FILE"; then
{
echo ''
echo ' postflight do'
echo ' system_command "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister",'
echo ' args: ["-f", "-R", "#{appdir}/QtMeshEditor.app"]'
echo ' end'
} >> "$CASK_FILE"
fi

echo "Updated cask file:"
cat "$CASK_FILE"

Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

Automate your 3D asset pipeline — scan, validate, convert, fix, and merge 3D assets with GUI + CLI + CI/CD support.

**Open 3D files from your OS** — after install, double-click `.fbx`, `.glb`, `.gltf`, `.obj`, `.dae`, `.stl`, `.ply`, `.mesh`, and PS1 `.rsd`/`.tmd` in Finder, Explorer, or your Linux file manager (or use **Open With**). QtMeshEditor loads the model in the running window; a second launch focuses the existing instance instead of spawning another process. Portable Windows ZIP users can run `bin/scripts/register-windows-file-associations.ps1` to register handlers without admin rights.

[![GitHub stars](https://img.shields.io/github/stars/fernandotonon/QtMeshEditor.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/fernandotonon/QtMeshEditor/stargazers) Star if you like it!

[![Github All Releases](https://img.shields.io/github/downloads/fernandotonon/QtMeshEditor/total.svg)]()
Expand Down
8 changes: 8 additions & 0 deletions packaging/linux/DEBIAN-postinst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/sh
set -e
if command -v update-mime-database >/dev/null 2>&1; then
update-mime-database /usr/share/mime >/dev/null 2>&1 || true
fi
if command -v update-desktop-database >/dev/null 2>&1; then
update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
fi
28 changes: 28 additions & 0 deletions packaging/linux/qtmesheditor-mimetypes.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-ogre-mesh">
<comment>Ogre mesh</comment>
<glob pattern="*.mesh"/>
</mime-type>
<mime-type type="application/x-ps1-rsd">
<comment>PlayStation RSD mesh</comment>
<glob pattern="*.rsd"/>
</mime-type>
<mime-type type="application/x-ps1-tmd">
<comment>PlayStation TMD mesh</comment>
<glob pattern="*.tmd"/>
</mime-type>
<mime-type type="application/x-qtmesheditor-scene">
<comment>QtMeshEditor scene</comment>
<glob pattern="*.scene.glb"/>
<glob pattern="*.scene.gltf"/>
</mime-type>
<mime-type type="application/vnd.ms-fbx">
<comment>Autodesk FBX model</comment>
<glob pattern="*.fbx"/>
</mime-type>
<mime-type type="model/vnd.ply">
<comment>PLY model</comment>
<glob pattern="*.ply"/>
</mime-type>
</mime-info>
11 changes: 11 additions & 0 deletions packaging/linux/qtmesheditor.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[Desktop Entry]
Name=QtMeshEditor
Comment=Open and inspect 3D models (FBX, glTF, OBJ, and more)
GenericName=3D Model Viewer
Keywords=3D;mesh;FBX;glTF;model;animation;viewer;
Exec=qtmesheditor %F
Icon=qtmesheditor
Terminal=false
Type=Application
Categories=Graphics;Viewer;
MimeType=model/gltf+json;model/gltf-binary;model/obj;model/stl;application/vnd.collada+xml;application/vnd.ms-fbx;application/x-ogre-mesh;application/x-ps1-rsd;application/x-ps1-tmd;application/x-qtmesheditor-scene;model/vnd.ply;
7 changes: 7 additions & 0 deletions packaging/macos/homebrew-cask-postflight.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Append to homebrew-qtmesheditor/Casks/qtmesheditor.rb so Finder picks up
# CFBundleDocumentTypes without a reboot:
#
# postflight do
# system_command "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister",
# args: ["-f", "-R", "#{appdir}/QtMeshEditor.app"]
# end
93 changes: 93 additions & 0 deletions packaging/windows/QtMeshEditor.iss
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
; Inno Setup script — per-user install with HKCU file associations (#664)
#define MyAppName "QtMeshEditor"
#define MyAppVersion "@PROJECT_VERSION@"
#define MyAppPublisher "Fernando Tonon"
#define MyAppURL "https://github.com/fernandotonon/QtMeshEditor"
#define MyAppExeName "QtMeshEditor.exe"

[Setup]
AppId={{A4B8D6F2-3C1E-4F9A-9B2D-664E8A3F9B2D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}/issues
AppUpdatesURL={#MyAppURL}/releases
DefaultDirName={localappdata}\Programs\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
PrivilegesRequired=lowest
OutputBaseFilename=QtMeshEditor-{#MyAppVersion}-setup-Windows
Compression=lzma2
SolidCompression=yes
WizardStyle=modern
ArchitecturesAllowed=x64
ArchitecturesInstallIn64BitMode=x64

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "fileassoc"; Description: "Register QtMeshEditor as an ""Open with"" handler for 3D model files"; GroupDescription: "File associations:"; Flags: checkedonce

[Files]
Source: "..\..\bin\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\bin\{#MyAppExeName}"

[Registry]
; Open With only — do not replace the user's default ProgID for each extension.
Root: HKCU; Subkey: "Software\Classes\.fbx\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.fbx"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.fbx"; ValueType: string; ValueName: ""; ValueData: "FBX 3D Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.fbx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.fbx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.glb\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.glb"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.glb"; ValueType: string; ValueName: ""; ValueData: "glTF Binary Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.glb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.glb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.gltf\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.gltf"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.gltf"; ValueType: string; ValueName: ""; ValueData: "glTF Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.gltf\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.gltf\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.obj\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.obj"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.obj"; ValueType: string; ValueName: ""; ValueData: "Wavefront OBJ Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.obj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.obj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.dae\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.dae"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.dae"; ValueType: string; ValueName: ""; ValueData: "Collada Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.dae\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.dae\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.stl\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.stl"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.stl"; ValueType: string; ValueName: ""; ValueData: "STL Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.stl\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.stl\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.ply\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.ply"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.ply"; ValueType: string; ValueName: ""; ValueData: "PLY Model"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.ply\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.ply\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.mesh\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.mesh"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.mesh"; ValueType: string; ValueName: ""; ValueData: "Ogre Mesh"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.mesh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.mesh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.rsd\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.rsd"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.rsd"; ValueType: string; ValueName: ""; ValueData: "PlayStation RSD Mesh"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.rsd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.rsd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

Root: HKCU; Subkey: "Software\Classes\.tmd\OpenWithProgids"; ValueType: string; ValueName: "QtMeshEditor.Model.tmd"; ValueData: ""; Tasks: fileassoc; Flags: uninsdeletevalue
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.tmd"; ValueType: string; ValueName: ""; ValueData: "PlayStation TMD Mesh"; Tasks: fileassoc; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.tmd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\{#MyAppExeName},0"; Tasks: fileassoc
Root: HKCU; Subkey: "Software\Classes\QtMeshEditor.Model.tmd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\{#MyAppExeName}"" ""%1"""; Tasks: fileassoc

[Run]
Filename: "{app}\bin\{#MyAppExeName}"; Description: "Launch {#MyAppName}"; Flags: nowait postinstall skipifsilent
63 changes: 63 additions & 0 deletions scripts/register-windows-file-associations.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Register QtMeshEditor as a per-user "Open with" handler for common 3D formats.
# Does not change the user's default app for each extension.
# Usage (from extracted zip or installed bin folder):
# pwsh -File scripts/register-windows-file-associations.ps1
# pwsh -File scripts/register-windows-file-associations.ps1 -BinDir "C:\path\to\bin"

param(
[string]$BinDir
)

$ErrorActionPreference = "Stop"

function Resolve-QtMeshEditorBinDir {
param([string]$Requested)
if ($Requested) { return $Requested }

$portableBin = (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot "..") -ErrorAction SilentlyContinue).Path
$repoBin = Join-Path $PSScriptRoot "..\bin"
if ($portableBin -and (Test-Path (Join-Path $portableBin "QtMeshEditor.exe"))) {
return $portableBin
}
if (Test-Path (Join-Path $repoBin "QtMeshEditor.exe")) {
return (Resolve-Path -LiteralPath $repoBin).Path
}
return $repoBin
}

$BinDir = Resolve-QtMeshEditorBinDir -Requested $BinDir
$exe = Join-Path $BinDir "QtMeshEditor.exe"
if (-not (Test-Path $exe)) {
Write-Error "QtMeshEditor.exe not found at $exe"
}

$extensions = @{
".fbx" = "FBX 3D Model"
".glb" = "glTF Binary Model"
".gltf" = "glTF Model"
".obj" = "Wavefront OBJ Model"
".dae" = "Collada Model"
".stl" = "STL Model"
".ply" = "PLY Model"
".mesh" = "Ogre Mesh"
".rsd" = "PlayStation RSD Mesh"
".tmd" = "PlayStation TMD Mesh"
}

foreach ($entry in $extensions.GetEnumerator()) {
$ext = $entry.Key
$label = $entry.Value
$progId = "QtMeshEditor.Model.$($ext.TrimStart('.'))"
$openWithKey = "HKCU:\Software\Classes\$ext\OpenWithProgids"
New-Item -Path $openWithKey -Force | Out-Null
New-ItemProperty -Path $openWithKey -Name $progId -PropertyType String -Value "" -Force | Out-Null
New-Item -Path "HKCU:\Software\Classes\$progId" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\Classes\$progId" -Name "(default)" -Value $label
New-Item -Path "HKCU:\Software\Classes\$progId\DefaultIcon" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\Classes\$progId\DefaultIcon" -Name "(default)" -Value "$exe,0"
New-Item -Path "HKCU:\Software\Classes\$progId\shell\open\command" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\Classes\$progId\shell\open\command" -Name "(default)" -Value "`"$exe`" `"%1`""
Write-Host "Registered $ext in OpenWithProgids -> $progId"
}

Write-Host "Done. QtMeshEditor should appear in Explorer 'Open with' for registered extensions."
13 changes: 12 additions & 1 deletion scripts/update-winget.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ echo "=== Updating WinGet manifest for ${PKG_ID} v${VERSION} ==="

# Compute SHA256
echo "Downloading and computing SHA256..."
SHA256=$(curl -sL "${ZIP_URL}" | shasum -a 256 | cut -d' ' -f1 | tr 'a-f' 'A-F')
SHA256=$(curl -fsSL "${ZIP_URL}" | shasum -a 256 | cut -d' ' -f1 | tr 'a-f' 'A-F')
if [ -z "${SHA256}" ]; then
echo "ERROR: Failed to compute SHA256. Is the release published?"
exit 1
Expand Down Expand Up @@ -90,6 +90,17 @@ NestedInstallerFiles:
PortableCommandAlias: qtmesheditor
- RelativeFilePath: bin\\qtmesh.exe
PortableCommandAlias: qtmesh
FileExtensions:
- fbx
- glb
- gltf
- obj
- dae
- stl
- ply
- mesh
- rsd
- tmd
Installers:
- Architecture: x64
InstallerUrl: ${ZIP_URL}
Expand Down
Loading
Loading