float SmoothGroundMap::GetImpassableValue(int x, int y) const { if (0 <= x && x < 255 && 0 <= y && y < 255) { glm::vec4 c = _image->GetPixel(x, y); if (c.b >= 0.5f && c.r < 0.5f) return 1.0f; glm::vec3 n = _heightMap.GetNormal(x, y); return bounds1f(0, 1).clamp(0.5f + 8.0f * (0.83f - n.z)); } return 0; }
void BattleView::Render(const glm::mat4& transformx) { glm::mat4 containerTransform = transformx * glm::inverse(GetContentTransform()); glm::mat4 terrainTransform = GetTerrainTransform(); glm::mat4 adjustmentTransform; adjustmentTransform = glm::scale(adjustmentTransform, glm::vec3(GetSize(), 1)); adjustmentTransform = glm::scale(adjustmentTransform, glm::vec3(0.5f, 0.5f, 1)); adjustmentTransform = glm::translate(adjustmentTransform, glm::vec3(1, 1, 0)); glm::mat4 contentTransform = transformx * adjustmentTransform * terrainTransform; glm::mat4 facingTransform = transformx * glm::translate(glm::mat4(), glm::vec3(-GetFrame().min, 0)); glm::vec2 facing = vector2_from_angle(GetCameraFacing() - 2.5f * (float)M_PI_4); _lightNormal = glm::normalize(glm::vec3(facing, -1)); // Terrain Sky glDisable(GL_DEPTH_TEST); if (_smoothTerrainSky != nullptr) { _smoothTerrainSky->RenderBackgroundLinen(containerTransform, _renderers, GetFrame(), GetFlip()); _smoothTerrainSky->Render(containerTransform, _renderers, GetFrame(), GetCameraDirection().z, GetFlip()); } // Terrain Surface glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); if (_smoothTerrainSurface != nullptr) _smoothTerrainSurface->Render(contentTransform, _lightNormal); if (_tiledTerrainRenderer != nullptr) _tiledTerrainRenderer->Render(contentTransform, _lightNormal); // Terrain Water glDisable(GL_CULL_FACE); if (_smoothTerrainWater != nullptr) _smoothTerrainWater->Render(contentTransform); // Fighter Weapons glDepthMask(false); _plainLineRenderer->Reset(); for (UnitCounter* marker : _unitMarkers) marker->AppendFighterWeapons(_plainLineRenderer); _plainLineRenderer->Draw(contentTransform, glm::vec4(0.4, 0.4, 0.4, 0.6)); // Color Billboards _colorBillboardRenderer->Reset(); _casualtyMarker->RenderCasualtyColorBillboards(_colorBillboardRenderer); _colorBillboardRenderer->Draw(contentTransform, GetCameraUpVector(), GetFrame().height()); // Texture Billboards _billboardModel->dynamicBillboards.clear(); _casualtyMarker->AppendCasualtyBillboards(_billboardModel); for (UnitCounter* marker : _unitMarkers) marker->AppendFighterBillboards(_billboardModel); for (SmokeCounter* marker : _smokeMarkers) marker->AppendSmokeBillboards(_billboardModel); _textureBillboardRenderer->Render(_billboardModel, contentTransform, GetCameraUpVector(), glm::degrees(GetCameraFacing()), GetFrame().height(), GetFlip()); // Range Markers for (Unit* unit : _simulator->GetUnits()) { if (unit->commander == _commander) { RangeMarker marker(_simulator, unit); _gradientTriangleStripRenderer->Reset(); marker.Render(_gradientTriangleStripRenderer); _gradientTriangleStripRenderer->Draw(contentTransform); } } // Unit Facing Markers glDisable(GL_DEPTH_TEST); _textureTriangleRenderer->Reset(); for (UnitCounter* marker : _unitMarkers) if (marker->GetUnit()->commander == _commander) marker->AppendFacingMarker(_textureTriangleRenderer, this); for (UnitMovementMarker* marker : _movementMarkers) if (marker->GetUnit()->commander == _commander) marker->AppendFacingMarker(_textureTriangleRenderer, this); for (UnitTrackingMarker* marker : _trackingMarkers) if (marker->GetUnit()->commander == _commander) marker->AppendFacingMarker(_textureTriangleRenderer, this); _textureTriangleRenderer->Draw(facingTransform, _textureUnitMarkers); // Unit Markers _textureBillboardRenderer1->Reset(); _textureBillboardRenderer2->Reset(); for (UnitCounter* marker : _unitMarkers) marker->AppendUnitMarker(_textureBillboardRenderer2, GetFlip()); for (UnitMovementMarker* marker : _movementMarkers) marker->RenderMovementMarker(_textureBillboardRenderer1); for (UnitTrackingMarker* marker : _trackingMarkers) marker->RenderTrackingMarker(_textureBillboardRenderer1); bounds1f sizeLimit = GetUnitIconSizeLimit(); _textureBillboardRenderer1->Draw(_textureUnitMarkers, contentTransform, GetCameraUpVector(), glm::degrees(GetCameraFacing()), GetFrame().height(), sizeLimit); _textureBillboardRenderer2->Draw(_textureUnitMarkers, contentTransform, GetCameraUpVector(), glm::degrees(GetCameraFacing()), GetFrame().height(), sizeLimit); // Tracking Markers glDisable(GL_DEPTH_TEST); for (UnitTrackingMarker* marker : _trackingMarkers) { _textureBillboardRenderer1->Reset(); marker->RenderTrackingShadow(_textureBillboardRenderer1); _textureBillboardRenderer1->Draw(_textureTouchMarker, contentTransform, GetCameraUpVector(), glm::degrees(GetCameraFacing()), GetFrame().height(), bounds1f(64, 64)); } // Movement Paths glEnable(GL_DEPTH_TEST); _gradientTriangleRenderer->Reset(); for (UnitMovementMarker* marker : _movementMarkers) marker->RenderMovementPath(_gradientTriangleRenderer); _gradientTriangleRenderer->Draw(contentTransform);//, glm::vec4(0.5, 0.5, 1, 0.25)); // Tracking Path glDisable(GL_DEPTH_TEST); for (UnitTrackingMarker* marker : _trackingMarkers) { _gradientTriangleRenderer->Reset(); marker->RenderTrackingPath(_gradientTriangleRenderer); marker->RenderOrientation(_gradientTriangleRenderer); _gradientTriangleRenderer->Draw(contentTransform); } // Tracking Fighters glEnable(GL_DEPTH_TEST); _colorBillboardRenderer->Reset(); for (UnitTrackingMarker* marker : _trackingMarkers) marker->RenderTrackingFighters(_colorBillboardRenderer); _colorBillboardRenderer->Draw(contentTransform, GetCameraUpVector(), GetFrame().height()); // Movement Fighters _colorBillboardRenderer->Reset(); for (UnitMovementMarker* marker : _movementMarkers) marker->RenderMovementFighters(_colorBillboardRenderer); _colorBillboardRenderer->Draw(contentTransform, GetCameraUpVector(), GetFrame().height()); // Shooting Counters _gradientLineRenderer->Reset(); for (ShootingCounter* shootingCounter : _shootingCounters) shootingCounter->Render(_gradientLineRenderer); _gradientLineRenderer->Draw(contentTransform); // Mouse Hint _plainLineRenderer->Reset(); RenderMouseHint(_plainLineRenderer); _plainLineRenderer->Draw(contentTransform, glm::vec4(0, 0, 0, 0.5f)); glDepthMask(true); glDisable(GL_DEPTH_TEST); }