00001 #include "Circle.h"
00002 #include "Vertexbuffer.h"
00003 #include "Program.h"
00004 #include "Stateset.h"
00005 #include "Sampler.h"
00006
00007 namespace RenderTools {
00008
00009 Circle::Circle( void ):
00010 Rendernode( ),
00011 m_begin( 0.0f ),
00012 m_end( 360.0f ),
00013 m_subdiv( 16 ){
00014
00015 }
00016
00017 PropertyPtr Circle::create( const XMLNodePtr & xml ){
00018 CirclePtr p( new Circle() );
00019 p->setName( xml );
00020 p->createProperties();
00021 p->setProperties( xml, false );
00022 return( dynamic_pointer_cast< AbstractProperty, Circle >( p ) );
00023 }
00024
00025 void Circle::createProperties( void ){
00026 Rendernode::createProperties();
00027 createProperty( this, "subdivision", & m_subdiv );
00028 createProperty( this, "beginDegree", & m_begin );
00029 createProperty( this, "endDegree", & m_end );
00030 }
00031
00032 const string Circle::getTypeName( bool ofComponent ) const {
00033 return( "Circle" );
00034 }
00035
00036 Circle::~Circle( void ){
00037 }
00038
00039 void Circle::onInitialize( void ){
00040
00041 Rendernode::removeVertexBuffers( false );
00042
00043 VertexbufferPtr buffer( new Vertexbuffer() );
00044 buffer->addAttribute( 3, "vertex" );
00045 buffer->addAttribute( 2, "texcoord" );
00046 buffer->addAttribute( 3, "normal" );
00047 buffer->setUsage( GL_STATIC_DRAW );
00048 buffer->setMode( GL_TRIANGLE_FAN );
00049 buffer->setNumVertices( 1 + m_subdiv );
00050 buffer->initialize();
00051
00052 Vec3 ctr;
00053 Vec2 tex( 0.5f );
00054 Vec3 nor( 0.0f, 0.0f, 1.0f );
00055
00056 buffer->setVertexAttribute( 0, 0, * ctr );
00057 buffer->setVertexAttribute( 0, 1, * tex );
00058 buffer->setVertexAttribute( 0, 2, * nor );
00059
00060 float begin = m_begin / 360.0f;
00061 float end = m_end / 360.0f;
00062
00063 for( unsigned int i = 1; i <= m_subdiv; i++ ){
00064 float f = begin + ( (float)( i - 1 ) / (float)( m_subdiv - 1 ) ) * ( end - begin ) * 2.0f * M_PI;
00065
00066 ctr[ 0 ] = cos( f );
00067 ctr[ 1 ] = sin( f );
00068
00069 tex[ 0 ] = cos( f );
00070 tex[ 1 ] = sin( f );
00071
00072 nor[ 0 ] = 0.0f;
00073 nor[ 1 ] = 0.0f;
00074 nor[ 1 ] = 1.0f;
00075
00076 buffer->setVertexAttribute( i, 0, * ctr );
00077 buffer->setVertexAttribute( i, 1, * tex );
00078 buffer->setVertexAttribute( i, 2, * nor );
00079 }
00080
00081 addVertexBuffer( buffer );
00082
00083 Error::assertNoErrors( __FILE__, __LINE__ );
00084 }
00085
00086 unsigned int Circle::getSubdivision( void ) {
00087 return( m_subdiv );
00088 }
00089
00090 void Circle::setSubdivision( unsigned int subdiv, bool send ){
00091 m_subdiv = subdiv;
00092 sendPropertyEvent( PropertyEvent( PropertyEvent::CHANGED, findProperty( & m_subdiv ) ) );
00093 }
00094
00095 float Circle::getBegin( void ) {
00096 return( m_begin );
00097 }
00098
00099 void Circle::setBegin( float degrees, bool send ){
00100 m_begin = degrees;
00101 sendPropertyEvent( PropertyEvent( PropertyEvent::CHANGED, findProperty( & m_begin ) ) );
00102 }
00103
00104 float Circle::getEnd( void ) {
00105 return( m_end );
00106 }
00107
00108 void Circle::setEnd( float degrees, bool send ){
00109 m_end = degrees;
00110 sendPropertyEvent( PropertyEvent( PropertyEvent::CHANGED, findProperty( & m_end ) ) );
00111 }
00112
00113
00114 };