261 lines
8.0 KiB
C++
261 lines
8.0 KiB
C++
#include "stdafx.h"
|
|
#include "ObjectWindow.h"
|
|
#include "wiSceneSystem.h"
|
|
|
|
|
|
using namespace wiECS;
|
|
using namespace wiSceneSystem;
|
|
|
|
|
|
ObjectWindow::ObjectWindow(wiGUI* gui) : GUI(gui)
|
|
{
|
|
assert(GUI && "Invalid GUI!");
|
|
|
|
|
|
float screenW = (float)wiRenderer::GetDevice()->GetScreenWidth();
|
|
float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight();
|
|
|
|
objectWindow = new wiWindow(GUI, "Object Window");
|
|
objectWindow->SetSize(XMFLOAT2(600, 400));
|
|
objectWindow->SetEnabled(false);
|
|
GUI->AddWidget(objectWindow);
|
|
|
|
float x = 450;
|
|
float y = 0;
|
|
|
|
renderableCheckBox = new wiCheckBox("Renderable: ");
|
|
renderableCheckBox->SetTooltip("Set object to be participating in rendering.");
|
|
renderableCheckBox->SetPos(XMFLOAT2(x, y += 30));
|
|
renderableCheckBox->SetCheck(true);
|
|
renderableCheckBox->OnClick([&](wiEventArgs args) {
|
|
ObjectComponent* object = wiRenderer::GetScene().objects.GetComponent(entity);
|
|
if (object != nullptr)
|
|
{
|
|
object->SetRenderable(args.bValue);
|
|
}
|
|
});
|
|
objectWindow->AddWidget(renderableCheckBox);
|
|
|
|
ditherSlider = new wiSlider(0, 1, 0, 1000, "Dither: ");
|
|
ditherSlider->SetTooltip("Adjust dithered transparency of the object. This disables some optimizations so performance can be affected.");
|
|
ditherSlider->SetSize(XMFLOAT2(100, 30));
|
|
ditherSlider->SetPos(XMFLOAT2(x, y += 30));
|
|
ditherSlider->OnSlide([&](wiEventArgs args) {
|
|
ObjectComponent* object = wiRenderer::GetScene().objects.GetComponent(entity);
|
|
if (object != nullptr)
|
|
{
|
|
object->color.w = 1 - args.fValue;
|
|
}
|
|
});
|
|
objectWindow->AddWidget(ditherSlider);
|
|
|
|
cascadeMaskSlider = new wiSlider(0, 3, 0, 3, "Cascade Mask: ");
|
|
cascadeMaskSlider->SetTooltip("How many shadow cascades to skip when rendering this object into shadow maps? (0: skip none, it will be in all cascades, 1: skip first (biggest cascade), ...etc...");
|
|
cascadeMaskSlider->SetSize(XMFLOAT2(100, 30));
|
|
cascadeMaskSlider->SetPos(XMFLOAT2(x, y += 30));
|
|
cascadeMaskSlider->OnSlide([&](wiEventArgs args) {
|
|
ObjectComponent* object = wiRenderer::GetScene().objects.GetComponent(entity);
|
|
if (object != nullptr)
|
|
{
|
|
object->cascadeMask = (uint32_t)args.iValue;
|
|
}
|
|
});
|
|
objectWindow->AddWidget(cascadeMaskSlider);
|
|
|
|
|
|
colorPicker = new wiColorPicker(GUI, "Object Color");
|
|
colorPicker->SetPos(XMFLOAT2(10, 30));
|
|
colorPicker->RemoveWidgets();
|
|
colorPicker->SetVisible(true);
|
|
colorPicker->SetEnabled(true);
|
|
colorPicker->OnColorChanged([&](wiEventArgs args) {
|
|
ObjectComponent* object = wiRenderer::GetScene().objects.GetComponent(entity);
|
|
if (object != nullptr)
|
|
{
|
|
object->color = XMFLOAT4(powf(args.color.x, 1.f / 2.2f), powf(args.color.y, 1.f / 2.2f), powf(args.color.z, 1.f / 2.2f), object->color.w);
|
|
}
|
|
});
|
|
objectWindow->AddWidget(colorPicker);
|
|
|
|
y += 60;
|
|
|
|
physicsLabel = new wiLabel("PHYSICSLABEL");
|
|
physicsLabel->SetText("PHYSICS SETTINGS");
|
|
physicsLabel->SetPos(XMFLOAT2(x - 30, y += 30));
|
|
physicsLabel->SetSize(XMFLOAT2(150, 20));
|
|
objectWindow->AddWidget(physicsLabel);
|
|
|
|
|
|
|
|
rigidBodyCheckBox = new wiCheckBox("Rigid Body Physics: ");
|
|
rigidBodyCheckBox->SetTooltip("Enable rigid body physics simulation.");
|
|
rigidBodyCheckBox->SetPos(XMFLOAT2(x, y += 30));
|
|
rigidBodyCheckBox->SetCheck(false);
|
|
rigidBodyCheckBox->OnClick([&](wiEventArgs args)
|
|
{
|
|
Scene& scene = wiRenderer::GetScene();
|
|
RigidBodyPhysicsComponent* physicscomponent = scene.rigidbodies.GetComponent(entity);
|
|
|
|
if (args.bValue)
|
|
{
|
|
if (physicscomponent == nullptr)
|
|
{
|
|
RigidBodyPhysicsComponent& rigidbody = scene.rigidbodies.Create(entity);
|
|
rigidbody.SetKinematic(kinematicCheckBox->GetCheck());
|
|
rigidbody.SetDisableDeactivation(disabledeactivationCheckBox->GetCheck());
|
|
rigidbody.shape = (RigidBodyPhysicsComponent::CollisionShape)collisionShapeComboBox->GetSelected();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (physicscomponent != nullptr)
|
|
{
|
|
scene.rigidbodies.Remove(entity);
|
|
}
|
|
}
|
|
|
|
});
|
|
objectWindow->AddWidget(rigidBodyCheckBox);
|
|
|
|
kinematicCheckBox = new wiCheckBox("Kinematic: ");
|
|
kinematicCheckBox->SetTooltip("Toggle kinematic behaviour.");
|
|
kinematicCheckBox->SetPos(XMFLOAT2(x, y += 30));
|
|
kinematicCheckBox->SetCheck(false);
|
|
kinematicCheckBox->OnClick([&](wiEventArgs args) {
|
|
RigidBodyPhysicsComponent* physicscomponent = wiRenderer::GetScene().rigidbodies.GetComponent(entity);
|
|
if (physicscomponent != nullptr)
|
|
{
|
|
physicscomponent->SetKinematic(args.bValue);
|
|
}
|
|
});
|
|
objectWindow->AddWidget(kinematicCheckBox);
|
|
|
|
disabledeactivationCheckBox = new wiCheckBox("Disable Deactivation: ");
|
|
disabledeactivationCheckBox->SetTooltip("Toggle kinematic behaviour.");
|
|
disabledeactivationCheckBox->SetPos(XMFLOAT2(x, y += 30));
|
|
disabledeactivationCheckBox->SetCheck(false);
|
|
disabledeactivationCheckBox->OnClick([&](wiEventArgs args) {
|
|
RigidBodyPhysicsComponent* physicscomponent = wiRenderer::GetScene().rigidbodies.GetComponent(entity);
|
|
if (physicscomponent != nullptr)
|
|
{
|
|
physicscomponent->SetDisableDeactivation(args.bValue);
|
|
}
|
|
});
|
|
objectWindow->AddWidget(disabledeactivationCheckBox);
|
|
|
|
collisionShapeComboBox = new wiComboBox("Collision Shape:");
|
|
collisionShapeComboBox->SetSize(XMFLOAT2(100, 20));
|
|
collisionShapeComboBox->SetPos(XMFLOAT2(x, y += 30));
|
|
collisionShapeComboBox->AddItem("Box");
|
|
collisionShapeComboBox->AddItem("Sphere");
|
|
collisionShapeComboBox->AddItem("Capsule");
|
|
collisionShapeComboBox->AddItem("Convex Hull");
|
|
collisionShapeComboBox->AddItem("Triangle Mesh");
|
|
collisionShapeComboBox->OnSelect([&](wiEventArgs args)
|
|
{
|
|
RigidBodyPhysicsComponent* physicscomponent = wiRenderer::GetScene().rigidbodies.GetComponent(entity);
|
|
if (physicscomponent != nullptr)
|
|
{
|
|
switch (args.iValue)
|
|
{
|
|
case 0:
|
|
physicscomponent->shape = RigidBodyPhysicsComponent::CollisionShape::BOX;
|
|
break;
|
|
case 1:
|
|
physicscomponent->shape = RigidBodyPhysicsComponent::CollisionShape::SPHERE;
|
|
break;
|
|
case 2:
|
|
physicscomponent->shape = RigidBodyPhysicsComponent::CollisionShape::CAPSULE;
|
|
break;
|
|
case 3:
|
|
physicscomponent->shape = RigidBodyPhysicsComponent::CollisionShape::CONVEX_HULL;
|
|
break;
|
|
case 4:
|
|
physicscomponent->shape = RigidBodyPhysicsComponent::CollisionShape::TRIANGLE_MESH;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
collisionShapeComboBox->SetSelected(0);
|
|
collisionShapeComboBox->SetEnabled(true);
|
|
collisionShapeComboBox->SetTooltip("Set rigid body collision shape.");
|
|
objectWindow->AddWidget(collisionShapeComboBox);
|
|
|
|
|
|
|
|
|
|
objectWindow->Translate(XMFLOAT3(1300, 100, 0));
|
|
objectWindow->SetVisible(false);
|
|
|
|
SetEntity(INVALID_ENTITY);
|
|
}
|
|
|
|
|
|
ObjectWindow::~ObjectWindow()
|
|
{
|
|
objectWindow->RemoveWidgets(true);
|
|
GUI->RemoveWidget(objectWindow);
|
|
SAFE_DELETE(objectWindow);
|
|
}
|
|
|
|
|
|
void ObjectWindow::SetEntity(Entity entity)
|
|
{
|
|
if (this->entity == entity)
|
|
return;
|
|
|
|
this->entity = entity;
|
|
|
|
Scene& scene = wiRenderer::GetScene();
|
|
|
|
const ObjectComponent* object = scene.objects.GetComponent(entity);
|
|
|
|
if (object != nullptr)
|
|
{
|
|
renderableCheckBox->SetCheck(object->IsRenderable());
|
|
cascadeMaskSlider->SetValue((float)object->cascadeMask);
|
|
ditherSlider->SetValue(object->GetTransparency());
|
|
|
|
const RigidBodyPhysicsComponent* physicsComponent = scene.rigidbodies.GetComponent(entity);
|
|
|
|
rigidBodyCheckBox->SetCheck(physicsComponent != nullptr);
|
|
|
|
if (physicsComponent != nullptr)
|
|
{
|
|
kinematicCheckBox->SetCheck(physicsComponent->IsKinematic());
|
|
disabledeactivationCheckBox->SetCheck(physicsComponent->IsDisableDeactivation());
|
|
|
|
if (physicsComponent->shape == RigidBodyPhysicsComponent::CollisionShape::BOX)
|
|
{
|
|
collisionShapeComboBox->SetSelected(0);
|
|
}
|
|
else if (physicsComponent->shape == RigidBodyPhysicsComponent::CollisionShape::SPHERE)
|
|
{
|
|
collisionShapeComboBox->SetSelected(1);
|
|
}
|
|
else if (physicsComponent->shape == RigidBodyPhysicsComponent::CollisionShape::CAPSULE)
|
|
{
|
|
collisionShapeComboBox->SetSelected(2);
|
|
}
|
|
else if (physicsComponent->shape == RigidBodyPhysicsComponent::CollisionShape::CONVEX_HULL)
|
|
{
|
|
collisionShapeComboBox->SetSelected(3);
|
|
}
|
|
else if (physicsComponent->shape == RigidBodyPhysicsComponent::CollisionShape::TRIANGLE_MESH)
|
|
{
|
|
collisionShapeComboBox->SetSelected(4);
|
|
}
|
|
}
|
|
|
|
objectWindow->SetEnabled(true);
|
|
|
|
}
|
|
else
|
|
{
|
|
objectWindow->SetEnabled(false);
|
|
}
|
|
|
|
}
|