summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBassel Alshmali <bassel@mobilabsolutions.com>2026-03-28 20:20:06 +0100
committerLywx <kiritodev01@gmail.com>2026-03-28 14:04:38 -0600
commit4b4f8fab70ef9569f0ff7ce1a54b3f03762d11dc (patch)
tree18703f29feff66fac24a5bd080c4f11822641914 /src
parent75f64161cb4addcbc6e29732df8d9b519a62c43f (diff)
fix MtxFactory in fixed point path during export
Diffstat (limited to 'src')
-rw-r--r--src/factories/MtxFactory.cpp27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/factories/MtxFactory.cpp b/src/factories/MtxFactory.cpp
index 9bc4b28..b6ff955 100644
--- a/src/factories/MtxFactory.cpp
+++ b/src/factories/MtxFactory.cpp
@@ -112,12 +112,29 @@ ExportResult MtxBinaryExporter::Export(std::ostream& write, std::shared_ptr<IPar
WriteHeader(writer, Torch::ResourceType::Matrix, 0);
- for (size_t i = 0; i < 4; i++) {
- for (size_t j = 0; j < 4; j++) {
- if (floats) {
+ if(floats){
+ for(size_t i = 0; i < 4; i++){
+ for(size_t j = 0; j < 4; j++){
writer.Write(mtx->mMtxs[0].mtx[i * 4 + j]);
- } else {
- writer.Write(mtx->mMtxs[0].mt.mint[i][j]);
+ }
+ }
+ } else {
+ // Write int32 words with explicit uint16 packing to avoid
+ // endian-dependent int32/uint16 union overlay mismatch on LE.
+ // N64 format: each int32 packs two adjacent columns as (col_even << 16) | col_odd.
+ auto& mt = mtx->mMtxs[0].mt;
+ // First 8 words: integer parts (4 rows × 2 column-pairs)
+ for(size_t i = 0; i < 4; i++){
+ for(size_t j = 0; j < 2; j++){
+ int32_t packed = ((int32_t)mt.intPart[i][j * 2] << 16) | mt.intPart[i][j * 2 + 1];
+ writer.Write(packed);
+ }
+ }
+ // Next 8 words: fractional parts (4 rows × 2 column-pairs)
+ for(size_t i = 0; i < 4; i++){
+ for(size_t j = 0; j < 2; j++){
+ int32_t packed = ((int32_t)mt.fracPart[i][j * 2] << 16) | mt.fracPart[i][j * 2 + 1];
+ writer.Write(packed);
}
}
}