Algoritmo Swizzle PSP

Aperto da Daviex94, Marzo 08, 2016, 16:48:25

Discussione precedente - Discussione successiva

Daviex94

Ciao a tutti!

Sono qui oggi a chiedere il vostro aiuto su di un problema che, dopo svariati giorni, non sono arrivato ad una soluzione. Sto lavorando al gioco Digimon Redigitze, ho scritto già il codice per estrarre le immagini, estrarre diversi file di diversi formati ecc. senza problemi. Con l'aiuto di Phoenix, abbiamo scritto un codice base per effettuare l'unswizzle, e sembrava funzionare senza problemi. Però, andando avanti con le immagini, ho sempre notato che ci fosse una mancanza di pixel nelle immagini estratte, per questo sono andato a controllare manualmente tramite debug del codice, quanti dati estraesse dal file binario, ed ho notato che non riusciva a prendere tutti i byte, ma ne saltava un bel po'.

Ho provato diversi cambiamenti al codice, per cercare di prendere tutti i byte, ma niente.
Quindi, sono andato a fare il debug su PPSSPP direttamente, ed ho notato che PPSSPP utilizzasse come dimensioni delle Texture potenze di 2, e che nell'header stesso fosse scritto questo valore.

Ogni volta che sono andato a modificare il codice, facendo prove con nuove informazioni ecc., o l'immagine ne risultava completamente inguardabile, oppure, l'immagine risultante era quella, però i tile non venivano "riordinati", e quindi magri su una stessa linea, venivano disegnati due parti diverse dell'immagine.


Adesso, il mio problema è: so quali devono essere le size delle texture dell'immagine, so quali sono le dimensioni reali, so quali sono le Texture U,V Scales per ritagliare l'immagine, però non ho idea di come far funzionare il tutto, cioè come posso estrarre l'immagine correttamente avendo quelle informazioni.

Qualcuno saprebbe aiutarmi? Se avete bisogno di codice, immagini estratte, qualsiasi cosa, scrivete qua sotto che vi posto tutto.

Spero possiate aiutarmi,
Grazie.

EDIT:
Dimenticavo di dire che questo problema lo fa con le immagini con questi problemi sono immagini a 8/4 bit.

EDIT 2:
Inserisco un po' di esempi con prove che ho fatto:

Struttura del file immagine:
Header: 0x80
Data
Palette
L'header ha l'indice alla palette, quindi, per trovare quanti byte sono di dati, posso semplicemente dirgli di leggere fino alla posizione della palette ( Seconda Prova ).

Immagine originale:

( Mi è stata passata, la dimensione è più piccola ed ha un po' di perdita di qualità, ma il risultato è questo )

PROVA 1:
Questo è il codice originale scritto con l'aiuto di Phoenix, modificato per farlo funzionare con la paletta a 8 bit.
Codice:
http://pastebin.com/VqNJWk11
data.Length è uguale a : int valueRead = (imageInfo.WidthSwizzle * imageInfo.Height * imageInfo.BitPerPixel) / 8;

Risultato:


Problema:
Se si guarda l'orecchio destro, mancano dei pixel di chiusura.

PROVA 2:
Codice:
http://pastebin.com/01YTaRNe
data.Length = imageInfo.Palette.PointerPalette,

Risultato:


Problema:
I byte vengono usati tutti adesso, però, come si vede dall'immagine, non è posizionata bene.

Ho notato inoltre che, quest'ultima tecnica, se l'immagine originale, ha almeno una delle due grandezze potenza di 2, funziona perfettamente, ma nel momento in cui nessuna delle due è potenze di due, l'immagine risultante, sarà come questa.

Daviex94

Risolto.

Poco dopo aver postato, ho avuto un lampo di genio guardando quell'originale, ed ho pensato che, se il file di gioco mi da una WidthSwizzle, che è la larghezza per la decodifica, ma non l'altezza, chi mi dice che l'altezza non posso aumentarla quanto voglio? Quindi ho usato solo la Texture Height e la WidthSwizzle, le taglio, e così adesso tutte le immagini escono perfette.

Grazie al forum per avermi dato quest'idea :D