[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
Форум » Моддинг » W3DMapEditor by Alexbond (Уроки, Вопросы) » W3DEditor v. 2.3???
W3DEditor v. 2.3???
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Добавлена функция Delete. Удаляется выделеный поксель, вызывается кнопкой Delete!!!

Обдумываю функции Redo/Undo


 
firsacho
Админы
Сообщений: 3812
Реп: 84 / Инв: 15
Quote (AlexBond)
Добавлена функция Delete. Удаляется выделеный поксель, вызывается кнопкой Delete!!!

Обдумываю функции Redo/Undo


Оо... дельное изменение... Новая версия это похоже будет нечто)




Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

mod.worms.pro - мод Worms Renewation для Worms4
 
Проверенные
Сообщений: 336
Реп: 51
Предлагаю сделать шаблон червя в редакторе, ну например, чтобы "примерить" карту или чтобы сделать вход по размеру


Да, а можно ли сделать в редакторе функцию Boolein
А как на счёт подвижной камеры? Ну как в игре на М


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
По поводу Undo/Redo на всякий случай напомню про эти посты:
http://w4tweaks.ru/forum/91-710-13273-16-1264089437
http://w4tweaks.ru/forum/91-710-13280-16-1264095566


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Как быть с удалением покселей? Вот я удалил поксель, потом нажал отмена поксель вернулся. Нажал повтор, поксель опять удалился... спрашивается удаление производится физическое, но создаем копию, если же возвращаем состояние копия уже будет содержать иной адрес.

Вот к примеру ситуация:

Имеется дерево из покселей.
Я к примеру удалил с начало 3-й элемент дерева привязанный ко второму по адресу,
Затем удалил второй элемент дерева привязанный к первому.
Захотел отменить два действия. Допустим второй элемент я воссоздаю из стека, но он принимает новый адрес, так как создается заново. Вторая отмена приведет к ошибке, так как адрес к которому нужно прикрепить воссозданный 3й элемент, уже изменился...

Короче гемор... а если я так удалю много... все адреса поменяются... Куда я буду прикреплять поксели из стека?

Еще, как я понял добавление состояние в стек нужно делать при каждом изменении. К примеру когда мы перемещаем мышью поксель, добавлять нужно или до начала перемещения или после. Тут проблема отловки этого события, ведь EditX на прямую пишет значения в Poxel и надо переделать этот компонент...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Как альтернатива - сохранение всего дерева. при каждом малейшем изменении...
Но опять же это не оптимизировано...

Тогда еще версия - выборочное сохранение... но тут опять загвоздка... если сразу сохранял лишь поксель то он был приклеен к какому-то адресу, а потом всю карту... при восстановлении опять адреса спутаются...

Может использовать Кодовые деревья? и сохранять поксель в стек с адресом вида ABNK, который означает
Ветвь A - Ветвь B - Ветвь - N - Ветвь K


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Изучаю статьи по Undo Redo
http://www.equin.co.uk/articles/undoarticle.htm
http://www.codeproject.com/KB/cs/undoredobuffer.aspx

http://www.rsdn.ru/article/dotnet/backforward.xml

http://www.codeproject.com/kb/docview/undo.aspx
http://www.codeproject.com/KB/atl/undomgr.aspx?target=undo


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Похоже ты опять меня не совсем понял)

Вот пример(каждое дерево хранит только ссылки на объекты!):

Загружаем редактор.
В стеке отмен лежит одно дерево только с указателем на Root элемент.
Отображается текущее состояние.

Добавляем поксель.
Выделяется память под новый поксель.
В стек добавляется копия этого дерева на верху стэка, но в новую копию добавлен указатель на поксель.
Отображается текущее состояние.

Удаляем поксель.
Реально в памяти остаётся тот поксель, однако на основе прошлого дерева строится новое без указателя на поксель.
Отображается текущее состояние.

Жмём Undo.
Стек остаётся в целости-сохранности, только за текущее состояние принимается прошлое.
Отображается текущее состояние.

Жмём Redo.
Стек остаётся в целости-сохранности, только за текущее состояние самое новое.
Отображается текущее состояние.

Жмём Undo.
Меняем текущее состояние.
Отображается текущее состояние.

Жмём Undo.
Меняем текущее состояние.
Отображается текущее состояние. (мы на начальном, где не было покселя)

Создаём новый поксель.
Выделяется память под новый поксель.
В стек добавляется копия дерева со дна стэка, в новую копию добавлен указатель на новый поксель.
Два других дерева удаляются, так как они больше не достижимы с помощью Undo/Redo.
Если в дельфях есть сборщик мусора - то он всё приберёт(удалит поксель, на который нет ссылки), иначе для всех объектов надо бы хранить ссылку на самое раннее дерево, где он появился и при удалении этого дерева удалять и объект.
Отображается текущее состояние.

Как-то так. Предельно разжёвано.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Про перемещение объектов в пространстве: надо производить изменение в стеке только при отпускании мыши.

Ну да, наверно не стек, а 2 стека, как описано вот тут http://www.rsdn.ru/article/dotnet/backforward.xml


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Так... вопрос, что мы записываем в стек, когда изменяем лишь позицию? или положение одной точки, или координаты.

 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
