From 0ddfaead8f7a79ed06dde48faeb27f4359800284 Mon Sep 17 00:00:00 2001 From: viperscape Date: Thu, 15 Nov 2018 17:02:20 -0500 Subject: [PATCH 1/2] add basic example --- examples/basic/.gitignore | 7 + examples/basic/basic/basic.sln | 31 ++++ examples/basic/basic/basic.vcxproj | 159 +++++++++++++++++++++ examples/basic/basic/basic.vcxproj.filters | 39 +++++ examples/basic/basic/basic.vcxproj.user | 4 + examples/basic/basic/packages.config | 6 + examples/basic/main.cpp | Bin 0 -> 19314 bytes examples/basic/shaders.cpp | 114 +++++++++++++++ examples/basic/shaders.h | 13 ++ examples/basic/window.cpp | 27 ++++ examples/basic/window.h | 15 ++ 11 files changed, 415 insertions(+) create mode 100644 examples/basic/.gitignore create mode 100644 examples/basic/basic/basic.sln create mode 100644 examples/basic/basic/basic.vcxproj create mode 100644 examples/basic/basic/basic.vcxproj.filters create mode 100644 examples/basic/basic/basic.vcxproj.user create mode 100644 examples/basic/basic/packages.config create mode 100644 examples/basic/main.cpp create mode 100644 examples/basic/shaders.cpp create mode 100644 examples/basic/shaders.h create mode 100644 examples/basic/window.cpp create mode 100644 examples/basic/window.h diff --git a/examples/basic/.gitignore b/examples/basic/.gitignore new file mode 100644 index 0000000..0d208f4 --- /dev/null +++ b/examples/basic/.gitignore @@ -0,0 +1,7 @@ +.vs +Debug +x64 +packages + +!*.sln +!*.vcxproj* \ No newline at end of file diff --git a/examples/basic/basic/basic.sln b/examples/basic/basic/basic.sln new file mode 100644 index 0000000..009bd2d --- /dev/null +++ b/examples/basic/basic/basic.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2050 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic", "basic.vcxproj", "{0589AC44-0CF3-40D8-8D89-68393CFD40F3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Debug|x64.ActiveCfg = Debug|x64 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Debug|x64.Build.0 = Debug|x64 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Debug|x86.ActiveCfg = Debug|Win32 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Debug|x86.Build.0 = Debug|Win32 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Release|x64.ActiveCfg = Release|x64 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Release|x64.Build.0 = Release|x64 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Release|x86.ActiveCfg = Release|Win32 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {055E97C4-43DC-41B4-8D61-4FDDBC7B1EF7} + EndGlobalSection +EndGlobal diff --git a/examples/basic/basic/basic.vcxproj b/examples/basic/basic/basic.vcxproj new file mode 100644 index 0000000..3aa245a --- /dev/null +++ b/examples/basic/basic/basic.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {0589AC44-0CF3-40D8-8D89-68393CFD40F3} + basic + 10.0.17134.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);opengl32.lib + Console + + + + + Level3 + Disabled + true + true + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);opengl32.lib + Console + + + + + Level3 + MaxSpeed + true + true + true + true + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);opengl32.lib + Console + + + + + Level3 + MaxSpeed + true + true + true + true + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);opengl32.lib + Console + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/examples/basic/basic/basic.vcxproj.filters b/examples/basic/basic/basic.vcxproj.filters new file mode 100644 index 0000000..92e206f --- /dev/null +++ b/examples/basic/basic/basic.vcxproj.filters @@ -0,0 +1,39 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + + \ No newline at end of file diff --git a/examples/basic/basic/basic.vcxproj.user b/examples/basic/basic/basic.vcxproj.user new file mode 100644 index 0000000..be25078 --- /dev/null +++ b/examples/basic/basic/basic.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/basic/basic/packages.config b/examples/basic/basic/packages.config new file mode 100644 index 0000000..85cebfe --- /dev/null +++ b/examples/basic/basic/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/basic/main.cpp b/examples/basic/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..365b616dacf45eb9e5db53c1c847934676f6a6f0 GIT binary patch literal 19314 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 +#include + + +#include +#include + +std::string FragmentShaderCode = +"#version 330 core\n\ +in vec3 normal;\n\ +in vec3 position;\n\ +in vec2 texcoord;\n\ +\n\ +uniform sampler2D tex;\n\ +uniform vec3 sun_position; \n\ +uniform vec3 sun_color; \n\ +\n\ +out vec4 color;\n\ +void main() {\n\ + float lum = max(dot(normal, normalize(sun_position)), 0.0);\n\ + color = texture2D(tex, texcoord) * vec4((0.3 + 0.7 * lum) * sun_color, 1.0);\n\ +}\n\ +"; + +std::string VertexShaderCode = +"#version 330 core\n\ +layout(location = 0) in vec3 in_vertex;\n\ +layout(location = 1) in vec3 in_normal;\n\ +layout(location = 2) in vec2 in_texcoord;\n\ +\n\ +uniform mat4 MVP;\n\ +\n\ +out vec3 normal;\n\ +out vec3 position;\n\ +out vec2 texcoord;\n\ +\n\ +void main(){\n\ + gl_Position = MVP * vec4(in_vertex, 1);\n\ + position = gl_Position.xyz;\n\ + normal = normalize(mat3(MVP) * in_normal);\n\ + position = in_vertex;\n\ + texcoord = in_texcoord;\n\ +}"; + + +Shaders::Shaders() +{ + + // Create the shaders + GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); + GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); + + + GLint Result = GL_FALSE; + int InfoLogLength; + + // Compile Vertex Shader + char const * VertexSourcePointer = VertexShaderCode.c_str(); + glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL); + glCompileShader(VertexShaderID); + + // Check Vertex Shader + glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); + glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); + if (InfoLogLength > 0) { + std::vector VertexShaderErrorMessage(InfoLogLength + 1); + glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); + printf("%s\n", &VertexShaderErrorMessage[0]); + } + + // Compile Fragment Shader + char const * FragmentSourcePointer = FragmentShaderCode.c_str(); + glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL); + glCompileShader(FragmentShaderID); + + // Check Fragment Shader + glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); + glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); + if (InfoLogLength > 0) { + std::vector FragmentShaderErrorMessage(InfoLogLength + 1); + glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); + printf("%s\n", &FragmentShaderErrorMessage[0]); + } + + // Link the program + printf("Linking program\n"); + GLuint ProgramID = glCreateProgram(); + glAttachShader(ProgramID, VertexShaderID); + glAttachShader(ProgramID, FragmentShaderID); + glLinkProgram(ProgramID); + + // Check the program + glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); + glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); + if (InfoLogLength > 0) { + std::vector ProgramErrorMessage(InfoLogLength + 1); + glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); + printf("%s\n", &ProgramErrorMessage[0]); + } + + glDetachShader(ProgramID, VertexShaderID); + glDetachShader(ProgramID, FragmentShaderID); + + glDeleteShader(VertexShaderID); + glDeleteShader(FragmentShaderID); + + this->pid = ProgramID; +} + + +Shaders::~Shaders() +{ +} diff --git a/examples/basic/shaders.h b/examples/basic/shaders.h new file mode 100644 index 0000000..1fb2823 --- /dev/null +++ b/examples/basic/shaders.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +class Shaders +{ +public: + GLuint pid; + Shaders(); + ~Shaders(); +}; + diff --git a/examples/basic/window.cpp b/examples/basic/window.cpp new file mode 100644 index 0000000..c51e434 --- /dev/null +++ b/examples/basic/window.cpp @@ -0,0 +1,27 @@ +#include "window.h" + + + +Window::Window(int x, int y, const char* title) +{ + GLFWwindow* window = glfwCreateWindow(x, y, title, NULL, NULL); + this->window = window; +} + + +Window::~Window() +{ + glfwDestroyWindow(this->window); +} + +void Window::Resize() +{ + GLint w, h; + glfwGetWindowSize(this->window, &w, &h); + glViewport(0, 0, w, h); +} + +int Window::Close() +{ + return glfwWindowShouldClose(this->window); +} diff --git a/examples/basic/window.h b/examples/basic/window.h new file mode 100644 index 0000000..3790c65 --- /dev/null +++ b/examples/basic/window.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +class Window +{ +public: + GLFWwindow* window; + + Window(int x, int y, const char* title); + ~Window(); + void Resize(); + int Close(); +}; + From c3e34c2ff7314cdec7b1288db30abb8b660c4925 Mon Sep 17 00:00:00 2001 From: viperscape Date: Thu, 15 Nov 2018 17:03:38 -0500 Subject: [PATCH 2/2] add screenshot --- examples/basic/screenshot.JPG | Bin 0 -> 36403 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/basic/screenshot.JPG diff --git a/examples/basic/screenshot.JPG b/examples/basic/screenshot.JPG new file mode 100644 index 0000000000000000000000000000000000000000..ba2b2c7f47b0913ef348c7cdab61f52ba07e6949 GIT binary patch literal 36403 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