« 1 (2) 3 4 5 ... 9 »


Re: hARMful engine
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1598
Petite question pour la culture: comment ça fonctionne, en résumé, un moteur de jeu qui gère nativement un langage ?

Par exemple, Ogre est en C++, mais accepte nativement le python. Pourtant, il semble qu'on ne sait pas tout faire en python.

Et Blender, pareil: pourquoi un programme en C++ nous permet de communiquer en python ?

Contribution le : 21/01 16:36:28
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Python est un langage interprété. Contrairement à certains langages comme C, C++ ou Rust, il n'est pas compilé. Autrement dit, Python n'est pas directement traduit en langage assembleur (~ instructions en bits) que le processeur est capable d'exécuter directement.
Pour pouvoir interpréter du Python et donc rendre son code exécutable par l'ordinateur, il faut un programme intermédiaire appelée interpréteur qui s'occupe de faire cette traduction "texte vers assembleur".

De tels programmes d'interprétation existent, écrits en différents langages pour Python. CPython est écrit en C, Jython en Java, etc.

Pour utiliser du Python depuis un programme en C ou C++, on a justement une interface en C existante qui fait cette traduction. Celle-ci permet soit d'embarquer du code Python sous la forme d'une chaîne de caractère, soit d'importer un module Python depuis un fichier.

Ici le lien de la doc, mais le code est indigeste bien qu'ils précisent que c'est à cause de nombreuses vérifications.
https://docs.python.org/2/extending/embedding.html


A l'inverse, on peut étendre le langage Python à partir de code C ou C++ (ou encore d'autres sans doute). On écrit le code qui fait ce qu'on veut en C/C++ et on crée ensuite des fichiers autour qui vont servir à importer et utiliser ces fonctions ou classes. La raison de faire ça peut être multiple : performances, réutilisation du même code en natif ou en Python, etc.
Dans le cas du BGE, on récupère par exemple des données de la scène 3D (position d'objets). Les gars se sont pas amusés à synchroniser 40 fois les mêmes données : ils ont dû faire un wrapper du code C++ existant dans Blender.

Pour mieux expliquer tout ça, parlons de trois phases permettant d'appeler du code natif depuis un script (l'exemple est bidon* et très simpifié, c'est pour l'idée) :
1. Code natif
float myFunction(float a, float b, int c) {
    // ....
    return result ;
}

2. Wrapper
void wrapperMyFunction(PyFloat a, PyFloat b, PyIntc, PyFloat& result) {
    float resultFloat = myFunction(a.value(), b.value(), c.value()) ;
    result.setValue(resultFloat) ;
}

3. Script

f1 = 0.2
f2 = 3.6
i1 = -6
result = 0.
wrapperMyFunction(f1, f2, i1, result)

