]> gitweb.ps.run Git - subsurface_scattering/blob - src/main.cpp
no lighting
[subsurface_scattering] / src / main.cpp
1 #include <stdio.h>\r
2 \r
3 #include <GL/glew.h>\r
4 \r
5 #include <glm/glm.hpp>\r
6 #include <glm/gtc/matrix_transform.hpp>\r
7 #include <glm/gtc/type_ptr.hpp>\r
8 \r
9 #include <SFML/OpenGL.hpp>\r
10 #include <SFML/Window.hpp>\r
11 \r
12 #include <assimp/Importer.hpp>\r
13 #include <assimp/scene.h>\r
14 #include <assimp/postprocess.h>\r
15 \r
16 \r
17 const char *vertexShaderSource =\r
18 "#version 330 core\n"\r
19 "layout (location = 0) in vec3 pos;\n"\r
20 "uniform mat4 model;\n"\r
21 "uniform mat4 view;\n"\r
22 "uniform mat4 projection;\n"\r
23 "\n"\r
24 "void main()\n"\r
25 "{\n"\r
26 "    gl_Position = projection * view * model * vec4(pos, 1.0);\n"\r
27 "}\n";\r
28 \r
29 const char *fragmentShaderSource =\r
30 "#version 330 core\n"\r
31 "out vec4 FragColor;\n"\r
32 "\n"\r
33 "void main()\n"\r
34 "{\n"\r
35 "    FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"\r
36 "}\n";\r
37 \r
38 std::vector<float> vertices;\r
39 std::vector<GLuint> indices;\r
40 \r
41 \r
42 void load(const std::string &filename, std::vector<float> &vertices, std::vector<GLuint> &indices) {\r
43   Assimp::Importer importer;\r
44 \r
45   const aiScene *scene = importer.ReadFile(\r
46       filename,\r
47       aiProcess_CalcTangentSpace |\r
48       aiProcess_Triangulate |\r
49       aiProcess_JoinIdenticalVertices |\r
50       aiProcess_SortByPType\r
51   );\r
52 \r
53   for (int i = 0; i < scene->mMeshes[0]->mNumVertices; i++) {\r
54     aiVector3D v = scene->mMeshes[0]->mVertices[i];\r
55     vertices.push_back(v.x);\r
56     vertices.push_back(v.y);\r
57     vertices.push_back(v.z);\r
58   }\r
59 \r
60   for (int i = 0; i < scene->mMeshes[0]->mNumFaces; i++) {\r
61     aiFace f = scene->mMeshes[0]->mFaces[i];\r
62     for (int j = 0; j < f.mNumIndices; j++) {\r
63       indices.push_back(f.mIndices[j]);\r
64     }\r
65   }\r
66 }\r
67 \r
68 int main() {\r
69   // Window Setup\r
70 \r
71   sf::ContextSettings settings;\r
72   settings.depthBits = 24;\r
73   settings.antialiasingLevel = 0;\r
74   settings.majorVersion = 4;\r
75   settings.minorVersion = 6;\r
76 \r
77   sf::Window window(sf::VideoMode(800, 600), "Subsurface Scattering",\r
78                     sf::Style::Default, settings);\r
79   window.setVerticalSyncEnabled(true);\r
80 \r
81   window.setActive(true);\r
82 \r
83   // Initialize GLEW\r
84 \r
85   if (glewInit() != GLEW_OK) {\r
86 \r
87   }\r
88 \r
89   load("models/Isotrop-upperjaw.ply", vertices, indices);\r
90 \r
91   // Compile Shaders\r
92 \r
93   GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);\r
94   glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);\r
95   glCompileShader(vertexShader);\r
96 \r
97   int  success;\r
98   char infoLog[512];\r
99   glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);\r
100   if (!success) {\r
101       glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);\r
102       printf("Error compiling vertex shader: %s\n", infoLog);\r
103   }\r
104 \r
105   GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);\r
106   glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);\r
107   glCompileShader(fragmentShader);\r
108 \r
109   glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);\r
110   if (!success) {\r
111       glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);\r
112       printf("Error compiling fragment shader: %s\n", infoLog);\r
113   }\r
114 \r
115   // Link Shader Program\r
116 \r
117   GLuint shaderProgram = glCreateProgram();\r
118   glAttachShader(shaderProgram, vertexShader);\r
119   glAttachShader(shaderProgram, fragmentShader);\r
120   glLinkProgram(shaderProgram);\r
121   \r
122   glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);\r
123   if (!success) {\r
124       glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);\r
125       printf("Error linking shader program: %s\n", infoLog);\r
126   }\r
127 \r
128   glDeleteShader(vertexShader);\r
129   glDeleteShader(fragmentShader);\r
130 \r
131   // Create VBO\r
132 \r
133   GLuint VBO;\r
134   glGenBuffers(1, &VBO);\r
135 \r
136   // Create EBO\r
137 \r
138   GLuint EBO;\r
139   glGenBuffers(1, &EBO);\r
140   \r
141   // Create VAO\r
142 \r
143   GLuint VAO;\r
144   glGenVertexArrays(1, &VAO);\r
145 \r
146   glBindVertexArray(VAO);\r
147   \r
148   glBindBuffer(GL_ARRAY_BUFFER, VBO);\r
149   glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);\r
150   \r
151   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);\r
152   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), indices.data(), GL_STATIC_DRAW);\r
153 \r
154   glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, NULL);\r
155   glEnableVertexAttribArray(0);\r
156 \r
157   glBindVertexArray(0);\r
158 \r
159   // Perspective\r
160 \r
161   glm::mat4 model = glm::mat4(1.0f);\r
162 \r
163   glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -200.0f));\r
164 \r
165   glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 1000.0f);\r
166 \r
167   bool wireframe = false;\r
168 \r
169   bool running = true;\r
170   while (running) {\r
171     sf::Event event;\r
172     while (window.pollEvent(event)) {\r
173       if (event.type == sf::Event::Closed) {\r
174         running = false;\r
175       } else if (event.type == sf::Event::Resized) {\r
176         glViewport(0, 0, event.size.width, event.size.height);\r
177       } else if (event.type == sf::Event::KeyReleased) {\r
178         using keys = sf::Keyboard;\r
179         switch (event.key.code) {\r
180         case keys::W:\r
181           wireframe = !wireframe;\r
182           break;\r
183         case keys::Escape:\r
184           running = false;\r
185           break;\r
186         }\r
187       }\r
188     }\r
189 \r
190     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
191 \r
192     glEnable(GL_DEPTH_TEST);\r
193 \r
194     if (wireframe)\r
195       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);\r
196     else\r
197       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\r
198 \r
199     model = glm::rotate(model, glm::radians(0.2f), glm::vec3(0.0f, 1.0f, 0.0f));\r
200 \r
201     glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model));\r
202     glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view));\r
203     glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(proj));\r
204 \r
205     glUseProgram(shaderProgram);\r
206     glBindVertexArray(VAO);\r
207     glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);\r
208     glBindVertexArray(0);\r
209 \r
210     window.display();\r
211   }\r
212 \r
213   return 0;\r
214 }