Program Listing for File StaticMesh.hpp

Return to documentation for file (include/lvr2/display/StaticMesh.hpp)

 /*
 * StaticMesh.h
 *
 *  Created on: 12.11.2008
 *      Author: Thomas Wiemann
 */

#ifndef STATICMESH_H_
#define STATICMESH_H_

#ifdef WIN32
#pragma warning(disable: 4996)
#endif

#include <stdlib.h>
#include <string>
#include <string.h>
#include <sstream>

#ifdef _MSC_VER
#include <Windows.h>
#endif

#ifndef __APPLE__
#include <GL/gl.h>
#else
#include <OpenGL/gl.h>
#endif

#include "lvr2/display/Renderable.hpp"
#include "lvr2/geometry/BoundingBox.hpp"


namespace lvr2
{

enum
{
    RenderSurfaces            = 0x01,
    RenderTriangles           = 0x02,
    RenderSurfaceNormals      = 0x04,
    RenderVertexNormals       = 0x08,
    RenderColors              = 0x10,
};

class StaticMesh : public Renderable
{
public:
    StaticMesh();
    StaticMesh( ModelPtr model, string name=""); // <unnamed static mesh>" );
    StaticMesh( MeshBufferPtr buffer, string name=""); //<unnamed static mesh>" );

    StaticMesh(const StaticMesh &o);
    ~StaticMesh();
    inline void render();

    virtual void finalize();
    virtual void savePLY(std::string filename);
    virtual void setName(std::string name);

    floatArr        getVertices();
    uintArr         getIndices();
    float*          getNormals();

    size_t          getNumberOfVertices();
    size_t          getNumberOfFaces();

    void setRenderMode(int mode) { m_renderMode = mode;}
    int  getRenderMode() { return m_renderMode;}

private:

    void init( MeshBufferPtr mesh );

    void interpolateNormals();
    void setDefaultColors();
    void calcBoundingBox();

protected:

    //void compileDisplayLists();
    void compileColoredMeshList();
    void compileWireframeList();
    void compileNameList();

    void setColorMaterial(float r, float g, float b);


    void readPly(std::string filename);

    floatArr        m_normals;
    float*          m_faceNormals;
    floatArr        m_vertices;
    ucharArr        m_colors;
    unsigned char*  m_blackColors;

    indexArray      m_faces;

    bool            m_finalized;
    bool            m_haveMaterials;

    size_t          m_numVertices;
    size_t          m_numFaces;
    size_t          m_numMaterials;

    int             m_renderMode;


    int             m_coloredMeshList;
    int             m_wireframeList;
    int             m_nameList;

};

void StaticMesh::render(){

    if(m_active)
    {
        if(m_finalized){
            glPushMatrix();
            glMultMatrixf(m_transformation.getData());
            if(m_renderMode & RenderSurfaces)
            {
                glEnable(GL_LIGHTING);
                glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
                glCallList(m_coloredMeshList);
                glCallList(m_nameList);
            }

            if(m_renderMode & RenderTriangles)
            {
                glDisable(GL_LIGHTING);
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
                glLineWidth(m_lineWidth);
                glColor3f(0.0, 0.0, 0.0);
                glCallList(m_wireframeList);
                glEnable(GL_LIGHTING);
            }
            glPopMatrix();

        }
    }
}

} // namespace lvr2

#endif /* STATICMESH_H_ */