Raydium 3D Game Engine

Official forum for everything about Raydium, ManiaDrive, MeMak, ...
It is currently Thu Mar 28, 2024 8:12 pm

All times are UTC




Post new topic Reply to topic  [ 15 posts ] 
Author Message
 Post subject: Doléances ...
PostPosted: Thu Sep 21, 2006 9:28 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

J'avance dans la programmation avec raydium.

Quelques fonctions semblent faire defaut.

1:Obtenir le nom ou d'autres infos sur un objet / element a partir de son indice. On peut aller dans la table raydium_ode_element[e1], une fonction voire une macro serait peut etre utile ?
raydium_ode_element_get_name(int i); ...
Peut etre detailler un peu plus dans l'api ?

2:La creation d'un objet en définissant la taille et en specifiant une mesh. La taille est bien mise a jour mais ne correspond pas au mesh: serait-il possible de resizer le mesh en fonction de la taille imposée ?

3:Rendre la gravité parametrable.

4:J'ai aussi remarqué que si on change le contenu du fichier specifié dans raydium_ode_ground_set_name("test.tri"), il n'est pas lu a nouveau. C'est un détail j'en conviens.


5:Etrange

dans
Code:
raydium_camera_smooth()

si comme dernier argument on met une valeur pas tres coherente je l'admet (par exemple < framerate) on obtients l'erreur suivant:
    Raydium: sound : ERROR: invalid 3xALfloat array provided

Alors que la voiture ne fait pas de bruit (toutes les fonctions concernant les sons sont enlevées).

6:Un deuxième point de vue de la scène dans un coin de l'image principale (voir un précédent post). Ca serait vachement chouette !

Voila c'est tout !
Bien sur je vais essayer de coder des trucs, mais je n'ose pas trop toucher au code de raydium, je ne code pas assez bien.

Bonne journée
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 22, 2006 9:20 am 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
1 : obtenir des infos des éléments
Le problème ici est d'arriver à créer assez de fonctions (si on commence par le nom, pourquoi ne pas proposer la taille, le mesh associé, ...). La solution de la macro est originale mais pose un problème au niveau des bindings de Raydium (PHP et Python à l'heure actuelle) qui ne vont pas voir cette macro.
Je pense que la solution (temporaire ?) va passer par une macro "avec avertissement dans la doc". Je regarde ça ASAP.

2 : adapter la taille du mesh en fonction des infos de création
Problème ici : et si je souhaite créer un objet dont la taille du modèle ne doit pas correspondre avec celle de l'objet physique ? C'est par exemple le cas avec la Clio de ManiaDrive, dont la "boite" physique est plus petite que le modèle (pour moins "accrocher" les bords, en particulier au niveau des rétros). Mais l'idée est intéressante ... Il faudrait ici ajouter une fonction de "scale" au niveau de l'élément (RayODE) ou même au niveau de Raydium lui même (object.c). A rajouter sur la TODO :)

3 : changement de la gravité
Oui, c'est légitime. C'est maintenant dispo dans la rev 432.

4 : raydium_ode_ground_set_name(...) ne recharge pas l'objet
Effectivement, et c'est valable pour toutes les fonctions qui utilisent des noms de fichiers .tri ... Tout chargement inscrit le modèle dans le cache. Il y'a a l'heure actuelle aucune solution pour contourner le problème, Raydium n'offrant aucune fonction de "déchargement" ... (cf la manière dont ManiaDrive gère la chose en accumulant les circuits en RAM).
Voilà au passage une importante feature à rajouter à la roadmap "long terme" !

5 : raydium_camera_smooth() et les erreurs de "sound.c"
Le lien entre la caméra et le son se situe au niveau de la fonctionnalité "son spatial" de Raydium, qui doit déplacer "l'oreille" d'OpenAL avec la caméra. Tu as un exemple simple qui génère ce problème ?

6 : autre rendu de la scène dans un coin de l'écran
Il est déjà possible de réaliser ça avec quelques astuces :

1 : créer une "fausse" texture :
raydium_texture_load_internal("","camera",1,256,256,4,-1);
(texture de 256*256*RGBA de nom "camera")

