3 changed files with 115 additions and 115 deletions
@ -0,0 +1,113 @@ |
|||
|
|||
;; |
|||
;; Assets |
|||
;; |
|||
|
|||
;; TODO Improvements: |
|||
;; - Check blender command for changes to cause rebuild |
|||
;; - Check linked Blender files (would need to hard code because blender is too slow to start) |
|||
;; - Don't rebuild due to different build configuration (assets remain unchanged) |
|||
;; - Actually check assets instead of just cache file |
|||
(defun-comptime process-3d-assets (manager (& ModuleManager) module (* Module) &return bool) |
|||
(scope ;; Models/meshes |
|||
;; Make sure output dir exists and we have an absolute path to it |
|||
(var model-assets ([] (* (const char))) (array "Monkey" "MaterialSphere")) |
|||
(var model-relative-dir (* (const char)) "data/Models") |
|||
|
|||
(makeDirectory model-relative-dir) |
|||
;; Output must be absolute or OgreMeshTool will fail (probably due to different working dir) |
|||
(var model-output-dir (* (const char)) (makeAbsolutePath_Allocated null model-relative-dir)) |
|||
(unless model-output-dir |
|||
(Logf "Asset-Building: could not make directory %s absolute\n" model-relative-dir) |
|||
(return false)) |
|||
|
|||
(var i int 0) |
|||
(while (< i (array-size model-assets)) |
|||
(var blend-asset ([] MAX_PATH_LENGTH char) (array 0)) |
|||
(PrintfBuffer blend-asset "assets/%s.blend" (at i model-assets)) |
|||
|
|||
;; It is too slow to check Blender for all the files the blend will export, then check whether |
|||
;; the .blend file is more recently modified. Instead, create a file in the cache to represent |
|||
;; the last time the .blend was known to have been exported. Hack, especially because other |
|||
;; configurations don't need to rebuild assets. Probably better to just leave asset building to |
|||
;; another executable |
|||
(var cache-reference-filename ([] MAX_PATH_LENGTH char) (array 0)) |
|||
(unless (outputFilenameFromSourceFilename (call-on c_str (field manager buildOutputDir)) |
|||
blend-asset |
|||
"txt" ;; Add to end of file for type |
|||
cache-reference-filename (sizeof cache-reference-filename)) |
|||
(free (type-cast model-output-dir (* void))) |
|||
(return false)) |
|||
(unless (fileIsMoreRecentlyModified blend-asset cache-reference-filename) |
|||
(incr i) |
|||
(continue)) |
|||
|
|||
(run-process-sequential-or |
|||
("blender" |
|||
"--background" blend-asset |
|||
"--python-exit-code" "1" ;; If there's a python exception, return 1 |
|||
"--python" "../tools/BlenderToOgre.py" |
|||
"--" model-output-dir) |
|||
(Log "Asset-Building: failed to build 3D asset. Is Blender on your path? Is blender2ogre set |
|||
up on your Blender default preferences? See https://github.com/OGRECave/blender2ogre for setup\n |
|||
You may need to copy blender2ogre to your new blender version, e.g.:\n\n |
|||
cp -r Dependencies/blender2ogre/io_ogre ~/.config/blender/[version]\n\n |
|||
Or, open your new version of Blender and select 'Copy settings from [previous version]'\n |
|||
on the splash screen.\n") |
|||
(free (type-cast model-output-dir (* void))) |
|||
(return false)) |
|||
|
|||
(scope ;; Write reference file |
|||
(var cache-reference (* FILE) (fopen cache-reference-filename "w")) |
|||
(unless cache-reference |
|||
(Logf "Asset-Building: failed to open cache reference file %s\n" cache-reference-filename) |
|||
(free (type-cast model-output-dir (* void))) |
|||
(return false)) |
|||
(fprintf cache-reference "%s exported\n" blend-asset) |
|||
(fclose cache-reference)) |
|||
(incr i)) |
|||
|
|||
(free (type-cast model-output-dir (* void)))) |
|||
|
|||
(scope ;; Textures |
|||
(var texture-assets ([] (* (const char))) (array "Monkey_Texture")) |
|||
(var texture-process-results (<> std::vector int)) |
|||
(call-on resize texture-process-results (array-size texture-assets)) |
|||
(var max-num-processes int 4) |
|||
(var num-processes-running int 0) |
|||
(var i int 0) |
|||
(while (< i (array-size texture-assets)) |
|||
(var texture-asset ([] MAX_PATH_LENGTH char) (array 0)) |
|||
(PrintfBuffer texture-asset "assets/%s.png" (at i texture-assets)) |
|||
(var texture-converted ([] MAX_PATH_LENGTH char) (array 0)) |
|||
(PrintfBuffer texture-converted "data/Materials/Textures/%s.dds" (at i texture-assets)) |
|||
|
|||
(unless (fileIsMoreRecentlyModified texture-asset texture-converted) |
|||
(incr i) |
|||
(continue)) |
|||
|
|||
;; Don't spin up too many processes |
|||
(when (>= num-processes-running max-num-processes) |
|||
(Log "wait for processes\n") |
|||
(waitForAllProcessesClosed null) |
|||
(set num-processes-running 0)) |
|||
|
|||
(set (at i texture-process-results) -1) |
|||
(run-process-start-or (addr (at i texture-process-results)) |
|||
("convert" texture-asset texture-converted) |
|||
(Log "Asset-Building: failed to convert 2D texture. Is 'convert' on your |
|||
path? You may need to install ImageMagick. See https://www.imagemagick.org/script/download.php\n") |
|||
(return false)) |
|||
(incr num-processes-running) |
|||
(incr i)) |
|||
|
|||
(waitForAllProcessesClosed null) |
|||
(for-in result int texture-process-results |
|||
(unless (= 0 result) |
|||
(Log "Asset-Building: failed to convert texture\n") |
|||
(return false)))) |
|||
|
|||
(return true)) |
|||
|
|||
;; TODO: This should be a post-build hook |
|||
(add-compile-time-hook-module pre-build process-3d-assets :priority-decrease 10) |
Loading…
Reference in new issue