А, я понял проблему) При добавлении покселя мой вариант на ура, а вот его изменение подразумевает создание полной его копии, создание копии дерева указателей, в котором указатель на поксель заменён новым.
Это лажа...
Тогда можно хранить, как в той статье, только инфу об изменении конкретного объекта. Но в этом случае придётся хранить и команды создания и удаления покселей.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Вот пример как действует 3DSMAX MacroRecodred

Code

actionMan.executeAction 0 "40472"  -- MAX Script: MAXScript Listener
select $Cylinder01
macros.run "Objects Primitives" "Cylinder"
Cylinder smooth:on heightsegs:5 capsegs:1 sides:18 height:16.6061 radius:35.2207 mapcoords:on pos:[-24.0269,-15.1289,0] isSelected:on
Cylinder smooth:on heightsegs:5 capsegs:1 sides:18 height:12.9038 radius:5.82835 mapcoords:on pos:[-28.6992,-74.3184,0] isSelected:on
max select
select $Torus01
select $Cylinder02
select $Cylinder01
select $Box01
select $Cylinder03
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
max delete
select $Torus01
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
max delete
select $Cylinder02
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
max delete
select $Cylinder01
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
max delete
select $Box01
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
max delete

или вот:

Code
select $Sphere01
max tool zoomextents
max tool zoomextents all
max modify mode
macros.run "Modifier Stack" "Convert_to_Mesh"
subobjectLevel = 1
modPanel.setCurrentObject $Sphere01.baseObject
select $Sphere01.baseObject.verts[#{101}]
max move
toolMode.coordsys #view
move $Sphere01.verts[#{101}] [-9.71286,-11.2686,0]
move $Sphere01.verts[#{101}] [0,0,8.71245]
max rotate
subobjectLevel = 0
modPanel.setCurrentObject $Sphere01.baseObject
$Sphere01.rotation = quat 0.747506 -0.166976 0.04144 0.641589
max scale
$Sphere01.scale = [1,1.36294,1]
max move
$Sphere01.pos = [42.4191,-24.5008,120.968]
clearSelection()
select $Sphere01
actionMan.executeAction 0 "40020"  -- Edit: Delete Objects
max delete


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Короче надо придумать структуру Состояний которое будет в стек записываться... иначе не получится....

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Итак, мысли следующие:

Сбор состояния. PushState(type,point)
Будет иметь два параметра - тип:
Pos, Size, Rot, Clip, TextCoord, Layers, Hmap, Color, Poxel

И ссылку на адрес этих переменных( @Tver)

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

Единственная проблема - удаления ветви из дерева. Ведь адрес тоже удалиться, а воссоздать тот же адрес нельзя. Поэтому поксель нужно прикреплять не к адресу, а как-то по другому... Пока еще не знаю как, но придумаю...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Redo и Undo работают, для всех изменений с покселем, лимита нет!
Одна проблема... причем большая...

Нужно придумать, как сохранять состояние при удалении и создании покселя.

В стеках у меня хранятся данные следующего вида:

Code
type
         TPushType=(PT_Select, PT_Delete, PT_Pos,PT_Size,PT_Rot,PT_Clip,PT_Name,PT_EBS,PT_TextCoord,
         PT_Surface,PT_TextCode,PT_Layers,PT_HMAP,PT_Poxel);

  TStackCell = class
   PushType:TPushType;
   Vector:TVector;
   Str:String;
   TextCoord: array[1..16] of GLfloat;
   Layers1: ALayer;
   Layers2: ALayer;
   HMapVals: THmap;
   Surcface: array [1..3] of Integer;
   PoxelsTextCode: array of Cardinal;
   Poxel:TPoxel;
   Next:TStackCell;
   end;

Проблема в том, что я не знаю как обращаться к удаленному покселю... Ведь адрес и ветвь у него изменяться, при восстановлении...

К примеру в 3DSMAX выделяют командой Select $Object01. У меня же выделяется одновременно и ветвь покселя в дереве TTreeNode, и сам поксель TPoxel, причем они друг на друга ссылаются. Которые имеют уникальные адреса и обращаться к удаленному адресу я не могу...

Нужно создать уникальный идентификатор, который будет сохраняться при копировании, и по нему обращаться к покселю...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Undo и Redo работают!!! но с ошибками... после отладки всех ошибок angry выпущу новую версию редактора!!!

 
Sergey
Проверенные
Сообщений: 814
Реп: 37 / Инв: 11
biggrin эт очень хорошо!

Администрация имеет право кастрировать пользователей сайта!
 
analiener
Проверенные
Сообщений: 382
Реп: 8
про вот это никто не вспомнил
http://w4tweaks.ru/forum/98-857-1








Умом Упячку не понять,
Аршином общим не измерить.
Упячку надо посещать!
В Упячку надо просто верить...
 
Sergey
Проверенные
Сообщений: 814
Реп: 37 / Инв: 11
уже да

Администрация имеет право кастрировать пользователей сайта!
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Нужны тестеры W3DMapEditor v2.3.

Требования:

- ответственность
- терпение
- знание большинства функций редактора карт
- сообразительность.

Цели:

- изучения работоспособности редактора
- поиск ошибок
- запись места и действия приведшего к ошибке
- отладка всех видимых и невидимых ошибок

При желании помочь, пишите.


 
Форум » Моддинг » W3DMapEditor by Alexbond (Уроки, Вопросы) » W3DEditor v. 2.3???
Поиск: