Subversion Repositories gelsvn

Rev

Rev 403 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 403 Rev 406
Line 315... Line 315...
315
"       gl_FragColor.b = pow(gl_FragColor.b, 1.0/gamma);\n"
315
"       gl_FragColor.b = pow(gl_FragColor.b, 1.0/gamma);\n"
316
"		gl_FragColor += stripe_col * smoothstep(0.8,1.0,cos(stripe_signal));\n"
316
"		gl_FragColor += stripe_col * smoothstep(0.8,1.0,cos(stripe_signal));\n"
317
"	}\n";
317
"	}\n";
318
 
318
 
319
ScalarFieldRenderer::ScalarFieldRenderer(HMesh::Manifold& m, bool smooth,
319
ScalarFieldRenderer::ScalarFieldRenderer(HMesh::Manifold& m, bool smooth,
320
										std::vector<double>& field, double max_val)
320
										 std::vector<double>& field, double max_val):
-
 
321
SimpleShaderRenderer(vss,fss)
321
{
322
{
322
	init_shaders(vss,fss);
-
 
323
	
323
	
324
	GLint old_prog;
324
	GLint old_prog;
325
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
325
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
326
	glUseProgram(prog);
326
	glUseProgram(prog);
327
	
327
	
Line 357... Line 357...
357
	glEndList();	
357
	glEndList();	
358
	glUseProgram(old_prog);
358
	glUseProgram(old_prog);
359
	
359
	
360
}
360
}
361
 
361
 
-
 
362
const string AmbientOcclusionRenderer::vss =
-
 
363
"	attribute float scalar;\n"
-
 
364
"	varying vec3 normal;\n"
-
 
365
"	varying float s;\n"
-
 
366
"	\n"
-
 
367
"	void main(void)\n"
-
 
368
"	{\n"
-
 
369
"		gl_Position =  ftransform();\n"
-
 
370
"		normal = normalize(gl_NormalMatrix * gl_Normal);\n"
-
 
371
"		s=scalar;\n"
-
 
372
"	}\n";
362
 
373
 
363
LineFieldRenderer::LineFieldRenderer(HMesh::Manifold& m, bool smooth, vector<Vec3d>& lines, float _r): 
374
const string AmbientOcclusionRenderer::fss = 	
-
 
375
"	varying vec3 normal;\n"
-
 
376
"	varying float s;\n"
-
 
377
"	uniform float scalar_max;\n"
-
 
378
"   uniform float gamma;\n"
-
 
379
"   uniform bool lighton;\n"
-
 
380
"	const vec3 light_dir = vec3(0,0,1);\n"
364
	r(_r)
381
"	\n"
-
 
