static void gInitiallyPlaceViewer() { // TBD /* const CGameInfo& gi = CGameInfo::getInstance(); const CGameMap& gmap = gi.getGameMap(); const CGameReplay& replay = gi.getReplay(); const CLevelMesh& level = gi.getLevelMesh(); const CReplayEntity::SState& pl1st = replay.getEntity( replay.getPlayer(0).entityAI ).getTurnState( 0 ); int posx = pl1st.posx; int posy = pl1st.posy; const int XOFF[4] = { 2, 2, -2, -2 }; const int YOFF[4] = { 2, -2, 2, -2 }; const float ROT[4] = { D3DX_PI/4*7, D3DX_PI/4*5, D3DX_PI/4*1, D3DX_PI/4*3 }; */ gViewer.identify(); /* gViewer.getOrigin().set( posx, VIEWER_Y, -posy ); for( int i = 0; i < 4; ++i ) { int px = posx+XOFF[i]; int py = posy+YOFF[i]; //if( gmap.isBlood( gmap.getCell(px,py).type ) ) { if( !level.collideSphere( SVector3(px,VIEWER_Y,-py), VIEWER_R ) ) { D3DXMatrixRotationY( &gViewer, ROT[i] ); gViewer.getOrigin().set( px, VIEWER_Y, -py ); break; } } */ gLastViewerValidPos = gViewer.getOrigin(); gViewerVel.set(0,0,0); gViewerZVel.set(0,0,0); }
void CDemo::initialize( IDingusAppContext& appContext ) { gAppContext = &appContext; CSharedTextureBundle& stb = CSharedTextureBundle::getInstance(); CSharedSurfaceBundle& ssb = CSharedSurfaceBundle::getInstance(); CD3DDevice& dx = CD3DDevice::getInstance(); G_INPUTCTX->addListener( *this ); // -------------------------------- // common params stb.registerTexture( RT_SHADOW, *new CFixedTextureCreator( SZ_SHADOW, SZ_SHADOW, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT ) ); stb.registerTexture( RT_SHADOWBLUR, *new CFixedTextureCreator( SZ_SHADOW, SZ_SHADOW, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT ) ); ssb.registerSurface( RT_SHADOW, *new CTextureLevelSurfaceCreator(*RGET_S_TEX(RT_SHADOW),0) ); ssb.registerSurface( RT_SHADOWBLUR, *new CTextureLevelSurfaceCreator(*RGET_S_TEX(RT_SHADOWBLUR),0) ); ssb.registerSurface( RT_SHADOWZ, *new CFixedSurfaceCreator( SZ_SHADOW, SZ_SHADOW, true, D3DFMT_D16 ) ); gGlobalCullMode = D3DCULL_CW; G_RENDERCTX->getGlobalParams().addIntRef( "iCull", &gGlobalCullMode ); G_RENDERCTX->getGlobalParams().addFloatRef( "fTime", &gTimeParam ); G_RENDERCTX->getGlobalParams().addMatrix4x4Ref( "mShadowProj", gShadowProjMat ); G_RENDERCTX->getGlobalParams().addMatrix4x4Ref( "mViewTexProj", gViewTexProjMat ); // -------------------------------- // light gLightCam.mWorldMat.getAxisX().set( 1, 0, 0 ); gLightCam.mWorldMat.getAxisY().set( 0, 0, 1 ); gLightCam.mWorldMat.getAxisZ().set( 0,-1, 0 ); gLightCam.mWorldMat.getOrigin().set( 0, 9.0f, 0 ); gLightCam.setProjectionParams( D3DX_PI*0.5f, 1.0f, 0.1f, 20.0f ); // -------------------------------- // meshes gMeshBox = new CRenderableMesh( *RGET_MESH("Box"), 0 ); gMeshBox->getParams().setEffect( *RGET_FX("box") ); gMeshBox->getParams().addTexture( "tBase", *RGET_TEX("HellEdges") ); gMeshBox->getParams().addTexture( "tShadow", *RGET_S_TEX(RT_SHADOWBLUR) ); for( int i = 0; i < ENTITY_NAME_COUNT; ++i ) gAddEntity( i ); gTargetPos.set( 0, 0, 0 ); gTargetVel.set(0,0,0); // gauss X shadowmap -> shadowblur gQuadGaussX = new CRenderableMesh( *RGET_MESH("billboard"), 0, NULL, 0 ); gQuadGaussX->getParams().setEffect( *RGET_FX("filterGaussX") ); gQuadGaussX->getParams().addTexture( "tBase", *RGET_S_TEX(RT_SHADOW) ); // gauss Y shadowblur -> shadowmap gQuadGaussY = new CRenderableMesh( *RGET_MESH("billboard"), 0, NULL, 0 ); gQuadGaussY->getParams().setEffect( *RGET_FX("filterGaussY") ); gQuadGaussY->getParams().addTexture( "tBase", *RGET_S_TEX(RT_SHADOWBLUR) ); // blur shadowmap -> shadowblur gQuadBlur = new CRenderableMesh( *RGET_MESH("billboard"), 0, NULL, 0 ); gQuadBlur->getParams().setEffect( *RGET_FX("filterPoisson") ); gQuadBlur->getParams().addTexture( "tBase", *RGET_S_TEX(RT_SHADOW) ); // -------------------------------- // GUI gUIDlgHUD = new CUIDialog(); gUIDlgHUD->setCallback( gUICallback ); const int hctl = 16; const int hrol = 14; // fps { gUIDlgHUD->addStatic( 0, "(wait)", 5, 460, 200, 20, false, &gUIFPS ); } // zoom { gUIDlgHUD->addStatic( 0, "yaw ", 210, 5, 40, hctl ); gUIDlgHUD->addSlider( 0, 250, 5, 100, hctl, -180, 180, 10, false, &gUISliderYaw ); gUIDlgHUD->addStatic( 0, "ptch", 210, 25, 40, hctl ); gUIDlgHUD->addSlider( 0, 250, 25, 100, hctl, 0, 90, 5, false, &gUISliderPitch ); gUIDlgHUD->addStatic( 0, "zoom", 210, 45, 40, hctl ); gUIDlgHUD->addSlider( 0, 250, 45, 100, hctl, 5, 20, 6, false, &gUISliderZoom ); } // { gUIDlgHUD->addCheckBox( 0, "Preblur shadows", 5, 50, 100, 20, true, 0, false, &gUIChkDilate ); } }
/** * Main loop code. */ void CDemo::perform() { char buf[100]; time_value tmv = CSystemTimer::getInstance().getTime(); double t = tmv.tosec(); float dt = CSystemTimer::getInstance().getDeltaTimeS(); gTimeParam = float(t); CDynamicVBManager::getInstance().discard(); CD3DDevice& dx = CD3DDevice::getInstance(); gScreenFixUVs.set( 0.5f/dx.getBackBufferWidth(), 0.5f/dx.getBackBufferHeight(), 0.0f, 0.0f ); CGameInfo& gi = CGameInfo::getInstance(); const CGameDesc& desc = gi.getGameDesc(); CGameState& state = gi.getState(); const CGameMap& gmap = desc.getMap(); // // should we still perform some initialization steps? if( !gInitGuiDone ) { // perform multi-step initialization... const char* initStepName = NULL; if( !gInitMainStarted ) { BEGIN_T(); initStepName = gi.initBegin(); gInitMainStarted = true; } else if( !gInitMainDone ) { initStepName = gi.initStep(); if( !initStepName ) { initStepName = "Initializing GUI..."; gInitMainDone = true; } } else { gInitiallyPlaceViewer(); gSetupGUI(); gInitGuiDone = true; END_T( "initialization" ); return; } // check for init errors... if( !gErrorMsg.empty() ) { CONS << "Fatal error: " << gErrorMsg << endl; gFinished = true; return; } if( initStepName ) { CONS << "Init step: " << initStepName << endl; } // render progress assert( initStepName ); dx.clearTargets( true, true, true, 0xFF000000, 1.0f, 0L ); dx.sceneBegin(); G_RENDERCTX->applyGlobalEffect(); gUIDlg->renderBegin(); gUIDrawLogo(); gUIDrawProgress( initStepName ); gUIDlg->renderEnd(); dx.sceneEnd(); return; } // // fatal error if( gCheckFatalError() ) return; // // check if settings dialog just was closed if( gSettingsDlgWasActive && gUISettingsDlg->getState() != CDemoSettingsDialog::STATE_ACTIVE ) { gSettingsDlgWasActive = false; gUIDlg->getCheckBox( GID_CHK_OPTIONS )->setChecked( false ); if( gUISettingsDlg->getState() == CDemoSettingsDialog::STATE_OK ) { // apply settings, return if( gAppSettings.gfxDetail != gUISettingsDlg->getAppSettings().gfxDetail ) { gi.getLevelMesh().updateDetailLevel( gUISettingsDlg->getAppSettings().gfxDetail ); } gAppSettings = gUISettingsDlg->getAppSettings(); CD3DSettings d3dset; gUISettingsDlg->getFinalSettings( d3dset ); // don't apply d3d settings if they didn't change if( d3dset != gAppContext->getD3DSettings() ) gAppContext->applyD3DSettings( d3dset ); return; } } else if( gSettingsDlgWasActive ) { // if the dialog is active, but the d3d settings just changed (eg. alt-tab), // hide it and re-show it if( gSettingsAtDlgStart != gAppContext->getD3DSettings() ) { gUISettingsDlg->hideDialog(); gSettingsAtDlgStart = gAppContext->getD3DSettings(); gUISettingsDlg->showDialog( gSettingsAtDlgStart ); } } // // check if help dialog just was closed if( gHelpDlgWasActive && !gUIHelpDlg->isActive() ) { gHelpDlgWasActive = false; gUIDlg->getCheckBox( GID_CHK_HELP )->setChecked( false ); } bool gameSetupActive = (gUIGameSetupDlg->getState() == CGameSetupDialog::STATE_ACTIVE); bool insideView = gAppSettings.followMode && !gameSetupActive; // // perform input G_INPUTCTX->perform(); // // update game if it's started if( gameSetupActive ) { gUILabelTime->setVisible( false ); } else { // if server state is starting, update it if( state.getServerState().state == GST_STARTING ) { gUILabelTime->setVisible( false ); state.updateServerState( false, false ); } else { gUILabelTime->setVisible( true ); // update game state if( tmv - gLastGameUpdateTime >= time_value::fromsec(desc.getTurnDT()*0.5f) ) { // TBD: commands to dll net::updateGame( 0, 0, 0, state ); gLastGameUpdateTime = tmv; } } } // // control time // TBD /* float gameTime = gi.getTime(); float oldGameTime = gameTime; if( gUIBtnTimeRew->isPressed() ) gameTime -= TURNS_PER_SEC * TIME_SPD_FAST * dt; if( gUIBtnTimeFfwd->isPressed() ) gameTime += TURNS_PER_SEC * TIME_SPD_FAST * dt; if( gameTime != oldGameTime ) gSetPlayMode( false ); if( gPlayMode ) gameTime += TURNS_PER_SEC * TIME_SPD_NORMAL * dt; if( gameTime < 0 ) gameTime = 0; if( gameTime > replay.getGameTurnCount()-1 ) { gameTime = replay.getGameTurnCount()-1; gSetPlayMode( false ); } gUIDlg->enableNonUserEvents( false ); gUISliderTime->setValue( gameTime ); gUIDlg->enableNonUserEvents( true ); gi.setTime( gameTime ); */ // // camera int selEntityID = gi.getEntities().getSelectedEntityID(); const CActorEntity* selEntity = gi.getEntities().getActorEntityByID( selEntityID ); bool hasSelected = (selEntity != NULL); if( hasSelected ) { SVector3 selPos = selEntity->mWorldMat.getOrigin(); if( !gAppSettings.followMode ) { selPos.y = VIEWER_Y; SVector3 newPos = smoothCD( gViewer.getOrigin(), selPos, gViewerVel, 0.25f, dt ); gTryPositionViewer( newPos, selPos ); } else { //SVector3 selPrevPos = selEntity.samplePos( gi.getTime() - 10.0f ); // TBD SVector3 selPrevPos = selPos; selPrevPos.y = (selPrevPos.y + VIEWER_Y)*0.5f; selPos.y = selPrevPos.y; SVector3 dirZ = selPos - selPrevPos; dirZ.y = 0.0f; const float MIN_DIST = 2.0f; if( dirZ.lengthSq() < MIN_DIST*MIN_DIST ) { dirZ = gViewer.getAxisZ(); selPrevPos = selPrevPos - dirZ * MIN_DIST; } const float PREF_DIST = 5.0f; if( dirZ.lengthSq() < PREF_DIST*PREF_DIST ) { dirZ.normalize(); selPrevPos = selPos - dirZ * PREF_DIST; } else { dirZ.normalize(); } const float SMOOTHT = 0.5f; SVector3 newPos = smoothCD( gViewer.getOrigin(), selPrevPos, gViewerVel, SMOOTHT, dt ); gTryPositionViewer( newPos, selPrevPos ); dirZ = smoothCD( gViewer.getAxisZ(), dirZ, gViewerZVel, SMOOTHT, dt ); if( dirZ.lengthSq() < 0.5f ) { dirZ = gViewer.getAxisZ(); } else { gViewer.getAxisZ() = dirZ.getNormalized(); } gViewer.getAxisY().set(0,1,0); gViewer.getAxisX() = gViewer.getAxisY().cross( gViewer.getAxisZ() ); } } else { gViewerVel.set(0,0,0); gViewerZVel.set(0,0,0); } // // check if current viewer's position is valid { SVector3 testViewerPos = gViewer.getOrigin(); int cx = testViewerPos.x; int cy = -testViewerPos.z; if( cx >= 0 && cy >= 0 && cx < gmap.getCellsX() && cy < gmap.getCellsY() && gmap.isBlood( gmap.getCell(cx,cy).type ) ) { gi.getLevelMesh().fitSphere( testViewerPos, VIEWER_R*2.0f ); const float SMALL_FIT = 0.2f; if( SVector3(testViewerPos - gViewer.getOrigin()).lengthSq() < SMALL_FIT * SMALL_FIT ) { gLastViewerValidPos = testViewerPos; } } } SMatrix4x4& mm = gCamera.mWorldMat; mm = gViewer; float camnear, camfar, camfov, fognear, fogfar; if( !insideView ) { float tilt = gAppSettings.megaTilt; float zoom = gAppSettings.megaZoom; if( gameSetupActive ) { gUIGameSetupDlg->updateViewer( gViewer, tilt, zoom ); } SMatrix4x4 mr; D3DXMatrixRotationX( &mr, D3DXToRadian( tilt ) ); mm = mr * mm; mm.getOrigin() -= mm.getAxisZ() * zoom; camnear = (zoom - 15.0f) * 0.25f; camfar = (zoom + 10.0f) * 2.5f; camfov = D3DX_PI/3; fognear = (zoom + 10.0f) * 2.0f; fogfar = (zoom + 10.0f) * 2.3f; gFogColorParam.set( 0, 0, 0, 1 ); } else { camnear = 0.3f; camfar = 60.0f; camfov = D3DX_PI/4; fognear = 20.0f; fogfar = camfar-1; gFogColorParam.set( 0.25f, 0, 0, 1 ); } if( camnear < 0.1f ) camnear = 0.1f; gCamera.setProjectionParams( camfov, dx.getBackBufferAspect(), camnear, camfar ); gCamera.setOntoRenderContext(); // // update entities and stats UI gMouseRay = gCamera.getWorldRay( gMouseX, gMouseY ); const SVector3& eyePos = gCamera.mWorldMat.getOrigin(); SLine3 mouseRay; mouseRay.pos = eyePos; mouseRay.vec = gMouseRay; float timeAlpha = (tmv - gi.getState().getTurnReceivedTime()).tosec() / desc.getTurnDT(); if( timeAlpha >= 1.0f ) timeAlpha = 1.0f; gi.getEntities().update( mouseRay, timeAlpha ); // stats UI int nplayers = desc.getPlayerCount(); for( int p = 0; p < nplayers; ++p ) { const CGameState::SPlayer& pl = state.getPlayer(p); SUIPlayerStats& plui = gUIPlayerStats[p]; if( plui.score ) { itoa( pl.score, buf, 10 ); plui.score->setText( buf ); } if( plui.botCount ) { itoa( pl.botCount, buf, 10 ); plui.botCount->setText( buf ); } } // entity stats UI gUpdateSelEntityStats(); gUpdateMissionStats(); // time UI sprintf( buf, "%i", state.getTurn() ); gUILabelTime->setText( buf ); sprintf( buf, "fps: %.1f", dx.getStats().getFPS() ); gUILabelFPS->setText( buf ); gFogParam.set( fognear, fogfar, 1.0f/(fogfar-fognear), 0 ); dx.clearTargets( true, true, true, insideView ? 0xFF400000 : 0xFF000000, 1.0f, insideView ? 1L : 0L ); dx.sceneBegin(); G_RENDERCTX->applyGlobalEffect(); gi.getLevelMesh().render( RM_NORMAL, insideView ? (CLevelMesh::FULL) : (CLevelMesh::NOTOP) ); gi.getPointsMesh().render( RM_NORMAL ); gi.getEntities().render( RM_NORMAL, !insideView, insideView, timeAlpha ); G_RENDERCTX->perform(); // render GUI if( !gameSetupActive ) { gUIDlg->onRender( dt ); } // render minimap if( gAppSettings.showMinimap && !gameSetupActive ) gRenderMinimap(); // render GUI #2 if( gUISettingsDlg->getState() == CDemoSettingsDialog::STATE_ACTIVE ) { gUISettingsDlg->getDialog().onRender( dt ); } if( gUIHelpDlg->isActive() ) { gUIHelpDlg->getDialog().onRender( dt ); } if( gUIGameSetupDlg->getState() == CGameSetupDialog::STATE_ACTIVE ) { gUIGameSetupDlg->getDialog().onRender( dt ); } dx.sceneEnd(); }