sculpto
scene.cpp
Go to the documentation of this file.
1/*!****************************************************************//*!*
2 * \file scene.cpp
3 * \brief Scene class implementation module.
4 *
5 * \author Sabitov Kirill
6 * \date 02 July 2022
7 *********************************************************************/
8
9#include "sclpch.h"
10
11#include <entt.hpp>
12
13#include "scene.h"
14#include "scene_object.h"
18#include "core/events/events.h"
22#include "core/resources/mesh.h"
25
27{
28 event_dispatcher::AddEventListner<mouse_button_event>([&](mouse_button_event &Event) { CallUpdate(); return false; });
29 event_dispatcher::AddEventListner<mouse_wheel_event>([&](mouse_wheel_event &Event) { CallUpdate(); return false; });
30 event_dispatcher::AddEventListner<mouse_move_event>([&](mouse_move_event &Event) { CallUpdate(); return false; });
31 event_dispatcher::AddEventListner<keyboard_event>([&](keyboard_event &Event) { CallUpdate(); return false; });
32 event_dispatcher::AddEventListner<viewport_resize_event>([&](viewport_resize_event &Event)
33 {
34 if (Event.GetViewportId() == ViewportId)
35 ViewportWidth = Event.GetWidth(),
36 ViewportHeight = Event.GetHeight();
37 return false;
38 });
39}
40
42{
43}
44
45void scl::scene::CallUpdate()
46{
47 for (auto &&[entity, native_script] : Registry.view<native_script_component>().each())
48 {
49 // Initialize script component if it is not
50 if (!native_script.ObjectBehaviour)
51 {
52 native_script.ObjectBehaviour = native_script.Instanciate();
53 native_script.ObjectBehaviour->Object = scene_object { entity, this };
54 native_script.ObjectBehaviour->OnCreate();
55 }
56
57 // Call script update function if script is active
58 if (native_script.IsActive)
59 native_script.ObjectBehaviour->OnUpdate();
60 }
61}
62
64{
65 UpdateDelay += timer::GetDeltaTime();
66 if (UpdateDelay < 0.015) return;
67 UpdateDelay = 0;
68 CallUpdate();
69}
70
72{
73 // Set up scene primary camera
74 camera *primary_camera {};
75 for (auto &&[entity, camera] : Registry.view<camera_component>().each())
76 if (camera.IsPrimary) { primary_camera = &camera.Camera; break; }
77 if (primary_camera == nullptr) return;
78 if (primary_camera->GetViewportWidth() != ViewportWidth || primary_camera->GetViewportHeight() != ViewportHeight)
79 primary_camera->Resize(ViewportWidth, ViewportHeight);
80
81 renderer::StartPipeline(*primary_camera, EnviromentAmbient);
82 {
83 for (auto &&[entity, point_light, transform] : Registry.group<point_light_component>(entt::get<transform_component>).each())
85
86 for (auto &&[entity, directional_light, transform] : Registry.group<directional_light_component>(entt::get<transform_component>).each())
87 {
88 vec3 direction = transform.AnglesMatr.TransformVector(vec3 { 0, -1, 0 });
89 vec3 at = transform.Position + direction;
91 matr4::View(transform.Position, at, { 0, 1, 0 }) * directional_light.GetProjection(), directional_light.GetShadowMap());
92 }
93
94 for (auto &&[entity, spot_light, transform] : Registry.group<spot_light_component>(entt::get<transform_component>).each())
95 {
96 vec3 direction = transform.AnglesMatr.TransformVector(vec3 { 0, -1, 0 });
97 renderer::SubmitSpotLight(transform.Position, direction, spot_light.Color * spot_light.Strength,
99 }
100
101 for (auto &&[entity, mesh, transform] : Registry.group<mesh_component>(entt::get<transform_component>).each())
102 if (mesh.Mesh != nullptr) renderer::Submit(mesh, transform);
103 }
105}
106
108{
109 scene_object created_object { this->Registry.create(), this };
110 created_object.AddComponent<name_component>(Name == "" ? "Unnamed component" : Name);
111 return created_object;
112}
113
115{
116 for (auto &&[entity, name] : Registry.view<name_component>().each())
117 if (name.Name == Name) return scene_object { entity, this };
118 return this->CreateObject(Name);
119}
120
122{
123 return scene_object { SceneObjectHandle, this };
124}
125
127{
128 Registry.destroy(Object.Entity);
129 Object.Entity = entt::null;
130 Object.Scene = nullptr;
131}
Static hich-level renderer class implementation module. Implements objects rendering functions via re...
camera & Resize(int ViewportWidth, int ViewportHeight)
Definition: camera.cpp:183
static matr4 View(vec3< float > Location, vec3< float > At, vec3< float > Up)
Definition: matr4.h:391
Definition: mesh.h:31
static void StartPipeline(const camera &Camera, const vec3 &EnviromentAmbiente)
Definition: Renderer.cpp:174
static void Submit(const shared< mesh > &Mesh, const vec3 &Scale, const vec3 &Angles, const vec3 &Position)
Definition: Renderer.cpp:251
static void SubmitSpotLight(const vec3 &Position, const vec3 &Direction, const vec3 &Color, float InnerCutoffCos, float OuterCutoffCos, float Epsilon)
Definition: Renderer.cpp:238
static void SubmitPointLight(const vec3 &Position, const vec3 &Color, float Constant, float Linear, float Quadratic)
Definition: Renderer.cpp:210
static void EndPipeline()
Definition: Renderer.cpp:198
static void SubmitDirectionalLight(const vec3 &Direction, const vec3 &Color, bool IsShadows=false, const matr4 &ViewProjection={}, const shared< frame_buffer > &ShadowMap=nullptr)
Definition: Renderer.cpp:222
decltype(auto) AddComponent(Targs &&... Args)
Definition: scene_object.h:84
void Update()
Definition: scene.cpp:63
scene_object CreateObject(const std::string &Name="")
Definition: scene.cpp:107
~scene()
Definition: scene.cpp:41
void RemoveObject(scene_object &Object)
Definition: scene.cpp:126
void Render()
Definition: scene.cpp:71
scene_object GetSceneObject(scene_object_handle SceneObjectHandle)
Definition: scene.cpp:121
scene_object CreaetOrGetObject(const std::string &Name)
Definition: scene.cpp:114
static float GetDeltaTime()
Definition: timer.h:42
Application scene objects system components include module.
Events include module.
Mesh material class deinition module.
Mesh interfaces definition module. Mesh stores vertex and index buffer and implement their binding du...
entt::entity scene_object_handle
Definition: scene.h:23
Topology objects points array (useful for creation dummy rendering object) class declaration module.
Render bridge class implementation module. Static class for making calls to low-level render api,...
Scene class defintion module.
Application scene object class defintion module.
Application scene object behaviour class defintion module.
Sculpto library prehompiled header. Defines common definitions, includes commonly used modules.
Texture interface definition module.
Timer, calculating interframe deltatime and fps class implementation module.