Blame projects/asteroid/scene.cpp

Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
#include <cstdlib>
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
#include <GL/gl.h>
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
#include "scene.h"
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Scene::Scene():
Ivan Mahonin 223ac6
    stars_seed(rand()),
Ivan Mahonin 223ac6
    offset(0, 0, -10),
Ivan Mahonin 223ac6
    angles(45.0, 0.0, 30.0),
Ivan Mahonin 223ac6
    wireframe(false),
Ivan Mahonin 223ac6
    water_level(1),
Ivan Mahonin 223ac6
    t(0)
Ivan Mahonin 223ac6
{
Ivan Mahonin 223ac6
    LinkedMesh lsphere;
Ivan Mahonin 223ac6
    lsphere.icosahedron(0);
Ivan Mahonin 223ac6
    lsphere.generate_levels(3);
Ivan Mahonin 223ac6
    lsphere.to_sphere_mesh(sphere, 1, 0);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    generate();
Ivan Mahonin 223ac6
}
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Scene::~Scene() { }
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
void Scene::generate() {
Ivan Mahonin 223ac6
    mesh.clear();
Ivan Mahonin 223ac6
    LinkedMesh linked_mesh;
Ivan Mahonin 223ac6
    //linked_mesh.triangle();
Ivan Mahonin 223ac6
    //linked_mesh.tetrahedron();
Ivan Mahonin 223ac6
    linked_mesh.icosahedron();
Ivan Mahonin 223ac6
    linked_mesh.generate_levels(2, 1);
Ivan Mahonin 223ac6
    linked_mesh.generate_levels(5, 0.5);
Ivan Mahonin 223ac6
    linked_mesh.smooth();
Ivan Mahonin 223ac6
    //linked_mesh.to_z_mesh(mesh, 0, 0.1);
Ivan Mahonin 223ac6
    linked_mesh.to_sphere_mesh(mesh, 1, 0.2);
Ivan Mahonin 223ac6
}
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
void Scene::update(Real dt) {
Ivan Mahonin 223ac6
    t += dt;
Ivan Mahonin 223ac6
    water_level = 1.05 + 0.025*sin(3*t/2/pi);
Ivan Mahonin 223ac6
}
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
void Scene::draw_stars() {
Ivan Mahonin 223ac6
    unsigned int seed = rand();
Ivan Mahonin 223ac6
    srand(stars_seed);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    glEnable(GL_FOG);
Ivan Mahonin 223ac6
    glFogf(GL_FOG_DENSITY, 0.02f);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    glColor4d(1, 1, 1, 1);
Ivan Mahonin 223ac6
    glBegin(GL_POINTS);
Ivan Mahonin 223ac6
    for(int i = 0; i < 1000; ++i) {
Ivan Mahonin 223ac6
        glVertex3d(
Ivan Mahonin 223ac6
            real_random2()*100.0,
Ivan Mahonin 223ac6
            real_random2()*100.0,
Ivan Mahonin 223ac6
            real_random2()*100.0 );
Ivan Mahonin 223ac6
    }
Ivan Mahonin 223ac6
    glEnd();
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    glDisable(GL_FOG);
Ivan Mahonin 223ac6
    srand(seed);
Ivan Mahonin 223ac6
}
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
void Scene::draw() {
Ivan Mahonin 223ac6
    glPushMatrix();
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    glTranslated(offset.x, offset.y, offset.z);
Ivan Mahonin 223ac6
    glRotated(-90, 1, 0, 0);
Ivan Mahonin 223ac6
    glRotated(angles.y, 0, 1, 0);
Ivan Mahonin 223ac6
    glRotated(angles.x, 1, 0, 0);
Ivan Mahonin 223ac6
    glRotated(angles.z, 0, 0, 1);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    glEnable(GL_DEPTH_TEST);
Ivan Mahonin 223ac6
    glEnable(GL_BLEND);
Ivan Mahonin 223ac6
    //glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    draw_stars();
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    glEnable(GL_LIGHTING);
Ivan Mahonin 223ac6
    if (wireframe) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    glColor4d(0, 0.5, 0, 1);
Ivan Mahonin 223ac6
    mesh.draw();
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    // water
Ivan Mahonin 223ac6
    glDisable(GL_LIGHTING);
Ivan Mahonin 223ac6
    glDepthMask(GL_FALSE);
Ivan Mahonin 223ac6
    glColor4d(0, 0, 1, 0.2);
Ivan Mahonin 223ac6
    for(int i = 10; i > 0; --i) {
Ivan Mahonin 223ac6
        Real s = water_level - 0.01*i;
Ivan Mahonin 223ac6
        glPushMatrix();
Ivan Mahonin 223ac6
        glScaled(s, s, s);
Ivan Mahonin 223ac6
        sphere.draw();
Ivan Mahonin 223ac6
        glPopMatrix();
Ivan Mahonin 223ac6
    }
Ivan Mahonin 223ac6
    glDepthMask(GL_TRUE);
Ivan Mahonin 223ac6
    glEnable(GL_LIGHTING);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    glColor4d(0, 0, 1, 0.5);
Ivan Mahonin 223ac6
    glPushMatrix();
Ivan Mahonin 223ac6
    glScaled(water_level, water_level, water_level);
Ivan Mahonin 223ac6
    sphere.draw();
Ivan Mahonin 223ac6
    glPopMatrix();
Ivan Mahonin 223ac6
    glColor4d(1, 1, 1, 1);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    // fog
Ivan Mahonin 223ac6
    glDisable(GL_LIGHTING);
Ivan Mahonin 223ac6
    glDepthMask(GL_FALSE);
Ivan Mahonin 223ac6
    glColor4d(1, 1, 1, 0.01);
Ivan Mahonin 223ac6
    for(int i = 1; i < 20; ++i) {
Ivan Mahonin 223ac6
        Real s = water_level + 0.01*i;
Ivan Mahonin 223ac6
        glPushMatrix();
Ivan Mahonin 223ac6
        glScaled(s, s, s);
Ivan Mahonin 223ac6
        sphere.draw();
Ivan Mahonin 223ac6
        glPopMatrix();
Ivan Mahonin 223ac6
    }
Ivan Mahonin 223ac6
    glDepthMask(GL_TRUE);
Ivan Mahonin 223ac6
    glEnable(GL_LIGHTING);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
Ivan Mahonin 223ac6
    glDisable(GL_LIGHTING);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Ivan Mahonin 223ac6
    glDisable(GL_BLEND);
Ivan Mahonin 223ac6
    glPopMatrix();
Ivan Mahonin 223ac6
}