SLProject  4.2.000
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
AppDemoMain.cpp
Go to the documentation of this file.
1 /**
2  * \file AppDemoMain.cpp
3  * \brief This file has the main function of the demo app of SLProject
4  * \details An App::Config is set and then passed to the run function defined
5  * App.h. Beside this is contains the callback functions for the
6  * scene creation. See App.h for their typedef.
7  * For more info on how to create a new app with SLProject see:
8  * https://github.com/cpvrlab/SLProject4/wiki/Creating-a-New-App
9  * For more info about App framework see:
10  * https://cpvrlab.github.io/SLProject4/app-framework.html
11  * \authors Marcus Hudritsch, Marino von Wattenwyl
12  * \date July 2024
13  * \copyright http://opensource.org/licenses/GPL-3.0
14  * \remarks Please use clangformat to format the code. See more code style on
15  * https://github.com/cpvrlab/SLProject4/wiki/SLProject-Coding-Style
16  */
17 
18 #include <App.h>
19 #include <AppCommon.h>
20 #include <AppDemoGui.h>
21 #include <AppDemoSceneView.h>
22 #include <AppDemoSceneID.h>
23 
24 #include <SLGLState.h>
25 #include <SLEnums.h>
26 #include <CVCapture.h>
27 
29 #include <AppDemoSceneAnimNode.h>
35 #include <AppDemoSceneEmpty.h>
43 #include <AppDemoSceneFigure.h>
44 #include <AppDemoSceneFrustum.h>
45 #include <AppDemoSceneGLTF.h>
47 #include <AppDemoSceneMeshLoad.h>
48 #include <AppDemoSceneMinimal.h>
49 #include <AppDemoSceneLargeModel.h>
60 #include <AppDemoSceneRevolver.h>
61 #include <AppDemoSceneRTDoF.h>
63 #include <AppDemoSceneRTLens.h>
64 #include <AppDemoSceneRTSpheres.h>
65 #include <AppDemoSceneRobot.h>
66 #include <AppDemoSceneSuzanne.h>
68 #include <AppDemoSceneShaderBump.h>
69 #include <AppDemoSceneShaderCook.h>
71 #include <AppDemoSceneShaderIBL.h>
74 #include <AppDemoSceneShaderWave.h>
93 #include <AppDemoSceneZFighting.h>
94 
95 #ifdef SL_BUILD_WAI
96 # include <CVTrackedWAI.h>
97 #else
98 # include <CVTracked.h>
99 #endif
100 
101 //-----------------------------------------------------------------------------
102 // Global pointers and functions declared in AppDemoVideo
103 extern SLGLTexture* gVideoTexture;
104 extern CVTracked* gVideoTracker;
105 extern SLNode* gVideoTrackedNode;
106 bool onUpdateVideo();
107 
108 //-----------------------------------------------------------------------------
110  int curDPI,
111  SLInputManager& inputManager)
112 {
113  // The sceneview will be deleted by SLScene::~SLScene()
114  return new AppDemoSceneView(scene, curDPI, inputManager);
115 }
116 //-----------------------------------------------------------------------------
118 {
119  switch (sceneID)
120  {
121  case SID_Empty: return new AppDemoSceneEmpty();
122  case SID_Figure: return new AppDemoSceneFigure();
123  case SID_Minimal: return new AppDemoSceneMinimal();
124  case SID_MeshLoad: return new AppDemoSceneMeshLoad();
125  case SID_Revolver: return new AppDemoSceneRevolver();
126  case SID_TextureBlend: return new AppDemoSceneTextureBlend();
127  case SID_TextureFilter: return new AppDemoSceneTextureFilter();
128 #ifdef SL_BUILD_WITH_KTX
130 #endif
131  case SID_FrustumCull: return new AppDemoSceneFrustum();
132  case SID_2Dand3DText: return new AppDemoScene2Dand3DText();
133  case SID_PointClouds: return new AppDemoScenePointClouds();
134  case SID_ZFighting: return new AppDemoSceneZFighting();
135  case SID_ShaderPerVertexBlinn: return new AppDemoSceneShaderBlinn("Per Vertex Blinn-Phong Lighting", true);
136  case SID_ShaderPerPixelBlinn: return new AppDemoSceneShaderBlinn("Per Pixel Blinn-Phong Lighting", false);
138  case SID_ShaderIBL: return new AppDemoSceneShaderIBL();
139  case SID_ShaderWave: return new AppDemoSceneShaderWave();
140  case SID_ShaderBumpNormal: return new AppDemoSceneShaderBump();
142  case SID_ShaderSkybox: return new AppDemoSceneShaderSkybox();
143  case SID_ShaderEarth: return new AppDemoSceneShaderEarth();
149  case SID_SuzannePerPixBlinn: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and reflection colors", false, false, false, false, false);
150  case SID_SuzannePerPixBlinnTm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and texture mapping", true, false, false, false, false);
151  case SID_SuzannePerPixBlinnNm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and normal mapping", false, true, false, false, false);
152  case SID_SuzannePerPixBlinnAo: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and ambient occlusion", false, false, true, false, false);
153  case SID_SuzannePerPixBlinnSm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and shadow mapping", false, false, false, true, false);
154  case SID_SuzannePerPixBlinnTmNm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting, texture and normal mapping", true, true, false, false, false);
155  case SID_SuzannePerPixBlinnTmAo: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting, texture mapping and ambient occlusion", true, false, true, false, false);
156  case SID_SuzannePerPixBlinnNmAo: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting, normal mapping and ambient occlusion", false, true, true, false, false);
157  case SID_SuzannePerPixBlinnTmSm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting, texture mapping and shadow mapping", true, false, false, true, false);
158  case SID_SuzannePerPixBlinnNmSm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting, normal mapping and shadow mapping", false, true, false, true, false);
159  case SID_SuzannePerPixBlinnAoSm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting, ambient occlusion and shadow mapping", false, false, true, true, false);
160  case SID_SuzannePerPixBlinnTmNmAo: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and diffuse, normal, ambient occlusion and shadow mapping", true, true, true, false, false);
161  case SID_SuzannePerPixBlinnTmNmSm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and diffuse, normal and shadow mapping ", true, true, false, true, false);
162  case SID_SuzannePerPixBlinnTmNmAoSm: return new AppDemoSceneSuzanne("Suzanne with per pixel Blinn-Phong lighting and diffuse, normal, ambient occlusion and shadow mapping", true, true, true, true, false);
163  case SID_SuzannePerPixCookTmNmAoSmEm: return new AppDemoSceneSuzanne("Suzanne with per pixel Cook-Torrance lighting and diffuse, normal, ambient occlusion, shadow and environment mapping", true, true, true, true, true);
166  case SID_glTF_Sponza:
168  case SID_Robotics_FanucCRX_FK: return new AppDemoSceneRobot();
169  case SID_VolumeRayCast: return new AppDemoSceneVolumeRayCast();
171  case SID_AnimationNode: return new AppDemoSceneAnimNode();
187  case SID_VideoTrackWAI: return new AppDemoSceneVideoTrackWAI();
188  case SID_VideoSensorAR: return new AppDemoSceneVideoSensorAR();
197  case SID_RTSpheres:
200  case SID_RTDoF: return new AppDemoSceneRTDoF();
201  case SID_RTLens: return new AppDemoSceneRTLens();
216  default: SL_EXIT_MSG("appDemoSwitchScene: Unknown SceneID");
217  }
218 }
219 //-----------------------------------------------------------------------------
221 {
222  // Reset video and trackers
223  CVCapture::instance()->videoType(VT_NONE); // turn off any video
224  CVTracked::resetTimes(); // delete all gVideoTracker times
225  delete gVideoTracker; // delete the tracker deep
226  gVideoTracker = nullptr;
227  gVideoTexture = nullptr; // The video texture will be deleted by scene uninit
228  gVideoTrackedNode = nullptr; // The tracked node will be deleted by scene uninit
229 
230  // Clear gui stuff that depends on scene and sceneview
232 }
233 //-----------------------------------------------------------------------------
235 {
236  AppDemoGui::loadingString = "Loading ...";
237 }
238 //-----------------------------------------------------------------------------
240 {
241  AppDemoGui::loadingString = "Assembling ...";
242 }
243 //-----------------------------------------------------------------------------
245 {
246  if (CVCapture::instance()->videoType() != VT_NONE)
247  {
248  if (sv->viewportSameAsVideo())
249  {
250  // Pass a negative value to the start function, so that the
251  // viewport aspect ratio can be adapted later to the video aspect.
252  // This will be known after start.
253  CVCapture::instance()->start(-1.0f);
254  SLVec2i videoAspect;
255  videoAspect.x = CVCapture::instance()->captureSize.width;
256  videoAspect.y = CVCapture::instance()->captureSize.height;
257  sv->setViewportFromRatio(videoAspect,
258  sv->viewportAlign(),
259  true);
260  }
261  else
263  }
264 }
265 //-----------------------------------------------------------------------------
267 {
268  // If live video image is requested grab it and copy it
269  if (CVCapture::instance()->videoType() != VT_NONE)
270  {
271  float viewportWdivH = sv->viewportWdivH();
272  CVCapture::instance()->grabAndAdjustForSL(viewportWdivH);
273  }
274 
275  SLbool trackingGotUpdated = onUpdateVideo();
276  return trackingGotUpdated;
277 }
278 //-----------------------------------------------------------------------------
279 // The entry point of our application.
280 // On most platforms, SL_MAIN_FUNCTION is simply `main`.
281 // On Android though, there is no `main` function, so we emulate it by setting
282 // SL_MAIN_FUNCTION to `slAndroidMain`, which creates a "fake" main function.
283 // This `slAndroidMain` function is then called in the JNI initialization code
284 // to set up the application configuration.
285 int SL_MAIN_FUNCTION(int argc, char* argv[])
286 {
288  config.argc = argc;
289  config.argv = argv;
290  config.windowWidth = 1280;
291  config.windowHeight = 720;
292  config.windowTitle = "SLProject Test Application";
293  config.numSamples = 4;
294  config.startSceneID = SL_STARTSCENE;
305 
306  return App::run(config);
307 }
308 //-----------------------------------------------------------------------------
The App namespace declares the App::Config struct and the App::run function.
The AppCommon class holds the top-level instances of the app-demo.
C++ Header file for the class AppDemoGui.h.
static SLbool onUpdate(SLSceneView *sv)
int SL_MAIN_FUNCTION(int argc, char *argv[])
bool onUpdateVideo()
Implements the update per frame for video update and feature tracking.
static SLSceneView * createSceneView(SLScene *scene, int curDPI, SLInputManager &inputManager)
SLNode * gVideoTrackedNode
static void onBeforeSceneAssembly(SLSceneView *sv, SLScene *s)
static void onAfterSceneAssembly(SLSceneView *sv, SLScene *s)
SLGLTexture * gVideoTexture
static void onBeforeSceneDelete(SLSceneView *sv, SLScene *s)
static void onBeforeSceneLoad(SLSceneView *sv, SLScene *s)
CVTracked * gVideoTracker
static SLScene * createScene(SLSceneID sceneID)
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Definition of scene IDs in the demo app.
@ SID_SuzannePerPixBlinnNmSm
@ SID_Benchmark_SkinnedAnimations
@ SID_TextureBlend
@ SID_Minimal
@ SID_glTF_Sponza
@ SID_VideoTrackChessScnd
@ SID_ParticleSystem_Many
@ SID_SuzannePerPixBlinnTmAo
@ SID_VideoTrackMediaPipeHandsMain
@ SID_Benchmark_LargeModel
@ SID_SuzannePerPixBlinnTmSm
@ SID_SuzannePerPixBlinnAoSm
@ SID_ParticleSystem_ComplexFire
@ SID_ParticleSystem_RingOfFire
@ SID_ShaderSkybox
@ SID_RTSoftShadows
@ SID_Figure
@ SID_SuzannePerPixBlinnNm
@ SID_ShadowMappingSpotLights
@ SID_VideoTrackFaceScnd
@ SID_RTSpheres
@ SID_VideoSensorAR
@ SID_ErlebAR_BielBFH
@ SID_ErlebAR_BernChristoffel
@ SID_PointClouds
@ SID_ParticleSystem_DustStorm
@ SID_Revolver
@ SID_SuzannePerPixBlinnNmAo
@ SID_ShaderEarth
@ SID_VolumeRayCast
@ SID_VideoTextureLive
@ SID_AnimationNode
@ SID_ParticleSystem_Simple
@ SID_VideoCalibrateScnd
@ SID_Benchmark_JansUniverse
@ SID_Benchmark_ColumnsNoLOD
@ SID_MeshLoad
@ SID_ParticleSystem_Fountain
@ SID_SuzannePerPixBlinnSm
@ SID_ShadowMappingLightTypes
@ SID_AnimationSkinnedMass
@ SID_VideoTextureFile
@ SID_SuzannePerPixBlinnTmNmSm
@ SID_ShaderPerPixelBlinn
@ SID_ZFighting
@ SID_SuzannePerPixBlinnTm
@ SID_ErlebAR_AventicumAmphiteatre
@ SID_Empty
@ SID_Benchmark_NodeAnimations
@ SID_Benchmark_ColumnsLOD
@ SID_ShadowMappingCascaded
@ SID_SuzannePerPixBlinnTmNmAoSm
@ SID_SuzannePerPixCookTmNmAoSmEm
@ SID_ErlebAR_AventicumCigognier
@ SID_glTF_DamagedHelmet
@ SID_SuzannePerPixBlinn
@ SID_ShaderIBL
@ SID_ShadowMappingPointLights
@ SID_VideoTrackArucoMain
@ SID_glTF_FlightHelmet
@ SID_TextureFilter
@ SID_RTLens
@ SID_Benchmark_ParticleSystemComplexFire
@ SID_Benchmark_LotsOfNodes
@ SID_VideoTrackArucoScnd
@ SID_SuzannePerPixBlinnTmNmAo
@ SID_VideoTrackFeature2DMain
@ SID_ParticleSystem_Sun
@ SID_VolumeRayCastLighted
@ SID_ErlebAR_AventicumTheatre
@ SID_ShadowMappingBasicScene
@ SID_2Dand3DText
@ SID_VideoTrackFaceMain
@ SID_VideoCalibrateMain
@ SID_VideoTrackChessMain
@ SID_ShaderBumpParallax
@ SID_ShaderPerPixelCook
@ SID_ShaderWave
@ SID_SuzannePerPixBlinnAo
@ SID_SuzannePerPixBlinnTmNm
@ SID_ErlebAR_AugustaRauricaTmpTht
@ SID_ErlebAR_SutzKirchrain18
@ SID_TextureCompression
@ SID_ShaderBumpNormal
@ SID_Robotics_FanucCRX_FK
@ SID_glTF_WaterBottle
@ SID_FrustumCull
@ SID_VideoTrackWAI
@ SID_ShaderPerVertexBlinn
@ SID_RTMuttenzerBox
@ SID_AnimationNodeMass
@ SID_AnimationSkinned
@ SID_RTDoF
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
Class declaration for an SLScene inherited class.
@ VT_NONE
No camera needed.
Definition: CVCapture.h:41
bool SLbool
Definition: SL.h:175
#define SL_EXIT_MSG(message)
Definition: SL.h:240
int SLSceneID
Scene identifier.
Definition: SLEnums.h:91
Singleton class for global render state.
SLScene SLSceneView SLint sceneID
Definition: SLScene.h:33
static void loadConfig(SLint dotsPerInch)
Loads the UI configuration.
static void saveConfig()
Stores the UI configuration.
static void build(SLScene *s, SLSceneView *sv)
This is the main building function for the GUI of the Demo apps.
Definition: AppDemoGui.cpp:229
static SLstring loadingString
String shown during loading screens.
Definition: AppDemoGui.h:78
static void clear()
Definition: AppDemoGui.cpp:218
Class for 2D and 3D text scene.
Class for node animation test scene.
Class for benchmark mass animation test scene.
Class for mass animation test scene.
Class for skinned animation test scene.
Class for skinned animation test scene.
Class for skinned animation test scene.
Class for ErlebAR model for Augusta Raurica Tempel & Theater.
Class for ErlebAR model for Aventicum Amphitheater.
Class for ErlebAR model for Aventicum Cigognier.
Class for ErlebAR model for Aventicum Theater.
Class for ErlebAR model Christoffel Tower in Bern.
Class for ErlebAR model in Biel at BFH.
Class for ErlebAR model in Sutz.
Class for the figure scene.
Class for frustum culling test scene.
Class for GLTF file loading demo scene.
Class for the benchmark scene for Jans Universe.
Class for large model scene.
Class for level of detail test scene.
Class for scene with lots of nodes.
Class for mesh loading demo scene.
Class for minimal scene.
Class for fire ring particle system scene.
Class for simple particle system scene.
Class for simple particle system scene.
Class for benchmark scene with a particle system with many particles.
Class for fire ring particle system scene.
Class for simple particle system scene.
Class for sun particle system scene.
Class for point cloud test scene.
Class for the depth of field ray tracing scene.
Class for the lens ray tracing scene.
Class for the Muttenzer Box ray tracing scene.
Class for the ray tracing scene with sphere group.
Class for revolver mesh scene.
Class for a robot arm test scene.
Class for demo scene with Blinn-Phong lighting per vertex or per pixel.
Class for normal map bump mapping.
Class for Cook-Torrance lighting demo scene.
Class for image base lighting demo scene.
Class for image base lighting demo scene.
Class for parallax bump mapping demo scene.
Class for image base lighting demo scene.
Class for per vertex wave shader.
Class for basic shadow mapping demo scene.
Class for demo scene for cascaded shadow mapping.
Class for demo scene for point light shadow mapping.
Class for demo scene for spotlight shadow mapping.
Class for demo scene with all shadow mapping types.
Class for all variants of generated shaders on the Suzanne head.
Class for texture blending scene.
Class for texture compression test scene.
Class for texture filtering scene.
Class for devices IMU and GPS Sensors test scene.
Class for live or file video on texture test scene.
Class for ARUCO marker tracking test scene.
Class for video for chessboard test scene.
Class for facial feature tracking test scene.
Class for feature tracking test scene.
Class for Mediapipe hand tracking test scene.
Class for Mediapipe hand tracking test scene.
Class for test scene for volume rendering of an angiographic MRI scan".
Class for test scene for lighted volume rendering of an angiographic MRI scan".
Class for z-fighting test scene.
CVSize captureSize
size of captured frame
Definition: CVCapture.h:123
void videoType(CVVideoType vt)
Setter for video type also sets the active calibration.
Definition: CVCapture.cpp:866
void start(float viewportWdivH)
starts the video capturing
Definition: CVCapture.cpp:174
static CVCapture * instance()
Public static instance getter for singleton pattern.
Definition: CVCapture.h:65
bool grabAndAdjustForSL(float viewportWdivH)
Definition: CVCapture.cpp:235
CVTracked is the pure virtual base class for tracking features in video.
Definition: CVTracked.h:50
static void resetTimes()
Resets all static variables.
Definition: CVTracked.cpp:31
Texture object for OpenGL texturing.
Definition: SLGLTexture.h:110
SLInputManager. manages system input and custom input devices.
SLNode represents a node in a hierarchical scene graph.
Definition: SLNode.h:147
The SLScene class represents the top level instance holding the scene structure.
Definition: SLScene.h:47
SceneView class represents a dynamic real time 3D view onto the scene.
Definition: SLSceneView.h:69
void viewportSameAsVideo(bool sameAsVideo)
Definition: SLSceneView.h:155
void setViewportFromRatio(const SLVec2i &vpRatio, SLViewportAlign vpAlignment, SLbool vpSameAsVideo)
Sets the viewport ratio and the viewport rectangle.
SLViewportAlign viewportAlign() const
Definition: SLSceneView.h:181
SLfloat viewportWdivH() const
Definition: SLSceneView.h:178
T y
Definition: SLVec2.h:30
T x
Definition: SLVec2.h:30
int run(Config config)
App::run implementation from App.h for the Emscripten platform.
Definition: AppAndroid.cpp:78
Config config
The configuration set in App::run.
Definition: AppAndroid.cpp:34
App configuration struct to be passed to the App::run function.
Definition: App.h:57
OnGuiLoadConfigCallback onGuiLoadConfig
Definition: App.h:73
OnAfterSceneAssemblyCallback onAfterSceneAssembly
Definition: App.h:70
SLSceneID startSceneID
Definition: App.h:64
SLint windowWidth
Definition: App.h:60
SLint windowHeight
Definition: App.h:61
OnNewSceneViewCallback onNewSceneView
Definition: App.h:65
OnUpdateCallback onUpdate
Definition: App.h:71
OnBeforeSceneAssemblyCallback onBeforeSceneAssembly
Definition: App.h:69
OnGuiSaveConfigCallback onGuiSaveConfig
Definition: App.h:74
OnNewSceneCallback onNewScene
Definition: App.h:66
SLint numSamples
Definition: App.h:63
OnGuiBuildCallback onGuiBuild
Definition: App.h:72
int argc
Definition: App.h:58
OnBeforeSceneLoadCallback onBeforeSceneLoad
Definition: App.h:68
OnBeforeSceneDeleteCallback onBeforeSceneDelete
Definition: App.h:67
char ** argv
Definition: App.h:59
SLstring windowTitle
Definition: App.h:62