00001 #pragma once
00002 #ifndef SUPERELLIPSOID_H
00003 #define SUPERELLIPSOID_H
00004
00005 #include "Quadric.h"
00006
00007 namespace RenderTools {
00008
00009 class Ellipsoid : public Quadric {
00010 public:
00011
00012 enum EllipsoidType {
00013 SPHERE,
00014 CYLINDER,
00015 STAR,
00016 DOUBLEPYRAMID,
00017 PILLOW,
00018 ROUNDCUBE,
00019 CUSTOM
00020 };
00021
00022 class Patch{
00023 public:
00024 Patch( int sx, int sy ){
00025 m_subdiv[0] = sx;
00026 m_subdiv[1] = sy;
00027 m_vtx = new Mat4[m_subdiv[0] * m_subdiv[1]];
00028 m_uv = new Vec2[m_subdiv[0] * m_subdiv[1]];
00029 }
00030 virtual ~Patch(){
00031 delete [] m_vtx;
00032 delete [] m_uv;
00033 }
00034 void setVertex( int x, int y, const Mat4 & m, const Vec2 & uv ){
00035 m_vtx[ y * m_subdiv[0] + x ] = m;
00036 m_uv[ y * m_subdiv[0] + x ] = uv;
00037 }
00038 void getVertex( int x, int y, Mat4 & m, Vec2 & uv ) const {
00039 m = m_vtx[ y * m_subdiv[0] + x ];
00040 uv = m_uv[ y * m_subdiv[0] + x ];
00041 }
00042 private:
00043 int m_subdiv[2];
00044 Mat4 * m_vtx;
00045 Vec2 * m_uv;
00046 };
00047
00048 Ellipsoid( void );
00049 virtual ~Ellipsoid( void );
00050
00051 static PropertyPtr create( const XMLNodePtr & xml = XMLNodePtr() );
00052 virtual void createProperties( void );
00053 virtual const string getTypeName( bool ofComponent = false ) const;
00054
00055 virtual void onInitialize( void );
00056 virtual Mat4 findSurfaceGlobal( const Vec3 & global, int iterations = 10 ) const;
00057 virtual Mat4 findSurfaceLocal( const Vec3 & local, int iterations = 10 ) const;
00058 EllipsoidType getEllipsoidType( void ) const;
00059 void setEllipsoidType( EllipsoidType t, bool send = true );
00060
00061 protected:
00062 EllipsoidType m_ellipsoidType;
00063 private:
00064 void ellipsoid( double u, double v, double n, double e, Vec3 & pos, Vec3 & nor );
00065 void solidEllipsoid();
00066 void solidEllipsoidWithUV();
00067 void solidEllipsoidLowRes( );
00068 double ellipsoidInsideOut( double x, double y, double z );
00069
00070 };
00071
00072 inline EnumList getEllipsoidTypeEnums( void ){
00073 EnumList r;
00074 r.push_back("SPHERE");
00075 r.push_back("CYLINDER");
00076 r.push_back("STAR");
00077 r.push_back("DOUBLEPYRAMID");
00078 r.push_back("PILLOW");
00079 r.push_back("ROUNDCUBE");
00080 r.push_back("CUSTOM");
00081 return( r );
00082 }
00083
00084 struct EllipsoidTypeStruct {
00085 EllipsoidTypeStruct( Ellipsoid::EllipsoidType * e = 0 ):
00086 m_value( e ){
00087 }
00088
00089 bool operator == ( const EllipsoidTypeStruct & v2 ){
00090 return( m_value == v2.m_value );
00091 }
00092 bool operator != ( const EllipsoidTypeStruct & v2 ){
00093 return( ! ( m_value == v2.m_value ) );
00094 }
00095 Ellipsoid::EllipsoidType operator [] ( const unsigned int i ){
00096 return( * m_value );
00097 }
00098 Ellipsoid::EllipsoidType * m_value;
00099 };
00100
00101
00102 inline ostream & operator << ( ostream & s, const EllipsoidTypeStruct & v ){
00103 switch( * v.m_value ){
00104 case Ellipsoid::SPHERE:
00105 s << string( "SPHERE" );
00106 break;
00107 case Ellipsoid::CYLINDER:
00108 s << string( "CYLINDER" );
00109 break;
00110 case Ellipsoid::STAR:
00111 s << string( "STAR" );
00112 break;
00113 case Ellipsoid::DOUBLEPYRAMID:
00114 s << string( "DOUBLEPYRAMID" );
00115 break;
00116 case Ellipsoid::PILLOW:
00117 s << string( "PILLOW" );
00118 break;
00119 case Ellipsoid::ROUNDCUBE:
00120 s << string( "ROUNDCUBE" );
00121 break;
00122 case Ellipsoid::CUSTOM:
00123 s << string( "CUSTOM" );
00124 break;
00125 }
00126 return( s );
00127 }
00128
00129 inline istream & operator >> ( istream & s, EllipsoidTypeStruct & v ){
00130 string value;
00131 s >> value;
00132
00133 if( value == "SPHERE" ){
00134 * v.m_value = Ellipsoid::SPHERE;
00135 }
00136 else if( value == "CYLINDER" ){
00137 * v.m_value = Ellipsoid::CYLINDER;
00138 }
00139 else if( value == "STAR" ){
00140 * v.m_value = Ellipsoid::STAR;
00141 }
00142 else if( value == "DOUBLEPYRAMID" ){
00143 * v.m_value = Ellipsoid::DOUBLEPYRAMID;
00144 }
00145 else if( value == "PILLOW" ){
00146 * v.m_value = Ellipsoid::PILLOW;
00147 }
00148 else if( value == "ROUNDCUBE" ){
00149 * v.m_value = Ellipsoid::ROUNDCUBE;
00150 }
00151 else if( value == "CUSTOM" ){
00152 * v.m_value = Ellipsoid::CUSTOM;
00153 }
00154
00155 return( s );
00156 }
00157
00158
00159 };
00160
00161
00162 #endif