mirror of
https://github.com/Ryujinx/Opentk.git
synced 2024-12-27 07:25:28 +00:00
72 lines
2.5 KiB
C#
72 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Examples.Shapes
|
|
{
|
|
public sealed class KochTetrahedron: DrawableShape
|
|
{
|
|
|
|
public enum eSubdivisions
|
|
{
|
|
Zero = 0,
|
|
One = 1,
|
|
Two = 2,
|
|
Three = 3,
|
|
Four = 4,
|
|
Five=5,
|
|
Six=6,
|
|
Seven=7,
|
|
Eight=8,
|
|
}
|
|
|
|
public KochTetrahedron( double scale, double extrusionHeight, double extrusionMultiplier, eSubdivisions subdivs, bool useDL )
|
|
: base( useDL )
|
|
{
|
|
TetrahedronFace[] Triangles;
|
|
|
|
switch ( subdivs )
|
|
{
|
|
case eSubdivisions.Zero:
|
|
SierpinskiTetrahedron.CreateDefaultTetrahedron( scale, out Triangles );
|
|
break;
|
|
case eSubdivisions.One:
|
|
case eSubdivisions.Two:
|
|
case eSubdivisions.Three:
|
|
case eSubdivisions.Four:
|
|
case eSubdivisions.Five:
|
|
case eSubdivisions.Six:
|
|
case eSubdivisions.Seven:
|
|
case eSubdivisions.Eight:
|
|
SierpinskiTetrahedron.CreateDefaultTetrahedron( scale, out Triangles );
|
|
for ( int i = 0; i < (int)subdivs; i++ )
|
|
{
|
|
TetrahedronFace[] temp;
|
|
this.SubdivideKoch( extrusionHeight, ref Triangles, out temp );
|
|
Triangles = temp;
|
|
extrusionHeight *= extrusionMultiplier;
|
|
}
|
|
break;
|
|
default: throw new ArgumentOutOfRangeException( "Subdivisions other than contained in the enum cause overflows and are not allowed." );
|
|
|
|
}
|
|
|
|
PrimitiveMode = OpenTK.Graphics.OpenGL.BeginMode.Triangles;
|
|
SierpinskiTetrahedron.GetVertexArray( ref Triangles, out VertexArray );
|
|
IndexArray = null;
|
|
}
|
|
|
|
private void SubdivideKoch( double height, ref TetrahedronFace[] input, out TetrahedronFace[] output )
|
|
{
|
|
output = new TetrahedronFace[input.Length * 6];
|
|
|
|
int counter = 0;
|
|
for ( int i = 0; i < input.Length; i++ )
|
|
{
|
|
input[i].SubdivideKoch(height, out output[counter + 0], out output[counter + 1], out output[counter + 2], out output[counter + 3], out output[counter + 4], out output[counter + 5] );
|
|
counter += 6; // every source triangle emits 6 new triangles
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|