SLProject  4.2.000
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
AppDemoSceneVideoTrackFace.cpp
Go to the documentation of this file.
1 /**
2  * \file AppDemoSceneVideoTrackFace.cpp
3  * \brief Implementation for an SLScene inherited class
4  * \details For more info about App framework and the scene assembly see:
5  * https://cpvrlab.github.io/SLProject4/app-framework.html
6  * \date May 2024
7  * \authors Marino von Wattenwyl
8  * \copyright http://opensource.org/licenses/GPL-3.0
9  * \remarks Please use clangformat to format the code. See more code style on
10  * https://github.com/cpvrlab/SLProject4/wiki/SLProject-Coding-Style
11  */
12 
14 #include <AppCommon.h>
15 #include <AppDemoSceneID.h>
16 #include <CVCapture.h>
17 #include <CVTrackedFaces.h>
18 #include <SLAssetLoader.h>
19 #include <SLLightSpot.h>
20 #include <SLBox.h>
21 #include <SLCoordAxis.h>
22 
23 // Global pointers declared in AppDemoVideo
25 extern CVTracked* gVideoTracker;
27 
28 //-----------------------------------------------------------------------------
30  : SLScene("Facial Feature Tracking"),
31  _sceneID(sid)
32 {
34  name("Track Face (main cam.)");
35  else
36  name("Track Face (scnd. cam.)");
37  info("Face and facial landmark detection.");
38 }
39 //-----------------------------------------------------------------------------
40 //! All assets the should be loaded in parallel must be registered in here.
42 {
45  "FBX/Sunglasses.fbx");
46 
47  // Create video texture on global pointer updated in AppDemoVideo
50  "LiveVideoError.png",
51  GL_LINEAR,
52  GL_LINEAR);
53 
54  // Create a face tracker
55  al.addLoadTask([]()
56  {
57  gVideoTracker = new CVTrackedFaces(AppCommon::calibIniPath + "haarcascade_frontalface_alt2.xml",
58  AppCommon::calibIniPath + "lbfmodel.yaml",
59  3);
60  gVideoTracker->drawDetection(true); });
61 }
62 //-----------------------------------------------------------------------------
63 //! After parallel loading of the assets the scene gets assembled in here.
65 {
66 #ifndef SL_EMSCRIPTEN
67  /*
68  The tracking of markers is done in AppDemoVideo::onUpdateVideo by calling
69  the specific CVTracked::track method. If a marker was found it overwrites
70  the linked nodes object matrix (SLNode::_om). If the linked node is the
71  active camera the found transform is additionally inversed.
72  This would be the standard augmented reality use case.
73  */
76  else
78 
79  SLCamera* cam1 = new SLCamera("Camera 1");
80  cam1->translation(0, 0, 0.5f);
81  cam1->clipNear(0.1f);
82  cam1->clipFar(1000.0f);
83  cam1->setInitialState();
86 
87  SLLightSpot* light1 = new SLLightSpot(am,
88  this,
89  10,
90  10,
91  10,
92  1);
93  light1->powers(1.0f, 1.0f, 1.0f);
94  light1->attenuation(1, 0, 0);
95 
96  // configure sunglasses
97  _glasses->scale(0.008f);
98  _glasses->translate(0, 1.5f, 0);
99 
100  // Add axis arrows at world center
101  SLNode* axis = new SLNode(new SLCoordAxis(am), "Axis Node");
102  axis->setDrawBitsRec(SL_DB_MESHWIRED, false);
103  axis->scale(0.03f);
104 
105  // Scene structure
106  SLNode* scene = new SLNode("Scene");
107  root3D(scene);
108  scene->addChild(light1);
109  scene->addChild(cam1);
110  scene->addChild(_glasses);
111  scene->addChild(axis);
112 
113  // The tracker moves the camera node
114  gVideoTrackedNode = cam1;
115 
116  sv->doWaitOnIdle(false); // for constant video feed
117  sv->camera(cam1);
118 #endif
119 }
120 //-----------------------------------------------------------------------------
The AppCommon class holds the top-level instances of the app-demo.
Definition of scene IDs in the demo app.
@ SID_VideoTrackFaceMain
SLNode * gVideoTrackedNode
SLGLTexture * gVideoTexture
CVTracked * gVideoTracker
Class declaration for an SLScene inherited class.
@ VT_SCND
Selfie camera on mobile devices.
Definition: CVCapture.h:43
@ VT_MAIN
Main camera on all on all all devices.
Definition: CVCapture.h:42
#define SL_DB_MESHWIRED
Draw polygons as wired mesh.
Definition: SLDrawBits.h:22
int SLSceneID
Scene identifier.
Definition: SLEnums.h:91
static SLDeviceRotation devRot
Mobile device rotation from IMU.
Definition: AppCommon.h:64
static SLstring calibIniPath
That's where data/calibrations folder is located.
Definition: AppCommon.h:108
static SLDeviceLocation devLoc
Mobile device location from GPS.
Definition: AppCommon.h:65
static SLstring modelPath
Path to 3D models.
Definition: AppCommon.h:85
static SLstring texturePath
Path to texture images.
Definition: AppCommon.h:86
void registerAssetsToLoad(SLAssetLoader &al) override
All scene specific assets have to be registered for async loading in here.
void assemble(SLAssetManager *am, SLSceneView *sv) override
After parallel loading of the assets the scene gets assembled in here.
void videoType(CVVideoType vt)
Setter for video type also sets the active calibration.
Definition: CVCapture.cpp:866
static CVCapture * instance()
Public static instance getter for singleton pattern.
Definition: CVCapture.h:65
OpenCV face & facial landmark tracker class derived from CVTracked.
CVTracked is the pure virtual base class for tracking features in video.
Definition: CVTracked.h:50
void drawDetection(bool draw)
Definition: CVTracked.h:60
void addLoadTask(SLAssetLoadTask task)
Add generic task.
void addTextureToLoad(SLGLTexture *&texture, const SLstring &path, SLint min_filter=GL_LINEAR_MIPMAP_LINEAR, SLint mag_filter=GL_LINEAR, SLTextureType type=TT_unknown, SLint wrapS=GL_REPEAT, SLint wrapT=GL_REPEAT)
Add 2D textures with internal image allocation.
void addNodeToLoad(SLNode *&node, const SLstring &modelPath, SLSkybox *skybox=nullptr, SLbool deleteTexImgAfterBuild=false, SLbool loadMeshesOnly=true, SLMaterial *overrideMat=nullptr, float ambientFactor=0.5f, SLbool forceCookTorranceRM=false, SLuint flags=SLProcess_Triangulate|SLProcess_JoinIdenticalVertices|SLProcess_RemoveRedundantMaterials|SLProcess_FindDegenerates|SLProcess_FindInvalidData|SLProcess_SplitLargeMeshes)
Add mesh from file to load via assimp loader.
Toplevel holder of the assets meshes, materials, textures and shaders.
void texture(SLGLTexture *backgroundTexture, bool fixAspectRatio=false)
If flag _repeatBlurred is true the texture is not distorted if its size does not fit to screen aspect...
Active or visible camera node class.
Definition: SLCamera.h:54
void clipFar(const SLfloat cFar)
Definition: SLCamera.h:109
void clipNear(const SLfloat cNear)
Definition: SLCamera.h:108
void devRotLoc(SLDeviceRotation *devRot, SLDeviceLocation *devLoc)
Definition: SLCamera.h:120
SLBackground & background()
Definition: SLCamera.h:165
Axis aligned coordinate axis mesh.
Definition: SLCoordAxis.h:31
Texture object for OpenGL texturing.
Definition: SLGLTexture.h:110
void attenuation(const SLfloat kConstant, const SLfloat kLinear, const SLfloat kQuadratic)
Definition: SLLight.h:116
void powers(SLfloat ambiPow, SLfloat diffPow, SLfloat specPow, const SLCol4f &ambiDiffSpecCol=SLCol4f::WHITE)
Sets the ambient, diffuse and specular powers all with the same color.
Definition: SLLight.h:74
SLLightSpot class for a spot light source.
Definition: SLLightSpot.h:36
SLNode represents a node in a hierarchical scene graph.
Definition: SLNode.h:147
void addChild(SLNode *child)
Definition: SLNode.cpp:207
void translation(const SLVec3f &pos, SLTransformSpace relativeTo=TS_parent)
Definition: SLNode.cpp:828
void scale(SLfloat s)
Definition: SLNode.h:640
void setInitialState()
Definition: SLNode.cpp:1084
void setDrawBitsRec(SLuint bit, SLbool state)
Definition: SLNode.cpp:804
void translate(const SLVec3f &vec, SLTransformSpace relativeTo=TS_object)
Definition: SLNode.cpp:906
const SLstring & name() const
Definition: SLObject.h:38
The SLScene class represents the top level instance holding the scene structure.
Definition: SLScene.h:47
SLNode * root3D()
Definition: SLScene.h:99
friend class SLNode
Definition: SLScene.h:48
SLstring & info()
Definition: SLScene.h:102
SceneView class represents a dynamic real time 3D view onto the scene.
Definition: SLSceneView.h:69
void camera(SLCamera *camera)
Definition: SLSceneView.h:145
void doWaitOnIdle(SLbool doWI)
Definition: SLSceneView.h:149