Blame projects/asteroid/mesh.h

Ivan Mahonin 223ac6
#ifndef MESH_H
Ivan Mahonin 223ac6
#define MESH_H
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
#include <vector>
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
#include "geometry.h"
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
class Mesh {
Ivan Mahonin 223ac6
public:
Ivan Mahonin 223ac6
    class Vertex {
Ivan Mahonin 223ac6
    public:
Ivan Mahonin 223ac6
        Vector3 pos;
Ivan Mahonin 223ac6
        Vector3 normal;
Ivan Mahonin 223ac6
        explicit inline Vertex(const Vector3 &pos = Vector3(), const Vector3 &normal = Vector3()):
Ivan Mahonin 223ac6
            pos(pos), normal(normal) { }
Ivan Mahonin 223ac6
    };
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    class Triangle {
Ivan Mahonin 223ac6
    public:
Ivan Mahonin 223ac6
        int v[3];
Ivan Mahonin 223ac6
        explicit inline Triangle(int v0 = 0, int v1 = 0, int v2 = 0)
Ivan Mahonin 223ac6
            { v[0] = v0; v[1] = v1; v[2] = v2; }
Ivan Mahonin 223ac6
    };
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    typedef std::vector<Vertex> VertexList;
Ivan Mahonin 223ac6
    typedef std::vector<Triangle> TriangleList;
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    VertexList vertices;
Ivan Mahonin 223ac6
    TriangleList triangles;
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    mutable unsigned int vbuf, ibuf, elements;
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    inline Mesh(): vbuf(), ibuf() { }
Ivan Mahonin 223ac6
    inline ~Mesh() { dirty(); }
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    void createbuf() const;
Ivan Mahonin 223ac6
    void dirty() const;
Ivan Mahonin 223ac6
    void clear();
Ivan Mahonin 223ac6
    void draw() const;
Ivan Mahonin 223ac6
};
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
class LinkedMesh {
Ivan Mahonin 223ac6
public:
Ivan Mahonin 223ac6
    class Vertex {
Ivan Mahonin 223ac6
    public:
Ivan Mahonin 223ac6
        Vector3 pos;
Ivan Mahonin 223ac6
        Real value;
Ivan Mahonin 223ac6
        explicit inline Vertex(const Vector3 &pos = Vector3(), Real value = Real()):
Ivan Mahonin 223ac6
            pos(pos), value(value) { }
Ivan Mahonin 223ac6
    };
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    class Edge {
Ivan Mahonin 223ac6
    public:
Ivan Mahonin 223ac6
        int v[3];
Ivan Mahonin 223ac6
        int e[2];
Ivan Mahonin 223ac6
        explicit inline Edge(int v0 = 0, int v2 = 0)
Ivan Mahonin 223ac6
            { v[0] = v0; v[1] = -1; v[2] = v2; e[0] = 0; e[1] = 0; }
Ivan Mahonin 223ac6
    };
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    class Triangle {
Ivan Mahonin 223ac6
    public:
Ivan Mahonin 223ac6
        int e[3];
Ivan Mahonin 223ac6
        bool d[3];
Ivan Mahonin 223ac6
        explicit inline Triangle(
Ivan Mahonin 223ac6
            int e0 = 0, bool d0 = false,
Ivan Mahonin 223ac6
            int e1 = 0, bool d1 = false,
Ivan Mahonin 223ac6
            int e2 = 0, bool d2 = false )
Ivan Mahonin 223ac6
        {
Ivan Mahonin 223ac6
            e[0] = e0; e[1] = e1; e[2] = e2;
Ivan Mahonin 223ac6
            d[0] = d0; d[1] = d1; d[2] = d2;
Ivan Mahonin 223ac6
        }
Ivan Mahonin 223ac6
    };
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    class Level {
Ivan Mahonin 223ac6
    public:
Ivan Mahonin 223ac6
        Real k;
Ivan Mahonin 223ac6
        int vertex0, vertex1;
Ivan Mahonin 223ac6
        int edge0, edge1;
Ivan Mahonin 223ac6
        int triangle0, triangle1;
Ivan Mahonin 223ac6
        Level():
Ivan Mahonin 223ac6
            k(1),
Ivan Mahonin 223ac6
            vertex0(), vertex1(),
Ivan Mahonin 223ac6
            edge0(), edge1(),
Ivan Mahonin 223ac6
            triangle0(), triangle1() { }
Ivan Mahonin 223ac6
    };
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    typedef std::vector<Vertex> VertexList;
Ivan Mahonin 223ac6
    typedef std::vector<Edge> EdgeList;
Ivan Mahonin 223ac6
    typedef std::vector<Triangle> TriangleList;
Ivan Mahonin 223ac6
    typedef std::vector<Level> LevelList;
Ivan Mahonin 223ac6
    typedef Vector3 (*VertexFunc)(const Vertex&, Real, Real);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    VertexList vertices;
Ivan Mahonin 223ac6
    EdgeList edges;
Ivan Mahonin 223ac6
    TriangleList triangles;
Ivan Mahonin 223ac6
    LevelList levels;
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    static Vertex average(const Vertex &a, const Vertex &b);
Ivan Mahonin 223ac6
    static Vector3 sphere_func(const Vertex &v, Real r, Real kr);
Ivan Mahonin 223ac6
    static Vector3 z_func(const Vertex &v, Real r, Real kr);
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    static Real random();
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    void check() const;
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    void clear();
Ivan Mahonin 223ac6
    void next_level(Real k);
Ivan Mahonin 223ac6
    void generate_level(Real k = sqrt2);
Ivan Mahonin 223ac6
    void generate_levels(int count, Real k = sqrt2);
Ivan Mahonin 223ac6
    void smooth();
Ivan Mahonin 223ac6
    void smooth(int count);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    void triangle(Real k = 1);
Ivan Mahonin 223ac6
    void tetrahedron(Real k = 1);
Ivan Mahonin 223ac6
    void icosahedron(Real k = 1);
Ivan Mahonin 223ac6
    
Ivan Mahonin 223ac6
    void to_mesh(Mesh &mesh, VertexFunc func, Real r = 0, Real kr = 1, int level = -1) const;
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
    inline void to_sphere_mesh(Mesh &mesh, Real r = 1, Real kr = 0.5, int level = -1) const
Ivan Mahonin 223ac6
        { to_mesh(mesh, &sphere_func, r, kr, level); }
Ivan Mahonin 223ac6
    inline void to_z_mesh(Mesh &mesh, Real r = 0, Real kr = 1, int level = -1) const
Ivan Mahonin 223ac6
        { to_mesh(mesh, &z_func, r, kr, level); }
Ivan Mahonin 223ac6
};
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
Ivan Mahonin 223ac6
#endif