added based wireframe animations

This commit is contained in:
scoliono 2021-04-08 13:43:13 -07:00
parent 05604fd4da
commit 549656a2d0
6 changed files with 268 additions and 64 deletions

View File

@ -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. */
}

View File

@ -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">

View File

@ -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
View 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
View 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
View 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;
}