3#include "ClipmapTerrainTypes.h"
5#include "ClipmapState.h"
6#include "ClipmapLevel.h"
7#include "ClipmapRenderer.h"
8#include "Raster/RasterLevel.h"
12 inline Vector2 calculateViewPosInClippedLevel(
const ClipmapState & clipmapState,
const ClipmapLevel & terrainLevel)
15 static_cast<float>(terrainLevel.rasterLevel->longitudeToIndex(clipmapState.clipmapCenter.x) - terrainLevel.currentExtent.west),
16 static_cast<float>(terrainLevel.rasterLevel->latitudeToIndex(clipmapState.clipmapCenter.y) - terrainLevel.currentExtent.south));
19 static Vector2 calculateScaleFactor(
const int levelIndex)
21 const float levelScaleFactor = std::exp2(
static_cast<float>(-levelIndex));
23 return Vector2(levelScaleFactor, levelScaleFactor);
26 static Vector2 calculateResolutionRatio(
const ClipmapLevel & a,
const ClipmapLevel & b)
29 static_cast<float>(a.rasterLevel->getPostDeltaLongitude() / b.rasterLevel->getPostDeltaLongitude()),
30 static_cast<float>(a.rasterLevel->getPostDeltaLatitude() / b.rasterLevel->getPostDeltaLatitude())
36 template<
typename InputVector>
37 Vector4 pad3to4(
const InputVector in)
39 Vector4 out(in[0], in[1], in[2], 0);
44 template<
typename InputVector>
45 vec2a pad2to4(
const InputVector in)
47 vec2a out(in[0], in[1]);
53 inline void calculateLevelParameters(
54 const ClipmapLevel & terrainLevel,
55 const std::vector<const ClipmapLevel *> & imageryLevels,
56 LevelParameters & parameters,
57 ImageryParameters & imageryParameters,
58 const Vector3d center,
61 const ClipmapLevel & coarserLevel = *terrainLevel.coarserLevel;
63 const int west = terrainLevel.currentExtent.west;
64 const int south = terrainLevel.currentExtent.south;
67 const float reciprocalX = 1.0f /
static_cast<float>(terrainLevel.nextExtent.getWidth());
68 const float reciprocalY = 1.0f /
static_cast<float>(terrainLevel.nextExtent.getHeight());
70 parameters.oneOverClipmapSize = Vector2(reciprocalX, reciprocalY);
73 const float coarseReciprocalX = 1.0f /
static_cast<float>(coarserLevel.nextExtent.getWidth());
74 const float coarseReciprocalY = 1.0f /
static_cast<float>(coarserLevel.nextExtent.getHeight());
76 parameters.oneOverCoarseClipmapSize = Vector2(coarseReciprocalX, coarseReciprocalY);
79 parameters.levelOffsetFromClipmapCenter = Vector2(west - terrainLevel.rasterLevel->longitudeToIndex(center.x),
80 south - terrainLevel.rasterLevel->latitudeToIndex(center.y));
83 parameters.levelScaleFactor = calculateScaleFactor(
static_cast<int>(terrainLevel.index));
86 Vector2 texelOffset = Vector2(0.5f, 0.5f);
89 parameters.fineTextureOrigin = Vector2(
static_cast<float>(terrainLevel.origin.x),
static_cast<float>(terrainLevel.origin.y)) + texelOffset;
91 const auto fineToCoarseRatio = calculateResolutionRatio(terrainLevel, coarserLevel);
93 parameters.fineToCoarseRatio = fineToCoarseRatio;
96 const int coarserWest = coarserLevel.currentExtent.west;
97 const int coarserSouth = coarserLevel.currentExtent.south;
98 parameters.fineLevelOriginInCoarse = Vector2(
99 static_cast<float>(coarserLevel.origin.x),
100 static_cast<float>(coarserLevel.origin.y)) +
102 static_cast<float>(west) * fineToCoarseRatio.x -
static_cast<float>(coarserWest),
103 static_cast<float>(south) * fineToCoarseRatio.y -
static_cast<float>(coarserSouth)) + texelOffset;
105 for (
size_t i = 0; i < imageryLevels.size(); ++i) {
106 const ClipmapLevel & imageryLevel = *imageryLevels[i];
107 const ClipmapLevel & coarserImageryLevel = *imageryLevel.coarserLevel;
109 imageryParameters.terrainToImageryResolutionRatio[i] = pad2to4(calculateResolutionRatio(terrainLevel, imageryLevel));
111 const double terrainWest = terrainLevel.rasterLevel->indexToLongitude(west);
112 const double terrainSouth = terrainLevel.rasterLevel->indexToLatitude(south);
113 const double imageryWestIndex = imageryLevel.rasterLevel->longitudeToIndex(terrainWest);
114 const double imagerySouthIndex = imageryLevel.rasterLevel->latitudeToIndex(terrainSouth);
116 imageryParameters.terrainOffsetInImagery[i] = pad2to4(Vector2(
117 static_cast<float>(imageryLevel.origin.x),
118 static_cast<float>(imageryLevel.origin.y)) +
120 static_cast<float>(imageryWestIndex - imageryLevel.currentExtent.west),
121 static_cast<float>(imagerySouthIndex - imageryLevel.currentExtent.south)));
123 const auto fineToCoarseImageryRatio = pad2to4(calculateResolutionRatio(imageryLevel, coarserImageryLevel));
125 imageryParameters.fineToCoarseImageryResolutionRatio[i] = fineToCoarseImageryRatio;
127 const int coarserImageryWest = coarserImageryLevel.currentExtent.west;
128 const int coarserImagerySouth = coarserImageryLevel.currentExtent.south;
129 imageryParameters.fineImageryOriginInCoarse[i] = pad2to4(Vector2(
130 static_cast<float>(coarserImageryLevel.origin.x),
131 static_cast<float>(coarserImageryLevel.origin.y)) +
133 imageryLevel.currentExtent.west * fineToCoarseImageryRatio.x - coarserImageryWest,
134 imageryLevel.currentExtent.south * fineToCoarseImageryRatio.y - coarserImagerySouth));
136 imageryParameters.oneOverImagerySize[i] = pad2to4(Vector2(
137 1.0f /
static_cast<float>(imageryLevel.currentExtent.getWidth()),
138 1.0f /
static_cast<float>(imageryLevel.currentExtent.getHeight())));
140 imageryParameters.oneOverCoarseImagerySize[i] = pad2to4(Vector2(
141 1.0f /
static_cast<float>(coarserImageryLevel.currentExtent.getWidth()),
142 1.0f /
static_cast<float>(coarserImageryLevel.currentExtent.getHeight())));
144 imageryParameters.noData[i] = imageryLevel.rasterLevel->getNoData();
148 inline void calculateGlobalParameters(
const ClipmapLevel & levelZero,
const RenderContext & renderContext,
const WorldOptions & worldOptions,
const ClipmapState & clipmapState, GlobalParameters & globalParameters)
150 auto rasterLevel = levelZero.rasterLevel;
151 auto & extent = levelZero.nextExtent;
153 globalParameters.noClipmapData = rasterLevel->getNoData();
156 globalParameters.levelZeroWorldScaleFactor = Vector2(rasterLevel->getPostDeltaLongitude(), rasterLevel->getPostDeltaLatitude());
158 auto & worldScale = worldOptions.worldScale;
161 globalParameters.worldScale = Vector4(worldScale);
164 auto offsetFromOrigin = Vector2d(renderContext.origin) - Vector2d(renderContext.offset);
167 globalParameters.centerOffsetFromOrigin = Vector2(Vector2d(renderContext.center) - offsetFromOrigin);
170 auto & geodeticExtent = levelZero.rasterLevel->getGeoExtent();
171 globalParameters.worldExtents = Vector4(
172 Vector2d(geodeticExtent.getWest(), geodeticExtent.getSouth()) * Vector2d(worldScale) - offsetFromOrigin,
173 Vector2d(geodeticExtent.getEast(), geodeticExtent.getNorth()) * Vector2d(worldScale) - offsetFromOrigin
177 globalParameters.clipmapExtents = Vector4(
178 Vector2d(rasterLevel->indexToLongitude(extent.west), rasterLevel->indexToLatitude(extent.south)) * Vector2d(worldScale) - offsetFromOrigin,
179 Vector2d(rasterLevel->indexToLongitude(extent.east), rasterLevel->indexToLatitude(extent.north)) * Vector2d(worldScale) - offsetFromOrigin
182 globalParameters.unblendedRegionSize = Vector2(clipmapState.unblendedRegionSize, clipmapState.unblendedRegionSize);
183 globalParameters.oneOverBlendedRegionSize = Vector2(clipmapState.oneOverBlendedRegionSize, clipmapState.oneOverBlendedRegionSize);
185 globalParameters.heightExaggeration = worldOptions.heightExaggeration;
188 globalParameters.worldOffset = Vector4(0, 0, renderContext.offset.z, 1);
190 globalParameters.enableNoData = worldOptions.enableNoData;
Contains all Cogs related functionality.