1 #ifndef LIBOSMSCOUT_OPENGLMAPDATA_H 2 #define LIBOSMSCOUT_OPENGLMAPDATA_H 25 #include <glm/glm.hpp> 26 #include <glm/gtc/matrix_transform.hpp> 27 #include <glm/gtc/type_ptr.hpp> 28 #include <glm/ext.hpp> 56 std::vector<GLfloat> Vertices;
57 std::vector<GLfloat> VerticesBuffer;
58 std::vector<GLuint> Elements;
59 std::vector<GLuint> ElementsBuffer;
60 unsigned char *Textures;
61 std::vector<OpenGLTextureRef> TexturesBuffer;
63 int textureSizeBuffer;
65 int textureWidthBuffer;
78 GLuint FragmentShader;
80 std::string VertexShaderSource;
81 std::string FragmentShaderSource;
82 int VertexShaderLength;
83 int FragmentShaderLength;
89 std::string LoadShader(std::string name) {
92 std::string filePath = std::string(__FILE__);
94 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) 95 std::string dirPath = filePath.substr(0, filePath.rfind(
"\\"));
97 std::string dirPath = filePath.substr(0, filePath.rfind(
"/"));
100 std::ifstream myfile(dirPath +
"/private/" + name);
101 if (myfile.is_open()) {
102 while (getline(myfile, line)) {
103 result.append(line +
"\n");
113 glBindBuffer(GL_ARRAY_BUFFER, VBO);
114 glBufferData(GL_ARRAY_BUFFER,
sizeof(std::vector<GLfloat>) + (
sizeof(GLfloat) * Vertices.size()), &Vertices[0],
119 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
120 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(std::vector<GLfloat>) + (
sizeof(GLfloat) * Elements.size()),
121 &Elements[0], GL_DYNAMIC_DRAW);
128 this->Vertices.clear();
129 this->Vertices = this->VerticesBuffer;
130 this->VerticesBuffer.clear();
131 this->Elements.clear();
132 this->Elements = this->ElementsBuffer;
133 this->ElementsBuffer.clear();
135 textureSize = textureSizeBuffer;
136 textureSizeBuffer = 0;
137 textureWidth = textureWidthBuffer;
138 textureWidthBuffer = 0;
142 this->Textures =
new unsigned char[textureWidth*textureHeight*4];
145 for (
int i = 0; i < textureHeight; i++) {
146 for (
unsigned int j = 0; j < TexturesBuffer.size(); j++) {
147 int start = i * TexturesBuffer[j]->width * 4;
148 for (
unsigned int k = start; k < start + (TexturesBuffer[j]->width * 4); k++) {
149 Textures[index] = (TexturesBuffer[j]->data[k]);
155 TexturesBuffer.clear();
160 this->Vertices.clear();
161 this->Vertices = this->VerticesBuffer;
162 this->VerticesBuffer.clear();
163 this->Elements.clear();
164 this->Elements = this->ElementsBuffer;
165 this->ElementsBuffer.clear();
167 textureSize = textureSizeBuffer;
168 textureSizeBuffer = 0;
169 textureWidth = textureWidthBuffer;
170 textureWidthBuffer = 0;
172 this->Textures =
new unsigned char[textureWidth*textureHeight*stride];
175 for (
int i = 0; i < textureHeight; i++) {
176 for (
unsigned int j = 0; j < TexturesBuffer.size(); j++) {
177 int start = i * TexturesBuffer[j]->width * stride;
178 for (
unsigned int k = start; k < start + (TexturesBuffer[j]->width * stride); k++) {
179 Textures[index] = (TexturesBuffer[j]->data[k]);
185 TexturesBuffer.clear();
192 TexturesBuffer.clear();
198 glBindVertexArray(VAO);
202 glGenVertexArrays(1, &VAO);
203 glBindVertexArray(VAO);
204 glGenBuffers(1, &VBO);
205 glGenBuffers(1, &EBO);
206 glGenTextures(1, &Tex);
209 Model = glm::mat4(1.0f);
211 textureSizeBuffer = 0;
213 textureWidthBuffer = 0;
216 VertexShader = glCreateShader(GL_VERTEX_SHADER);
217 const char *VertexSourceC = VertexShaderSource.c_str();
218 glShaderSource(VertexShader, 1, &VertexSourceC, &VertexShaderLength);
219 glCompileShader(VertexShader);
221 GLint isCompiled = 0;
222 glGetShaderiv(VertexShader, GL_COMPILE_STATUS, &isCompiled);
223 if (isCompiled == GL_FALSE) {
225 glGetShaderiv(VertexShader, GL_INFO_LOG_LENGTH, &maxLength);
227 std::vector<GLchar> errorLog(maxLength);
228 glGetShaderInfoLog(VertexShader, maxLength, &maxLength, &errorLog[0]);
230 for (glm::uint i = 0; i < errorLog.size(); i++)
231 std::cout << errorLog.at(i);
233 std::cout << std::endl;
238 FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
239 const char *FragmentSourceC = FragmentShaderSource.c_str();
240 glShaderSource(FragmentShader, 1, &FragmentSourceC, &FragmentShaderLength);
241 glCompileShader(FragmentShader);
244 glGetShaderiv(FragmentShader, GL_COMPILE_STATUS, &isCompiled);
245 if (isCompiled == GL_FALSE) {
247 glGetShaderiv(FragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
249 std::vector<GLchar> errorLog(maxLength);
250 glGetShaderInfoLog(FragmentShader, maxLength, &maxLength, &errorLog[0]);
252 for (glm::uint i = 0; i < errorLog.size(); i++)
253 std::cout << errorLog.at(i);
255 std::cout << std::endl;
260 glEnable(GL_PROGRAM_POINT_SIZE);
267 glActiveTexture(GL_TEXTURE0);
268 glBindTexture(GL_TEXTURE_2D, Tex);
269 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, Textures);
270 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
271 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
272 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
273 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
277 glActiveTexture(GL_TEXTURE0);
278 glBindTexture(GL_TEXTURE_2D, Tex);
279 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, textureWidth, textureHeight, 0, GL_RED, GL_UNSIGNED_BYTE, Textures);
280 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
281 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
282 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
283 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
284 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
288 FragmentShaderSource = this->LoadShader(fileName);
289 FragmentShaderLength = FragmentShaderSource.length();
293 VertexShaderSource = this->LoadShader(fileName);
294 VertexShaderLength = VertexShaderSource.length();
303 this->VerticesBuffer.push_back(vertex);
307 this->ElementsBuffer.push_back(element);
311 return (this->VerticesBuffer.size()) / (this->VerticesSize);
315 shaderProgram = glCreateProgram();
316 glAttachShader(shaderProgram, VertexShader);
317 glAttachShader(shaderProgram, FragmentShader);
318 glBindFragDataLocation(shaderProgram, 0,
"outColor");
319 glLinkProgram(shaderProgram);
320 glUseProgram(shaderProgram);
324 this->VerticesSize = size;
328 return this->VerticesBuffer.size();
340 TexturesBuffer.push_back(texture);
342 textureWidthBuffer += texture->width;
353 return textureHeight;
357 return TexturesBuffer[index]->width;
362 for(
int i = 0; i < index+1; i++)
363 sum += TexturesBuffer[i]->width;
369 textureHeight = textheight;
373 GLuint uniform = glGetUniformLocation(shaderProgram,
"Model");
374 glUniformMatrix4fv(uniform, 1, GL_FALSE, glm::value_ptr(Model));
379 glm::vec3(0.0, 0.0, 1.0f),
380 glm::vec3(0.0f, 0.0f, 0.0f),
381 glm::vec3(0.0f, 1.0f, 0.0f)
383 GLint uniView = glGetUniformLocation(shaderProgram,
"View");
384 glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(View));
388 Projection = glm::perspective(glm::radians(60.0f), (
float) width / (
float) height, 0.1f, 10.0f);
389 GLint uniProj = glGetUniformLocation(shaderProgram,
"Projection");
390 glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(
Projection));
393 void AddAttrib(std::string attribName, GLint length, GLuint type,
size_t positionOffset) {
394 GLint attrib = glGetAttribLocation(shaderProgram, attribName.c_str());
395 glEnableVertexAttribArray(attrib);
396 glVertexAttribPointer(attrib, length, type, GL_FALSE, VerticesSize *
sizeof(GLfloat), (
void *) positionOffset);
400 GLuint uniform = glGetUniformLocation(shaderProgram, uniformName.c_str());
401 glUniform1f(uniform, value);
413 return this->shaderProgram;
429 glDrawElements(GL_TRIANGLES, (GLsizei) Elements.size(), GL_UNSIGNED_INT, 0);
433 glDeleteProgram(shaderProgram);
434 glDeleteShader(FragmentShader);
435 glDeleteShader(VertexShader);
437 glDeleteBuffers(1, &EBO);
438 glDeleteBuffers(1, &VBO);
440 glDeleteVertexArrays(1, &VAO);
446 #endif //LIBOSMSCOUT_OPENGLMAPDATA_H void BindBuffers()
Definition: OpenGLMapData.h:197
const glm::mat4 & GetView() const
Definition: OpenGLMapData.h:420
~OpenGLTexture()
Definition: OpenGLMapData.h:45
Definition: OpenGLMapData.h:53
void LoadProgram()
Definition: OpenGLMapData.h:314
void LoadGreyTextures()
Definition: OpenGLMapData.h:276
Definition: OpenGLMapData.h:36
void SwapData(int stride)
Definition: OpenGLMapData.h:158
size_t width
Definition: OpenGLMapData.h:38
void SetModel()
Definition: OpenGLMapData.h:372
GLuint getShaderProgram()
Definition: OpenGLMapData.h:412
size_t size
Definition: OpenGLMapData.h:40
GLuint GetTexture()
Definition: OpenGLMapData.h:408
void Draw()
Definition: OpenGLMapData.h:428
size_t height
Definition: OpenGLMapData.h:39
void AddNewElement(GLuint element)
Definition: OpenGLMapData.h:306
void LoadVertexShader(std::string fileName)
Definition: OpenGLMapData.h:292
Definition: Projection.h:43
~OpenGLMapData()
Definition: OpenGLMapData.h:432
int GetTextureWidth()
Definition: OpenGLMapData.h:348
int GetTextureHeight()
Definition: OpenGLMapData.h:352
int GetVerticesNumber()
Definition: OpenGLMapData.h:310
void AddUniform(std::string uniformName, float value)
Definition: OpenGLMapData.h:399
void SwapData()
Definition: OpenGLMapData.h:126
void clearData()
Definition: OpenGLMapData.h:188
void LoadFragmentShader(std::string fileName)
Definition: OpenGLMapData.h:287
void SetProjection(float width, float height)
Definition: OpenGLMapData.h:387
void SetVerticesSize(int size)
Definition: OpenGLMapData.h:323
int GetNumOfVertices()
Definition: OpenGLMapData.h:327
void SetView(float, float)
Definition: OpenGLMapData.h:377
const glm::mat4 & GetModel() const
Definition: OpenGLMapData.h:416
size_t fromOriginY
Definition: OpenGLMapData.h:43
int GetTextureWidthSum(int index)
Definition: OpenGLMapData.h:360
void AddNewVertex(GLfloat vertex)
Definition: OpenGLMapData.h:302
void SetTextureHeight(int textheight)
Definition: OpenGLMapData.h:368
void LoadVertices()
Definition: OpenGLMapData.h:297
void LoadTextures()
Definition: OpenGLMapData.h:266
void AddNewTexture(OpenGLTextureRef texture)
Definition: OpenGLMapData.h:339
const glm::mat4 & GetProjection() const
Definition: OpenGLMapData.h:424
bool InitContext()
Definition: OpenGLMapData.h:201
std::shared_ptr< OpenGLTexture > OpenGLTextureRef
Definition: OpenGLMapData.h:51
void AddAttrib(std::string attribName, GLint length, GLuint type, size_t positionOffset)
Definition: OpenGLMapData.h:393
GLuint getVAO()
Definition: OpenGLMapData.h:404
int GetTextureWidth(int index)
Definition: OpenGLMapData.h:356
unsigned char * data
Definition: OpenGLMapData.h:41