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(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
|
||||
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)
|
||||
|
|
|
@ -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<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))
|
||||
{
|
||||
/* 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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue