Cogs.Core
ExtentCalculation.h
1#pragma once
2
3#include "ClipmapState.h"
4#include "ClipmapLevel.h"
5#include "Raster/RasterLevel.h"
6
7namespace Cogs
8{
9 inline void updateImageryExtent(Cogs::ClipmapLevel & imageryLevel, const Cogs::ClipmapLevel & terrainLevel)
10 {
11 const int imageryWest = (int)imageryLevel.rasterLevel->longitudeToIndex(terrainLevel.rasterLevel->indexToLongitude(terrainLevel.nextExtent.west));
12 const int imagerySouth = (int)imageryLevel.rasterLevel->latitudeToIndex(terrainLevel.rasterLevel->indexToLatitude(terrainLevel.nextExtent.south));
13
14 imageryLevel.nextExtent.west = imageryWest;
15 imageryLevel.nextExtent.east = imageryWest + imageryLevel.renderTexture.width - 1;
16 imageryLevel.nextExtent.south = imagerySouth;
17 imageryLevel.nextExtent.north = imagerySouth + imageryLevel.renderTexture.height - 1;
18 }
19
20 inline void calculateNextExtent(double longitude, double latitude, const Cogs::ClipmapState & clipmapState, Cogs::ClipmapLevel & firstTerrainLevel)
21 {
22 const double longitudeIndex = firstTerrainLevel.rasterLevel->longitudeToIndex(longitude);
23 const double latitudeIndex = firstTerrainLevel.rasterLevel->latitudeToIndex(latitude);
24
25 int west = (int)(longitudeIndex - clipmapState.clipmapPosts / 2);
26 int south = (int)(latitudeIndex - clipmapState.clipmapPosts / 2);
27
28 // Ensure the finest clipmap is always positioned at even coordinates.
29 if ((west % 2) != 0) ++west;
30 if ((south % 2) != 0) ++south;
31
32 firstTerrainLevel.nextExtent.west = west;
33 firstTerrainLevel.nextExtent.east = west + static_cast<int>(clipmapState.clipmapSegments);
34 firstTerrainLevel.nextExtent.south = south;
35 firstTerrainLevel.nextExtent.north = south + static_cast<int>(clipmapState.clipmapSegments);
36 }
37
38 inline void calculateLevelNextExtent(Cogs::ClipmapLevel & terrainLevel, const Cogs::ClipmapLevel & finerLevel, const Cogs::ClipmapState & clipmapState)
39 {
40 terrainLevel.nextExtent.west = finerLevel.nextExtent.west / 2 - static_cast<int>(clipmapState.fillPatchSegments);
41 terrainLevel.offsetStripOnEast = (terrainLevel.nextExtent.west % 2) == 0;
42
43 if (!terrainLevel.offsetStripOnEast) {
44 --terrainLevel.nextExtent.west;
45 }
46
47 terrainLevel.nextExtent.east = terrainLevel.nextExtent.west + static_cast<int>(clipmapState.clipmapSegments);
48
49 terrainLevel.nextExtent.south = finerLevel.nextExtent.south / 2 - static_cast<int>(clipmapState.fillPatchSegments);
50 terrainLevel.offsetStripOnNorth = (terrainLevel.nextExtent.south % 2) == 0;
51
52 if (!terrainLevel.offsetStripOnNorth) {
53 --terrainLevel.nextExtent.south;
54 }
55
56 terrainLevel.nextExtent.north = terrainLevel.nextExtent.south + static_cast<int>(clipmapState.clipmapSegments);
57 }
58}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23