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 : Sélectionner tout - Visualiser dans une fenêtre à part
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();
            }
        }
    }
 
    }