From eabc20a2e3f29bd40771e8591944670937ebd457 Mon Sep 17 00:00:00 2001 From: Vitor Fernandes Date: Mon, 6 Jul 2020 14:32:37 +0100 Subject: [PATCH] Digging on smart pointers --- src/CMakeLists.txt | 3 +- src/misc/CMakeLists.txt | 4 ++ src/misc/smartpointer.cpp | 71 +++++++++++++++++++ src/misc/smartpointer.h | 19 +++++ src/opengl/CMakeLists.txt | 7 +- src/opengl/gl1.cpp | 145 +++++++++++--------------------------- 6 files changed, 141 insertions(+), 108 deletions(-) create mode 100644 src/misc/CMakeLists.txt create mode 100644 src/misc/smartpointer.cpp create mode 100644 src/misc/smartpointer.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 67aa2e3..e30d712 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(core) -add_subdirectory(opengl) \ No newline at end of file +add_subdirectory(opengl) +add_subdirectory(misc) \ No newline at end of file diff --git a/src/misc/CMakeLists.txt b/src/misc/CMakeLists.txt new file mode 100644 index 0000000..919ea12 --- /dev/null +++ b/src/misc/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable( + spointer + smartpointer.cpp +) diff --git a/src/misc/smartpointer.cpp b/src/misc/smartpointer.cpp new file mode 100644 index 0000000..a31e68c --- /dev/null +++ b/src/misc/smartpointer.cpp @@ -0,0 +1,71 @@ +#include "smartpointer.h" +#include + +#define UPtr std::unique_ptr +#define SPtr std::shared_ptr + +DummyObject::DummyObject(int num_elements) +{ + std::cout << "Constructor called " << num_elements << std::endl; + size = num_elements; + list_of_numbers = new int[size]; +} + +DummyObject::~DummyObject() +{ + std::cout << "Destructor called " << size << std::endl; + delete[] list_of_numbers; +} + +DummyObject::DummyObject(const DummyObject &other) +{ + std::cout << "Copy constructor called " << other.size << std::endl; + list_of_numbers = new int[other.size]; + for (int i = 0; i < other.size; i++) + { + list_of_numbers[i] = other.list_of_numbers[i]; + } + size = other.size; +} + +DummyObject::DummyObject(DummyObject&& moved) +{ + std::cout << "Move constructor called " << moved.size << std::endl; +} + +void DummyObject::doSomething() +{ + std::cout << "This do amazing stuff: " << size << std::endl; +} + +DummyObject createDummy(int size) +{ + DummyObject d(size); + return d; +} + +int main(void) +{ + std::cout << "Smart pointer examples" << std::endl; + + DummyObject d(15); + DummyObject copy = d; + + DummyObject *dmtPtr = new DummyObject(20); + UPtr dmySmtPtr = UPtr(new DummyObject(30)); + + dmySmtPtr->doSomething(); + dmtPtr->doSomething(); + + SPtr firstSmtPtr = SPtr(dmtPtr); + SPtr secondSmtPtr = firstSmtPtr; + + DummyObject retDummy = createDummy(32); + DummyObject secondDummy = std::move(retDummy); + + retDummy.doSomething(); + secondDummy.doSomething(); + + firstSmtPtr->doSomething(); + secondSmtPtr->doSomething(); +} \ No newline at end of file diff --git a/src/misc/smartpointer.h b/src/misc/smartpointer.h new file mode 100644 index 0000000..07b537f --- /dev/null +++ b/src/misc/smartpointer.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +class DummyObject { + public: + DummyObject(int); //Constructor + ~DummyObject(); //destructor + DummyObject(const DummyObject&); //copy constructor + DummyObject(DummyObject&&); //move constructor + + void doSomething(); + + + private: + int size; + int* list_of_numbers; + +}; \ No newline at end of file diff --git a/src/opengl/CMakeLists.txt b/src/opengl/CMakeLists.txt index 57f8fcb..bd1b0b6 100644 --- a/src/opengl/CMakeLists.txt +++ b/src/opengl/CMakeLists.txt @@ -1,7 +1,7 @@ # Search for glfw find_package(glfw3 3.3 REQUIRED) # Search for glew -find_package(GLEW REQUIRED) +find_package(glew REQUIRED) # Search for OpenGL find_package(OpenGL REQUIRED) add_compile_definitions(IS_DEBUG=1) @@ -22,9 +22,10 @@ add_executable( ) -# Link gl1 with glew -#target_link_libraries(gl1 glew) +target_link_libraries(gl1 /usr/local/lib/libGLEW.2.2.0.dylib) # Link gl1 with glfw lib target_link_libraries(gl1 glfw) +# Link gl1 with glew +#target_link_libraries(gl1 glew) # Link gl1 with OpenGL target_link_libraries(gl1 OpenGL::GL) diff --git a/src/opengl/gl1.cpp b/src/opengl/gl1.cpp index 69fadf1..01b27d6 100644 --- a/src/opengl/gl1.cpp +++ b/src/opengl/gl1.cpp @@ -15,127 +15,64 @@ const std::string SHADERS_PATH = "src/opengl/res/shaders/Basic.shader"; +static void error_callback(int error, const char *description) +{ + fputs(description, stderr); +} +static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) +{ + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + glfwSetWindowShouldClose(window, GL_TRUE); +} + int main(void) { - LOG("Start OpenGL Demo"); GLFWwindow *window; - //glDebugMessageCallback(ErrorGLCallback,0); Enable when glew installed properly - - /* Initialize the library */ - LOG("Initialize glfw"); + glfwSetErrorCallback(error_callback); if (!glfwInit()) - return -1; - - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); - glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); - - /* Create a windowed mode window and its OpenGL context */ - LOG("Create Window"); - //glfwCreateWindow(640, 480, "OpenGL Window", NULL, NULL); - //GLCall(window = glfwCreateWindow(640, 480, "OpenGL Window", NULL, NULL)); - - window = glfwCreateWindow(640, 480, "OpenGL Window", NULL, NULL); - + exit(EXIT_FAILURE); + window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); if (!window) { - LOG("Terminate because not window"); glfwTerminate(); - return -1; + exit(EXIT_FAILURE); } - /* Make the window's context current */ - LOG("GLFW Make context"); glfwMakeContextCurrent(window); - glfwSwapInterval(1); + glfwSetKeyCallback(window, key_callback); - GLPrintVersion(); + int major, minor, revision; + glfwGetVersion(&major, &minor, &revision); - float positions[] = - { - -0.5f, -0.5f, - 0.5f, -0.5f, - 0.5f, 0.5f, - -0.5f, 0.5f}; + printf("Running against GLFW %i.%i.%i\n", major, minor, revision); + LOG(glfwGetVersionString()); - unsigned int indexes[] = { - 0, 1, 2, 2, 3, 0}; - - //Create buffer - //Buffer id - VertexArray va; - - LOG("VertexBuffer to be created"); - VertexBuffer vb(positions, 4 * 2 * sizeof(float)); - //LOG("Create VertexBuffer: " << vb); - - VertexBufferLayout layout; - layout.Push(2); - va.AddBuffer(vb,layout); - - IndexBuffer ib(indexes,6); - - Shader shader(SHADERS_PATH); - shader.Bind(); - shader.SetUniform4f("u_Color",0.2f, 0.3f, 0.8f, 1.0f); - - va.Unbind(); - vb.Unbind(); - ib.Unbind(); - shader.Unbind(); - - Renderer renderer; - - float red = 0.0f; - float increment = 0.05f; - /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { - /* Render here */ - GLCall(glClear(GL_COLOR_BUFFER_BIT)); - - // Legacy OpenGL - //glBegin(GL_TRIANGLES); - //glVertex2f(-1.0f, -1.0f); - //glVertex2f(0.0f, 1.0f); - //glVertex2f(1.0f, -1.0f); - //glEnd(); - - //Modern OpenGL - //without index buffer - //glDrawArrays(GL_TRIANGLES, 0, 12); - //GLClearError(); - - //GLCall(glUseProgram(shader)); - - //GLCall(glUniform4f(uniform_location, 0.2f, 0.3f, 0.8f, 1.0f)); - - //ib.Bind(); - - //GLCall(glDrawElements(GL_TRIANGLES, 6 * sizeof(uint), GL_UNSIGNED_INT, nullptr)); - - shader.Bind(); - shader.SetUniform4f("u_Color",red, 0.3f, 0.8f, 1.0f); - - renderer.draw(va,ib,shader); - - if (red > 1.0f) - increment = -0.05f; - else if (red < 0.0f) - increment = 0.05f; - red += increment; - - //GLCheckError(); - /* Swap front and back buffers */ + float ratio; + int width, height; + glfwGetFramebufferSize(window, &width, &height); + ratio = width / (float)height; + glViewport(0, 0, width, height); + glClear(GL_COLOR_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotatef((float)glfwGetTime() * 50.f, 0.f, 0.f, 1.f); + glBegin(GL_TRIANGLES); + glColor3f(1.f, 0.f, 0.f); + glVertex3f(-0.6f, -0.4f, 0.f); + glColor3f(0.f, 1.f, 0.f); + glVertex3f(0.6f, -0.4f, 0.f); + glColor3f(0.f, 0.f, 1.f); + glVertex3f(0.f, 0.6f, 0.f); + glEnd(); glfwSwapBuffers(window); - - /* Poll for and process events */ glfwPollEvents(); } - + glfwDestroyWindow(window); glfwTerminate(); - - return 0; + exit(EXIT_SUCCESS); }