Blame | Last modification | View Log | RSS feed
#include "gel_gl.h"
#include "draw.h"
using namespace CGLA;
using namespace std;
namespace
{
void set_material(const Geometry::Material& material)
{
if(material.tex_id >=0)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, material.tex_id);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
else
glDisable(GL_TEXTURE_2D);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material.ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material.diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material.specular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, material.shininess);
}
}
void draw(const Geometry::TriMesh& tm)
{
int old_mat_idx = -1;
glBegin(GL_TRIANGLES);
for(int i=0;i<tm.geometry.no_faces();i++)
{
if(tm.mat_idx[i] != old_mat_idx)
{
glEnd();
set_material(tm.materials[tm.mat_idx[i]]);
glBegin(GL_TRIANGLES);
old_mat_idx = tm.mat_idx[i];
}
Vec3i n_face = tm.normals.face(i);
Vec3i g_face = tm.geometry.face(i);
Vec3i t_face = tm.texcoords.face(i);
for(int j=0;j<3;j++)
{
if(n_face != Geometry::NULL_FACE)
{
Vec3f norm = tm.normals.vertex(n_face[j]);
glNormal3fv(norm.get());
}
if(t_face != Geometry::NULL_FACE)
{
Vec3f texc = tm.texcoords.vertex(t_face[j]);
glTexCoord2fv(texc.get());
}
Vec3f vert = tm.geometry.vertex(g_face[j]);
glVertex3fv(vert.get());
}
}
glEnd();
glDisable(GL_TEXTURE_2D);
}