Advertisement
Lynix

Untitled

Mar 12th, 2015
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.60 KB | None | 0 0
  1. /*
  2. ** FirstScene - Première scène graphique
  3. ** Prérequis: Aucun
  4. ** Utilisation du module utilitaire et graphique
  5. ** Présente:
  6. ** - Création et gestion d'une fenêtre (Traitement des évènements clavier/souris)
  7. ** - Gestion du clavier (Récupération de l'état d'une touche)
  8. ** - Des outils pour afficher une scène basique via le chargement d'un modèle (et son affichage)
  9. ** - Éclairage directionnel
  10. ** - Gestion d'une caméra free-fly (Avec déplacement fluide)
  11. ** - Gestion basique d'une horloge
  12. */
  13.  
  14. #include <Nazara/Core.hpp> // Horloges
  15. #include <Nazara/Core/Clock.hpp> // Horloges
  16. #include <Nazara/Graphics.hpp> // Module graphique
  17. #include <Nazara/Renderer.hpp> // Module de rendu
  18. #include <Nazara/Utility.hpp> // Module utilitaire
  19. #include <iostream>
  20.  
  21. // Petite fonction permettant de rendre le déplacement de la caméra moins ridige
  22. NzVector3f DampedString(const NzVector3f& currentPos, const NzVector3f& targetPos, float frametime, float springStrength = 3.f);
  23.  
  24. int main()
  25. {
  26.     // Pour commencer, nous initialisons le module Graphique, celui-ci va provoquer l'initialisation (dans l'ordre),
  27.     // du noyau (Core), Utility, Renderer.
  28.     // NzInitializer est une classe RAII appelant Initialize dans son constructeur et Uninitialize dans son destructeur.
  29.     // Autrement dit, une fois ceci fait nous n'avons plus à nous soucier de la libération du moteur.
  30.     NzInitializer<NzGraphics> nazara;
  31.     if (!nazara)
  32.     {
  33.         // Une erreur s'est produite dans l'initialisation d'un des modules
  34.         std::cout << "Failed to initialize Nazara, see NazaraLog.log for further informations" << std::endl;
  35.         std::getchar(); // On laise le temps de voir l'erreur
  36.  
  37.         return EXIT_FAILURE;
  38.     }
  39.  
  40.  
  41.     NzVideoMode mode = NzVideoMode::GetDesktopMode();
  42.     mode.width *= 3.f/4.f;
  43.     mode.height *= 3.f/4.f;
  44.  
  45.     NzString windowTitle = "Nazara Demo - 2D example";
  46.     nzWindowStyleFlags style = nzWindowStyle_Default;
  47.  
  48.     NzRenderTargetParameters parameters;
  49.     parameters.antialiasingLevel = 4;
  50.  
  51.     NzRenderWindow window(mode, windowTitle, style, parameters);
  52.     if (!window.IsValid())
  53.     {
  54.         std::cout << "Failed to create render window" << std::endl;
  55.         std::getchar();
  56.  
  57.         return EXIT_FAILURE;
  58.     }
  59.  
  60.     NzView view(NzVector2f(800.f, 600.f));
  61.     view.SetTarget(window);
  62.  
  63.     NzScene scene;
  64.     scene.SetViewer(view);
  65.  
  66.     NzSprite* sprite = scene.CreateNode<NzSprite>();
  67.  
  68.     NzMaterialRef mat = NzMaterial::New();
  69.     mat->Enable(nzRendererParameter_Blend, true);
  70.     mat->Enable(nzRendererParameter_DepthWrite, false);
  71.     mat->SetDstBlend(nzBlendFunc_InvSrcAlpha);
  72.     mat->SetSrcBlend(nzBlendFunc_SrcAlpha);
  73.     mat->SetDiffuseMap(NzTextureManager::Get("E:\\NazaraEngine\\Logo.png"));
  74.  
  75.     sprite->SetMaterial(mat);
  76.  
  77.     unsigned int fps = 0;
  78.     NzClock secondClock;
  79.     while (window.IsOpen())
  80.     {
  81.         // Ensuite nous allons traiter les évènements (Étape indispensable pour la fenêtre)
  82.         NzEvent event;
  83.         while (window.PollEvent(&event))
  84.         {
  85.             switch (event.type)
  86.             {
  87.                 case nzEventType_Quit: // L'utilisateur a cliqué sur la croix, ou l'OS veut terminer notre programme
  88.                     window.Close(); // On demande la fermeture de la fenêtre (Qui aura lieu au prochain tour de boucle)
  89.                     break;
  90.  
  91.                 case nzEventType_KeyPressed: // Une touche a été pressée !
  92.                     if (event.key.code == NzKeyboard::Key::Escape)
  93.                         window.Close();
  94.                     break;
  95.  
  96.                 default:
  97.                     break;
  98.             }
  99.         }
  100.  
  101.         // Rendu de la scène:
  102.         // On procède maintenant au rendu de la scène en elle-même, celui-ci se décompose en quatre étapes distinctes
  103.  
  104.         // Pour commencer, on met à jour la scène, ceci appelle la méthode Update de tous les SceneNode enregistrés
  105.         // pour la mise à jour globale (Scene::RegisterForUpdate)
  106.         scene.Update();
  107.  
  108.         // Ensuite il y a le calcul de visibilité, la scène se sert de la caméra active pour effectuer un test de visibilité
  109.         // afin de faire une liste des SceneNode visibles (Ex: Frustum culling)
  110.         scene.Cull();
  111.  
  112.         // Ensuite il y a la mise à jour des SceneNode enregistrés pour la mise à jour visible (Exemple: Terrain)
  113.         scene.UpdateVisible();
  114.  
  115.         // Pour terminer, il y a l'affichage en lui-même, de façon organisée et optimisée (Batching)
  116.         scene.Draw();
  117.  
  118.         // Après avoir dessiné sur la fenêtre, il faut s'assurer qu'elle affiche cela
  119.         // Cet appel ne fait rien d'autre qu'échanger les buffers de rendu (Double Buffering)
  120.         window.Display();
  121.  
  122.         // On incrémente le compteur de FPS improvisé
  123.         fps++;
  124.  
  125.         if (secondClock.GetMilliseconds() >= 1000) // Toutes les secondes
  126.         {
  127.             window.SetTitle(windowTitle + " - " + NzString::Number(fps) + " FPS");
  128.  
  129.             fps = 0;
  130.  
  131.             secondClock.Restart();
  132.         }
  133.     }
  134.  
  135.     return EXIT_SUCCESS;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement