281 lines
13 KiB
C#
281 lines
13 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
using OpenTK;
|
||
|
|
||
|
namespace Examples.Shapes
|
||
|
{
|
||
|
public sealed class ChamferCube: DrawableShape
|
||
|
{
|
||
|
|
||
|
public enum SubDivs: byte
|
||
|
{
|
||
|
Zero,
|
||
|
One,
|
||
|
Two,
|
||
|
Three,
|
||
|
Four,
|
||
|
}
|
||
|
|
||
|
public ChamferCube( double Width, double Height, double Length, SubDivs subdivs, double radius, bool useDL )
|
||
|
: base( useDL )
|
||
|
{
|
||
|
SlicedSphere.eSubdivisions sphereSubDivs = SlicedSphere.eSubdivisions.Zero;
|
||
|
uint hoseSubDivs = 0;
|
||
|
|
||
|
switch ( subdivs )
|
||
|
{
|
||
|
case SubDivs.Zero:
|
||
|
sphereSubDivs = SlicedSphere.eSubdivisions.Zero;
|
||
|
hoseSubDivs = 0;
|
||
|
break;
|
||
|
case SubDivs.One:
|
||
|
sphereSubDivs = SlicedSphere.eSubdivisions.One;
|
||
|
hoseSubDivs = 1;
|
||
|
break;
|
||
|
case SubDivs.Two:
|
||
|
sphereSubDivs = SlicedSphere.eSubdivisions.Two;
|
||
|
hoseSubDivs = 3;
|
||
|
break;
|
||
|
case SubDivs.Three:
|
||
|
sphereSubDivs = SlicedSphere.eSubdivisions.Three;
|
||
|
hoseSubDivs = 7;
|
||
|
break;
|
||
|
case SubDivs.Four:
|
||
|
sphereSubDivs = SlicedSphere.eSubdivisions.Four;
|
||
|
hoseSubDivs = 15;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
#region Temporary Storage
|
||
|
|
||
|
List<Chunk> AllChunks = new List<Chunk>();
|
||
|
OpenTK.Graphics.OpenGL.BeginMode TemporaryMode;
|
||
|
VertexT2dN3dV3d[] TemporaryVBO;
|
||
|
uint[] TemporaryIBO;
|
||
|
|
||
|
#endregion Temporary Storage
|
||
|
|
||
|
Vector3d FrontTopRightEdge = new Vector3d( +Width - radius, +Height - radius, +Length - radius );
|
||
|
Vector3d FrontTopLeftEdge = new Vector3d( +Width - radius, +Height - radius, -Length + radius );
|
||
|
Vector3d FrontBottomRightEdge = new Vector3d( +Width - radius, -Height + radius, +Length - radius );
|
||
|
Vector3d FrontBottomLeftEdge = new Vector3d( +Width - radius, -Height + radius, -Length + radius );
|
||
|
Vector3d BackTopRightEdge = new Vector3d( -Width + radius, +Height - radius, +Length - radius );
|
||
|
Vector3d BackTopLeftEdge = new Vector3d( -Width + radius, +Height - radius, -Length + radius );
|
||
|
Vector3d BackBottomRightEdge = new Vector3d( -Width + radius, -Height + radius, +Length - radius );
|
||
|
Vector3d BackBottomLeftEdge = new Vector3d( -Width + radius, -Height + radius, -Length + radius );
|
||
|
|
||
|
#region 8 sliced Spheres
|
||
|
SlicedSphere tempSphere;
|
||
|
Vector3d tempVector = Vector3d.Zero;
|
||
|
SlicedSphere.eDir[] tempEdge = new SlicedSphere.eDir[1];
|
||
|
|
||
|
for ( int i = 0; i < 8; i++ )
|
||
|
{
|
||
|
switch ( i )
|
||
|
{
|
||
|
case 0:
|
||
|
tempVector = FrontTopRightEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontTopRight };
|
||
|
break;
|
||
|
case 1:
|
||
|
tempVector = FrontTopLeftEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontTopLeft };
|
||
|
break;
|
||
|
case 2:
|
||
|
tempVector = FrontBottomRightEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontBottomRight };
|
||
|
break;
|
||
|
case 3:
|
||
|
tempVector = FrontBottomLeftEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.FrontBottomLeft };
|
||
|
break;
|
||
|
case 4:
|
||
|
tempVector = BackBottomRightEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackBottomRight };
|
||
|
break;
|
||
|
case 5:
|
||
|
tempVector = BackBottomLeftEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackBottomLeft };
|
||
|
break;
|
||
|
case 6:
|
||
|
tempVector = BackTopRightEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackTopRight };
|
||
|
break;
|
||
|
case 7:
|
||
|
tempVector = BackTopLeftEdge;
|
||
|
tempEdge = new SlicedSphere.eDir[] { SlicedSphere.eDir.BackTopLeft };
|
||
|
break;
|
||
|
}
|
||
|
tempSphere = new SlicedSphere( radius,
|
||
|
tempVector,
|
||
|
sphereSubDivs,
|
||
|
tempEdge,
|
||
|
false );
|
||
|
tempSphere.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO );
|
||
|
tempSphere.Dispose();
|
||
|
AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) );
|
||
|
}
|
||
|
#endregion 8 sliced Spheres
|
||
|
|
||
|
#region 12 sliced Hoses
|
||
|
|
||
|
SlicedHose tempHose;
|
||
|
SlicedHose.eSide tempSide = SlicedHose.eSide.BackBottom;
|
||
|
Vector3d tempHoseStart = Vector3d.Zero;
|
||
|
Vector3d tempHoseEnd = Vector3d.Zero;
|
||
|
|
||
|
for ( int i = 0; i < 12; i++ )
|
||
|
{
|
||
|
switch ( i )
|
||
|
{
|
||
|
#region Around X Axis
|
||
|
case 0:
|
||
|
tempSide = SlicedHose.eSide.BottomRight;
|
||
|
tempHoseStart = BackBottomRightEdge;
|
||
|
tempHoseEnd = FrontBottomRightEdge;
|
||
|
break;
|
||
|
case 1:
|
||
|
tempSide = SlicedHose.eSide.TopRight;
|
||
|
tempHoseStart = BackTopRightEdge;
|
||
|
tempHoseEnd = FrontTopRightEdge;
|
||
|
break;
|
||
|
case 2:
|
||
|
tempSide = SlicedHose.eSide.TopLeft;
|
||
|
tempHoseStart = BackTopLeftEdge;
|
||
|
tempHoseEnd = FrontTopLeftEdge;
|
||
|
break;
|
||
|
case 3:
|
||
|
tempSide = SlicedHose.eSide.BottomLeft;
|
||
|
tempHoseStart = BackBottomLeftEdge;
|
||
|
tempHoseEnd = FrontBottomLeftEdge;
|
||
|
break;
|
||
|
#endregion Around X Axis
|
||
|
#region Around Y Axis
|
||
|
case 4:
|
||
|
tempSide = SlicedHose.eSide.FrontRight;
|
||
|
tempHoseStart = FrontBottomRightEdge;
|
||
|
tempHoseEnd = FrontTopRightEdge;
|
||
|
break;
|
||
|
case 5:
|
||
|
tempSide = SlicedHose.eSide.BackRight;
|
||
|
tempHoseStart = BackBottomRightEdge;
|
||
|
tempHoseEnd = BackTopRightEdge;
|
||
|
break;
|
||
|
case 6:
|
||
|
tempSide = SlicedHose.eSide.BackLeft;
|
||
|
tempHoseStart = BackBottomLeftEdge;
|
||
|
tempHoseEnd = BackTopLeftEdge;
|
||
|
break;
|
||
|
case 7:
|
||
|
tempSide = SlicedHose.eSide.FrontLeft;
|
||
|
tempHoseStart = FrontBottomLeftEdge;
|
||
|
tempHoseEnd = FrontTopLeftEdge;
|
||
|
break;
|
||
|
#endregion Around Y Axis
|
||
|
#region Around Z Axis
|
||
|
case 8:
|
||
|
tempSide = SlicedHose.eSide.FrontTop;
|
||
|
tempHoseStart = FrontTopRightEdge;
|
||
|
tempHoseEnd = FrontTopLeftEdge;
|
||
|
break;
|
||
|
case 9:
|
||
|
tempSide = SlicedHose.eSide.BackTop;
|
||
|
tempHoseStart = BackTopRightEdge;
|
||
|
tempHoseEnd = BackTopLeftEdge;
|
||
|
break;
|
||
|
case 10:
|
||
|
tempSide = SlicedHose.eSide.BackBottom;
|
||
|
tempHoseStart = BackBottomRightEdge;
|
||
|
tempHoseEnd = BackBottomLeftEdge;
|
||
|
break;
|
||
|
case 11:
|
||
|
tempSide = SlicedHose.eSide.FrontBottom;
|
||
|
tempHoseStart = FrontBottomRightEdge;
|
||
|
tempHoseEnd = FrontBottomLeftEdge;
|
||
|
break;
|
||
|
#endregion Around Z Axis
|
||
|
}
|
||
|
tempHose = new SlicedHose( tempSide,
|
||
|
hoseSubDivs,
|
||
|
radius,
|
||
|
tempHoseStart,
|
||
|
tempHoseEnd,
|
||
|
false );
|
||
|
tempHose.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO );
|
||
|
tempHose.Dispose();
|
||
|
AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) );
|
||
|
}
|
||
|
#endregion 12 sliced Hoses
|
||
|
|
||
|
#region 6 quads for the sides
|
||
|
|
||
|
VertexT2dN3dV3d[] tempVBO = new VertexT2dN3dV3d[4];
|
||
|
uint[] tempIBO = new uint[6] { 0, 1, 2, 0, 2, 3 }; // all quads share this IBO
|
||
|
|
||
|
// all quads use the same texcoords
|
||
|
tempVBO[0].TexCoord = new Vector2d( 0.0, 1.0 );
|
||
|
tempVBO[1].TexCoord = new Vector2d( 0.0, 0.0 );
|
||
|
tempVBO[2].TexCoord = new Vector2d( 1.0, 0.0 );
|
||
|
tempVBO[3].TexCoord = new Vector2d( 1.0, 1.0 );
|
||
|
|
||
|
// front face
|
||
|
tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = Vector3d.UnitX;
|
||
|
tempVBO[0].Position = FrontTopRightEdge + new Vector3d( radius, 0.0, 0.0 );
|
||
|
tempVBO[1].Position = FrontBottomRightEdge + new Vector3d( radius, 0.0, 0.0 );
|
||
|
tempVBO[2].Position = FrontBottomLeftEdge + new Vector3d( radius, 0.0, 0.0 );
|
||
|
tempVBO[3].Position = FrontTopLeftEdge + new Vector3d( radius, 0.0, 0.0 );
|
||
|
AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) );
|
||
|
|
||
|
// back face
|
||
|
tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = -Vector3d.UnitX;
|
||
|
tempVBO[0].Position = BackTopLeftEdge - new Vector3d( radius, 0.0, 0.0 );
|
||
|
tempVBO[1].Position = BackBottomLeftEdge - new Vector3d( radius, 0.0, 0.0 );
|
||
|
tempVBO[2].Position = BackBottomRightEdge - new Vector3d( radius, 0.0, 0.0 );
|
||
|
tempVBO[3].Position = BackTopRightEdge - new Vector3d( radius, 0.0, 0.0 );
|
||
|
AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) );
|
||
|
|
||
|
// top face
|
||
|
tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = Vector3d.UnitY;
|
||
|
tempVBO[0].Position = BackTopRightEdge + new Vector3d( 0.0, radius, 0.0 );
|
||
|
tempVBO[1].Position = FrontTopRightEdge + new Vector3d( 0.0, radius, 0.0 );
|
||
|
tempVBO[2].Position = FrontTopLeftEdge + new Vector3d( 0.0, radius, 0.0 );
|
||
|
tempVBO[3].Position = BackTopLeftEdge + new Vector3d( 0.0, radius, 0.0 );
|
||
|
AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) );
|
||
|
|
||
|
// bottom face
|
||
|
tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = -Vector3d.UnitY;
|
||
|
tempVBO[0].Position = BackBottomLeftEdge - new Vector3d( 0.0, radius, 0.0 );
|
||
|
tempVBO[1].Position = FrontBottomLeftEdge - new Vector3d( 0.0, radius, 0.0 );
|
||
|
tempVBO[2].Position = FrontBottomRightEdge - new Vector3d( 0.0, radius, 0.0 );
|
||
|
tempVBO[3].Position = BackBottomRightEdge - new Vector3d( 0.0, radius, 0.0 );
|
||
|
AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) );
|
||
|
|
||
|
// right face
|
||
|
tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = Vector3d.UnitZ;
|
||
|
tempVBO[0].Position = BackTopRightEdge + new Vector3d( 0.0, 0.0, radius );
|
||
|
tempVBO[1].Position = BackBottomRightEdge + new Vector3d( 0.0, 0.0, radius );
|
||
|
tempVBO[2].Position = FrontBottomRightEdge + new Vector3d( 0.0, 0.0, radius );
|
||
|
tempVBO[3].Position = FrontTopRightEdge + new Vector3d( 0.0, 0.0, radius );
|
||
|
AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) );
|
||
|
|
||
|
// left face
|
||
|
tempVBO[0].Normal = tempVBO[1].Normal = tempVBO[2].Normal = tempVBO[3].Normal = -Vector3d.UnitZ;
|
||
|
tempVBO[0].Position = FrontTopLeftEdge - new Vector3d( 0.0, 0.0, radius );
|
||
|
tempVBO[1].Position = FrontBottomLeftEdge - new Vector3d( 0.0, 0.0, radius );
|
||
|
tempVBO[2].Position = BackBottomLeftEdge - new Vector3d( 0.0, 0.0, radius );
|
||
|
tempVBO[3].Position = BackTopLeftEdge - new Vector3d( 0.0, 0.0, radius );
|
||
|
AllChunks.Add( new Chunk( ref tempVBO, ref tempIBO ) );
|
||
|
|
||
|
|
||
|
#endregion 6 quads for the sides
|
||
|
|
||
|
#region Final Assembly of Chunks
|
||
|
PrimitiveMode = OpenTK.Graphics.OpenGL.BeginMode.Triangles;
|
||
|
Chunk.GetArray( ref AllChunks, out VertexArray, out IndexArray );
|
||
|
AllChunks.Clear();
|
||
|
#endregion Final Assembly of Chunks
|
||
|
}
|
||
|
}
|
||
|
}
|