2 : avoir une boucle de rendu de ce style :
Code:
...
raydium_clear_frame();
... placement de la camera "vignette" avec les fonctions habituelles ...
glViewport(0,0, 256, 256); // on limite la zone de rendu à 256x256 pixels
raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z)
raydium_camera_replace();
raydium_ode_draw_all(RAYDIUM_ODE_DRAW_NORMAL);
glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("camera"));
glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, 256, 256);
raydium_rendering_internal_restore_render_state();


A partir de cette instant, la scène est rendue dans la texture "camera"
Ensuite, on repart sur un affichage habituel (ou presque) :
Code:
glViewport(0, 0, raydium_window_tx, raydium_window_ty);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
raydium_camera_replace();
...
raydium_ode_draw_all(RAYDIUM_ODE_DRAW_NORMAL);
...
raydium_rendering_finish();

C'est utilisé par deux fois dans volcano.c par exemple (pour rendre le reflet et le fond de l'eau). Alors bien sur, il serait possible de rendre ça beauuucoup plus facile et transparent pour l'utilisateur, mais pour l'heure .... :)


Top
 Profile  
 
 Post subject: Doleances ...
PostPosted: Fri Sep 22, 2006 10:07 am 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

1: Ne t'embete pas a ecrire des macro allez chercher dans la table est suffisent. Peut etre un ligne dans l'api ?

2: Je vais essayer de m'en occuper, en me basant sur raydium_object_isvalid

3: Parfait

4: Je m'en doutais c'est pas grave

5: Il suffit de mettre un dernier parametre assez petit (30 par exemple) plutot raydium_frame_rate*3

6: Je teste ca tres tres vite merci beaucoup !!!!

A+
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 22, 2006 10:35 am 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Quote:
5: Il suffit de mettre un dernier parametre assez petit (30 par exemple) plutot raydium_frame_rate*3

raydium_frame_rate n'existe pas et tu parles sans doute de raydium_frame_time ("durée en secondes de la dernière frame") qui est un nombre du très petit (0.016 pour du 60 FPS par exemple)... 30 est donc une valeur énorme ! Ta caméra est expulsé très loin j'imagine, du coup :)


Top
 Profile  
 
 Post subject: Pb sons
PostPosted: Fri Sep 22, 2006 11:25 am 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

Effectivement, il s'agit bien de raydium_frame_time.
Ma remarque etait sur le fait qu'une abheration sur la camera provoquait une erreur dans la partie son de raydium, meme si celle si n'est pas utilisée.

P.S.: J'ai encore un peu de mail avec les raydium... mais ca rentre doucement.

A+
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Fri Sep 22, 2006 4:17 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Ok, entendu. Je vais voir si il n'est pas possible de placer un "filtre" haut à l'entrée de la fonction.


Top
 Profile  
 
 Post subject: ViewPort
PostPosted: Sat Sep 23, 2006 9:54 am 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

Je n'arrive pas a faire marcher ton code.

D'abord je n'avais pas vu ton point1 (creation de la texture).

Ensuite je n'ai qu'une image a l'ecran. Ce qui m'enbete c'est que je ne place pas ma camera pour la vue complete, et si je le fait j'ai une erreur
Quote:
Raydium: Warning: too many calls to camera_* ! (matrix already pushed)

j'ai essayé de diminuer la taille des viewports, mais je n'ai qu'une image.

Je suis un peu leger en opengl.
Je comprends bien la première partie du code qui copie le rendu dans une texture.
Je ne comprends pas quand cette texture sera affiché.

J'ai regardé volcano, mais avec les shaders dessus c'est encore plus dur a comprendre.

Peux tu me detailler un peu la manip stp ?

A+
Jacques

P.S.: Merci pour la gravité !


Top
 Profile  
 
 Post subject:
PostPosted: Sat Sep 23, 2006 5:36 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Je suis sincérement désolé ! J'ai oublié un point clef dans mon explication ... c'est vraiment nul de ma part de ne pas avoir vérifié mon post ... :/

Tu as parfaitement senti le problème : la texture n'est jamais affichée dans mon code, l'appel manquant étant le suivant :
Code:
raydium_osd_draw_name("camera",0,0,20,20);

