Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Dependencies\glew\glew.h"
- #include "Dependencies\freeglut\freeglut.h"
- #include <iostream>
- #include <vector>
- #include "Shader_Loader.h"
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- #define BUFFER_OFFSET(offset) ((void*)(offset))
- GLuint SolidSphere(float radius, int slices, int stacks)
- {
- using namespace glm;
- using namespace std;
- const float pi = 3.1415926535897932384626433832795f;
- const float _2pi = 2.0f * pi;
- vector<vec4> positions;
- vector<vec4> normals;
- vector<vec2> textureCoords;
- for (int i = 0; i <= stacks; ++i)
- {
- // wspolrzedna tekstury v
- float V = i / (float)stacks;
- float phi = V * pi;
- for (int j = 0; j <= slices; ++j)
- {
- // wspolrzedna tekstury u
- float U = j / (float)slices;
- float theta = U * _2pi;
- float X = cos(theta) * sin(phi);
- float Y = cos(phi);
- float Z = sin(theta) * sin(phi);
- positions.push_back(vec4(X, Y, Z, 1.0) * radius);
- normals.push_back(vec4(X, Y, Z, 0.0));
- textureCoords.push_back(vec2(U, V));
- }
- }
- // bufor indeksow
- vector<GLuint> indicies;
- for (int i = 0; i < slices * stacks + slices; ++i)
- {
- indicies.push_back(i);
- indicies.push_back(i + slices + 1);
- indicies.push_back(i + slices);
- indicies.push_back(i + slices + 1);
- indicies.push_back(i);
- indicies.push_back(i + 1);
- }
- GLuint vao;
- glGenVertexArrays(1, &vao);
- glBindVertexArray(vao);
- GLuint vbos[4];
- glGenBuffers(4, vbos);
- glBindBuffer(GL_ARRAY_BUFFER, vbos[0]);
- glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(vec4), positions.data(), GL_STATIC_DRAW);
- glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
- glEnableVertexAttribArray(0);
- glBindBuffer(GL_ARRAY_BUFFER, vbos[1]);
- glBufferData(GL_ARRAY_BUFFER, textureCoords.size() * sizeof(vec2), textureCoords.data(), GL_STATIC_DRAW);
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
- glEnableVertexAttribArray(1);
- glBindBuffer(GL_ARRAY_BUFFER, vbos[2]);
- glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(vec4), normals.data(), GL_STATIC_DRAW);
- glVertexAttribPointer(2, 4, GL_FLOAT, GL_TRUE, 0, BUFFER_OFFSET(0));
- glEnableVertexAttribArray(2);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos[3]);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(GLuint), indicies.data(), GL_STATIC_DRAW);
- glBindVertexArray(0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- return vao;
- }
- GLuint LoadTexture(const std::string& file)
- {
- GLuint textureId = SOIL_load_OGL_texture(file.c_str(), SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);
- glBindTexture(GL_TEXTURE_2D, textureId);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glBindTexture(GL_TEXTURE_2D, 0);
- return textureId;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement