diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e9a404..8cc2529 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ else() add_subdirectory(src) shstk_copy_to_parent() - shstk_install(qglengine FALSE "" "${QGLEngine_VERSION_FILE}") + shstk_install(qglengine FALSE "" "${QGLEngine_VERSION_FILE}") file(GLOB CMAKES "cmake/*.cmake" "cmake/*.in") install(FILES ${CMAKES} DESTINATION ${CMAKE_ROOT}/Modules) diff --git a/src/core/lang/qglengine_core_en.ts b/src/core/lang/qglengine_core_en.ts new file mode 100644 index 0000000..bc6d6e7 --- /dev/null +++ b/src/core/lang/qglengine_core_en.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/core/lang/qglengine_core_ru.ts b/src/core/lang/qglengine_core_ru.ts new file mode 100644 index 0000000..f62cf2e --- /dev/null +++ b/src/core/lang/qglengine_core_ru.ts @@ -0,0 +1,4 @@ + + + + diff --git a/src/core/lang/update.bat b/src/core/lang/update.bat new file mode 100644 index 0000000..36cb300 --- /dev/null +++ b/src/core/lang/update.bat @@ -0,0 +1,2 @@ +lupdate ../ -no-obsolete -ts qglengine_core_ru.ts +lupdate ../ -no-obsolete -ts qglengine_core_en.ts diff --git a/src/core/qglengine_core.qrc b/src/core/qglengine_core.qrc index 52a6abf..85ff74a 100644 --- a/src/core/qglengine_core.qrc +++ b/src/core/qglengine_core.qrc @@ -26,6 +26,8 @@ ../icons/edit-paste.png ../icons/go-jump.png ../icons/go-top.png + ../icons/go-up.png + ../icons/go-down.png ../icons/layer-visible-on.png ../icons/layer-visible-off.png ../icons/light-+.png diff --git a/src/core/scene/glscene.cpp b/src/core/scene/glscene.cpp index cc1d58f..a3969da 100644 --- a/src/core/scene/glscene.cpp +++ b/src/core/scene/glscene.cpp @@ -53,12 +53,13 @@ Scene * Scene::clone() { } -void Scene::addObject(ObjectBase * o) { +void Scene::addObject(ObjectBase * o, ObjectBase * parent) { + if (!parent) parent = root_; ObjectBaseList aol = o->children(true); attachObject(o); foreach(ObjectBase * c, aol) attachObject(c); - root_->addChild(o); + parent->addChild(o); tree_changed = tree_struct_changed = true; } @@ -104,6 +105,7 @@ void Scene::clear() { geometries.clear(); materials.clear(); emit __destroyed(); + if (destroying) return; emit treeChanged(); } @@ -150,6 +152,7 @@ void Scene::removeObjectInternal(ObjectBase * o, ObjectBase * where) { void Scene::emitSelectionChanged() { + if (destroying) return; selected_top.clear(); foreach(ObjectBase * o, selected_) { ObjectBase * po = o->selectedParent(); diff --git a/src/core/scene/glscene.h b/src/core/scene/glscene.h index dc4f39e..6a1475c 100644 --- a/src/core/scene/glscene.h +++ b/src/core/scene/glscene.h @@ -56,7 +56,7 @@ public: /// Add object \"o\" to scene and take its ownership /// All materials and geometries used by \"o\" tree /// copied into this scene - void addObject(ObjectBase * o); + void addObject(ObjectBase * o, ObjectBase * parent = nullptr); void addScene(const Scene * s); void assignFrom(const Scene * s); diff --git a/src/icons/go-down.png b/src/icons/go-down.png new file mode 100644 index 0000000..680ac2d Binary files /dev/null and b/src/icons/go-down.png differ diff --git a/src/icons/go-up.png b/src/icons/go-up.png new file mode 100644 index 0000000..5e8f7dd Binary files /dev/null and b/src/icons/go-up.png differ diff --git a/src/widgets/lang/qglengine_widgets_en.ts b/src/widgets/lang/qglengine_widgets_en.ts new file mode 100644 index 0000000..c92757a --- /dev/null +++ b/src/widgets/lang/qglengine_widgets_en.ts @@ -0,0 +1,651 @@ + + + + + MaterialEditor + + Glass + + + + Transparency + + + + Reflectivity + + + + IOF + + + + Dispersion + + + + Reflection map + + + + Front: + + + + Back: + + + + Left: + + + + Right: + + + + Top: + + + + Bottom: + + + + X + + + + ^ + + + + load from directory + + + + Diffuse + + + + Normal + + + + Metalness + + + + Roughness + + + + Emission + + + + Relief + + + + + MaterialMapEditor + + title: + + + + Map + + + + Amount: + + + + Offset: + + + + Scale X: + + + + Scale Y: + + + + Invert R + + + + Invert G + + + + Invert B + + + + + MaterialsEditor + + Unset + + + + Assign + + + + Add + + + + Delete + + + + Rename ... + + + + Clone + + + + + ObjectEditor + + [No selected] + + + + Position + + + + X: + + + + Y: + + + + Z: + + + + Rotation + + + + ° + + + + Scale + + + + Texture + + + + SX: + + + + R: + + + + SY: + + + + Receive shadows + + + + Cast shadows + + + + Accept fog + + + + Visible + + + + Accept light + + + + Color: + + + + Aim distance: + + + + Light + + + + Type: + + + + Omni + + + + Cone + + + + Directional + + + + Intensity: + + + + Decay ^0: + + + + Decay ^1: + + + + Decay ^2: + + + + Size: + + + + Angle: + + + + - + + + + Camera + + + + Depth start: + + + + FOV: + + + + Roll: + + + + Mirror Y + + + + Mirror X + + + + Map + + + + [%1 objects] + + + + + PrimitiveEditor + + Form + + + + Width: + + + + Length: + + + + Segments W: + + + + Segments L: + + + + Segments H: + + + + Radius 1: + + + + Radius 2: + + + + Angle: + + + + ° + + + + Segments: + + + + Segments 2: + + + + Color: + + + + Flip normals + + + + Add + + + + Height: + + + + + PropertyEditor + + Property + + + + Value + + + + + SceneTree + + Filter: + + + + Expand tree + + + + Collapse tree + + + + Name + + + + Vis + + + + Material + + + + Focus + + + + Remove + + + + Clone + + + + Group + + + + Select parent + + + + Select by mesh + + + + Select by material + + + + Add node + + + + Add light + + + + Add camera + + + + Nodes + + + + Meshes + + + + Lights + + + + Cameras + + + + Transfer transform to children + + + + Active camera + + + + Default camera + + + + Move to parent + + + + %1 objects, %2 hide by filter + + + + + TexturesEditor + + Search pathes: + + + + Add + + + + Delete + + + + Clear + + + + Used files: + + + + 0 + + + + Reload + + + + Missed files: + + + + Select search path + + + + + ViewEditor + + Draw mode: + + + + Point + + + + Wireframe + + + + Solid + + + + Gamma: + + + + Env HDR: + + + + Camera light + + + + Service mode + + + + FXAA + + + + Auto exposure + + + + VSync + + + + Soft shadows + + + + Soft shadow samples: + + + + Soft shadow quality: + + + + Camera + + + + Orbit + + + + FOV: + + + + Depth start: + + + + Halos + + + + Hover: + + + + Selection: + + + + Fog + + + + Density: + + + + Decay: + + + + Color: + + + + Map sizes + + + + Textures: + + + + Shadows: + + + + diff --git a/src/widgets/lang/qglengine_widgets_ru.ts b/src/widgets/lang/qglengine_widgets_ru.ts new file mode 100644 index 0000000..54852b7 --- /dev/null +++ b/src/widgets/lang/qglengine_widgets_ru.ts @@ -0,0 +1,655 @@ + + + + + MaterialEditor + + Glass + + + + Transparency + Прозрачность + + + Reflectivity + Отражение + + + IOF + + + + Dispersion + + + + Reflection map + Карта отражения + + + Front: + + + + Back: + + + + Left: + + + + Right: + + + + Top: + + + + Bottom: + + + + X + + + + ^ + + + + load from directory + + + + Diffuse + Альбедо + + + Normal + Нормали + + + Metalness + Металичность + + + Roughness + Шероховатость + + + Emission + Самосвечение + + + Relief + Рельеф + + + + MaterialMapEditor + + title: + + + + Map + Текстура + + + Amount: + Множитель: + + + Offset: + Смещение: + + + Scale X: + Масштаб X: + + + Scale Y: + Масштаб Y: + + + Invert R + Обратить R + + + Invert G + Обратить G + + + Invert B + Обратить B + + + + MaterialsEditor + + Unset + Сбросить + + + Assign + Назначить + + + Add + Добавить + + + Delete + Удалить + + + Rename ... + Переименовать ... + + + Clone + Клонировать + + + + ObjectEditor + + [No selected] + [Нет выделения] + + + Position + Положение + + + X: + + + + Y: + + + + Z: + + + + Rotation + Вращение + + + ° + + + + Scale + Масштаб + + + Texture + Текстура + + + SX: + + + + R: + + + + SY: + + + + Receive shadows + Принимать тени + + + Cast shadows + Создавать тени + + + Accept fog + Принимать туман + + + Visible + Видимость + + + Accept light + Принимать освещение + + + Color: + Цвет: + + + Aim distance: + Расстояние прицела: + + + Light + Светильник + + + Type: + Тип: + + + Omni + Точечный + + + Cone + Конический + + + Directional + Направленый + + + Intensity: + Интенсивность: + + + Decay ^0: + Затухание ^0: + + + Decay ^1: + Затухание ^1: + + + Decay ^2: + Затухание ^2: + + + Size: + Размер: + + + Angle: + Угол: + + + - + + + + Camera + Камера + + + Depth start: + Начало глубины: + + + FOV: + + + + Roll: + Наклон: + + + Mirror Y + Отразить Y + + + Mirror X + Отразить X + + + Map + Текстура + + + [%1 objects] + [%1 объектов] + + + + PrimitiveEditor + + Form + + + + Width: + Ширина: + + + Length: + Длина: + + + Height + Высота: + + + Segments W: + Сегментов Ш: + + + Segments L: + Сегментов Д: + + + Segments H: + Сегментов В: + + + Radius 1: + Радиус 1: + + + Radius 2: + Радиус 2: + + + Angle: + Угол: + + + ° + + + + Segments: + Сегментов: + + + Segments 2: + Сегментов 2: + + + Color: + Цвет: + + + Flip normals + Обратить нормали + + + Add + Добавить + + + Height: + Высота: + + + + PropertyEditor + + Property + Свойство + + + Value + Значение + + + + SceneTree + + Filter: + Поиск: + + + Expand tree + Развернуть дерево + + + Collapse tree + Свернуть дерево + + + Name + Имя + + + Vis + Вид + + + Material + Материал + + + Focus + Фокус + + + Remove + Удалить + + + Clone + Клонировать + + + Group + Группировать + + + Select parent + Выбрать родителя + + + Select by mesh + Выбрать по геометрии + + + Select by material + Выбрать по материалу + + + Add node + Добавить узел + + + Add light + Добавить светильник + + + Add camera + Добавить камеру + + + Nodes + Узлы + + + Meshes + Геометрии + + + Lights + Светильники + + + Cameras + Камеры + + + Transfer transform to children + Перенести преобразования на детей + + + Active camera + Активировать камеру + + + Default camera + Камера по умолчанию + + + Move to parent + Перенести к родителю + + + %1 objects, %2 hide by filter + %1 объектов, %2 скрыто поиском + + + + TexturesEditor + + Search pathes: + Пути поиска: + + + Add + Добавить + + + Delete + Удалить + + + Clear + Очистить + + + Used files: + Используемые файлы: + + + 0 + + + + Reload + Перезагрузить + + + Missed files: + Не найдено файлов: + + + Select search path + Выбор пути поиска + + + + ViewEditor + + Draw mode: + Режим отрисовки: + + + Point + Точки + + + Wireframe + Линии + + + Solid + Сплошной + + + Gamma: + Гамма: + + + Env HDR: + + + + Camera light + Камерный свет + + + Service mode + Служебный режим + + + FXAA + + + + Auto exposure + Автоэкспозиция + + + VSync + + + + Soft shadows + Мягкие тени + + + Soft shadow samples: + Мягкие тени, точек: + + + Soft shadow quality: + Мягкие тени, качество: + + + Camera + Камера + + + Orbit + Обращение + + + FOV: + + + + Depth start: + Начало глубины: + + + Halos + Свечения + + + Hover: + Наведение: + + + Selection: + Выделение: + + + Fog + Туман + + + Density: + Плотность: + + + Decay: + Затухание: + + + Color: + Цвет: + + + Map sizes + Размер карт + + + Textures: + Текстуры: + + + Shadows: + Тени: + + + diff --git a/src/widgets/lang/update.bat b/src/widgets/lang/update.bat new file mode 100644 index 0000000..b7a61c2 --- /dev/null +++ b/src/widgets/lang/update.bat @@ -0,0 +1,2 @@ +lupdate ../ -ts qglengine_widgets_ru.ts +lupdate ../ -ts qglengine_widgets_en.ts diff --git a/src/widgets/object_editor.cpp b/src/widgets/object_editor.cpp index 1e8da24..053653c 100644 --- a/src/widgets/object_editor.cpp +++ b/src/widgets/object_editor.cpp @@ -95,14 +95,19 @@ void ObjectEditor::selectionChanged() { ignore_next = false; return; } - ui->scrollArea->setEnabled(false); - if (!view) return; + if (!view) { + ui->scrollArea->setEnabled(false); + return; + } ObjectBaseList sol = view->selectedObjects(true); if (sol.isEmpty()) { ui->labelTitle->setText(tr("[No selected]")); + ui->scrollArea->setEnabled(false); return; } ui->scrollArea->setEnabled(true); + if (prev_sol == sol) return; + prev_sol = sol; if (sol.size() == 1) { setObject(sol[0]); ui->scrollArea->verticalScrollBar()->setValue(vpos); diff --git a/src/widgets/object_editor.h b/src/widgets/object_editor.h index 19aa747..376477d 100644 --- a/src/widgets/object_editor.h +++ b/src/widgets/object_editor.h @@ -41,6 +41,7 @@ protected: Ui::ObjectEditor * ui; QGLView * view; + ObjectBaseList prev_sol; bool active, ignore_next; private slots: diff --git a/src/widgets/primitiveeditor.ui b/src/widgets/primitiveeditor.ui index fa0bbb1..0c1d68f 100644 --- a/src/widgets/primitiveeditor.ui +++ b/src/widgets/primitiveeditor.ui @@ -120,7 +120,7 @@ - Height + Height: diff --git a/src/widgets/scene_tree.cpp b/src/widgets/scene_tree.cpp index 99f59f0..f5843e0 100644 --- a/src/widgets/scene_tree.cpp +++ b/src/widgets/scene_tree.cpp @@ -109,8 +109,9 @@ QList SceneTree::actionsAdd() { QList SceneTree::actionsSelection() { QList ret; ret << ui->actionFocus << newSeparator() << ui->actionGroup << ui->actionClone << newSeparator() << ui->actionSelect_parent - << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator() << ui->actionTransfer_transform_to_children - << newSeparator() << ui->actionActive_camera << ui->actionDefault_camera << newSeparator() << ui->actionRemove; + << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator() << ui->actionMove_to_parent + << ui->actionTransfer_transform_to_children << newSeparator() << ui->actionActive_camera << ui->actionDefault_camera + << newSeparator() << ui->actionRemove; return ret; } @@ -194,6 +195,19 @@ ObjectBase * SceneTree::itemObject(QTreeWidgetItem * item) const { } +ObjectBase * SceneTree::insertTarget() const { + auto sil = ui->treeObjects->selectedItems(); + QSet parents; + for (auto * i: sil) { + auto * p = itemObject(i); + if (p) p = p->parent(); + if (p) parents << p; + } + if (parents.size() != 1) return nullptr; + return parents.values()[0]; +} + + int SceneTree::itemType(QTreeWidgetItem * item) const { if (!item) return otNode; return item->data(cName, irType).toInt(); @@ -291,6 +305,7 @@ void SceneTree::checkActions() { ui->actionClone->setEnabled(has_1); ui->actionGroup->setEnabled(has_m); ui->actionTransfer_transform_to_children->setEnabled(has_1); + ui->actionMove_to_parent->setEnabled(has_1); ui->actionSelect_parent->setEnabled(has_1); ui->actionSelect_by_mesh->setEnabled(has_mesh); ui->actionSelect_by_material->setEnabled(has_mesh); @@ -378,7 +393,8 @@ void SceneTree::on_treeObjects_itemMoved(QTreeWidgetItem * item, QTreeWidgetItem void SceneTree::on_actionAdd_node_triggered() { if (!view) return; ObjectBase * no = new ObjectBase(); - view->scene()->addObject(no); + no->setName("node"); + view->scene()->addObject(no, insertTarget()); view->scene()->selectObject(no); } @@ -386,7 +402,8 @@ void SceneTree::on_actionAdd_node_triggered() { void SceneTree::on_actionAdd_light_triggered() { if (!view) return; ObjectBase * no = new Light(); - view->scene()->addObject(no); + no->setName("light"); + view->scene()->addObject(no, insertTarget()); view->scene()->selectObject(no); } @@ -394,7 +411,8 @@ void SceneTree::on_actionAdd_light_triggered() { void SceneTree::on_actionAdd_camera_triggered() { if (!view) return; ObjectBase * no = new Camera(); - view->scene()->addObject(no); + no->setName("camera"); + view->scene()->addObject(no, insertTarget()); view->scene()->selectObject(no); } @@ -434,6 +452,20 @@ void SceneTree::on_actionTransfer_transform_to_children_triggered() { } +void SceneTree::on_actionMove_to_parent_triggered() { + if (!view) return; + ObjectBaseList sol = view->scene()->selectedObjects(true); + foreach(ObjectBase * o, sol) { + auto * old_p = o->parent(); + if (!old_p) continue; + auto * new_p = old_p->parent(); + if (!new_p) continue; + old_p->removeChild(o); + new_p->addChild(o); + } +} + + void SceneTree::on_actionActive_camera_triggered() { if (!view) return; ObjectBase * o = view->scene()->selectedObject(); diff --git a/src/widgets/scene_tree.h b/src/widgets/scene_tree.h index 42f1d93..c792bb1 100644 --- a/src/widgets/scene_tree.h +++ b/src/widgets/scene_tree.h @@ -48,6 +48,7 @@ private: void restoreExpanded(QTreeWidgetItem * ti); void makeObjetTree(ObjectBase * o, QTreeWidgetItem * ti); ObjectBase * itemObject(QTreeWidgetItem * item) const; + ObjectBase * insertTarget() const; int itemType(QTreeWidgetItem * item) const; bool filterTree(QTreeWidgetItem * ti, const QString & filter, int types); void checkActions(); @@ -74,6 +75,7 @@ private slots: void on_actionClone_triggered(); void on_actionGroup_triggered(); void on_actionTransfer_transform_to_children_triggered(); + void on_actionMove_to_parent_triggered(); void on_actionActive_camera_triggered(); void on_actionDefault_camera_triggered(); diff --git a/src/widgets/scene_tree.ui b/src/widgets/scene_tree.ui index 162aba3..238752a 100644 --- a/src/widgets/scene_tree.ui +++ b/src/widgets/scene_tree.ui @@ -107,6 +107,9 @@ false + + 250 + Name @@ -127,7 +130,7 @@ - + :/icons/type-camera.png:/icons/type-camera.png @@ -172,7 +175,7 @@ - + :/icons/type-geo.png:/icons/type-geo.png @@ -232,7 +235,7 @@ true - + :/icons/type-geo.png:/icons/type-geo.png @@ -244,7 +247,7 @@ true - + :/icons/type-light.png:/icons/type-light.png @@ -256,7 +259,7 @@ true - + :/icons/type-camera.png:/icons/type-camera.png @@ -270,7 +273,7 @@ - + :/icons/type-camera.png:/icons/type-camera.png @@ -279,13 +282,22 @@ - + :/icons/type-camera.png:/icons/type-camera.png Default camera + + + + :/icons/go-up.png:/icons/go-up.png + + + Move to parent + + @@ -301,6 +313,9 @@ + + +