* (j'ai inventé les PyFloat, etc)


1. Tu as du code natif, disons une fonction en C++ que tu utilises déjà dans ton application. Elle a ses propres paramètres pour son calcul et retourner son résultat. Maintenant, tu veux aussi pouvoir l'exposer en Python...

2. Problème : l'interpréteur Python il ne la connaît pas et ne sait même pas comment l'appeler !

Il faut en effet prendre le problème à l'envers du cas habituel.
Dans le cas du BGE habituel, tu cherches la fonction "OrthoProjectionMatrix(plane, matSize, axis)". Tu vois qu'attend ces 3 paramètres, donc tu donnes ces valeurs lors de ton appel de fonction.
La signature de la fonction guide l'appel de fonction.

Dans le cas de l'extension d'un langage de script, c'est l'inverse : on sait comment va être appelée la fonction et c'est donc à nous de créer la signature avec les paramètres qui seront donnés.
L'appel de fonction guide la signature de la fonction.

Or, notre belle fonction décrite en 1. n'a pas forcément cette signature (encore moins s'il faut un type de donnée spécifique au langage de script comme je l'ai fait ici).
On va alors appeler notre fonction en 1. depuis notre nouvelle fonction en cours de développement : c'est typiquement ce que fait un "wrapper".

Elle va par exemple "convertir" les PyFloat en float, etc. Les donner à notre fonction native et emballer le résultat en PyFloat tel que souhaité.

3. Avec tout un tas de choses en plus de ce que j'ai fait en exemple bidon, on peut enfin utiliser notre fonction en Python.

Contribution le : 21/01 18:01:24
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Ici, je parle de Python mais c'est globalement le cas pour tous les langages de script.

Dans mon ancien taf, j'avais la magnifique tâche de faire communiquer du script Matlab avec du C. Donc je connais bien la procédure que ça implique même si je ne connais pas celle spécifique à Python.

Contribution le : 21/01 18:07:17
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Coucou,
Un petit point sur les avancements !

J'ai pris un peu de retard par rapport aux prévisions. D'une part parce que j'ai fait une "bêtise" : j'ai voulu ajouter le support de l'anti-aliasing !
De l'autre, un incendie a eu lieu dans ma résidence et ça a foutu la pagaille ! Heureusement, pas de dégâts chez moi.

Ce que je ne savais pas avec l'anti-aliasing - car j'ai exploré un domaine que je ne connaissais pas du tout - c'est que ça allait changer énormément de choses dans le code ! J'ai dû faire un beau refactoring ("réusinage" pour nos amis québécois).
Cela m'a demandé en fait de revoir la partie du rendu, en particulier "à cause" de l'ambient occlusion. C'est un mal pour un bien car ce travail devait être fait, je le prévoyais pour plus tard lorsque j'allais implémenter des effets de post-production. Au final, l'ajout d'effets de post-prod sera nettement simplifié !

La suite sera une amélioration du code sans ajouts notables côté rendu. En particulier, je vais m'attacher à utiliser les smart pointers de C++ pour faciliter la gestion de la mémoire.
J'ai aussi quelques bugs à corriger avant de passer au support de Windows.

Le plan de développement est ici !
https://github.com/dcarlus/hARMful/projects/5



Si vous êtes intéressés par les détails techniques, voici une petite explication.

Je fais mes rendus hors écran, dans des framebuffers, pour réaliser du "deferred shading"*. Un framebuffer est comme un ensemble de textures dans lesquelles on vient écrire les valeurs de pixels à l'aide de shaders. Un framebuffer peut contenir plusieurs images en couleur en plus d'un depth buffer et d'un stencil buffer.
Dans mon cas, je stocke l'albedo des objets (= couleur/texture), les normals, la spécularité et la profondeur des objets (depth buffer).

Pour l'ambient occlusion, je stockais auparavant sa valeur dans le canal alpha de l'albedo pour un côté pratique et optimisé.

Le souci avec l'anti-aliasing, c'est que j'ai dû modifier le type de mes framebuffers afin que ceux-ci supportent le multisampling (comme l'option MSAA des jeux vidéo). Quand on utilise un framebuffer en multisampling, toutes les textures qui le composent doivent elles-mêmes être aptes à supporter le multisampling. Ainsi, mon ambient occlusion était calculée plusieurs fois par le GPU pour chaque sample. Par exemple, pour un MSAA x4, elle est calculée 4 fois. Pire encore, une texture avec multisampling occupe plus d'espace puisqu'il faut autant de copies qu'il y a de samples (dans l'exemple, 4 copies). Mais l'ambient occlusion n'a pas besoin d'antialiasing car elle est déjà floutée dans le processus de traitement.

J'ai donc dû faire beaucoup de changements pour avoir d'un côté mon framebuffer avec MSAA. J'ai ensuite précalculé le shading en appliquant le MSAA dans un autre framebuffer sans multisampling (!). Ce framebuffer me sert également pour les effets de post-prod dont l'ambient occlusion.

Ouf !!


J'ai acheté le humble bundle d'objets 3D à 1€ pour faire des scènes de démo, ici la scène de démo du pack.


* Le deferred shading, c'est une façon qui est très répandue dans les jeux vidéo pour optimiser le calcul des lumières (il existe des alternatives). Au lieu de calculer l'ombrage pour chaque objet, on ne le fait que globalement pour uniquement ce qui est visible à l'écran.
https://fr.wikipedia.org/wiki/Deferred_Shading

Contribution le : 15/02 18:18:39
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Bonsoir,

Voilà, j'ai peaufiné le code avant la release et surtout... j'ai réussi à faire un build sous Windows !! Cerise sur le gâteau, le process de build n'est pas trop complexe et demande relativement peu d'installations !

