Compare commits
20 Commits
master
...
developeme
Author | SHA1 | Date |
---|---|---|
Anakin | 54b87b5de7 | |
Anakin | 68387fe7a7 | |
Anakin | 44732057b6 | |
Maxim Stewart | 2d34492517 | |
Maxim Stewart | 3f2713bd16 | |
Maxim Stewart | c2f7118ed6 | |
Maxim Stewart | c6d82f5f55 | |
Anakin | 33fafb29a8 | |
Maxim Stewart | 6141263f45 | |
Maxim Stewart | e59dd980bd | |
Maxim Stewart | 1e71ebed47 | |
Maxim Stewart | d908894265 | |
Maxim Stewart | bddc7ea852 | |
Maxim Stewart | 0372a4ad8c | |
Maxim Stewart | e768ae9af8 | |
Maxim Stewart | b089fcdaf6 | |
Maxim Stewart | cdda1922fa | |
Maxim Stewart | 031c620f52 | |
Maxim Stewart | 7a41f2d9bf | |
Maxim Stewart | b2efa83e17 |
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>600</width>
|
<width>800</width>
|
||||||
<height>400</height>
|
<height>600</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
|
@ -38,8 +38,11 @@
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="floating">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<property name="features">
|
<property name="features">
|
||||||
<set>QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable</set>
|
<set>QDockWidget::DockWidgetFloatable</set>
|
||||||
</property>
|
</property>
|
||||||
<property name="allowedAreas">
|
<property name="allowedAreas">
|
||||||
<set>Qt::RightDockWidgetArea</set>
|
<set>Qt::RightDockWidgetArea</set>
|
||||||
|
@ -68,42 +71,31 @@
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTreeWidget" name="treeWidget">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<property name="showDropIndicator" stdset="0">
|
<item>
|
||||||
<bool>false</bool>
|
<widget class="QComboBox" name="dirDropDownList">
|
||||||
</property>
|
<property name="focusPolicy">
|
||||||
<property name="dragEnabled">
|
<enum>Qt::ClickFocus</enum>
|
||||||
<bool>true</bool>
|
</property>
|
||||||
</property>
|
</widget>
|
||||||
<property name="dragDropMode">
|
</item>
|
||||||
<enum>QAbstractItemView::DragOnly</enum>
|
<item>
|
||||||
</property>
|
<widget class="QTreeWidget" name="fileTreeWidget">
|
||||||
<property name="selectionBehavior">
|
<property name="autoExpandDelay">
|
||||||
<enum>QAbstractItemView::SelectItems</enum>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="verticalScrollMode">
|
<property name="headerHidden">
|
||||||
<enum>QAbstractItemView::ScrollPerPixel</enum>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="headerHidden">
|
</widget>
|
||||||
<bool>true</bool>
|
</item>
|
||||||
</property>
|
</layout>
|
||||||
<property name="expandsOnDoubleClick">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string notr="true">1</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<resources>
|
<resources/>
|
||||||
<include location="../Resources/Resources.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>400</width>
|
<width>584</width>
|
||||||
<height>358</height>
|
<height>645</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -290,77 +290,15 @@
|
||||||
<string>Light</string>
|
<string>Light</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
<item row="1" column="1">
|
<item row="2" column="0" colspan="4">
|
||||||
<widget class="QSpinBox" name="light_R_SB">
|
<widget class="QLabel" name="labelAmbCoeff">
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="buttonSymbols">
|
|
||||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>255</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="3">
|
|
||||||
<widget class="QLabel" name="label_7">
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>G:</string>
|
<string>Ambientcoefficient:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0" colspan="4">
|
<item row="1" column="5">
|
||||||
<widget class="QLabel" name="labelAttFac">
|
<widget class="QSlider" name="light_G_S">
|
||||||
<property name="text">
|
|
||||||
<string>Attenuationfactor:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="4">
|
|
||||||
<widget class="QSpinBox" name="light_G_SB">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="buttonSymbols">
|
|
||||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>255</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="6">
|
|
||||||
<widget class="QLabel" name="label_8">
|
|
||||||
<property name="text">
|
|
||||||
<string>B:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="7">
|
|
||||||
<widget class="QSpinBox" name="light_B_SB">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>30</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="buttonSymbols">
|
|
||||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>255</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QSlider" name="light_R_S">
|
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>255</number>
|
<number>255</number>
|
||||||
</property>
|
</property>
|
||||||
|
@ -372,55 +310,6 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="8">
|
|
||||||
<widget class="QSlider" name="light_B_S">
|
|
||||||
<property name="maximum">
|
|
||||||
<number>255</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>255</number>
|
|
||||||
</property>
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_6">
|
|
||||||
<property name="text">
|
|
||||||
<string>R:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0" colspan="4">
|
|
||||||
<widget class="QRadioButton" name="radioDirectLight">
|
|
||||||
<property name="text">
|
|
||||||
<string>Directional light</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="4" colspan="2">
|
|
||||||
<widget class="QDoubleSpinBox" name="attFac">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>55</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="decimals">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<double>0.100000000000000</double>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="4" colspan="2">
|
<item row="2" column="4" colspan="2">
|
||||||
<widget class="QDoubleSpinBox" name="ambCoef">
|
<widget class="QDoubleSpinBox" name="ambCoef">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
|
@ -446,8 +335,44 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="5">
|
<item row="3" column="4" colspan="2">
|
||||||
<widget class="QSlider" name="light_G_S">
|
<widget class="QDoubleSpinBox" name="attFac">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>55</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>R:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0" colspan="4">
|
||||||
|
<widget class="QRadioButton" name="radioDirectLight">
|
||||||
|
<property name="text">
|
||||||
|
<string>Directional light</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="8">
|
||||||
|
<widget class="QSlider" name="light_B_S">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>255</number>
|
<number>255</number>
|
||||||
</property>
|
</property>
|
||||||
|
@ -459,17 +384,19 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" colspan="4">
|
<item row="1" column="1">
|
||||||
<widget class="QLabel" name="labelAmbCoeff">
|
<widget class="QSpinBox" name="light_R_SB">
|
||||||
<property name="text">
|
<property name="maximumSize">
|
||||||
<string>Ambientcoefficient:</string>
|
<size>
|
||||||
|
<width>30</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<property name="buttonSymbols">
|
||||||
</item>
|
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||||
<item row="0" column="7" colspan="2">
|
</property>
|
||||||
<widget class="QCheckBox" name="checkHeadlight">
|
<property name="maximum">
|
||||||
<property name="text">
|
<number>255</number>
|
||||||
<string>Headlight</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -480,6 +407,79 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QSlider" name="light_R_S">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>255</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>255</number>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="text">
|
||||||
|
<string>G:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QSpinBox" name="light_G_SB">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>30</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="buttonSymbols">
|
||||||
|
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>255</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="4">
|
||||||
|
<widget class="QLabel" name="labelAttFac">
|
||||||
|
<property name="text">
|
||||||
|
<string>Attenuationfactor:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="6">
|
||||||
|
<widget class="QLabel" name="label_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>B:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="7">
|
||||||
|
<widget class="QSpinBox" name="light_B_SB">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>30</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="buttonSymbols">
|
||||||
|
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>255</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="7" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="checkHeadlight">
|
||||||
|
<property name="text">
|
||||||
|
<string>Headlight</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -489,7 +489,21 @@
|
||||||
<string>General</string>
|
<string>General</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
|
<item row="0" column="3" colspan="3">
|
||||||
|
<widget class="QCheckBox" name="checkBackfaceCulling">
|
||||||
|
<property name="text">
|
||||||
|
<string>Backface Culling</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="1" column="3">
|
<item row="1" column="3">
|
||||||
|
<widget class="QLabel" name="labelZoomSpeed">
|
||||||
|
<property name="text">
|
||||||
|
<string>Zoom speed:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="6">
|
||||||
<spacer name="horizontalSpacer">
|
<spacer name="horizontalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
|
@ -502,14 +516,7 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="5">
|
||||||
<widget class="QLabel" name="labelZoomSpeed">
|
|
||||||
<property name="text">
|
|
||||||
<string>Zoom speed:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QSpinBox" name="spinZSpeed">
|
<widget class="QSpinBox" name="spinZSpeed">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string>%</string>
|
<string>%</string>
|
||||||
|
@ -525,29 +532,41 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1" colspan="2">
|
<item row="2" column="3" colspan="4">
|
||||||
<widget class="QCheckBox" name="checkBackfaceCulling">
|
<widget class="QLabel" name="label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Backface Culling</string>
|
<string>Directory Drop Down List:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="3" colspan="4">
|
||||||
|
<widget class="QListWidget" name="dirListWidget"/>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="3">
|
||||||
|
<widget class="QLabel" name="label_9">
|
||||||
|
<property name="text">
|
||||||
|
<string>*** "BF1_ModTools" Goes To "C:/BF1_ModTools/Assets/Shipped Worlds/"
|
||||||
|
"BF2_ModTools" Goes To "C:/BF2_ModTools/assets/Sides/"</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="5">
|
||||||
|
<widget class="QPushButton" name="removeItem">
|
||||||
|
<property name="text">
|
||||||
|
<string>--</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="4">
|
||||||
|
<widget class="QPushButton" name="addItem">
|
||||||
|
<property name="text">
|
||||||
|
<string>+</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
|
||||||
|
|
||||||
struct Material;
|
struct Material;
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
class MainWindow : public QMainWindow
|
||||||
|
@ -26,13 +25,14 @@ private:
|
||||||
int m_curSeverity;
|
int m_curSeverity;
|
||||||
|
|
||||||
FileInfoWindow* m_infoWindow;
|
FileInfoWindow* m_infoWindow;
|
||||||
|
QStringList m_filters;
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
private:
|
private:
|
||||||
void setupWidgets();
|
void setupWidgets();
|
||||||
void getAssetLibrary();
|
void updateAssetTree(QString);
|
||||||
void searchMeshFiles(QString path);
|
void openFileDialog();
|
||||||
void openFile();
|
void openFile(QString);
|
||||||
void takeScreenShot();
|
void takeScreenShot();
|
||||||
void aboutTool();
|
void aboutTool();
|
||||||
|
|
||||||
|
@ -44,6 +44,12 @@ public slots:
|
||||||
void printMessage(QString message, int severity);
|
void printMessage(QString message, int severity);
|
||||||
void setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
|
void setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
|
||||||
|
|
||||||
|
// private slots
|
||||||
|
private slots:
|
||||||
|
void setupAssetLibrary();
|
||||||
|
void on_fileTreeWidget_doubleClicked();
|
||||||
|
void on_dirDropDownList_currentTextChanged(const QString &arg1);
|
||||||
|
|
||||||
// signals
|
// signals
|
||||||
signals:
|
signals:
|
||||||
void loadFile(QString);
|
void loadFile(QString);
|
||||||
|
|
|
@ -22,19 +22,19 @@ public:
|
||||||
|
|
||||||
// attributes
|
// attributes
|
||||||
private:
|
private:
|
||||||
QFile file;
|
QFile m_file;
|
||||||
|
QStringList m_listOfDirs;
|
||||||
|
|
||||||
QVector3D m_bgColorOn = { 5, 5, 5 };
|
QVector3D m_bgColorOn = { 5, 5, 5 };
|
||||||
QVector3D m_bgColorOff = { 128, 204, 255 };
|
QVector3D m_bgColorOff = { 128, 204, 255 };
|
||||||
|
QVector3D m_lightColor = { 255,255,255 };
|
||||||
bool m_bfCulling = false;
|
bool m_bfCulling = false;
|
||||||
bool m_light = false;
|
bool m_light = false;
|
||||||
|
|
||||||
int m_lightType = 1; // 1 = direct, 2 = point
|
|
||||||
QVector3D m_lightColor = { 255,255,255 };
|
|
||||||
float m_attenuation = 0.0f;
|
|
||||||
float m_ambient = 0.005f;
|
|
||||||
bool m_headlight = false;
|
bool m_headlight = false;
|
||||||
bool m_autoColor = true;
|
bool m_autoColor = true;
|
||||||
|
float m_attenuation = 0.0f;
|
||||||
|
float m_ambient = 0.005f;
|
||||||
|
int m_lightType = 1; // 1 = direct, 2 = point
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
private:
|
private:
|
||||||
|
@ -47,6 +47,8 @@ public:
|
||||||
bool isBfCulling() const;
|
bool isBfCulling() const;
|
||||||
bool isLight() const;
|
bool isLight() const;
|
||||||
|
|
||||||
|
QStringList getListOfDirs();
|
||||||
|
|
||||||
int getLightType() const;
|
int getLightType() const;
|
||||||
QVector3D getLightColor() const;
|
QVector3D getLightColor() const;
|
||||||
float getAttenuation() const;
|
float getAttenuation() const;
|
||||||
|
@ -69,4 +71,9 @@ public:
|
||||||
void setHeadlight(bool value);
|
void setHeadlight(bool value);
|
||||||
void setAutoColor(int value);
|
void setAutoColor(int value);
|
||||||
|
|
||||||
|
void updateDirectories(QString path);
|
||||||
|
|
||||||
|
// signals
|
||||||
|
signals:
|
||||||
|
void dirsChanged();
|
||||||
};
|
};
|
|
@ -24,6 +24,9 @@ private slots:
|
||||||
void backgroundColorOnChanged();
|
void backgroundColorOnChanged();
|
||||||
void lightColorChanged();
|
void lightColorChanged();
|
||||||
|
|
||||||
|
void on_addItem_clicked();
|
||||||
|
void on_removeItem_clicked();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void updateBGColorOff(QVector3D value);
|
void updateBGColorOff(QVector3D value);
|
||||||
void updateBGColorOn(QVector3D value);
|
void updateBGColorOn(QVector3D value);
|
||||||
|
@ -34,5 +37,6 @@ signals:
|
||||||
void sendBackfaceCulling(bool value);
|
void sendBackfaceCulling(bool value);
|
||||||
void sendZommSpeed(int percent);
|
void sendZommSpeed(int percent);
|
||||||
void changeLightType(int value);
|
void changeLightType(int value);
|
||||||
|
void pathChanged(QString path);
|
||||||
|
|
||||||
};
|
};
|
|
@ -2,6 +2,7 @@
|
||||||
#include "..\Header\OglViewerWidget.h"
|
#include "..\Header\OglViewerWidget.h"
|
||||||
#include "..\Header\FileInterface.h"
|
#include "..\Header\FileInterface.h"
|
||||||
#include "..\Header\OutputDevice.h"
|
#include "..\Header\OutputDevice.h"
|
||||||
|
#include "..\Header\SettingsManager.h"
|
||||||
#include <QSurfaceFormat>
|
#include <QSurfaceFormat>
|
||||||
#include <QSignalMapper>
|
#include <QSignalMapper>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
|
@ -10,6 +11,9 @@
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QPalette>
|
#include <QPalette>
|
||||||
#include <QResizeEvent>
|
#include <QResizeEvent>
|
||||||
|
#include <QDirIterator>
|
||||||
|
#include <QFileInfo>
|
||||||
|
|
||||||
|
|
||||||
#define WINDOW_NAME "Mesh Viewer"
|
#define WINDOW_NAME "Mesh Viewer"
|
||||||
|
|
||||||
|
@ -41,6 +45,9 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
// set default text to file info
|
// set default text to file info
|
||||||
m_fileInfo = "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
|
m_fileInfo = "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
|
||||||
|
|
||||||
|
ui->dirDropDownList->addItem("BF1_ModTools", "C:/BF1_ModTools/Assets/Shipped Worlds/");
|
||||||
|
ui->dirDropDownList->addItem("BF2_ModTools", "C:/BF2_ModTools/assets/Sides/");
|
||||||
|
|
||||||
// add widgets to the window
|
// add widgets to the window
|
||||||
setupWidgets();
|
setupWidgets();
|
||||||
|
|
||||||
|
@ -49,7 +56,9 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
styleSheet.open(QIODevice::ReadOnly);
|
styleSheet.open(QIODevice::ReadOnly);
|
||||||
this->setStyleSheet(styleSheet.readAll());
|
this->setStyleSheet(styleSheet.readAll());
|
||||||
|
|
||||||
getAssetLibrary();
|
// setup dropdown
|
||||||
|
setupAssetLibrary();
|
||||||
|
connect(SettingsManager::getInstance(), &SettingsManager::dirsChanged, this, &MainWindow::setupAssetLibrary);
|
||||||
|
|
||||||
printMessage("MeshViewer by Anakin", 0);
|
printMessage("MeshViewer by Anakin", 0);
|
||||||
}
|
}
|
||||||
|
@ -61,10 +70,8 @@ MainWindow::~MainWindow()
|
||||||
delete m_infoWindow;
|
delete m_infoWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// functions
|
// functions
|
||||||
|
|
||||||
void MainWindow::setupWidgets()
|
void MainWindow::setupWidgets()
|
||||||
{
|
{
|
||||||
// Ogl Viewer
|
// Ogl Viewer
|
||||||
|
@ -73,11 +80,11 @@ void MainWindow::setupWidgets()
|
||||||
connect(this, &MainWindow::loadFile, viewer, &OglViewerWidget::loadFile);
|
connect(this, &MainWindow::loadFile, viewer, &OglViewerWidget::loadFile);
|
||||||
|
|
||||||
// open file
|
// open file
|
||||||
QToolButton *openFile = new QToolButton(this);
|
QToolButton *openFileDialog = new QToolButton(this);
|
||||||
openFile->setObjectName("openFile");
|
openFileDialog->setObjectName("openFile");
|
||||||
openFile->setToolTip("open file");
|
openFileDialog->setToolTip("open file");
|
||||||
connect(openFile, &QToolButton::pressed, this, &MainWindow::openFile);
|
connect(openFileDialog, &QToolButton::pressed, this, &MainWindow::openFileDialog);
|
||||||
ui->mainToolBar->addWidget(openFile);
|
ui->mainToolBar->addWidget(openFileDialog);
|
||||||
|
|
||||||
// screenshot
|
// screenshot
|
||||||
QToolButton *screenshot = new QToolButton(this);
|
QToolButton *screenshot = new QToolButton(this);
|
||||||
|
@ -160,39 +167,31 @@ void MainWindow::setupWidgets()
|
||||||
m_output->setAlignment(Qt::AlignTop);
|
m_output->setAlignment(Qt::AlignTop);
|
||||||
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
|
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
|
||||||
m_output->raise();
|
m_output->raise();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::getAssetLibrary()
|
void MainWindow::updateAssetTree(QString path)
|
||||||
{
|
{
|
||||||
QTreeWidgetItem* item = new QTreeWidgetItem;
|
|
||||||
item->setData(0, Qt::DisplayRole, "Wuhu");
|
|
||||||
ui->treeWidget->addTopLevelItem(item);
|
|
||||||
|
|
||||||
searchMeshFiles("D:/workspaces/Visual Studio 2015/Projects/OpenGL/Release");
|
ui->fileTreeWidget->clear();
|
||||||
|
QDirIterator itterator(path, QStringList() << "*.msh" << "*.MSH" << "*.mesh" << "*.MESH",
|
||||||
|
QDir::Files, QDirIterator::Subdirectories);
|
||||||
|
|
||||||
|
while (itterator.hasNext()) {
|
||||||
|
QTreeWidgetItem* sub = new QTreeWidgetItem(ui->fileTreeWidget);
|
||||||
|
sub->setData(0, Qt::DisplayRole, itterator.fileName());
|
||||||
|
sub->setData(1, Qt::DisplayRole, itterator.fileInfo().absoluteFilePath());
|
||||||
|
itterator.next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::searchMeshFiles(QString path)
|
void MainWindow::openFileDialog()
|
||||||
{
|
|
||||||
QDir directory(path);
|
|
||||||
directory.setNameFilters(QStringList("*.msh"));
|
|
||||||
|
|
||||||
QStringList childDirectories = directory.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
|
|
||||||
|
|
||||||
QStringList fileNames = directory.entryList(QDir::Files);
|
|
||||||
|
|
||||||
for (auto &it : childDirectories)
|
|
||||||
qDebug() << it;
|
|
||||||
|
|
||||||
for (auto &it : fileNames)
|
|
||||||
qDebug() << it;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::openFile()
|
|
||||||
{
|
{
|
||||||
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
|
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
|
||||||
|
openFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::openFile(QString fileName)
|
||||||
|
{
|
||||||
if(!fileName.isEmpty())
|
if(!fileName.isEmpty())
|
||||||
emit loadFile(fileName);
|
emit loadFile(fileName);
|
||||||
}
|
}
|
||||||
|
@ -234,6 +233,35 @@ void MainWindow::resizeEvent(QResizeEvent * e)
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// slots
|
// slots
|
||||||
|
|
||||||
|
void MainWindow::setupAssetLibrary()
|
||||||
|
{
|
||||||
|
// get all directories and put them in the dropdown.
|
||||||
|
while (ui->dirDropDownList->count() != 0)
|
||||||
|
ui->dirDropDownList->removeItem(0);
|
||||||
|
|
||||||
|
QStringList tmp_list = SettingsManager::getInstance()->getListOfDirs();
|
||||||
|
for (QString &it : tmp_list)
|
||||||
|
ui->dirDropDownList->addItem(it, it);
|
||||||
|
|
||||||
|
// choose the current path and display it.
|
||||||
|
if (ui->dirDropDownList->currentData().isValid())
|
||||||
|
updateAssetTree(ui->dirDropDownList->currentData().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_fileTreeWidget_doubleClicked()
|
||||||
|
{
|
||||||
|
QString clickedFile = ui->fileTreeWidget->currentItem()->text(1);
|
||||||
|
openFile(clickedFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_dirDropDownList_currentTextChanged(const QString &arg1)
|
||||||
|
{
|
||||||
|
QString selectedDir;
|
||||||
|
selectedDir = ui->dirDropDownList->itemData(ui->dirDropDownList->currentIndex()).toString();
|
||||||
|
printMessage(arg1 + " : " + selectedDir, 0);
|
||||||
|
updateAssetTree(selectedDir);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::printMessage(QString message, int severity)
|
void MainWindow::printMessage(QString message, int severity)
|
||||||
{
|
{
|
||||||
if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
|
if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "..\Header\SettingsManager.h"
|
#include "..\Header\SettingsManager.h"
|
||||||
|
#include "qdebug.h"
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -7,7 +8,7 @@
|
||||||
SettingsManager::SettingsManager(QObject *parent)
|
SettingsManager::SettingsManager(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
{
|
{
|
||||||
file.setFileName("meshviewer.config");
|
m_file.setFileName("meshviewer.config");
|
||||||
readFromFile();
|
readFromFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,10 +29,10 @@ SettingsManager* SettingsManager::getInstance(QObject *parent)
|
||||||
|
|
||||||
void SettingsManager::readFromFile()
|
void SettingsManager::readFromFile()
|
||||||
{
|
{
|
||||||
if (file.open(QIODevice::ReadOnly))
|
if (m_file.open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
|
|
||||||
QByteArray stream = file.readAll();
|
QByteArray stream = m_file.readAll();
|
||||||
QList<QByteArray> lines = stream.split('\n');
|
QList<QByteArray> lines = stream.split('\n');
|
||||||
|
|
||||||
for (auto& it : lines)
|
for (auto& it : lines)
|
||||||
|
@ -85,34 +86,45 @@ void SettingsManager::readFromFile()
|
||||||
{
|
{
|
||||||
m_ambient = it.right(it.size() - it.indexOf('>') - 1).toFloat();
|
m_ambient = it.right(it.size() - it.indexOf('>') - 1).toFloat();
|
||||||
}
|
}
|
||||||
|
else if (it.startsWith("<qkList>"))
|
||||||
|
{
|
||||||
|
m_listOfDirs = QString(it.right(it.size() - it.indexOf('>') - 1)).split(";");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
file.close();
|
m_file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsManager::writeToFile()
|
void SettingsManager::writeToFile()
|
||||||
{
|
{
|
||||||
file.open(QIODevice::WriteOnly);
|
m_file.open(QIODevice::WriteOnly);
|
||||||
|
|
||||||
file.write(QString("<bgOn>%1;%2;%3\n").arg(m_bgColorOn.x()).arg(m_bgColorOn.y()).arg(m_bgColorOn.z()).toUtf8());
|
m_file.write(QString("<bgOn>%1;%2;%3\n").arg(m_bgColorOn.x()).arg(m_bgColorOn.y()).arg(m_bgColorOn.z()).toUtf8());
|
||||||
file.write(QString("<bgOff>%1;%2;%3\n").arg(m_bgColorOff.x()).arg(m_bgColorOff.y()).arg(m_bgColorOff.z()).toUtf8());
|
m_file.write(QString("<bgOff>%1;%2;%3\n").arg(m_bgColorOff.x()).arg(m_bgColorOff.y()).arg(m_bgColorOff.z()).toUtf8());
|
||||||
file.write(QString("<liCo>%1;%2;%3\n").arg(m_lightColor.x()).arg(m_lightColor.y()).arg(m_lightColor.z()).toUtf8());
|
m_file.write(QString("<liCo>%1;%2;%3\n").arg(m_lightColor.x()).arg(m_lightColor.y()).arg(m_lightColor.z()).toUtf8());
|
||||||
|
|
||||||
file.write(QString("<bfCul>%1\n").arg(m_bfCulling).toUtf8());
|
m_file.write(QString("<bfCul>%1\n").arg(m_bfCulling).toUtf8());
|
||||||
file.write(QString("<liOn>%1\n").arg(m_light).toUtf8());
|
m_file.write(QString("<liOn>%1\n").arg(m_light).toUtf8());
|
||||||
file.write(QString("<heLi>%1\n").arg(m_headlight).toUtf8());
|
m_file.write(QString("<heLi>%1\n").arg(m_headlight).toUtf8());
|
||||||
file.write(QString("<auCo>%1\n").arg(m_autoColor).toUtf8());
|
m_file.write(QString("<auCo>%1\n").arg(m_autoColor).toUtf8());
|
||||||
|
|
||||||
file.write(QString("<liTy>%1\n").arg(m_lightType).toUtf8());
|
m_file.write(QString("<liTy>%1\n").arg(m_lightType).toUtf8());
|
||||||
file.write(QString("<atFa>%1\n").arg(m_attenuation).toUtf8());
|
m_file.write(QString("<atFa>%1\n").arg(m_attenuation).toUtf8());
|
||||||
file.write(QString("<amCo>%1\n").arg(m_ambient).toUtf8());
|
m_file.write(QString("<amCo>%1\n").arg(m_ambient).toUtf8());
|
||||||
|
if(!m_listOfDirs.isEmpty())
|
||||||
|
m_file.write(QString("<qkList>%1\n").arg(m_listOfDirs.join(";")).toUtf8());
|
||||||
|
|
||||||
file.close();
|
m_file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
// getter ///////////////////////////////////////////////////////////////
|
// getter ///////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
QStringList SettingsManager::getListOfDirs()
|
||||||
|
{
|
||||||
|
return m_listOfDirs;
|
||||||
|
}
|
||||||
|
|
||||||
QVector3D SettingsManager::getBgColorOn() const
|
QVector3D SettingsManager::getBgColorOn() const
|
||||||
{
|
{
|
||||||
return m_bgColorOn;
|
return m_bgColorOn;
|
||||||
|
@ -220,3 +232,12 @@ void SettingsManager::setAutoColor(int value)
|
||||||
m_autoColor = true;
|
m_autoColor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SettingsManager::updateDirectories(QString path)
|
||||||
|
{
|
||||||
|
if (m_listOfDirs.contains(path))
|
||||||
|
m_listOfDirs.removeAll(path);
|
||||||
|
else
|
||||||
|
m_listOfDirs.append(path);
|
||||||
|
|
||||||
|
emit dirsChanged();
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "..\Header\SettingsWindow.h"
|
#include "..\Header\SettingsWindow.h"
|
||||||
#include "..\Header\SettingsManager.h"
|
#include "..\Header\SettingsManager.h"
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QListWidgetItem>
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// constructor/destructor
|
// constructor/destructor
|
||||||
|
@ -18,6 +19,11 @@ SettingsWindow::SettingsWindow(QWidget * parent)
|
||||||
// set default values
|
// set default values
|
||||||
SettingsManager* sm = SettingsManager::getInstance(this);
|
SettingsManager* sm = SettingsManager::getInstance(this);
|
||||||
|
|
||||||
|
// set dirList for passing to Main and then fill settings manager dir list window
|
||||||
|
QStringList tmp_directories = sm->getListOfDirs();
|
||||||
|
for (auto &it : tmp_directories)
|
||||||
|
ui->dirListWidget->insertItem(0, it);
|
||||||
|
|
||||||
ui->lightOff_R_SB->setValue((int)(sm->getBgColorOff()[0]));
|
ui->lightOff_R_SB->setValue((int)(sm->getBgColorOff()[0]));
|
||||||
ui->lightOff_G_SB->setValue((int)(sm->getBgColorOff()[1]));
|
ui->lightOff_G_SB->setValue((int)(sm->getBgColorOff()[1]));
|
||||||
ui->lightOff_B_SB->setValue((int)(sm->getBgColorOff()[2]));
|
ui->lightOff_B_SB->setValue((int)(sm->getBgColorOff()[2]));
|
||||||
|
@ -51,7 +57,7 @@ SettingsWindow::SettingsWindow(QWidget * parent)
|
||||||
connect(this, &SettingsWindow::sendBackfaceCulling, sm, &SettingsManager::setBfCulling);
|
connect(this, &SettingsWindow::sendBackfaceCulling, sm, &SettingsManager::setBfCulling);
|
||||||
connect(ui->checkAutoColor, &QCheckBox::stateChanged, sm, &SettingsManager::setAutoColor);
|
connect(ui->checkAutoColor, &QCheckBox::stateChanged, sm, &SettingsManager::setAutoColor);
|
||||||
connect(this, &SettingsWindow::changeLightType, sm, &SettingsManager::setLightType);
|
connect(this, &SettingsWindow::changeLightType, sm, &SettingsManager::setLightType);
|
||||||
|
connect(this, &SettingsWindow::pathChanged, sm, &SettingsManager::updateDirectories);
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsWindow::~SettingsWindow()
|
SettingsWindow::~SettingsWindow()
|
||||||
|
@ -181,3 +187,22 @@ void SettingsWindow::lightColorChanged()
|
||||||
ui->lightOn_B_S->setValue((int)(ui->light_B_S->value() / 50));
|
ui->lightOn_B_S->setValue((int)(ui->light_B_S->value() / 50));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SettingsWindow::on_addItem_clicked()
|
||||||
|
{
|
||||||
|
QString dirName = QFileDialog::getExistingDirectory(this, tr("Open Directory"), "/home",
|
||||||
|
QFileDialog::ShowDirsOnly |
|
||||||
|
QFileDialog::DontResolveSymlinks);
|
||||||
|
if (!SettingsManager::getInstance()->getListOfDirs().contains(dirName))
|
||||||
|
{
|
||||||
|
ui->dirListWidget->insertItem(0, dirName);
|
||||||
|
emit pathChanged(dirName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingsWindow::on_removeItem_clicked()
|
||||||
|
{
|
||||||
|
QListWidgetItem* tmp = ui->dirListWidget->takeItem(ui->dirListWidget->currentRow());
|
||||||
|
emit pathChanged(tmp->text());
|
||||||
|
delete tmp;
|
||||||
|
}
|
||||||
|
|
|
@ -1,12 +1,3 @@
|
||||||
|
|
||||||
https://git.rwth-aachen.de/carstenf/OpenGL
|
|
||||||
|
|
||||||
Pulled from here as backup of work that I did under the develop branch. I hope to come back to this and port to Python using this as a reference for logic and how-to.
|
|
||||||
|
|
||||||
Below is original README text.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# MshViewer
|
# MshViewer
|
||||||
|
|
||||||
I started to learn OpenGL. Therefore i decided to implement a .msh viewer for SWBFII assets, since the old one
|
I started to learn OpenGL. Therefore i decided to implement a .msh viewer for SWBFII assets, since the old one
|
||||||
|
|
Loading…
Reference in New Issue