From 11e640be23884b732bdd31f31d2949e769ebba7d Mon Sep 17 00:00:00 2001 From: Anselme Date: Wed, 23 Sep 2015 21:22:04 +0200 Subject: [PATCH 1/3] worked on engine --- .gitignore | 3 +- CMakeLists.txt | 23 +++++++++----- cameranode.cpp | 7 +++++ cameranode.h | 21 +++++++++++++ engine.cpp | 74 +++++++++++++++++++++++++++++++++++---------- engine.h | 50 ++++++++++++++++++++++-------- main.cpp | 13 +++----- resourcemanager.cpp | 17 +++++++++++ resourcemanager.h | 23 ++++++++++++++ scene.cpp | 39 ++++++++++++++++++++++-- scene.h | 41 +++++++++---------------- 11 files changed, 236 insertions(+), 75 deletions(-) create mode 100644 cameranode.cpp create mode 100644 cameranode.h create mode 100644 resourcemanager.cpp create mode 100644 resourcemanager.h diff --git a/.gitignore b/.gitignore index 567609b..2ce6cc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -build/ +build* +*.user \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 14ec372..1c285d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,12 @@ else(WIN32) set(SYSTEM_LIB_PATH "linux") endif(WIN32) -set(LIB_SRC_LIST engine.cpp scene.cpp) +set(LIB_SRC_LIST + engine.cpp + scene.cpp + resourcemanager.cpp + cameranode.cpp +) set(LIBRARY_NAME ${PROJECT_NAME}) set(EXECUTABLE_NAME "test${PROJECT_NAME}") @@ -24,7 +29,10 @@ add_executable(${EXECUTABLE_NAME} main.cpp) add_definitions(-std=c++11) include_directories( - ${INCLUDE_ROOT} + ${INCLUDE_ROOT} + ${INCLUDE_ROOT}/bullet + ${PROJECT_SOURCE_DIR}/../sparrowinput + ${PROJECT_SOURCE_DIR}/../sparrowrenderer ) find_library(SFML_LIBRARY_WINDOW @@ -43,7 +51,7 @@ find_library(SFML_LIBRARY_SYSTEM find_library(SPARROW_RENDERER_LIBRARY NAMES - sparrowrenderer + SparrowRenderer PATHS ${LIB_ROOT} ) @@ -81,11 +89,12 @@ target_link_libraries( ${SFML_LIBRARY_WINDOW} ${SFML_LIBRARY_SYSTEM} ${SPARROW_INPUT_LIBRARY} + ${SPARROW_RENDERER_LIBRARY} + ${BULLET_COLLISION_LIBRARY} + ${BULLET_DYNAMICS_LIBRARY} + ${LINEAR_MATH_LIBRARY} ) -# ${SPARROW_RENDERER_LIBRARY} -# ${BULLET_COLLISION_LIBRARY} -# ${}BULLET_DYNAMICS_LIBRARY -# ${LINEAR_MATH_LIBRARY} + target_link_libraries( ${EXECUTABLE_NAME} ${LIBRARY_NAME} diff --git a/cameranode.cpp b/cameranode.cpp new file mode 100644 index 0000000..86cfe4c --- /dev/null +++ b/cameranode.cpp @@ -0,0 +1,7 @@ +#include "cameranode.h" + +CameraNode::CameraNode() +{ + +} + diff --git a/cameranode.h b/cameranode.h new file mode 100644 index 0000000..7cf9ec4 --- /dev/null +++ b/cameranode.h @@ -0,0 +1,21 @@ +#ifndef CAMERANODE_H +#define CAMERANODE_H + +#include "scene.h" +#include "camera.h" + +class CameraNode : public SceneNode, public Camera +{ +public: + CameraNode(); + virtual void update(); + virtual glm::mat4 getProjectionMatrix(); + virtual glm::mat4 getViewMatrix(); + virtual void resize(int width, int height); + +signals: + +public slots: +}; + +#endif // CAMERANODE_H diff --git a/engine.cpp b/engine.cpp index 42faa3a..d4d456d 100644 --- a/engine.cpp +++ b/engine.cpp @@ -1,33 +1,75 @@ - #include "engine.h" -#include "scenemanager.h" +#include +#include +#include +#include +#include +#include +#include "resourcemanager.h" +#include "scene.h" -//#include "bullet/btBulletCollisionCommon.h" -//#include "bullet/btBulletDynamicsCommon.h" - -Engine::Engine(Input* input): m_input(input) +Engine::Engine() : + m_input(NULL), + m_window(NULL) { - m_clock.restart(); + m_clock = new sf::Clock(); + m_clock->restart(); + m_renderer = new SparrowRenderer(); + m_renderer->setCamera(NULL); // TODO +} + +void Engine::createWindow(std::string title, + unsigned int w, + unsigned int h, + bool isWindowed) +{ + m_window = new sf::Window(sf::VideoMode(w, h), + title, + isWindowed ? sf::Style::Default : sf::Style::Fullscreen, + sf::ContextSettings(24)); + m_window->setFramerateLimit(60); + m_input = new Input(m_window); + m_renderer->initGL(w, h); +} + +void Engine::initPhysics() +{ + btDefaultCollisionConfiguration *collisionConfiguration = new btDefaultCollisionConfiguration(); + btBroadphaseInterface *broadPhase = new btAxisSweep3(btVector3(-1000, -1000, -1000), btVector3(1000, 1000, 1000)); + btCollisionDispatcher *dispatcher = new btCollisionDispatcher(collisionConfiguration); + btSequentialImpulseConstraintSolver *solver = new btSequentialImpulseConstraintSolver(); + m_world = new btDiscreteDynamicsWorld(dispatcher, broadPhase, solver, collisionConfiguration); + m_world->setGravity(btVector3(0, -10, 0)); } void Engine::update() { - //update time variable + // update delta time m_lastTimeStamp = m_timeStamp; - m_timeStamp = (unsigned int) m_clock.getElapsedTime().asMilliseconds(); - //update Events + m_timeStamp = (unsigned int) m_clock->getElapsedTime().asMilliseconds(); + // update Events m_input->updateEvents(); + // update Scene + m_scene->update(); + // update Physics + m_world->stepSimulation(1000.f*(float)getDeltaTime()); + // update Display + m_renderer->renderGL(); + m_window->display(); } -void Engine::updatePhysics() +void Engine::start() { - // work for Bullet + running = true; + while(!m_input->isCloseRequested() && running){ + update(); + } } -void Engine::render() +void Engine::stop() { - // work for SparrowRenderer + running = false; } unsigned int Engine::getTime() @@ -40,7 +82,7 @@ unsigned int Engine::getDeltaTime() return m_timeStamp - m_lastTimeStamp; } -void Engine::setCurrentScene(std::string scene) +void Engine::setScene(std::string sceneName) { - p_currentScene = RESOURCE_GET(Scene,scene); + m_scene = RESOURCE_GET(Scene,sceneName); } diff --git a/engine.h b/engine.h index ffdf338..96941e2 100644 --- a/engine.h +++ b/engine.h @@ -1,30 +1,54 @@ #ifndef ENGINE_H #define ENGINE_H +#include + class Input; +class SparrowRenderer; class Scene; +namespace sf +{ + class Clock; + class Window; +} +class btDiscreteDynamicsWorld; -class Engine{ +class Engine +{ public: - Engine(Input* input); - //main function - void update(); - void render(); - void updatePhysics(); + Engine(); + + void createWindow(std::string title = "SparrowEngine", + unsigned int w = 800, + unsigned int h = 600, + bool isWindowed = true); + void setScene(std::string sceneName); + + void start(); + void stop(); + + Input* getInput() {return m_input;} + SparrowRenderer* getRenderer() {return m_renderer;} + btDiscreteDynamicsWorld* getPhysics() {return m_world;} - //utils function unsigned int getTime(); unsigned int getDeltaTime(); - //scene-related function - void setCurrentScene(std::string scene); - private: - Input* m_input; - sf::Clock m_clock; + sf::Clock* m_clock; unsigned int m_timeStamp = 0; unsigned int m_lastTimeStamp = 0; - Scene* p_currentScene; + + bool running; + sf::Window* m_window; + + Input* m_input; + Scene* m_scene; + btDiscreteDynamicsWorld* m_world; + SparrowRenderer* m_renderer; + + void initPhysics(); + void update(); }; #endif diff --git a/main.cpp b/main.cpp index 2ecdf27..9404c11 100644 --- a/main.cpp +++ b/main.cpp @@ -1,13 +1,8 @@ - #include "engine.h" +#include int main(){ - Input* input; - Engine engine = Engine(input); - while(!input->isCloseRequested()){ - engine.update(); - // game content - engine.updatePhysics(); - engine.render(); - } + Engine engine; + engine.createWindow("test"); + engine.start(); } diff --git a/resourcemanager.cpp b/resourcemanager.cpp new file mode 100644 index 0000000..f1ed023 --- /dev/null +++ b/resourcemanager.cpp @@ -0,0 +1,17 @@ +#include "resourcemanager.h" + +std::unordered_map> ResourceManager::data; + +void ResourceManager::add(void* resource, const std::string &type, const std::string name) +{ + data[type][name] = resource; +} + +void* ResourceManager::get(const std::string &type, const std::string name) +{ + return check(type,name) ? data[type][name] : NULL; +} + +bool ResourceManager::check(const std::string &type, const std::string name){ + return data.count(type) && data[type].count(name); +} diff --git a/resourcemanager.h b/resourcemanager.h new file mode 100644 index 0000000..6092a68 --- /dev/null +++ b/resourcemanager.h @@ -0,0 +1,23 @@ +#ifndef RESOURCEMANAGER_H +#define RESOURCEMANAGER_H + +#include +#include + +#define RESOURCE_ADD(ptr, type, name) ResourceManager::add((void*)ptr, #type, name) + +#define RESOURCE_GET(type, name) ((type*)(ResourceManager::get(#type, name))) + +#define RESOURCE_CHECK(type,name) ResourceManager::check(#type, name) + +class ResourceManager +{ +private: + static std::unordered_map> data; +public: + static void add(void* resource, const std::string &type, const std::string name); + static void* get(const std::string &type, const std::string name); + static bool check(const std::string &type, const std::string name); +}; + +#endif // RESOURCEMANAGER_H diff --git a/scene.cpp b/scene.cpp index 01fed41..5e03e37 100644 --- a/scene.cpp +++ b/scene.cpp @@ -1,4 +1,5 @@ #include "scene.h" +#include "resourcemanager.h" Scene::Scene() { @@ -7,10 +8,42 @@ Scene::Scene() void Scene::update() { - //update call for all nodes + m_root->update(); } -void Scene::render() +// Container Node + +void ContainerNode::update() { - //render call for all nodes + for(SceneNode* sn : m_children) + sn->update(); } + +void ContainerNode::addChild(const std::string &childName) +{ + SceneNode* node = RESOURCE_GET(SceneNode, childName); + if(node != NULL) + { + m_children.push_back(node); + node->m_parent = this; + } +} + +void ContainerNode::removeChild(const std::string &childName) +{ + SceneNode* node = RESOURCE_GET(SceneNode, childName); + if(node != NULL) + { + for(unsigned int i=0; im_parent = NULL; + m_children[i] == m_children.back(); + m_children.pop_back(); + break; + } + } + } +} + diff --git a/scene.h b/scene.h index 15d96dc..db2530a 100644 --- a/scene.h +++ b/scene.h @@ -1,46 +1,35 @@ #ifndef SCENE_H #define SCENE_H +#include +#include class SceneNode; +class ContainerNode; class Scene { public: Scene(); void update(); - void render(); private: - SceneNode* m_sceneNodeTree; + ContainerNode* m_root; }; - class SceneNode { public: - SceneNode(); + SceneNode* m_parent; + virtual void update() = 0; +}; + +class ContainerNode : public SceneNode +{ +public: virtual void update(); -private: - SceneNode* m_parentNode; -}; - -class CameraSceneNode : public SceneNode -{ - -}; - -class LightSceneNode : public SceneNode -{ - -}; - -class TerrainSceneNode: public SceneNode -{ - -}; - -class ObjectSceneNode : public SceneNode -{ - + void addChild(const std::string &childName); + void removeChild(const std::string &childName); +protected: + std::vector m_children; }; #endif // SCENE_H From ab3d04fba98c4ba19f4ece64e017f27bae6f4268 Mon Sep 17 00:00:00 2001 From: Anselme Date: Thu, 24 Sep 2015 11:41:23 +0200 Subject: [PATCH 2/3] first working version of SparrowEngine --- CMakeLists.txt | 11 +++++++++++ README | 0 cameranode.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- cameranode.h | 27 ++++++++++++++++++++++----- engine.cpp | 32 +++++++++++++++++++++++++------- engine.h | 5 +++-- main.cpp | 12 ++++++++++++ scene.cpp | 11 +++++++---- scene.h | 20 +++++++++----------- 9 files changed, 133 insertions(+), 30 deletions(-) delete mode 100644 README diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c285d5..369f0ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ project(SparrowEngine) cmake_minimum_required(VERSION 2.8) +find_package(OpenGL REQUIRED) + if(WIN32) set(SYSTEM_LIB_PATH "win32") else(WIN32) @@ -84,6 +86,13 @@ find_library(LINEAR_MATH_LIBRARY ${LIB_ROOT} ) +find_library(GLEW_LIBRARY + NAMES + GLEW + PATHS + ${LIB_ROOT} +) + target_link_libraries( ${LIBRARY_NAME} ${SFML_LIBRARY_WINDOW} @@ -93,6 +102,8 @@ target_link_libraries( ${BULLET_COLLISION_LIBRARY} ${BULLET_DYNAMICS_LIBRARY} ${LINEAR_MATH_LIBRARY} + ${GLEW_LIBRARY} + ${OPENGL_LIBRARIES} ) target_link_libraries( diff --git a/README b/README deleted file mode 100644 index e69de29..0000000 diff --git a/cameranode.cpp b/cameranode.cpp index 86cfe4c..849cc0d 100644 --- a/cameranode.cpp +++ b/cameranode.cpp @@ -1,7 +1,50 @@ #include "cameranode.h" +#include -CameraNode::CameraNode() +CameraNode::CameraNode(glm::vec3 position, float yFov, float near, float far) : + m_hasMoved(true), + m_hasResized(false), + m_eye(position), + m_target(0, 0, 1), + m_yFov(yFov), + m_near(near), + m_far(far) { } +void CameraNode::setPosition(glm::vec3 position) +{ + m_hasMoved = true; + m_eye = position; +} + +void CameraNode::setTarget(glm::vec3 target) +{ + m_hasMoved = true; + m_target = target; +} + +void CameraNode::update() +{ + if(m_hasMoved) + m_view = glm::lookAt(m_eye, m_target, glm::vec3(0, 1, 0)); + if(m_hasResized) + m_projection = glm::perspective(m_yFov, m_ratio, m_near, m_far); +} + +glm::mat4 CameraNode::getProjectionMatrix() +{ + return m_projection; +} + +glm::mat4 CameraNode::getViewMatrix() +{ + return m_view; +} + +void CameraNode::resize(int width, int height) +{ + m_hasResized = false; + m_ratio = ((float)width)/((float)height); +} diff --git a/cameranode.h b/cameranode.h index 7cf9ec4..91293fd 100644 --- a/cameranode.h +++ b/cameranode.h @@ -6,16 +6,33 @@ class CameraNode : public SceneNode, public Camera { + bool m_hasMoved; + bool m_hasResized; + + glm::vec3 m_eye; + glm::vec3 m_target; + + float m_yFov; + float m_ratio; + float m_near; + float m_far; + + glm::mat4 m_projection; + glm::mat4 m_view; + public: - CameraNode(); + CameraNode(glm::vec3 position, float yFov = 70.f, float near = 0.1f, float far = 100.f); + CameraNode(float yFov = 70.f, float near = 0.1f, float far = 100.f) : + CameraNode(glm::vec3(0), yFov, near, far) {} + + void setPosition(glm::vec3 position); + void setTarget(glm::vec3 target); + virtual void update(); + virtual glm::mat4 getProjectionMatrix(); virtual glm::mat4 getViewMatrix(); virtual void resize(int width, int height); - -signals: - -public slots: }; #endif // CAMERANODE_H diff --git a/engine.cpp b/engine.cpp index d4d456d..5f9a6b8 100644 --- a/engine.cpp +++ b/engine.cpp @@ -8,15 +8,32 @@ #include #include "resourcemanager.h" #include "scene.h" +#include "cameranode.h" Engine::Engine() : m_input(NULL), - m_window(NULL) + m_window(NULL), + m_world(NULL) { m_clock = new sf::Clock(); m_clock->restart(); m_renderer = new SparrowRenderer(); - m_renderer->setCamera(NULL); // TODO + m_renderer->setCamera(NULL); +} + +Engine::~Engine() +{ + delete m_clock; + if(m_window != NULL) + m_renderer->destroyGL(); + delete m_renderer; + if(m_window != NULL) + { + delete m_window; + delete m_input; + } + if(m_world != NULL) + delete m_world; } void Engine::createWindow(std::string title, @@ -53,7 +70,8 @@ void Engine::update() // update Scene m_scene->update(); // update Physics - m_world->stepSimulation(1000.f*(float)getDeltaTime()); + if(m_world != NULL) + m_world->stepSimulation(1000.f*(float)getDeltaTime()); // update Display m_renderer->renderGL(); m_window->display(); @@ -61,15 +79,15 @@ void Engine::update() void Engine::start() { - running = true; - while(!m_input->isCloseRequested() && running){ + m_running = true; + while(!m_input->isCloseRequested() && m_running){ update(); } } void Engine::stop() { - running = false; + m_running = false; } unsigned int Engine::getTime() @@ -84,5 +102,5 @@ unsigned int Engine::getDeltaTime() void Engine::setScene(std::string sceneName) { - m_scene = RESOURCE_GET(Scene,sceneName); + m_scene = RESOURCE_GET(Scene, sceneName); } diff --git a/engine.h b/engine.h index 96941e2..a16e4f5 100644 --- a/engine.h +++ b/engine.h @@ -17,12 +17,14 @@ class Engine { public: Engine(); + ~Engine(); void createWindow(std::string title = "SparrowEngine", unsigned int w = 800, unsigned int h = 600, bool isWindowed = true); void setScene(std::string sceneName); + void initPhysics(); void start(); void stop(); @@ -39,7 +41,7 @@ private: unsigned int m_timeStamp = 0; unsigned int m_lastTimeStamp = 0; - bool running; + bool m_running; sf::Window* m_window; Input* m_input; @@ -47,7 +49,6 @@ private: btDiscreteDynamicsWorld* m_world; SparrowRenderer* m_renderer; - void initPhysics(); void update(); }; diff --git a/main.cpp b/main.cpp index 9404c11..11f5ec5 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,20 @@ #include "engine.h" #include +#include "scene.h" +#include "cameranode.h" +#include "resourcemanager.h" +#include "sparrowrenderer.h" int main(){ + CameraNode camera; + RESOURCE_ADD(&camera, SceneNode, "camera"); + + Scene scene("testScene"); + scene.addChild("camera"); + Engine engine; + engine.getRenderer()->setCamera(&camera); engine.createWindow("test"); + engine.setScene("testScene"); engine.start(); } diff --git a/scene.cpp b/scene.cpp index 5e03e37..42858da 100644 --- a/scene.cpp +++ b/scene.cpp @@ -1,14 +1,17 @@ #include "scene.h" #include "resourcemanager.h" -Scene::Scene() -{ +// Scene +Scene::Scene(std::string name) : + m_name(name) +{ + RESOURCE_ADD(this, Scene, m_name); } -void Scene::update() +Scene::~Scene() { - m_root->update(); + RESOURCE_ADD(NULL, Scene, m_name); } // Container Node diff --git a/scene.h b/scene.h index db2530a..0480d7d 100644 --- a/scene.h +++ b/scene.h @@ -3,17 +3,6 @@ #include #include -class SceneNode; -class ContainerNode; - -class Scene -{ -public: - Scene(); - void update(); -private: - ContainerNode* m_root; -}; class SceneNode { @@ -32,4 +21,13 @@ protected: std::vector m_children; }; +class Scene : public ContainerNode +{ +public: + Scene(std::string name); + ~Scene(); +private: + std::string m_name; +}; + #endif // SCENE_H From 596ca0fa59f6a99d2661dcfe21b11ae961a424a6 Mon Sep 17 00:00:00 2001 From: Anselme Date: Thu, 24 Sep 2015 11:54:03 +0200 Subject: [PATCH 3/3] added basic handling of window resize --- engine.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engine.cpp b/engine.cpp index 5f9a6b8..1442110 100644 --- a/engine.cpp +++ b/engine.cpp @@ -29,6 +29,7 @@ Engine::~Engine() delete m_renderer; if(m_window != NULL) { + m_window->close(); delete m_window; delete m_input; } @@ -73,6 +74,8 @@ void Engine::update() if(m_world != NULL) m_world->stepSimulation(1000.f*(float)getDeltaTime()); // update Display + if(m_input->isResized()) + m_renderer->resizeGL(m_window->getSize().x, m_window->getSize().y); m_renderer->renderGL(); m_window->display(); }