J'ai fait une petite vidéo pour montrer comment le tout se compile sous Windows (je ferai une vidéo pour Linux aussi, qui devrait être bien plus courte).
https://www.youtube.com/watch?v=W5kpHneNB9I

(Non, je parle pas dans la vidéo. Je vous épargne mon accent angliche ! ).

Il ne me reste plus qu'à packager tout ça dans un zip pour faire la release de la v1.0. Cette première version n'a pas énormément d'utilité, elle ne sert qu'à afficher des objets en 3D. Il faut bien commencer quelque part !

Contribution le : 05/03 23:16:10
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1598
Super tout ça !

Donc, l'utilisateur va devoir faire pareil à chaque fois qu'il rajoutera un contenu dans son projet si je comprends bien ?

Contribution le : 06/03 12:01:58
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Merci !

J'ai mis les DLLs déjà compilées (en debug et en release) sur GitHub.
https://github.com/dcarlus/hARMful/releases

Il suffit de télécharger le zip contenant tout le nécessaire pour lier les DLLs au programme développé avec. J'ai également fourni toutes les DLLs des bibliothèques dont je dépends comme pour charger les meshs, les images, etc.

Dans mon cas, c'est la procédure de compilation pour quelqu'un qui voudrait par exemple compiler le code en dehors des releases. Imaginons qu'un bug gênant impacte une application. Si entre-temps j'ai corrigé le bug mais sans faire une release officielle, la personne pourra malgré tout compiler et avoir des DLLs corrigées dans l'attente de la prochaine release.

La plupart des projets open source mettent à disposition des versions précompilées lors des releases (surtout si le processus est complexe). Ils indiquent également la procédure pour compiler soi-même le projet si tu en as besoin pour une raison X ou Y.
Par exemple, tu peux compiler toi-même un noyau Linux afin de l'optimiser au maximum pour ton processeur, ajouter ou retirer des modules, etc.

Il peut y avoir encore d'autres raisons de compiler soi-même un projet.

Dans le cas de Blender, j'avais compilé la version 2.82 avant sa sortie pour voir un peu ce qu'allait donner les nouveaux ajouts à EEVEE. C'était simple et bien expliqué dans le code source de Blender !

Contribution le : 06/03 19:19:26
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1598
Ok, donc:

- CMake, c'est pour compiler.
- Microsoft visual studio, c'est l'interface de programmation ?
- Et Conan (je ne connais que "le barbare" mais c'est tout autre chose) ???

Concrètement, où insère-t-on les assets, textures, sons, etc, et dans le système hARMful, et dans la scène 3D de hARMful ?

Contribution le : 06/03 20:45:24
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Pour compiler un projet en C/C++ avec des bibliothèques externes, on a besoin de plusieurs choses. Les bibliothèques elles-mêmes (du code compilé en binaire) et aussi ce qu'on appelle la définition des classes, fonctions, données globales, etc (qu'on nomme généralement "header" ou "include").
Ces deux choses, bibliothèques et headers, sont données au compilateur afin qu'il puisse reconnaître des fonctions qui ne sont pas écrites dans le code de notre projet actuel.

Par exemple, tu as une bibliothèque jpeg.dll (si on est sous Windows) pour charger une image JPEG. Dans ton programme, tu utilises la fonction "load_jpeg()" mais tu ne l'as pas écrite dans ton programme. Pourtant, grâce aux "headers" de la bibliothèque "jpeg" que tu lui as donné, il sait que c'est une fonction qui existe même si elle n'est pas dans ton code à toi.

Ensuite, on a une autre étape qui vient après la compilation, c'est l'édition de liens. Ca, c'est pour que l'exécutable sache ensuite, quand tu le lances, que "load_jpeg()" se trouve dans la bibliothèque jpeg.dll (pour faire simple).


