/*
lightmaterial.c
Nate Robins, 1997
Tool for teaching about OpenGL lighting & material properties.
*/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <GL/glut.h>
#include "glm.h"
#include "materials.h"
#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;
cell light_pos[4] = {
{ 1, 210, 30, -5.0, 5.0, -2.0, 0.01,
"Specifies X coordinate of light vector.", "%.2f" },
{ 2, 270, 30, -5.0, 5.0, 2.0, 0.01,
"Specifies Y coordinate of light vector.", "%.2f" },
{ 3, 330, 30, -5.0, 5.0, 2.0, 0.01,
"Specifies Z coordinate of light vector.", "%.2f" },
{ 4, 390, 30, 0.0, 1.0, 1.0, 1.0,
"Specifies directional (0) or positional (1) light.", "%.2f" },
};
cell light_Ka[4] = {
{ 5, 200, 60, 0.0, 1.0, 0.0, 0.01,
"Specifies ambient red intensity of the light.", "%.2f" },
{ 6, 260, 60, 0.0, 1.0, 0.0, 0.01,
"Specifies ambient green intensity of the light.", "%.2f" },
{ 7, 320, 60, 0.0, 1.0, 0.0, 0.01,
"Specifies ambient blue intensity of the light.", "%.2f" },
{ 8, 380, 60, 0.0, 1.0, 1.0, 0.01,
"Specifies ambient alpha intensity of the light.", "%.2f" },
};
cell light_Kd[4] = {
{ 9, 200, 90, 0.0, 1.0, 1.0, 0.01,
"Specifies diffuse red intensity of the light.", "%.2f" },
{ 10, 260, 90, 0.0, 1.0, 1.0, 0.01,
"Specifies diffuse green intensity of the light.", "%.2f" },
{ 11, 320, 90, 0.0, 1.0, 1.0, 0.01,
"Specifies diffuse blue intensity of the light.", "%.2f" },
{ 12, 380, 90, 0.0, 1.0, 1.0, 0.01,
"Specifies diffuse alpha intensity of the light.", "%.2f" },
};
cell light_Ks[4] = {
{ 13, 200, 120, 0.0, 1.0, 1.0, 0.01,
"Specifies specular red intensity of the light.", "%.2f" },
{ 14, 260, 120, 0.0, 1.0, 1.0, 0.01,
"Specifies specular green intensity of the light.", "%.2f" },
{ 15, 320, 120, 0.0, 1.0, 1.0, 0.01,
"Specifies specular blue intensity of the light.", "%.2f" },
{ 16, 380, 120, 0.0, 1.0, 1.0, 0.01,
"Specifies specular alpha intensity of the light.", "%.2f" },
};
cell spot_direction[3] = {
{ 17, 250, 260, -1.0, 1.0, 1.0, 0.01,
"Specifies X coordinate of spotlight direction vector.", "%.2f" },
{ 18, 310, 260, -1.0, 1.0, -1.0, 0.01,
"Specifies Y coordinate of spotlight direction vector.", "%.2f" },
{ 19, 370, 260, -1.0, 1.0, -1.0, 0.01,
"Specifies Z coordinate of spotlight direction vector.", "%.2f" },
};
cell spot_exponent = { 20, 210, 290, 0.0, 128.0, 30.0, 1.0,
"Specifies intensity distribution of spotlight.", "%.0f" };
cell spot_cutoff = { 21, 410, 290, 0.0, 91.0, 91.0, 1.0,
"Specifies maximum spread angle of spotlight (180 = off).", "%.0f" };
cell Kc = { 22, 120, 410, 0.0, 5.0, 1.0, 0.01,
"Specifies constant attenuation factor.", "%.2f" };
cell Kl = { 23, 215, 410, 0.0, 5.0, 0.0, 0.01,
"Specifies linear attenuation factor.", "%.2f" };
cell Kq = { 24, 315, 410, 0.0, 5.0, 0.0, 0.01,
"Specifies quadratic attenuation factor.", "%.2f" };
cell material_Ka[4] = {
{ 25, 220, 260, 0.0, 1.0, 0.2, 0.01,
"Specifies ambient red reflectance of the material.", "%.2f" },
{ 26, 280, 260, 0.0, 1.0, 0.2, 0.01,
"Specifies ambient green reflectance of the material.", "%.2f" },
{ 27, 340, 260, 0.0, 1.0, 0.2, 0.01,
"Specifies ambient blue reflectance of the material.", "%.2f" },
{ 28, 400, 260, 0.0, 1.0, 1.0, 0.01,
"Specifies ambient alpha reflectance of the material.", "%.2f" },
};
cell material_Kd[4] = {
{ 29, 220, 290, 0.0, 1.0, 0.8, 0.01,
"Specifies diffuse red reflectance of the material.", "%.2f" },
{ 30, 280, 290, 0.0, 1.0, 0.8, 0.01,
"Specifies diffuse green reflectance of the material.", "%.2f" },
{ 31, 340, 290, 0.0, 1.0, 0.8, 0.01,
"Specifies diffuse blue reflectance of the material.", "%.2f" },
{ 32, 400, 290, 0.0, 1.0, 1.0, 0.01,
"Specifies diffuse alpha reflectance of the material.", "%.2f" },
};
cell material_Ks[4] = {
{ 33, 220, 320, 0.0, 1.0, 1.0, 0.01,
"Specifies specular red reflectance of the material.", "%.2f" },
{ 34, 280, 320, 0.0, 1.0, 1.0, 0.01,
"Specifies specular green reflectance of the material.", "%.2f" },
{ 35, 340, 320, 0.0, 1.0, 1.0, 0.01,
"Specifies specular blue reflectance of the material.", "%.2f" },
{ 36, 400, 320, 0.0, 1.0, 1.0, 0.01,
"Specifies specular alpha reflectance of the material.", "%.2f" },
};
cell material_Ke[4] = {
{ 37, 220, 350, 0.0, 1.0, 0.0, 0.01,
"Specifies red emitted light intensity of the material.", "%.2f" },
{ 38, 280, 350, 0.0, 1.0, 0.0, 0.01,
"Specifies green emitted light intensity of the material.", "%.2f" },
{ 39, 340, 350, 0.0, 1.0, 0.0, 0.01,
"Specifies blue emitted light intensity of the material.", "%.2f" },
{ 40, 400, 350, 0.0, 1.0, 1.0, 0.01,
"Specifies alpha emitted light intensity of the material.", "%.2f" },
};
cell material_Se = { 41, 200, 380, 0.0, 128.0, 50.0, 1.0,
"Specifies the specular exponent of the material.", "%.0f" };
cell lmodel_Ka[4] = {
{ 42, 220, 260, 0.0, 1.0, 0.2, 0.01,
"Specifies ambient red intensity of the entire scene.", "%.2f" },
{ 43, 280, 260, 0.0, 1.0, 0.2, 0.01,
"Specifies ambient green intensity of the entire scene.", "%.2f" },
{ 44, 340, 260, 0.0, 1.0, 0.2, 0.01,
"Specifies ambient blue intensity of the entire scene.", "%.2f" },
{ 45, 400, 260, 0.0, 1.0, 1.0, 0.01,
"Specifies ambient alpha intensity of the entire scene.", "%.2f" },
};
cell local_viewer = { 46, 460, 340, 0.0, 1.0, 0.0, 1.0,
"Specifies infinite (0.0) or local (1.0) light model.", "%.1f" };
cell two_side = { 47, 415, 390, 0.0, 1.0, 0.0, 1.0,
"Specifies one (0.0) or two (1.0) sided lighting.", "%.1f" };
GLfloat eye[3] = { 0.0, 0.0, 3.0 };
GLfloat at[3] = { 0.0, 0.0, 0.0 };
GLfloat up[3] = { 0.0, 1.0, 0.0 };
GLboolean world_draw = GL_TRUE;
GLMmodel* pmodel = NULL;
GLint selection = 0;
GLfloat spin_x = 0.0;
GLfloat spin_y = 0.0;
void redisplay_all(void);
GLdouble projection[16], modelview[16], inverse[16];
GLuint window, world, screen, command;
GLuint sub_width = 256, sub_height = 256;
GLvoid *font_style = GLUT_BITMAP_TIMES_ROMAN_10;
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, 525, cell->info);
glColor3ub(255, 0, 0);
}
if (cell->id == 21 && cell->value > 90.0) /* treat cutoff specially */
drawstr(cell->x, cell->y, cell->format, 180.0);
else
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)
r