示例#1
0
文件: convex.c 项目: Andy753421/grits
gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1,1, -1,1, 10,-10);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(0, 0, -5);

	glEnable(GL_COLOR_MATERIAL);
	glDisable(GL_TEXTURE_2D);
	glColor3f(1.0, 1.0, 1.0);

	/* Create vertexes */
	double verts[20][3];
	for (int i = 0; i < G_N_ELEMENTS(verts); i++) {
		float ang = 2*G_PI * i / G_N_ELEMENTS(verts);
		verts[i][0] = sin(ang) * (i%2+0.5) * 0.6;
		verts[i][1] = cos(ang) * (i%2+0.5) * 0.6;
		verts[i][2] = 0;
	}

	/* Draw raw polygon */
	glColor4f(0.5, 0.0, 0.0, 1.0);
	GLUtesselator *tess = gluNewTess();
	gluTessCallback(tess, GLU_TESS_BEGIN,  glBegin);
	gluTessCallback(tess, GLU_TESS_VERTEX, glVertex3dv);
	gluTessCallback(tess, GLU_TESS_END,    glEnd);
	gluTessBeginPolygon(tess, NULL);
	gluTessBeginContour(tess);
	for (int i = 0; i < G_N_ELEMENTS(verts); i++)
		gluTessVertex(tess, verts[i], verts[i]);
	gluTessEndContour(tess);
	gluTessEndPolygon(tess);
	gluDeleteTess(tess);

	/* Draw tesselated polygon */
	//glColor4f(0.0, 0.0, 0.5, 1.0);
	//glBegin(GL_POLYGON);
	//for (int i = 0; i < G_N_ELEMENTS(verts); i++)
	//	glVertex3dv(verts[i]);
	//glEnd();

	/* Draw outline */
	glColor4f(0.8, 0.8, 0.8, 1.0);
	glBegin(GL_LINE_LOOP);
	for (int i = 0; i < G_N_ELEMENTS(verts); i++)
		glVertex3dv(verts[i]);
	glEnd();

	/* Flush */
	GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
	if (gdk_gl_drawable_is_double_buffered(gldrawable))
		gdk_gl_drawable_swap_buffers(gldrawable);
	else
		glFlush();
	return FALSE;
}
示例#2
0
文件: tester.c 项目: adamboggs/grits
/*************
 * Callbacks *
 *************/
static gboolean on_expose(GritsTester *tester, GdkEventExpose *event, gpointer _)
{
	g_debug("GritsTester: on_expose");

	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glClearDepth(1.0);
	glEnable(GL_BLEND);

	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

	//glDisable(GL_DEPTH_TEST);
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE);

	/* Lighting */
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();
	float light_ambient[]  = {0.1f, 0.1f, 0.1f, 1.0f};
	float light_diffuse[]  = {0.6f, 0.6f, 0.8f, 1.0f};
	float light_position[] = {-40.0f, 80.0f, 40.0f, 1.0f};
	glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glPopMatrix();

	glColor4f(1.0f, 1.0f, 1.0f, 0.5f);

	/* Draw */
	gdk_gl_draw_cube(FALSE, 2);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	for (GList *cur = tester->objects; cur; cur = cur->next)
		grits_object_draw(cur->data, NULL);
	if (tester->wireframe) {
		glDisable(GL_LIGHTING);
		glEnable(GL_POLYGON_OFFSET_LINE);
		glPolygonOffset(-1,0);
		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
		for (GList *cur = tester->objects; cur; cur = cur->next)
			grits_object_draw(cur->data, NULL);
	}

	/* Flush */
	GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
	gdk_gl_drawable_swap_buffers(gldrawable);
	return FALSE;
}
示例#3
0
文件: tex.c 项目: adamboggs/grits
gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _)
{
	glClearColor(0.5, 0.5, 1.0, 1.0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1,1, -1,1, 10,-10);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(0, 0, -5);

	glEnable(GL_COLOR_MATERIAL);
	glDisable(GL_TEXTURE_2D);
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_QUADS);
	glVertex3f(-0.25, -0.75, 0.0);
	glVertex3f(-0.25,  0.75, 0.0);
	glVertex3f( 0.25,  0.75, 0.0);
	glVertex3f( 0.25, -0.75, 0.0);
	glEnd();

	/* Textures */
	glDisable(GL_COLOR_MATERIAL);
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_BLEND);

	gdouble y = 0.875;

	/* Left */
	glBlendFunc(GL_ONE, GL_ZERO);
	glBindTexture(GL_TEXTURE_2D, texl);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0, y); glVertex3f(-0.75,  0.0, 0.0);
	glTexCoord2f(0.0, 1.0); glVertex3f(-0.75,  0.5, 0.0);
	glTexCoord2f(2.0, 1.0); glVertex3f( 0.75,  0.5, 0.0);
	glTexCoord2f(2.0, y); glVertex3f( 0.75,  0.0, 0.0);
	glEnd();

	/* Right */
	glBlendFunc(GL_ONE, GL_ONE);
	glBindTexture(GL_TEXTURE_2D, texr);
	glBegin(GL_QUADS);
	glTexCoord2f(-1.0, y); glVertex3f(-0.75, 0.0, 0.0);
	glTexCoord2f(-1.0, 1.0); glVertex3f(-0.75, 0.5, 0.0);
	glTexCoord2f( 1.0, 1.0); glVertex3f( 0.75, 0.5, 0.0);
	glTexCoord2f( 1.0, y); glVertex3f( 0.75, 0.0, 0.0);
	glEnd();

	/* Bottom */
	glBlendFunc(GL_ONE, GL_ZERO);
	glBindTexture(GL_TEXTURE_2D, tex);
	glBegin(GL_QUADS);
	glTexCoord2f(0.0, 0.0); glVertex3f(-0.75, -0.5, 0.0);
	glTexCoord2f(0.0, 1.0-y); glVertex3f(-0.75, -0.0, 0.0);
	glTexCoord2f(1.0, 1.0-y); glVertex3f( 0.75, -0.0, 0.0);
	glTexCoord2f(1.0, 0.0); glVertex3f( 0.75, -0.5, 0.0);
	glEnd();


	/* Flush */
	GdkGLDrawable *gldrawable = gdk_gl_drawable_get_current();
	if (gdk_gl_drawable_is_double_buffered(gldrawable))
		gdk_gl_drawable_swap_buffers(gldrawable);
	else
		glFlush();
	return FALSE;
}