Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ** FirstScene - Première scène graphique
- ** Prérequis: Aucun
- ** Utilisation du module utilitaire et graphique
- ** Présente:
- ** - Création et gestion d'une fenêtre (Traitement des évènements clavier/souris)
- ** - Gestion du clavier (Récupération de l'état d'une touche)
- ** - Des outils pour afficher une scène basique via le chargement d'un modèle (et son affichage)
- ** - Éclairage directionnel
- ** - Gestion d'une caméra free-fly (Avec déplacement fluide)
- ** - Gestion basique d'une horloge
- */
- #include <Nazara/Core.hpp> // Horloges
- #include <Nazara/Core/Clock.hpp> // Horloges
- #include <Nazara/Graphics.hpp> // Module graphique
- #include <Nazara/Renderer.hpp> // Module de rendu
- #include <Nazara/Utility.hpp> // Module utilitaire
- #include <iostream>
- // Petite fonction permettant de rendre le déplacement de la caméra moins ridige
- NzVector3f DampedString(const NzVector3f& currentPos, const NzVector3f& targetPos, float frametime, float springStrength = 3.f);
- int main()
- {
- // Pour commencer, nous initialisons le module Graphique, celui-ci va provoquer l'initialisation (dans l'ordre),
- // du noyau (Core), Utility, Renderer.
- // NzInitializer est une classe RAII appelant Initialize dans son constructeur et Uninitialize dans son destructeur.
- // Autrement dit, une fois ceci fait nous n'avons plus à nous soucier de la libération du moteur.
- NzInitializer<NzGraphics> nazara;
- if (!nazara)
- {
- // Une erreur s'est produite dans l'initialisation d'un des modules
- std::cout << "Failed to initialize Nazara, see NazaraLog.log for further informations" << std::endl;
- std::getchar(); // On laise le temps de voir l'erreur
- return EXIT_FAILURE;
- }
- NzVideoMode mode = NzVideoMode::GetDesktopMode();
- mode.width *= 3.f/4.f;
- mode.height *= 3.f/4.f;
- NzString windowTitle = "Nazara Demo - 2D example";
- nzWindowStyleFlags style = nzWindowStyle_Default;
- NzRenderTargetParameters parameters;
- parameters.antialiasingLevel = 4;
- NzRenderWindow window(mode, windowTitle, style, parameters);
- if (!window.IsValid())
- {
- std::cout << "Failed to create render window" << std::endl;
- std::getchar();
- return EXIT_FAILURE;
- }
- NzView view(NzVector2f(800.f, 600.f));
- view.SetTarget(window);
- NzScene scene;
- scene.SetViewer(view);
- NzSprite* sprite = scene.CreateNode<NzSprite>();
- NzMaterialRef mat = NzMaterial::New();
- mat->Enable(nzRendererParameter_Blend, true);
- mat->Enable(nzRendererParameter_DepthWrite, false);
- mat->SetDstBlend(nzBlendFunc_InvSrcAlpha);
- mat->SetSrcBlend(nzBlendFunc_SrcAlpha);
- mat->SetDiffuseMap(NzTextureManager::Get("E:\\NazaraEngine\\Logo.png"));
- sprite->SetMaterial(mat);
- unsigned int fps = 0;
- NzClock secondClock;
- while (window.IsOpen())
- {
- // Ensuite nous allons traiter les évènements (Étape indispensable pour la fenêtre)
- NzEvent event;
- while (window.PollEvent(&event))
- {
- switch (event.type)
- {
- case nzEventType_Quit: // L'utilisateur a cliqué sur la croix, ou l'OS veut terminer notre programme
- window.Close(); // On demande la fermeture de la fenêtre (Qui aura lieu au prochain tour de boucle)
- break;
- case nzEventType_KeyPressed: // Une touche a été pressée !
- if (event.key.code == NzKeyboard::Key::Escape)
- window.Close();
- break;
- default:
- break;
- }
- }
- // Rendu de la scène:
- // On procède maintenant au rendu de la scène en elle-même, celui-ci se décompose en quatre étapes distinctes
- // Pour commencer, on met à jour la scène, ceci appelle la méthode Update de tous les SceneNode enregistrés
- // pour la mise à jour globale (Scene::RegisterForUpdate)
- scene.Update();
- // Ensuite il y a le calcul de visibilité, la scène se sert de la caméra active pour effectuer un test de visibilité
- // afin de faire une liste des SceneNode visibles (Ex: Frustum culling)
- scene.Cull();
- // Ensuite il y a la mise à jour des SceneNode enregistrés pour la mise à jour visible (Exemple: Terrain)
- scene.UpdateVisible();
- // Pour terminer, il y a l'affichage en lui-même, de façon organisée et optimisée (Batching)
- scene.Draw();
- // Après avoir dessiné sur la fenêtre, il faut s'assurer qu'elle affiche cela
- // Cet appel ne fait rien d'autre qu'échanger les buffers de rendu (Double Buffering)
- window.Display();
- // On incrémente le compteur de FPS improvisé
- fps++;
- if (secondClock.GetMilliseconds() >= 1000) // Toutes les secondes
- {
- window.SetTitle(windowTitle + " - " + NzString::Number(fps) + " FPS");
- fps = 0;
- secondClock.Restart();
- }
- }
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement