ImpostorSpheres::ImpostorSpheres(): num_balls(1000000){ mode = GL_TRIANGLE_STRIP; glGenVertexArrays(1, &vertexArrayObjectHandle); glBindVertexArray(vertexArrayObjectHandle); GLuint positionBuffer; glGenBuffers(1, &positionBuffer); glBindBuffer(GL_ARRAY_BUFFER, positionBuffer); GLfloat positions[] = { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f }; std::vector<GLfloat> instance_colors; std::vector<GLfloat> instance_positions; for (int i = 0; i < num_balls*4; i+=4) { instance_colors.push_back(r_pos(1.0)); instance_colors.push_back(r_pos(1.0)); instance_colors.push_back(r_pos(1.0)); instance_colors.push_back(1); instance_positions.push_back(r_equ(30)); instance_positions.push_back(r_equ(30)); instance_positions.push_back(r_equ(30)); instance_positions.push_back(1 + r_equ(0.5)); } glBufferData(GL_ARRAY_BUFFER, sizeof(positions) + sizeof(GLfloat) * instance_colors.size() + sizeof(GLfloat) * instance_positions.size(), NULL, GL_STATIC_DRAW); GLuint offset = 0; glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(positions), positions); offset += sizeof(positions); glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(GLfloat) * instance_colors.size(), &instance_colors[0]); offset += sizeof(GLfloat) * instance_colors.size(); glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(GLfloat) * instance_positions.size(), &instance_positions[0]); offset += sizeof(GLfloat) * instance_positions.size(); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)sizeof(positions)); glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(positions) + sizeof(GLfloat) * instance_colors.size())); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glVertexAttribDivisor(0,0); glVertexAttribDivisor(1,1); glVertexAttribDivisor(2,1); }
void set_random_goal() { std::uniform_real_distribution<float> r_pos(-WORLD_SIZE, +WORLD_SIZE); goal = { r_pos(s_rnd), r_pos(s_rnd) }; }
void InstancedMeshExample::dumpSceneToVAO(const aiScene *scene) { GLuint vbo[4]; glGenBuffers(4, vbo); glGenVertexArrays(1, &vertexArrayObjectHandle); glBindVertexArray(vertexArrayObjectHandle); count = 0; GLuint vertexCount = 0; for(int i = 0; i < scene->mNumMeshes; i++) { aiMesh* mesh = scene->mMeshes[i]; count += mesh->mNumFaces * 3; vertexCount += mesh->mNumVertices; } GLfloat* positions = new GLfloat[vertexCount * 3]; GLfloat* normals = new GLfloat[vertexCount * 3]; GLfloat* uvs = new GLfloat[vertexCount * 2]; GLuint* indices = new GLuint[count]; int current_p = 0; int current_n = 0; int current_uv = 0; int current_i = 0; for(int i = 0; i < scene->mNumMeshes; i++) { aiMesh* mesh = scene->mMeshes[i]; for(int i = 0; i < mesh->mNumVertices; i++) { positions[current_p++] = mesh->mVertices[i].x; positions[current_p++] = mesh->mVertices[i].y; positions[current_p++] = mesh->mVertices[i].z; } for(int i = 0; i < mesh->mNumVertices; i++) { uvs[current_uv++] = mesh->mTextureCoords[0][i].x; uvs[current_uv++] = mesh->mTextureCoords[0][i].y; } for(int i = 0; i < mesh->mNumVertices; i++) { normals[current_n++] = mesh->mNormals[i].x; normals[current_n++] = mesh->mNormals[i].y; normals[current_n++] = mesh->mNormals[i].z; } for(int i = 0; i < mesh->mNumFaces; i++) { indices[current_i++] = mesh->mFaces[i].mIndices[0]; indices[current_i++] = mesh->mFaces[i].mIndices[1]; indices[current_i++] = mesh->mFaces[i].mIndices[2]; } } glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); glBufferData(GL_ARRAY_BUFFER, 3 * vertexCount * sizeof(GLfloat), positions, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray (0); glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); glBufferData(GL_ARRAY_BUFFER, 2 * vertexCount * sizeof(GLfloat), uvs, GL_STATIC_DRAW); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray (1); glBindBuffer(GL_ARRAY_BUFFER, vbo[2]); glBufferData(GL_ARRAY_BUFFER, 3 * vertexCount * sizeof(GLfloat), normals, GL_STATIC_DRAW); glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray (2); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[3]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * count * sizeof(GLuint), indices, GL_STATIC_DRAW); glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray (3); std::vector<GLfloat> instance_colors; std::vector<GLfloat> instance_positions; for (int i = 0; i < num_balls*4; i+=4) { instance_colors.push_back(r_pos(1.0)); instance_colors.push_back(r_pos(1.0)); instance_colors.push_back(r_pos(1.0)); instance_colors.push_back(1); instance_positions.push_back(r(30)); instance_positions.push_back(r(30)); instance_positions.push_back(r(30)); instance_positions.push_back(abs(1 + r(0.4)) / 2.0f); } glBindBuffer(GL_ARRAY_BUFFER, vbo[4]); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instance_colors.size(), &instance_colors[0], GL_STATIC_DRAW); glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray (4); glBindBuffer(GL_ARRAY_BUFFER, vbo[5]); glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instance_positions.size(), &instance_positions[0], GL_STATIC_DRAW); glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray (5); glVertexAttribDivisor(4,1); glVertexAttribDivisor(5,1); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); delete positions; delete normals; delete uvs; delete indices; }