Пример #1
0
void ParticleSystemProxy::generateVAOs()
{
    glGenVertexArrays(1, &current_rendering_vao);
    glGenVertexArrays(1, &non_current_rendering_vao);
    glGenVertexArrays(1, &current_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;
}
Пример #2
0
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;
}