mirror of
https://github.com/leozide/leocad
synced 2025-01-30 20:34:56 +01:00
Blender lights - view and control
This commit is contained in:
parent
07a268ed32
commit
3b9ea3ae79
9 changed files with 628 additions and 11 deletions
|
@ -648,6 +648,20 @@ const lcCommand gCommands[] =
|
||||||
QT_TRANSLATE_NOOP("Status", "Add new omni light sources to the model"),
|
QT_TRANSLATE_NOOP("Status", "Add new omni light sources to the model"),
|
||||||
""
|
""
|
||||||
},
|
},
|
||||||
|
// LC_EDIT_ACTION_AREALIGHT
|
||||||
|
{
|
||||||
|
QT_TRANSLATE_NOOP("Action", "Edit.Tool.Arealight"),
|
||||||
|
QT_TRANSLATE_NOOP("Menu", "Arealight"),
|
||||||
|
QT_TRANSLATE_NOOP("Status", "Add new arealight sources to the model - edit in Properties tab"),
|
||||||
|
""
|
||||||
|
},
|
||||||
|
// LC_EDIT_ACTION_SUNLIGHT
|
||||||
|
{
|
||||||
|
QT_TRANSLATE_NOOP("Action", "Edit.Tool.Sunlight"),
|
||||||
|
QT_TRANSLATE_NOOP("Menu", "Sunlight"),
|
||||||
|
QT_TRANSLATE_NOOP("Status", "Add new omnidirectional sunlight sources to the model - edit in Properties tab"),
|
||||||
|
""
|
||||||
|
},
|
||||||
// LC_EDIT_ACTION_SPOTLIGHT
|
// LC_EDIT_ACTION_SPOTLIGHT
|
||||||
{
|
{
|
||||||
QT_TRANSLATE_NOOP("Action", "Edit.Tool.Spotlight"),
|
QT_TRANSLATE_NOOP("Action", "Edit.Tool.Spotlight"),
|
||||||
|
@ -1860,6 +1874,8 @@ const char* gToolNames[] =
|
||||||
{
|
{
|
||||||
QT_TRANSLATE_NOOP("Mouse", "NewPiece"), // lcTool::Insert
|
QT_TRANSLATE_NOOP("Mouse", "NewPiece"), // lcTool::Insert
|
||||||
QT_TRANSLATE_NOOP("Mouse", "NewPointLight"), // lcTool::Light
|
QT_TRANSLATE_NOOP("Mouse", "NewPointLight"), // lcTool::Light
|
||||||
|
QT_TRANSLATE_NOOP("Mouse", "NewAreaLight"), // lcTool::AreaLight
|
||||||
|
QT_TRANSLATE_NOOP("Mouse", "NewSunLight"), // lcTool::SunLight
|
||||||
QT_TRANSLATE_NOOP("Mouse", "NewSpotLight"), // lcTool::SpotLight
|
QT_TRANSLATE_NOOP("Mouse", "NewSpotLight"), // lcTool::SpotLight
|
||||||
QT_TRANSLATE_NOOP("Mouse", "NewCamera"), // lcTool::Camera
|
QT_TRANSLATE_NOOP("Mouse", "NewCamera"), // lcTool::Camera
|
||||||
QT_TRANSLATE_NOOP("Mouse", "Select"), // lcTool::Select
|
QT_TRANSLATE_NOOP("Mouse", "Select"), // lcTool::Select
|
||||||
|
|
|
@ -99,6 +99,8 @@ enum lcCommandId
|
||||||
LC_EDIT_ACTION_FIRST,
|
LC_EDIT_ACTION_FIRST,
|
||||||
LC_EDIT_ACTION_INSERT = LC_EDIT_ACTION_FIRST,
|
LC_EDIT_ACTION_INSERT = LC_EDIT_ACTION_FIRST,
|
||||||
LC_EDIT_ACTION_LIGHT,
|
LC_EDIT_ACTION_LIGHT,
|
||||||
|
LC_EDIT_ACTION_AREALIGHT,
|
||||||
|
LC_EDIT_ACTION_SUNLIGHT,
|
||||||
LC_EDIT_ACTION_SPOTLIGHT,
|
LC_EDIT_ACTION_SPOTLIGHT,
|
||||||
LC_EDIT_ACTION_CAMERA,
|
LC_EDIT_ACTION_CAMERA,
|
||||||
LC_EDIT_ACTION_SELECT,
|
LC_EDIT_ACTION_SELECT,
|
||||||
|
@ -299,6 +301,8 @@ enum class lcTool
|
||||||
{
|
{
|
||||||
Insert,
|
Insert,
|
||||||
Light,
|
Light,
|
||||||
|
AreaLight,
|
||||||
|
SunLight,
|
||||||
SpotLight,
|
SpotLight,
|
||||||
Camera,
|
Camera,
|
||||||
Select,
|
Select,
|
||||||
|
|
|
@ -571,6 +571,15 @@ void lcModel::LoadLDraw(QIODevice& Device, Project* Project)
|
||||||
}
|
}
|
||||||
else if (Token == QLatin1String("LIGHT"))
|
else if (Token == QLatin1String("LIGHT"))
|
||||||
{
|
{
|
||||||
|
if (!Light)
|
||||||
|
Light = new lcLight(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
if (Light->ParseLDrawLine(LineStream))
|
||||||
|
{
|
||||||
|
Light->CreateName(mLights);
|
||||||
|
mLights.Add(Light);
|
||||||
|
Light = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (Token == QLatin1String("GROUP"))
|
else if (Token == QLatin1String("GROUP"))
|
||||||
{
|
{
|
||||||
|
@ -2949,6 +2958,15 @@ void lcModel::SetSelectedPiecesStepHide(lcStep Step)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcModel::UpdateLight(lcLight* Light, const lcLightProperties Props, int Property)
|
||||||
|
{
|
||||||
|
Light->UpdateLight(mCurrentStep, Props, Property);
|
||||||
|
|
||||||
|
SaveCheckpoint(tr("Update Light"));
|
||||||
|
UpdateAllViews();
|
||||||
|
gMainWindow->UpdateSelectedObjects(false);
|
||||||
|
}
|
||||||
|
|
||||||
void lcModel::SetCameraOrthographic(lcCamera* Camera, bool Ortho)
|
void lcModel::SetCameraOrthographic(lcCamera* Camera, bool Ortho)
|
||||||
{
|
{
|
||||||
if (Camera->IsOrtho() == Ortho)
|
if (Camera->IsOrtho() == Ortho)
|
||||||
|
@ -3011,6 +3029,19 @@ void lcModel::SetCameraName(lcCamera* Camera, const QString& Name)
|
||||||
gMainWindow->UpdateCameraMenu();
|
gMainWindow->UpdateCameraMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcModel::SetLightName(lcLight* Light, const QString &Name)
|
||||||
|
{
|
||||||
|
if (Light->GetName() == Name)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Light->SetName(Name);
|
||||||
|
|
||||||
|
SaveCheckpoint(tr("Renaming Light"));
|
||||||
|
gMainWindow->UpdateSelectedObjects(false);
|
||||||
|
UpdateAllViews();
|
||||||
|
gMainWindow->UpdateCameraMenu();
|
||||||
|
}
|
||||||
|
|
||||||
bool lcModel::AnyPiecesSelected() const
|
bool lcModel::AnyPiecesSelected() const
|
||||||
{
|
{
|
||||||
for (const lcPiece* Piece : mPieces)
|
for (const lcPiece* Piece : mPieces)
|
||||||
|
@ -3955,6 +3986,8 @@ void lcModel::EndMouseTool(lcTool Tool, bool Accept)
|
||||||
{
|
{
|
||||||
case lcTool::Insert:
|
case lcTool::Insert:
|
||||||
case lcTool::Light:
|
case lcTool::Light:
|
||||||
|
case lcTool::AreaLight:
|
||||||
|
case lcTool::SunLight:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case lcTool::SpotLight:
|
case lcTool::SpotLight:
|
||||||
|
@ -4034,17 +4067,20 @@ void lcModel::PointLightToolClicked(const lcVector3& Position)
|
||||||
SaveCheckpoint(tr("New Light"));
|
SaveCheckpoint(tr("New Light"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcModel::BeginSpotLightTool(const lcVector3& Position, const lcVector3& Target)
|
void lcModel::BeginDirectionalLightTool(const lcVector3& Position, const lcVector3& Target, int LightType)
|
||||||
{
|
{
|
||||||
lcLight* Light = new lcLight(Position[0], Position[1], Position[2], Target[0], Target[1], Target[2]);
|
lcLight* Light = new lcLight(Position[0], Position[1], Position[2], Target[0], Target[1], Target[2], LightType);
|
||||||
|
Light->CreateName(mLights);
|
||||||
mLights.Add(Light);
|
mLights.Add(Light);
|
||||||
|
|
||||||
mMouseToolDistance = Target;
|
mMouseToolDistance = Target;
|
||||||
|
|
||||||
ClearSelectionAndSetFocus(Light, LC_LIGHT_SECTION_TARGET, false);
|
ClearSelectionAndSetFocus(Light, LC_LIGHT_SECTION_TARGET, false);
|
||||||
|
QString light(LightType == LC_AREALIGHT ? "Arealight " : LightType == LC_SUNLIGHT ? "Sunlight " : "Spotlight ");
|
||||||
|
SaveCheckpoint(tr("%1").arg(light));
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcModel::UpdateSpotLightTool(const lcVector3& Position)
|
void lcModel::UpdateDirectionalLightTool(const lcVector3& Position)
|
||||||
{
|
{
|
||||||
lcLight* Light = mLights[mLights.GetSize() - 1];
|
lcLight* Light = mLights[mLights.GetSize() - 1];
|
||||||
|
|
||||||
|
|
|
@ -302,8 +302,9 @@ public:
|
||||||
void EndMouseTool(lcTool Tool, bool Accept);
|
void EndMouseTool(lcTool Tool, bool Accept);
|
||||||
void InsertPieceToolClicked(const lcMatrix44& WorldMatrix);
|
void InsertPieceToolClicked(const lcMatrix44& WorldMatrix);
|
||||||
void PointLightToolClicked(const lcVector3& Position);
|
void PointLightToolClicked(const lcVector3& Position);
|
||||||
|
void BeginDirectionalLightTool(const lcVector3& Position, const lcVector3& Target, int LightType);
|
||||||
|
void UpdateDirectionalLightTool(const lcVector3& Position);
|
||||||
void BeginSpotLightTool(const lcVector3& Position, const lcVector3& Target);
|
void BeginSpotLightTool(const lcVector3& Position, const lcVector3& Target);
|
||||||
void UpdateSpotLightTool(const lcVector3& Position);
|
|
||||||
void BeginCameraTool(const lcVector3& Position, const lcVector3& Target);
|
void BeginCameraTool(const lcVector3& Position, const lcVector3& Target);
|
||||||
void UpdateCameraTool(const lcVector3& Position);
|
void UpdateCameraTool(const lcVector3& Position);
|
||||||
void UpdateMoveTool(const lcVector3& Distance, bool AllowRelative, bool AlternateButtonDrag);
|
void UpdateMoveTool(const lcVector3& Distance, bool AllowRelative, bool AlternateButtonDrag);
|
||||||
|
@ -341,6 +342,8 @@ public:
|
||||||
void SetCameraZNear(lcCamera* Camera, float ZNear);
|
void SetCameraZNear(lcCamera* Camera, float ZNear);
|
||||||
void SetCameraZFar(lcCamera* Camera, float ZFar);
|
void SetCameraZFar(lcCamera* Camera, float ZFar);
|
||||||
void SetCameraName(lcCamera* Camera, const QString& Name);
|
void SetCameraName(lcCamera* Camera, const QString& Name);
|
||||||
|
void SetLightName(lcLight* Light, const QString& Name);
|
||||||
|
void UpdateLight(lcLight* Light, const lcLightProperties Props, int Property);
|
||||||
|
|
||||||
void ShowPropertiesDialog();
|
void ShowPropertiesDialog();
|
||||||
void ShowSelectByNameDialog();
|
void ShowSelectByNameDialog();
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "lc_viewwidget.h"
|
#include "lc_viewwidget.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "lc_mainwindow.h"
|
#include "lc_mainwindow.h"
|
||||||
|
#include "light.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "texfont.h"
|
#include "texfont.h"
|
||||||
#include "lc_texture.h"
|
#include "lc_texture.h"
|
||||||
|
@ -1596,6 +1597,8 @@ lcTrackTool lcView::GetOverrideTrackTool(Qt::MouseButton Button) const
|
||||||
{
|
{
|
||||||
lcTrackTool::Insert, // lcTool::Insert
|
lcTrackTool::Insert, // lcTool::Insert
|
||||||
lcTrackTool::PointLight, // lcTool::Light
|
lcTrackTool::PointLight, // lcTool::Light
|
||||||
|
lcTrackTool::AreaLight, // lcTool::AreaLight
|
||||||
|
lcTrackTool::SunLight, // lcTool::SunLight
|
||||||
lcTrackTool::SpotLight, // lcTool::SpotLight
|
lcTrackTool::SpotLight, // lcTool::SpotLight
|
||||||
lcTrackTool::Camera, // lcTool::Camera
|
lcTrackTool::Camera, // lcTool::Camera
|
||||||
lcTrackTool::Select, // lcTool::Select
|
lcTrackTool::Select, // lcTool::Select
|
||||||
|
@ -1867,6 +1870,8 @@ lcCursor lcView::GetCursor() const
|
||||||
lcCursor::Select, // lcTrackTool::None
|
lcCursor::Select, // lcTrackTool::None
|
||||||
lcCursor::Brick, // lcTrackTool::Insert
|
lcCursor::Brick, // lcTrackTool::Insert
|
||||||
lcCursor::Light, // lcTrackTool::PointLight
|
lcCursor::Light, // lcTrackTool::PointLight
|
||||||
|
lcCursor::Arealight, // lcTrackTool::AreaLight
|
||||||
|
lcCursor::Sunlight, // lcTrackTool::SunLight
|
||||||
lcCursor::Spotlight, // lcTrackTool::SpotLight
|
lcCursor::Spotlight, // lcTrackTool::SpotLight
|
||||||
lcCursor::Camera, // lcTrackTool::Camera
|
lcCursor::Camera, // lcTrackTool::Camera
|
||||||
lcCursor::Select, // lcTrackTool::Select
|
lcCursor::Select, // lcTrackTool::Select
|
||||||
|
@ -1921,6 +1926,8 @@ void lcView::SetCursor(lcCursor CursorType)
|
||||||
{ 0, 0, "" }, // lcCursor::Default
|
{ 0, 0, "" }, // lcCursor::Default
|
||||||
{ 8, 3, ":/resources/cursor_insert" }, // lcCursor::Brick
|
{ 8, 3, ":/resources/cursor_insert" }, // lcCursor::Brick
|
||||||
{ 15, 15, ":/resources/cursor_light" }, // lcCursor::Light
|
{ 15, 15, ":/resources/cursor_light" }, // lcCursor::Light
|
||||||
|
{ 15, 15, ":/resources/cursor_arealight" }, // lcCursor::Arealight
|
||||||
|
{ 15, 15, ":/resources/cursor_sunlight" }, // lcCursor::Sunlight
|
||||||
{ 7, 10, ":/resources/cursor_spotlight" }, // lcCursor::Spotlight
|
{ 7, 10, ":/resources/cursor_spotlight" }, // lcCursor::Spotlight
|
||||||
{ 15, 9, ":/resources/cursor_camera" }, // lcCursor::Camera
|
{ 15, 9, ":/resources/cursor_camera" }, // lcCursor::Camera
|
||||||
{ 0, 2, ":/resources/cursor_select" }, // lcCursor::Select
|
{ 0, 2, ":/resources/cursor_select" }, // lcCursor::Select
|
||||||
|
@ -1972,6 +1979,8 @@ lcTool lcView::GetCurrentTool() const
|
||||||
lcTool::Select, // lcTrackTool::None
|
lcTool::Select, // lcTrackTool::None
|
||||||
lcTool::Insert, // lcTrackTool::Insert
|
lcTool::Insert, // lcTrackTool::Insert
|
||||||
lcTool::Light, // lcTrackTool::PointLight
|
lcTool::Light, // lcTrackTool::PointLight
|
||||||
|
lcTool::AreaLight, // lcTrackTool::AreaLight
|
||||||
|
lcTool::SunLight, // lcTrackTool::SunLight
|
||||||
lcTool::SpotLight, // lcTrackTool::SpotLight
|
lcTool::SpotLight, // lcTrackTool::SpotLight
|
||||||
lcTool::Camera, // lcTrackTool::Camera
|
lcTool::Camera, // lcTrackTool::Camera
|
||||||
lcTool::Select, // lcTrackTool::Select
|
lcTool::Select, // lcTrackTool::Select
|
||||||
|
@ -2036,6 +2045,14 @@ void lcView::UpdateTrackTool()
|
||||||
NewTrackTool = lcTrackTool::PointLight;
|
NewTrackTool = lcTrackTool::PointLight;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case lcTool::AreaLight:
|
||||||
|
NewTrackTool = lcTrackTool::AreaLight;;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case lcTool::SunLight:
|
||||||
|
NewTrackTool = lcTrackTool::SunLight;
|
||||||
|
break;
|
||||||
|
|
||||||
case lcTool::SpotLight:
|
case lcTool::SpotLight:
|
||||||
NewTrackTool = lcTrackTool::SpotLight;
|
NewTrackTool = lcTrackTool::SpotLight;
|
||||||
break;
|
break;
|
||||||
|
@ -2261,11 +2278,14 @@ void lcView::StartTracking(lcTrackButton TrackButton)
|
||||||
case lcTool::Light:
|
case lcTool::Light:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case lcTool::AreaLight:
|
||||||
|
case lcTool::SunLight:
|
||||||
case lcTool::SpotLight:
|
case lcTool::SpotLight:
|
||||||
{
|
{
|
||||||
lcVector3 Position = GetCameraLightInsertPosition();
|
lcVector3 Position = GetCameraLightInsertPosition();
|
||||||
lcVector3 Target = Position + lcVector3(0.1f, 0.1f, 0.1f);
|
lcVector3 Target = Position + lcVector3(0.1f, 0.1f, 0.1f);
|
||||||
ActiveModel->BeginSpotLightTool(Position, Target);
|
int LightType = Tool == lcTool::AreaLight ? LC_AREALIGHT : Tool == lcTool::SunLight ? LC_SUNLIGHT : LC_SPOTLIGHT;
|
||||||
|
ActiveModel->BeginDirectionalLightTool(Position, Target, LightType);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2325,6 +2345,8 @@ void lcView::StopTracking(bool Accept)
|
||||||
case lcTool::Light:
|
case lcTool::Light:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case lcTool::AreaLight:
|
||||||
|
case lcTool::SunLight:
|
||||||
case lcTool::SpotLight:
|
case lcTool::SpotLight:
|
||||||
case lcTool::Camera:
|
case lcTool::Camera:
|
||||||
ActiveModel->EndMouseTool(Tool, Accept);
|
ActiveModel->EndMouseTool(Tool, Accept);
|
||||||
|
@ -2452,6 +2474,8 @@ void lcView::OnButtonDown(lcTrackButton TrackButton)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case lcTrackTool::AreaLight:
|
||||||
|
case lcTrackTool::SunLight:
|
||||||
case lcTrackTool::SpotLight:
|
case lcTrackTool::SpotLight:
|
||||||
case lcTrackTool::Camera:
|
case lcTrackTool::Camera:
|
||||||
StartTracking(TrackButton);
|
StartTracking(TrackButton);
|
||||||
|
@ -2689,8 +2713,10 @@ void lcView::OnMouseMove()
|
||||||
case lcTrackTool::PointLight:
|
case lcTrackTool::PointLight:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case lcTrackTool::AreaLight:
|
||||||
|
case lcTrackTool::SunLight:
|
||||||
case lcTrackTool::SpotLight:
|
case lcTrackTool::SpotLight:
|
||||||
ActiveModel->UpdateSpotLightTool(GetCameraLightInsertPosition());
|
ActiveModel->UpdateDirectionalLightTool(GetCameraLightInsertPosition());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case lcTrackTool::Camera:
|
case lcTrackTool::Camera:
|
||||||
|
|
|
@ -18,6 +18,8 @@ enum class lcCursor
|
||||||
Default,
|
Default,
|
||||||
Brick,
|
Brick,
|
||||||
Light,
|
Light,
|
||||||
|
Arealight,
|
||||||
|
Sunlight,
|
||||||
Spotlight,
|
Spotlight,
|
||||||
Camera,
|
Camera,
|
||||||
Select,
|
Select,
|
||||||
|
@ -51,6 +53,8 @@ enum class lcTrackTool
|
||||||
None,
|
None,
|
||||||
Insert,
|
Insert,
|
||||||
PointLight,
|
PointLight,
|
||||||
|
AreaLight,
|
||||||
|
SunLight,
|
||||||
SpotLight,
|
SpotLight,
|
||||||
Camera,
|
Camera,
|
||||||
Select,
|
Select,
|
||||||
|
|
|
@ -674,6 +674,8 @@ bool lcViewManipulator::IsTrackToolAllowed(lcTrackTool TrackTool, quint32 Allowe
|
||||||
case lcTrackTool::None:
|
case lcTrackTool::None:
|
||||||
case lcTrackTool::Insert:
|
case lcTrackTool::Insert:
|
||||||
case lcTrackTool::PointLight:
|
case lcTrackTool::PointLight:
|
||||||
|
case lcTrackTool::AreaLight:
|
||||||
|
case lcTrackTool::SunLight:
|
||||||
case lcTrackTool::SpotLight:
|
case lcTrackTool::SpotLight:
|
||||||
case lcTrackTool::Camera:
|
case lcTrackTool::Camera:
|
||||||
case lcTrackTool::Select:
|
case lcTrackTool::Select:
|
||||||
|
|
|
@ -160,7 +160,7 @@ void lcQPropertiesTreeDelegate::paint(QPainter *painter, const QStyleOptionViewI
|
||||||
QColor color = static_cast<QRgb>(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &opt));
|
QColor color = static_cast<QRgb>(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &opt));
|
||||||
painter->save();
|
painter->save();
|
||||||
painter->setPen(QPen(color));
|
painter->setPen(QPen(color));
|
||||||
|
|
||||||
if (!m_treeWidget || (!m_treeWidget->lastColumn(index.column()) && hasValue))
|
if (!m_treeWidget || (!m_treeWidget->lastColumn(index.column()) && hasValue))
|
||||||
{
|
{
|
||||||
int right = (option.direction == Qt::LeftToRight) ? option.rect.right() : option.rect.left();
|
int right = (option.direction == Qt::LeftToRight) ? option.rect.right() : option.rect.left();
|
||||||
|
@ -457,6 +457,31 @@ QWidget *lcQPropertiesTree::createEditor(QWidget *parent, QTreeWidgetItem *item)
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case PropertyFloatLightSpotSize:
|
||||||
|
{
|
||||||
|
QLineEdit *editor = new QLineEdit(parent);
|
||||||
|
float value = item->data(0, PropertyValueRole).toFloat();
|
||||||
|
|
||||||
|
editor->setValidator(new QDoubleValidator(1.0, 180.0,1, editor));
|
||||||
|
editor->setText(lcFormatValueLocalized(value));
|
||||||
|
editor->setToolTip(tr("Angle of the spotlight beam."));
|
||||||
|
|
||||||
|
connect(editor, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()));
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PropertyFloatReadOnly:
|
||||||
|
{
|
||||||
|
QLineEdit *editor = new QLineEdit(parent);
|
||||||
|
float value = item->data(0, PropertyValueRole).toFloat();
|
||||||
|
|
||||||
|
editor->setText(lcFormatValueLocalized(value));
|
||||||
|
editor->setReadOnly(true);
|
||||||
|
editor->setToolTip(tr("Property is read only"));
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
case PropertyStep:
|
case PropertyStep:
|
||||||
{
|
{
|
||||||
QLineEdit* Editor = new QLineEdit(parent);
|
QLineEdit* Editor = new QLineEdit(parent);
|
||||||
|
@ -495,6 +520,49 @@ QWidget *lcQPropertiesTree::createEditor(QWidget *parent, QTreeWidgetItem *item)
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case PropertyStringLightReadOnly:
|
||||||
|
{
|
||||||
|
QLineEdit *editor = new QLineEdit(parent);
|
||||||
|
const char *value = (const char*)item->data(0, PropertyValueRole).value<void*>();
|
||||||
|
|
||||||
|
editor->setText(value);
|
||||||
|
editor->setReadOnly(true);
|
||||||
|
editor->setToolTip(tr("Property is read only"));
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PropertyLightShape:
|
||||||
|
{
|
||||||
|
QComboBox *editor = new QComboBox(parent);
|
||||||
|
|
||||||
|
editor->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon);
|
||||||
|
editor->setMinimumContentsLength(1);
|
||||||
|
|
||||||
|
QStringList shapes = { "Square", "Disk", "Rectangle", "Ellipse"};
|
||||||
|
for (int i = 0; i < shapes.size(); i++)
|
||||||
|
editor->addItem(shapes.at(i), QVariant::fromValue(i));
|
||||||
|
|
||||||
|
int value = item->data(0, PropertyValueRole).toInt();
|
||||||
|
editor->setCurrentIndex(value);
|
||||||
|
|
||||||
|
connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSetValue(int)));
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PropertyLightColor:
|
||||||
|
{
|
||||||
|
QPushButton *editor = new QPushButton(parent);
|
||||||
|
QColor value = item->data(0, PropertyValueRole).value<QColor>();
|
||||||
|
|
||||||
|
updateLightColorEditor(editor, value);
|
||||||
|
|
||||||
|
connect(editor, SIGNAL(clicked()), this, SLOT(slotColorButtonClicked()));
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
case PropertyColor:
|
case PropertyColor:
|
||||||
{
|
{
|
||||||
QPushButton *editor = new QPushButton(parent);
|
QPushButton *editor = new QPushButton(parent);
|
||||||
|
@ -567,10 +635,28 @@ void lcQPropertiesTree::updateColorEditor(QPushButton *editor, int value) const
|
||||||
editor->setText(color->Name);
|
editor->setText(color->Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcQPropertiesTree::updateLightColorEditor(QPushButton *editor, QColor color) const
|
||||||
|
{
|
||||||
|
QImage img(12, 12, QImage::Format_ARGB32);
|
||||||
|
img.fill(0);
|
||||||
|
|
||||||
|
QPainter painter(&img);
|
||||||
|
painter.setCompositionMode(QPainter::CompositionMode_Source);
|
||||||
|
painter.setPen(Qt::darkGray);
|
||||||
|
painter.setBrush(color);
|
||||||
|
painter.drawRect(0, 0, img.width() - 1, img.height() - 1);
|
||||||
|
painter.end();
|
||||||
|
|
||||||
|
editor->setStyleSheet("Text-align:left");
|
||||||
|
editor->setIcon(QPixmap::fromImage(img));
|
||||||
|
editor->setText(color.name().toUpper());
|
||||||
|
}
|
||||||
|
|
||||||
void lcQPropertiesTree::slotToggled(bool Value)
|
void lcQPropertiesTree::slotToggled(bool Value)
|
||||||
{
|
{
|
||||||
QTreeWidgetItem* Item = m_delegate->editedItem();
|
QTreeWidgetItem* Item = m_delegate->editedItem();
|
||||||
lcModel* Model = gMainWindow->GetActiveModel();
|
lcModel* Model = gMainWindow->GetActiveModel();
|
||||||
|
lcObject* Focus = Model->GetFocusObject();
|
||||||
|
|
||||||
if (mWidgetMode == LC_PROPERTY_WIDGET_CAMERA)
|
if (mWidgetMode == LC_PROPERTY_WIDGET_CAMERA)
|
||||||
{
|
{
|
||||||
|
@ -586,6 +672,30 @@ void lcQPropertiesTree::slotToggled(bool Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (mWidgetMode == LC_PROPERTY_WIDGET_LIGHT)
|
||||||
|
{
|
||||||
|
lcLight* Light = (Focus && Focus->IsLight()) ? (lcLight*)Focus : nullptr;
|
||||||
|
|
||||||
|
if (Light)
|
||||||
|
{
|
||||||
|
lcLightProperties Props = Light->GetLightProperties();
|
||||||
|
if (Item == lightEnableCutoff)
|
||||||
|
{
|
||||||
|
Props.mEnableCutoff = Value;
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_USE_CUTOFF);
|
||||||
|
}
|
||||||
|
else if (Item == lightPOVRay)
|
||||||
|
{
|
||||||
|
Props.mPOVRayLight = Value;
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_POVRAY);
|
||||||
|
}
|
||||||
|
else if (Item == lightShadowless)
|
||||||
|
{
|
||||||
|
Props.mShadowless = Value;
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_SHADOWLESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQPropertiesTree::slotReturnPressed()
|
void lcQPropertiesTree::slotReturnPressed()
|
||||||
|
@ -744,6 +854,102 @@ void lcQPropertiesTree::slotReturnPressed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (mWidgetMode == LC_PROPERTY_WIDGET_LIGHT)
|
||||||
|
{
|
||||||
|
lcLight* Light = (mFocus && mFocus->IsLight()) ? (lcLight*)mFocus : nullptr;
|
||||||
|
|
||||||
|
if (Light)
|
||||||
|
{
|
||||||
|
lcLightProperties Props = Light->GetLightProperties();
|
||||||
|
|
||||||
|
QString Name = Light->GetName();
|
||||||
|
|
||||||
|
if (Item == lightPositionX || Item == lightPositionY || Item == lightPositionZ)
|
||||||
|
{
|
||||||
|
lcVector3 Center = Light->mPosition;
|
||||||
|
lcVector3 Position = Center;
|
||||||
|
float Value = lcParseValueLocalized(Editor->text());
|
||||||
|
if (Item == lightPositionX)
|
||||||
|
Position[0] = Value;
|
||||||
|
else if (Item == lightPositionY)
|
||||||
|
Position[1] = Value;
|
||||||
|
else if (Item == lightPositionZ)
|
||||||
|
Position[2] = Value;
|
||||||
|
|
||||||
|
lcVector3 Distance = Position - Center;
|
||||||
|
|
||||||
|
Model->MoveSelectedObjects(Distance, Distance, false, false, true, true);
|
||||||
|
}
|
||||||
|
else if (Item == lightTargetX || Item == lightTargetY || Item == lightTargetZ)
|
||||||
|
{
|
||||||
|
lcVector3 Center = Light->mTargetPosition;
|
||||||
|
lcVector3 Position = Center;
|
||||||
|
float Value = lcParseValueLocalized(Editor->text());
|
||||||
|
if (Item == lightTargetX)
|
||||||
|
Position[0] = Value;
|
||||||
|
else if (Item == lightTargetY)
|
||||||
|
Position[1] = Value;
|
||||||
|
else if (Item == lightTargetZ)
|
||||||
|
Position[2] = Value;
|
||||||
|
|
||||||
|
lcVector3 Distance = Position - Center;
|
||||||
|
|
||||||
|
Model->MoveSelectedObjects(Distance, Distance, false, false, true, true);
|
||||||
|
}
|
||||||
|
else if (Item == lightColorR || Item == lightColorG || Item == lightColorB)
|
||||||
|
{
|
||||||
|
float Value = lcParseValueLocalized(Editor->text());
|
||||||
|
if (Item == lightColorR)
|
||||||
|
Props.mLightColor[0] = Value;
|
||||||
|
else if (Item == lightColorG)
|
||||||
|
Props.mLightColor[2] = Value;
|
||||||
|
else if (Item == lightColorB)
|
||||||
|
Props.mLightColor[1] = Value;
|
||||||
|
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_COLOR);
|
||||||
|
}
|
||||||
|
else if (Item == lightFactorA || Item == lightFactorB)
|
||||||
|
{
|
||||||
|
float Value = lcParseValueLocalized(Editor->text());
|
||||||
|
if (Item == lightFactorA)
|
||||||
|
Props.mLightFactor[0] = Value;
|
||||||
|
else if (Item == lightFactorB)
|
||||||
|
Props.mLightFactor[1] = Value;
|
||||||
|
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_FACTOR);
|
||||||
|
}
|
||||||
|
else if (Item == lightSpecular)
|
||||||
|
{
|
||||||
|
Props.mLightSpecular = lcParseValueLocalized(Editor->text());
|
||||||
|
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_SPECULAR);
|
||||||
|
}
|
||||||
|
else if (Item == lightExponent)
|
||||||
|
{
|
||||||
|
Props.mSpotExponent = lcParseValueLocalized(Editor->text());
|
||||||
|
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_EXPONENT);
|
||||||
|
}
|
||||||
|
else if (Item == lightCutoff)
|
||||||
|
{
|
||||||
|
Props.mSpotCutoff = lcParseValueLocalized(Editor->text());
|
||||||
|
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_CUTOFF);
|
||||||
|
}
|
||||||
|
else if (Item == lightSpotSize)
|
||||||
|
{
|
||||||
|
Props.mSpotSize = lcParseValueLocalized(Editor->text());
|
||||||
|
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_SPOT_SIZE);
|
||||||
|
}
|
||||||
|
else if (Item == lightName)
|
||||||
|
{
|
||||||
|
QString Value = Editor->text();
|
||||||
|
|
||||||
|
Model->SetLightName(Light, Value.toLocal8Bit().data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQPropertiesTree::slotSetValue(int Value)
|
void lcQPropertiesTree::slotSetValue(int Value)
|
||||||
|
@ -775,6 +981,37 @@ void lcQPropertiesTree::slotSetValue(int Value)
|
||||||
gMainWindow->PreviewPiece(Info->mFileName, ColorCode, false);
|
gMainWindow->PreviewPiece(Info->mFileName, ColorCode, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (mWidgetMode == LC_PROPERTY_WIDGET_LIGHT)
|
||||||
|
{
|
||||||
|
lcObject* Focus = Model->GetFocusObject();
|
||||||
|
|
||||||
|
lcLight* Light = (Focus && Focus->IsLight()) ? (lcLight*)Focus : nullptr;
|
||||||
|
|
||||||
|
if (Light && Item == lightShape)
|
||||||
|
{
|
||||||
|
lcLightProperties Props = Light->GetLightProperties();
|
||||||
|
Props.mLightShape = static_cast<lcLightShape>(Value);
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_SHAPE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcQPropertiesTree::slotSetColorValue(QColor Value)
|
||||||
|
{
|
||||||
|
lcModel* Model = gMainWindow->GetActiveModel();
|
||||||
|
lcObject* Focus = Model->GetFocusObject();
|
||||||
|
lcLight* Light = (Focus && Focus->IsLight()) ? (lcLight*)Focus : nullptr;
|
||||||
|
if (Light)
|
||||||
|
{
|
||||||
|
float r = Value.red();
|
||||||
|
float g = Value.green();
|
||||||
|
float b = Value.blue();
|
||||||
|
lcVector3 Color(r/255, g/255, b/255);
|
||||||
|
|
||||||
|
lcLightProperties Props = Light->GetLightProperties();
|
||||||
|
Props.mLightColor = Color;
|
||||||
|
Model->UpdateLight(Light, Props, LC_LIGHT_COLOR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQPropertiesTree::slotColorButtonClicked()
|
void lcQPropertiesTree::slotColorButtonClicked()
|
||||||
|
@ -882,6 +1119,31 @@ void lcQPropertiesTree::SetEmpty()
|
||||||
cameraFar = nullptr;
|
cameraFar = nullptr;
|
||||||
cameraName = nullptr;
|
cameraName = nullptr;
|
||||||
|
|
||||||
|
lightPosition = nullptr;
|
||||||
|
lightPositionX = nullptr;
|
||||||
|
lightPositionY = nullptr;
|
||||||
|
lightPositionZ = nullptr;
|
||||||
|
lightTarget = nullptr;
|
||||||
|
lightTargetX = nullptr;
|
||||||
|
lightTargetY = nullptr;
|
||||||
|
lightTargetZ = nullptr;
|
||||||
|
lightColor = nullptr;
|
||||||
|
lightColorIcon = nullptr;
|
||||||
|
lightColorR = nullptr;
|
||||||
|
lightColorG = nullptr;
|
||||||
|
lightColorB = nullptr;
|
||||||
|
lightProperties = nullptr;
|
||||||
|
lightSpecular = nullptr;
|
||||||
|
lightCutoff = nullptr;
|
||||||
|
lightEnableCutoff = nullptr;
|
||||||
|
lightExponent = nullptr;
|
||||||
|
lightType = nullptr;
|
||||||
|
lightFactorA = nullptr;
|
||||||
|
lightFactorB = nullptr;
|
||||||
|
lightName = nullptr;
|
||||||
|
lightSpotSize = nullptr;
|
||||||
|
lightShape = nullptr;
|
||||||
|
|
||||||
mWidgetMode = LC_PROPERTY_WIDGET_EMPTY;
|
mWidgetMode = LC_PROPERTY_WIDGET_EMPTY;
|
||||||
mFocus = nullptr;
|
mFocus = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -1110,12 +1372,241 @@ void lcQPropertiesTree::SetCamera(lcObject* Focus)
|
||||||
|
|
||||||
void lcQPropertiesTree::SetLight(lcObject* Focus)
|
void lcQPropertiesTree::SetLight(lcObject* Focus)
|
||||||
{
|
{
|
||||||
Q_UNUSED(Focus);
|
lcLight* Light = (Focus && Focus->IsLight()) ? (lcLight*)Focus : nullptr;
|
||||||
|
|
||||||
SetEmpty();
|
QString Name = tr("Light");
|
||||||
mFocus = nullptr;
|
QString FactorALabel = tr("FactorA");
|
||||||
|
QString ExponentLabel = tr("Exponent");
|
||||||
|
QString Type, Shape, FactorAToolTip, FactorBToolTip;
|
||||||
|
lcLightType LightIndex = LC_UNDEFINED_LIGHT;
|
||||||
|
lcLightShape ShapeIndex = LC_LIGHT_SHAPE_UNDEFINED;
|
||||||
|
float SpotSize = 0.0f;
|
||||||
|
float Specular = 0.0f;
|
||||||
|
float Cutoff = 0.0f;
|
||||||
|
float Exponent = 0.0f;
|
||||||
|
bool EnableCutoff = false;
|
||||||
|
PropertyType TargetProperty = PropertyFloat;
|
||||||
|
lcVector3 Position(0.0f, 0.0f, 0.0f);
|
||||||
|
lcVector3 Target(0.0f, 0.0f, 0.0f);
|
||||||
|
lcVector3 Color(0.0f, 0.0f, 0.0f);
|
||||||
|
lcVector2 Factor(0.0f, 0.0f);
|
||||||
|
|
||||||
// todo: light properties
|
if (Light)
|
||||||
|
{
|
||||||
|
Name = Light->GetName();
|
||||||
|
|
||||||
|
Position = Light->mPosition; // normalizeDegrees(Light->mPosition);
|
||||||
|
Target = Light->mTargetPosition; // normalizeDegrees(Light->mTargetPosition);
|
||||||
|
Color = Light->mLightColor;
|
||||||
|
Factor = Light->mLightFactor;
|
||||||
|
LightIndex = static_cast<lcLightType>(Light->mLightType);
|
||||||
|
|
||||||
|
switch(LightIndex)
|
||||||
|
{
|
||||||
|
case LC_POINTLIGHT:
|
||||||
|
Type = QLatin1String("Point");
|
||||||
|
FactorALabel = tr("Radius (m)");
|
||||||
|
FactorAToolTip = tr("Shadow soft size - Light size for shadow sampling");
|
||||||
|
break;
|
||||||
|
case LC_AREALIGHT:
|
||||||
|
Type = QLatin1String("Area");
|
||||||
|
FactorALabel = tr("Width (X)");
|
||||||
|
FactorAToolTip = tr("Size of the area of the area light. X direction size for rectangular shapes");
|
||||||
|
FactorBToolTip = tr("Size of the area of the area light. Y direction size for rectangular shapes");
|
||||||
|
break;
|
||||||
|
case LC_SUNLIGHT:
|
||||||
|
Type = QLatin1String("Sun");
|
||||||
|
FactorALabel = tr("Angle (°)");
|
||||||
|
FactorAToolTip = tr("Angular diamater of the sun as seen from the Earth");
|
||||||
|
break;
|
||||||
|
case LC_SPOTLIGHT:
|
||||||
|
Type = QLatin1String("Spot");
|
||||||
|
FactorALabel = tr("Radius (m)");
|
||||||
|
FactorAToolTip = tr("Shadow soft size - Light size for shadow sampling");
|
||||||
|
FactorBToolTip = tr("Shadow blend - The softness of the spotlight edge");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Type = QLatin1String("Undefined");
|
||||||
|
FactorALabel = tr("FactorA");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShapeIndex = static_cast<lcLightShape>(Light->mLightShape);
|
||||||
|
switch(ShapeIndex)
|
||||||
|
{
|
||||||
|
case LC_LIGHT_SHAPE_SQUARE:
|
||||||
|
Shape = QLatin1String("Square");
|
||||||
|
break;
|
||||||
|
case LC_LIGHT_SHAPE_DISK:
|
||||||
|
Shape = QLatin1String("Disk");
|
||||||
|
break;
|
||||||
|
case LC_LIGHT_SHAPE_RECTANGLE:
|
||||||
|
Shape = QLatin1String("Rectangle");
|
||||||
|
break;
|
||||||
|
case LC_LIGHT_SHAPE_ELLIPSE:
|
||||||
|
Shape = QLatin1String("Ellipse");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Specular = Light->mLightSpecular;
|
||||||
|
Exponent = Light->mSpotExponent;
|
||||||
|
ExponentLabel = LightIndex ? LightIndex == LC_SUNLIGHT ? tr("Strength") : tr("Power") : tr("Exponent");
|
||||||
|
Cutoff = Light->mSpotCutoff;
|
||||||
|
EnableCutoff = Light->mEnableCutoff;
|
||||||
|
TargetProperty = Light->mLightType > LC_POINTLIGHT ? PropertyFloat : PropertyFloatReadOnly;
|
||||||
|
SpotSize = Light->mSpotSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mWidgetMode != LC_PROPERTY_WIDGET_LIGHT || mLightType != LightIndex || mLightShape != ShapeIndex)
|
||||||
|
{
|
||||||
|
SetEmpty();
|
||||||
|
// Position
|
||||||
|
lightPosition = addProperty(nullptr, tr("Position"), PropertyGroup);
|
||||||
|
lightPositionX = addProperty(lightPosition, tr("X"), PropertyFloat);
|
||||||
|
lightPositionY = addProperty(lightPosition, tr("Y"), PropertyFloat);
|
||||||
|
lightPositionZ = addProperty(lightPosition, tr("Z"), PropertyFloat);
|
||||||
|
// Target Position
|
||||||
|
if (LightIndex != LC_POINTLIGHT)
|
||||||
|
{
|
||||||
|
lightTarget = addProperty(nullptr, tr("Target"), PropertyGroup);
|
||||||
|
lightTargetX = addProperty(lightTarget, tr("X"), TargetProperty);
|
||||||
|
lightTargetY = addProperty(lightTarget, tr("Y"), TargetProperty);
|
||||||
|
lightTargetZ = addProperty(lightTarget, tr("Z"), TargetProperty);
|
||||||
|
}
|
||||||
|
// Ambient Colour
|
||||||
|
lightColor = addProperty(nullptr, tr("Color"), PropertyGroup);
|
||||||
|
lightColorIcon = addProperty(lightColor, tr("Name"), PropertyLightColor);
|
||||||
|
lightColorR = addProperty(lightColor, tr("Red"), PropertyFloat);
|
||||||
|
lightColorG = addProperty(lightColor, tr("Green"), PropertyFloat);
|
||||||
|
lightColorB = addProperty(lightColor, tr("Blue"), PropertyFloat);
|
||||||
|
// Properties
|
||||||
|
lightProperties = addProperty(nullptr, tr("Properties"), PropertyGroup);
|
||||||
|
lightType = addProperty(lightProperties, tr("Type"), PropertyStringLightReadOnly);
|
||||||
|
lightExponent = addProperty(lightProperties, ExponentLabel, PropertyFloat);
|
||||||
|
lightFactorA = addProperty(lightProperties, FactorALabel, PropertyFloat);
|
||||||
|
if (LightIndex == LC_AREALIGHT)
|
||||||
|
{
|
||||||
|
if (ShapeIndex == LC_LIGHT_SHAPE_RECTANGLE || ShapeIndex == LC_LIGHT_SHAPE_ELLIPSE)
|
||||||
|
lightFactorB = addProperty(lightProperties, tr("Height (Y)"), PropertyFloat);
|
||||||
|
lightShape = addProperty(lightProperties, tr("Shape"), PropertyLightShape);
|
||||||
|
}
|
||||||
|
else if (LightIndex == LC_SPOTLIGHT)
|
||||||
|
{
|
||||||
|
lightFactorB = addProperty(lightProperties, tr("Spot Blend"), PropertyFloat);
|
||||||
|
lightSpotSize = addProperty(lightProperties, tr("Spot Size (°)"), PropertyFloatLightSpotSize);
|
||||||
|
}
|
||||||
|
if (LightIndex != LC_SUNLIGHT)
|
||||||
|
{
|
||||||
|
lightEnableCutoff = addProperty(lightProperties, tr("Cutoff"), PropertyBool);
|
||||||
|
lightCutoff = addProperty(lightProperties, tr("Cutoff Distance"), PropertyFloat);
|
||||||
|
}
|
||||||
|
lightSpecular = addProperty(lightProperties, tr("Specular"), PropertyFloat);
|
||||||
|
lightName = addProperty(lightProperties, tr("Name"), PropertyString);
|
||||||
|
|
||||||
|
mWidgetMode = LC_PROPERTY_WIDGET_LIGHT;
|
||||||
|
mLightType = LightIndex;
|
||||||
|
mLightShape = ShapeIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
mFocus = Light;
|
||||||
|
|
||||||
|
lightPositionX->setText(1, lcFormatValueLocalized(Position[0]));
|
||||||
|
lightPositionX->setData(0, PropertyValueRole, Position[0]);
|
||||||
|
lightPositionY->setText(1, lcFormatValueLocalized(Position[1]));
|
||||||
|
lightPositionY->setData(0, PropertyValueRole, Position[1]);
|
||||||
|
lightPositionZ->setText(1, lcFormatValueLocalized(Position[2]));
|
||||||
|
lightPositionZ->setData(0, PropertyValueRole, Position[2]);
|
||||||
|
|
||||||
|
if (LightIndex != LC_POINTLIGHT)
|
||||||
|
{
|
||||||
|
lightTargetX->setText(1, lcFormatValueLocalized(Target[0]));
|
||||||
|
lightTargetX->setData(0, PropertyValueRole, Target[0]);
|
||||||
|
lightTargetY->setText(1, lcFormatValueLocalized(Target[1]));
|
||||||
|
lightTargetY->setData(0, PropertyValueRole, Target[1]);
|
||||||
|
lightTargetZ->setText(1, lcFormatValueLocalized(Target[2]));
|
||||||
|
lightTargetZ->setData(0, PropertyValueRole, Target[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage img(16, 16, QImage::Format_ARGB32);
|
||||||
|
img.fill(0);
|
||||||
|
|
||||||
|
QColor RgbColor = QColor::fromRgb(int(Color[1]*255), int(Color[1]*255), int(Color[2]*255));
|
||||||
|
|
||||||
|
QPainter painter(&img);
|
||||||
|
painter.setCompositionMode(QPainter::CompositionMode_Source);
|
||||||
|
painter.setPen(Qt::darkGray);
|
||||||
|
painter.setBrush(RgbColor);
|
||||||
|
painter.drawRect(0, 0, img.width() - 1, img.height() - 1);
|
||||||
|
painter.end();
|
||||||
|
|
||||||
|
lightColorIcon->setIcon(1, QIcon(QPixmap::fromImage(img)));
|
||||||
|
lightColorIcon->setText(1, RgbColor.name().toUpper());
|
||||||
|
lightColorIcon->setData(0, PropertyValueRole, RgbColor);
|
||||||
|
|
||||||
|
lightColorR->setText(1, lcFormatValueLocalized(Color[0]));
|
||||||
|
lightColorR->setData(0, PropertyValueRole, Color[0]);
|
||||||
|
lightColorR->setToolTip(1, tr("Red color component - use .0 - 1 format"));
|
||||||
|
lightColorG->setText(1, lcFormatValueLocalized(Color[1]));
|
||||||
|
lightColorG->setData(0, PropertyValueRole, Color[1]);
|
||||||
|
lightColorG->setToolTip(1, tr("Green color component - use .0 - 1 format"));
|
||||||
|
lightColorB->setText(1, lcFormatValueLocalized(Color[2]));
|
||||||
|
lightColorB->setData(0, PropertyValueRole, Color[2]);
|
||||||
|
lightColorB->setToolTip(1, tr("Blue color component - use .0 - 1 format"));
|
||||||
|
|
||||||
|
lightType->setText(1, Type);
|
||||||
|
lightType->setData(0, PropertyValueRole, Type);
|
||||||
|
|
||||||
|
lightExponent->setText(1, lcFormatValueLocalized(Exponent));
|
||||||
|
lightExponent->setData(0, PropertyValueRole, Exponent);
|
||||||
|
lightExponent->setToolTip(1, tr("Intensity of the light in Watts."));
|
||||||
|
|
||||||
|
lightFactorA->setText(1, lcFormatValueLocalized(Factor[0]));
|
||||||
|
lightFactorA->setData(0, PropertyValueRole, Factor[0]);
|
||||||
|
lightFactorA->setToolTip(1, FactorAToolTip);
|
||||||
|
|
||||||
|
if (LightIndex == LC_AREALIGHT)
|
||||||
|
{
|
||||||
|
if (ShapeIndex == LC_LIGHT_SHAPE_RECTANGLE || ShapeIndex == LC_LIGHT_SHAPE_ELLIPSE)
|
||||||
|
{
|
||||||
|
lightFactorB->setText(1, lcFormatValueLocalized(Factor[1]));
|
||||||
|
lightFactorB->setData(0, PropertyValueRole, Factor[1]);
|
||||||
|
lightFactorB->setToolTip(1, FactorBToolTip);
|
||||||
|
}
|
||||||
|
|
||||||
|
lightShape->setText(1, Shape);
|
||||||
|
lightShape->setData(0, PropertyValueRole, ShapeIndex);
|
||||||
|
lightShape->setToolTip(1, tr("Shape of the arealight."));
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (LightIndex == LC_SPOTLIGHT)
|
||||||
|
{
|
||||||
|
lightFactorB->setText(1, lcFormatValueLocalized(Factor[1]));
|
||||||
|
lightFactorB->setData(0, PropertyValueRole, Factor[1]);
|
||||||
|
lightFactorB->setToolTip(1, FactorBToolTip);
|
||||||
|
|
||||||
|
lightSpotSize->setText(1, lcFormatValueLocalized(SpotSize));
|
||||||
|
lightSpotSize->setData(0, PropertyValueRole, SpotSize);
|
||||||
|
lightSpotSize->setToolTip(1, tr("Angle of the spotlight beam."));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LightIndex != LC_SUNLIGHT)
|
||||||
|
{
|
||||||
|
lightEnableCutoff->setText(1, EnableCutoff ? "True" : "False");
|
||||||
|
lightEnableCutoff->setData(0, PropertyValueRole, EnableCutoff);
|
||||||
|
|
||||||
|
lightCutoff->setText(1, lcFormatValueLocalized(Cutoff));
|
||||||
|
lightCutoff->setData(0, PropertyValueRole, Cutoff);
|
||||||
|
lightCutoff->setToolTip(1, tr("Distance at which the light influence will be set to 0."));
|
||||||
|
}
|
||||||
|
|
||||||
|
lightSpecular->setText(1, lcFormatValueLocalized(Specular));
|
||||||
|
lightSpecular->setData(0, PropertyValueRole, Specular);
|
||||||
|
lightSpecular->setToolTip(1, tr("Specular reflection multiplier factor."));
|
||||||
|
|
||||||
|
lightName->setText(1, Name);
|
||||||
|
lightName->setData(0, PropertyValueRole, QVariant::fromValue(Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQPropertiesTree::SetMultiple()
|
void lcQPropertiesTree::SetMultiple()
|
||||||
|
|
|
@ -44,8 +44,13 @@ public:
|
||||||
PropertyGroup,
|
PropertyGroup,
|
||||||
PropertyBool,
|
PropertyBool,
|
||||||
PropertyFloat,
|
PropertyFloat,
|
||||||
|
PropertyFloatReadOnly,
|
||||||
|
PropertyFloatLightSpotSize,
|
||||||
PropertyStep,
|
PropertyStep,
|
||||||
PropertyString,
|
PropertyString,
|
||||||
|
PropertyStringLightReadOnly,
|
||||||
|
PropertyLightShape,
|
||||||
|
PropertyLightColor,
|
||||||
PropertyColor,
|
PropertyColor,
|
||||||
PropertyPart
|
PropertyPart
|
||||||
};
|
};
|
||||||
|
@ -55,12 +60,14 @@ protected slots:
|
||||||
void slotReturnPressed();
|
void slotReturnPressed();
|
||||||
void slotSetValue(int value);
|
void slotSetValue(int value);
|
||||||
void slotColorButtonClicked();
|
void slotColorButtonClicked();
|
||||||
|
void slotSetColorValue(QColor Value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void keyPressEvent(QKeyEvent *event) override;
|
void keyPressEvent(QKeyEvent *event) override;
|
||||||
void mousePressEvent(QMouseEvent *event) override;
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||||
void updateColorEditor(QPushButton *editor, int value) const;
|
void updateColorEditor(QPushButton *editor, int value) const;
|
||||||
|
void updateLightColorEditor(QPushButton *editor, QColor color) const;
|
||||||
|
|
||||||
QTreeWidgetItem *addProperty(QTreeWidgetItem *parent, const QString& label, PropertyType propertyType);
|
QTreeWidgetItem *addProperty(QTreeWidgetItem *parent, const QString& label, PropertyType propertyType);
|
||||||
|
|
||||||
|
@ -72,6 +79,9 @@ protected:
|
||||||
|
|
||||||
void getPartProperties(lcPartProperties *properties);
|
void getPartProperties(lcPartProperties *properties);
|
||||||
|
|
||||||
|
int mLightType;
|
||||||
|
int mLightShape;
|
||||||
|
|
||||||
lcPropertyWidgetMode mWidgetMode;
|
lcPropertyWidgetMode mWidgetMode;
|
||||||
lcObject* mFocus;
|
lcObject* mFocus;
|
||||||
|
|
||||||
|
@ -113,6 +123,31 @@ protected:
|
||||||
QTreeWidgetItem *cameraNear;
|
QTreeWidgetItem *cameraNear;
|
||||||
QTreeWidgetItem *cameraFar;
|
QTreeWidgetItem *cameraFar;
|
||||||
QTreeWidgetItem *cameraName;
|
QTreeWidgetItem *cameraName;
|
||||||
|
|
||||||
|
QTreeWidgetItem *lightPosition;
|
||||||
|
QTreeWidgetItem *lightPositionX;
|
||||||
|
QTreeWidgetItem *lightPositionY;
|
||||||
|
QTreeWidgetItem *lightPositionZ;
|
||||||
|
QTreeWidgetItem *lightTarget;
|
||||||
|
QTreeWidgetItem *lightTargetX;
|
||||||
|
QTreeWidgetItem *lightTargetY;
|
||||||
|
QTreeWidgetItem *lightTargetZ;
|
||||||
|
QTreeWidgetItem *lightColor;
|
||||||
|
QTreeWidgetItem *lightColorIcon;
|
||||||
|
QTreeWidgetItem *lightColorR;
|
||||||
|
QTreeWidgetItem *lightColorG;
|
||||||
|
QTreeWidgetItem *lightColorB;
|
||||||
|
QTreeWidgetItem *lightProperties;
|
||||||
|
QTreeWidgetItem *lightSpecular;
|
||||||
|
QTreeWidgetItem *lightCutoff;
|
||||||
|
QTreeWidgetItem *lightEnableCutoff;
|
||||||
|
QTreeWidgetItem *lightExponent;
|
||||||
|
QTreeWidgetItem *lightType;
|
||||||
|
QTreeWidgetItem *lightSpotSize;
|
||||||
|
QTreeWidgetItem *lightShape;
|
||||||
|
QTreeWidgetItem *lightFactorA;
|
||||||
|
QTreeWidgetItem *lightFactorB;
|
||||||
|
QTreeWidgetItem *lightName;
|
||||||
};
|
};
|
||||||
|
|
||||||
class lcQPropertiesTreeDelegate : public QItemDelegate
|
class lcQPropertiesTreeDelegate : public QItemDelegate
|
||||||
|
|
Loading…
Add table
Reference in a new issue