38 #include "laStagesJR.h"
45 _nCrSeg = _nColDomains = 0;
46 _pCrSeg = _pColFirstSeg = _pDrawFirstSeg = NULL;
47 _pColFirstDomain = NULL;
52 _dCamRotSpeed = M_CAMERA_ROT_SPEED;
53 _dCamRotMul = M_CAMERA_ROT_MUL;
54 _dCamDirAngle = M_CAMERA_DIRECTIONAL_ANGLE;
55 _dCamLimit = M_CAMERA_LIMIT;
58 stageJR::~stageJR(
void) {
61 void stageJR::onInit() {
67 void stageJR::onActivate() {
68 ASSERT(_pGame,
"Nil game object");
70 laSystemIntegrator::getEnvironment()->setTitle(M_JRTITLE_STRING);
73 _pGame->pMusicLoop->play();
76 void stageJR::onDeactivate()
79 _pCrSeg = _pColFirstSeg = NULL;
83 void stageJR::onFini() {
95 ASSERT(_pGame,
"Nil game object");
99 static char strTitle[128];
100 sprintf( strTitle,
"%s - %.1f fps", M_JRTITLE_STRING, pt->fps_sampled() );
101 laSystemIntegrator::getEnvironment()->setTitle(strTitle);
106 _pGame->level.drawSky(pr);
110 _setup_3d_camera(pr, pt);
117 pr->styleSet(laColor(255,255,255));
126 void stageJR::_setup_3d_camera(
laRenderer *pr, laTimer *pt)
128 PROFILE(stageJRMenu__setup_3d_camera);
130 double x = _pGame->level.getPlayer()->getPivot()->x();
131 double dCamAngY_target = _pGame->level.terrainAngle_atPixel( x );
133 int nDir = _pGame->level.getPlayer()->getFaceDirection() * (-1);
134 dCamAngY_target += nDir*_dCamDirAngle;
135 dCamAngY_target = M_CLAMP(-1*_dCamLimit, _dCamLimit, dCamAngY_target);
137 if( dCamAngY_target > _dCamAngY + 1) _dCamAngY += pt->delta() * _dCamRotSpeed;
138 if( dCamAngY_target < _dCamAngY - 1) _dCamAngY -= pt->delta() * _dCamRotSpeed;
140 double dCamAngX = 20;
145 laPoint3(dCamAngX, _dCamAngY*_dCamRotMul) );
147 _pGame->level.scroll( _pGame->level.getPlayer()->getPosition() );
152 void stageJR::_draw_level(
laRenderer *pr, laTimer *pt) {
153 PROFILE(stageJR__draw_level);
154 _pGame->level.draw(pr, _pDrawFirstSeg, M_SEGMENT_RENDER_MARGIN + M_SEGMENT_RENDER_MARGIN + 1);
161 PROFILE(stageJR__animate_Dynamics);
162 ::laSystemIntegrator::getRenderer()->modeLight(M_FALSE);
163 ::laSystemIntegrator::getRenderer()->modeTexture(M_FALSE);
165 unsigned nRange = _update_segment();
166 _pGame->level.animate(*pt, _pColFirstSeg, nRange);
171 unsigned stageJR::_update_segment()
173 PROFILE(stageJR__update_segment);
175 int nLeft = M_SEGMENT_ANIMATE_MARGIN, nRight = M_SEGMENT_ANIMATE_MARGIN;
177 laPlayer *pPlayer = _pGame->level.getPlayer();
178 int nCrSeg = _pGame->level.segmentIndex( pPlayer->getPosition().x() );
180 if( (nCrSeg != _nCrSeg) || (!_pCrSeg) )
183 _pCrSeg = _pGame->level.segmentAtIndex(nCrSeg);
184 ASSERT(_pCrSeg,
"Nil current segment");
186 _pColFirstSeg = _pGame->level.segmentAtIndex(nCrSeg - nLeft);
187 ASSERT(_pColFirstSeg,
"Nil first col segment");
188 _pColFirstDomain = _pColFirstSeg->firstNonemptyDomain();
189 ASSERT(_pColFirstDomain,
"Nil first domain");
190 _nColDomains = _pColFirstSeg->countDomains(nLeft + nRight + 1);
192 _pDrawFirstSeg = _pGame->level.segmentAtIndex(nCrSeg - M_SEGMENT_RENDER_MARGIN);
193 ASSERT(_pDrawFirstSeg,
"Nil first draw segment");
196 laPivot::colliderRange(_pColFirstDomain, _nColDomains);
199 return nLeft + nRight + 1;
#define M_UNIT
Unit of 1 meter.
Virtual interface for the Engine graphics renderer.
virtual void modeInterface()=0
Switch to interface rendering (2D projection mode)
virtual void modeWorld(const laPoint3 &pos, const laPoint3 &ang=laPoint3())=0
Switch to "world rendering" (3D projection mode)