2013-10-11 01:58:54 +02:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using OpenTK;
|
|
|
|
|
|
|
|
namespace Examples.Shapes
|
|
|
|
{
|
|
|
|
public sealed class Capsule: DrawableShape
|
|
|
|
{
|
|
|
|
public enum eSubdivisions
|
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
One = 1,
|
|
|
|
Two = 2,
|
|
|
|
Three = 3,
|
|
|
|
Four = 4,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public Capsule( double radius, double height, eSubdivisions subdivs, bool useDL )
|
|
|
|
: base( useDL )
|
|
|
|
{
|
|
|
|
uint HoseSubDivs = 0;
|
|
|
|
SlicedSphere.eSubdivisions spheresubdivs = SlicedSphere.eSubdivisions.Zero;
|
|
|
|
|
|
|
|
switch ( subdivs )
|
|
|
|
{
|
|
|
|
case eSubdivisions.None:
|
|
|
|
spheresubdivs = SlicedSphere.eSubdivisions.Zero;
|
|
|
|
HoseSubDivs = 0;
|
|
|
|
break;
|
|
|
|
case eSubdivisions.One:
|
|
|
|
spheresubdivs = SlicedSphere.eSubdivisions.One;
|
|
|
|
HoseSubDivs = 1;
|
|
|
|
break;
|
|
|
|
case eSubdivisions.Two:
|
|
|
|
spheresubdivs = SlicedSphere.eSubdivisions.Two;
|
|
|
|
HoseSubDivs = 3;
|
|
|
|
break;
|
|
|
|
case eSubdivisions.Three:
|
|
|
|
spheresubdivs = SlicedSphere.eSubdivisions.Three;
|
|
|
|
HoseSubDivs = 7;
|
|
|
|
break;
|
|
|
|
case eSubdivisions.Four:
|
|
|
|
spheresubdivs = SlicedSphere.eSubdivisions.Four;
|
|
|
|
HoseSubDivs = 15;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
PrimitiveMode = OpenTK.Graphics.OpenGL.BeginMode.Triangles;
|
|
|
|
|
|
|
|
OpenTK.Graphics.OpenGL.BeginMode TemporaryMode;
|
|
|
|
VertexT2dN3dV3d[] TemporaryVBO;
|
|
|
|
uint[] TemporaryIBO;
|
|
|
|
|
|
|
|
List<Chunk> AllChunks = new List<Chunk>();
|
|
|
|
Vector3d offset1 = new Vector3d( 0.0, 0.0, height ),
|
|
|
|
offset2 = new Vector3d( 0.0, 0.0, -height );
|
|
|
|
for ( int i = 0; i < 4; i++ )
|
|
|
|
{
|
|
|
|
SlicedHose.eSide tempSide = SlicedHose.eSide.FrontTop;
|
|
|
|
switch ( i )
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
tempSide = SlicedHose.eSide.FrontBottom;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
tempSide = SlicedHose.eSide.BackBottom;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
tempSide = SlicedHose.eSide.BackTop;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
tempSide = SlicedHose.eSide.FrontTop;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
SlicedHose tempHose = new SlicedHose( tempSide, HoseSubDivs, radius, offset1, offset2, false );
|
|
|
|
tempHose.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO );
|
|
|
|
tempHose.Dispose();
|
|
|
|
AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
SlicedSphere front = new SlicedSphere( radius, offset1, spheresubdivs,
|
|
|
|
new SlicedSphere.eDir[] {
|
|
|
|
SlicedSphere.eDir.BackBottomRight,
|
|
|
|
SlicedSphere.eDir.FrontTopRight,
|
|
|
|
SlicedSphere.eDir.BackTopRight,
|
|
|
|
SlicedSphere.eDir.FrontBottomRight,
|
|
|
|
},
|
|
|
|
false );
|
|
|
|
|
|
|
|
front.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO );
|
|
|
|
AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) );
|
|
|
|
front.Dispose();
|
|
|
|
|
|
|
|
SlicedSphere back = new SlicedSphere( radius, offset2, spheresubdivs,
|
|
|
|
new SlicedSphere.eDir[] {
|
|
|
|
SlicedSphere.eDir.FrontBottomLeft,
|
|
|
|
SlicedSphere.eDir.FrontTopLeft,
|
|
|
|
SlicedSphere.eDir.BackTopLeft,
|
|
|
|
SlicedSphere.eDir.BackBottomLeft },
|
|
|
|
false );
|
|
|
|
back.GetArraysforVBO( out TemporaryMode, out TemporaryVBO, out TemporaryIBO );
|
|
|
|
AllChunks.Add( new Chunk( ref TemporaryVBO, ref TemporaryIBO ) );
|
|
|
|
back.Dispose();
|
|
|
|
|
|
|
|
Chunk.GetArray( ref AllChunks, out VertexArray, out IndexArray );
|
|
|
|
AllChunks.Clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|