Lire un fichier binaire structuré.
Bonjour, j'espère que vous allez bien ? Je suis nouveau ici, mais je programme en Java depuis 2 bonnes années, je pense donc avoir les bases, même si l'OpenGL reste encore un peu flou pour moi. En effet, je me suis mis en tête, depuis plusieurs semaines, de lire un fichier de modèle 3d animé au format mdl (format utilisé par le vieux jeux-vidéo Quake I). Un tutoriel en Français explique très bine comment s'y prendre, mais le langage utilisé ici est le C, or je n'y ai jamais touché. J'ai donc essayé de retranscrire à ma manière, un code aux effets semblables, cette fois-ci en Java. Voici le lien du tutoriel, et ici mon début de code.
J'ai donc parfaitement réussi à lire la partie "header" du fichier binaire en question. Mais dès qu'il s'agit de lire la variable data du type GLUbyte, c'est la catastrophe ! J'ai cru comprendre qu'en Java, on pouvait l'interpréter comme un tableau de byte, mais rien à faire, je ne parviens à la lire. Des pistes ? Merci d'avance !
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| package fr.plaigon.mdlloader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
import com.google.common.io.LittleEndianDataInputStream;
import fr.plaigon.md5loader.GLApp;
public class MDLReader
{
public String filepath = "";
public String filename = "";
public MDLReader(String fileName)
{
loadobject(fileName);
}
public void loadobject(String objfilename)
{
if (objfilename != null && objfilename.length() > 0)
{
String[] pathParts = GLApp.getPathAndFile(objfilename);
filepath = pathParts[0];
filename = pathParts[1];
try
{
loadobject(GLApp.getInputStream(objfilename));
}
catch (Exception e)
{
System.out.println("MDLReader.loadobject(): Failed to read file: " + objfilename + " " + e);
}
}
}
public void loadobject(InputStream in)
{
if (in != null)
{
int skinWidth, skinHeight;
FileInputStream fis = (FileInputStream)in;
try
{
LittleEndianDataInputStream dis = new LittleEndianDataInputStream(fis);
//Header start
System.out.println(dis.readInt());//ident or "magical number"
System.out.println(dis.readInt());//version
//Scale model vector coordinates
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());
//Translation model vector coordinates
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());//Sphere radius
//Eyes model vector coordinates
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());
System.out.println(dis.readFloat());
System.out.println(dis.readInt());//num_skins
System.out.println(skinWidth = dis.readInt());//skinwidth
System.out.println(skinHeight = dis.readInt());//skinheight
System.out.println(dis.readInt());//num_verts
System.out.println(dis.readInt());//num_tris
System.out.println(dis.readInt());//num_frames
System.out.println(dis.readInt());//synctype
System.out.println(dis.readInt());//flags
System.out.println(dis.readFloat());//average size of triangles
System.out.println(dis.readInt());
for(int i = 0; i < skinWidth * skinHeight; i++)
System.out.println(dis.readByte());
//Header end
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
} |