-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGraphicsEngine.h
More file actions
206 lines (180 loc) · 6.57 KB
/
Copy pathGraphicsEngine.h
File metadata and controls
206 lines (180 loc) · 6.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//
// Graphics Engine - Complete header for main application files
// Use this in main.cpp and demo files that need to set up and run the engine
// For user-written scripts (MonoBehaviour), use EngineAPI.h instead
//
#ifndef GRAPHICS_ENGINE_H
#define GRAPHICS_ENGINE_H
#include <functional>
// Core components
#include "Engine/Core/Components/component.h"
#include "Engine/Core/Components/behaviour.h"
#include "Engine/Core/Components/monoBehaviour.h"
#include "Engine/Core/Components/transformComponent.h"
#include "Engine/Core/Components/cameraComponent.h"
#include "Engine/Core/Components/meshFilter.h"
#include "Engine/Core/Components/meshRenderer.h"
#include "Engine/Core/gameObject.h"
#include "Engine/Core/scene.h"
#include "Engine/Core/Systems/sceneSerializer.h"
#include "Engine/Core/gameEngine.h"
#include "Engine/Core/Systems/input.h"
// Math
#include "Engine/Math/vec2.h"
#include "Engine/Math/vec3.h"
#include "Engine/Math/mat4.h"
// Rendering
#include "Engine/Rendering/color.h"
#include "Engine/Rendering/Primitives/mesh.h"
#include "Engine/Rendering/camera.h"
#include "Engine/Rendering/light.h"
#include "Engine/Rendering/Core/framebuffer.h"
#include "Engine/Rendering/texture.h"
#include "Engine/Rendering/Loaders/textureLoader.h"
#include "Engine/Rendering/Materials/material.h"
#include "Engine/Rendering/Materials/builtin_materials.h"
#include "Engine/Rendering/Materials/materialSerializer.h"
#include "Engine/Rendering/Loaders/modelLoader.h"
#include "Engine/Rendering/Core/rasterizer.h"
#include "Engine/Rendering/Core/window.h"
#include "Engine/Rendering/Core/opengl_window.h"
#include "Engine/Rendering/Core/opengl_renderer.h"
#include "Engine/Rendering/Shaders/shader.h"
#include "Engine/Rendering/Shaders/default_shaders.h"
/**
* @namespace Engine
* @brief Simplified engine API for users
*
* Provides high-level functions to run the engine without manual setup.
*/
namespace Engine
{
/**
* @brief Run the engine with a scene
* @param scene Scene to run
* @param targetFPS Target frames per second (0 = unlimited)
*
* This handles the entire engine loop:
* - Initializes renderer
* - Calls awake/start on all components
* - Runs update loop
* - Handles cleanup
*
* Example:
* @code
* Scene scene;
* auto player = scene.createGameObject("Player");
* player->addComponent<PlayerController>();
*
* Engine::run(scene);
* @endcode
*/
inline void run(Scene& scene, int targetFPS = 60)
{
GameEngine engine;
// Note: GameEngine doesn't have setTargetFPS yet, handled internally
engine.setActiveScene(&scene);
engine.run();
}
/**
* @brief Run with OpenGL hardware rendering
* @param scene Scene to run
* @param width Window width
* @param height Window height
* @param title Window title
* @param targetFPS Target FPS (0 = unlimited)
*/
inline void runOpenGL(Scene& scene, int width = 1280, int height = 720,
const std::string& title = "Graphics Engine", int targetFPS = 60)
{
OpenGLWindow window(width, height, title);
if (!window.isOpen) {
std::cerr << "Failed to create OpenGL window!" << std::endl;
return;
}
OpenGLRenderer renderer;
if (!renderer.initialize()) {
std::cerr << "Failed to initialize renderer!" << std::endl;
return;
}
// Call scene's OpenGL ready callback after context is created
scene._invokeOpenGLReady();
// Call awake/start on all components
scene.awake();
scene.start();
// Main loop
Uint32 lastTime = SDL_GetTicks();
int frameCount = 0;
float fpsTimer = 0.0f;
while (window.isOpen) {
Uint32 currentTime = SDL_GetTicks();
float deltaTime = (currentTime - lastTime) / 1000.0f;
lastTime = currentTime;
// Limit frame rate
if (targetFPS > 0) {
float targetDelta = 1.0f / targetFPS;
if (deltaTime < targetDelta) {
SDL_Delay((Uint32)((targetDelta - deltaTime) * 1000));
deltaTime = targetDelta;
}
}
// Poll events FIRST (SDL needs this for keyboard state)
if (!window.pollEvents()) break;
// Update input AFTER polling events
Input::getInstance().update();
// Update scene
scene.update(deltaTime);
scene.lateUpdate(deltaTime);
// Render
renderer.clear(0.1f, 0.1f, 0.15f);
// Find main camera
Camera* camera = nullptr;
for (auto* obj : scene.getAllGameObjects()) {
if (auto* camComp = obj->getComponent<CameraComponent>()) {
camera = camComp->getCamera();
break;
}
}
if (!camera) {
// No camera found, skip rendering
window.swapBuffers();
continue;
}
// Collect lights (TODO: LightComponent)
std::vector<Light> lights;
lights.push_back(Light::directional(vec3(-1, -1, -1), color(1, 1, 1), 0.8f));
// Render all mesh objects
for (auto* obj : scene.getAllGameObjects()) {
auto meshRenderer = obj->getComponent<MeshRenderer>();
auto meshFilter = obj->getComponent<MeshFilter>();
if (meshRenderer && meshFilter && meshRenderer->canRender()) {
mat4 transform = obj->transform.getModelMatrix();
if (camera) {
renderer.drawMesh(
*meshFilter->getMeshPtr(),
meshRenderer->getMaterialPtr(),
transform,
*camera,
lights
);
}
}
}
window.swapBuffers();
// FPS counter
frameCount++;
fpsTimer += deltaTime;
if (fpsTimer >= 1.0f) {
float currentFPS = frameCount / fpsTimer;
std::string newTitle = title + " (" + std::to_string((int)currentFPS) + " FPS)";
window.setTitle(newTitle);
frameCount = 0;
fpsTimer = 0.0f;
}
}
// Cleanup
// Note: Scene cleanup is automatic via destructors
renderer.cleanup();
}
}
#endif //GRAPHICS_ENGINE_H