Digging on smart pointers
This commit is contained in:
parent
d6e5f494ff
commit
eabc20a2e3
6 changed files with 141 additions and 108 deletions
|
@ -1,2 +1,3 @@
|
||||||
add_subdirectory(core)
|
add_subdirectory(core)
|
||||||
add_subdirectory(opengl)
|
add_subdirectory(opengl)
|
||||||
|
add_subdirectory(misc)
|
4
src/misc/CMakeLists.txt
Normal file
4
src/misc/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
add_executable(
|
||||||
|
spointer
|
||||||
|
smartpointer.cpp
|
||||||
|
)
|
71
src/misc/smartpointer.cpp
Normal file
71
src/misc/smartpointer.cpp
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#include "smartpointer.h"
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#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<DummyObject> dmySmtPtr = UPtr<DummyObject>(new DummyObject(30));
|
||||||
|
|
||||||
|
dmySmtPtr->doSomething();
|
||||||
|
dmtPtr->doSomething();
|
||||||
|
|
||||||
|
SPtr<DummyObject> firstSmtPtr = SPtr<DummyObject>(dmtPtr);
|
||||||
|
SPtr<DummyObject> secondSmtPtr = firstSmtPtr;
|
||||||
|
|
||||||
|
DummyObject retDummy = createDummy(32);
|
||||||
|
DummyObject secondDummy = std::move(retDummy);
|
||||||
|
|
||||||
|
retDummy.doSomething();
|
||||||
|
secondDummy.doSomething();
|
||||||
|
|
||||||
|
firstSmtPtr->doSomething();
|
||||||
|
secondSmtPtr->doSomething();
|
||||||
|
}
|
19
src/misc/smartpointer.h
Normal file
19
src/misc/smartpointer.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
};
|
|
@ -1,7 +1,7 @@
|
||||||
# Search for glfw
|
# Search for glfw
|
||||||
find_package(glfw3 3.3 REQUIRED)
|
find_package(glfw3 3.3 REQUIRED)
|
||||||
# Search for glew
|
# Search for glew
|
||||||
find_package(GLEW REQUIRED)
|
find_package(glew REQUIRED)
|
||||||
# Search for OpenGL
|
# Search for OpenGL
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
add_compile_definitions(IS_DEBUG=1)
|
add_compile_definitions(IS_DEBUG=1)
|
||||||
|
@ -22,9 +22,10 @@ add_executable(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Link gl1 with glew
|
target_link_libraries(gl1 /usr/local/lib/libGLEW.2.2.0.dylib)
|
||||||
#target_link_libraries(gl1 glew)
|
|
||||||
# Link gl1 with glfw lib
|
# Link gl1 with glfw lib
|
||||||
target_link_libraries(gl1 glfw)
|
target_link_libraries(gl1 glfw)
|
||||||
|
# Link gl1 with glew
|
||||||
|
#target_link_libraries(gl1 glew)
|
||||||
# Link gl1 with OpenGL
|
# Link gl1 with OpenGL
|
||||||
target_link_libraries(gl1 OpenGL::GL)
|
target_link_libraries(gl1 OpenGL::GL)
|
||||||
|
|
|
@ -15,127 +15,64 @@
|
||||||
|
|
||||||
const std::string SHADERS_PATH = "src/opengl/res/shaders/Basic.shader";
|
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)
|
int main(void)
|
||||||
{
|
{
|
||||||
LOG("Start OpenGL Demo");
|
|
||||||
GLFWwindow *window;
|
GLFWwindow *window;
|
||||||
//glDebugMessageCallback(ErrorGLCallback,0); Enable when glew installed properly
|
glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
/* Initialize the library */
|
|
||||||
LOG("Initialize glfw");
|
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
return -1;
|
exit(EXIT_FAILURE);
|
||||||
|
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
|
||||||
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);
|
|
||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
LOG("Terminate because not window");
|
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
return -1;
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make the window's context current */
|
|
||||||
LOG("GLFW Make context");
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
glfwSwapInterval(1);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
|
||||||
GLPrintVersion();
|
int major, minor, revision;
|
||||||
|
glfwGetVersion(&major, &minor, &revision);
|
||||||
|
|
||||||
float positions[] =
|
printf("Running against GLFW %i.%i.%i\n", major, minor, revision);
|
||||||
{
|
LOG(glfwGetVersionString());
|
||||||
-0.5f, -0.5f,
|
|
||||||
0.5f, -0.5f,
|
|
||||||
0.5f, 0.5f,
|
|
||||||
-0.5f, 0.5f};
|
|
||||||
|
|
||||||
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<float>(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))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
/* Render here */
|
float ratio;
|
||||||
GLCall(glClear(GL_COLOR_BUFFER_BIT));
|
int width, height;
|
||||||
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
// Legacy OpenGL
|
ratio = width / (float)height;
|
||||||
//glBegin(GL_TRIANGLES);
|
glViewport(0, 0, width, height);
|
||||||
//glVertex2f(-1.0f, -1.0f);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
//glVertex2f(0.0f, 1.0f);
|
glMatrixMode(GL_PROJECTION);
|
||||||
//glVertex2f(1.0f, -1.0f);
|
glLoadIdentity();
|
||||||
//glEnd();
|
glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
//Modern OpenGL
|
glLoadIdentity();
|
||||||
//without index buffer
|
glRotatef((float)glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
|
||||||
//glDrawArrays(GL_TRIANGLES, 0, 12);
|
glBegin(GL_TRIANGLES);
|
||||||
//GLClearError();
|
glColor3f(1.f, 0.f, 0.f);
|
||||||
|
glVertex3f(-0.6f, -0.4f, 0.f);
|
||||||
//GLCall(glUseProgram(shader));
|
glColor3f(0.f, 1.f, 0.f);
|
||||||
|
glVertex3f(0.6f, -0.4f, 0.f);
|
||||||
//GLCall(glUniform4f(uniform_location, 0.2f, 0.3f, 0.8f, 1.0f));
|
glColor3f(0.f, 0.f, 1.f);
|
||||||
|
glVertex3f(0.f, 0.6f, 0.f);
|
||||||
//ib.Bind();
|
glEnd();
|
||||||
|
|
||||||
//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 */
|
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
|
|
||||||
/* Poll for and process events */
|
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
glfwDestroyWindow(window);
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue