Subversion Repositories gelsvn

Rev

Rev 393 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 *  wireframe.cpp
 *  GEL
 *
 *  Created by J. Andreas Bærentzen on 05/08/08.
 *  Copyright 2008 __MyCompanyName__. All rights reserved.
 *
 */
#include <iostream>
#include <CGLA/Vec3f.h>
#include <GLGraphics/glsl_shader.h>
#include "wireframe.h"
#include <HMesh/FaceCirculator.h>

using namespace HMesh;
using namespace std;
using namespace CGLA;
using namespace GLGraphics;

namespace 
{
        GLuint wire_prog_hex, wire_prog_generic;
        GLuint texid=-1;
}

void initialize_generic()
{
        // Create shaders directly from file
        GLuint vs = create_glsl_shader(GL_VERTEX_SHADER, "/Users/jab/GEL/apps/MeshEdit", "wire-generic.vert");
        GLuint gs = create_glsl_shader(GL_GEOMETRY_SHADER_EXT, "/Users/jab/GEL/apps/MeshEdit", "wire-generic.geom");
        GLuint fs = create_glsl_shader(GL_FRAGMENT_SHADER, "/Users/jab/GEL/apps/MeshEdit", "wire-generic.frag");
        
        // Create the program
        wire_prog_generic = glCreateProgram();
        
        // Attach all shaders
        if(vs) glAttachShader(wire_prog_generic, vs);
        if(gs) glAttachShader(wire_prog_generic, gs);
        if(fs) glAttachShader(wire_prog_generic, fs);
        
        // Specify input and output for the geometry shader. Note that this must be
        // done before linking the program.
        glProgramParameteriEXT(wire_prog_generic,GL_GEOMETRY_INPUT_TYPE_EXT,GL_POINTS);
        glProgramParameteriEXT(wire_prog_generic,GL_GEOMETRY_VERTICES_OUT_EXT,20);
        glProgramParameteriEXT(wire_prog_generic,GL_GEOMETRY_OUTPUT_TYPE_EXT,GL_TRIANGLE_STRIP);
        
        // Link the program object and print out the info log
        glLinkProgram(wire_prog_generic);
        
        glGenTextures(1,&texid);
        glEnable(GL_TEXTURE_RECTANGLE_ARB);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texid);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
        
}

void initialize_hex()
{
        // Create shaders directly from file
        GLuint vs = create_glsl_shader(GL_VERTEX_SHADER, "/Users/jab/GEL/apps/MeshEdit", "wire-hex.vert");
        GLuint gs = create_glsl_shader(GL_GEOMETRY_SHADER_EXT, "/Users/jab/GEL/apps/MeshEdit", "wire-hex.geom");
        GLuint fs = create_glsl_shader(GL_FRAGMENT_SHADER, "/Users/jab/GEL/apps/MeshEdit", "wire-hex.frag");
        
        // Create the program
        wire_prog_hex = glCreateProgram();
        
        // Attach all shaders
        if(vs) glAttachShader(wire_prog_hex, vs);
        if(gs) glAttachShader(wire_prog_hex, gs);
        if(fs) glAttachShader(wire_prog_hex, fs);
        
        // Specify input and output for the geometry shader. Note that this must be
        // done before linking the program.
        glProgramParameteriEXT(wire_prog_hex,GL_GEOMETRY_INPUT_TYPE_EXT,GL_TRIANGLES_ADJACENCY_EXT);
        glProgramParameteriEXT(wire_prog_hex,GL_GEOMETRY_VERTICES_OUT_EXT,6);
        glProgramParameteriEXT(wire_prog_hex,GL_GEOMETRY_OUTPUT_TYPE_EXT,GL_TRIANGLE_STRIP);
        
        // Link the program object and print out the info log
        glLinkProgram(wire_prog_hex);   
}

void initialize_wireframe_shaders()
{
        static bool washere = false;
        if(!washere)
        {
                washere = true;
                initialize_generic();
                initialize_hex();
        }
}

void draw_as_wire(Manifold& m, bool per_vertex_norms)
{

        GLint vpdim[4];
        glGetIntegerv(GL_VIEWPORT,vpdim); 
        
        glUseProgram(wire_prog_hex);
        
        GLuint no_edges_attrib = glGetAttribLocationARB(wire_prog_hex, "no_edges");
        
        // Set the value of a uniform
        glUniform2f(glGetUniformLocation(wire_prog_hex,"WIN_SCALE"), 
                                static_cast<float>(vpdim[2]/2), static_cast<float>(vpdim[3]/2));

        glBegin(GL_TRIANGLES_ADJACENCY_EXT);
        for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
        {
                glNormal3fv(normal(f).get());
                glVertexAttrib1f(no_edges_attrib, no_edges(f));
                FaceCirculator fc(f);
                for(int i=0;i<6;++i)
                {
                        glVertex3fv(fc.get_vertex()->pos.get());
                        if(!fc.end()) ++fc;
                }
        }
        glEnd();
        glUseProgram(0);
        
        /*/
        int total_vertices = 0;
        for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
                total_vertices += no_edges(f);
        
        vector<Vec3f> mesh_tex(ceil(total_vertices*1.01/4096)*4096);
        vector<Vec3i> face_idx(m.no_faces());
        vector<Vec3f> normals(m.no_faces());
        int column=0;
        int row=0;
        for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
        {
                int N = no_edges(f);
                if( (N + column) >= 4096)
                {
                        ++row;
                        column = 0;
                }
                face_idx.push_back(Vec3i(column, row, N));
                normals.push_back(normal(f));
                for(FaceCirculator fc(f); !fc.end(); ++fc)
                {
                        mesh_tex[column + row * 4096] = fc.get_vertex()->pos;
                        ++column;                       
                }
        }
        
        GLint vpdim[4];
        glGetIntegerv(GL_VIEWPORT,vpdim); 
        
        glUseProgram(wire_prog_generic);
        
        // Set the value of a uniform
        glUniform2f(glGetUniformLocation(wire_prog_generic,"WIN_SCALE"), 
                                static_cast<float>(vpdim[2]/2), static_cast<float>(vpdim[3]/2));
        glUniform1iARB(glGetUniformLocationARB(wire_prog_generic, "mesh_tex"),0);
        glEnable(GL_TEXTURE_RECTANGLE_ARB);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texid);
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,0,GL_RGB32F_ARB,4096,row+1,0,GL_RGB,GL_FLOAT,&mesh_tex[0]);
        
        glBegin(GL_POINTS);
        for(int i=0;i<face_idx.size(); ++i)
        {
                glNormal3fv(normals[i].get());
                glVertex3iv((const GLint*)face_idx[i].get());
        }
        glEnd();
        glUseProgram(0);
        glDisable(GL_TEXTURE_RECTANGLE_ARB);
*/
}