//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
//**************** Copyright (c) 2017 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************//
using System.Collections.Generic;
using BansheeEngine;
namespace BansheeEditor
{
/** @addtogroup Inspectors
* @{
*/
///
/// Renders an inspector for the component.
///
[CustomInspector(typeof(LightProbeVolume))]
internal class LightProbeVolumeInspector : Inspector
{
private GUILabel manualLabel = new GUILabel(new LocEdString("Manual probe placement"));
private GUIButton addProbeButton = new GUIButton(new LocEdString("Add probe"));
private GUIButton removeProbeButton = new GUIButton(new LocEdString("Remove probe"));
private GUILabel uniformLabel = new GUILabel(new LocEdString("Uniform grid probe placement"));
private GUIVector3Field positionField = new GUIVector3Field(new LocEdString("Grid origin"));
private GUIVector3Field sizeField = new GUIVector3Field(new LocEdString("Grid size"));
private GUIVector3Field densityField = new GUIVector3Field(new LocEdString("Grid density"));
private GUIButton resetToGridButton = new GUIButton(new LocEdString("Reset to grid"));
private GUIButton clipOuterButton = new GUIButton(new LocEdString("Clip to volume"));
private GUIButton renderButton = new GUIButton(new LocEdString("Render"));
private InspectableState modifyState;
///
protected internal override void Initialize()
{
BuildGUI();
}
///
protected internal override InspectableState Refresh()
{
LightProbeVolume lpv = InspectedObject as LightProbeVolume;
if (lpv == null)
return InspectableState.NotModified;
InspectableState oldState = modifyState;
if (modifyState.HasFlag(InspectableState.Modified))
modifyState = InspectableState.NotModified;
// Don't update fields while modification in progress
if (modifyState == InspectableState.NotModified)
{
AABox gridVolume = lpv.GridVolume;
Vector3 size = gridVolume.Maximum - gridVolume.Minimum;
Vector3 position = gridVolume.Minimum + size * 0.5f;
positionField.Value = position;
sizeField.Value = size;
Vector3I cellCount = lpv.CellCount;
densityField.Value = new Vector3(cellCount.x, cellCount.y, cellCount.z);
}
return oldState;
}
///
/// Recreates all the GUI elements used by this inspector.
///
private void BuildGUI()
{
Layout.Clear();
LightProbeVolume lpv = InspectedObject as LightProbeVolume;
if (lpv == null)
return;
// Set up callbacks
addProbeButton.OnClick += () =>
{
lpv.AddProbe(Vector3.Zero);
MarkAsModified();
ConfirmModify();
};
removeProbeButton.OnClick += () =>
{
if (LightProbeVolumeNodeHandles.SelectedNode != uint.MaxValue)
lpv.RemoveProbe(LightProbeVolumeNodeHandles.SelectedNode);
MarkAsModified();
ConfirmModify();
};
positionField.OnConfirmed += () =>
{
AABox gridVolume = lpv.GridVolume;
Vector3 extents = (gridVolume.Maximum - gridVolume.Minimum) * 0.5f;
Vector3 min = positionField.Value - extents;
Vector3 max = positionField.Value + extents;
Vector3I cellCount = lpv.CellCount;
gridVolume = new AABox(min, max);
lpv.Resize(gridVolume, cellCount);
MarkAsModified();
ConfirmModify();
};
sizeField.OnConfirmed += () =>
{
AABox gridVolume = lpv.GridVolume;
Vector3 min = gridVolume.Minimum;
Vector3 max = min + sizeField.Value;
Vector3I cellCount = lpv.CellCount;
gridVolume = new AABox(min, max);
lpv.Resize(gridVolume, cellCount);
MarkAsModified();
ConfirmModify();
};
densityField.OnConfirmed += () =>
{
AABox gridVolume = lpv.GridVolume;
Vector3 density = densityField.Value;
Vector3I cellCount = new Vector3I((int)density.x, (int)density.y, (int)density.y);
lpv.Resize(gridVolume, cellCount);
MarkAsModified();
ConfirmModify();
};
resetToGridButton.OnClick += () =>
{
lpv.Reset();
MarkAsModified();
ConfirmModify();
};
clipOuterButton.OnClick += () =>
{
lpv.Clip();
MarkAsModified();
ConfirmModify();
};
renderButton.OnClick += () =>
{
lpv.RenderProbes();
MarkAsModified();
ConfirmModify();
};
// Set up layout
Layout.AddElement(manualLabel);
GUILayout manualLayout = Layout.AddLayoutX();
manualLayout.AddElement(addProbeButton);
manualLayout.AddElement(removeProbeButton);
Layout.AddSpace(10);
Layout.AddElement(uniformLabel);
Layout.AddElement(positionField);
Layout.AddElement(sizeField);
Layout.AddElement(densityField);
Layout.AddSpace(5);
GUILayout uniformLayout = Layout.AddLayoutX();
uniformLayout.AddElement(resetToGridButton);
uniformLayout.AddElement(clipOuterButton);
Layout.AddSpace(10);
Layout.AddElement(renderButton);
}
///
/// Marks the contents of the inspector as modified.
///
protected void MarkAsModified()
{
modifyState |= InspectableState.ModifyInProgress;
}
///
/// Confirms any queued modifications.
///
protected void ConfirmModify()
{
if (modifyState.HasFlag(InspectableState.ModifyInProgress))
modifyState |= InspectableState.Modified;
}
}
/** @} */
}