SLProject  4.2.000
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
AppDemoSceneRobot.cpp
Go to the documentation of this file.
1 /**
2  * \file AppDemoSceneRobot.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 Marcus Hudritsch, 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 
13 #include <AppDemoSceneRobot.h>
14 #include <SLAssetLoader.h>
15 #include <SLLightDirect.h>
16 #include <SLRectangle.h>
17 #include <AppCommon.h>
18 
19 //-----------------------------------------------------------------------------
21  : SLScene("GLTF File Demo Scene")
22 {
23  info("Fanuc-CRX Robot with forward kinematic movement.");
24 }
25 //-----------------------------------------------------------------------------
26 //! All assets the should be loaded in parallel must be registered in here.
28 {
31  "GLTF/FanucCRX/Fanuc-CRX.gltf");
32 }
33 //-----------------------------------------------------------------------------
34 //! After parallel loading of the assets the scene gets assembled in here.
36 {
37  // Create a scene group node
38  SLNode* scene = new SLNode("scene node");
39  this->root3D(scene);
40 
41  // Create camera and initialize its parameters
42  SLCamera* cam1 = new SLCamera("Camera 1");
43  cam1->translation(0, 0.5f, 2.0f);
44  cam1->lookAt(0, 0.5f, 0);
45  cam1->background().colors(SLCol4f(0.7f, 0.7f, 0.7f),
46  SLCol4f(0.2f, 0.2f, 0.2f));
47  cam1->focalDist(2);
48  cam1->setInitialState();
49  scene->addChild(cam1);
50 
51  // Define directional
52  SLLightDirect* light1 = new SLLightDirect(am,
53  this,
54  2,
55  2,
56  2,
57  0.2f,
58  0.6f,
59  0.8f,
60  1);
61  light1->lookAt(0, 0, 0);
62  light1->attenuation(1, 0, 0);
63  light1->createsShadows(true);
64  light1->createShadowMap(1,
65  7,
66  SLVec2f(5, 5),
67  SLVec2i(2048, 2048));
68  light1->doSmoothShadows(true);
69  light1->castsShadows(false);
70  scene->addChild(light1);
71 
72  SLMaterial* matFloor = new SLMaterial(am,
73  "matFloor",
74  SLCol4f::WHITE * 0.5f);
75  matFloor->ambient(SLCol4f::WHITE * 0.3f);
76  SLMesh* rectangle = new SLRectangle(am,
77  SLVec2f(-2, -2),
78  SLVec2f(2, 2),
79  1,
80  1,
81  "rectangle",
82  matFloor);
83  SLNode* floorRect = new SLNode(rectangle);
84  floorRect->rotate(90, -1, 0, 0);
85  scene->addChild(floorRect);
86 
87  // Set missing specular color
89  true);
90 
91  SLNode* crx_j1 = _robot->findChild<SLNode>("crx_j1");
92  SLNode* crx_j2 = _robot->findChild<SLNode>("crx_j2");
93  SLNode* crx_j3 = _robot->findChild<SLNode>("crx_j3");
94  SLNode* crx_j4 = _robot->findChild<SLNode>("crx_j4");
95  SLNode* crx_j5 = _robot->findChild<SLNode>("crx_j5");
96  SLNode* crx_j6 = _robot->findChild<SLNode>("crx_j6");
97 
98  SLfloat angleDEG = 45;
99  SLfloat durationSEC = 3.0f;
100 
101  SLAnimation* j1Anim = animManager().createNodeAnimation("j1Anim",
102  durationSEC,
103  true,
106  j1Anim->createNodeAnimTrackForRotation3(crx_j1,
107  -angleDEG,
108  0,
109  angleDEG,
110  crx_j1->axisYOS());
111 
112  SLAnimation* j2Anim = animManager().createNodeAnimation("j2Anim",
113  durationSEC,
114  true,
117  j2Anim->createNodeAnimTrackForRotation3(crx_j2,
118  -angleDEG,
119  0,
120  angleDEG,
121  -crx_j2->axisZOS());
122 
123  SLAnimation* j3Anim = animManager().createNodeAnimation("j3Anim",
124  durationSEC,
125  true,
128  j3Anim->createNodeAnimTrackForRotation3(crx_j3,
129  angleDEG,
130  0,
131  -angleDEG,
132  -crx_j3->axisZOS());
133 
134  SLAnimation* j4Anim = animManager().createNodeAnimation("j4Anim",
135  durationSEC,
136  true,
139  j4Anim->createNodeAnimTrackForRotation3(crx_j4,
140  -2 * angleDEG,
141  0,
142  2 * angleDEG,
143  crx_j4->axisXOS());
144 
145  SLAnimation* j5Anim = animManager().createNodeAnimation("j5Anim",
146  durationSEC,
147  true,
150  j5Anim->createNodeAnimTrackForRotation3(crx_j5,
151  -2 * angleDEG,
152  0,
153  2 * angleDEG,
154  -crx_j5->axisZOS());
155 
156  SLAnimation* j6Anim = animManager().createNodeAnimation("j6Anim",
157  durationSEC,
158  true,
161  j6Anim->createNodeAnimTrackForRotation3(crx_j6,
162  -2 * angleDEG,
163  0,
164  2 * angleDEG,
165  crx_j6->axisXOS());
166 
167  scene->addChild(_robot);
168 
169  sv->camera(cam1);
170  sv->doWaitOnIdle(true); // Saves energy
171 }
172 //-----------------------------------------------------------------------------
The AppCommon class holds the top-level instances of the app-demo.
Class declaration for an SLScene inherited class.
float SLfloat
Definition: SL.h:173
@ EC_inOutCubic
cubic easing in and then out
Definition: SLEnums.h:188
@ AL_pingPongLoop
loop forward and backwards
Definition: SLEnums.h:171
SLVec2< SLint > SLVec2i
Definition: SLVec2.h:140
SLVec2< SLfloat > SLVec2f
Definition: SLVec2.h:141
SLVec4< SLfloat > SLCol4f
Definition: SLVec4.h:237
static SLstring modelPath
Path to 3D models.
Definition: AppCommon.h:85
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.
SLAnimation * createNodeAnimation(SLfloat duration)
SLAnimation is the base container for all animation data.
Definition: SLAnimation.h:33
SLNodeAnimTrack * createNodeAnimTrackForRotation3(SLNode *target, SLfloat angleDeg0, SLfloat angleDeg1, SLfloat angleDeg2, const SLVec3f &axis)
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 colors(const SLCol4f &uniformColor)
Sets a uniform background color.
Active or visible camera node class.
Definition: SLCamera.h:54
void focalDist(const SLfloat f)
Definition: SLCamera.h:116
SLBackground & background()
Definition: SLCamera.h:165
SLLightDirect class for a directional light source.
Definition: SLLightDirect.h:40
void createShadowMap(float clipNear=0.1f, float clipFar=20.0f, SLVec2f size=SLVec2f(8, 8), SLVec2i texSize=SLVec2i(1024, 1024)) override
void createsShadows(SLbool createsShadows)
Definition: SLLight.cpp:98
void doSmoothShadows(SLbool doSS)
Definition: SLLight.h:126
void attenuation(const SLfloat kConstant, const SLfloat kLinear, const SLfloat kQuadratic)
Definition: SLLight.h:116
Defines a standard CG material with textures and a shader program.
Definition: SLMaterial.h:56
void specular(const SLCol4f &spec)
Definition: SLMaterial.h:173
void ambient(const SLCol4f &ambi)
Definition: SLMaterial.h:170
An SLMesh object is a triangulated mesh, drawn with one draw call.
Definition: SLMesh.h:134
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 rotate(const SLQuat4f &rot, SLTransformSpace relativeTo=TS_object)
Definition: SLNode.cpp:945
void castsShadows(SLbool castsShadows)
Definition: SLNode.h:282
T * findChild(const SLstring &name="", SLbool findRecursive=true)
Definition: SLNode.h:388
void setInitialState()
Definition: SLNode.cpp:1084
SLVec3f axisYOS() const
Definition: SLNode.h:513
void lookAt(SLfloat targetX, SLfloat targetY, SLfloat targetZ, SLfloat upX=0, SLfloat upY=1, SLfloat upZ=0, SLTransformSpace relativeTo=TS_world)
Definition: SLNode.h:652
void updateMeshMat(std::function< void(SLMaterial *m)> setMat, bool recursive)
Updates the mesh material recursively with a material lambda.
Definition: SLNode.cpp:1161
SLRectangle creates a rectangular mesh with a certain resolution.
Definition: SLRectangle.h:29
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
SLAnimManager & animManager()
Definition: SLScene.h:97
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
static SLVec4 WHITE
Definition: SLVec4.h:215