added based wireframe animations
This commit is contained in:
		
							parent
							
								
									05604fd4da
								
							
						
					
					
						commit
						549656a2d0
					
				| @ -1,62 +0,0 @@ | ||||
| #include <iostream> | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
| #include <windows.h> | ||||
| #endif | ||||
| #include <gl/GL.h> | ||||
| #include <gl/GLU.h> | ||||
| #include <gl/GLUT.h> | ||||
| 
 | ||||
| 
 | ||||
| void display(void) | ||||
| { | ||||
| /*  clear all pixels  */ | ||||
|     glClear (GL_COLOR_BUFFER_BIT); | ||||
| 
 | ||||
| /*  draw white polygon (rectangle) with corners at
 | ||||
|  *  (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)   | ||||
|  */ | ||||
|     glColor3f (1.0, 1.0, 1.0); | ||||
|     glBegin(GL_POLYGON); | ||||
|         glVertex3f (0.25, 0.25, 0.0); | ||||
|         glVertex3f (0.75, 0.25, 0.0); | ||||
|         glVertex3f (0.75, 0.75, 0.0); | ||||
|         glVertex3f (0.25, 0.75, 0.0); | ||||
|     glEnd(); | ||||
| 
 | ||||
| /*  don't wait!  
 | ||||
|  *  start processing buffered OpenGL routines  | ||||
|  */ | ||||
|     glFlush (); | ||||
| } | ||||
| 
 | ||||
| void init (void)  | ||||
| { | ||||
| /*  select clearing (background) color       */ | ||||
|     glClearColor (0.0, 0.0, 0.0, 0.0); | ||||
| 
 | ||||
| /*  initialize viewing values  */ | ||||
|     glMatrixMode(GL_PROJECTION); | ||||
|     glLoadIdentity(); | ||||
|     glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); | ||||
| } | ||||
| 
 | ||||
| /* 
 | ||||
|  *  Declare initial window size, position, and display mode | ||||
|  *  (single buffer and RGBA).  Open window with "hello" | ||||
|  *  in its title bar.  Call initialization routines. | ||||
|  *  Register callback function to display graphics. | ||||
|  *  Enter main loop and process events. | ||||
|  */ | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     glutInit(&argc, argv); | ||||
|     glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); | ||||
|     glutInitWindowSize (250, 250);  | ||||
|     glutInitWindowPosition (100, 100); | ||||
|     glutCreateWindow ("hello"); | ||||
|     init (); | ||||
|     glutDisplayFunc(display);  | ||||
|     glutMainLoop(); | ||||
|     return 0;   /* ISO C requires main to return int. */ | ||||
| } | ||||
| @ -70,7 +70,11 @@ | ||||
|     </PostBuildEvent> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="FemboyGeometry.cpp" /> | ||||
|     <ClCompile Include="geometry.cpp" /> | ||||
|     <ClCompile Include="main.cpp" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="geometry.h" /> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
|   <ImportGroup Label="ExtensionTargets"> | ||||
|  | ||||
| @ -15,8 +15,16 @@ | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="FemboyGeometry.cpp"> | ||||
|     <ClCompile Include="main.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="geometry.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="geometry.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
							
								
								
									
										157
									
								
								FemboyGeometry/geometry.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								FemboyGeometry/geometry.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,157 @@ | ||||
| #include "geometry.h" | ||||
| 
 | ||||
| GeometryPlayer::GeometryPlayer(int width, int height) | ||||
| 	: m_width(width), m_height(height), m_theta(0.0f), m_tickCounter(0), m_rotCounter(0), m_mode(0) | ||||
| { | ||||
| 	/* select clearing (background) color */ | ||||
|     glClearColor(0.0, 0.0, 0.0, 0.0); | ||||
| 
 | ||||
| 	/* initialize viewing values */ | ||||
|     glMatrixMode(GL_PROJECTION); | ||||
|     glLoadIdentity(); | ||||
|     glOrtho(-width/20.0, width/20.0, -height/20.0, height/20.0, -height/20.0, height/20.0); | ||||
| } | ||||
| 
 | ||||
