Skip to content

Rolling Madness 3D Add full ASE morph-frame animation, lightmap support, and self-contained tool publishing - #116

Open
jkind73 wants to merge 7 commits into
MeltyPlayer:mainfrom
jkind73:main
Open

Rolling Madness 3D Add full ASE morph-frame animation, lightmap support, and self-contained tool publishing#116
jkind73 wants to merge 7 commits into
MeltyPlayer:mainfrom
jkind73:main

Conversation

@jkind73

@jkind73 jkind73 commented Jul 12, 2026

Copy link
Copy Markdown

This PR introduces comprehensive support for exporting and rendering ASE mesh animations (morph frames) and compound lightmaps, alongside improvements to the local build and deployment workflow.

As a personal note, I wanted to share these contributions as a sincere thank you! Your work on this repository completely jump-started my own project to understand how the Ase.Mesh file worked, and this is my way of giving back to the project that helped me get off the ground.

Key Changes

  • ASE Morph Animation & Lightmaps: Added full support for importing ASE morph-frames and complex multi-part lightmap textures, mapping consecutive vertex frames directly into morph targets.
  • glTF and FBX Exporters: Expanded exporters to properly translate ASE morph target animation curves into standard glTF morph channels and animated FBX blend shapes.
  • Self-Contained Publishing: Updated the publish_universal_asset_tool.bat script (and added a patched Assimp variant) to fully automate embedding native dependencies (glfw3.dll, OpenAL32.dll) directly into the single-file release output folder.
  • Testing: Included explicit golden unit tests to ensure compound lightmap naming identities are strictly preserved across exports.

jkind73 added 6 commits July 12, 2026 15:32
Prefer an installed user SDK, validate publish output before replacing the local tool, and bundle the GLFW/OpenAL native dependencies. Add the Fmod memory compatibility dependency required by the current target framework.
Interpret the ASE frame-count and duration fields, split animated vertex payloads into stable morph targets, expose per-frame morph poses through the model API, and preview them with a dynamic vertex buffer. Preserve numbered lightmap filenames such as lev1.ase.0 through lev1.ase.5 so textures no longer collapse to one identity, and add regression coverage.
Write morph targets and weight animation to glTF, omit synthetic skins for morph-only meshes, and map fixed-function materials to dielectric PBR values. Add a native converter backed by a reproducible Assimp FBX patch that writes blend-shape curves, preserves UV/material data, and carries metallic/roughness properties. Include a publisher that bootstraps the pinned Assimp source and installs the patched runtime.
Publish the tool with the ASE morph-animation, lightmap, glTF, and patched FBX changes. Replace obsolete loose runtime files with the current self-contained .NET 10 distribution and bundle the native Assimp morph converter.
Keep patch files LF-normalized and make the bootstrap tolerate whitespace-only line-ending differences when checking or applying the Assimp patch. This prevents CRLF checkouts from being reported as incompatible Assimp source.
@MeltyPlayer

MeltyPlayer commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Whoa, this is awesome! I've been meaning to finally figure out how these animations work and how to set up morph target support, I really appreciate you figuring out both!

Sorry for the delay in reviewing this, I should finally have a chance to take a full look this weekend.

For now, there's only two concerns I have:

  1. The main concern I've noticed so far is that exporting Assimp morph animations is done via a separate EXE; I'm trying to keep things purely in C# going forward for the sake of portability. Is it possible to do this in C# instead, and ideally within the same process?
  2. I was curious how you had gotten morph targets to work in the renderer; I had been debating with myself for a long time about the best way to do this, and was leaning towards passing them in as a texture so it would just be uploaded to the GPU once. Setting them via the dynamic buffer like you did is the simplest way to do it for now, but I'd prefer not to mutate the original vertices to do so. Could you update the buffer's UpdateBuffer() method to take in an optional morph target, and then do the morphTarget.PositionMorphs.TryGetValue and morphTarget.NormalMorphs.TryGetValue inside that function instead?

@MeltyPlayer MeltyPlayer assigned jkind73 and unassigned jkind73 Aug 1, 2026
@jkind73

jkind73 commented Aug 2, 2026

Copy link
Copy Markdown
Author

Hey there! I'm actually on vacation in Sicily right now and don't have my computer with me. I'll be back in September, though! If you're able to hang tight until then, I'd be more than happy to take a look and see how we can get those changes sorted for you.

@jkind73

jkind73 commented Aug 2, 2026

Copy link
Copy Markdown
Author

Btw, regarding your main concern, it has been a while, and I don't have access to my computer right now, so I'm going by memory. The primary issue is a bug in the library you're using to support various 3D formats. Specifically, it currently does not support animation for the FBX format. I had considered attempting to fix this issue and submitting a patch.. As you can imagine, this was going to be much more complicated because I needed to make sure it didn't introduce any regression and supported everything the library already supported. However, this is all based on my memory.I can give you more details when I get back and verify what I did, and what I can do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants