/*
shapes.c
Mason Woo, 1999
with modification of code by Nate Robins, 1997
Tool for teaching about OpenGL primitives.
*/
#include
#include
#include
#include
#include
#include
#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()
typedef struct _cell {
int id;
int x, y;
float min, max;
float value;
float step;
char* info;
char* format;
} cell;
#define MESSAGEY 455
cell lines[2*3+4*2] = {
{ 1, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 2, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 3, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 4, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 5, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 6, 120, 120, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 7, 180, 120, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 8, 120, 150, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 9, 180, 150, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 10, 240, 150, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 11, 120, 180, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 12, 180, 180, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 13, 120, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 14, 180, 210, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell shadeFour[4*3+4*2] = {
{ 15, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 16, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 17, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 18, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 19, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 20, 120, 120, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 21, 180, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 22, 240, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 23, 120, 150, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 24, 180, 150, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 25, 120, 180, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 26, 180, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 27, 240, 180, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 28, 120, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 29, 180, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 30, 120, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 31, 180, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 32, 240, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 33, 120, 270, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 34, 180, 270, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell flatFour[1*3+4*2] = {
{ 35, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 36, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 37, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 38, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 39, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 40, 120, 120, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 41, 180, 120, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 42, 120, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 43, 180, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 44, 120, 180, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 45, 180, 180, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell shadeThree[3*3+3*2] = {
{ 46, 120, 60, 0.0f, 1.0f, 0.5f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 47, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 48, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 49, 120, 90, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 50, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 51, 120, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 52, 180, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 53, 240, 120, 0.0f, 1.0f, 0.5f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 54, 120, 150, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 55, 180, 150, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 56, 120, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 57, 180, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 58, 240, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 59, 120, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 60, 180, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell flatThree[1*3+3*2] = {
{ 61, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 62, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 63, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 64, 120, 90, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 65, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 66, 120, 120, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 67, 180, 120, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 68, 120, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 69, 180, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell shadeQStrip[6*3+6*2] = {
{ 70, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 71, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 72, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 73, 120, 90, 0.0f, 200.0f, 25.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 74, 180, 90, 0.0f, 200.0f, 25.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 75, 120, 120, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 76, 180, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 77, 240, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 78, 120, 150, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 79, 180, 150, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 80, 120, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 81, 180, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 82, 240, 180, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 83, 120, 210, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 84, 180, 210, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 85, 120, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 86, 180, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 87, 240, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 88, 120, 270, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 89, 180, 270, 0.0f, 200.0f, 75.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 90, 120, 300, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 91, 180, 300, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 92, 240, 300, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 93, 120, 330, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 94, 180, 330, 0.0f, 200.0f, 25.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 95, 120, 360, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 96, 180, 360, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 97, 240, 360, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 98, 120, 390, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 99, 180, 390, 0.0f, 200.0f, 125.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell shadePoints[6*3+6*2] = {
{ 100, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 101, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 102, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 103, 120, 90, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 104, 180, 90, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 105, 120, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 106, 180, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 107, 240, 120, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 108, 120, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 109, 180, 150, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 110, 120, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 111, 180, 180, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 112, 240, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 113, 120, 210, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 114, 180, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 115, 120, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 116, 180, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 117, 240, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 118, 120, 270, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 119, 180, 270, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 120, 120, 300, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 121, 180, 300, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 122, 240, 300, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 123, 120, 330, 0.0f, 200.0f, 75.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 124, 180, 330, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 125, 120, 360, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 126, 180, 360, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 127, 240, 360, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 128, 120, 390, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 129, 180, 390, 0.0f, 200.0f, 75.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell tStrip[4*3+4*2] = {
{ 130, 120, 60, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 131, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 132, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 133, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 134, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 135, 120, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 136, 180, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 137, 240, 120, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 138, 120, 150, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 139, 180, 150, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 140, 120, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 141, 180, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 142, 240, 180, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 143, 120, 210, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 144, 180, 210, 0.0f, 200.0f, 25.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 145, 120, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 146, 180, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 147, 240, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 148, 120, 270, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 149, 180, 270, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell tFan[4*3+4*2] = {
{ 150, 120, 60, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 151, 180, 60, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 152, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 153, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 154, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 155, 120, 120, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 156, 180, 120, 0.0f, 1.0f, 0.5f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 157, 240, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 158, 120, 150, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 159, 180, 150, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 160, 120, 180, 0.0f, 1.0f, 0.5f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 161, 180, 180, 0.0f, 1.0f, 0.5f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 162, 240, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 163, 120, 210, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 164, 180, 210, 0.0f, 200.0f, 175.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 165, 120, 240, 0.0f, 1.0f, 0.5f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 166, 180, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 167, 240, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 168, 120, 270, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 169, 180, 270, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell shadeQuad[4*3+4*2] = {
{ 170, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 171, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 172, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 173, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 174, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 175, 120, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 176, 180, 120, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 177, 240, 120, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 178, 120, 150, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 179, 180, 150, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 180, 120, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 181, 180, 180, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 182, 240, 180, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 183, 120, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 184, 180, 210, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 185, 120, 240, 0.0f, 1.0f, 0.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 186, 180, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 187, 240, 240, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 188, 120, 270, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 189, 180, 270, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
cell flatQuad[1*3+4*2] = {
{ 190, 120, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies red component of a color.", "%.2f" },
{ 191, 180, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies green component of a color.", "%.2f" },
{ 192, 240, 60, 0.0f, 1.0f, 1.0f, 0.005f,
"Specifies blue component of a color.", "%.2f" },
{ 193, 120, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 194, 180, 90, 0.0f, 200.0f, 50.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 195, 120, 120, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 196, 180, 120, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 197, 120, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 198, 180, 150, 0.0f, 200.0f, 200.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" },
{ 199, 120, 180, 0.0f, 200.0f, 150.0f, 1.0f,
"Specifies x component of a vertex.", "%.1f" },
{ 200, 180, 180, 0.0f, 200.0f, 100.0f, 1.0f,
"Specifies y component of a vertex.", "%.1f" }
};
GLboolean clear = GL_TRUE;
GLenum mode = GL_LINES;
int shaded = GL_FALSE;
int bigVertices = GL_FALSE;
int outlined = GL_FALSE;
void redisplay_all(void);
void screen_menu(int);
GLuint window, screen, command;
GLuint sub_width = 256, sub_height = 512;
GLint selection = 0;
int sm;
GLuint circleList;
#define _PI 3.14159265
GLvoid *font_style = GLUT_BITMAP_TIMES_ROMAN_10;
static float linesInit[] = {1.0, 1.0, 1.0,
50.0, 50.0, 100.0, 100.0,
1.0, 1.0, 1.0,
150.0, 100.0, 200.0, 150.0};
static float shadeFourInit[] =
{1.0, 1.0, 1.0, 50.0, 50.0,
0.0, 1.0, 1.0, 100.0, 150.0,
0.0, 1.0, 0.0, 200.0, 200.0,
1.0, 1.0, 0.0, 150.0, 100.0};
static float flatFourInit[] =
{1.0, 1.0, 1.0,
50.0, 50.0,
100.0, 150.0,
200.0, 200.0,
150.0, 100.0};
static float flatQuadInit[] =
{1.0, 1.0, 1.0,
50.0, 50.0,
100.0, 150.0,
200.0, 200.0,
150.0, 100.0};
static float shadeThreeInit[] =
{0.5, 1.0, 1.0, 100.0, 50.0,
1.0, 1.0, 0.5, 50.0, 150.0,
1.0, 1.0, 1.0, 200.0, 200.0};
static float flatThreeInit[] =
{1.0, 1.0, 1.0,
100.0, 50.0,
50.0, 150.0,
200.0, 200.0};
static float shadeQStripInit[] =
{1.0, 1.0, 1.0, 25.0, 25.0,
0.0, 1.0, 1.0, 50.0, 100.0,
1.0, 1.0, 0.0, 100.0, 50.0,
1.0, 1.0, 0.0, 100.0, 75.0,
0.0, 1.0, 0.0, 150.0, 25.0,
1.0, 0.0, 0.0, 175.0, 125.0};
static float tFanInit[] =
{0.0, 0.0, 1.0, 50.0, 50.0,
0.0, 0.5, 1.0, 100.0, 150.0,
0.5, 0.5, 1.0, 175.0, 175.0,
0.5, 0.0, 1.0, 200.0, 100.0};
static float tStripInit[] =
{0.0, 1.0, 1.0, 50.0, 50.0,
1.0, 1.0, 0.0, 100.0, 150.0,
1.0, 1.0, 0.0, 175.0, 25.0,
1.0, 0.0, 0.0, 150.0, 175.0};
static float shadePointsInit[] =
{1.0, 1.0, 1.0, 100.0, 100.0,
1.0, 1.0, 0.0, 200.0, 175.0,
1.0, 0.0, 1.0, 50.0, 200.0,
0.0, 1.0, 1.0, 150.0, 150.0,
1.0, 1.0, 1.0, 75.0, 50.0,
1.0, 1.0, 0.0, 175.0, 75.0};
static float shadeQuadInit[] =
{1.0, 1.0, 1.0, 50.0, 50.0,
1.0, 1.0, 0.0, 100.0, 150.0,
1.0, 0.0, 1.0, 200.0, 200.0,
0.0, 1.0, 1.0, 150.0, 100.0};
void
setfont(char* name, int size)
{
font_style = GLUT_BITMAP_HELVETICA_10;
if (strcmp(name, "helvetica") == 0) {
if (size == 12)
font_style = GLUT_BITMAP_HELVETICA_12;
else if (size == 18)
font_style = GLUT_BITMAP_HELVETICA_18;
} else if (strcmp(name, "times roman") == 0) {
font_style = GLUT_BITMAP_TIMES_ROMAN_10;
if (size == 24)
font_style = GLUT_BITMAP_TIMES_ROMAN_24;
} else if (strcmp(name, "8x13") == 0) {
font_style = GLUT_BITMAP_8_BY_13;
} else if (strcmp(name, "9x15") == 0) {
font_style = GLUT_BITMAP_9_BY_15;
}
}
void
drawstr(GLuint x, GLuint y, char* format, ...)
{
va_list args;
char buffer[255], *s;
va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);
glRasterPos2i(x, y);
for (s = buffer; *s; s++)
glutBitmapCharacter(font_style, *s);
}
void
cell_draw(cell* cell)
{
glColor3ub(0, 255, 128);
if (selection == cell->id) {
glColor3ub(255, 255, 0);
drawstr(10, MESSAGEY, cell->info);
glColor3ub(255, 0, 0);
}
drawstr(cell->x, cell->y, cell->format, cell->value);
}
int
cell_hit(cell* cell, int x, int y)
{
if (x > cell->x && x < cell->x + 60 &&
y > cell->y-20 && y < cell->y+10)
return cell->id;
return 0;
}
void
cell_update(cell* cell, int update)
{
if (selection != cell->id)
return;
cell->value += update * cell->step;
if (cell->value < cell->min)
cell->value = cell->min;
else if (cell->value > cell->max)
cell->value = cell->max;
}
void
cell_vector(float* dst, cell* cell, int num)
{
while (--num >= 0)
dst[num] = cell[num].value;
}
void createCircleList (void) {
GLUquadricObj *qobj;
float radius = 4.0f;
int slices = 11;
int i;
circleList = glGenLists(1);
qobj = gluNewQuadric();
glNewList (circleList, GL_COMPILE);
glBegin (GL_TRIANGLE_FAN);
glVertex2f (0.0f, 0.0f);
for (i = 0; i <= slices; i++) {
glVertex2f (radius * cos ((2.0 * _PI) * (float) i/(float) slices),
radius * sin ((2.0 * _PI) * (float) i/(float) slices));
}
glEnd();
glEndList();
}
void drawCircle (GLfloat coords[]) {
glPushMatrix();
glTranslatef(coords[0], coords[1], 0.0f);
glCallList(circleList);
glPopMatrix();
}
void
drawmodel(void)
{
GLfloat vals[50];
if ((mode == GL_LINES) && !shaded ) {
cell_vector (vals, lines, sizeof(linesInit)/sizeof(float));
glBegin (GL_LINES);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[5]);
glColor3fv (&vals[7]);
glVertex2fv (&vals[10]);
glVertex2fv (&vals[12]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
drawCircle (&vals[5]);
glColor3fv (&vals[7]);
drawCircle (&vals[10]);
drawCircle (&vals[12]);
}
}
else if ((mode == GL_TRIANGLE_FAN) || (mode == GL_TRIANGLE_STRIP) ||
(shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP) || (mode == GL_QUADS)))) {
if (mode == GL_TRIANGLE_STRIP)
cell_vector (vals, tStrip, sizeof(tStripInit)/sizeof(float));
else if (mode == GL_TRIANGLE_FAN)
cell_vector (vals, tFan, sizeof(tFanInit)/sizeof(float));
else if (mode == GL_QUADS)
cell_vector (vals, shadeQuad, sizeof(shadeQuadInit)/sizeof(float));
else
cell_vector (vals, shadeFour, sizeof(shadeFourInit)/sizeof(float));
if (mode == GL_TRIANGLE_FAN)
glBegin (GL_TRIANGLE_FAN);
else if (mode == GL_TRIANGLE_STRIP)
glBegin (GL_TRIANGLE_STRIP);
else if (mode == GL_LINES)
glBegin (GL_LINES);
else if (mode == GL_LINE_LOOP)
glBegin (GL_LINE_LOOP);
else if (mode == GL_LINE_STRIP)
glBegin (GL_LINE_STRIP);
else if (mode == GL_QUADS)
glBegin (GL_QUADS);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glColor3fv (&vals[5]);
glVertex2fv (&vals[8]);
glColor3fv (&vals[10]);
glVertex2fv (&vals[13]);
glColor3fv (&vals[15]);
glVertex2fv (&vals[18]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
glColor3fv (&vals[5]);
drawCircle (&vals[8]);
glColor3fv (&vals[10]);
drawCircle (&vals[13]);
glColor3fv (&vals[15]);
drawCircle (&vals[18]);
}
if (outlined) {
if (mode == GL_TRIANGLE_FAN) {
glLineWidth (3.0);
glBegin (GL_LINE_STRIP);
glColor3f (1.0f, 1.0f, 1.0f);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[13]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[13]);
glEnd();
glLineWidth (1.0);
glBegin (GL_LINE_STRIP);
glColor3f (0.0f, 0.0f, 0.0f);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[13]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[13]);
glEnd();
}
else if (mode == GL_TRIANGLE_STRIP) {
glLineWidth (3.0);
glColor3f (1.0f, 1.0f, 1.0f);
glBegin (GL_LINE_LOOP);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[13]);
glEnd();
glBegin (GL_LINES);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[13]);
glEnd();
glLineWidth (1.0);
glColor3f (0.0f, 0.0f, 0.0f);
glBegin (GL_LINE_LOOP);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[13]);
glEnd();
glBegin (GL_LINES);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[13]);
glEnd();
}
}
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP) ||
(mode == GL_QUADS))) {
if (mode == GL_QUADS)
cell_vector (vals, flatQuad, sizeof(flatQuadInit)/sizeof(float));
else
cell_vector (vals, flatFour, sizeof(flatFourInit)/sizeof(float));
if (mode == GL_LINE_LOOP)
glBegin (GL_LINE_LOOP);
else if (mode == GL_LINE_STRIP)
glBegin (GL_LINE_STRIP);
else if (mode == GL_QUADS)
glBegin (GL_QUADS);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[5]);
glVertex2fv (&vals[7]);
glVertex2fv (&vals[9]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
drawCircle (&vals[5]);
drawCircle (&vals[7]);
drawCircle (&vals[9]);
}
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
cell_vector (vals, shadeThree, sizeof(shadeThreeInit)/sizeof(float));
if (mode == GL_TRIANGLES)
glBegin (GL_TRIANGLES);
else if (mode == GL_POLYGON)
glBegin (GL_POLYGON);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glColor3fv (&vals[5]);
glVertex2fv (&vals[8]);
glColor3fv (&vals[10]);
glVertex2fv (&vals[13]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
glColor3fv (&vals[5]);
drawCircle (&vals[8]);
glColor3fv (&vals[10]);
drawCircle (&vals[13]);
}
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
cell_vector (vals, flatThree, sizeof(flatThreeInit)/sizeof(float));
if (mode == GL_TRIANGLES)
glBegin (GL_TRIANGLES);
else if (mode == GL_POLYGON)
glBegin (GL_POLYGON);
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[5]);
glVertex2fv (&vals[7]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
drawCircle (&vals[5]);
drawCircle (&vals[7]);
}
}
else if ((mode == GL_POINTS) || (mode == GL_QUAD_STRIP)) {
if (mode == GL_POINTS) {
cell_vector (vals, shadePoints, sizeof(shadePointsInit)/sizeof(float));
glBegin (GL_POINTS);
}
else if (mode == GL_QUAD_STRIP) {
cell_vector (vals, shadeQStrip, sizeof(shadeQStripInit)/sizeof(float));
glBegin (GL_QUAD_STRIP);
}
glColor3fv (&vals[0]);
glVertex2fv (&vals[3]);
glColor3fv (&vals[5]);
glVertex2fv (&vals[8]);
glColor3fv (&vals[10]);
glVertex2fv (&vals[13]);
glColor3fv (&vals[15]);
glVertex2fv (&vals[18]);
glColor3fv (&vals[20]);
glVertex2fv (&vals[23]);
glColor3fv (&vals[25]);
glVertex2fv (&vals[28]);
glEnd();
if (bigVertices) {
glColor3fv (&vals[0]);
drawCircle (&vals[3]);
glColor3fv (&vals[5]);
drawCircle (&vals[8]);
glColor3fv (&vals[10]);
drawCircle (&vals[13]);
glColor3fv (&vals[15]);
drawCircle (&vals[18]);
glColor3fv (&vals[20]);
drawCircle (&vals[23]);
glColor3fv (&vals[25]);
drawCircle (&vals[28]);
}
if (outlined && (mode == GL_QUAD_STRIP)) {
glLineWidth (3.0);
glColor3f (1.0f, 1.0f, 1.0f);
glBegin (GL_LINE_LOOP);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[28]);
glVertex2fv (&vals[23]);
glVertex2fv (&vals[13]);
glEnd();
glBegin (GL_LINES);
glVertex2fv (&vals[13]);
glVertex2fv (&vals[18]);
glEnd();
glLineWidth (1.0);
glColor3f (0.0f, 0.0f, 0.0f);
glBegin (GL_LINE_LOOP);
glVertex2fv (&vals[3]);
glVertex2fv (&vals[8]);
glVertex2fv (&vals[18]);
glVertex2fv (&vals[28]);
glVertex2fv (&vals[23]);
glVertex2fv (&vals[13]);
glEnd();
glBegin (GL_LINES);
glVertex2fv (&vals[13]);
glVertex2fv (&vals[18]);
glEnd();
}
}
}
void
drawaxes(void)
{
glColor3ub(255, 255, 255);
glLineWidth (2.0);
glBegin (GL_LINE_STRIP);
glVertex2i (200, 0);
glVertex2i (0, 0);
glVertex2i (0, 200);
glEnd ();
glBegin (GL_LINE_STRIP);
glVertex2i (-5, 195);
glVertex2i (0, 200);
glVertex2i (5, 195);
glEnd ();
glBegin (GL_LINE_STRIP);
glVertex2i (195, -5);
glVertex2i (200, 0);
glVertex2i (195, 5);
glEnd ();
glLineWidth (1.0);
setfont("helvetica", 12);
drawstr(205, -3, "X");
drawstr(-5, 205, "Y");
drawstr(-10, -10, "0");
drawstr(-27, 195, "200");
drawstr(186, -16, "200");
}
void
main_reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, width, height, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
#define GAP 25 /* gap between subwindows */
sub_width = (width-GAP*3)/2.0;
sub_height = (height-GAP*2);
glutSetWindow(screen);
glutPositionWindow(GAP, GAP);
glutReshapeWindow(sub_width, sub_height);
glutSetWindow(command);
glutPositionWindow(GAP+sub_width+GAP, GAP);
glutReshapeWindow(sub_width, sub_height);
}
void
main_display(void)
{
glClearColor(0.8f, 0.8f, 0.8f, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3ub(0, 0, 0);
setfont("helvetica", 12);
drawstr(GAP, GAP-5, "Screen-space view");
drawstr(GAP+sub_width+GAP, GAP-5, "Command manipulation window");
glutSwapBuffers();
}
void
main_keyboard(unsigned char key, int x, int y)
{
int i;
switch (key) {
case 'B':
bigVertices = !bigVertices;
break;
case 'C':
shaded = !shaded;
break;
case 'O':
outlined = !outlined;
break;
case 'f':
mode = GL_TRIANGLE_FAN;
glutSetWindow(screen);
glutDestroyMenu (sm);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'g':
mode = GL_POLYGON;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'l':
mode = GL_LINES;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'n':
mode = GL_LINE_LOOP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'p':
mode = GL_POINTS;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'q':
mode = GL_QUADS;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'r':
if (!shaded && (mode == GL_LINES)) {
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)
lines[i].value = linesInit[i];
}
else if (shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
shadeFour[i].value = shadeFourInit[i];
}
else if (!shaded &&
(mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP)) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
flatFour[i].value = flatFourInit[i];
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
shadeThree[i].value = shadeThreeInit[i];
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
flatThree[i].value = flatThreeInit[i];
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
tFan[i].value = tFanInit[i];
}
else if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
tStrip[i].value = tStripInit[i];
}
else if (!shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
flatQuad[i].value = flatQuadInit[i];
}
else if (shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
shadeQuad[i].value = shadeQuadInit[i];
}
else if (mode == GL_QUAD_STRIP) {
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
shadeQStrip[i].value = shadeQStripInit[i];
}
else if (mode == GL_POINTS) {
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
shadePoints[i].value = shadePointsInit[i];
}
break;
case 't':
mode = GL_TRIANGLES;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'u':
mode = GL_QUAD_STRIP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'x':
mode = GL_TRIANGLE_STRIP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 'y':
mode = GL_LINE_STRIP;
glutSetWindow(screen);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Toggle colors at vertices", 'C');
glutAttachMenu(GLUT_RIGHT_BUTTON);
break;
case 27:
exit(0);
default:
break;
}
redisplay_all();
}
void
screen_reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D ((GLdouble) 100-width/2, (GLdouble) 100+width/2,
(GLdouble) 100-height/2, (GLdouble) 100+height/2);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void
screen_display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawaxes();
drawmodel();
glutSwapBuffers();
}
void
command_reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, width, height, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void
command_draw_color(GLuint ypos) {
drawstr(20, ypos, "glColor3f (");
drawstr(170, ypos, ",");
drawstr(230, ypos, ",");
drawstr(290, ypos, ");");
}
void
command_draw_vertex(GLuint ypos) {
drawstr(20, ypos, "glVertex2f (");
drawstr(170, ypos, ",");
drawstr(230, ypos, ");");
}
void
command_display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3ub(255, 255, 255);
setfont("helvetica", 18);
drawstr(20, 30, "glBegin (");
if (mode == GL_LINES)
drawstr(95, 30, "GL_LINES);");
else if (mode == GL_LINE_LOOP)
drawstr(95, 30, "GL_LINE_LOOP);");
else if (mode == GL_LINE_STRIP)
drawstr(95, 30, "GL_LINE_STRIP);");
else if (mode == GL_TRIANGLES)
drawstr(95, 30, "GL_TRIANGLES);");
else if (mode == GL_TRIANGLE_FAN)
drawstr(95, 30, "GL_TRIANGLE_FAN);");
else if (mode == GL_TRIANGLE_STRIP)
drawstr(95, 30, "GL_TRIANGLE_STRIP);");
else if (mode == GL_QUADS)
drawstr(95, 30, "GL_QUADS);");
else if (mode == GL_QUAD_STRIP)
drawstr(95, 30, "GL_QUAD_STRIP);");
else if (mode == GL_POLYGON)
drawstr(95, 30, "GL_POLYGON);");
else if (mode == GL_POINTS)
drawstr(95, 30, "GL_POINTS);");
if ((mode == GL_LINES) && !shaded ) {
command_draw_color(lines[0].y);
command_draw_vertex(lines[3].y);
command_draw_vertex(lines[5].y);
command_draw_color(lines[7].y);
command_draw_vertex(lines[10].y);
command_draw_vertex(lines[12].y);
drawstr(20, lines[12].y + 30, "glEnd();");
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++) {
cell_draw(&lines[i]);
}
}
else if ((mode == GL_TRIANGLE_FAN) || (mode == GL_TRIANGLE_STRIP) ||
(shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP) || (mode == GL_QUADS)))) {
command_draw_color(shadeFour[0].y);
command_draw_vertex(shadeFour[3].y);
command_draw_color(shadeFour[5].y);
command_draw_vertex(shadeFour[8].y);
command_draw_color(shadeFour[10].y);
command_draw_vertex(shadeFour[13].y);
command_draw_color(shadeFour[15].y);
command_draw_vertex(shadeFour[18].y);
drawstr(20, shadeFour[18].y + 30, "glEnd();");
if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
cell_draw(&tStrip[i]);
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
cell_draw(&tFan[i]);
}
else if (mode == GL_QUADS) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
cell_draw(&shadeQuad[i]);
}
else {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
cell_draw(&shadeFour[i]);
}
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP) ||
(mode == GL_QUADS))) {
command_draw_color(flatFour[0].y);
command_draw_vertex(flatFour[3].y);
command_draw_vertex(flatFour[5].y);
command_draw_vertex(flatFour[7].y);
command_draw_vertex(flatFour[9].y);
drawstr(20, flatFour[9].y + 30, "glEnd();");
if (mode == GL_QUADS) {
for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
cell_draw(&flatQuad[i]);
}
else {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
cell_draw(&flatFour[i]);
}
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
command_draw_color(shadeThree[0].y);
command_draw_vertex(shadeThree[3].y);
command_draw_color(shadeThree[5].y);
command_draw_vertex(shadeThree[8].y);
command_draw_color(shadeThree[10].y);
command_draw_vertex(shadeThree[13].y);
drawstr(20, shadeThree[13].y + 30, "glEnd();");
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++) {
cell_draw(&shadeThree[i]);
}
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
command_draw_color(flatThree[0].y);
command_draw_vertex(flatThree[3].y);
command_draw_vertex(flatThree[5].y);
command_draw_vertex(flatThree[7].y);
drawstr(20, flatThree[7].y + 30, "glEnd();");
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++) {
cell_draw(&flatThree[i]);
}
}
else if (mode == GL_QUAD_STRIP) {
command_draw_color(shadeQStrip[0].y);
command_draw_vertex(shadeQStrip[3].y);
command_draw_color(shadeQStrip[5].y);
command_draw_vertex(shadeQStrip[8].y);
command_draw_color(shadeQStrip[10].y);
command_draw_vertex(shadeQStrip[13].y);
command_draw_color(shadeQStrip[15].y);
command_draw_vertex(shadeQStrip[18].y);
command_draw_color(shadeQStrip[20].y);
command_draw_vertex(shadeQStrip[23].y);
command_draw_color(shadeQStrip[25].y);
command_draw_vertex(shadeQStrip[28].y);
drawstr(20, shadeQStrip[28].y + 30, "glEnd();");
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++) {
cell_draw(&shadeQStrip[i]);
}
}
else if ((mode == GL_POINTS)) {
command_draw_color(shadePoints[0].y);
command_draw_vertex(shadePoints[3].y);
command_draw_color(shadePoints[5].y);
command_draw_vertex(shadePoints[8].y);
command_draw_color(shadePoints[10].y);
command_draw_vertex(shadePoints[13].y);
command_draw_color(shadePoints[15].y);
command_draw_vertex(shadePoints[18].y);
command_draw_color(shadePoints[20].y);
command_draw_vertex(shadePoints[23].y);
command_draw_color(shadePoints[25].y);
command_draw_vertex(shadePoints[28].y);
drawstr(20, shadePoints[28].y + 30, "glEnd();");
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++) {
cell_draw(&shadePoints[i]);
}
}
if (!selection) {
glColor3ub(255, 255, 0);
drawstr(10, MESSAGEY, "Click on the arguments and");
drawstr(10, MESSAGEY+30, "move the mouse to modify values.");
}
glutSwapBuffers();
}
int old_y;
void
command_mouse(int button, int state, int x, int y)
{
int i;
selection = 0;
if (state == GLUT_DOWN) {
/* mouse should only hit _one_ of the cells, so adding up all
the hits just propagates a single hit. */
if ((mode == GL_LINES) && !shaded ) {
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)
selection += cell_hit(&lines[i], x, y);
}
else if ((shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP)))) {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
selection += cell_hit(&shadeFour[i], x, y);
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
selection += cell_hit(&flatFour[i], x, y);
}
else if (shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
selection += cell_hit(&shadeQuad[i], x, y);
}
else if (!shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(flatQuadInit)/sizeof(float)); i++)
selection += cell_hit(&flatQuad[i], x, y);
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
selection += cell_hit(&tFan[i], x, y);
}
else if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
selection += cell_hit(&tStrip[i], x, y);
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
selection += cell_hit(&shadeThree[i], x, y);
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
selection += cell_hit(&flatThree[i], x, y);
}
else if (mode == GL_QUAD_STRIP) {
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
selection += cell_hit(&shadeQStrip[i], x, y);
}
else if (mode == GL_POINTS) {
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
selection += cell_hit(&shadePoints[i], x, y);
}
}
old_y = y;
redisplay_all();
}
void
command_motion(int x, int y)
{
int i;
if ((mode == GL_LINES) && !shaded ) {
for (i = 0; i < (sizeof(linesInit)/sizeof(float)); i++)
cell_update(&lines[i], old_y-y);
}
else if (shaded &&
((mode == GL_LINES) || (mode == GL_LINE_LOOP) ||
(mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(shadeFourInit)/sizeof(float)); i++)
cell_update(&shadeFour[i], old_y-y);
}
else if (mode == GL_TRIANGLE_STRIP) {
for (i = 0; i < (sizeof(tStripInit)/sizeof(float)); i++)
cell_update(&tStrip[i], old_y-y);
}
else if (mode == GL_TRIANGLE_FAN) {
for (i = 0; i < (sizeof(tFanInit)/sizeof(float)); i++)
cell_update(&tFan[i], old_y-y);
}
else if (shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(shadeQuadInit)/sizeof(float)); i++)
cell_update(&shadeQuad[i], old_y-y);
}
else if (!shaded && (mode == GL_QUADS)) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
cell_update(&flatQuad[i], old_y-y);
}
else if (!shaded &&
((mode == GL_LINE_LOOP) || (mode == GL_LINE_STRIP))) {
for (i = 0; i < (sizeof(flatFourInit)/sizeof(float)); i++)
cell_update(&flatFour[i], old_y-y);
}
else if (shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(shadeThreeInit)/sizeof(float)); i++)
cell_update(&shadeThree[i], old_y-y);
}
else if (!shaded &&
((mode == GL_TRIANGLES) || (mode == GL_POLYGON))) {
for (i = 0; i < (sizeof(flatThreeInit)/sizeof(float)); i++)
cell_update(&flatThree[i], old_y-y);
}
else if (mode == GL_QUAD_STRIP) {
for (i = 0; i < (sizeof(shadeQStripInit)/sizeof(float)); i++)
cell_update(&shadeQStrip[i], old_y-y);
}
else if (mode == GL_POINTS) {
for (i = 0; i < (sizeof(shadePointsInit)/sizeof(float)); i++)
cell_update(&shadePoints[i], old_y-y);
}
old_y = y;
redisplay_all();
}
void
screen_menu(int value)
{
main_keyboard((unsigned char)value, 0, 0);
}
void
command_menu(int value)
{
main_keyboard((unsigned char)value, 0, 0);
}
void
redisplay_all(void)
{
glutSetWindow(command);
glutPostRedisplay();
glutSetWindow(screen);
screen_reshape(sub_width, sub_height);
glutPostRedisplay();
}
int
main(int argc, char** argv)
{
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(640+GAP*3, 512+GAP*2);
glutInitWindowPosition(50, 50);
glutInit(&argc, argv);
window = glutCreateWindow("Shapes");
glutReshapeFunc(main_reshape);
glutDisplayFunc(main_display);
glutKeyboardFunc(main_keyboard);
screen = glutCreateSubWindow(window, GAP, GAP, 256, 256);
glutReshapeFunc(screen_reshape);
glutDisplayFunc(screen_display);
glutKeyboardFunc(main_keyboard);
sm = glutCreateMenu(screen_menu);
glutAddMenuEntry("Options", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("Toggle big vertices", 'B');
glutAddMenuEntry("Specify colors@vertices", 'C');
glutAddMenuEntry("Toggle drawing outlines", 'O');
glutAttachMenu(GLUT_RIGHT_BUTTON);
createCircleList ();
command = glutCreateSubWindow(window, GAP+256+GAP, GAP, 256, 256);
glutReshapeFunc(command_reshape);
glutDisplayFunc(command_display);
glutMotionFunc(command_motion);
glutMouseFunc(command_mouse);
glutKeyboardFunc(main_keyboard);
glutCreateMenu(command_menu);
glutAddMenuEntry("Shapes", 0);
glutAddMenuEntry("", 0);
glutAddMenuEntry("POINTS [p] ", 'p');
glutAddMenuEntry("LINES [l] ", 'l');
glutAddMenuEntry("LINE_LOOP [n]", 'n');
glutAddMenuEntry("LINE_STRIP [y]", 'y');
glutAddMenuEntry("TRIANGLES [t]", 't');
glutAddMenuEntry("TRIANGLE_FAN [f]", 'f');
glutAddMenuEntry("TRIANGLE_STRIP [x]", 'x');
glutAddMenuEntry("QUADS [q]", 'q');
glutAddMenuEntry("QUAD_STRIP [u]", 'u');
glutAddMenuEntry("POLYGON [g]", 'g');
glutAddMenuEntry("Reset parameters [r]", 'r');
glutAddMenuEntry("", 0);
glutAddMenuEntry("Quit", 27);
glutAttachMenu(GLUT_RIGHT_BUTTON);
redisplay_all();
glutMainLoop();
return 0;
}