// ------------------------------------------------------------------ // Name : get3DCoords // ------------------------------------------------------------------ Coords3D DisplayEngine::get3DCoords(CoordsScreen screenCoords, DisplayModeState modeState) { switch (modeState) { case DMS_2D: return Coords3D((double)screenCoords.x, (double)screenCoords.y, screenCoords.z); case DMS_3DCamIndependant: { if (m_pClientParams == NULL) return Coords3D(); Coords3D d3Coords(((double)screenCoords.x * X2X / (double)m_pClientParams->screenXSize) - M1X, ((double)screenCoords.y * X2Y / (double)m_pClientParams->screenYSize) - M1Y, screenCoords.z); // Coords3D d3Coords(((float)screenCoords.x * 2.0f / (float)m_pClientParams->screenXSize) - 1.0f, 1.0f - ((float)screenCoords.y * 2.0f / (float)m_pClientParams->screenYSize), screenCoords.z); return d3Coords; } case DMS_3D: default: { if (m_pClientParams == NULL) return Coords3D(); double fX = ((double)screenCoords.x * X2X / (double)m_pClientParams->screenXSize) - M1X; double fY = ((double)screenCoords.y * X2Y / (double)m_pClientParams->screenYSize) - M1Y; // float fX = ((float)screenCoords.x * 2.0f / (float)m_pClientParams->screenXSize) - 1.0f; // float fY = 1.0f - ((float)screenCoords.y * 2.0f / (float)m_pClientParams->screenYSize); Coords3D d3Coords(m_f3CamPos.x + fX * (screenCoords.z - m_f3CamPos.z) / NEARPLANE, m_f3CamPos.y + fY * (screenCoords.z - m_f3CamPos.z) / NEARPLANE, 0.0f); return d3Coords; } } }
// ----------------------------------------------------------------- // Name : displayObjects // ----------------------------------------------------------------- void Map::displayObjects(PlayerManager * pPlayerMngr) { DisplayEngine * pDisplay = m_pTombGeometry->getDisplay(); for (int x = 0; x < m_iWidth; x++) { for (int y = 0; y < m_iHeight; y++) { Coords3D pos3D = pDisplay->get3DCoords(CoordsMap(x, y), BOARDPLANE); MapObject * mapObj = m_pTiles[x][y]->getFirstMapObject(GOTYPE_TOWN); if (mapObj != NULL) mapObj->display(); mapObj = m_pTiles[x][y]->getFirstMapObject(GOTYPE_TEMPLE); if (mapObj != NULL) mapObj->display(); mapObj = m_pTiles[x][y]->getFirstMapObject(GOTYPE_DEAD_UNIT); if (mapObj != NULL) m_pTombGeometry->display(pos3D + Coords3D(0.6f, 0.1f), F_RGBA_NULL); mapObj = m_pTiles[x][y]->getFirstMapObject(GOTYPE_UNIT); if (mapObj != NULL) { mapObj->display(); Player * pPlayer = pPlayerMngr->findPlayer(mapObj->getOwner()); assert(pPlayer != NULL); pPlayer->m_pBannerGeometry->display(pos3D + Coords3D(0.7f, 0.0f), pPlayer->m_Color); } Player * pPlayer = pPlayerMngr->getActiveLocalPlayer(); if (pPlayer != NULL) { if (m_pTiles[x][y]->m_pNbAlliesGeo != NULL) { // float fy = 0.31f; if (m_pTiles[x][y]->m_pNbFoesGeo == NULL) { // fy = 0.62f; m_pCountUnitsBgGeometry1L->display(pos3D + Coords3D(-0.1f, 0.0f), F_RGBA_NULL); } else m_pCountUnitsBgGeometry2L->display(pos3D + Coords3D(-0.1f, 0.0f), F_RGBA_NULL); pPlayer->m_pBannerGeometry->display(pos3D + Coords3D(-0.1f, 0.0f), pPlayer->m_Color); m_pTiles[x][y]->m_pNbAlliesGeo->display(pos3D + Coords3D(0.15f, 0.0f), F_RGBA_NULL); } if (m_pTiles[x][y]->m_pNbFoesGeo != NULL) { float fy = 0.31f; if (m_pTiles[x][y]->m_pNbAlliesGeo == NULL) { fy = 0.0f; m_pCountUnitsBgGeometry1L->display(pos3D + Coords3D(-0.1f, 0.0f), F_RGBA_NULL); } m_pFoeBannerGeometry->display(pos3D + Coords3D(-0.1f, fy), rgb(0, 0, 0)); m_pTiles[x][y]->m_pNbFoesGeo->display(pos3D + Coords3D(0.15f, fy), F_RGBA_NULL); } } } } }
// ------------------------------------------------------------------ // Name : get3DCoords // ------------------------------------------------------------------ Coords3D DisplayEngine::get3DCoords(CoordsMap mapCoords, double fZPlane) { if (m_iMapWidth == 0 || m_iMapHeight == 0) return Coords3D(); Coords3D d3Coords((double)(mapCoords.x - m_iMapWidth/2), (double)(mapCoords.y - m_iMapHeight/2), fZPlane); // Coords3D d3Coords((float)(mapCoords.x - m_pServerParams->mapXSize/2), (float)(m_pServerParams->mapYSize/2 - mapCoords.y), fZPlane); return d3Coords; }
// ------------------------------------------------------------------ // Name : get3DDistance // ------------------------------------------------------------------ Coords3D DisplayEngine::get3DDistance(CoordsScreen screenDist, DisplayModeState modeState) { switch (modeState) { case DMS_2D: return Coords3D((double)screenDist.x, (double)screenDist.y, screenDist.z); case DMS_3D: default: { if (m_pClientParams == NULL) return Coords3D(); double fX = -(double)screenDist.x * X2X / (double)m_pClientParams->screenXSize; double fY = -(double)screenDist.y * X2Y / (double)m_pClientParams->screenYSize; // float fX = -(float)screenDist.x * 2.0f / (float)m_pClientParams->screenXSize; // float fY = (float)screenDist.y * 2.0f / (float)m_pClientParams->screenYSize; Coords3D d3Coords(fX * (screenDist.z - m_f3CamPos.z) / NEARPLANE, fY * (screenDist.z - m_f3CamPos.z) / NEARPLANE, 0.0f); return d3Coords; } } }
// ------------------------------------------------------------------ // Name : Init // ------------------------------------------------------------------ void DisplayEngine::Init(Parameters * clientParams, DebugManager * pDebug) { m_pClientParams = clientParams; m_pDebug = pDebug; glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA | GLUT_STENCIL | GLUT_ALPHA); m_f3CamPos = Coords3D(0.0f, 0.0f, 0.0f); initGlutWindow(); m_pTexEngine = new TextureEngine(pDebug); m_pFntEngine = new FontEngine(this, pDebug); }
Reper:: Reper(unsigned int _num, unsigned int _height, unsigned int _width) : num(_num) , height(_height) , width(_width) { if (0==num) { throw std::runtime_error("Reper with 0 dimension"); } for (size_t i=0; i<num; ++i) { vectors.push_back(std::make_pair(width*(i-num/2)+((num%2)?0:width/2), -height)); double angle=2*M_PI*((i-num/2.0)/num); vectors3d.push_back(Coords3D(width*sin(angle)*COEFF_3D,-height, width*cos(angle)*COEFF_3D)); } }