Автоматизированное редактирование частиц в компьютерной графике

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

?ся вводить посредством векторов.

Необходимо изменить способы задания изменения цвета частиц (через визуальный цветовой элемент управления), ввести возможность использования дополнительных ключей цвета, с учётом длительности перехода частицы от одного цвета к другому.

Аналогичные параметры-ключи (и визуальные элементы управления, соответствующие им) будут введены для размеров частиц.

Для размеров, цвета, задержки генерации частиц планируется ввести параметры дисперсии.

Некоторые изменения претерпит и оконная система приложения. В ней будут преобладать перетаскиваемые присоединяемые панели. Станет возможным изменение размеров окна вывода, а также использование полноэкранного режима при просмотре эффектов.

Среди прочих возможных изменений можно отметить запуск в окне просмотра и встраивание эффектов частиц в файлы видео, а также расширенные программные интерфейсы для разработчиков компьютерных игр и иных графических приложений.

Перечисленные изменения должны повысить интерес к программному средству и его полезность для разных групп пользователей.

 

Список использованных источников

 

1) Бьёрн Страуструп Дизайн и эволюция языка C++ - М.: ДМК пресс, 2006. - 448с.

2) Ефремова О.С. Требования охраны труда при работе на персональных электронно-вычислительных машинах (ПК) - М.: Альфа-пресс, 2005. - 150с.

4) Санитарные нормы для образовательных учреждений . - 5-е изд., доп. - М.: Образование в документах, 2002. - 200с.

5) Замбржицкий О.Н. Гигиеническая оценка естественного и искусственного освещения помещений. - Мн.: БГМУ, 2005. - 18 с.

6) СанПиН N 9-131 РБ 2000 Гигиенические требования к видеодисплейным терминалам (ВДТ), электронно-вычислительным машинам (ЭВМ) и организации работы

7) Косилина Н.И., Колтановского А.П. Производственная гимнастика для работников умственного труда - М.: Физкультура и спорт, 1983.

8) Кляуззе В.П. Безопасность & компьютер. - Мн.: В.П.Кляуззе, 2001. - 155с.

 

Приложение А

(обязательное)

 

Текст программного модуля обработки частиц

 

//ParticleSystemChain.cpp (очередь эмиттеров)

#include "ParticleSystemChain.h"

#include "PSOutputFrame.h"//just for using canvas to get current reflecting mode ang zoom

 

#define BLEND_SRC "blend_src"

#define BLEND_DST "blend_dst"

#define ITEM_SELECTED "item_selected"

#define PSBOUND_SELECTED_COLOR wxColour(200, 200, 200, 255)

#define PSBOUNS_CHOOSED_COLOR wxColour(70, 70, 70, 255)

#define PSBOUND_COLOR wxColour(50, 50, 50, 255)

 

#define MIN_RUN_PSCHAIN_ITEM_DIMENSION 20

 

ParticleSystemChain *ParticleSystemChain::singletonChain = NULL;

 

ParticleSystemChain* ParticleSystemChain::Master()

{

if(!singletonChain)

singletonChain = new ParticleSystemChain();

return singletonChain;

}

 

void ParticleSystemChain::CleanSingleton()

{

if(singletonChain)

{

delete singletonChain;

singletonChain = NULL;

}

}

 

int ParticleSystemChain::AddSystem()

{

ParticleSystem* ps = new ParticleSystem();

all_ps.push_back(ps);

if(workMode != ParticleSystemChainWorkMode_STATIC)

ps->start();

int new_ps_layer = (int)all_ps.size() - 1;

if(selectedSystemLayer < 0)

selectedSystemLayer = new_ps_layer;

return new_ps_layer;

}

 

bool ParticleSystemChain::RemoveSystemAtLayer(int layer)

{

=(int)all_ps.size()))">if( (layer = (int)all_ps.size()) )

return false;

 

delete all_ps.at(layer);

all_ps.erase(all_ps.begin() + layer);

if(layer == choosedSystemLayer)

choosedSystemLayer = -1;

if(all_ps.size() == 0)

selectedSystemLayer = -1;

else

if(selectedSystemLayer >= layer && selectedSystemLayer > 0)