| GeometryPlayer::~GeometryPlayer() | ||||
| { | ||||
| 	glutDestroyWindow(glutGetWindow()); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::nextMode() | ||||
| { | ||||
| 	m_tickCounter = 0; | ||||
| 	m_rotCounter = 0; | ||||
| 	m_theta = 0; | ||||
| 	m_mode = (m_mode + 1) % NUM_MODES; | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::animateBezier() | ||||
| { | ||||
| 	/* draw based bezier curves */ | ||||
| 	glPushMatrix(); | ||||
| 		glRotatef(m_theta/4.0f, 0.0, 0.0, 1.0); | ||||
| 		glColor3f(1.0, 0.0, 0.0); | ||||
| 		glBegin(GL_LINES); | ||||
| 		for (int x = 20; x >= 0; --x) | ||||
| 		{ | ||||
| 			int y = 20 - x; | ||||
| 			glVertex2i(x, 0); | ||||
| 			glVertex2i(0, y); | ||||
| 			glVertex2i(-x, 0); | ||||
| 			glVertex2i(0, -y); | ||||
| 			glVertex2i(-x, 0); | ||||
| 			glVertex2i(0, y); | ||||
| 			glVertex2i(x, 0); | ||||
| 			glVertex2i(0, -y); | ||||
| 		} | ||||
| 		glEnd(); | ||||
| 	glPopMatrix(); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::animateCone() | ||||
| { | ||||
| 	/* draw based cone */ | ||||
| 	float radius = 7.5f; | ||||
| 	glPushMatrix(); | ||||
| 		glRotatef(m_theta, 0.0, 1.0, 0.5); | ||||
| 		glColor3f(1.0, 1.0, 0.0); | ||||
| 		int circle_points = 10; | ||||
| 		glutWireCone(radius, 15.0f, 10, circle_points); | ||||
| 		glColor3f(1.0, 0.0, 1.0); | ||||
| 		glBegin(GL_LINE_LOOP); | ||||
| 		// draw wires through the circle
 | ||||
| 			for (int i = 0; i < circle_points; i++) | ||||
| 			{  | ||||
| 				float angle = 2*PI*i/circle_points; | ||||
| 				float x = radius*cos(angle); | ||||
| 				float y = radius*sin(angle); | ||||
| 				// circumference should be drawn too, so alternate the order of the vertices
 | ||||
| 				if (i % 2 == 0) | ||||
| 				{ | ||||
| 					glVertex2f(x, y); | ||||
| 					glVertex2f(-x, -y); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					glVertex2f(-x, -y); | ||||
| 					glVertex2f(x, y); | ||||
| 				} | ||||
| 			} | ||||
| 		glEnd(); | ||||
| 	glPopMatrix(); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::animateCube() | ||||
| { | ||||
| 	/* draw based colorful cube */ | ||||
| 	glPushMatrix(); | ||||
| 		glRotatef(m_theta, 1.0, 0.5, 0.0); | ||||
| 		glColor3f(0.0, 1.0, 1.0); | ||||
| 		// MOAR WIRES
 | ||||
| 		for (int i = 0; i < 5; ++i) | ||||
| 		{ | ||||
| 			glutWireCube(i*2); | ||||
| 		} | ||||
| 	glPopMatrix(); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::animateGlobe() | ||||
| { | ||||
| 	/* draw based wireframe sphere with rotation animation */ | ||||
| 	glPushMatrix(); | ||||
| 		glRotatef(m_theta, 0.0, 1.0, 0.0); | ||||
| 		glColor3f(0.0, 1.0, 0.0); | ||||
| 		glutWireSphere(10.0, 15, 15); | ||||
| 	glPopMatrix(); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::animateTorus() | ||||
| { | ||||
| 	/* draw based (ford) torus */ | ||||
| 	glPushMatrix(); | ||||
| 		glRotatef(60.0f, 1.0, 0.0, 0.0); | ||||
| 		glRotatef(m_theta, 0.0, 0.0, 1.0); | ||||
| 		glColor3f(0.0, 0.0, 1.0); | ||||
| 		glutWireTorus(2.0, 10.0, 10, 15); | ||||
| 	glPopMatrix(); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::display() | ||||
| { | ||||
| 	/* clear all pixels */ | ||||
|     glClear(GL_COLOR_BUFFER_BIT); | ||||
| 
 | ||||
| 	switch (m_mode) | ||||
| 	{ | ||||
| 	case 0: | ||||
| 		animateGlobe(); | ||||
| 		break; | ||||
| 	case 1: | ||||
| 		animateCube(); | ||||
| 		break; | ||||
| 	case 2: | ||||
| 		animateTorus(); | ||||
| 		break; | ||||
| 	case 3: | ||||
| 		animateBezier(); | ||||
| 		break; | ||||
| 	case 4: | ||||
| 		animateCone(); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| /*  don't wait!
 | ||||
|  *  start processing buffered OpenGL routines | ||||
|  */ | ||||
|     glutSwapBuffers(); | ||||
| } | ||||
| 
 | ||||
| void GeometryPlayer::tick(int) | ||||
| { | ||||
| 	m_theta += OMEGA; | ||||
| 	++m_tickCounter; | ||||
| 	float angle = m_theta - m_rotCounter * 360.0f; | ||||
| 	if (angle > 360.0f && ++m_rotCounter == 5) | ||||
| 		nextMode(); | ||||
| 	glutPostRedisplay(); | ||||
| } | ||||
							
								
								
									
										41
									
								
								FemboyGeometry/geometry.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								FemboyGeometry/geometry.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
| #include <windows.h> | ||||
| #endif | ||||
| 
 | ||||
| #include <math.h> | ||||
| #include <gl/GL.h> | ||||
| #include <gl/GLU.h> | ||||
| #include <gl/GLUT.h> | ||||
| 
 | ||||
| #define PI 3.14159 | ||||
| #define NUM_MODES 5 | ||||
| #define OMEGA 4.0f | ||||
| 
 | ||||
| 
 | ||||
| class GeometryPlayer | ||||
| { | ||||
| public: | ||||
| 	GeometryPlayer(int width, int height); | ||||
| 	~GeometryPlayer(); | ||||
| 
 | ||||
| 	void nextMode(void); | ||||
| 	void display(void); | ||||
| 	void tick(int); | ||||
| 
 | ||||
| protected: | ||||
| 	void animateBezier(void); | ||||
| 	void animateCone(void); | ||||
| 	void animateCube(void); | ||||
| 	void animateGlobe(void); | ||||
| 	void animateTorus(void); | ||||
| 
 | ||||
| private: | ||||
| 	int m_width; | ||||
| 	int m_height; | ||||
| 	float m_theta; | ||||
| 	int m_tickCounter; | ||||
| 	int m_rotCounter; | ||||
| 	int m_mode; | ||||
| }; | ||||
							
								
								
									
										56
									
								
								FemboyGeometry/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								FemboyGeometry/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| #include <gl/GLUT.h> | ||||
| #include "geometry.h" | ||||
| 
 | ||||
| #define WIN_WIDTH	640 | ||||
| #define WIN_HEIGHT	480 | ||||
| #define FPS			60 | ||||
| #define TITLE		"FemboyGeometry (OpenGLel Edition)" | ||||
| 
 | ||||
| GeometryPlayer* g_player = NULL; | ||||
| 
 | ||||
| void mouse(int button, int state, int, int) | ||||
| { | ||||
| 	if (state == GLUT_DOWN) | ||||
| 	{ | ||||
| 		if (button == GLUT_LEFT_BUTTON) | ||||
| 			g_player->nextMode(); | ||||
| 		else if (button == GLUT_RIGHT_BUTTON) | ||||
| 			delete g_player; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void display(void) | ||||
| { | ||||
| 	g_player->display(); | ||||
| } | ||||
| 
 | ||||
| void tick(int arg) | ||||
| { | ||||
| 	g_player->tick(arg); | ||||
| 	glutTimerFunc(1000.0/FPS, tick, 0); | ||||
| } | ||||
| 
 | ||||
| /* 
 | ||||
|  *  Declare initial window size, position, and display mode | ||||
|  *  (single buffer and RGBA).  Open window with "hello" | ||||
|  *  in its title bar.  Call initialization routines. | ||||
|  *  Register callback function to display graphics. | ||||
|  *  Enter main loop and process events. | ||||
|  */ | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     glutInit(&argc, argv); | ||||
|     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); | ||||
|     glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); | ||||
|     glutInitWindowPosition(100, 100); | ||||
|     glutCreateWindow(TITLE); | ||||
| 
 | ||||
|     g_player = new GeometryPlayer(WIN_WIDTH, WIN_HEIGHT); | ||||
|     glutDisplayFunc(display); | ||||
| 	glutMouseFunc(mouse); | ||||
| 	tick(0); | ||||
| 
 | ||||
|     glutMainLoop(); | ||||
| 	delete g_player; | ||||
|     return 0; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user