mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-06-27 16:35:57 +00:00
## Motivation The GLTF (`.gltf`, `.glb`) 3D model format is very popular for game development and visual productions. For an indie game studio, it would be convenient for a team to view textured 3D models directly from the Forgejo interface (otherwise they need to be downloaded and opened). [Perforce](https://www.perforce.com/products/helix-dam), [Diversion](https://www.diversion.dev/), and GitHub all have this capability to differing extents. Some discussion on 3D file support here: https://codeberg.org/forgejo/forgejo/issues/5188 ## Changes Adds a model viewer similar to [GitHub STL viewer](https://github.com/assimp/assimp/blob/master/test/models/STL/Spider_ascii.stl) for `.glb` model files, and lays some groundwork to support future files. Uses the [model-viewer](https://modelviewer.dev/) library by Google and three.js. The model viewer is interactive and can be rotated and scaled.  ## How to Test 1) Create a new repository or use an existing one. 2) Upload a `.glb` file such as `tests/testdata/data/viewer/Unicode❤♻Test.glb` (CC0 1.0 Universal) 3) View the file in the repository. - Similar to image files, the 3D model should be rendered in a viewer. - Use mouse clicks to turn and zoom. ## Licenses Libraries used for this change include three.js and @google/model-viewer, which are MIT and Apache-2.0 licenses respectively. Both of these are compatible with Forgejo's GPL3.0 license. ## Future Plans 1) `.gltf` was not attempted because it is a multiple file format, referencing other files in the same directory. Still need to experiment with this to see if it can work. `.glb` is a single file containing a `.gltf` and all of its other file/texture dependencies so was easier to implement. 2) The PR diff still shows the model as an unviewable bin file, but clicking the "View File" button takes you to a view screen where this model viewer is used. It would be nice to view the before and after of the model in two side-by-side model viewers, akin to reviewing a change in an image. 3) Also inserted stubs for adding contexts for GLTF, STL, OBJ, and 3MF. These ultimately don't do anything yet as only `.glb` files can be detected by the type sniffer of all of these. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for checking GLB file content using the first few bytes. - [x] in their respective `typesniffer_test.go` for unit tests. ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title. <!--start release-notes-assistant--> ## Release notes <!--URL:https://codeberg.org/forgejo/forgejo--> - User Interface features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8111): <!--number 8111 --><!--line 0 --><!--description YWRkIG1vZGVsIHZpZXdlciBmb3IgYC5nbGJgIChHTFRGKSBtb2RlbCBpbiBmaWxlIHZpZXc=-->add model viewer for `.glb` (GLTF) model in file view<!--description--> <!--end release-notes-assistant--> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8111 Reviewed-by: oliverpool <oliverpool@noreply.codeberg.org> Co-authored-by: Alex Smith <amsmith.pro@pm.me> Co-committed-by: Alex Smith <amsmith.pro@pm.me>
107 lines
3.3 KiB
JSON
107 lines
3.3 KiB
JSON
{
|
|
"name": "forgejo",
|
|
"type": "module",
|
|
"engines": {
|
|
"node": ">= 20.0.0"
|
|
},
|
|
"dependencies": {
|
|
"@citation-js/core": "0.7.14",
|
|
"@citation-js/plugin-bibtex": "0.7.16",
|
|
"@citation-js/plugin-software-formats": "0.6.1",
|
|
"@github/markdown-toolbar-element": "2.2.3",
|
|
"@github/quote-selection": "2.1.0",
|
|
"@github/text-expander-element": "2.8.0",
|
|
"@google/model-viewer": "4.1.0",
|
|
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
|
|
"@primer/octicons": "19.14.0",
|
|
"ansi_up": "6.0.5",
|
|
"asciinema-player": "3.8.2",
|
|
"chart.js": "4.5.0",
|
|
"chartjs-adapter-dayjs-4": "1.0.4",
|
|
"chartjs-plugin-zoom": "2.2.0",
|
|
"clippie": "4.1.7",
|
|
"css-loader": "7.0.0",
|
|
"dayjs": "1.11.12",
|
|
"dropzone": "6.0.0-beta.2",
|
|
"easymde": "2.18.0",
|
|
"esbuild-loader": "4.3.0",
|
|
"escape-goat": "4.0.0",
|
|
"fast-glob": "3.3.3",
|
|
"htmx.org": "1.9.12",
|
|
"idiomorph": "0.3.0",
|
|
"jquery": "3.7.1",
|
|
"katex": "0.16.22",
|
|
"mermaid": "11.6.0",
|
|
"mini-css-extract-plugin": "2.9.2",
|
|
"minimatch": "10.0.3",
|
|
"monaco-editor": "0.52.2",
|
|
"monaco-editor-webpack-plugin": "7.1.0",
|
|
"pdfobject": "2.3.0",
|
|
"postcss": "8.5.5",
|
|
"postcss-loader": "8.1.1",
|
|
"postcss-nesting": "13.0.2",
|
|
"pretty-ms": "9.0.0",
|
|
"sortablejs": "1.15.6",
|
|
"swagger-ui-dist": "5.17.14",
|
|
"tailwindcss": "3.4.17",
|
|
"throttle-debounce": "5.0.0",
|
|
"tinycolor2": "1.6.0",
|
|
"tippy.js": "6.3.7",
|
|
"toastify-js": "1.12.0",
|
|
"tributejs": "5.1.3",
|
|
"uint8-to-base64": "0.2.0",
|
|
"vanilla-colorful": "0.7.2",
|
|
"vue": "3.5.16",
|
|
"vue-chartjs": "5.3.1",
|
|
"vue-loader": "17.4.2",
|
|
"vue3-calendar-heatmap": "2.0.5",
|
|
"webpack": "5.99.9",
|
|
"webpack-cli": "6.0.1",
|
|
"wrap-ansi": "9.0.0"
|
|
},
|
|
"devDependencies": {
|
|
"@axe-core/playwright": "4.10.2",
|
|
"@eslint-community/eslint-plugin-eslint-comments": "4.5.0",
|
|
"@playwright/test": "1.52.0",
|
|
"@stoplight/spectral-cli": "6.15.0",
|
|
"@stylistic/eslint-plugin": "4.4.1",
|
|
"@stylistic/stylelint-plugin": "3.1.2",
|
|
"@vitejs/plugin-vue": "5.2.4",
|
|
"@vitest/coverage-v8": "3.2.3",
|
|
"@vitest/eslint-plugin": "1.2.2",
|
|
"@vue/test-utils": "2.4.6",
|
|
"eslint": "9.28.0",
|
|
"eslint-import-resolver-typescript": "4.4.3",
|
|
"eslint-plugin-array-func": "5.0.2",
|
|
"eslint-plugin-import-x": "4.15.1",
|
|
"eslint-plugin-no-jquery": "3.1.1",
|
|
"eslint-plugin-no-use-extend-native": "0.7.2",
|
|
"eslint-plugin-playwright": "2.2.0",
|
|
"eslint-plugin-regexp": "2.9.0",
|
|
"eslint-plugin-sonarjs": "3.0.2",
|
|
"eslint-plugin-toml": "0.12.0",
|
|
"eslint-plugin-unicorn": "59.0.1",
|
|
"eslint-plugin-vitest-globals": "1.5.0",
|
|
"eslint-plugin-vue": "10.2.0",
|
|
"eslint-plugin-vue-scoped-css": "2.10.0",
|
|
"eslint-plugin-wc": "3.0.1",
|
|
"globals": "16.1.0",
|
|
"happy-dom": "18.0.0",
|
|
"license-checker-rseidelsohn": "4.4.2",
|
|
"markdownlint-cli": "0.45.0",
|
|
"postcss-html": "1.8.0",
|
|
"sharp": "0.34.2",
|
|
"stylelint": "16.20.0",
|
|
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
|
|
"stylelint-declaration-strict-value": "1.10.11",
|
|
"stylelint-value-no-unknown-custom-properties": "6.0.1",
|
|
"svgo": "3.2.0",
|
|
"typescript": "5.8.3",
|
|
"typescript-eslint": "8.34.0",
|
|
"vite-string-plugin": "1.3.4",
|
|
"vitest": "3.2.3"
|
|
},
|
|
"browserslist": [
|
|
"defaults"
|
|
]
|
|
}
|