selectedSystemLayer--;

return true;

}

 

void ParticleSystemChain::RemoveAll()

{

::iteratoriter=all_ps.begin();">vector::iterator iter = all_ps.begin();

while(iter != all_ps.end())

{

delete((ParticleSystem*)*iter);

++iter;

}

all_ps.clear();

selectedSystemLayer = choosedSystemLayer = -1;

}

 

void ParticleSystemChain::MoveSystem(int from, int to)

{

int numof_systems = (int)all_ps.size();

if( (from == to) || (from = numof_systems) )

return;

 

ParticleSystem *tmp_ps_ptr = all_ps.at(from);

all_ps.erase(all_ps.begin() + from);

all_ps.insert(all_ps.begin() + to, tmp_ps_ptr);

}

 

void ParticleSystemChain::CopySystemsData(int layer_from, int layer_to)

{

int numof_systems = (int)all_ps.size();

if(layer_from == layer_to || layer_from = numof_systems )

return;

 

copyDataFromParticleSystem(all_ps.at(layer_from));">all_ps.at(layer_to)->copyDataFromParticleSystem(all_ps.at(layer_from));

}

 

bool ParticleSystemChain::Save(TiXmlElement* root) const

{

TiXmlElement tmp("BLENDING");

TiXmlElement *caption = (TiXmlElement*)root->InsertEndChild(tmp);

if(!caption)

return false;

 

caption->SetAttribute(BLEND_SRC, blendModeSrc);

caption->SetAttribute(BLEND_DST, blendModeDst);

return saveSystems(root);

}

 

bool ParticleSystemChain::Load(TiXmlElement *root)

{

TiXmlElement *blending_attrs_ptr = (TiXmlElement*)root->FirstChild("BLENDING");

if(!blending_attrs_ptr)//old version file (1.0), just set defaults

{

blendModeSrc = GL_ONE;

blendModeDst = GL_ONE_MINUS_SRC_ALPHA;

}

else

{

blending_attrs_ptr->Attribute(BLEND_SRC, &blendModeSrc);

blending_attrs_ptr->Attribute(BLEND_DST, &blendModeDst);

}

return loadSystems(root);

}

 

ParticleSystemOutputCoordCharacter ParticleSystemChain::AnalyseOutputCoords(MYPoint2D point) const

{

ParticleSystemOutputCoordCharacter res;

res.psLayer = -1;

res.isLeft = res.isRight = res.isTop = res.isBottom = false;

 

//first find selecting system layer

::const_iteratoriter=all_ps.end();">vector::const_iterator iter = all_ps.end();

::const_iteratorbegin_iter=all_ps.begin();">vector::const_iterator begin_iter = all_ps.begin();

size_t i = all_ps.size();

wxRect system_rect, tmp_rect;

bool chain_is_run = (workMode != ParticleSystemChainWorkMode_STATIC);

while(iter != begin_iter)

{

--iter, --i;

wxRect tmp_rect;

MYPoint2D appear_box_position = MYPoint2DMake((*iter)->getX(), (*iter)->getY());

MYSize2D appear_box_size = (*iter)->getAppearBoxSize();

if(chain_is_run)

{

tmp_rect = wxRect(appear_box_position.x, appear_box_position.y, appear_box_size.width, appear_box_size.height);

if(tmp_rect.GetWidth() < MIN_RUN_PSCHAIN_ITEM_DIMENSION)

{

int diff = MIN_RUN_PSCHAIN_ITEM_DIMENSION - tmp_rect.GetWidth();

tmp_rect.SetX(tmp_rect.GetX() - diff / 2);

tmp_rect.SetWidth(MIN_RUN_PSCHAIN_ITEM_DIMENSION);

}

if(tmp_rect.GetHeight() < MIN_RUN_PSCHAIN_ITEM_DIMENSION)

{

int diff = MIN_RUN_PSCHAIN_ITEM_DIMENSION - tmp_rect.GetHeight();

tmp_rect.SetY(tmp_rect.GetY() - diff / 2);

tmp_rect.SetHeight(MIN_RUN_PSCHAIN_ITEM_DIMENS