00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "discsectionrenderercomponent.h"
00021
00022 #include "graphics/meshes/discsectionmesh.h"
00023 #include "graphics/item.h"
00024 #include "engine/gameobject.h"
00025 #include "engine/asset.h"
00026
00027 #include <QMimeData>
00028
00029 #include <cmath>
00030
00031 REGISTER_OBJECTTYPE( GluonEngine, DiscSectionRendererComponent )
00032
00033 using namespace GluonEngine;
00034
00035 class DiscSectionRendererComponent::DiscSectionRendererComponentPrivate
00036 {
00037 public:
00038 DiscSectionRendererComponentPrivate()
00039 {
00040 item = 0;
00041 mesh = 0;
00042 texture = 0;
00043 nbPoints = 3;
00044 radius = 5.0f;
00045 degrees = 90.0f;
00046 arcCenter = M_PI / 2.0f;
00047 color.setRgb( 255, 255, 255 );
00048 }
00049
00050 GluonGraphics::Item* item;
00051 GluonGraphics::DiscSectionMesh* mesh;
00052
00053 GluonEngine::Asset* texture;
00054
00055 uint nbPoints;
00056 float radius;
00057 float degrees;
00058 float arcCenter;
00059 QColor color;
00060 };
00061
00062 DiscSectionRendererComponent::DiscSectionRendererComponent( QObject* parent )
00063 : Component( parent )
00064 , d( new DiscSectionRendererComponentPrivate )
00065 {
00066
00067 }
00068
00069 DiscSectionRendererComponent::DiscSectionRendererComponent( const DiscSectionRendererComponent& other )
00070 : Component( other )
00071 , d( other.d )
00072 {
00073 }
00074
00075 DiscSectionRendererComponent::~DiscSectionRendererComponent()
00076 {
00077 delete d;
00078 }
00079
00080 QString
00081 DiscSectionRendererComponent::category() const
00082 {
00083 return QString( "Graphics Rendering" );
00084 }
00085
00086 void DiscSectionRendererComponent::initialize()
00087 {
00088 if( !d->item )
00089 {
00090 d->mesh = new GluonGraphics::DiscSectionMesh( gameObject()->position(), d->radius, d->nbPoints, d->degrees, d->arcCenter, d->color, this );
00091 d->item = new GluonGraphics::Item( d->mesh, this );
00092 d->item->setColor( d->color );
00093 }
00094
00095 if( d->texture )
00096 {
00097 if( !d->texture->isLoaded() )
00098 d->texture->load();
00099
00100 const QMimeData* data = d->texture->data();
00101 if( data->hasImage() )
00102 {
00103 d->mesh->setTexture( data->imageData().value<QImage>() );
00104 }
00105 }
00106 }
00107
00108 void DiscSectionRendererComponent::start()
00109 {
00110 }
00111
00112 void DiscSectionRendererComponent::draw( int timeLapse )
00113 {
00114 Q_UNUSED( timeLapse )
00115
00116 if( d->item )
00117 {
00118 d->item->setMatrix( gameObject()->transform() );
00119 }
00120 }
00121
00122 void DiscSectionRendererComponent::cleanup()
00123 {
00124 if( d->item )
00125 {
00126 delete d->item;
00127 d->item = 0;
00128 d->mesh = 0;
00129 }
00130 }
00131
00132 float DiscSectionRendererComponent::radius()
00133 {
00134 return d->radius;
00135 }
00136
00137 void DiscSectionRendererComponent::setRadius( float newRadius )
00138 {
00139 d->radius = newRadius;
00140 if( gameObject() )
00141 setDiscSection( gameObject()->position(), d->radius, d->nbPoints, d->degrees, d->arcCenter, d->color );
00142 }
00143
00144 uint DiscSectionRendererComponent::nbPoints()
00145 {
00146 return d->nbPoints;
00147 }
00148
00149 void DiscSectionRendererComponent::setNbPoints( uint newNbPoints )
00150 {
00151 d->nbPoints = newNbPoints;
00152 if( gameObject() )
00153 setDiscSection( gameObject()->position(), d->radius, d->nbPoints, d->degrees, d->arcCenter, d->color );
00154 }
00155
00156 void DiscSectionRendererComponent::setDiscSection( QVector3D position, float radius, uint nbPoints, float degrees, float arcCenter, QColor color )
00157 {
00158 if( d->mesh )
00159 d->mesh->setDiscSection( position, radius, nbPoints, degrees, arcCenter, color );
00160 }
00161
00162 float DiscSectionRendererComponent::degrees()
00163 {
00164 return d->degrees;
00165 }
00166
00167 void DiscSectionRendererComponent::setDegrees( float newDegrees )
00168 {
00169 if( newDegrees > 359.9f )
00170 {
00171 d->degrees = 359.9f;
00172 }
00173 else if( newDegrees == 0 )
00174 {
00175 d->degrees = 1;
00176 }
00177 else
00178 {
00179 d->degrees = newDegrees;
00180 }
00181
00182 if( gameObject() )
00183 setDiscSection( gameObject()->position(), d->radius, d->nbPoints, d->degrees, d->arcCenter, d->color );
00184 }
00185
00186 void DiscSectionRendererComponent::setColor( const QColor& color )
00187 {
00188 d->color = color;
00189 if( d->mesh )
00190 {
00191 d->mesh->setColor( color );
00192 }
00193 }
00194
00195 void DiscSectionRendererComponent::setColor( int r, int g, int b, int a )
00196 {
00197 setColor( QColor( r, g, b, a ) );
00198 }
00199
00200 QColor DiscSectionRendererComponent::color()
00201 {
00202 return d->color;
00203 }
00204
00205 Asset* DiscSectionRendererComponent::texture()
00206 {
00207 return d->texture;
00208 }
00209
00210 void DiscSectionRendererComponent::setTexture( Asset* asset )
00211 {
00212 d->texture = asset;
00213
00214 if( asset )
00215 {
00216 if( d->mesh && asset->isLoaded() )
00217 {
00218 d->mesh->setTexture( asset->data()->imageData().value<QImage>() );
00219 }
00220 }
00221 }
00222
00223 float DiscSectionRendererComponent::arcCenter()
00224 {
00225 return d->arcCenter * ( 180.0f / M_PI );
00226 }
00227
00228 void DiscSectionRendererComponent::setArcCenter( float newArcCenter )
00229 {
00230 if( newArcCenter > 359.9f )
00231 {
00232 newArcCenter = 359.9f;
00233 }
00234 else if( newArcCenter == 0 )
00235 {
00236 newArcCenter = 1;
00237 }
00238 else
00239 {
00240 newArcCenter = newArcCenter;
00241 }
00242
00243 d->arcCenter = newArcCenter * ( M_PI / 180.0f );
00244
00245 if( gameObject() )
00246 setDiscSection( gameObject()->position(), d->radius, d->nbPoints, d->degrees, d->arcCenter, d->color );
00247 }
00248
00249 Q_EXPORT_PLUGIN2( gluon_component_discsectionrenderer, GluonEngine::DiscSectionRendererComponent );
00250
00251 #include "discsectionrenderercomponent.moc"