7 Проведение тестовых испытаний
Проведение тестовых испытаний заключалось в следующем:
- тестирование работы алгоритмов аффинных преобразований над заданной моделью робота-краба и базовых примитивов (см. рис. ,В14,В12);
- тестирование камеры и источников света (см. рис. В.10,В.11,В.13);
- тестирование прорисовки заданных примитивов (см. рис. В.2-В.9);
- тестирование открытия и сохранения сцены;
- сравнение фигуры построенной фигуры (В.14) с ее моделью (А1).
ЗАКЛЮЧЕНИЕ
В результате работы над курсовым проектом была создана интерактивная система трехмерного графического моделирования в пространстве таких объектов как: сфера, полусфера, икосаэдр, призма с треугольным основанием, усеченная пирамида с треугольным основанием, косоугольная призма с треугольным основанием, эллипсоид, косоугольный цилиндр. В ходе реализации проекта были рассмотрены аффинные преобразования как методы выполнения преобразований над объектами в пространстве. Реализована возможность сохранение сцены в файл. Результаты тестирования показали, что программа удовлетворяет предъявленным в постановке задания требованиям.
В дальнейшем КП может быть модернизирован и улучшен в соответствии с нововведенными требованиями.
Список использованной литературы
Курс лекций.
Френсис Хилл. OpenGL. Программирование компьютерной графики. Для профессионалов. – Спб.: Питер, 2002. – 1088 с.: ил.
Девис Т., Нейдер Дж., Шрайнер Д. OpenGL. Руководство по программированию. Юиюлиотека программиста. 4-е издание.- СПб: Питер, 2006 -624с.
Выгодский М.Я. Справочник по высшей математике.– М.: Наука, 1964. – 872с.: ил.
Баяковский Ю.М., Игнатенко А.В. Начальный курс OpenGL.М.: «Планета Знаний», 2007. – 221с.
Шикин А.В. Боресков А.В. Компьютерная графика. Динамика, реалистические изображения. – М.: ДИАЛОГ-МИФИ, 1996. – 288с.
Препарата Ф., Шеймос М. Вычислительная геометрия: Введение: Пер. с англ. - М.: Мир, 1989.-478с.
Эгрон Жерар. Синтез изображений. Базовые алгоритмы.: пер. с франц. А.В.Серединского. М.:Радио и связь, 1993. 216с. библ.-44 , рус.библ.-5.
Rogers, D. 1998. Procedural Element for Computer Graphics. New York: McGraw-Hill;
Yaglom, I.M. 1962 Geometric Transformations. Toronto. Random House.
FAQ по программированию OpenGL http://faqs.org.ru [opengl.txt]
Приложение А
Техническое задание
А.1. Общие сведения
Полное наименование курсового проекта (КП) - «Разработка и реализация с помощью библиотеки OpenGL системы трехмерного графического моделирования. Параметрическая модель сложного трехмерного объекта - робот-краб».
КП проектируется студентом 3-го курса Государственного университета информатики и искусственного интеллекта (ГУИиИИ), факультета СКИТ, группы ИС-08а Билыком Никитой Олеговичем.
Задание выдано кафедрой программного обеспечения интеллектуальных систем (ПОИС). Плановый срок начала работы над КП - 16 февраля 2011 года, дата защиты –10 июня 2011 года.
А.2 Назначение и цели создания программного продукта
А.2.1 Цели курсового проекта
Целью курсового проекта является создание системы трехмерного графического моделирования с помощью библиотеки OpenGL.
Программный продукт (ПП) может быть использован для изучения основных принципов работы с трехмерной графикой с помощью библиотеки OpenGL, а также моделирования простых трехмерных сцен.
Данный курсовой проект предназначен для построения с использованием средств OpenGL системы трехмерного графического моделирования, а также для реализации при помощи этой системы модели трехмерного сложного объекта (робот-краб). Для реализации данной модели необходимо использовать следующие трехмерные примитивы: эллипсоид, икосаэдр, призма с треугольным основанием, сфера, косоугольный цилиндр, усеченная пирамида с треугольным основанием, полусфера, косоугольная призма с треугольным основанием.
Схема расположения частей объекта приведена на рис. А.1.
икосаэдр сфера усеченная
пирамида с треугольным основанием
полусфера косоугольная
призма с треугольным основанием призма
с треугольным основанием
эллипсоид косоугольный
цилиндр
Рисунок А.1 – Модель робота-краба
А.2.2 Задачи курсового проекта
В задачи курсового проекта по ГГМ входит решение следующих вопросов:
- разработка параметрической модели геометрического объекта; разработка алгоритма визуализации;
- проектирование трехмерной графической интерактивной системы;
- разработка функциональных алгоритмов программного обеспечения;
- разработка математических моделей простейших трехмерных объектов; - моделирование на компьютере алгоритмов трехмерной графики с использованием библиотеки OpenGL;
- оформление пояснительной записки и чертежей;
- подготовка доклада по содержанию проекта.
А.3 Требования к программному продукту (ПП)
А.3.1 Требования к ПП в целом
К ПП предъявляются следующие требования:
а) требования к интерфейсу:
1) интерфейс приложения: диалоговый. Вызов всех функций должен быть отражен в главном меню и продублирован в виде кнопок;
2) программа должна содержать следующие оконные диалоги:
- окно параметров сцены (имя файла, название и время создания сцены);
- окно параметров камеры;
- окно параметров по каждому объекту (включая свойство материала);
- ведение графической базы данных;
- окна проекций: три ортогональные и косоугольная кабинетная, согласно индивидуальному варианту задания;
- окно параметров источника света:
3) загрузка и сохранение всех параметров сцены в файл данных (количество источников света, параметры источников света, параметры камеры, способ представления модели, название и время создания сцены);
4) интерактивная помощь по системе;
5) корректный выход из программы (без зависаний приложения);
б) требования к созданию и визуализации сложного параметризированного трехмерного объекта:
1) задание точных размеров с клавиатуры;
2) задание материала/цвета объекта с клавиатуры;
3) выбор проволочного/полигонального представления фигуры;
4) выбор количества разбиений для ЗD-примитивов, моделируемых при помощи рекурсивного разбиения;
в) требования к построению и интерактивному редактированию сцены:
1) реализация планировки сцены (визуализация координатных осей);
2) реализация заданного расположения и направления камеры;
3) выбор типа проецирования (одна из трех проекций или объемное изображение);
4) изменение размеров сцены;
5) выбор количества (от 0 до 4) источников света;
6) реализация всех аффинных преобразований для объекта с возможностью редактирования параметров.
А.3.2 Требования к задачам и функциям ПП
Система трехмерного графического моделирования должна содержать сложный трехмерный объект «робот-краб». Объект должен как минимум содержать следующие исходные трехмерных примитивы:
а) эллипсоид;
б) икосаэдр;
в) призма с треугольным основанием;
г) сфера;
д) косоугольный цилиндр;
е) усеченная пирамида с треугольным основанием;
ж) полусфера;
з) косоугольная призма с треугольным основанием.
Проекция должна быть косоугольная кабинетная.
Источники света должны быть такие:
а) точечный, цвет пурпурный, координаты (-20, -15, 0);
б) цилиндрический, красный, координаты (15 0, -20);
в) точечный, цвет зеленый, координаты (15, -20, 10).
Материалов должно быть два вида: матовый, пропускающий свет.
А.4 Требования к видам обеспечения
А.4.1 Требования к техническому обеспечению
Требования к техническому обеспечению включают:
а) процессор CPU - Pentium I и выше;
б) объем памяти RAM не менее 32 Мб;
в) свободное дисковое пространство около 10 Мб. Не менее 5 Мб свободного пространства на НЖМД;
г) графический адаптер SVGA;
д) SVGA-монитор с разрешением не менее 800x600;
е) Манипулятор типа «мышь».
А.4.2 Требования к программному обеспечению
К программному обеспечению (ПО) предъявляются следующие требования:
- операционная система Microsoft Windows 98;
- архиватор WinRAR;
- компилятор Borland C++ Builder 6;
- текстовый процессор Microsoft Word 2003.
Требования к программному обеспечению подразумевает наличие ОС Windows 9.x и выше.
А.4.3 Требования к организационному обеспечению
Организационное обеспечение должно включать пояснительную записку со следующими приложениями:
- руководство пользователя;
- экранные формы;
- листинги основных блоков программы;
- пример файла графической БД, содержащей основные объекты системы.
Техническое задание является самостоятельным документом.
А.4.4 Требования к математической модели
В данном КП производятся аффинные преобразования в пространстве, для этого используется матрица размерностью 4*4.
В КП простые объекты (сфера, додекаэдр, икосаэдр) рисуются методом медианы и параллелей.
Закрашивание производится методом Гуро.
Для наложения текстуры используется алгоритм вывода полигонов и линейная интерполяция координат угловых точек.
Закрашивание производится линиями, так как данный алгоритм получил широкое распространение в компьютерной графике.
А.5 Этапы разработки и защита КП
Этапы разработки КП представлены в табл. А.1.
При защите проекта должны соблюдаться следующие требования.
1) Защита проекта проводится в присутствии соответствующей приемной комиссии.
2) До защиты проекта необходимо в оговоренные сроки представить техническое задание.
Таблица А.1- Календарный план выполнения курсового проекта
№ |
Этапы работы |
Срок выполнения |
1 |
Постановка задания. Выбор темы курсового проекта |
16.02.2011 |
2 |
Разработка ТЗ |
02.03.2011 |
3 |
Анализ структуры программы и анализ графических и геометрических методов |
16.03.2011 |
4 |
Создание графической, геометрической и математической модели |
30.03.2011 |
5 |
Разработка интерфейса и программирование сложной модели |
27.04.2011 |
6 |
Отладка программы и написание ПЗ |
25.05.2011 |
7 |
Прохождение нормоконтроля ПЗ и проверка ПП |
08.06.2011 |
8 |
Защита КП |
10.06.2011 |
Приложение Б
Руководство пользователя
Б.1 Описание интерфейса программы
Интерфейс реализованной программы построен таким образом, что пользователь имеет быстрый доступ ко всем её функциям.
Главное окно программы разбито на четыре квадратных участка. Верхний левый представляет собой ортографическую проекцию графических объектов сцены (за исключением источников света, что касается и остальных ортографических проекций) на плоскость OYZ, верхний правый – ортографическую проекцию на плоскость OXZ, нижний левый – ортографическую проекцию на плоскость OXY. Нижний правый участок – изометрическая проекция.
Слева от окон проекций расположена панель управления, позволяющая изменять параметры сцены в целом и отдельных её составляющих. Некоторые функции панели управления продублированы в главном меню главного окна программы.
Б.2 Работа с панелью управления
Панель управления разбита на 5 вкладок:
- «примитивы»;
- «свет»;
- «камера»;
- «сцена»;
- «аффинные преобразования».
Вкладка «примитивы» предоставляет пользователю доступ к графической базе данных, позволяя добавлять или удалять графические примитивы, а также редактировать их параметры. При запуске программы сцена «пустая». Для добавления на неё графического примитива, необходимо выбрать его из списка и нажать кнопку «добавить», которая расположена по этим списком. Для удаления примитива, необходимо нажать кнопку «удалить». В списке графических примитивов перед названием каждого из них стоит знак «+», если примитив уже присутствует на сцене. Ниже кнопок удаления и добавления расположены элементы управления, позволяющие редактировать свойства выбранного из списка примитива.
Справа от списка с названиями примитивов расположена кнопка справки, при нажатии на которую пользователь получит информацию о параметрической модели выбранного из списка примитива. Справочная информация будет отображена во всплывающем окне.
Вкладка «свет» предоставляет пользователю возможность управления параметрами источников света, т.е. задавать их положение, цвет и тип. При задании координат источников света в полях ввода изменения вступают в силу немедленно. Для изменения цвета источника света необходимо выбрать нужный источник из списка и нажать кнопку «Выбрать…», расположенную под надписью «Цвет» и выведенном на экран диалоге задать нужный цвет.
Для задания типа источника света, можно воспользоваться элементами управления, расположенными внизу данной вкладки.
Вкладка «камера» даёт возможность задания таких параметров как положение и направление камеры. Для задания этих параметров, необходимо ввести нужные значения в соответствующие поля ввода на данной панели и нажать кнопку «задать».
Вкладка «сцена».
Данная вкладка позволяет пользователю задать тип модели материала для всего объекта, задать размер объекта, сохранить либо загрузить состояние сцены, очистить сцену от графических примитивов, а также получить информацию о времени построения сцены, количестве кадров в секунду, и количестве источников света.
Вкладка «аффинные преобразования» даёт возможность осуществлять аффинные преобразования над сложным объектом. Для осуществления какого-либо аффинного преобразования, необходимо выбрать его название из выпадающего списка и задать параметры в полях ввода, расположенных ниже этого списка, и нажать кнопку «выполнить». При необходимости отмены последнего преобразования необходимо нажать кнопку «отменить последнее преобразование», если необходимо аннулировать все аффинные преобразования, необходимо нажать кнопку «отменить все преобразования».
Б.3 Работа с главным меню
Главное меню содержит следующие подменю:
- «сцена» (позволяет сохранять и загружать текущее сосотояние сцены, а также очищать сцену от графических примитивов);
- «свет» (позволяет включать и отключать источники света);
- «параметры объектов» (позволяет именять цвет, тип модели а также тип материала каждого графического объекта);
- «справка» (позволяет пользователю получить справочную информацию о математических основах графики, используемых в программе, а также получить информацию о самой программе и её разработчике).
Приложение В
ЭКРАННЫЕ ФОРМЫ
Рисунок В.1 – Главное окно приложения с меню и кнопками
Рисунок В.2 – Реализация примитивов сферы
Рисунок В.3 – Реализация примитива полусферы
Рисунок В.4 – Реализация примитивов икосаэдра
Рисунок В.5 – Реализация примитивов треугольной призмы
Рисунок В.6 – Реализация примитивов эллипсоида
Рисунок В.7 – Реализация примитивов косоугольного цилиндра
Рисунок В.8 – Реализация примитивов усеченной пирамиды с треугольным основанием
Рисунок В.9 – Реализация примитивов косоугольной призмы с треугольным основанием
Рисунок В.10 – Окно параметров камеры
Рисунок В.11 – Окно параметров источников света
Рисунок В.12 – Окно параметров афинных преобразований
Рисунок В.13 – Окно параметров сцены
Рисунок В.14 – сложый объект «Робот-краб»
Приложение Г
ЛИСТИНГ ПРОГРАММЫ
_____________KR________________
#include "stdafx.h"
#include <gl/gl.h>
#include <gl/glaux.h>
#include <gl/glu.h>
#include <commctrl.h>
#include <commdlg.h>
#include "mainwnd.h"
#include "panel.h"
#include "primitives.h"
#include "drawscene.h"
#include "camera.h"
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glaux.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "comctl32.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
InitMainWindow(hInstance, "КП по ГГМ [Робот-краб]", 500);
InitCommonControls();
InitPanel(hInstance);
PreSetup();
MSG m;
while(1)
{
if(PeekMessage( &m, 0, 0, 0, PM_NOREMOVE))
{
if(GetMessage(&m, 0, 0, 0))
{
TranslateMessage(&m);
DispatchMessage(&m);
}else return 0;
}
DrawScene();
}
return 0;
}
_____________camera______________
#define CAMERA_
#include <math.h>
void MultMatrix(float *vect, float *matr)
{
float res[4]={0};
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
res[i]+=
vect[j]*
matr[4*j+i];
memcpy(vect, res,4*sizeof(float));
}
class CAMERA
{
public:
struct
{
float posx, posy, posz;
float dirx, diry, dirz;
float xrot, zrot;
}settings;
void GetPosition(float *x, float *y, float *z)
{
*x=settings.posx;
*y=settings.posy;
*z=settings.posz;
}
CAMERA(float PosX, float PosY, float PosZ)
{settings.posx=PosX, settings.posy=PosY, settings.posz=PosZ;
settings.dirx=0; settings.diry=0; settings.dirz=0;
settings.xrot=0;
settings.zrot=0;
}
void GetDirection(float *x, float *y, float *z)
{
*x=settings.dirx;
*y=settings.diry;
*z=settings.dirz;
}
void Dispose(float PosX, float PosY, float PosZ)
{settings.posx=PosX; settings.posy=PosY; settings.posz=PosZ;
}
void Direct(float DirX, float DirY, float DirZ)
{settings.dirx=DirX; settings.diry=DirY; settings.dirz=DirZ;
}
void SetZRot(float rot)
{
settings.zrot=rot;
return;
float pos[]={settings.posx, settings.posy, settings.posz, 1};
settings.posx=pos[0];
settings.posy=pos[1];
____________drawscense_______________
#ifndef DRAWSCENE
#define DRAWSCENE
#include "primitives.h"
void DrawAll()
{
glPushMatrix();
glScalef((ObjHeight)/15, (ObjHeight)/15, (ObjHeight)/15);
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
hsp.Draw();
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
sp.Draw();
cube.Draw();
prism3.Draw();
el.Draw();
cyl.Draw();
pir3.Draw();
kospr[0].Draw();
kospr[1].Draw();
glPopMatrix();
if(DrawAxes)
{
if(AxesAlwaysOnTop)
glDisable(GL_DEPTH_TEST);
glPushMatrix();
glLoadIdentity();
glDisable(GL_LIGHTING);
glBegin(GL_LINES);
glColor3f(1, 0, 0);
glVertex3f(0, 0, 0);
glVertex3f(100, 0, 0);
glColor3f(0, 1, 0);
glVertex3f(0, 0, 0);
glVertex3f(0, 100, 0);
glColor3f(0, 0, 1);
glVertex3f(0, 0, 0);
glVertex3f(0, 0, 100);
glEnd();
glEnable(GL_POINT_SMOOTH);
glPointSize(4);
glColor3f(1, 1, 1);
glBegin(GL_POINTS);
for(int i=0; i<100; i++)
{
glVertex3f(i, 0, 0);
glVertex3f(0, i, 0);
glVertex3f(0, 0, i);
}
glEnd();
glEnable(GL_LIGHTING);
glPopMatrix();
}
if(AxesAlwaysOnTop)
glEnable(GL_DEPTH_TEST);
}
int Frames=0;
int Seconds=0;
int ms=0;
void DrawScene()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDisable(GL_LIGHTING);
SetViewport(VP_LEFTTOP, (FullScreenVP==VP_LEFTTOP)?true:false );
if(FullScreenVP==VP_LEFTTOP || FullScreenVP==-1) {DrawAll();
glColor3d(0,0,0);
OutText(0, 17.5, 19, "OYZ");
}
glDisable(GL_LIGHTING);
SetViewport(VP_RIGHTTOP, (FullScreenVP==VP_RIGHTTOP)?true:false);
if(FullScreenVP==VP_RIGHTTOP || FullScreenVP==-1) {DrawAll();
glColor3d(0,0,0);
OutText(17.5, 0, -19, "OXZ");
}
glDisable(GL_LIGHTING );
SetViewport(VP_LEFTBOTTOM, (FullScreenVP==VP_LEFTBOTTOM)?true:false);
if(FullScreenVP==VP_LEFTBOTTOM || FullScreenVP==-1) {DrawAll();
glColor3d(0,0,0);
OutText(-19, 17.5, 0, "OXY");
}
int tc=GetTickCount();
glEnable(GL_LIGHTING);
float d[3]={0};
float p[4]={20, 0, 0, 0};
SetViewport(VP_RIGHTBOTTOM, (FullScreenVP==VP_RIGHTBOTTOM)?true:false );
if(FullScreenVP==VP_RIGHTBOTTOM || FullScreenVP==-1) {DrawAll();
for(int i=0; i<4; i++)
lights[i].Draw();
}
SwapBuffers(wglGetCurrentDC());
char s[20];
Frames++;
Seconds+=GetTickCount()-tc;
if(IsWindow(hSceneParams) && Seconds>=100)
{
sprintf(s, "FPS:%.0f", (float)Frames/((float)Seconds/1000));
SetDlgItemText(hSceneParams, IDC_FPS, s);
Seconds=0;
Frames=0;
}
ms+=GetTickCount()-tc;
if(IsWindow(hSceneParams) && ms>=500)
{
sprintf(s, "Время построения (мс):%i", (GetTickCount()-tc));
SetDlgItemText(hSceneParams, IDC_RENDER_TIME, s);
ms=0;
}
}
#endif
__________globals____________
#ifndef GLOBALS_
#define GLOBALS_
#include <stdio.h>
#include "light.h"
#include "camera.h"
#include "primitives.h"
#include "resource.h"
#define HLP_DIR "help"
#define HLP_PRIM 0
#define HLP_AFF_AJ 8
LIGHT lights[4]={LIGHT(GL_LIGHT0), LIGHT(GL_LIGHT1), LIGHT(GL_LIGHT2),
LIGHT(GL_LIGHT3)};
float ObjHeight=15;
CAMERA camera(0, 0, 5);
void MultMatrix(float *vect, float matr[4][4]);
char helpText[1500];
char *HelpFiles[]={"sp.txt", "hsp.txt", "cube.txt", "prism5.txt", "pir5.txt", "cone.txt",
"pir3.txt", "prism3.txt",
"translate.txt", "scale.txt", "shift.txt", "rotate.txt", "refl.txt"};
char *HelpCaptions[]={"Параметрическая модель сферы", "Параметрическая полусферы",
"Параметрическая модель эллипсоида", "Параметрическая модель призмы с треугольным основанием",
"Параметрическая модель косоугольной призмы с 3уг. основанием",
"Параметрическая модель косоугольного цилиндра", "Параметрическая модель усеч. пир. с 3уг основанием",
"Параметрическая модель призмы с 3уг. основанием",
"Матрица переноса:", "Матрица масштабировния:", "Матрица сдвига:", "Матрицы поворота",
"Матрица отражения"};
HALFSPHERE hsp(0, 0 , 0, 1, 1, 0, 0);
SPHERE sp(0, 0, 0, 1 , 0, 1, 0);
IKO cube( 0, 0, 0, 1, 0 );
PRISM3 prism3 ( 0, -6, 0, 1, 0 );
ELIPS el(0, 0, 0);
CYL cyl( 1, 1, 1, 1, 0, .6 , .5);
PIRAMID3 pir3(0, 0, 0, 2, 0, 1);
KOSPR kospr[2]={KOSPR(1, 1, 1, 0, 0, .5), KOSPR(1, 1, 1, 0, 0, .5) };
OBJECT3D *Objects[9]={&sp, &hsp, &prism3,
&el, &cyl, &pir3, &kospr[0], &kospr[1]};
OBJECT3D *ObjectsNotAll[8]={&sp, &hsp, &prism3,
&el, &cyl, &pir3, &kospr[0]};
bool ajusted=false;
bool AxesAlwaysOnTop=false;
HWND hSceneParams=0;
HWND hLightParams=0;
HWND hPrimParams=0;
HWND hAffAjWnd=0;
HWND hCamDlg;
HWND hWndMain;
HINSTANCE hInst;
int FullScreenVP=-1;
HWND hHorSeparator, hVertSeparator;
void ShowSeparators(int cmd)
{
ShowWindow(hHorSeparator, cmd);
ShowWindow(hVertSeparator, cmd);
}
int ObjMat=-1;
int ObjModel=-1;
GLdouble mprojection[16];
GLdouble mmodelview[16];
int mviewport[4];
double ltx, lty, ltz;
bool DrawAxes=false;
void OutText(float x, float y, float z, char *s)
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos3f(x, y, z);
glColor3f(1, 1, 1);
int l=strlen(s);
for(int i=0; i<l; i++)
{
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, s[i]);
}
glPopMatrix();
}
char fn[MAX_PATH];
void SaveScene()
{
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(ofn));
ofn.hwndOwner=hWndMain;
ofn.lpstrTitle="Сохранение состояния сцены";
ofn.lStructSize=sizeof(ofn);
ofn.lpstrFile=fn;
ofn.nMaxFile=MAX_PATH;
ofn.lpstrFilter="*.scn\0*.scn\0\0";
ofn.lpstrDefExt="scn";
ofn.Flags=OFN_FILEMUSTEXIST|OFN_EXTENSIONDIFFERENT|OFN_OVERWRITEPROMPT;
if(!GetSaveFileName(&ofn)) return;
FILE *f=fopen(fn, "wb");
for(int i=0; i<12; i++)
fwrite(&Objects[i]->settings, sizeof(Objects[i]->settings), 1, f);
for(i=0; i<4; i++)
fwrite(&lights[i].settings, sizeof(lights[i].settings), 1, f);
fwrite(&camera.settings, sizeof(camera.settings), 1, f);
fwrite(&ObjModel, sizeof(ObjModel), 1, f);
fwrite(&ObjMat, sizeof(ObjMat), 1, f);
fwrite(&FullScreenVP, sizeof(FullScreenVP), 1, f);
float mvm[16];
glGetFloatv(GL_MODELVIEW_MATRIX, (float*)mvm);
fwrite(mvm, sizeof(mvm), 1, f);
fwrite(&ajusted, sizeof(ajusted), 1, f);
fwrite(&DrawAxes, sizeof(DrawAxes), 1, f);
fwrite(&AxesAlwaysOnTop, sizeof(AxesAlwaysOnTop), 1, f);
fwrite(&ObjHeight, sizeof(ObjHeight), 1, f);
fclose(f);
}
bool JustLoaded=false;
void LoadScene()
{
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(ofn));
ofn.hwndOwner=hWndMain;
ofn.lpstrTitle="Выберите файл с параметрами сцены";
ofn.lStructSize=sizeof(ofn);
ofn.lpstrFile=fn;
ofn.nMaxFile=MAX_PATH;
ofn.lpstrFilter="*.scn\0*.scn\0\0";
ofn.Flags=OFN_FILEMUSTEXIST|OFN_EXTENSIONDIFFERENT;
if(!GetOpenFileName(&ofn)) return;
FILE *f=fopen(fn, "rb");
for(int i=0; i<12; i++)
fread(&Objects[i]->settings, sizeof(Objects[i]->settings), 1, f);
for(i=0; i<4; i++)
{
fread(&lights[i].settings, sizeof(lights[i].settings), 1, f);
lights[i].Dispose(lights[i].settings.pos[0], lights[i].settings.pos[1], lights[i].settings.pos[2], 0);
if(lights[i].settings.shining) lights[i].TurnOn();
else lights[i].TurnOff();
lights[i].SetColor(lights[i].settings.color[0], lights[i].settings.color[1],lights[i].settings.color[2]);
lights[i].SetLightModelType(lights[i].settings.lightmodeltype);
HMENU hMenu=GetMenu(hWndMain);
CheckMenuItem(hMenu, IDC_LIGHT0+i, MF_BYCOMMAND|(lights[i].Shining())?
MF_CHECKED:MF_UNCHECKED);
}
fread(&camera.settings, sizeof(camera.settings), 1, f);
fread(&ObjModel, sizeof(ObjModel), 1, f);
fread(&ObjMat, sizeof(ObjMat), 1, f);
fread(&FullScreenVP, sizeof(FullScreenVP), 1, f);
if(FullScreenVP!=-1) ShowSeparators(SW_HIDE);
else ShowSeparators(SW_SHOW);
float mvm[16];
fread(mvm, sizeof(mvm), 1, f);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(mvm);
fread(&ajusted, sizeof(ajusted), 1, f);
fread(&DrawAxes, sizeof(DrawAxes), 1, f);
fread(&AxesAlwaysOnTop, sizeof(DrawAxes), 1, f);
fread(&ObjHeight, sizeof(ObjHeight), 1, f);
JustLoaded=true;
if(IsWindow(hSceneParams))
SendMessage(hSceneParams, WM_INITDIALOG, 0, 0);
if(IsWindow(hPrimParams))
SendMessage(hPrimParams, WM_INITDIALOG, 0, 0);
if(IsWindow(hAffAjWnd))
SendMessage(hAffAjWnd, WM_INITDIALOG, 0, 0);
if(IsWindow(hLightParams))
SendMessage(hLightParams, WM_INITDIALOG, 0, 0);
if(IsWindow(hCamDlg))
SendMessage(hCamDlg, WM_INITDIALOG, 0, 0);
fclose(f);
}
void SetPrimitiveColor(int obj, HWND hR, HWND hG, HWND hB);
void SetModelRadio(int obj, HWND hSolid, HWND hWire);
void LoadHelpText(char *fn, char *ret, ULONG count)
{
OFSTRUCT ofs;
char hfn[MAX_PATH];
sprintf(hfn, "%s\\%s",HLP_DIR, fn);
HANDLE hFile=(HANDLE)OpenFile(hfn, &ofs, OF_READ);
DWORD fsize=GetFileSize(hFile, 0);
if(fsize>count)
{
strcpy(ret, "! Ошибка при загрузке файла справки");
CloseHandle(hFile);
return;
}
ReadFile(hFile, ret, count, &count, NULL);
ret[count]=0;
CloseHandle(hFile);
}
#endif
____________glsetupe__________________
#ifndef GLSETUP
#define GLSETUP
#include <stdio.h>
#include <math.h>
#include "camera.h"
#include "globals.h"
#define VP_RIGHTBOTTOM 0
#define VP_LEFTBOTTOM 1
#define VP_RIGHTTOP 2
#define VP_LEFTTOP 3
void SetOrtho();
void SetPerspective();
void SetViewport(int vp, bool fullscreen=false)
{
RECT rct;
GetClientRect(hWndMain, &rct);
int h=rct.bottom;
int w=rct.right-200;
if(fullscreen)
{
h*=2;
w*=2;
}
switch(vp)
{
case VP_RIGHTBOTTOM:
glViewport(!fullscreen?w/2:0, 0, w/2, h/2);
SetPerspective();
camera.Apply();
break;
case VP_LEFTBOTTOM:
glViewport(0, 0, w/2, h/2);
SetOrtho();
gluLookAt(0, 0, 4, 0, 0, 0, 0, 1, 0);
break;
case VP_LEFTTOP:
glViewport(0, !fullscreen?h/2:0, w/2, h/2);
SetOrtho();
gluLookAt(4, 0, 0, 0, 0, 0, 1 , 1, 0);
break;
case VP_RIGHTTOP:
glViewport(!fullscreen?w/2:0, !fullscreen?h/2:0, w/2, h/2);
SetOrtho();
gluLookAt(0, 4, 0, 0, 0, 0, 1 , 0, 0);
break;
}
glMatrixMode(GL_MODELVIEW);
}
void SetOrtho()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-20, 20, -20, 20, -20, 20);
}
void SetPerspective()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float ang=(acos(1.f/sqrt(3))/3.14)*180;
glOrtho(-30, 30, -30, 30, -30, 30);
glRotatef(ang, 1, 0, 0);
glRotatef(-ang, 0, 1, 0);
}
bool PtInViewport(int x, int y, int vp)
{
POINT pt={x, y};
RECT wndrct;
GetClientRect(hWndMain, &wndrct);
int h=wndrct.bottom;
int w=wndrct.right-200;
RECT VPRect;
if(vp==VP_LEFTTOP)
{
VPRect.left=0;
VPRect.top=0;
VPRect.right=w/2;
VPRect.bottom=h/2;
return PtInRect(&VPRect, pt);
}
if(vp==VP_LEFTBOTTOM)
{
VPRect.left=0;
VPRect.top=h/2;
VPRect.right=w/2;
VPRect.bottom=h;
return PtInRect(&VPRect, pt);
}
if(vp==VP_RIGHTTOP)
{
VPRect.left=w/2;
VPRect.top=0;
VPRect.right=w;
VPRect.bottom=h/2;
return PtInRect(&VPRect, pt);
}
if(vp==VP_RIGHTBOTTOM)
{
VPRect.left=w/2;
VPRect.top=h/2;
VPRect.right=w;
VPRect.bottom=h;
return PtInRect(&VPRect, pt);
}
}
void PreSetup()
{
glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
lights[0].SetColor(1, .2, .95);
lights[0].Dispose(-20, -15, 0, 0);
lights[0].SetLightModelType(LMT_CYL);
lights[1].SetColor(1, 0, 0);
lights[1].Dispose(15, 0, -20, -1);
lights[1].SetLightModelType(LMT_POINT);
lights[2].SetColor(0, 1, 0);
lights[2].Dispose(15, -20, 10, 1);
lights[2].SetLightModelType(LMT_REMOTE);
glGetDoublev(GL_MODELVIEW_MATRIX, mmodelview);
glGetDoublev(GL_PROJECTION_MATRIX, mprojection);
glClearColor(.5, .5 ,.5, 0);
}
void SetPF(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
int index=ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, index, &pfd);
}
#endif
_________light___________________
#ifndef LIGHT_
#define LIGHT_
#define LMT_POINT 0
#define LMT_CYL 1
#define LMT_REMOTE 2
class LIGHT
{
public:
struct
{
float pos[4];
float dir[3];
float color[4];
int lightmodeltype;
GLboolean shining;
} settings;
int index;
void Draw()
{
if(!Shining()) return;
glDisable(GL_LIGHTING);
glPushMatrix();
glLoadIdentity();
glTranslatef(settings.pos[0], settings.pos[1], settings.pos[2]);
glColor3f(settings.color[0], settings.color[1], settings.color[2]);
auxSolidSphere(1);
glPopMatrix();
glEnable(GL_LIGHTING);
}
GLenum GetIndex() {return index;}
bool Shining()
{
glGetBooleanv(index, &settings.shining);
return settings.shining;
}
LIGHT& TurnOn()
{
glEnable(index);
settings.shining=true;
return *this;
}
LIGHT& TurnOff()
{
glDisable(index);
settings.shining=false;
return *this;
}
LIGHT(int gllight):index(gllight)
{
index=gllight;
};
~LIGHT(){glDisable(index);}
void SetLightModelType(int lmt)
{
switch(lmt)
{
case LMT_POINT:
Dispose(settings.pos[0], settings.pos[1], settings.pos[2], 0);
glLightf(index, GL_SPOT_CUTOFF, 180);
break;
case LMT_REMOTE:
Dispose(settings.pos[0], settings.pos[1], settings.pos[2], -1);
glLightf(index, GL_SPOT_CUTOFF, 180);
break;
case LMT_CYL:
Dispose(settings.pos[0], settings.pos[1], settings.pos[2], 1);
glLightf(index, GL_SPOT_CUTOFF, 85);
break;
}
settings.lightmodeltype=lmt;
}
void Dispose(float PosX, float PosY, float PosZ, float PosT)
{
settings.pos[0]=PosX;
settings.pos[1]=PosY;
settings.pos[2]=PosZ;
settings.pos[3]=PosT;
glLightfv(index, GL_POSITION, settings.pos);
}
LIGHT& Direct(float DirX, float DirY, float DirZ)
{
settings.dir[0]=DirX;
settings.dir[1]=DirY;
settings.dir[2]=DirZ;
glLightfv(index, GL_SPOT_DIRECTION, settings.pos);
return *this;
}
LIGHT& SetColor(float r, float g, float b)
{
settings.color[0]=r;
settings.color[1]=g;
settings.color[2]=b;
settings.color[3]=0;
glLightfv(index, GL_SPECULAR, settings.color);
glLightfv(index, GL_DIFFUSE, settings.color);
return *this;
}
void GetPosition(float *x, float *y, float *z)
{
if(x)
*x=settings.pos[0];
if(y)
*y=settings.pos[1];
if(z)
*z=settings.pos[2];
}
void GetDirection(float *x, float *y, float *z)
{
if(x)
*x=settings.dir[0];
if(y)
*y=settings.dir[1];
if(z)
*z=settings.dir[2];
}
void GetColor(float *r, float *g, float *b)
{
*r=settings.color[0];
*g=settings.color[1];
*b=settings.color[2];
}
};
#endif
________________mainwnd_____________
#ifndef MAINWND_
#define MAINWND_
#include <winuser.h>
#include <windows.h>
#include "menu.h"
#define WM_MOUSEWHEEL 0x020A
float angx=0, angz=0;
float rho=20;
float fi, t;
#include "glsetup.h"
#include "resource.h"
#include "panel_camera.h"
#include "light.h"
int oldx, oldz;
bool pr=false;
char s[20];
bool rbfs=false;
void ObjMenuHandler(int cmd)
{
HMENU hMenu=GetMenu(hWndMain);
switch(cmd)
{
case ID_SP_COLOR:
SetPrimitiveColor(0, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
case ID_HSP_COLOR:
SetPrimitiveColor(1, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
case ID_CUBE_COLOR:
SetPrimitiveColor(PR_IKO, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
case ID_PRISM3_COLOR:
SetPrimitiveColor(3, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
case ID_ELIPS_COLOR:
SetPrimitiveColor(4, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
case ID_CYL_COLOR:
SetPrimitiveColor(5, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
case ID_KOSPR_COLOR:
SetPrimitiveColor(7, GetDlgItem(hPrimParams, IDC_OBJ_COLORR),
GetDlgItem(hPrimParams, IDC_OBJ_COLORR), GetDlgItem(hPrimParams, IDC_OBJ_COLORB));
break;
/////MODEL
case ID_SP_SOLID:
CheckItem(GetMenu(hWndMain), PR_SPHERE, PARAM_MODEL, MODEL_SOLID);
break;
case ID_SP_WIRE:
CheckItem(GetMenu(hWndMain), PR_SPHERE, PARAM_MODEL, MODEL_WIRE);
break;
case ID_HSP_SOLID:
CheckItem(GetMenu(hWndMain), PR_HALFSPHERE, PARAM_MODEL, MODEL_SOLID);
break;
case ID_HSP_WIRE:
CheckItem(GetMenu(hWndMain), PR_HALFSPHERE, PARAM_MODEL, MODEL_WIRE);
break;
case ID_CYL_SOLID:
CheckItem(GetMenu(hWndMain), PR_CYL, PARAM_MODEL, MODEL_SOLID);
break;
case ID_CYL_WIRE:
CheckItem(GetMenu(hWndMain), PR_CYL, PARAM_MODEL, MODEL_WIRE);
break;
case ID_CUBE_SOLID:
CheckItem(GetMenu(hWndMain), PR_IKO, PARAM_MODEL, MODEL_SOLID);
break;
case ID_CUBE_WIRE:
CheckItem(GetMenu(hWndMain), PR_IKO, PARAM_MODEL, MODEL_WIRE);
break;
case ID_PIR3_SOLID:
CheckItem(GetMenu(hWndMain), PR_PIRAMID3, PARAM_MODEL, MODEL_SOLID);
break;
case ID_PIR3_WIRE:
CheckItem(GetMenu(hWndMain), PR_PIRAMID3, PARAM_MODEL, MODEL_WIRE);
break;
case ID_ELIPS_SOLID:
CheckItem(GetMenu(hWndMain), PR_ELIPS, PARAM_MODEL, MODEL_SOLID);
break;
case ID_ELIPS_WIRE:
CheckItem(GetMenu(hWndMain), PR_ELIPS, PARAM_MODEL, MODEL_WIRE);
break;
case ID_KOSPR_SOLID:
CheckItem(GetMenu(hWndMain), PR_KOSPR, PARAM_MODEL, MODEL_SOLID);
break;
case ID_KOSPR_WIRE:
CheckItem(GetMenu(hWndMain), PR_KOSPR, PARAM_MODEL, MODEL_WIRE);
break;
case ID_PRISM3_SOLID:
CheckItem(GetMenu(hWndMain), PR_PRISM3, PARAM_MODEL, MODEL_SOLID);
break;
case ID_PRISM3_WIRE:
CheckItem(GetMenu(hWndMain), PR_PRISM3, PARAM_MODEL, MODEL_WIRE);
break;
////MATERIAL
case ID_SP_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_SPHERE, PARAM_MAT, MAT_DIFF);
break;
case ID_SP_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_SPHERE, PARAM_MAT, MAT_SPEC);
break;
case ID_HSP_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_HALFSPHERE, PARAM_MAT, MAT_DIFF);
break;
case ID_HSP_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_HALFSPHERE, PARAM_MAT, MAT_SPEC);
break;
case ID_CYL_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_CYL, PARAM_MAT, MAT_DIFF);
break;
case ID_CYL_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_CYL, PARAM_MAT, MAT_SPEC);
break;
case ID_CUBE_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_IKO, PARAM_MAT, MAT_DIFF);
break;
case ID_CUBE_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_IKO, PARAM_MAT, MAT_SPEC);
break;
case ID_PIR3_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_PIRAMID3, PARAM_MAT, MAT_DIFF);
break;
case ID_PIR3_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_PIRAMID3, PARAM_MAT, MAT_SPEC);
break;
case ID_ELIPS_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_ELIPS, PARAM_MAT, MAT_DIFF);
break;
case ID_ELIPS_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_ELIPS, PARAM_MAT, MAT_SPEC);
break;
case ID_KOSPR_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_KOSPR, PARAM_MAT, MAT_DIFF);
break;
case ID_KOSPR_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_KOSPR, PARAM_MAT, MAT_SPEC);
break;
case ID_PRISM3_MAT_DIFF:
CheckItem(GetMenu(hWndMain), PR_PRISM3, PARAM_MAT, MAT_DIFF);
break;
case ID_PRISM3_MAT_SPEC:
CheckItem(GetMenu(hWndMain), PR_PRISM3, PARAM_MAT, MAT_SPEC);
break;
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_COMMAND:
if(LOWORD(wParam)==ID_ABOUT)
MessageBox(hWnd, TEXT("Данная программа является курсовым проектом")
TEXT(" по дисциплине\n \"Графическое геометрическое ")
TEXT("моделирование.\""), "О программе", MB_OK|MB_ICONINFORMATION);
if(LOWORD(wParam)==ID_CLEARSCENE)
{
for(int i=0; i<12; i++)
Objects[i]->settings.visible=false;
SendMessage(hPrimParams, WM_INITDIALOG, 0, 0);
}
if(LOWORD(wParam)==ID_AUTOR)
MessageBox(hWnd, "Курсовой проект выполнен студентом 3-го курса гр. ИС-08а Билыком Н.О.",
"Об авторе", MB_OK|MB_ICONINFORMATION);
if(LOWORD(wParam)==ID_SAVESCENE) SaveScene();
if(LOWORD(wParam)==ID_LOADSCENE) LoadScene();
if(LOWORD(wParam)>=IDC_LIGHT0 && LOWORD(wParam)<=IDC_LIGHT7)
{
int lightind=LOWORD(wParam)-IDC_LIGHT0;
if(lights[lightind].Shining())
lights[lightind].TurnOff();
else lights[lightind].TurnOn();
HMENU hMenu=GetMenu(hWnd);
CheckMenuItem(hMenu, LOWORD(wParam), MF_BYCOMMAND|(lights[lightind].Shining())?
MF_CHECKED:MF_UNCHECKED);
if(SendMessage(GetDlgItem(hLightParams, IDC_LIGHTS), CB_GETCURSEL, 0, 0)==lightind)
SendMessage(GetDlgItem(hLightParams, IDC_LIGHT_ON), BM_SETCHECK,
lights[lightind].Shining(), 0);
}
if(HIWORD(wParam)==0) ObjMenuHandler(LOWORD(wParam));
break;
case WM_DESTROY: PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
if(PtInViewport(LOWORD(lParam), HIWORD(lParam), VP_RIGHTBOTTOM) || FullScreenVP!=-1)
{
SetCapture(hWnd);
oldz=HIWORD(lParam);
oldx=LOWORD(lParam);
pr=true;
}
break;
case WM_LBUTTONUP: ReleaseCapture();
pr=false;
break;
case WM_MOUSEMOVE:
if(pr){
angx=(oldx-LOWORD(lParam))/10.f;
camera.SetZRot(camera.settings.zrot-angx);
camera.SetXRot(camera.settings.xrot+angz);
UpdateCamPanel();
camera.Direct(0, 0, 0);
}
break;
case WM_KEYDOWN:
if(LOWORD(wParam)==VK_ADD) rho--;
if(LOWORD(wParam)==VK_SUBTRACT) rho++;
break;
case WM_RBUTTONDBLCLK:
if(FullScreenVP!=-1) {FullScreenVP=-1; ShowSeparators(SW_SHOW); break;}
if(PtInViewport(LOWORD(lParam), HIWORD(lParam), VP_LEFTTOP))
{
FullScreenVP=VP_LEFTTOP;
ShowSeparators(SW_HIDE);
}
if(PtInViewport(LOWORD(lParam), HIWORD(lParam), VP_LEFTBOTTOM))
{
FullScreenVP=VP_LEFTBOTTOM;
ShowSeparators(SW_HIDE);
}
if(PtInViewport(LOWORD(lParam), HIWORD(lParam), VP_RIGHTTOP))
{
FullScreenVP=VP_RIGHTTOP;
ShowSeparators(SW_HIDE);
}
if(PtInViewport(LOWORD(lParam), HIWORD(lParam), VP_RIGHTBOTTOM))
{
FullScreenVP=VP_RIGHTBOTTOM;
ShowSeparators(SW_HIDE);
}
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
void InitMainWindow(HINSTANCE hInstance, char *caption, int wdth)
{
WNDCLASS wcl;
memset(&wcl, 0, sizeof(wcl));
wcl.hbrBackground=(HBRUSH)COLOR_WINDOW;
wcl.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor=LoadCursor(NULL, IDC_ARROW);
wcl.hInstance=hInstance;
wcl.lpszClassName="main_wnd";
wcl.lpfnWndProc=WndProc;
wcl.lpszMenuName="menu";
wcl.style=CS_DBLCLKS;
RegisterClass(&wcl);
int height=2*GetSystemMetrics(SM_CYFIXEDFRAME)+GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYMENU)+wdth;
int width=2*GetSystemMetrics(SM_CXFIXEDFRAME)+wdth+200;
hWndMain=CreateWindow("main_wnd", caption, WS_MINIMIZEBOX|WS_CLIPCHILDREN|
WS_CLIPSIBLINGS|WS_POPUPWINDOW|WS_CAPTION|WS_SYSMENU, 0, 0, width, height, NULL, NULL, hInstance, NULL);
SetMenu(hHorSeparator=CreateWindow( "main_wnd", "", WS_VISIBLE|WS_CHILD,
0, wdth/2, 500, 3, hWndMain, NULL, hInstance, NULL), 0);
SetMenu(hVertSeparator=CreateWindow( "main_wnd", "", WS_VISIBLE|WS_CHILD,
wdth/2, 0, 3, 500, hWndMain, NULL, hInstance, NULL), 0);
int cxscr=GetSystemMetrics(SM_CXSCREEN);
int cyscr=GetSystemMetrics(SM_CYSCREEN);
MoveWindow( hWndMain, (cxscr-width)/2, (cyscr-height)/2, width, height, true);
ShowWindow(hWndMain, SW_SHOW);
UpdateWindow(hWndMain);
HMENU hMenu=GetMenu(hWndMain);
CheckMenuRadioItem( hMenu, ID_PRISM3_SOLID, ID_PRISM3_SOLID, ID_PRISM3_SOLID, MF_BYCOMMAND);
CheckMenuRadioItem(hMenu, ID_CYL_SOLID, ID_CYL_SOLID, ID_CYL_SOLID, MF_BYCOMMAND);
SetMenuItemBitmaps(hMenu, IDC_LIGHT0, 0, LoadBitmap(hInstance, "light_off"), LoadBitmap(hInstance, "light_on"));
SetMenuItemBitmaps(hMenu, IDC_LIGHT1, 0, LoadBitmap(hInstance, "light_off"), LoadBitmap(hInstance, "light_on"));
SetMenuItemBitmaps(hMenu, IDC_LIGHT2, 0, LoadBitmap(hInstance, "light_off"), LoadBitmap(hInstance, "light_on"));
SetMenuItemBitmaps(hMenu, IDC_LIGHT3, 0, LoadBitmap(hInstance, "light_off"), LoadBitmap(hInstance, "light_on"));
SetMenuItemBitmaps(hMenu, ID_LOADSCENE, 0,
LoadBitmap(hInstance, "open"), LoadBitmap(hInstance, "open"));
SetMenuItemBitmaps(hMenu, ID_SAVESCENE, 0,
LoadBitmap(hInstance, "save"), LoadBitmap(hInstance, "save"));
SetMenuItemBitmaps(hMenu, ID_CLEARSCENE, 0,
LoadBitmap(hInstance, "clear"), LoadBitmap(hInstance, "clear"));
SetMenuItemBitmaps(hMenu, ID_ABOUT, 0,
LoadBitmap(hInstance, "?"), LoadBitmap(hInstance, "?"));
SetMenuItemBitmaps(hMenu, ID_HELP_CONTENT, 0,
LoadBitmap(hInstance, "help"), LoadBitmap(hInstance, "help"));
HDC hdc=GetDC(hWndMain);
SetPF(hdc);
HGLRC gldc=wglCreateContext(hdc);
wglMakeCurrent(hdc, gldc);
}
#endif
___________menu________________
#ifndef MENU_
#define MENU_
#include "resource.h"
#include "globals.h"
#include <algorithm>
#define MODEL_SOLID 0
#define MODEL_WIRE 1
#define MAT_DIFF 0
#define MAT_SPEC 1
#define PARAM_MODEL 0
#define PARAM_MAT 1
int GetMenuItem(int obj, int param, int value)
{
int mi[8][2][2];
mi[PR_SPHERE][PARAM_MODEL][MODEL_SOLID]=ID_SP_SOLID;
mi[PR_SPHERE][PARAM_MODEL][MODEL_WIRE]=ID_SP_WIRE;
mi[PR_HALFSPHERE][PARAM_MODEL][MODEL_SOLID]=ID_HSP_SOLID;
mi[PR_HALFSPHERE][PARAM_MODEL][MODEL_WIRE]=ID_HSP_WIRE;
mi[PR_CYL][PARAM_MODEL][MODEL_SOLID]=ID_CYL_SOLID;
mi[PR_CYL][PARAM_MODEL][MODEL_WIRE]=ID_CYL_WIRE;
mi[PR_PIRAMID3][PARAM_MODEL][MODEL_SOLID]=ID_PIR3_SOLID;
mi[PR_PIRAMID3][PARAM_MODEL][MODEL_WIRE]=ID_PIR3_WIRE;
mi[PR_ELIPS][PARAM_MODEL][MODEL_SOLID]=ID_ELIPS_SOLID;
mi[PR_ELIPS][PARAM_MODEL][MODEL_WIRE]=ID_ELIPS_WIRE;
mi[PR_PRISM3][PARAM_MODEL][MODEL_SOLID]=ID_PRISM3_SOLID;
mi[PR_PRISM3][PARAM_MODEL][MODEL_WIRE]=ID_PRISM3_WIRE;
mi[PR_KOSPR][PARAM_MODEL][MODEL_SOLID]=ID_KOSPR_SOLID;
mi[PR_KOSPR][PARAM_MODEL][MODEL_WIRE]=ID_KOSPR_WIRE;
mi[PR_IKO][PARAM_MODEL][MODEL_SOLID]=ID_CUBE_SOLID;
mi[PR_IKO][PARAM_MODEL][MODEL_WIRE]=ID_CUBE_WIRE;
//////////////////////////////////////////////////
mi[PR_SPHERE][PARAM_MAT][MAT_DIFF]=ID_SP_MAT_DIFF;
mi[PR_SPHERE][PARAM_MAT][MAT_SPEC]=ID_SP_MAT_SPEC;
mi[PR_HALFSPHERE][PARAM_MAT][MAT_DIFF]=ID_HSP_MAT_DIFF;
mi[PR_HALFSPHERE][PARAM_MAT][MAT_SPEC]=ID_HSP_MAT_SPEC;
mi[PR_CYL][PARAM_MAT][MAT_DIFF]=ID_CYL_MAT_DIFF;
mi[PR_CYL][PARAM_MAT][MAT_SPEC]=ID_CYL_MAT_SPEC;
mi[PR_PIRAMID3][PARAM_MAT][MAT_DIFF]=ID_PIR3_MAT_DIFF;
mi[PR_PIRAMID3][PARAM_MAT][MAT_SPEC]=ID_PIR3_MAT_SPEC;
mi[PR_ELIPS][PARAM_MAT][MAT_DIFF]=ID_ELIPS_MAT_DIFF;
mi[PR_ELIPS][PARAM_MAT][MAT_SPEC]=ID_ELIPS_MAT_SPEC;
mi[PR_PRISM3][PARAM_MAT][MAT_DIFF]=ID_PRISM3_MAT_DIFF;
mi[PR_PRISM3][PARAM_MAT][MAT_SPEC]=ID_PRISM3_MAT_SPEC;
mi[PR_KOSPR][PARAM_MAT][MAT_DIFF]=ID_KOSPR_MAT_DIFF;
mi[PR_KOSPR][PARAM_MAT][MAT_SPEC]=ID_KOSPR_MAT_SPEC;
mi[PR_IKO][PARAM_MAT][MAT_DIFF]=ID_CUBE_MAT_DIFF;
mi[PR_IKO][PARAM_MAT][MAT_SPEC]=ID_CUBE_MAT_SPEC;
return mi[obj][param][value];
}
void CheckItem(HMENU hMenu, int obj, int param, int value, bool setup=true)
{
int value2=(!value)?(value+1):(value-1);
int gr1=GetMenuItem(obj, param, value);
int gr2=GetMenuItem(obj, param, value2);
if(value>value2)
CheckMenuRadioItem( hMenu, gr2, gr1, gr1, MF_BYCOMMAND);
else
CheckMenuRadioItem( hMenu, gr1, gr2, gr1, MF_BYCOMMAND);
if(!setup) return;
if(param==PARAM_MAT)
{
if(obj==PR_KOSPR)
{
for(int i=0; i<2; i++)
kospr[i].SetMaterial((value==MAT_DIFF)?GL_DIFFUSE:GL_SPECULAR);
return;
}
if(obj==PR_PRISM3)
{
prism3.SetMaterial((value==MAT_DIFF)?GL_DIFFUSE:GL_SPECULAR);
}
ObjectsNotAll[obj]->SetMaterial((value==MAT_DIFF)?GL_DIFFUSE:GL_SPECULAR);
if(IsWindow(hPrimParams))
{
int cs=SendMessage(GetDlgItem(hPrimParams, IDC_OBJECTS_LIST), CB_GETCURSEL, 0, 0);
if(cs==obj)
{
if(param==PARAM_MAT)
SendMessage(GetDlgItem(hPrimParams, IDC_OBJ_MATERIAL), CB_SETCURSEL, (value==MAT_SPEC)?1:0, 0);
}
}
}
if(param==PARAM_MODEL)
{
if(obj==PR_PRISM3)
{
prism3.settings.model=(value==MODEL_SOLID)?GL_FILL:GL_LINE;
}
if(obj==PR_KOSPR)
{
for(int i=0; i<2; i++)
kospr[i].settings.model=(value==MODEL_SOLID)?GL_FILL:GL_LINE;
return;
}
ObjectsNotAll[obj]->settings.model=(value==MODEL_SOLID)?GL_FILL:GL_LINE;
if(IsWindow(hPrimParams))
{
int cs=SendMessage(GetDlgItem(hPrimParams, IDC_OBJECTS_LIST), CB_GETCURSEL, 0, 0);
if(cs==obj)
SetModelRadio(obj, GetDlgItem(hPrimParams, IDC_SOLID), GetDlgItem(hPrimParams, IDC_WIRE));
}
}
}
#endif
_____________panel_______________
#include "resource.h"
#include "drawscene.h"
#include "primitives.h"
#include "panel_primitives.h"
#include "panel_camera.h"
#include "panel_light.h"
#include "panel_scene.h"
#include "panel_aff_aj.h"
#include <commctrl.h>
#include <commdlg.h>
HWND hPage;
LRESULT CALLBACK PanelWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
LPNMHDR nm;
switch(msg)
{
case WM_NOTIFY:
nm=(LPNMHDR)lParam;
switch(nm->code)
{
case TCN_SELCHANGE:
if(IsWindow(hPage)) DestroyWindow(hPage);
if(TabCtrl_GetCurSel(nm->hwndFrom)==4)
hPage=CreateDialog(hInst, MAKEINTRESOURCE(IDD_AFF_AJ), nm->hwndFrom, AffajParamsProc);
if(TabCtrl_GetCurSel(nm->hwndFrom)==3)
hPage=CreateDialog(hInst, MAKEINTRESOURCE(IDD_SCENE_PARAMS), nm->hwndFrom, SceneParamsProc);
if(TabCtrl_GetCurSel(nm->hwndFrom)==2)
hPage=CreateDialog(hInst, MAKEINTRESOURCE(IDD_PRIMITIVES_PARAMS), nm->hwndFrom, ParamsProc);
if(TabCtrl_GetCurSel(nm->hwndFrom)==1)
hPage=CreateDialog(hInst, MAKEINTRESOURCE(IDD_CAMERA_PARAMS), nm->hwndFrom, CameraParamsProc);
if(TabCtrl_GetCurSel(nm->hwndFrom)==0)
hPage=CreateDialog(hInst, MAKEINTRESOURCE(IDD_LIGHTS_PARAMS), nm->hwndFrom, LightParamsProc);
break;
}
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
void InitPanel(HINSTANCE hInstance)
{
WNDCLASS wcl;
memset(&wcl, 0, sizeof(wcl));
wcl.hbrBackground=(HBRUSH)COLOR_BTNSHADOW;
wcl.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor=LoadCursor(NULL, IDC_ARROW);
wcl.hInstance=hInstance;
wcl.lpszClassName="panel";
wcl.lpfnWndProc=PanelWndProc;
wcl.lpszMenuName=NULL;
hInst=hInstance;
RegisterClass(&wcl);
RECT rct;
GetClientRect(hWndMain, &rct);
HWND hWndPanel=CreateWindow( "panel", "", WS_VISIBLE|WS_CHILD, rct.right-200, 0, 200, 800, hWndMain, 0, hInstance, 0 );
HWND hTabCtl=CreateWindow(WC_TABCONTROL, "", TCS_HOTTRACK|WS_VISIBLE|TCS_TABS|TCS_MULTILINE|WS_CHILD, 0, 0, 200, 600, hWndPanel, (HMENU)1, hInstance, 0);
TC_ITEM ti;
ti.pszText="Свет";
ti.cchTextMax=100;
ti.mask=TCIF_TEXT;
SendMessage(hTabCtl, TCM_INSERTITEM, 0, (LPARAM)&ti);
ti.pszText="Камера";
SendMessage(hTabCtl, TCM_INSERTITEM, 1, (LPARAM)&ti);
ti.pszText="Прим-вы";
SendMessage(hTabCtl, TCM_INSERTITEM, 2, (LPARAM)&ti);
ti.pszText="Сцена";
SendMessage(hTabCtl, TCM_INSERTITEM, 3, (LPARAM)&ti);
ti.pszText="Афф. преобразования";
SendMessage(hTabCtl, TCM_INSERTITEM, 4, (LPARAM)&ti);
hPage=CreateDialog(hInst, MAKEINTRESOURCE(IDD_PRIMITIVES_PARAMS), hTabCtl, ParamsProc);
TabCtrl_SetCurSel(hTabCtl, 2);
}
______________panel_aff_aj__________
#ifndef AFFAJ_
#define AFFAJ_
#include "globals.h"
#include "tip_wnd.h"
float PrevAjustment[16];
void HideRadioButtons(HWND hDlg, bool hide=true)
{
ShowWindow(GetDlgItem(hDlg, IDC_PAR1_NAME), hide?SW_SHOW:SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR2_NAME), hide?SW_SHOW:SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR3_NAME), hide?SW_SHOW:SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR1), hide?SW_SHOW:SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR2), hide?SW_SHOW:SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR3), hide?SW_SHOW:SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_REFL_OXZ), hide?SW_HIDE:SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_REFL_OYZ), hide?SW_HIDE:SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_REFL_OXY), hide?SW_HIDE:SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_REFL_O), hide?SW_HIDE:SW_SHOW);
if(!hide)
{
SendMessage(GetDlgItem(hDlg, IDC_REFL_OXZ), BM_SETCHECK, true, 0);
SendMessage(GetDlgItem(hDlg, IDC_REFL_OYZ), BM_SETCHECK, false, 0);
SendMessage(GetDlgItem(hDlg, IDC_REFL_OXY), BM_SETCHECK, false, 0);
SendMessage(GetDlgItem(hDlg, IDC_REFL_O), BM_SETCHECK, false, 0);
}
}
void BeforeScaling(HWND hDlg)
{
SetDlgItemText(hDlg, IDC_PAR1_NAME, "Вдоль OX:");
SetDlgItemText(hDlg, IDC_PAR2_NAME, "Вдоль OY:");
SetDlgItemText(hDlg, IDC_PAR3_NAME, "Вдоль OZ:");
SetDlgItemText(hDlg, IDC_PAR1, "1");
SetDlgItemText(hDlg, IDC_PAR2, "1");
SetDlgItemText(hDlg, IDC_PAR3, "1");
}
void BeforeTranslate(HWND hDlg)
{
SetDlgItemText(hDlg, IDC_PAR1_NAME, "Вдоль OX:");
SetDlgItemText(hDlg, IDC_PAR2_NAME, "Вдоль OY:");
SetDlgItemText(hDlg, IDC_PAR3_NAME, "Вдоль OZ:");
SetDlgItemText(hDlg, IDC_PAR1, "0");
SetDlgItemText(hDlg, IDC_PAR2, "0");
SetDlgItemText(hDlg, IDC_PAR3, "0");
HideRadioButtons(hDlg, true);
}
void BeforeRotation(HWND hDlg)
{
SetDlgItemText(hDlg, IDC_PAR1_NAME, "Вокруг OX:");
SetDlgItemText(hDlg, IDC_PAR2_NAME, "Вокруг OY:");
SetDlgItemText(hDlg, IDC_PAR3_NAME, "Вокруг OZ:");
SetDlgItemText(hDlg, IDC_PAR1, "0");
SetDlgItemText(hDlg, IDC_PAR2, "0");
SetDlgItemText(hDlg, IDC_PAR3, "0");
HideRadioButtons(hDlg, true);}
void BeforeReflection(HWND hDlg)
{
ShowWindow(GetDlgItem(hDlg, IDC_PAR1_NAME), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR2_NAME), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDC_PAR3_NAME), SW_HIDE);
SetDlgItemText(hDlg, IDC_PAR1, "1");
SetDlgItemText(hDlg, IDC_PAR2, "1");
SetDlgItemText(hDlg, IDC_PAR3, "1");
HideRadioButtons(hDlg, false);
}
void DoAjustment(int aj, HWND hDlg)
{
char sx[20], sy[20], sz[20];
float x, y, z;
float tmp[16];
glMatrixMode(GL_MODELVIEW);
float sm[4][4]={0};
bool oxz=false, oxy=false, oyz=false, o=false;
switch(aj)
{
case 0:
GetDlgItemText(hDlg, IDC_PAR1, sx, 19);
GetDlgItemText(hDlg, IDC_PAR2, sy, 19);
GetDlgItemText(hDlg, IDC_PAR3, sz, 19);
if(!strlen(sx))
x=0.;
else x=atof(sx);
if(!strlen(sy))
y=0.;
else y=atof(sy);
if(!strlen(sz))
z=0.;
else z=atof(sz);
glTranslatef(x, y, z);
break;
case 1:
GetDlgItemText(hDlg, IDC_PAR1, sx, 19);
GetDlgItemText(hDlg, IDC_PAR2, sy, 19);
GetDlgItemText(hDlg, IDC_PAR3, sz, 19);
if(!strlen(sx))
x=0.;
else x=atof(sx);
if(!strlen(sy))
y=0.;
else y=atof(sy);
if(!strlen(sz))
z=0.;
else z=atof(sz);
glScalef(x, y, z);
break;
case 2:
GetDlgItemText(hDlg, IDC_PAR1, sx, 19);
GetDlgItemText(hDlg, IDC_PAR2, sy, 19);
GetDlgItemText(hDlg, IDC_PAR3, sz, 19);
if(!strlen(sx))
x=0.;
else x=atof(sx);
if(!strlen(sy))
y=0.;
else y=atof(sy);
if(!strlen(sz))
z=0.;
else z=atof(sz);
sm[0][0]=1;
sm[0][1]=x;
sm[0][2]=x;
sm[1][0]=y;
sm[1][1]=1;
sm[1][2]=y;
sm[2][0]=z;
sm[2][1]=z;
sm[2][2]=1;
sm[3][3]=1;
glMultMatrixf((float*)sm);
break;
case 3:
GetDlgItemText(hDlg, IDC_PAR1, sx, 19);
GetDlgItemText(hDlg, IDC_PAR2, sy, 19);
GetDlgItemText(hDlg, IDC_PAR3, sz, 19);
if(!strlen(sx))
x=0.;
else x=atof(sx);
if(!strlen(sy))
y=0.;
else y=atof(sy);
if(!strlen(sz))
z=0.;
else z=atof(sz);
glMatrixMode(GL_MODELVIEW);
glGetFloatv(GL_MODELVIEW_MATRIX, (float*)tmp);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glRotatef(x, 1, 0, 0);
glRotatef(y, 0, 1, 0);
glRotatef(z, 0, 0, 1);
glMultMatrixf((float*)tmp);
break;
case 4:
oxz=SendMessage(GetDlgItem(hDlg, IDC_REFL_OXZ), BM_GETCHECK, 0, 0);
oyz=SendMessage(GetDlgItem(hDlg, IDC_REFL_OYZ), BM_GETCHECK, 0, 0);
oxy=SendMessage(GetDlgItem(hDlg, IDC_REFL_OXY), BM_GETCHECK, 0, 0);
o=SendMessage(GetDlgItem(hDlg, IDC_REFL_O), BM_GETCHECK, 0, 0);
memset(sm, 0, sizeof(sm));
sm[0][0]=(oyz || o)?-1:1;
sm[1][1]=(oxz || o)?-1:1;
sm[2][2]=(oxy || o)?-1:1;
sm[3][3]=1;
glMatrixMode(GL_MODELVIEW);
glGetFloatv(GL_MODELVIEW_MATRIX, (float*)tmp);
glLoadMatrixf((float*)sm);
glMultMatrixf((float*)tmp);
break;
}
}
BOOL WINAPI AffajParamsProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
int CurSel;
POINT pt;
switch(msg)
{
case WM_INITDIALOG:
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_RESETCONTENT, 0, 0);
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_ADDSTRING, 0, (LPARAM)"Перенос");
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_ADDSTRING, 0, (LPARAM)"Масштабирование");
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_ADDSTRING, 0, (LPARAM)"Сдвиг");
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_ADDSTRING, 0, (LPARAM)"Вращение");
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_ADDSTRING, 0, (LPARAM)"Отражение");
SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_SETCURSEL, 0, 0);
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET_PREV), ajusted && !JustLoaded);
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET), ajusted);
BeforeTranslate(hDlg);
hAffAjWnd=hDlg;
break;
case WM_COMMAND:
if(LOWORD(wParam)==IDC_AF_AJ_HELP)
{
GetCursorPos(&pt);
CurSel=SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_GETCURSEL, 0, 0);
LoadHelpText(HelpFiles[CurSel+HLP_AFF_AJ], helpText, 1500);
TIPWND::ShowHelp(pt.x, pt.y, HelpCaptions[CurSel+HLP_AFF_AJ], helpText);
}
if(LOWORD(wParam)==IDC_AJ_RESET)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET), false);
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET_PREV), false);
}
if(LOWORD(wParam)==IDC_AJ_RESET_PREV)
{
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(PrevAjustment);
ajusted=false;
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET_PREV), false);
}
if(LOWORD(wParam)==IDC_AJ_DO)
{
CurSel=SendMessage(GetDlgItem(hDlg, IDC_AJ_NAME), CB_GETCURSEL, 0, 0);
glGetFloatv(GL_MODELVIEW_MATRIX, PrevAjustment);
DoAjustment(CurSel, hDlg);
ajusted=true;
JustLoaded=false;
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET_PREV), ajusted);
EnableWindow(GetDlgItem(hDlg, IDC_AJ_RESET), ajusted);
}
if(LOWORD(wParam)==IDC_AJ_NAME && HIWORD(wParam)==CBN_SELCHANGE)
{
CurSel=SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
if(CurSel==0 || CurSel==2) BeforeTranslate(hDlg);
if(CurSel==1 ) BeforeScaling(hDlg);
if(CurSel==3) BeforeRotation(hDlg);
if(CurSel==4) BeforeReflection(hDlg);
}
break;
}
return 0;
}
#endif
_______panel camera_________
#ifndef CAMERAPANEL_
#define CAMERAPANEL_
#include "globals.h"
void UpdateCamPanel()
{
if(!IsWindow(hCamDlg)) return;
char sx[20], sy[20], sz[20];
float x, y, z;
camera.GetPosition(&x, &y, &z);
float cp[]={x, y, z, 1};
float a=3.14*camera.settings.xrot/180. + (acos(1.f/sqrt(3))/3.14)*180;
float b=3.14*camera.settings.zrot/180. + (acos(1.f/sqrt(3))/3.14)*180;
float rotx[]=
{
1, 0, 0, 0,
0, cos(a), sin(a), 0,
0, -sin(a), cos(a), 0,
0, 0, 0, 1
};
float roty[]=
{
cos(b), 0, -sin(b), 0,
0, 1, 0, 0,
sin(b), 0, cos(b), 0,
0, 0, 0, 1
};
MultMatrix(cp, rotx);
MultMatrix(cp, roty);
x=cp[0];
y=cp[1];
z=cp[2];
sprintf(sx, "%.2f", x);
sprintf(sy, "%.2f", y);
sprintf(sz, "%.2f", z);
SetDlgItemText(hCamDlg, IDC_CAM_POSX, sx);
SetDlgItemText(hCamDlg, IDC_CAM_POSY, sy);
SetDlgItemText(hCamDlg, IDC_CAM_POSZ, sz);
camera.GetDirection(&x, &y, &z);
sprintf(sx, "%.2f", x);
sprintf(sy, "%.2f", y);
sprintf(sz, "%.2f", z);
SetDlgItemText(hCamDlg, IDC_CAM_DIRX, sx);
SetDlgItemText(hCamDlg, IDC_CAM_DIRY, sy);
SetDlgItemText(hCamDlg, IDC_CAM_DIRZ, sz);
}
BOOL WINAPI CameraParamsProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
char sx[20], sy[20], sz[20];
float x, y, z;
case WM_INITDIALOG:
hCamDlg=hDlg;
UpdateCamPanel();
break;
case WM_COMMAND:
if(LOWORD(wParam)==IDC_CAM_SET)
{
GetDlgItemText(hDlg, IDC_CAM_POSX, sx, 19);
GetDlgItemText(hDlg, IDC_CAM_POSY, sy, 19);
GetDlgItemText(hDlg, IDC_CAM_POSZ, sz, 19);
camera.Dispose(atof(sx), atof(sy), atof(sz));
GetDlgItemText(hDlg, IDC_CAM_DIRX, sx, 19);
GetDlgItemText(hDlg, IDC_CAM_DIRY, sy, 19);
GetDlgItemText(hDlg, IDC_CAM_DIRZ, sz, 19);
camera.Direct(atof(sx), atof(sy), atof(sz));
}
break;
}
return 0;
}
#endif
_______panel_light___________________
#ifndef LIGHTPANEL_
#define LIGHTPANEL_
#include "globals.h"
void SetLightColor(LIGHT& light, HWND hR, HWND hG, HWND hB)
{
CHOOSECOLOR cc;
memset(&cc, 0, sizeof(cc));
cc.lStructSize=sizeof(CHOOSECOLOR);
COLORREF cust[16]={0};
cc.Flags=CC_SOLIDCOLOR;
cc.hwndOwner=hWndMain;
cc.lpCustColors=cust;
if(!ChooseColor(&cc)) return;
light.SetColor(GetRValue(cc.rgbResult)/255.f, GetGValue(cc.rgbResult)/255.f,
GetBValue(cc.rgbResult)/255.f);
char sr[20], sg[20], sb[20];
sprintf(sr, "%i", GetRValue(cc.rgbResult));
sprintf(sg, "%i", GetGValue(cc.rgbResult));
sprintf(sb, "%i", GetBValue(cc.rgbResult));
SetWindowText(hR, sr);
SetWindowText(hG, sg);
SetWindowText(hB, sb);
}
void FillPos(LIGHT& light, HWND hX, HWND hY, HWND hZ)
{
char sx[20];
char sy[20];
char sz[20];
float x, y, z;
light.GetPosition(&x, &y, &z);
sprintf(sx, "%.2f", x);
sprintf(sy, "%.2f", y);
sprintf(sz, "%.2f", z);
SetWindowText(hX, sx);
SetWindowText(hY, sy);
SetWindowText(hZ, sz);
}
void FillColor(LIGHT& light, HWND hR, HWND hG, HWND hB)
{
char sr[20];
char sg[20];
char sb[20];
float r, g, b;
light.GetColor(&r, &g, &b);
sprintf(sr, "%.0f", r*255);
sprintf(sg, "%.0f", g*255);
sprintf(sb, "%.0f", b*255);
SetWindowText(hR, sr);
SetWindowText(hG, sg);
SetWindowText(hB, sb);
}
void SetLightPos(LIGHT& light, HWND hX, HWND hY, HWND hZ)
{
char sx[20], sy[20], sz[20];
GetWindowText(hX, sx, 19);
GetWindowText(hY, sy, 19);
GetWindowText(hZ, sz, 19);
light.Dispose(atof(sx), atof(sy), atof(sz), light.settings.pos[3]);
}
void SetLightDir(LIGHT& light, HWND hX, HWND hY, HWND hZ)
{
char sx[20], sy[20], sz[20];
GetWindowText(hX, sx, 19);
GetWindowText(hY, sy, 19);
GetWindowText(hZ, sz, 19);
light.Direct(atof(sx), atof(sy), atof(sz));
}
void GetType(int lmt, HWND hDlg)
{
switch(lmt)
{
case LMT_POINT:
SendMessage(GetDlgItem(hDlg, IDC_LMT_POINT), BM_SETCHECK, true, 0);
SendMessage(GetDlgItem(hDlg, IDC_LMT_CYL), BM_SETCHECK, false, 0);
SendMessage(GetDlgItem(hDlg, IDC_LMT_REMOTE), BM_SETCHECK, false, 0);
break;
case LMT_CYL:
SendMessage(GetDlgItem(hDlg, IDC_LMT_CYL), BM_SETCHECK, true, 0);
SendMessage(GetDlgItem(hDlg, IDC_LMT_POINT), BM_SETCHECK, false, 0);
SendMessage(GetDlgItem(hDlg, IDC_LMT_REMOTE), BM_SETCHECK, false, 0);
break;
case LMT_REMOTE:
SendMessage(GetDlgItem(hDlg, IDC_LMT_REMOTE), BM_SETCHECK, true, 0);
SendMessage(GetDlgItem(hDlg, IDC_LMT_POINT), BM_SETCHECK, false, 0);
SendMessage(GetDlgItem(hDlg, IDC_LMT_CYL), BM_SETCHECK, false, 0);
break;
}
}
void SetType(LIGHT& light, HWND hDlg)
{
bool point=SendMessage(GetDlgItem(hDlg, IDC_LMT_POINT), BM_GETCHECK, 0, 0);
bool cyl=SendMessage(GetDlgItem(hDlg, IDC_LMT_CYL), BM_GETCHECK, 0, 0);
bool remote=SendMessage(GetDlgItem(hDlg, IDC_LMT_REMOTE), BM_GETCHECK, 0, 0);
if(point) light.SetLightModelType(LMT_POINT);
if(cyl) light.SetLightModelType(LMT_CYL);
if(remote) light.SetLightModelType(LMT_REMOTE);
}
BOOL WINAPI LightParamsProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND hList;
int CurSel;
switch(msg)
{
case WM_INITDIALOG:
hList=GetDlgItem(hDlg, IDC_LIGHTS);
hLightParams=hDlg;
RECT rct;
GetWindowRect(hList, &rct);
MoveWindow(hList, 10, 40, rct.right-rct.left, 200, true);
SendMessage(hList, CB_RESETCONTENT, 0, 0);
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Источник 1");
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Источник 2");
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Источник 3");
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Источник 4");
SendMessage(hList, CB_SETCURSEL, 0, 0);
SendMessage(GetDlgItem(hDlg, IDC_LIGHT_ON), BM_SETCHECK, lights[0].Shining(), 0);
FillPos(lights[0], GetDlgItem(hDlg, IDC_LIGHT_POSX),
GetDlgItem(hDlg, IDC_LIGHT_POSY), GetDlgItem(hDlg, IDC_LIGHT_POSZ));
FillColor(lights[0], GetDlgItem(hDlg, IDC_LIGHT_COLORR),
GetDlgItem(hDlg, IDC_LIGHT_COLORG), GetDlgItem(hDlg, IDC_LIGHT_COLORB));
GetType(lights[0].settings.lightmodeltype, hDlg);
break;
case WM_COMMAND:
CurSel=SendMessage(GetDlgItem(hDlg, IDC_LIGHTS), CB_GETCURSEL, 0, 0);
if(LOWORD(wParam)==IDC_LIGHT_COLOR_GET)
SetLightColor(lights[CurSel], GetDlgItem(hDlg, IDC_LIGHT_COLORR),
GetDlgItem(hDlg, IDC_LIGHT_COLORG), GetDlgItem(hDlg, IDC_LIGHT_COLORB));
if(LOWORD(wParam)==IDC_LIGHT_ON)
{
if(SendMessage(GetDlgItem(hDlg, IDC_LIGHT_ON), BM_GETCHECK, 0, 0))
lights[CurSel].TurnOn();
else lights[CurSel].TurnOff();
HMENU hMenu=GetMenu(hWndMain);
CheckMenuItem(hMenu, CurSel+IDC_LIGHT0, MF_BYCOMMAND|(lights[CurSel].Shining())?
MF_CHECKED:MF_UNCHECKED);
}
if(LOWORD(wParam)==IDC_LMT_POINT || LOWORD(wParam)==IDC_LMT_CYL ||
LOWORD(wParam)==IDC_LMT_REMOTE)
SetType(lights[CurSel], hDlg);
if(LOWORD(wParam)==IDC_LIGHTS && HIWORD(wParam)==CBN_SELCHANGE)
{
SendMessage(GetDlgItem(hDlg, IDC_LIGHT_ON), BM_SETCHECK,
lights[CurSel].Shining(), 0);
FillPos(lights[CurSel], GetDlgItem(hDlg, IDC_LIGHT_POSX),
GetDlgItem(hDlg, IDC_LIGHT_POSY), GetDlgItem(hDlg, IDC_LIGHT_POSZ));
FillColor(lights[CurSel], GetDlgItem(hDlg, IDC_LIGHT_COLORR),
GetDlgItem(hDlg, IDC_LIGHT_COLORG), GetDlgItem(hDlg, IDC_LIGHT_COLORB));
GetType(lights[CurSel].settings.lightmodeltype, hDlg);
}
if( (LOWORD(wParam)==IDC_LIGHT_POSX || LOWORD(wParam)==IDC_LIGHT_POSY || LOWORD(wParam)==IDC_LIGHT_POSZ ) && HIWORD(wParam)==EN_CHANGE )
SetLightPos(lights[CurSel], GetDlgItem(hDlg, IDC_LIGHT_POSX),
GetDlgItem(hDlg, IDC_LIGHT_POSY), GetDlgItem(hDlg, IDC_LIGHT_POSZ));
break;
}
return 0;
}
#endif
_____________panel_premetives_______
#ifndef PRIMITIVES_
#define PRIMITIVES_
#include <stdlib.h>
#include "tip_wnd.h"
void GetColor(int obj, HWND hDlg)
{
OBJECT3D *pobj;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
pobj=&kospr[0];
break;
}
char s[10];
sprintf(s, "%.0f", pobj->settings.r*255);
SetDlgItemText( hDlg, IDC_OBJ_COLORR, s);
sprintf(s, "%.0f", pobj->settings.g*255);
SetDlgItemText( hDlg, IDC_OBJ_COLORG, s);
sprintf(s, "%.0f", pobj->settings.b*255);
SetDlgItemText( hDlg, IDC_OBJ_COLORB, s);
}
void GetMaterial(int mat, HWND hDlg)
{
SendMessage(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), CB_SETCURSEL,
(mat==GL_DIFFUSE)?0:1, 0);
}
void SetPrimitiveColor(int obj, HWND hR, HWND hG, HWND hB)
{
CHOOSECOLOR cc;
memset(&cc, 0, sizeof(cc));
cc.lStructSize=sizeof(CHOOSECOLOR);
COLORREF cust[16]={0};
cc.Flags=CC_SOLIDCOLOR;
cc.hwndOwner=hWndMain;
cc.lpCustColors=cust;
if(!ChooseColor(&cc)) return;
int i;
OBJECT3D *pobj=NULL;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
for(i=0; i<2; i++)
{
kospr[i].settings.r=GetRValue(cc.rgbResult)/255.f;
kospr[i].settings.g=GetGValue(cc.rgbResult)/255.f;
kospr[i].settings.b=GetBValue(cc.rgbResult)/255.f;
char s[10];
sprintf(s, "%i", GetRValue(cc.rgbResult));
SetWindowText(hR, s);
sprintf(s, "%i", GetGValue(cc.rgbResult));
SetWindowText(hG, s);
sprintf(s, "%i", GetBValue(cc.rgbResult));
SetWindowText(hB, s);
}
return;
break;
}
if(pobj)
{
pobj->settings.r=GetRValue(cc.rgbResult)/255.f;
pobj->settings.g=GetGValue(cc.rgbResult)/255.f;
pobj->settings.b=GetBValue(cc.rgbResult)/255.f;
char s[10];
sprintf(s, "%i", GetRValue(cc.rgbResult));
SetWindowText(hR, s);
sprintf(s, "%i", GetGValue(cc.rgbResult));
SetWindowText(hG, s);
sprintf(s, "%i", GetBValue(cc.rgbResult));
SetWindowText(hB, s);
}
}
void SetPrimitiveMaterial(int obj, int material)
{
ObjMat=-1;
int i;
OBJECT3D *pobj=NULL;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
for(i=0; i<2; i++)
{
kospr[i].SetMaterial(material);
kospr[i].SetMaterial(material);
kospr[i].SetMaterial(material);
}
return;
break;
}
if(pobj)
pobj->SetMaterial(material);
}
void SetModelType(int obj, HWND hSolid)
{
ObjModel=-1;
int i;
OBJECT3D *pobj=NULL;
bool bSolid=(SendMessage(hSolid, BM_GETCHECK, 0, 0)==BST_CHECKED);
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
for(i=0; i<2; i++)
{
kospr[i].settings.model=bSolid?GL_FILL:GL_LINE;
}
return;
break;
}
if(pobj)
pobj->settings.model=bSolid?GL_FILL:GL_LINE;;
CheckItem(GetMenu(hWndMain), obj, PARAM_MODEL, bSolid?MODEL_SOLID:MODEL_WIRE, false);
}
void GetPartitions(int obj, HWND hWParts, HWND hHParts)
{
char szWParts[21], szHParts[21];
OBJECT3D *pobj=NULL;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
EnableWindow(hWParts, pobj->settings.visible);
EnableWindow(hHParts, pobj->settings.visible);
break;
case PR_HALFSPHERE:
pobj=&hsp;
EnableWindow(hWParts, pobj->settings.visible);
EnableWindow(hHParts, pobj->settings.visible);
break;
case PR_IKO:
pobj=&cube;
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
case PR_PRISM3:
pobj=&prism3;
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
case PR_ELIPS:
pobj=⪙
EnableWindow(hWParts, pobj->settings.visible);
EnableWindow(hHParts, pobj->settings.visible);
break;
case PR_CYL:
pobj=&cyl;
EnableWindow(hWParts, false/*pobj->settings.visible*/);
EnableWindow(hHParts, false);
break;
case PR_PIRAMID3:
pobj=&pir3;
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
case PR_KOSPR:
pobj=&kospr[0];
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
}
sprintf(szHParts, "%u", pobj->settings.n);
sprintf(szWParts, "%u", pobj->settings.m);
SetWindowText(hWParts, szWParts);
SetWindowText(hHParts, szHParts);
}
void SetModelRadio(int obj, HWND hSolid, HWND hWire)
{
bool bSolid=false;
switch(obj)
{
case PR_SPHERE:
bSolid=(sp.settings.model==GL_FILL);
break;
case PR_HALFSPHERE:
bSolid=hsp.settings.model==GL_FILL;
break;
case PR_IKO:
bSolid=cube.settings.model==GL_FILL;
break;
case PR_PRISM3:
bSolid=(prism3.settings.model==GL_FILL);
break;
case PR_ELIPS:
bSolid=el.settings.model==GL_FILL;
break;
case PR_CYL:
bSolid=cyl.settings.model==GL_FILL;
break;
case PR_PIRAMID3:
bSolid=pir3.settings.model==GL_FILL;
break;
case PR_KOSPR:
bSolid=kospr[0].settings.model==GL_FILL;
break;
}
SendMessage(hSolid, BM_SETCHECK, bSolid, 0);
SendMessage(hWire, BM_SETCHECK, !bSolid, 0);
}
void FillObjectsList(HWND hList)
{
RECT rct;
GetWindowRect(hList, &rct);
MoveWindow(hList, 10, 40, rct.right-rct.left, 200, true);
SendMessage(hList, CB_RESETCONTENT, 0, 0);
if(sp.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Сфера");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Сфера");
if(hsp.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Полуcфера");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Полуcфера");
if(cube.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Икосаэдр");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Икосаэдр");
if(prism3.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+3-уг призма");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"3-уг призма");
if(el.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Эллипсоид");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Эллипсоид");
if(cyl.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Косоугольный цилиндр");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Косоугольный цилиндр");
if(pir3.settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Усечённая пирамида с 3-уг. осн.");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Усечённая пирамида с 3-уг. осн.");
if(kospr->settings.visible)
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"+Кос. призма с 3-уг. осн.");
else
SendMessage(hList, CB_ADDSTRING, 0, (LPARAM)"Кос. призма с 3-уг. осн.");
SendMessage(hList, CB_SETCURSEL, 0, 0);
}
void SetWParts(int obj, HWND hWParts, HWND hHParts)
{
OBJECT3D *pobj=NULL;
switch(obj)
{
case PR_SPHERE: pobj=&sp;
break;
case PR_HALFSPHERE: pobj=&hsp;
break;
case PR_CYL: pobj=&cyl;
break;
case PR_ELIPS: pobj=⪙
break;
}
if(pobj)
{
char s[21];
GetWindowText(hWParts, s, 20);
pobj->settings.m=atoi(s);
}
else return;
}
void SetHParts(int obj, HWND hHParts)
{
OBJECT3D *pobj=NULL;
switch(obj)
{
case PR_SPHERE: pobj=&sp;
break;
case PR_HALFSPHERE: pobj=&hsp;
break;
case PR_CYL: pobj=&cyl;
break;
case PR_ELIPS: pobj=⪙
break;
}
if(pobj)
{
char s[21];
GetWindowText(hHParts, s, 20);
pobj->settings.n=atoi(s);
}
}
void EnablePrimitiveAttrs(int obj, bool enable, HWND hDlg)
{
EnableWindow(GetDlgItem(hDlg, IDC_OBJ_DEL), enable);
EnableWindow(GetDlgItem(hDlg, IDC_OBJ_ADD), !enable);
EnableWindow(GetDlgItem(hDlg, IDC_OBJ_FIND), enable);
OBJECT3D *pobj=NULL;
HWND hWParts=GetDlgItem(hDlg, IDC_WPARTS);
HWND hHParts=GetDlgItem(hDlg, IDC_HPARTS);
EnableWindow(GetDlgItem(hDlg, IDC_SETPRIMCOLOR), enable);
EnableWindow(GetDlgItem(hDlg, IDC_SOLID), enable);
EnableWindow(GetDlgItem(hDlg, IDC_WIRE), enable);
EnableWindow(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), enable);
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
EnableWindow(hWParts, enable);
EnableWindow(hHParts, enable);
break;
case PR_HALFSPHERE:
pobj=&hsp;
EnableWindow(hWParts, enable);
EnableWindow(hHParts, enable);
break;
case PR_IKO:
pobj=&cube;
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
case PR_PRISM3:
pobj=&prism3;
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
case PR_ELIPS:
pobj=⪙
EnableWindow(hWParts, enable);
EnableWindow(hHParts, enable);
break;
case PR_CYL:
pobj=&cyl;
EnableWindow(hWParts, false/*enable*/);
EnableWindow(hHParts, false);
break;
case PR_PIRAMID3:
pobj=&pir3;
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
case PR_KOSPR:
pobj=&kospr[0];
EnableWindow(hWParts, false);
EnableWindow(hHParts, false);
break;
}
}
void AddPrimitive(int obj, HWND hDlg)
{
OBJECT3D *pobj;
int i;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
for(i=0; i<2; i++)
kospr[i].settings.visible=true;
EnablePrimitiveAttrs(obj, true, hDlg);
return;
break;
}
if(pobj)
pobj->settings.visible=true;
EnablePrimitiveAttrs(obj, true, hDlg);
}
void DelPrimitive(int obj, HWND hDlg)
{
OBJECT3D *pobj;
int i;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
for(i=0; i<2; i++)
kospr[i].settings.visible=false;
EnablePrimitiveAttrs(obj, false, hDlg);
return;
break;
}
if(pobj)
pobj->settings.visible=false;
EnablePrimitiveAttrs(obj, false, hDlg);
}
void SetAttrsVisibility(int obj, HWND hDlg)
{
OBJECT3D *pobj;
bool visible=false;
switch(obj)
{
case PR_SPHERE:
pobj=&sp;
break;
case PR_HALFSPHERE:
pobj=&hsp;
break;
case PR_IKO:
pobj=&cube;
break;
case PR_PRISM3:
pobj=&prism3;
break;
case PR_ELIPS:
pobj=⪙
break;
case PR_CYL:
pobj=&cyl;
break;
case PR_PIRAMID3:
pobj=&pir3;
break;
case PR_KOSPR:
visible=kospr[0].settings.visible;
EnablePrimitiveAttrs(obj, visible, hDlg);
return;
break;
}
if(pobj)
visible=pobj->settings.visible;
EnablePrimitiveAttrs(obj, visible, hDlg);
}
BOOL WINAPI ParamsProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
int CurSel;
int CurMaterial;
POINT pt;
switch(msg)
{
case WM_COMMAND:
if(LOWORD(wParam)==IDC_OBJ_FIND)
{
GetCursorPos(&pt);
TIPWND::ShowHelp(pt.x, pt.y, "Пока не работает", "sdf");
}
if(LOWORD(wParam)==IDC_PRIM_HELP)
{
CurSel=SendMessage(GetDlgItem(hDlg, IDC_OBJECTS_LIST), CB_GETCURSEL, 0, 0);
GetCursorPos(&pt);
LoadHelpText(HelpFiles[CurSel+HLP_PRIM], helpText, 1500);
TIPWND::ShowHelp(pt.x, pt.y, HelpCaptions[CurSel+HLP_PRIM], helpText);
}
if(LOWORD(wParam)==IDC_SETPRIMCOLOR )
{
SetPrimitiveColor(SendMessage(GetDlgItem(hDlg, IDC_OBJECTS_LIST), CB_GETCURSEL, 0, 0),
GetDlgItem(hDlg, IDC_OBJ_COLORR), GetDlgItem(hDlg, IDC_OBJ_COLORG),
GetDlgItem(hDlg, IDC_OBJ_COLORB));
return true;
}
CurSel=SendMessage(GetDlgItem(hDlg, IDC_OBJECTS_LIST), CB_GETCURSEL, 0, 0);
if(LOWORD(wParam)==IDC_SOLID || LOWORD(wParam)==IDC_WIRE)
SetModelType(CurSel, GetDlgItem(hDlg, IDC_SOLID));
if(LOWORD(wParam)==IDC_OBJECTS_LIST && HIWORD(wParam)==CBN_SELCHANGE)
{
GetPartitions(CurSel, GetDlgItem(hDlg, IDC_WPARTS), GetDlgItem(hDlg, IDC_HPARTS));
SetModelRadio(CurSel,GetDlgItem(hDlg, IDC_SOLID), GetDlgItem(hDlg, IDC_WIRE));
GetColor(CurSel, hDlg);
SetAttrsVisibility(CurSel, hDlg);
GetMaterial(ObjectsNotAll[CurSel]->settings.material, hDlg);
}
if(LOWORD(wParam)==IDC_WPARTS && HIWORD(wParam)==EN_CHANGE)
SetWParts(CurSel, GetDlgItem(hDlg, IDC_WPARTS), GetDlgItem(hDlg, IDC_HPARTS));
if(LOWORD(wParam)==IDC_HPARTS && HIWORD(wParam)==EN_CHANGE)
SetHParts(CurSel, GetDlgItem(hDlg, IDC_HPARTS));
if(LOWORD(wParam)==IDC_OBJ_MATERIAL && HIWORD(wParam)==CBN_SELCHANGE)
{
CurMaterial=SendMessage(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), CB_GETCURSEL, 0, 0);
SetPrimitiveMaterial(CurSel, CurMaterial?GL_SPECULAR:GL_DIFFUSE);
}
if(LOWORD(wParam)==IDC_OBJ_ADD)
{
AddPrimitive(CurSel, hDlg);
FillObjectsList(GetDlgItem(hDlg, IDC_OBJECTS_LIST));
SendMessage(GetDlgItem(hDlg, IDC_OBJECTS_LIST), CB_SETCURSEL, CurSel, 0);
}
if(LOWORD(wParam)==IDC_OBJ_DEL)
{
DelPrimitive(CurSel, hDlg);
FillObjectsList(GetDlgItem(hDlg, IDC_OBJECTS_LIST));
SendMessage(GetDlgItem(hDlg, IDC_OBJECTS_LIST), CB_SETCURSEL, CurSel, 0);
}
break;
case WM_INITDIALOG:
RECT rct;
hPrimParams=hDlg;
GetWindowRect(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), &rct);
MoveWindow(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), 10, 370, rct.right-rct.left, 200, true);
SendMessage(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), CB_RESETCONTENT, 0, 0);
SendMessage(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), CB_ADDSTRING, 0, (WPARAM)"Матовый");
SendMessage(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), CB_ADDSTRING, 0, (WPARAM)"Пропускающий свет");
SendMessage(GetDlgItem(hDlg, IDC_OBJ_MATERIAL), CB_SETCURSEL, sp.settings.material==GL_SPECULAR?1:0, 0);
SendMessage(GetDlgItem(hDlg, IDC_OBJECTS_LIST), CB_RESETCONTENT, 0, 0);
FillObjectsList(GetDlgItem(hDlg, IDC_OBJECTS_LIST));
SetModelRadio(0,
GetDlgItem(hDlg, IDC_SOLID), GetDlgItem(hDlg, IDC_WIRE));
GetPartitions(0, GetDlgItem(hDlg, IDC_WPARTS), GetDlgItem(hDlg, IDC_HPARTS));
GetColor(0, hDlg);
EnablePrimitiveAttrs(0, sp.settings.visible, hDlg);
GetMaterial(sp.settings.material, hDlg);
for(int i=PR_SPHERE; i<8; i++)
CheckItem(GetMenu(hWndMain), i, PARAM_MAT,
(ObjectsNotAll[i]->settings.material==GL_DIFFUSE)?MAT_DIFF:MAT_SPEC, false);
for(i=PR_SPHERE; i<8; i++)
CheckItem(GetMenu(hWndMain), i, PARAM_MODEL,
(ObjectsNotAll[i]->settings.model==GL_FILL)?MODEL_SOLID:MODEL_WIRE, false);
break;
}
return 0;
}
#endif
_______________panel_scens____________
#ifndef SCENE_
#define SCENE_
#include "globals.h"
BOOL WINAPI SceneParamsProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
int lightcount=0, i;
char lc[20];
HWND hListMat=GetDlgItem(hDlg, IDC_OBJ_MATERIAL);
HWND hListModel=GetDlgItem(hDlg, IDC_OBJ_MODEL);
switch(msg)
{
case WM_INITDIALOG:
hSceneParams=hDlg;
for(i=0; i<8; i++)
if(lights[i].Shining()) lightcount++;
sprintf(lc, "Кол-во источников света: %i", lightcount);
SetDlgItemText(hDlg, IDC_LIGHTS_COUNT, lc);
SendMessage(hListMat, CB_RESETCONTENT, 0, 0);
SendMessage(hListModel, CB_RESETCONTENT, 0, 0);
SendMessage(hListMat, CB_ADDSTRING, 0, (LPARAM)"Не проп. свет");
SendMessage(hListMat, CB_ADDSTRING, 0, (LPARAM)"С отражнием");
SendMessage(hListMat, CB_ADDSTRING, 0, (LPARAM)"-");
SendMessage(hListMat, CB_SETCURSEL, !ObjMat?0:( (ObjMat==GL_SPECULAR)?1:2), 0);
SendMessage(hListModel, CB_ADDSTRING, 0, (LPARAM)"Полигональная");
SendMessage(hListModel, CB_ADDSTRING, 0, (LPARAM)"Проволочная");
SendMessage(hListModel, CB_ADDSTRING, 0, (LPARAM)"-");
SendMessage(hListModel, CB_SETCURSEL, (ObjModel==GL_FILL)?0:( (ObjModel==GL_LINE)?1:2), 0);
SendMessage(GetDlgItem(hDlg, IDC_DRAW_AXES), BM_SETCHECK, DrawAxes, 0);
SendMessage(GetDlgItem(hDlg, IDC_AXESALWAYSONTOP), BM_SETCHECK, AxesAlwaysOnTop, 0);
sprintf(lc, "%.2f", ObjHeight);
SetDlgItemText(hDlg, IDC_HEIGHT, lc);
break;
case WM_COMMAND:
if(LOWORD(wParam)==IDC_SAVESCENE) SaveScene();
if(LOWORD(wParam)==IDC_LOADSCENE) LoadScene();
if(LOWORD(wParam)==IDC_HEIGHT && HIWORD(wParam)==EN_CHANGE)
{
GetDlgItemText(hDlg, IDC_HEIGHT, lc, 19);
ObjHeight=atof(lc);
}
if(LOWORD(wParam)==IDC_DRAW_AXES)
DrawAxes=SendMessage(GetDlgItem(hDlg, IDC_DRAW_AXES), BM_GETCHECK, 0, 0);
if(LOWORD(wParam)==IDC_AXESALWAYSONTOP)
AxesAlwaysOnTop=SendMessage(GetDlgItem(hDlg, IDC_AXESALWAYSONTOP), BM_GETCHECK, 0, 0);
if(LOWORD(wParam)==IDC_SCENE_CLEAR)
{
for(int i=0; i<12; i++)
Objects[i]->settings.visible=false;
}
if(LOWORD(wParam)==IDC_OBJ_MODEL && HIWORD(wParam)==CBN_SELCHANGE)
{
int CurSel=SendMessage(hListModel, CB_GETCURSEL, 0, 0);
int oldmodel=ObjModel;
for(int i=0; i<12; i++)
ObjModel=Objects[i]->settings.model=!CurSel?GL_FILL:(CurSel==1?GL_LINE:oldmodel);
SendMessage(hListModel, CB_SETCURSEL, (ObjModel==GL_FILL)?0:( (ObjModel==GL_LINE)?1:2), 0);
}
if(LOWORD(wParam)==IDC_OBJ_MATERIAL && HIWORD(wParam)==CBN_SELCHANGE)
{
int CurSel=SendMessage(hListMat, CB_GETCURSEL, 0, 0);
int oldmat=ObjMat;
for(int i=0; i<12; i++)
ObjMat=Objects[i]->settings.material=!CurSel?GL_DIFFUSE:(CurSel==1?GL_SPECULAR:oldmat);
SendMessage(hListMat, CB_SETCURSEL, (ObjMat==GL_DIFFUSE)?0:
( (ObjMat==GL_SPECULAR)?1:2), 0);
}
break;
}
return 0;
}
#endif
___________________premetives_________
#ifndef PRIMITIVES
#define PRIMITIVES
#include <math.h>
#define PI 3.1415
#define PR_SPHERE 0
#define PR_HALFSPHERE 1
#define PR_IKO 2
#define PR_PRISM3 3
#define PR_ELIPS 4
#define PR_CYL 5
#define PR_PIRAMID3 6
#define PR_KOSPR 7
class OBJECT3D
{
public:
struct
{
float r, g, b, a;
int m, n;
int model;
int material;
bool visible;
} settings;
float x, y, z;
OBJECT3D(float x, float y, float z, float r=1, float g=1, float b=1, float a=1)
{this->x=x; this->y=y; this->z=z; settings.r=r; settings.g=g; settings.b=b; settings.a=a;
settings.m=20;
settings.n=20;
settings.model=GL_FILL;
settings.material=GL_DIFFUSE;
settings.visible=false;
}
void SetNormal(float , float , float, float , float , float, float , float , float );
void SetPartitions(int n, int m){settings.n=n; settings.m=m;};
void SetMaterial(int mat) {settings.material=mat;}
virtual void Draw()
{
glPolygonMode(GL_FRONT_AND_BACK, settings.model);
glColor4f(settings.r, settings.g, settings.b, settings.a);
float spc[]={1, 1, 1, 1};
float zero[]={0, 0, 0, 1};
if(settings.material==GL_SPECULAR)
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc);
else glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, zero);
if(settings.material==GL_DIFFUSE)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, spc);
else glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, zero);
glMaterialf(GL_FRONT, GL_SHININESS, 12);
};
};
class SPHERE: public OBJECT3D //сфера
{
public:
SPHERE(float x, float y, float z, float radius=1, float r=1, float g=1, float b=1, float a=1):
OBJECT3D(x, y, z, r, g, b, a){this->radius=radius;}
float radius;
void Draw();
};
void SPHERE::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
GLUquadricObj* q=gluNewQuadric();
glPushMatrix();
glTranslated(-4*radius, 3*radius, 8*radius);
gluSphere(q, radius, settings.n, settings.m);
glPopMatrix();
glPushMatrix();
glTranslated(4*radius, 3*radius, 8*radius);
gluSphere(q, radius, settings.n, settings.m);
glPopMatrix();
gluDeleteQuadric(q);
}
class HALFSPHERE: public OBJECT3D //полусфера
{
public:
HALFSPHERE(float x, float y, float z, float radius, float r=1, float g=1, float b=1, float a=1):
OBJECT3D(x, y, z, r, g, b, a){this->radius=radius;}
float radius;
void Draw();
};
void HALFSPHERE::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
GLUquadricObj* q=gluNewQuadric();
glPushMatrix();
double cp0[]={0, 1, 0, -y};
glClipPlane(GL_CLIP_PLANE0, cp0);
glEnable(GL_CLIP_PLANE0);
glTranslated(x, y, z);
gluSphere(q, 9*radius, settings.n, settings.m);
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
}
class PRISM3: public OBJECT3D //3 уг призма
{
public:
PRISM3(float x, float y, float z, float r=1, float g=1, float b=1, float a=1):
OBJECT3D(x, y, z, r, g, b, a){ settings.m=1; settings.n=1;}
void Draw();
};
void PRISM3::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
GLUquadricObj* q=gluNewQuadric();
glPushMatrix();
glRotated(45,0,1,0);
gluCylinder(q, 1, 1, 20, 3, 1);
glPopMatrix();
glPushMatrix();
glRotated(-45,0,1,0);
gluCylinder(q, 1, 1, 20, 3, 1);
glPopMatrix();
glPushMatrix();
glRotated(150,0,1,0);
gluCylinder(q, 1, 1, 20, 3, 1);
glPopMatrix();
glPushMatrix();
glRotated(210,0,1,0);
gluCylinder(q, 1, 1, 20, 3, 1);
glPopMatrix();
gluDeleteQuadric(q);
glShadeModel(GL_SMOOTH);
}
class IKO: public OBJECT3D //икосаэдр
{
float riblen;
public:
IKO(float x, float y, float z, float riblen=1, float r=1, float g=1, float b=1, float a=1):
OBJECT3D(x, y, z, r, g, b, a){this->riblen=riblen; settings.n=1; settings.m=1;};
void Draw();
};
void IKO::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
glPushMatrix();
glRotated(45,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20*riblen);
auxSolidIcosahedron(riblen);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotated(-45,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20*riblen);
auxSolidIcosahedron(riblen);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotated(150,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20*riblen);
auxSolidIcosahedron(riblen);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotated(210,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20*riblen);
auxSolidIcosahedron(riblen);
glPopMatrix();
glPopMatrix();
}
class ELIPS:public OBJECT3D //эллипсоид
{
public:
ELIPS(float x, float y, float z, float radius=1, float r=1, float g=1, float b=1, float a=1):
OBJECT3D(x, y, z, r, g, b, a){this->radius=radius;}
void Draw();
float radius;
};
void ELIPS::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
glShadeModel(GL_FLAT);
glPushMatrix();
glRotatef(-90, 1, 0 ,0);
glTranslatef(x, y, z);
GLUquadricObj *q=gluNewQuadric();
glPushMatrix();
glScaled(0.8, 1, 0.25);
gluSphere(q, 12*radius, settings.n, settings.m);
glPopMatrix();
glPopMatrix();
gluDeleteQuadric(q);
glShadeModel(GL_SMOOTH);
}
class CYL: public OBJECT3D // кос цилиндр
{
public:
CYL(float x, float y, float z, float radius=1, float r=1, float g=1, float b=1, float a=1):
OBJECT3D(x, y, z, r, g, b, a){this->radius=radius; settings.n=1; settings.m=1;}
void Draw();
float radius;
};
void CYL::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
GLUquadricObj* q=gluNewQuadric();
glPushMatrix();
GLfloat M1[]={1,0.1,0.1,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
GLfloat M2[]={1,-0.1,-0.1,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
glPushMatrix();
glMultMatrixf(M1);
glRotated(30,0,1,0);
glPushMatrix();
gluCylinder(q, 1.5*radius, 1.5*radius, 18*radius , 3,1);
glPushMatrix();
glTranslatef(0, 0, 4);
gluDisk(q, 0, 1.5, 3, 1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glMultMatrixf(M2);
glRotated(-30,0,1,0);
glPushMatrix();
gluCylinder(q, 1.5*radius, 1.5*radius, 18*radius , 3, 1);
glPushMatrix();
glTranslatef(0, 0, 4);
gluDisk(q, 0, 1.5, 3, 1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
gluDeleteQuadric(q);
glShadeModel(GL_SMOOTH);
}
class PIRAMID3: public OBJECT3D //усеченная пирамида
{
public:
PIRAMID3(float x, float y, float z, float r=1., float g=1., float b=1., float a=1):
OBJECT3D(x, y, z, r, g, b, a){settings.m=1;settings.n=1;}
void Draw();
};
void PIRAMID3::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
GLUquadricObj* q=gluNewQuadric();
glPushMatrix();
glRotated(45,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20);
glRotated(90,1,0,0);
gluCylinder(q, 1, 2, 2, 3, 1);
gluDisk(q, 0, 1, 3, 1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotated(-45,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20);
glRotated(90,1,0,0);
gluCylinder(q, 1, 2, 2, 3, 1);
gluDisk(q, 0, 1, 3, 1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotated(150,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20);
glRotated(90,1,0,0);
gluCylinder(q, 1, 2, 2, 3, 1);
gluDisk(q, 0, 1, 3, 1);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotated(210,0,1,0);
glPushMatrix();
glTranslatef(0, 0, 20);
glRotated(90,1,0,0);
gluCylinder(q, 1, 2, 2, 3, 1);
gluDisk(q, 0, 1, 3, 1);
glPopMatrix();
glPopMatrix();
gluDeleteQuadric(q);
glShadeModel(GL_SMOOTH);
}
class KOSPR: public OBJECT3D //кос призма
{
public:
KOSPR(float x, float y, float z, float r=1., float g=1., float b=1., float a=1):
OBJECT3D(x, y, z, r, g, b, a){ settings.n=1; settings.m=1;}
void Draw();
};
void KOSPR::Draw()
{
if(!settings.visible) return;
OBJECT3D::Draw();
GLUquadricObj* q=gluNewQuadric();
glPushMatrix();
GLfloat M1[]={1,0.1,0.1,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
GLfloat M2[]={1,-0.1,-0.1,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
glPushMatrix();
glMultMatrixf(M1);
glRotated(30,0,1,0);
glTranslatef(0*x, 0*y, 18*z);
glPushMatrix();
glRotated(45,0,1,0);
gluCylinder(q, 1.5*x, 1.5*y, 4*z , 3, 1);
glPushMatrix();
glTranslatef(0, 0, 4*z);
gluDisk(q, 0, 1.5*y, 3*z, 1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glMultMatrixf(M1);
glRotated(30,0,1,0);
glTranslatef(0, 0, 18*z);
glPushMatrix();
glRotated(-45,0,1,0);
gluCylinder(q, 1.5*x, 1.5*y, 4*z , 3, 1);
glPushMatrix();
glTranslatef(0, 0, 4*z);
gluDisk(q, 0, 1.5*y, 3, 1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
///////////////////////////////////////////////////
glPushMatrix();
glMultMatrixf(M2);
glRotated(-30,0,1,0);
glTranslatef(0, 0, 18*z);
glPushMatrix();
glRotated(45,0,1,0);
gluCylinder(q, 1.5*x, 1.5*y, 4 , 3, 1);
glPushMatrix();
glTranslatef(0, 0, 4*z);
gluDisk(q, 0, 1.5*y, 3, 1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glMultMatrixf(M2);
glRotated(-30,0,1,0);
glTranslatef(0, 0, 18*z);
glPushMatrix();
glRotated(-45,0,1,0);
gluCylinder(q, 1.5*x, 1.5*y, 4 , 3, 1);
glPushMatrix();
glTranslatef(0, 0, 4);
gluDisk(q, 0, 1.5*y, 3, 1);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
gluDeleteQuadric(q);
glShadeModel(GL_SMOOTH);
}
#endif
______resours___________
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by rs.rc
//
#define IDD_PARAMS 112
#define IDD_PRIMITIVES_PARAMS 112
#define IDD_CAMERA_PARAMS 114
#define IDD_LIGHTS_PARAMS 115
#define IDD_SCENE_PARAMS 116
#define IDD_AFF_AJ 117
#define IDI_ICON1 119
#define IDC_BUTTON1 1008
#define IDC_CAM_SET 1008
#define IDC_SCENE_SAVE 1008
#define IDC_OBJ_DEL 1008
#define IDC_AFF_DO 1008
#define IDC_AJ_DO 1008
#define IDC_SAVESCENE 1008
#define IDC_COMBO1 1009
#define IDC_SCENE_LOAD 1009
#define IDC_LIGHTS 1009
#define IDC_OBJ_ADD 1009
#define IDC_AJ_NAME 1009
#define IDC_LOADSCENE 1009
#define IDC_EDIT1 1010
#define IDC_BUTTON2 1010
#define IDC_LIGHT_POSY 1010
#define IDC_OBJ_FIND 1010
#define IDC_SCENE_CLEAR 1010
#define IDC_PAR1 1010
#define IDC_EDIT2 1011
#define IDC_RADIO1 1011
#define IDC_SOLID 1011
#define IDC_LIGHT_POSX 1011
#define IDC_PAR2 1011
#define IDC_HEIGHT 1011
#define IDC_EDIT3 1012
#define IDC_RADIO2 1012
#define IDC_WIRE 1012
#define IDC_LIGHT_POSZ 1012
#define IDC_PAR3 1012
#define IDC_EDIT4 1013
#define IDC_EDIT5 1014
#define IDC_EDIT6 1015
#define IDC_EDIT7 1016
#define IDC_LIGHT_COLORG 1016
#define IDC_EDIT8 1017
#define IDC_LIGHT_COLORR 1017
#define IDC_EDIT9 1018
#define IDC_LIGHT_COLORB 1018
#define IDC_LIGHT_COLOR_GET 1021
#define IDC_SETPRIMCOLOR 1022
#define IDC_HPARTS 1023
#define IDC_WPARTS 1024
#define IDC_OBJECTS_LIST 1025
#define IDC_CAM_POSX 1026
#define IDC_OBJ_MATERIAL 1026
#define IDC_CAM_POSY 1027
#define IDC_CAM_POSZ 1028
#define IDC_CAM_DIRX 1029
#define IDC_CAM_DIRY 1030
#define IDC_CAM_DIRZ 1031
#define IDC_LIGHT_ON 1032
#define IDC_LIGHT_SET 1033
#define IDC_AFF_AJ 1034
#define IDC_OBJ_COLORR 1035
#define IDC_OBJ_COLORG 1036
#define IDC_OBJ_COLORB 1037
#define IDC_FPS 1038
#define IDC_LIGHTS_COUNT 1039
#define IDC_RENDER_TIME 1040
#define IDC_PAR1_NAME 1041
#define IDC_PAR2_NAME 1042
#define IDC_PAR3_NAME 1043
#define IDC_AF_AJ_HELP 1044
#define IDC_REFL_OXZ 1045
#define IDC_REFL_OYZ 1046
#define IDC_REFL_OXY 1047
#define IDC_REFL_O 1048
#define IDC_AJ_RESET 1049
#define IDC_AJ_RESET2 1050
#define IDC_AJ_RESET_PREV 1050
#define IDC_BUTTON3 1050
#define IDC_PRIM_HELP 1050
#define IDC_LMT_POINT 1052
#define IDC_OBJ_MODEL 1052
#define IDC_LMT_REMOTE 1053
#define IDC_DRAW_AXES 1053
#define IDC_LMT_CYL 1054
#define IDC_AXESALWAYSONTOP 1054
#define ID_MENUITEM40001 40001
#define ID_SP_COLOR 40005
#define ID_PIR3_SOLID 40006
#define ID_PIR4_WIRE 40007
#define ID_PIR3_WIRE 40007
#define ID_PIR3_COLOR 40008
#define ID_SP_SOLID 40010
#define ID_SP_WIRE 40011
#define ID_HSP_COLOR 40012
#define ID_HSP_SOLID 40013
#define ID_HSP_WIRE 40014
#define ID_CUBE_COLOR 40015
#define ID_CUBE_SOLID 40016
#define ID_CUBE_WIRE 40017
#define ID_PRISM3_SOLID 40018
#define ID_PRISM3_WIRE 40019
#define ID_PRISM3_COLOR 40020
#define ID_ELIPS_COLOR 40021
#define ID_ELIPS_SOLID 40022
#define ID_ELIPS_WIRE 40023
#define ID_CYL_COLOR 40024
#define ID_CYL_SOLID 40025
#define ID_CYL_WIRE 40026
#define ID_CAM_POS 40027
#define ID_CAM_DIR 40028
#define ID_MENUITEM40029 40029
#define ID_MENUITEM40030 40030
#define ID_MENUITEM40031 40031
#define ID_ABOUT 40031
#define ID_MENUITEM40032 40032
#define ID_AUTOR 40032
#define ID_SAVESCENE 40033
#define ID_LOADSCENE 40034
#define IDC_LIGHT0 40035
#define IDC_LIGHT1 40036
#define IDC_LIGHT2 40037
#define IDC_LIGHT3 40038
#define IDC_LIGHT4 40039
#define IDC_LIGHT5 40040
#define IDC_LIGHT6 40041
#define IDC_LIGHT7 40042
#define ID_HELP_CONTENT 40043
#define ID_CLEARSCENE 40044
#define ID_KOSPR_COLOR 40045
#define ID_SP_MAT_DIFF 40047
#define ID_SP_MAT_SPEC 40048
#define ID_HSP_MAT_DIFF 40049
#define ID_HSP_MAT_SPEC 40050
#define ID_CUBE_MAT_DIFF 40051
#define ID_CUBE_MAT_SPEC 40052
#define ID_PRISM3_MAT_DIFF 40053
#define ID_PRISM3_MAT_SPEC 40054
#define ID_ELIPS_MAT_DIFF 40055
#define ID_ELIPS_MAT_SPEC 40056
#define ID_CYL_MAT_DIFF 40057
#define ID_CYL_MAT_SPEC 40058
#define ID_PIR3_MAT_DIFF 40059
#define ID_PIR3_MAT_SPEC 40060
#define ID_KOSPR_SOLID 40061
#define ID_KOSPR_WIRE 40062
#define ID_KOSPR_MAT_DIFF 40063
#define ID_KOSPR_MAT_SPEC 40064
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 40065
#define _APS_NEXT_CONTROL_VALUE 1055
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
__________tip_wnd__________
#ifndef TIPWND_
#define TIPWND_
#include "globals.h"
#include <string.h>
#define max(x, y) (((x)>(y))?(x):(y))
HWND hWnd;
char *Text;
HFONT hFont;
RECT rct;
class TIPWND
{
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
char wt[100];
HDC hDC;
switch(msg)
{
case WM_ACTIVATE:
if(LOWORD(wParam)==WA_INACTIVE)
DestroyWindow(hWnd);
break;
case WM_LBUTTONDOWN:
DestroyWindow(hWnd);
break;
case WM_PAINT:
hDC=BeginPaint(hWnd, &ps);
GetWindowText(hWnd, wt, 99);
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, 7, 6, wt, strlen(wt));
SelectObject(hDC, hFont);
DrawText(hDC, Text, strlen(Text), &rct, TA_LEFT|DT_EXPANDTABS);
EndPaint(hWnd, &ps);
break;
case WM_TIMER:
DestroyWindow(hWnd);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
public:
static void ShowNotification(int x, int y, char *caption, char *text, int type=0, int time=0)
{
ShowHelp(x, y, caption, text);
SetTimer(hWnd, 0, time, 0);
}
TIPWND(){}
static void ShowHelp(int x, int y, char *caption, char *text, HBITMAP hBmp=NULL)
{
WNDCLASS wcl;
memset(&wcl, 0, sizeof(wcl));
wcl.hbrBackground=CreateSolidBrush(RGB(100, 200, 0));
wcl.hCursor=LoadCursor(NULL, IDC_ARROW);
wcl.hInstance=hInst;
wcl.lpfnWndProc=WndProc;
wcl.lpszClassName="tip_wnd";
RegisterClass(&wcl);
int w=290, h=140;
hWnd=CreateWindow("tip_wnd", caption, WS_CHILD|WS_POPUP, x-w, y, w, h, hWndMain, 0, hInst, 0);
HDC hDC=GetDC(hWnd);
LOGFONT lf;
memset(&lf, 0, sizeof(lf));
lf.lfCharSet=ANSI_CHARSET;
lf.lfHeight=13;
lf.lfQuality=PROOF_QUALITY;
hFont=CreateFontIndirect(&lf);
RECT captr;
captr.left=10;
captr.top=25;
DrawText(hDC, caption, strlen(caption), &captr, DT_CALCRECT);
SelectObject(hDC, hFont);
rct.left=10;
rct.top=25;
DrawText(hDC, text, strlen(text), &rct, DT_CALCRECT);
w=max(rct.right-rct.left+20, captr.right-captr.left+20);
h=rct.bottom-rct.top+35;
MoveWindow(hWnd, x-w, y, w, h, true);
HRGN hRgn=CreateRoundRectRgn(5, 5, w-5, h-5, 10, 10);
SetWindowRgn(hWnd, hRgn, true);
ShowWindow(hWnd, SW_SHOW);
Text=strdup(text);
}
};
#endif