/* * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "game-model.h" #include "game-renderer.h" #include "game-scene.h" #include "game-texture.h" #include "fpp-game-tutorial-controller.h" #include using namespace Dali; namespace { const char* SCENE_URL = { DEMO_GAME_DIR "/scene.json"}; } /* This example creates 3D environment with first person camera control It contains following modules: GameScene - responsible for loading and managing the scene data, it wraps around window. Owns list of entities. Scene can be deserialised from json file ( see scene.json ) GameEntity - the renderable object that has also a transformation. It wraps DALi actors. GameModel - loads models ( '.mod' file format ) and wraps DALi Geometry object. 'mod' format is binary in order GameTexture - manages textures. Loads them, creates samplers and wraps DALi TextureSet GameRenderer - binds texture and model. It's created per entity. While renderer is always unique for entity, the texture and model may be reused GameCamera - Wraps the CameraActor. It provides not only that but also handles user input and implements first-person-perspective camera behavior. GameCamera uses Dali::Timer to provide per-frame ( or rather every 16ms ) update tick. .-----------. .---------------| GameScene |---------------. | '-----------' | | | | v | v .------------. .------------.|.------------. .------------. | GameEntity | | GameEntity |v| ... | | GameEntity | '------------' '------------' '------------' '------------' | v .--------------. | GameRenderer | '--------------' | <------'--------> .--------------. .--------------. | GameTexture | | GameModel | '--------------' '--------------' */ class GameController : public ConnectionTracker { public: GameController(Application& application) : mApplication(application) { // Connect to the Application's Init signal mApplication.InitSignal().Connect(this, &GameController::Create); } ~GameController() { } // The Init signal is received once (only) during the Application lifetime void Create(Application& application) { // Get a handle to the window mWindow = application.GetWindow(); mWindow.SetBackgroundColor(Color::BLACK); // Use 3D layer mWindow.GetRootLayer().SetProperty(Layer::Property::BEHAVIOR, Layer::LAYER_3D); // Load game scene mScene.Load(mWindow, SCENE_URL); // Display tutorial mTutorialController.DisplayTutorial(mWindow); // Connect OnKeyEvent signal mWindow.KeyEventSignal().Connect(this, &GameController::OnKeyEvent); } // Handle a quit key event void OnKeyEvent(const KeyEvent& event) { if(event.GetState() == KeyEvent::DOWN) { if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK)) { mApplication.Quit(); } } } private: Application& mApplication; GameScene mScene; Window mWindow; FppGameTutorialController mTutorialController; }; int DALI_EXPORT_API main(int argc, char** argv) { Application application = Application::New(&argc, &argv); GameController test(application); application.MainLoop(); return 0; }