382
"	void main()\n"
365
{
383
"	{\n"
-
 
384
"		float dot_ln = max(0.0,dot(light_dir, normal));\n"
-
 
385
"		\n"
-
 
386
"		float s_norm = min(1.0,s/scalar_max+1.0);\n"
-
 
387
"		\n"
366
	init_shaders(vss,fss);
388
"		gl_FragColor = s_norm * vec4(1.0);\n"
-
 
389
"       if(lighton) gl_FragColor *= dot_ln;\n"
-
 
390
"       gl_FragColor.r = pow(gl_FragColor.r, 1.0/gamma);\n"
-
 
391
"       gl_FragColor.g = pow(gl_FragColor.g, 1.0/gamma);\n"
-
 
392
"       gl_FragColor.b = pow(gl_FragColor.b, 1.0/gamma);\n"
-
 
393
"	}\n";
367
 
394
 
-
 
395
AmbientOcclusionRenderer::AmbientOcclusionRenderer(HMesh::Manifold& m, bool smooth,
-
 
396
												   std::vector<double>& field, double max_val):
-
 
397
SimpleShaderRenderer(vss,fss)
-
 
398
{	
368
	GLint old_prog;
399
	GLint old_prog;
369
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
400
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
370
	glUseProgram(prog);
401
	glUseProgram(prog);
371
	
402
	
372
	GLuint direction = glGetAttribLocation(prog, "direction");
403
	GLuint scalar_attrib = glGetAttribLocation(prog, "scalar");
-
 
404
	glUniform1fARB(glGetUniformLocationARB(prog, "scalar_max"), max_val);
373
	
405
	
-
 
406
	static CVar<float> gamma("display.ambient_occlusion_renderer.gamma",1.5);
-
 
407
	glUniform1fARB(glGetUniformLocationARB(prog, "gamma"), gamma);
-
 
408
	static CVar<int> lighton("display.ambient_occlusion_renderer.light",1);
-
 
409
	glUniform1iARB(glGetUniformLocationARB(prog, "lighton"), lighton);
374
	glNewList(display_list,GL_COMPILE);
410
	glNewList(display_list,GL_COMPILE);
-
 
411
	
375
	for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
412
	for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
376
	{
413
	{
377
		FaceCirculator fc(f);
414
		FaceCirculator fc(f);
378
		if(!smooth) 
415
		if(!smooth) 
379
			glNormal3fv(normal(f).get());
416
			glNormal3fv(normal(f).get());
380
		if(no_edges(f)== 3) 
417
		if(no_edges(f)== 3) 
381
			glBegin(GL_TRIANGLES);
418
			glBegin(GL_TRIANGLES);
382
		else 
419
		else 
383
			glBegin(GL_POLYGON);
420
			glBegin(GL_POLYGON);
-
 
421
		
384
		while(!fc.end())
422
		while(!fc.end())
385
		{
423
		{
386
			Vec3d n(normal(fc.get_vertex()));
424
			Vec3d n(normal(fc.get_vertex()));
387
			if(smooth) 
425
			if(smooth) 
388
				glNormal3dv(n.get());
426
				glNormal3dv(n.get());
389
			int i = fc.get_vertex()->touched;
427
			int i = fc.get_vertex()->touched;
390
			Vec3d d = lines[i];
-
 
391
			d = normalize(d-n*dot(n,d));
-
 
392
			glVertexAttrib3dv(direction, d.get());
428
			glVertexAttrib1d(scalar_attrib, field[i]);
393
			glVertex3fv(fc.get_vertex()->pos.get());
429
			glVertex3fv(fc.get_vertex()->pos.get());
394
			++fc;
430
			++fc;
395
		}
431
		}
396
		glEnd();
432
		glEnd();
397
	}
433
	}
398
	glEndList();	
434
	glEndList();	
399
	glUseProgram(old_prog);
435
	glUseProgram(old_prog);
-
 
436
	
-
 
437
}
-
 
438
 
-
 
439
const string CopperRenderer::vss =
-
 
440
"	attribute float scalar;\n"
-
 
441
"	varying vec3 normal;\n"
-
 
442
"varying vec3 v_obj;\n"
-
 
443
"	varying float s;\n"
-
 
444
"	\n"
-
 
445
"	void main(void)\n"
-
 
446
"	{\n"
-
 
447
"		gl_Position =  ftransform();\n"
-
 
448
"		normal = normalize(gl_NormalMatrix * gl_Normal);\n"
-
 
449
"		s=scalar;\n"
-
 
450
"       v_obj = gl_Vertex.xyz;\n"
-
 
451
"	}\n";
400
 
452
 
-
 
453
const string CopperRenderer::fss =
-
 
454
"uniform sampler3D noise_tex;\n"
-
 
455
"uniform float noise_scale;\n"
-
 
456
"	varying vec3 normal;\n"
-
 
457
"   varying vec3 v_obj;\n"
-
 
458
"	varying float s;\n"
-
 
459
"	uniform float scalar_max;\n"
-
 
460
"	const vec3 light_dir = vec3(0,0,1);\n"
-
 
461
"	\n"
-
 
462
"   float turb(vec3 x) { return 0.25*(texture3D(noise_tex,0.12*noise_scale*x).x+\n"
-
 
463
"			texture3D(noise_tex,0.531*noise_scale*x).x+\n"
-
 
464
"			texture3D(noise_tex,0.098*noise_scale*x).x+\n"
-
 
465
"			texture3D(noise_tex,1.0121*noise_scale*x).x);}\n"
-
 
466
"	void main()\n"
-
 
467
"	{\n"
-
 
468
"		float diff = max(0.0,dot(light_dir, normal));\n"
-
 
469
"	    vec3 r = normalize(2.0*dot(light_dir, normal)*normal - light_dir);\n"
-
 
470
"		float spec = pow(dot(r, normal),20.0);\n"
-
 
471
"		\n"
-
 
472
"		float s_norm = 0.95*s/scalar_max+0.05*turb(v_obj);\n"
-
 
473
"       vec4 copper =  vec4(1,0.70,.5,1);\n"
-
 
474
"       vec4 corroded =  vec4(0.43,0.59,0.5,1)+vec4(0.15,0.15,0.15,1.0)*abs(0.5+0.5*turb(v_obj));\n"
-
 
475
"		vec4 material = copper*smoothstep(0.15,0.25,s_norm) + \n"
-
 
476
"		corroded*smoothstep(0.25,0.15,s_norm)*smoothstep(-0.3,-0.05,s_norm);\n"
-
 
477
"		gl_FragColor = material*diff+smoothstep(0.15,0.25,s_norm)*vec4(0.3,0.3,0.3,1)*spec;\n"
-
 
478
"	}\n";
-
 
479
 
-
 
480
CopperRenderer::CopperRenderer(HMesh::Manifold& m, bool smooth,
-
 
481
							   std::vector<double>& field, double max_val, float _bsphere_rad): 
-
 
482
SimpleShaderRenderer(vss,fss), bsphere_rad(_bsphere_rad)
-
 
483
{
-
 
484
	GLint old_prog;
-
 
485
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
-
 
486
	glUseProgram(prog);
-
 
487
	
-
 
488
	GLuint scalar_attrib = glGetAttribLocation(prog, "scalar");
-
 
489
	glUniform1fARB(glGetUniformLocationARB(prog, "scalar_max"), max_val);
-
 
490
	
-
 
491
	static CVar<float> gamma("display.patina_renderer.gamma",1.5);
-
 
492
	glUniform1fARB(glGetUniformLocationARB(prog, "gamma"), gamma);
-
 
493
	static CVar<int> lighton("display.patina_renderer.light",1);
-
 
494
	glUniform1iARB(glGetUniformLocationARB(prog, "lighton"), lighton);
-
 
495
	glUniform1iARB(glGetUniformLocationARB(prog, "noise_tex"),0);
-
 
496
	glUniform1fARB(glGetUniformLocationARB(prog, "noise_scale"),12.0/bsphere_rad);
-
 
497
 
-
 
498
	glNewList(display_list,GL_COMPILE);
-
 
499
	for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
-
 
500
	{
-
 
501
		FaceCirculator fc(f);
-
 
502
		if(!smooth) 
-
 
503
			glNormal3fv(normal(f).get());
-
 
504
		if(no_edges(f)== 3) 
-
 
505
			glBegin(GL_TRIANGLES);
-
 
506
		else 
-
 
507
			glBegin(GL_POLYGON);
-
 
508
		
-
 
509
		while(!fc.end())
-
 
510
		{
-
 
511
			Vec3d n(normal(fc.get_vertex()));
-
 
512
			if(smooth) 
-
 
513
				glNormal3dv(n.get());
-
 
514
			int i = fc.get_vertex()->touched;
-
 
515
			glVertexAttrib1d(scalar_attrib, field[i]);
-
 
516
			glVertex3fv(fc.get_vertex()->pos.get());
-
 
517
			++fc;
-
 
518
		}
-
 
519
		glEnd();
-
 
520
	}
-
 
521
	glEndList();	
-
 
522
	glUseProgram(old_prog);
-
 
523
	
401
}
524
}
402
 
