void ParticleSystemProxy::generateVAOs() { glGenVertexArrays(1, ¤t_rendering_vao); glGenVertexArrays(1, &non_current_rendering_vao); glGenVertexArrays(1, ¤t_simulation_vao); glGenVertexArrays(1, &non_current_simulation_vao); glBindVertexArray(current_simulation_vao); if (has_height_map) HeightmapSimulationBind(tfb_buffers[0], initial_values_buffer); else SimpleSimulationBind(tfb_buffers[0], initial_values_buffer); glBindVertexArray(non_current_simulation_vao); if (has_height_map) HeightmapSimulationBind(tfb_buffers[1], initial_values_buffer); else SimpleSimulationBind(tfb_buffers[1], initial_values_buffer); float *quaternions = new float[4 * count]; glBindVertexArray(0); if (flip) { for (unsigned i = 0; i < count; i++) { core::vector3df rotationdir(0., 1., 0.); quaternions[4 * i] = rotationdir.X; quaternions[4 * i + 1] = rotationdir.Y; quaternions[4 * i + 2] = rotationdir.Z; quaternions[4 * i + 3] = 3.14f * 3.f * (2.f * os::Randomizer::frand() - 1.f); // 3 half rotation during lifetime at max } glGenBuffers(1, &quaternionsbuffer); glBindBuffer(GL_ARRAY_BUFFER, quaternionsbuffer); glBufferData(GL_ARRAY_BUFFER, 4 * count * sizeof(float), quaternions, GL_STATIC_DRAW); } glBindVertexArray(current_rendering_vao); if (flip) FlipParticleVAOBind(tfb_buffers[0], quaternionsbuffer); else SimpleParticleVAOBind(tfb_buffers[0]); glBindVertexArray(non_current_rendering_vao); if (flip) FlipParticleVAOBind(tfb_buffers[1], quaternionsbuffer); else SimpleParticleVAOBind(tfb_buffers[1]); glBindVertexArray(0); delete[] quaternions; }
void ParticleSystemProxy::setFlip() { flip = true; float *quaternions = new float[4 * count]; for (unsigned i = 0; i < count; i++) { core::vector3df rotationdir(0., 1., 0.); quaternions[4 * i] = rotationdir.X; quaternions[4 * i + 1] = rotationdir.Y; quaternions[4 * i + 2] = rotationdir.Z; quaternions[4 * i + 3] = 3.14f * 3.f * (2.f * os::Randomizer::frand() - 1.f); // 3 half rotation during lifetime at max } glGenBuffers(1, &quaternionsbuffer); glBindBuffer(GL_ARRAY_BUFFER, quaternionsbuffer); glBufferData(GL_ARRAY_BUFFER, 4 * count * sizeof(float), quaternions, GL_STATIC_DRAW); delete[] quaternions; }