Subversion Repositories gelsvn

Rev

Rev 324 | Rev 339 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
299 jrf 1
#include "CGLA/Mat4x4f.h"
2
 
167 jab 3
#include "gel_gl.h"
4
#include "draw.h"
331 jab 5
#include "HMesh/FaceCirculator.h"
167 jab 6
 
7
using namespace CGLA;
331 jab 8
using namespace HMesh;
167 jab 9
using namespace std;
10
 
11
namespace 
12
{
13
void set_material(const Geometry::Material& material)
14
{
15
    		if(material.tex_id >=0)
16
    			{
17
    				glEnable(GL_TEXTURE_2D);
18
    				glBindTexture(GL_TEXTURE_2D, material.tex_id);
19
    				glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
20
    			}
21
    		else
22
    			glDisable(GL_TEXTURE_2D);
23
 
24
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material.ambient);
25
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material.diffuse);
26
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material.specular);
27
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, material.shininess);
28
}
29
 
30
}
31
 
299 jrf 32
namespace GLGraphics
33
{
34
 
331 jab 35
void draw(Manifold& m, bool per_vertex_norms)
167 jab 36
{
331 jab 37
		for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
38
		{
39
				FaceCirculator fc(f);
40
				if(!per_vertex_norms) 
41
						glNormal3fv(normal(f).get());
42
				glBegin(GL_POLYGON);
43
				while(!fc.end())
44
				{
45
						Vec3f n = normal(fc.get_vertex());
46
						glNormal3fv(n.get());
47
						glVertex3fv(fc.get_vertex()->pos.get());
48
						++fc;
49
				}
50
				glEnd();
51
		}
52
}
53
 
54
 
55
void draw(const Geometry::TriMesh& tm, bool per_vertex_norms)
56
{
167 jab 57
    int old_mat_idx = -1;
58
    glBegin(GL_TRIANGLES);
59
    for(int i=0;i<tm.geometry.no_faces();i++)
60
    {
61
        if(tm.mat_idx[i] != old_mat_idx)
62
        {
63
            glEnd();
64
            set_material(tm.materials[tm.mat_idx[i]]);
65
            glBegin(GL_TRIANGLES);
66
            old_mat_idx = tm.mat_idx[i];
67
        }
68
        Vec3i n_face = tm.normals.face(i);
69
        Vec3i g_face = tm.geometry.face(i);
70
        Vec3i t_face = tm.texcoords.face(i);
331 jab 71
 
72
				if(!per_vertex_norms)
73
				{
74
            Vec3f vert0 = tm.geometry.vertex(g_face[0]);
75
            Vec3f vert1 = tm.geometry.vertex(g_face[1]);
76
            Vec3f vert2 = tm.geometry.vertex(g_face[2]);
77
						Vec3f norm = normalize(cross(vert1-vert0, vert2-vert0));
78
						glNormal3fv(norm.get());
79
				}
167 jab 80
        for(int j=0;j<3;j++)
81
        {
331 jab 82
						if(per_vertex_norms && n_face != Geometry::NULL_FACE)
83
								{
84
										Vec3f norm = tm.normals.vertex(n_face[j]);
85
										glNormal3fv(norm.get());
86
								}
167 jab 87
            if(t_face != Geometry::NULL_FACE)
88
            {
89
                Vec3f texc = tm.texcoords.vertex(t_face[j]);
90
                glTexCoord2fv(texc.get());
91
            }
92
            Vec3f vert = tm.geometry.vertex(g_face[j]);
93
            glVertex3fv(vert.get());
94
        }
95
    }
96
    glEnd();
97
    glDisable(GL_TEXTURE_2D);
98
}
299 jrf 99
 
100
void draw(const Geometry::AABox& box)
101
{
102
	glBegin(GL_QUADS);
103
	Vec3f norm_neg[] = {Vec3f(0,0,-1), Vec3f(-1,0,0), Vec3f(0,-1,0)};
104
	Vec3f norm_pos[] = {Vec3f(0,0, 1), Vec3f( 1,0,0), Vec3f(0, 1,0)};
105
	for(int j=0;j<3;++j)
106
		{
107
			glNormal3fv(norm_neg[j].get());
108
			Vec3f p = box.get_pmin();
109
			glVertex3f(p[0], p[1], p[2]);
110
			p[(j+1)%3] = box.get_pmax()[(j+1)%3];
111
			glVertex3f(p[0], p[1], p[2]);
112
			p[j] = box.get_pmax()[j];
113
			glVertex3f(p[0], p[1], p[2]);
114
			p[(j+1)%3] = box.get_pmin()[(j+1)%3];
115
			glVertex3f(p[0], p[1], p[2]);
116
		}
117
	glEnd();
118
	glBegin(GL_QUADS);
119
	for(int j=0;j<3;++j)
120
		{
121
			glNormal3fv(norm_pos[j].get());
122
			Vec3f p = box.get_pmax();
123
			glVertex3f(p[0], p[1], p[2]);
124
			p[j] = box.get_pmin()[j];
125
			glVertex3f(p[0], p[1], p[2]);
126
			p[(j+1)%3] = box.get_pmin()[(j+1)%3];
127
			glVertex3f(p[0], p[1], p[2]);
128
			p[j] = box.get_pmax()[j];
129
			glVertex3f(p[0], p[1], p[2]);
130
		}
131
	glEnd();
132
}
133
 
134
void draw(const Geometry::OBox& box)
135
{
136
	Mat4x4f m = identity_Mat4x4f();
137
	copy_matrix(box.get_rotation(), m);
138
	glPushMatrix();
139
	glMultMatrixf(m.get());
140
	draw(box.get_aabox());
141
	glPopMatrix();
142
}
143
 
144
/** Draw the tree. The first argument is the level counter, the second
145
	argument is the level at which to stop drawing. */
146
template <class BoxType>
147
void draw(const Geometry::BoundingINode<BoxType>& node, int level, int max_level)
148
{
149
  if(level == max_level)
150
  {
151
	draw(node); 
152
	return;
153
  }
321 jab 154
  node->left->draw(level + 1, max_level);
155
  node->right->draw(level + 1, max_level);  
299 jrf 156
}
157
 
158
template <class BoxType>
159
void draw(const Geometry::BoundingLNode<BoxType>& node, int level, int max_level)
160
{
161
#if USE_LEAF_BOXES
162
	draw(node); 
163
#endif
164
}
165
 
166
template <class BoxType>
167
void draw(const Geometry::BoundingTree<BoxType>& tree, int max_level)
168
{
169
  draw(*tree.root, 0, max_level);
170
}
171
 
324 jab 172
}