525
 
403
void LineFieldRenderer::draw()
526
void CopperRenderer::draw()
404
{
527
{
405
	GLint old_prog;
528
	GLint old_prog;
406
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
529
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
407
	glUseProgram(prog);
530
	glUseProgram(prog);
-
 
531
	glBindTexture(GL_TEXTURE_3D, get_noise_texture_id());
-
 
532
	glCallList(display_list);
-
 
533
	glUseProgram(old_prog);
-
 
534
}
-
 
535
 
-
 
536
LineFieldRenderer::LineFieldRenderer(HMesh::Manifold& m, bool smooth, vector<Vec3d>& lines, float _r): 
-
 
537
	SimpleShaderRenderer(vss,fss), r(_r)
-
 
538
{
-
 
539
	GLint old_prog;
-
 
540
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
-
 
541
	glUseProgram(prog);	
408
	static CVar<float> curvature_lines_scale("display.line_field_renderer.line_length", .015);
542
	static CVar<float> curvature_lines_scale("display.line_field_renderer.line_length", .015);
409
	static CVar<float> noise_scale("display.line_field_renderer.noise_scale", 12.0/r);
543
	static CVar<float> noise_scale("display.line_field_renderer.noise_scale", 12.0/r);
410
	static CVar<float> noise_amplitude("display.line_field_renderer.noise_amplitude", .06);
544
	static CVar<float> noise_amplitude("display.line_field_renderer.noise_amplitude", .06);
411
	glUniform1fARB(glGetUniformLocationARB(prog, "scale_line"),curvature_lines_scale);
545
	glUniform1fARB(glGetUniformLocationARB(prog, "scale_line"),curvature_lines_scale);
412
	glUniform1fARB(glGetUniformLocationARB(prog, "noise_scale"),noise_scale);
546
	glUniform1fARB(glGetUniformLocationARB(prog, "noise_scale"),noise_scale);
413
	glUniform1fARB(glGetUniformLocationARB(prog, "noise_amplitude"),noise_amplitude);	
547
	glUniform1fARB(glGetUniformLocationARB(prog, "noise_amplitude"),noise_amplitude);	
-
 
548
	glUniform1iARB(glGetUniformLocationARB(prog, "noise_tex"),0);
-
 
549
	GLuint direction = glGetAttribLocation(prog, "direction");	
-
 
550
	glNewList(display_list,GL_COMPILE);
-
 
551
	for(FaceIter f=m.faces_begin(); f != m.faces_end(); ++f)
-
 
552
	{
-
 
553
		FaceCirculator fc(f);
-
 
554
		if(!smooth) 
-
 
555
			glNormal3fv(normal(f).get());
-
 
556
		if(no_edges(f)== 3) 
-
 
557
			glBegin(GL_TRIANGLES);
-
 
558
		else 
-
 
559
			glBegin(GL_POLYGON);
-
 
560
		while(!fc.end())
-
 
561
		{
-
 
562
			Vec3d n(normal(fc.get_vertex()));
-
 
563
			if(smooth) 
-
 
564
				glNormal3dv(n.get());
-
 
565
			int i = fc.get_vertex()->touched;
-
 
566
			Vec3d d = lines[i];
-
 
567
			d = normalize(d-n*dot(n,d));
-
 
568
			glVertexAttrib3dv(direction, d.get());
-
 
569
			glVertex3fv(fc.get_vertex()->pos.get());
-
 
570
			++fc;
-
 
571
		}
-
 
572
		glEnd();
-
 
573
	}
414
	
574
	
-
 
575
	glBindTexture(GL_TEXTURE_3D, 0);
-
 
576
	glEndList();	
-
 
577
	glUseProgram(old_prog);
-
 
578
 
-
 
579
}
-
 
580
 
-
 
581
void LineFieldRenderer::draw()
-
 
582
{
-
 
583
	GLint old_prog;
-
 
584
	glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog);
-
 
585
	glUseProgram(prog);
415
	glBindTexture(GL_TEXTURE_3D, get_noise_texture_id());
586
	glBindTexture(GL_TEXTURE_3D, get_noise_texture_id());
416
	glUniform1iARB(glGetUniformLocationARB(prog, "noise_tex"),0);
-
 
417
	glCallList(display_list);
587
	glCallList(display_list);
418
	glUseProgram(old_prog);	
-
 
419
	glBindTexture(GL_TEXTURE_3D, 0);
588
	glBindTexture(GL_TEXTURE_3D, 0);
-
 
589
	glUseProgram(old_prog);	
420
}
590
}
421
 
591
 
422
const string LineFieldRenderer::vss = 
592
const string LineFieldRenderer::vss = 
423
"attribute vec3 direction;\n"
593
"attribute vec3 direction;\n"
424
"varying vec3 n;\n"
594
"varying vec3 n;\n"