namespace Yw.WpfUI.Hydro
|
{
|
/// <summary>
|
/// 抽象3D水源
|
/// </summary>
|
internal class LogicalSource3D : LogicalNode3D
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public LogicalSource3D() { }
|
|
/// <summary>
|
///
|
/// </summary>
|
public LogicalSource3D
|
(
|
SourceL3d vmo,
|
LogicalStateHelper stateHelper,
|
LogicalMaterialHelper materialHelper,
|
LogicalOverrideColorHelper overrideColorHelper,
|
LogicalOverrideOpacityHelper overrideOpacityHelper,
|
LogicalOverrideVisibleHelper overrideVisibleHelper
|
) : base(vmo, stateHelper, materialHelper, overrideColorHelper, overrideOpacityHelper, overrideVisibleHelper)
|
{
|
|
}
|
|
/// <summary>
|
/// Vmo
|
/// </summary>
|
public new SourceL3d Vmo
|
{
|
get { return _vmo as SourceL3d; }
|
set { _vmo = value; }
|
}
|
|
//更新材质
|
protected override void UpdateMaterial()
|
{
|
var htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Normal.HtmlColor;
|
var opacity = 1.0d;
|
var state = _stateHelper.GetState(this.Vmo);
|
if (state.HasFlag(eLogicalState.Color))
|
{
|
htmlColor = _overrideColorHelper.GetColor(this.Vmo);
|
}
|
if (state.HasFlag(eLogicalState.Opacity))
|
{
|
opacity = _overrideOpacityHelper.GetOpacity(this.Vmo);
|
}
|
if (state.HasFlag(eLogicalState.Selection))
|
{
|
htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Selection.HtmlColor;
|
}
|
if (state.HasFlag(eLogicalState.Highlight))
|
{
|
htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Highlight.HtmlColor;
|
}
|
var material = _materialHelper.GetMaterial(htmlColor, opacity);
|
this.Material = material;
|
}
|
|
//更新可见性
|
protected override void UpdateVisibility()
|
{
|
bool visible = true;
|
var state = _stateHelper.GetState(this.Vmo);
|
if (state.HasFlag(eLogicalState.Visible))
|
{
|
visible = _overrideVisibleHelper.GetVisible(this.Vmo);
|
}
|
this.Visible = visible;
|
}
|
|
//更新几何图形
|
protected override void UpdateGeometry()
|
{
|
var radius = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Normal.Radius;
|
var state = _stateHelper.GetState(this.Vmo);
|
if (state.HasFlag(eLogicalState.Selection))
|
{
|
radius = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Selection.Radius;
|
}
|
if (state.HasFlag(eLogicalState.Highlight))
|
{
|
radius = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Highlight.Radius;
|
}
|
|
var pt = this.Vmo.Position.ToPoint3D();
|
var x = radius * 4d;
|
var y = radius * 4d;
|
var z = radius * 2d;
|
var builder = new MeshBuilder();
|
builder.AddBox(pt, x, y, z);
|
var geometry = builder.ToMesh();
|
this.MeshGeometry = geometry;
|
}
|
|
|
}
|
}
|