Классы реализация которых еще не закончена
Алгоритм ухода от столкновения реализация класса CVehicle

Рис1. вид главного окна app5.
Создать обьект можно с помощью кнопки Add, либо c помощью комадны create_obj.
Выбор обьекта осуществляется через список ObjList. Список поддерживает фильтрацию по различным полям. При выборе обьекта он переходит в состояние выбран и его ссылка появляется в списке выбранных обьектов обьекта CSelection.
Выбор обьекта можно делать щелкнув по нему мышью.
Выбор нескольких обьектов осуществляется с клавишей shift.
Может проходить по следующим полям:
Следующие типы обьектов являются стандартными и различаются в версии 1.01
Видимые визуальные обьекты можно поворачивать, масштабировать и перемещать в пределах сцены и применять к ним различные функции. Обьекты можно прятать и проявлять. Их можно обьединять в группу и перемещать эту группу. Перемещение обьекта мышью можно ограничить по одной оси, нажав кнопки x,y,z . Параметры обьекта меняются через инспектор обьектов.
Любой аттрибут можно вывести на экран обновления строчкой watch("objname","attrname")
У экрана вывода переменных есть режим surviveMode, означающий что выводится только то что обновляет свое значение в течении N циклов апдейта. Если переменная не меняется она автоматически удаляется из мониторинга. Также можно выводить любую переменную из c++ вызвав pscr.upd(var). За мониторинг сейчас отвечает отдельное прилодение "Монитор app5".
Функции объекта можно вызвать в окне ObjectInspector, в командном интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователю необходимо создать метод Declare. в котором указать каждый нужный метод или свойство си++ и передать его адрес в функцию SET_ATTR или SET_METHOD.
Каждый обьект может быть сохранен в файл сцены. При отсутствии специальнорго способа сохранения у потомков базового класса, сохраняются только свойства базового класса. Свойство можно пометить как isNotSaving тогда оно не будет сохраняться в файл сцены.
class Object : public CObject
{
public:
DECLARE_SERIAL( Object )
Object();
~Object();
Object(Object& B)
virtual operator=(Object& A)
virtual void NullReferences(){};
void Connect();
void Disconnect();
virtual void Copy(Object* A);
//Установить имя обьекта, недопускаются повторы.
void SetName(std::string str);
//Переименовать
void Rename(std::string str);
//Установить имя класса
void SetClassName(std::string);
void SetAddr2this(t_atr& a)
// Присвоить значение аттрибуту
void SET(char* attrname, char* val)
// Присвоить описание обьекту
void SET_DESCR(string descr);
//Задекларировать аттрибут
void SET_ATTR(string name, void* addr, string type, bool bHidden);
//Взять аттрибут
t_atr* GET_ATTR(string name);
//Установить метод
void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
//Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
int SET_OBJECT(void* this_ptr, char* objname);
//Найти обьект в таблице по имени (старый метод)
static void* GET_OBJECT(char* objname);
//Удалить обьект
static void DELETE_OBJECT(char* objname);
//Вызвать метод обьекта
int CALL(char* obname, char* classname, char* methname);
string GetMethName(char* dummy,...);
//Для записи аттрибутов в файл
string ReadString(CArchive& archive);
void WriteString(CArchive& archive, string str);
int RemoveSignals();
// Обычные слоты
virtual void mouse_move(int x, int y){};
virtual void mouse_wheel(int zDelta){};
virtual void click_lmb(int state){};
virtual void click_rmb(int state){};
virtual void click_mmb(int state){};
virtual void key_pressed(int k){};
//сюда приходит сигнал апдейта от первого таймера
virtual void Slot1(CSignal& sig);
virtual void Slot2(CSignal& sig);
virtual void Slot3(CSignal& sig);
virtual void Slot4(CSignal& sig);
// Слюда приходит сообщение
virtual void MessageSlot(CMessage& msg);
//События
virtual void OnSelect(){};
virtual void OnUnselect(){};
virtual void OnAttrChange(t_atr& a){};
virtual void OnAttrSelect(t_atr& a){};
virtual void OnDrag( float x, float y, float z );
name; //имя
classname; //имя класса
groupname; //имя группового обьекта
int livetime; //время жизни
bool connected; //соединен с системой сигналов
EntetyInfo ei; // информация о ентети
vector<t_atr> atrs; // массив аттрибутов
map<string,int > atrsmap; // таблица аттрибутов
vector<string> expressions;//выражения
//tagTYPE meth_args[1][1]; // параметры функции
bool isEntety; // это сущность мира
bool isNotSaving; // это не сохраняемый обьект
bool isCanRender; // этот обьект может быть визуализирован
int isSelected; // этот обькт выбран в данный момент (0- обьект не выбран, 2 - обьект выбран)
bool isGroup; // эта группа
bool isLoading; // идет загрузка обьекта
//bool isPhysic;
bool onOpora; // свободно либо на опоре
int isHidden; //0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
bool m_Updated;
string updatescript; //скрипт для обновления параметров
string initscript; //скрипт для инициализации
time_t osCreationTime; //время создания
DWORD osCreationTimeTicks; //время в тиках
bool bHideStdAttrs; // имеет спятанные аттрибуты
};
Обьекты этого класса визуализируются на экране. Другими словами попадают в конвеер рендеринга.
Интерфейс:
class RenderObject : public Object
{
RenderObject();
//вызываются из нити рендеринга
virtual void Render();
virtual void PreRender();
virtual void PostRender();
};
Чтобы сделать визуальный обьект сделайте следующее:
Для загрузки сцены нужно 3 файла: object.arh classes.arh offset.arh. В файл classes.arh записываются имена классов обьектов, в файл obj.arh записываются данные обьектов, в файл offsets.arh записывается таблица имя оьекта - смещение на начало данных. У обьекта сохраняются все аттрибуты за исключением тех аттрибутов для которых выставлен флаг isNotSaving.
Для любого выбранного обьекта можно сохранять его состояние в любой момент времени.
Потом с помощью кнопки ReloadObj восстановить это сохраненное состояние.
Каких либо ограничений на длинну имен обьектов не существует равно как и нет ограничений на символы состовляющие имя обьекта. Единственное требование - имя должно быть уникально. Если при задании имени обьекта возникла коллизия в ячейке таблицы объектов, система атоматически сменит имя добавив к нему окончание в виде первых байт адреса этого обьекта.
В текущей версии 1.01 сохраняются все аттрибуты базового класса: дефолтовый размер примерно равен 1.4 кб. Добавление специальных методов Serialize у классов потомков естественно может увеличить размер. Например в случае геометрического обьекта обьем выделяемой памяти зависит от количества вершин. Вам необходимо написать свой метод сериализации таких обьектов, не забыв вызвав метод Serialize базового класса вначале.
Идентификаторы генерируются каждый раз при загрузке сцены. Поскольку при создании компилятор размещает обьекты си++ в разные участки памяти нам не нужно заботиться о выдаче уникальных идентификаторов если они вообще понадобятся. Поиск обьектов эффективно реализуется по имени через функцию CObjRegistry::FindObj
Объект может содержать в себе группу обьектов. Для таких объектов должен быть установлен флаг базового класса isGroup. Кроме того групповой обьект должен быть унаследован от класса Group. Обьект класса Group может содержать обьекты незарегистрированные в реестре обьектов (основной таблице обьектов).
bool isGroup;
Pnt bounds; // размеры
Pnt C0; //центр
float mass; //масса
Pnt kurs0; //курс вектор из точки C0
Pnt v; //мгновенная скорость
Силы :
Движение:
в классе Ball реализовано качение шара по плоскости в одном направлении
в классе Vehicle реализовано поступательное движение обьекта.
MODE_SELECTION - режим выбора обьекта мышью
MODE_MOVE - режим перемещения мышью
MODE_SCROLLVIEW - используется для скроллинга вида сверху вдоль осей x и y
MODE_PICK - в этом режиме редактор позволяет назначить точку кликом мыши.
Класс сигнала используется в системе рассылки сигналов.
Для того чтобы подсоединить обьект к циклу обновления, необходимо вызвать метод базового класса Connect() в конструкторе. По умолчанию задается первый слот (слот апдейта), имя сигнала по умолчанию присваивается в виде "Dest_objname-Src_objname"
class CSignal
{
public:
CSignal(Object* dest, int slot_num);
CSignal(Object* dest, Object* src, int slot_num);
void SetName(string name){strcpy(Name, name.c_str()); };
int Send(); // Немедленная посылка сигнала
int Post(); // Запланированная посылка сигнала
char Name[255]; // имя сигнала
int slot_num; //номер слота
void* data; // ссылка на произвольные данные
Object* dest; // Обьект которому идет сигнал
Object* src; // Обьект от которого идет сигнал
};
Определяет аттрибут обьекта
Тип аттрибута обьекта один из распознаваемых ObjectInspector. Может быть untyped
Список типов поддерживаемых ObjectInspector
Обьекты имеют динамический список аттрибутов, которые могут добавлятся в процессе работы программы.
Например при создании новой точки в кривой появляется новое свойство с именем Pnt1
float
min -минимальное зн-е
max - максимальное зн-е
step - шаг
flags - флаги установленные для аттрибута
Hide()
Ставит флаг isHidden. Прячет аттрибут. Необходимо для функции фильтрации свойств в ObjInspector
Unhide()
Снимает флаг isHidden.
Select()
Ставит флаг isSelected. Для выбранного аттрибута отображается адрес в консоле.
Unselect()
toString()
Конвертирует значение аттрибута в строку
fromString()
Парсирует строку в тип аттрибута.
Watch()
Устанавливает флаг isWatched. Это нужно для просмотра значения аттрибута на экране выводимых переменных.
isWatched()
ReadOnly()
Устанавливает флаг isReadOnly. Нужно для защиты от записи аттрибута. Например имя обьекта, поскольку оно занесено в реестр обьектов.
isReadOnly()
проверяет флаг isReadOnly
NotSaving()
Устанавливает флаг NotSaving. Это означает что его значение не будет сохраняться в файл при сохранении сцены.
isNotSaving()
проверяет флаг isNotSaving()
Наследование: Object->RenderObject
При запуске мира в нем существует одна камера свободного обзора.
Для отображения ортогональных видов применяется тот же класс.
Активная камера — это та камера которой передается управление мыши, клавиатуры и других устройств ввода. Выбор активной камеры делается кликом по вьюпорту. Камера может быть визуализирована в изображении другой камеры. Камера отображается в другом окне как тетрайдер, основание которого - плоскость проекции виртуального изображения.
Управляется камера с помощью клавиш - w,a,s,d направление обзора и движения регулируется мышью. Вектор движения определяется чрез точку lookAt, точкой в которую смотрит камера. Координаты этой точки преобразуются в сферической системе координат взависимости от движений мыши.
Для более плавного движения камеры рассматривается применение математического аппарата кватернионов.
Определяет начальные действия
-Инициирует загрузку сцены
-Создает и разммещает данные обьектов в памяти
-Определяет порядок рендеринга обьектов
Определяются глобальными флагами flags
-bShading Шейдинг с наложением материала на полигоны
-bColorRendering - Используется matid для выбора цвета грань
-bWire - Режим отображения в виде сеточного каркаса
-bMayPaintGDI - особый режим отрисовки (нужен для удаленного дисплея)
характеризуется
характеризуется:
-скоростью
-обьемом(длинами сторон ограничевающего параллепипеда)
-массой
-направлением
Содержит:
Таблицу (objname, EntetyInfo)
Функции:
Содержит:
Таблицу (resname, ResInfo)
Функции:
Перенаправляет действия пользователя обьекту управления.
Предоставляет двухмерные координаты в экране (вьюпорте OpenGl)
Предоставляет трехмерные координаты точки в виде "сверху".
Содержит включение режима "прилипания" курсора к сетке.
Отображает список свойств обьекта,
Изменяет любое свойство не ReadOnly
Отражает изменение свойства во времени
Вызывает функции обьекта.
Плавно меняет свойство в пределах выбранной точности
Поддерживает базовые типы: число, строка, флаг
Поддерживает некоторые специальные типы:
коллекция строк, вектор, точка, цвет
Описывает пространство.
Пространство состоит из набора узловых точек MapPoint.
Пространство делится на сектора(Sector) вершины которых представляют собой узловые точки.
Позволяет осуществить поиск обьектов в окресности некоторой точки.
Функции мировой системы координат
Переводы из локальной системы координат в мировую
Подразумевает деление пространства на отдельные сектора содержащие
ссылки на обьекты, которые в нем присутсвуют (целесообразно для больших карт).
Функции:
Реализация механизма выбора обьектов.
Наследование: Object->RenderObject
Класс визуализирующий сферу с физикой мяча
Для импорта моделей используется формат сцены 3dmax ASE
http://paulbourke.net/dataformats/ase/
Импорт сцены формата ASE реализован в ascii3d.cpp.
По спецификации сцены ASE в app5 создаются модели класса GemObject. Внутри GemObject создается агрегированный обьект класса Mesh (полигональная сетка). Каждому полигону присваивается номер matid. Дальше по этому полю возможен цветовой рендеринг в случае отсутсвия текстур. Также в память загружаются материалы. Инициализируются материалы присвоенные полигону, координаты текстур, устанавливается модель меппинга (циллиндрический, планарный, сферический). Импортируются сплайновые обьекты типа Shape.
Класс для загрузки ASE.
Создание и правильное размещение обьектов в мире app5.
class CAsciiLoader
{
public:
CAsciiLoader();
vector<string> info;
std::string filename;
tm time;
int version;
void ProcessMesh();
char NextLine();
void Reset();
void AssignMt()
void ResetFlags()
//~CAsciiLoader();
int LoadASCIIIFile(char ASC3d_filename);
void GetInfo();</string>
};
Наследование: Object->RenderObject
Copy(Object* A)
ComputeC0() | поиск геометрического центра обьекта
SetNumFaces() | Установить количество полигонов
SetNumVert() | Установить количество вершин
CenterModel() | Пересчитывает координаты обьекта из мировых в локальные
Serialize() | Метод реализирующий бинарный экспорт данных обьекта
LoadMesh(string goname); // для обьектов типа Ссылка (ссылка на данные со своими pos, rot, scale и тд))
FillArrays();
Render();
struct Vertex
struct Vertex_knot
{
int idx;
Pnt c;
bool knot; // узловая точка или интерпол
};
typedef struct TFace
{
Vertex vertices[4]; // полигон состоит из 4 точек
Pnt facetNormal; // нормаль полигона
char matid; // номер материала
}TFace;
class GroupObject: public Object
{
public:
string NODE_NAME;
string HELPER_CLASS;
Pnt BOUNDINGBOX_MIN;
Pnt BOUNDINGBOX_MAX;
Node_TM nodetm;
};
class ShapeObject : public Object
{
public:
DECLARE_SERIAL( ShapeObject )
string NODE_NAME;
string NODE_PARENT;
Node_TM modetm;
int SHAPE_LINECOUNT;
vector<shapeline> shapelines; </shapeline>
Содержит модель движения автомобиля, анимацию автомобиля (анимируются колеса).
Обьекту этого класса может быть присвоена траектория класса Curve.
Машину можно перемещать в начало траектории.
Управление клавишами o,k,l,;
При движении на автомобиль кроме силы тяги действует сила тяжести и сила трения.
Когда машина управляется пользователем на траектории отображаются ближайшая точка.
Эта точка окрашивается в зеленый цвет если машина движется по направлению к концу траектории и в синиий цвет - если наоборот.
Содержит визуальный сплайн Эрмита с возможностью редактировать контрольные точки, перемещать их и регулировать степень кривизны (производные в контрольных точках).
В Curve добавлена Спираль задается двумя радиусами и высотой
В Curve добавлена Дуга задается двумя точками и высотой
В Curve добавлен альтернативный алгоритм сплайна Кочана-Бартельса
Деморекордер позволяет записывать положения обьектов и другие параметры
в данный момент времени. Или на протяжении периода времени.
Например запретить поворот колес. Запретить изменение скорости, задать параметр const.
Тогда прямое обращение к аттрибуту нужно заменить косвенным.
Как это согласовать с контроллером, который присвоен аттрибуту.
Вызовы функций осуществляются в gtimer.Timer2() при каждом тике
Для каждого обьекта свой файл следующего содержания
Формат имени файла: objname_time.mudem

Нужен вывод данных в табличной форме.
Нужен вывод данных в виде графиков.
Подход 1:
Каталог: mu/demos
Формат имени: objname_time.mudem
ndemos; //кол-во демок
demoname; //имя текущей демки
interval; //интервал времени через который бкруться аттрибуты
Cycle(); //Зациклить демо
RecordNew(); //Записать новую дему для обьектов
Delete(); //Удалить демо
Play(); //Проиграть
Bind(); //Применить \ Отменить демо для текущего обьекта
Next(); //Следующий шаг. Цикл по всем демкам
demoname; // Имя демо = objname_dem_time
timestarted; // время нажатия на кнопку "Запись"
interval; // интервал времени через который бкруться аттрибуты
length; // время записи
descr; // описание
filename; // objname_time.mudem
objectname; // имя обьекта
bCycled; // зациклено
offset; // смещение относительно начала файла
size; // размер демо в байтах
Next(); // восстановить следующий дамп
LoadNext(); // восстановить следующее состояние обьекта
LoadPrevios(); // восстановить предыдущее состояние обьекта
SaveNext(); // сохранить текущее состояние обьекта
В глобальной области этой виртуальной машины (далее MUVM) создаются таблицы с именами обьектов. По умолчанию через MUVM доступны все обьекты которые вы видите в списке(включая скрытые) и все методы бызового класса Object. Также можно преобразовать ссылку базовый класс в ссылку на класс потомка. С помощью функций asCamera, asCMovement, asHelperObject, asCVehicle, asShapeObject, asGemObject, asCMaterial, asCLight, asKirpich, asBall
Создает обьект заданного класса.
Присвоить значение аттрибуту обьекта
Вызвать метод обьекта
Снять выделение со всех обьектов
Снять выделение с обьектов, имена через запятую.
Регулярные выражения не допускаются.
Выбрать обьект\ы имена через запятую.
Регулярные выражения не допускаются.
Очистка сцены. Удаление всех обьектов
Печать переменной или строки на консоль
Установить мониторинг за переменной
Сбросить мониторинг переменной
Функции и ключевые слова ВМ
for, min, max, random, exit, date, print, clock,watch, getenv, gsub, format
Например чтобы вычислить чему равна сумма 2 и 2 можно написать:
a = 2 + 2;
prn(a);
Например чтобы изменить положение камеры можно написать:
cam02.ei.coord = Point(2,6,0);