Toute cette explication me permet de t'indiquer le rôle de CMake. CMake est un outil multiplateform qui permet, avec un même fichier de configuration, de préparer tout le nécessaire à la compilation d'un projet. C'est CMake qui va faire en sorte que le compilateur reçoive bien toutes les bibliothèques et leurs headers. Il va non seulement vérifier que toutes les bibliothèques (nécessaires ou optionnelles) sont installées mais aussi récupérer toutes les informations à leur sujet. Il va détecter ton OS, les compilateurs installés et tu peux en plus choisir de compiler en 32 ou 64 bits, apporter des options à ton code, etc.
Parmi les fichiers que génère CMake, il y a les solutions Visual Studio sous Windows (si on a Visual Studio). Une solution permet ensuite d'ouvrir le code dans Visual Studio pour faire le développement du projet, le compiler, le déboguer et bien plus encore. C'est un outil extrêmement complet et pas uniquement réservé au C++ (F#, C#, Python...).
Sous Linux, CMake va générer d'autres fichiers pour permettre de compiler facilement.

Là où c'est vraiment super, c'est que le même fichier de configuration peut te permettre de compiler pour différents OS (Linux, Windows, OS X, Android, iOS...).
Exemple de hARMful que tu compiles sous Windows https://www.youtube.com/watch?v=W5kpHneNB9I et Linux https://www.youtube.com/watch?v=zECjVr_6qko avec les mêmes fichiers CMake.


Conan est un gestionnaire de paquets dédié aux langages C/C++. Il est en particulier utile pour télécharger des bibliothèques écrites en C/C++.
Conan peut être intégré directement dans CMake. Comme je l'ai dit, CMake vérifie que les bibliothèques dont tu as besoin pour ton projet son bien installées. Or, avec Conan tu peux justement télécharger les bibliothèques quand celles-ci sont absentes du système (ou si elles sont dans une version trop ancienne). Quand CMake tourne pour générer ses fichiers, il va en profiter - si nécessaire - pour télécharger les dépendances et ensuite les lier au projet. Tu n'as donc rien à faire (car c'est particulièrement chiant), tout est automatisé !

Comme tu développes en Python, tu connais peut-être "pip". Conan c'est comme "pip" mais pour le C/C++. Et Conan peut aussi être installé à l'aide de "pip" (c'est ce que j'ai fait sur mon PC) !
Pour Node.js (JavaScript), il y a npm (Node.js Package Manager). En Rust, le gestionnaire de paquet est cargo. Etc.
Plein de langages ont recours à ce type d'outil tant ça simplifie la vie ! Même Visual Studio propose un tel gestionnaire du nom de NuGet, surtout pour les projets C# (même s'il existe aussi des paquets pour C++, c'est assez marginal et bien moins maintenu que Conan).


Pour ce qui est des assets, c'est toi qui gères. C'est pas un moteur comme Unity où tu as un dossier de projet avec tous tes assets. Je ne fournis que des DLLs qui font une abstraction d'OpenGL au final. Elles ne s'occupent que d'afficher ce que tu souhaites. Il faut juste veiller à ce que, dans le code du programme, le chemin vers les assets soit relatif à l'endroit où se situe le .exe.
Plus tard, j'aimerais bien développer un éditeur graphique pour mon moteur. mais ça ne sera pas avant un long moment...


PS: demain je vais faire un premier patch!
J'ai repéré un gros bug en créant de nouveaux FBX avec Blender qui fait crasher l'application. J'ai déjà la solution à ce bug, je n'ai pas eu le temps de le corriger encore.

PS2: je m'occupe ce week-end de faire une vidéo de présentation du moteur. Le but est de montrer ses (maigres) capacités graphiques ! Pour l'instant, j'ai réussi à mettre en valeur un beau mesh... plein de mordant. Bon, je l'ai récupéré sur BlendSwap car c'est hors de ma portée !

Contribution le : 07/03 00:53:24
Créer un fichier PDF de la contribution Imprimer


Re: hARMful engine
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Hello,

Je viens vous faire part d'une réflexion que j'ai depuis plusieurs jours. Je sais que j'ai dit ne pas vouloir faire d'éditeur graphique avant un long moment, pour prioriser le rendu (tout particulièrement, les shaders).

Le fait est que je réalise un petit trailer pour montrer les maigres capacités du moteur pour sa v1.0. Et là, comme je fais autre chose que de simples "turnarounds", je dois bien avouer que c'est ultra galère !! J'arrive à faire mes plans mais bonjour le temps perdu...

Comme je compte conclure mon trailer avec une scène assez complexe, ça va être chaud patate ! Il va falloir coder des transitions entre keyframes, ce qui n'est pas encore dans le moteur. Tant de développement alors que ça sera juste pour une vidéo de quelques secondes... C'est un peu relou !


Ce qui m'embête le plus, c'est les gizmos pour manipuler les objets en 3D. J'ai déjà développé ce genre de choses et c'est quand même bien ch**** à faire fonctionner.

Avec cet éditeur, je pourrai en plus éditer des matériaux directement dans le moteur plutôt que me contenter de bidouiller dans Blender afin d'atteindre un résultat potable. J'ai aussi plein de soucis à cause de textures non trouvées, car l'exporteur FBX en particulier, est assez mal foutu dans Blender.
Pour l'édition de matériaux, je pense partir sur un système nodal comme c'est le cas avec EEVEE.

J'aimerais aussi ajouter un système de "chemins", à la façon des courbes de Bézier dans Blender, qui servirait dans un premier temps à programmer des animations basiques, en plus de keyframes.

Le projet crée dans l'éditeur serait exporté et il serait possible de le lancer via le moteur.

Enfin du côté du moteur, introduire plus tôt que prévu les interactions utilisateur (clavier/souris/manette).

Contribution le : 13/03 11:19:10
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
« 1 (2) 3 4 5 ... 9 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses Problème rendu 5 55 Aujourd'hui 16:00:41
Rimpotche 
Questions & Réponses Modifier une série de matériaux texturés en même temps 4 240 Aujourd'hui 15:49:03
JaAlVir657 
Moteur de jeu GameBlender et alternatives [WIP] Cs (zones sol, héliport)    [1][2][3]...[42] 413 133948 Aujourd'hui 15:20:45
Redstar 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Première version disponible !    [1][2][3]...[57] 564 94212 Aujourd'hui 10:09:16
Hook 
Le coin des geeks pc bas prix    [1][2][3] 21 501 Aujourd'hui 09:15:09
Sphere3d 
[WIP] et travaux terminés bas sculpture corps    [1][2][3] 28 695 Hier 17:00:33
prometheusx 
Questions & Réponses Mesure de plusieurs objet Blender 2.82 3 81 11/07 19:38:58
Rimpotche 
Le coin des geeks Vieilles cartes graphiques : Quadro FX5800 ou Quadro 4000 ? 4 336 11/07 15:22:46
patapote 
Moteur de jeu GameBlender et alternatives hARMful engine    [1][2][3]...[9] 83 9472 11/07 12:59:48
Bibi09 
Questions & Réponses problème radeon pro render vêtements transparents 0 88 09/07 18:49:17
soloic 
Questions & Réponses [résolu] "vieux" fichier blender "invisible"    [1][2] 11 1008 09/07 16:03:24
kinder 
Questions & Réponses [non résolu] Adoucir les courbes et espacer uniformément les vertices dans l'UV Map 2 302 09/07 13:35:44
moonboots 
Questions & Réponses [terminé] contrôle de l'angle d'incision du chanfrein/bevel 2 110 08/07 16:08:24
halphasten 
The Blender Clan 'tchat Clignotement de l'interface de blender 7 413 08/07 13:13:40
zezer 
Questions & Réponses Pass index 1 105 08/07 12:47:07
Rimpotche 
[WIP] et travaux terminés [terminé] court métrage 2020 8 317 07/07 18:44:19
flahaut 
Questions & Réponses épaisseur sur une texture 6 173 07/07 15:28:27
moonboots 
Questions & Réponses [résolu] Affichage de la grille du plan et des axes 2 136 07/07 14:27:44
gedru 
Questions & Réponses [résolu] Blender 2.80 ne démarre pas 7 1186 07/07 09:42:16
geo160 
Questions & Réponses Knife tool a arrêté de fonctionner 1 115 06/07 16:29:51
Rimpotche 

Qui est en ligne
186 utilisateur(s) en ligne (dont 131 sur Forums)

Membre(s): 1
Invité(s): 185


ebrain, plus...
Nouveaux membres
Mikael 12/7/2020
soloic 9/7/2020
kinder 9/7/2020
halphasten 8/7/2020
KOALA_NET21 8/7/2020
singinzerin 6/7/2020
Dartank 5/7/2020
manondup 3/7/2020
Ramar 3/7/2020
Blendnoob 2/7/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Jui 23
Anniv du BlenderClan !
Aou 7
anniversaire Cem47
Aou 13
Anniversaire Siskas
plus 268 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445