(qui va afficher la texture en question dans le coin bas gauche en l'occurence)

Cet appel est à placer à la fin du display(), par exemple juste avant le rendering_finish.

Avec mes excuses répétées !


Top
 Profile  
 
 Post subject: Plusieurs camera ???
PostPosted: Sat Sep 23, 2006 7:46 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonsoir,

Je commence a arriver a quelque chose.

Tout d'abord, j'arrive a voir le premier viewport si aucun texture n'est dessinée par dessus dans le "ciel" par exemple.
Sinon des fois elle "passe dessus" la texture du viewport principal, d'ou des apparition d'objets.

Ce phenomène apparait même avec la dernière solution, la vignette est affichée correctement, avec des apparition du viewport de la vignette.

On peut resoudre cela en faisant un

Code:
raydium_clear_frame();

entre les deux viewports et en ne faisant plus:
Code:
raydium_rendering_internal_restore_render_state();


Par contre pour avoir de points de vues je suis obligé de bloquer un test de camera.c

Code:
if(!raydium_camera_pushed || 1)

sinon raydium n'autorise le placement que d'une camera, c'est ecrit en clair dans l'api donc ok.

Avec ces deux modifs ca marche, du moins il me semble. Par contre il y a des problemes a resoudre due aux interactions des deux cameras que je crée.

Comment organiser le tout ?
Je pense à une camera temporaire sans fonction path, rumble, ...
Que l'on pourrait juste faire un place, look-at ... Associé aux fonctions de vignettage par exemple.
Qu'en penses-tu ?

Plusieurs autres question:

Dans raydium_camera_internal il y a un rendu de sky_box, ne risque t'il pas d'être redondant avec celui fait dans le code ?

Dans la vignette le sky_box ne tourne pas avec la vue, normal ou mauvaise manip de ma part ?

A+
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Sat Sep 23, 2006 8:07 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Il y a effectivement quelques points auquel je n'avais pas pensé, étant donné que Volcano n'utilise qu'un seul placement de caméra (ensuite, ce ne sont que des manipulations de la matrice de visualisation). Donc effectivement, la limitation d'une caméra par frame est un problème. Dans le même genre, un second appel à une fonction de caméra va effectivement dessiner seul la skybox, à la différence de Volcano, encore une fois.

Peut être serait-il intéressant de placer un exemple de caméra multiples dans les démos Raydium (après avoir ajouté quelques modifs nécessaires à Raydium pour rendre le tout plus ... lisible :) ).

Dernier point, il manque effectivement un proto dans sound.c. J'applique la modif tout de suite.

edit : c'est fait.


Top
 Profile  
 
 Post subject: Plusieurs view ports
PostPosted: Sat Sep 23, 2006 8:55 pm 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonsoir,

Voici un code qui marche, si tu le valide je l'incorpore à test6, ou bien un autre test a toi de voir.

Tout cela sans toucher à camera.c

Par contre les deux placement, vont generer deux localisations du son,
Il faudrait donc prevoir un:
Quote:
raydium_camera_temp_place

par exemple
ou un jeu de fonctions viewport ?

J'aurais bien incrementé le nb de camera dans la scene, en affectant le son à la première uniquement, mais il me semble que la vignette doit etre genérée avant la scene complete, donc difficile à faire.



Code:
raydium_clear_frame();


    if(!raydium_key[GLUT_KEY_F2]){
        //raydium_camera_replace();

        //... placement de la camera "vignette" avec les fonctions habituelles ...
        glViewport(0,0, 256,256); // on limite la zone de rendu à 256x256 pixels
        raydium_ode_element_camera_inboard_name("corps",0.2,0,0.1,2,0,0);

        raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
        raydium_camera_replace();
        raydium_ode_draw_all(RAYDIUM_ODE_DRAW_NORMAL);
        glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("camera"));
        glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, 256, 256);
        raydium_rendering_internal_restore_render_state();
        //raydium_clear_frame();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
        raydium_camera_pushed=0;
    }

    glViewport(0,0, raydium_window_tx-0, raydium_window_ty-0);

    raydium_camera_place(cam_pos_x,cam_pos_y,cam_pos_z,cam_angle_x,cam_angle_y,0);


    raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
    raydium_camera_replace();
    raydium_ode_draw_all(0);
    raydium_camera_replace();
   
    if(raydium_key[GLUT_KEY_F1])
        raydium_ode_draw_all(1);
       
    raydium_camera_replace();

    raydium_osd_printf(2,98,16,0.5,"font2.tga","- %3i FPS - tech demo %s for Raydium %s, CQFD Corp.",raydium_render_fps,version,raydium_version());


    if(!raydium_key[GLUT_KEY_F2])
        raydium_osd_draw_name("camera",0,0,20,20);
    raydium_osd_logo("logo.tga");
    raydium_rendering_finish();


