Jump to content

Carcass.exe Bone Jitter


Go to solution Solved by Archangel35757,

Recommended Posts

I can independently confirm that they're working on getting Carcass source released. They're asking Rich if he still has Carcass source.

 

I already implemented this like 6mo ago. Just saying.

 

True, but we could port over the remaining code. Would be useful for the JKA part of JK:Enhanced due to the many arms.

Link to comment

What's wrong with using Noesis exactly? Can Rich not fix the G2 export issues?

I didn't actually know there were any until last week. :) I've fixed quite a bit of stuff DT85 has told me about over the weekend, so I think it's in a good state now. He mentioned he's gonna be working on a Noesis export tutorial, which is excellent.

 

So, about the compression, I'm not sure what carcass was doing. But they kinda got it wrong in the format - the way the engine expects transforms, you're ending up with parent-local matrices which are in base/bind-local space. Bind-local matrices in parent-local space would've been much more efficient for small deltas, where lots of bones would've ended up being stored as identity because they don't animate away from the bind pose when in parent-local space. Lots of stuff moves as a result of hierarchy when you apply the bind-local transform before the parent-local one.

 

Beyond that, all Noesis does is quantize the bones like so:

 

    RichMat43 *rMat = (RichMat43 *)mat;

    RichQuat rQuat = rMat->GetTranspose().ToQuat();

 

    comp[0] = (unsigned short)((rQuat[3]+2.0f)*16383.0f);

    comp[1] = (unsigned short)((rQuat[0]+2.0f)*16383.0f);

    comp[2] = (unsigned short)((rQuat[1]+2.0f)*16383.0f);

    comp[3] = (unsigned short)((rQuat[2]+2.0f)*16383.0f);

    comp[4] = (unsigned short)((mat->o[0]+512.0f)*64.0f);

    comp[5] = (unsigned short)((mat->o[1]+512.0f)*64.0f);

    comp[6] = (unsigned short)((mat->o[2]+512.0f)*64.0f);

 

As you'll notice, the quaternion range is also unnecessarily limiting precision, another legacy limitation of the format. Ghoul2 animation compression could've easily been a lot better with no drawbacks, but I guess no one noticed during development, myself included. :)

 

After Noesis quantizes the rotations+translations, it uses a simple hash to build up a list of unique q+t pairs. It will only consider something a match if it fits exactly. If I had to venture a guess, that might be where carcass goes wrong, using a looser comparison method and ending up with matches that don't quite match. Either that or the quantization is just wrong.

Archangel35757 and DT. like this
Link to comment

So I got an email response from Ste at RavenSoftware:

 

----message----

From:<removed>

To:<removed>

Cc:<removed>

Sent: Thu, Sep 4, 2014 9:55 AM CDT

Subject: RE: CARCASS.exe bug issue... and new dotXSI 3.0 exporter

 

I left a CMD session searching our Y (archive) drive all night piped to a file for carcass*.*, but the source isn't there. ( even though there's a lot of old source code around that era ). Charlie says all the old VSS archives are on a different server but right now that machine isn't responding properly. He's taking a look.

 

This hasn't been forgotten.

 

-Ste.

 

DT. likes this
Link to comment

Awesome, I'm glad they are taking the time for us as I'm sure they are busy.

 

Might be in with the SoF2 stuff since that game came first.

 

 

EDIT:

 

Did find this in JK2/JKA's carcass.exe when viewing in notepad++:

 

C:\projects\Tools\Carcass\Release\carcass.pdb

 

and this in SoF2's carcass:

 

C:\Source\Tools\Carcass\Release\carcass.pdb

Edited by DT85
Link to comment
  • 3 weeks later...
  • 3 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...