///
/// This file is part of ILNumerics Community Edition.
///
/// ILNumerics Community Edition - high performance computing for applications.
/// Copyright (C) 2006 - 2012 Haymo Kutschbach, http://ilnumerics.net
///
/// ILNumerics Community Edition is free software: you can redistribute it and/or modify
/// it under the terms of the GNU General Public License version 3 as published by
/// the Free Software Foundation.
///
/// ILNumerics Community Edition is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/// GNU General Public License for more details.
///
/// You should have received a copy of the GNU General Public License
/// along with ILNumerics Community Edition. See the file License.txt in the root
/// of your distribution package. If not, see .
///
/// In addition this software uses the following components and/or licenses:
///
/// =================================================================================
/// The Open Toolkit Library License
///
/// Copyright (c) 2006 - 2009 the Open Toolkit library.
///
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights to
/// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
/// the Software, and to permit persons to whom the Software is furnished to do
/// so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in all
/// copies or substantial portions of the Software.
///
/// =================================================================================
///
using System;
using System.Collections.Generic;
using System.Text;
using ILNumerics.Drawing.Interfaces;
using ILNumerics.Drawing.Lighting;
using ILNumerics.Drawing;
using ILNumerics.Exceptions;
namespace ILNumerics.Drawing.Shapes {
///
/// Base class for all simple, bordered shapes to be used within ILNumerics.Drawing scene graphs
///
///
public abstract class ILLitBorderedShape
: ILBorderedShape, IILSupportsLight
where VertexType : struct, IILVertexDefinition {
#region attributes
ILMaterial m_material;
bool m_autoNormals;
bool m_mustCalcNormals;
#endregion
#region properties
public ILMaterial Material {
get {
return m_material;
}
}
public bool AutoNormals {
get { return m_autoNormals; }
set {
if (VerticesPerShape < 3 && value)
throw new InvalidOperationException(
"'auto normals' needs at least 3 vertices per primitive!");
m_autoNormals = value;
if (value) Configure();
}
}
#endregion
public ILLitBorderedShape(ILPanel panel, int numVertices)
: base(panel, numVertices) {
if (!VertexDefinition.StoresNormals)
throw new ILInvalidOperationException("The generic vertex type does not support ligthing operations. Choose a vertext type which is able to store individual normal vectors!");
m_autoNormals = true;
m_material = new ILMaterial();
m_mustCalcNormals = true;
}
#region public
public override void Configure() {
if (m_visible) {
if (m_mustCalcNormals && m_autoNormals) {
Computation.CalculateNormals(m_vertices);
}
}
base.Configure();
}
public override void Invalidate() {
base.Invalidate();
m_mustCalcNormals = true;
}
#endregion
private class Computation : ILNumerics.ILMath {
public static void CalculateNormals (VertexType[] vertices) {
if (vertices.Length < 3) return;
// crossproduct of vertex: (#1 - #0) x (#2 - #0)
ILPoint3Df cross = ILPoint3Df.crossN(
vertices[1].Position - vertices[0].Position,
vertices[1].Position - vertices[2].Position);
for (int i = 0; i < vertices.Length; i++) {
vertices[i].Normal = cross;
}
}
}
}
}