Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
399 jab 1
/*
2
 *  WireframeRenderer.cpp
3
 *  GEL
4
 *
5
 *  Created by J. Andreas Bærentzen on 20/09/08.
6
 *  Copyright 2008 __MyCompanyName__. All rights reserved.
7
 *
8
 */
9
 
10
#include <algorithm>
11
#include <string>
12
#include "Renderer.h"
13
#include <GLGraphics/glsl_shader.h>
14
 
15
using namespace GLGraphics;
16
using namespace CGLA;
17
using namespace HMesh;
18
using namespace std;
19
 
20
int WireframeRenderer::maximum_face_valency(HMesh::Manifold& m)
21
{
22
	int max_val = 0;
23
	for(FaceIter f = m.faces_begin(); f != m.faces_end(); ++f)
24
		max_val = max(max_val, no_edges(f));
25
	return max_val;
26
}
27
 
28
 
29
WireframeRenderer::WireframeRenderer(HMesh::Manifold& m, bool flat): idbuff_renderer(0)
30
{
31
	if(GLEW_EXT_geometry_shader4 && maximum_face_valency(m) > 3)
32
	{
33
		GLint viewp[4];
34
		glGetIntegerv(GL_VIEWPORT,viewp);
35
		idbuff_renderer = new IDBufferWireframeRenderer(viewp[2], viewp[3], m);
36
	}
37
	else
38
	{
39
		glNewList(display_list,GL_COMPILE);
40
		if(GLEW_EXT_geometry_shader4)
41
			draw_triangles_in_wireframe(m,flat, Vec3f(1,0,0));				
42
		else
43
			draw_wireframe_oldfashioned(m,flat, Vec3f(1,0,0));
44
		glEndList();
45
	}
46
}
47
 
48
void WireframeRenderer::draw()
49
{
50
	if(idbuff_renderer)
51
		idbuff_renderer->draw(Vec3f(1,0,0),Vec3f(0.5)); 
52
	else
53
		glCallList(display_list);
54
}
55
 
56
SimpleShaderRenderer::SimpleShaderRenderer(HMesh::Manifold& m, const std::string& vss, const std::string& fss)
57
{
58
	vs = create_glsl_shader(GL_VERTEX_SHADER, vss);
59
	print_glsl_program_log(vs);
60
	fs = create_glsl_shader(GL_FRAGMENT_SHADER, fss);
61
	print_glsl_program_log(fs);
62
 
63
	prog = glCreateProgram();
64
 
65
	if(vs) glAttachShader(prog, vs);
66
	if(fs) glAttachShader(prog, fs);
67
 
68
	glLinkProgram(prog);
69
	print_glsl_program_log(prog);
70
	glNewList(display_list,GL_COMPILE);
71
	GLGraphics::draw(m, true);
72
	glEndList();
73
}
74
 
75
void SimpleShaderRenderer::draw()
76
{
77
	GLint old_prog;
78
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
79
	glUseProgram(prog);
80
	glCallList(display_list);
81
	glUseProgram(old_prog);
82
}
83
 
84
const string ReflectionLineRenderer::vss = 
85
"varying vec3 n;\n"
86
"varying vec3 v;\n"
87
"\n"
88
"void main(void)\n"
89
"{\n"
90
"	gl_Position = ftransform();\n"
91
"	v = vec3(gl_ModelViewMatrix * gl_Vertex);\n"
92
"	n = normalize(gl_NormalMatrix * gl_Normal);\n"
93
"}\n";
94
 
95
 
96
const string ReflectionLineRenderer::fss = 
97
"uniform float detail;\n"
98
"\n"
99
"varying vec3 n;\n"
100
"varying vec3 v;\n"
101
"\n"
102
"void main(void)\n"
103
"{\n"
104
"	// calculate the reflection\n"
105
"	vec3 r = normalize(2.0*dot(-v, n)*n + v);\n"
106
"	\n"
107
"	vec2 r2 = normalize(vec2(r[0], r[2]));\n"
108
"	vec2 x = vec2(1, 0);\n"
109
"	float angle = acos(dot(r2, x));\n"
110
"	\n"
111
"	// decide if we hit a white or black ring, based on y value\n"
112
"	gl_FragColor = smoothstep(-0.8,0.8,cos(angle*50.0)) * vec4(1.0,1.0,1.0,0.0);\n"
113
"}\n";
114
 
115
const string IsophoteLineRenderer::vss = 
116
"varying vec3 n;\n"
117
"varying vec3 v;\n"
118
"\n"
119
"void main(void)\n"
120
"{\n"
121
"	gl_Position = ftransform();\n"
122
"	v = vec3(gl_ModelViewMatrix * gl_Vertex);\n"
123
"	n = normalize(gl_NormalMatrix * gl_Normal);\n"
124
"}\n";
125
 
126
 
127
const string IsophoteLineRenderer::fss = 
128
"uniform float detail;\n"
129
"\n"
130
"varying vec3 n;\n"
131
"varying vec3 v;\n"
132
"\n"
133
"void main(void)\n"
134
"{\n"
135
"	vec3 l = vec3(0, 1,0);\n"
136
"	float angle = acos(dot(n, l));\n"
137
"	\n"
138
"	// decide if we hit a white or black ring, based on y value\n"
139
"	gl_FragColor = smoothstep(-0.8, 0.8,cos(angle*80.0)) * vec4(1.0,1.0,1.0,0.0);\n"
140
"}\n";
141
 
142
const string MetallicRenderer::vss = 
143
"varying vec3 n;\n"
144
"varying vec3 v;\n"
145
"\n"
146
"void main(void)\n"
147
"{\n"
148
"	gl_Position = ftransform();\n"
149
"	v = vec3(gl_ModelViewMatrix * gl_Vertex);\n"
150
"	n = normalize(gl_NormalMatrix * gl_Normal);\n"
151
"}\n";
152
 
153
const string MetallicRenderer::fss = 
154
"varying vec3 n;\n"
155
"varying vec3 v;\n"
156
"\n"
157
"void main(void)\n"
158
"{\n"
159
"	vec3 l = normalize(-v);\n"
160
"	vec3 e = l;\n"
161
"	vec3 r = normalize(2.0*dot(l, n)*n - l);\n"
162
"	\n"
163
"	vec4 a = vec4(0.0,0.1,.3,1.0);\n"
164
"	vec4 d = vec4(0.7,0.7,0.0,1.0) * abs(dot(l, n));\n"
165
"	float sr = 0.2*smoothstep(0.3,0.95,dot(r, e));\n"
166
"	float sg = 0.1*smoothstep(0.4,0.95,dot(r, e));\n"
167
"	float sb = 0.3*smoothstep(0.9,0.95,dot(r, e));\n"
168
"	\n"
169
"	gl_FragColor =  a + d + vec4(sr,sg,sb,1.0);\n"
170
"}\n";
171