Je pense que pour les déplacements c'est tout bon: en fait il suffit de faire bouger la caméra autour des axes.
Je ne pense pas qu'il y ait besoin d'angle. Je sais pas comment ont fait les programmeurs qui ont déjà fait un moteur 3D mais c'est tout l'inverse du raycasting.
J'avais commencé à programmer en BASIC 83+ l'algo du raycasting mais pour les déplacements je ne savais pas tellement comment faire, non plus.
Pire encore: pour afficher les murs en fonctions des coordonnées trouvées.
Si il fallait avancer en fonction d'un gle cela voudrait dire que les objets de la scène sont fixes comme dans une map pour un jeu en ray-casting.
Mais là si on applique déjà des rotations au objets ce n'est déjà pas pour rien.
Les objets sont positionnés lors des rotation et ensuite il y a juste besoin de faire bouger la caméra sur un axe.
Par contre pour faire une rotation avec la caméra autour d'un objet je n'ai pas encore compris comment faire.
Moi je fait tourner l'objet sur lui même et c'est la première transformation qu'il subit.
C'est vrai que je cherche absolument à tout optimiser au maximum. Pour les touches avant j'utilisais _keytest() puis comme je savais que GX_rowread() était plus rapide et bien j'ai utiliser GX_rowread().
_keytest_optimized je connaissait déjà mais je ne savais pas que l'on pouvait stoquer la valeur dans une variable !
Dans la doc il n'y a que ça:
for (;
{
BEGIN_KEYTEST
if (_keytest_optimized (RR_LEFT)
|| _keytest_optimized (RR_RIGHT)
|| _keytest_optimized (RR_UP)
|| _keytest_optimized (RR_DOWN))
break;
END_KEYTEST
}
... et ils ont pas l'air de dire ça ?
Si c'est possible de le faire c'est clair que je le ferais tout de suite. En tout je crois que j'utilise 12 touches.
Sinon la routine du tracé horizontale de ligne est déjà très rapide mais je l'ai simplifié.
Je pourrais encore l'optimiser en limitant le tracé que dans un seul sens mais dans ce cas là il faut que je trie les X de mes sommets dans le programme.
Pour ceux que ça intéresse la voici:
void FastDrawLineLH(short x1,short x2,short y) {
static const unsigned short table1[16] = {0xffff,0x7fff,0x3fff,0x1fff,
0x0fff,0x07ff,0x03ff,0x01ff,
0x00ff,0x007f,0x003f,0x001f,
0x000f,0x0007,0x0003,0x0001};
static const unsigned short table2[16] = {0x0000,0x8000,0xc000,0xe000,
0xf000,0xf800,0xfc00,0xfe00,
0xff00,0xff80,0xffc0,0xffe0,
0xfff0,0xfff8,0xfffc,0xfffe};
short dx;
short sx;
unsigned short* p;
if (x1>x2) { // on pourrait enlever cette partie si toutes les lignes étaient dessinées de droite à gauche.
short tmp = x1;
x1 = x2;
x2 = tmp;
}
p = (unsigned short*)(Lbuffer+(y<<5)-(y<<1)+((x1>>3)&0x1e));
dx = x2-x1+1;
sx = x1 & 0x000f;
if (dx<16) {
unsigned long val = (ASM_SWAP(table2[dx])) >> sx;
*(unsigned long*)p |= val;
return;
}
if (sx) {
*p++ |= table1[sx];
dx -= (16-sx);
}
while (dx >= 16) {
*p++ |= 0xffff;
dx-=16;
}
if (dx) *p |= table2[dx];
}
Celle-ci dessine uniquement dans un buffer qui est affiché dans le LIGHT_PLANE.
Bien entendu le buffer est déclaré dans le header et la taille de mémoire allouée est défénit dans le fichier C.
D'ailleurs il faudrait que je recopie toutes mes fonctions dans un header mais j'ai bcp de difficulté.