Critiques bienvenues !

A+
jacques
[/quote]


Top
 Profile  
 
 Post subject:
PostPosted: Sat Sep 23, 2006 9:58 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
C'est trop "sale" pour être intégré sous cette forme là ... Sans aménager Raydium, pour être précis.
Les points à couvir sont (à mon sens) les suivants :
- Copie du buffer de rendu vers une texture (avec un flush OpenGL, quelques callbacks [rendu des particules, par exemple], une remise à zéro du "render state")
- Une prise en charge des appels multiples de caméra dans le cas unique du rendu "vignette" et du problème (très juste) du son.

... et c'est déjà pas mal :)
En revanche, il ne faut pas intégrer ça à test6, déjà bien assez chargé pour être clair et didactique, mais bien créer une petite démo spécifique.


Top
 Profile  
 
 Post subject: Viewports
PostPosted: Sun Sep 24, 2006 8:42 am 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

Quote:
C'est trop "sale" pour

:( :( :(
Bon je m'en doutais un peu quand meme.

La nuit portant conseil, je pense que l'ideal serait des fonction vignette specifiques:

raydium_viewport_create ...
raydium_viewport_camera_place
raydium_viewport_camera_look_at
...
raydium_viewport_render
raydium_viewport_draw

Est ce a peu près dans l'esprit raydium ?

Pourquoi opengl flush (utilité ?) je te rappelle que je ne connais pas opengl.
j'essaierai de copier les callback du render normal.

Dernière question:
L'impact sur le frame rate semble nul (60fps à 57fps) sur ma machine.
Est ce normal, ou bien la methode de calcul du fps qui n'est plus exacte ?

A+
Jacques


Top
 Profile  
 
 Post subject:
PostPosted: Sun Sep 24, 2006 7:44 pm 
Offline
User avatar

Joined: Sun Mar 16, 2003 2:53 am
Posts: 2591
Location: gnniiiii (Scrat)
Je ne pense pas que proposer de nouvelles caméras soit une bonne solution : soit on offre moins de possibilités avec ces caméras qu'avec les "originales", soit on duplique l'existant, ce qui est probablement la pire chose à faire :)
Je pensais plus ici à une fonction qui "annulait" l'appel précédent de caméra, en autres choses.

Par flush, je voulais parler du "vidage" des caches OpenGL, les cartes vidéo utilisant des optimisations massives qui peuvent fortement décaler l'application des appels OpenGL de l'application. C'est l'en des rôles de raydium_rendering_finish() par exemple.

A propos de la faible différence de FPS, il est possible que tu ai une limitation à 60 FPS (vsync, tout à fait légitime) qui ne te montre pas intégralement l'impact de la méthode sur les FPS. Ce n'est qu'une supposition :)


Top
 Profile  
 
 Post subject: camera ... cameras ?
PostPosted: Mon Sep 25, 2006 9:47 am 
Offline

Joined: Sun Oct 09, 2005 10:46 pm
Posts: 759
Bonjour,

Les cameras du viewport auront des fonctionnalités limitées:
Pas de son, pas de rumble ...
Sinon il faudrait travailler avec une table de cameras ?

Sinon il faut modifier les possibilité des camera "originales" pour qu'elles soient ou non associées au problemes de son/rumble ...

C'est pour cela que la solution d'une camera temporaire aux fonctionnalités limitées (placement, look_at ,...) me semblait la plus logique.
On ne duplique pas l'existant on crée des fonctions allégées :D

Si on touche à l'api camera existante (un paramêtre en plus) on est obligé de modifier tout les programmes :(
Si on ajoute des fonctionnalités, c'est plus souple.

Concernant l'annulation:
Peut on annuler le placement du son par exemple ?
Pour les fonctions de smooth et rumble, ne risque t'on pas l'usine a gaz ?

Je te laisse choisir la solution que tu prefere.
Je vais regarder comment faire un
raydium_camera_reset


pour le flush ok

Fps ca me convient comme explication en attendant mieux :D

A+


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 15 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 36 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group