00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #pragma once
00013
00015 #include "nvsgcommon.h"
00016
00017 #include "nvsg/Scene.h"
00018 #include "nvsg/ViewState.h"
00019 #include "nvtraverser/AppTraverser.h"
00020 #include "nvtraverser/CullTraverser.h"
00021 #include "nvtraverser/RenderTraverser.h"
00022 #include "nvui/CameraManipulator.h"
00023
00024 #include <vector>
00025
00026 namespace nvui
00027 {
00029
00033 class RenderArea
00034 {
00035 public:
00036
00038 NVSG_API virtual ~RenderArea(void);
00039
00041
00043 NVSG_API virtual bool init( RenderArea * shareArea = NULL
00044 );
00045
00047
00048 NVSG_API virtual void destroy( void );
00049
00051
00052 NVSG_API virtual void keyDown( UINT key
00053 , bool keyRepeated = false
00054 );
00056
00057 NVSG_API virtual void keyUp( UINT key
00058 );
00059
00061
00062 NVSG_API virtual void resetKeyState( void );
00063
00065
00066 NVSG_API virtual void mouseButtonDown( UINT btn
00067 , int x
00068 , int y
00069 );
00071
00072 NVSG_API virtual void mouseButtonUp( UINT btn
00073 , int x
00074 , int y
00075 );
00077
00078 NVSG_API virtual void resetButtonState( void );
00079
00081
00082 NVSG_API virtual void mouseMotion( int x
00083 , int y
00084 );
00085
00087
00090 NVSG_API virtual void renderScene( void );
00091
00093
00095 NVSG_API virtual void setViewportSize( size_t width
00096 , size_t height
00097 );
00098
00100
00106 NVSG_API bool pickCameraTargetPoint( int x
00107 , int y
00108 );
00109
00111
00114 NVSG_API nvtraverser::RenderTraverser * getRenderTraverser( void ) const;
00115
00117
00121 NVSG_API void setRenderTraverser( nvtraverser::RenderTraverser * tr
00122 );
00123
00125
00127 NVSG_API void setAppTraverser( nvtraverser::AppTraverser * tr
00128 );
00129
00131
00132 NVSG_API nvtraverser::AppTraverser * getAppTraverser() const;
00133
00135
00140 NVSG_API void pushCullTraverser( nvtraverser::CullTraverser * tr
00141 );
00142
00144
00146 NVSG_API void popCullTraverser();
00147
00149
00150 NVSG_API size_t getNumberOfCullTraverser() const;
00151
00153
00157 NVSG_API nvtraverser::CullTraverser * getCullTraverser(size_t position) const;
00158
00160
00161 NVSG_API const nvsg::ViewState * getViewState( void ) const;
00162
00164
00166 NVSG_API void setViewState( const nvsg::ViewState * viewState );
00167
00169
00171 NVSG_API float getAspectRatio( void ) const;
00172
00174
00176 NVSG_API bool isStereoAvailable( void );
00177
00179
00180 NVSG_API void requestFSAA( bool bOn
00181 , unsigned int numBuffers
00182 );
00184
00185 NVSG_API void requestStereoSupport( bool bStereo
00186 );
00187
00189
00202 NVSG_API void setSceneData( nvui::CameraManipulator * pCamManip
00203 , const nvsg::Scene * pScene
00204 , const nvsg::ViewState * pViewState = NULL
00206 );
00207
00208 NVSG_API static size_t createNewRenderAreaID();
00209
00211
00213 NVSG_API virtual void triggerRedraw( void );
00214
00215 protected:
00217 NVSG_API RenderArea(void);
00218
00220 enum
00221 { _UNDEFINED = 0x00000000
00222 , _STEREO = 0x00000001
00223 , _MULTISAMPLE = 0x00000002
00224 };
00225
00226 std::vector<nvtraverser::CullTraverser *> m_cullTraverser;
00227 nvtraverser::RenderTraverser * m_renderTraverser;
00228 nvtraverser::AppTraverser * m_appTraverser;
00229
00230 CameraManipulator * m_camManip;
00231
00232
00233 const nvsg::Scene * m_scene;
00234 const nvsg::ViewState * m_viewState;
00235
00236 unsigned long m_features;
00237 UINT m_numMSBuffers;
00238 bool m_raCreated;
00239 size_t m_raHeight;
00240 size_t m_raWidth;
00241
00242 static size_t m_idRenderArea;
00243
00244
00245
00246 };
00247
00248
00249
00250
00251
00252 inline float RenderArea::getAspectRatio( void ) const
00253 {
00254 __ASSERT( m_raHeight > 0 && m_raWidth > 0 );
00255
00256 if (m_raHeight > 0 && m_raWidth > 0)
00257 {
00258 return( (float) m_raWidth / m_raHeight );
00259 }
00260
00261 return 0.f;
00262 }
00263
00264 inline const nvsg::ViewState * RenderArea::getViewState( void ) const
00265 {
00266 return( m_viewState );
00267 }
00268
00269 inline void RenderArea::triggerRedraw()
00270 {
00271 if (m_camManip)
00272 {
00273 m_camManip->apply();
00274 }
00275 }
00276
00277 inline nvtraverser::RenderTraverser * RenderArea::getRenderTraverser( void ) const
00278 {
00279 return( m_renderTraverser );
00280 }
00281
00282 inline void RenderArea::setRenderTraverser( nvtraverser::RenderTraverser * tr )
00283 {
00284 if (m_renderTraverser)
00285 {
00286 m_renderTraverser->removeRef();
00287 }
00288
00289 m_renderTraverser = tr;
00290
00291 if (m_renderTraverser)
00292 {
00293 m_renderTraverser->addRef();
00294 }
00295 }
00296
00297 inline void RenderArea::setAppTraverser(nvtraverser::AppTraverser * tr)
00298 {
00299 if (m_appTraverser)
00300 {
00301 m_appTraverser->removeRef();
00302 }
00303
00304 m_appTraverser = tr;
00305
00306 if (m_appTraverser)
00307 {
00308 m_appTraverser->addRef();
00309 }
00310 }
00311
00312 inline nvtraverser::AppTraverser * RenderArea::getAppTraverser() const
00313 {
00314 return m_appTraverser;
00315 }
00316
00317 inline void RenderArea::pushCullTraverser(nvtraverser::CullTraverser * tr)
00318 {
00319 __ASSERT(tr);
00320
00321 m_cullTraverser.push_back(tr);
00322 tr->addRef();
00323 }
00324
00325 inline void RenderArea::popCullTraverser()
00326 {
00327 __ASSERT(!m_cullTraverser.empty());
00328
00329 m_cullTraverser.back()->removeRef();
00330 m_cullTraverser.pop_back();
00331 }
00332
00333 inline size_t RenderArea::getNumberOfCullTraverser() const
00334 {
00335 return m_cullTraverser.size();
00336 }
00337
00338 inline nvtraverser::CullTraverser * RenderArea::getCullTraverser(size_t position) const
00339 {
00340 __ASSERT(m_cullTraverser.size() > position);
00341
00342 return m_cullTraverser[position];
00343 }
00344
00345 inline size_t RenderArea::createNewRenderAreaID()
00346 {
00347 return (++m_idRenderArea);
00348 }
00349
00350 }