1#include "ClipmapUpdate.h"
3Cogs::ClipmapUpdate::ClipmapUpdate(ClipmapLevel * level,
int west,
int south,
int east,
int north)
6 extent = Extent{ west, south, east, north };
9int Cogs::ClipmapUpdate::getWidth()
const
11 return (extent.east - extent.west + 1);
14int Cogs::ClipmapUpdate::getHeight()
const
16 return (extent.north - extent.south + 1);
23 std::max<int>(extent.west - 1, level->nextExtent.west),
24 std::max<int>(extent.south - 1, level->nextExtent.south),
25 std::min<int>(extent.east + 1, level->nextExtent.east),
26 std::min<int>(extent.north + 1, level->nextExtent.north)
32void Cogs::ClipmapUpdate::splitUpdateToAvoidWrapping(
const ClipmapUpdate & update, std::vector<ClipmapUpdate> & results)
34 ClipmapLevel * level = update.getLevel();
35 const TextureOrigin & origin = level->origin;
36 const Extent & extent = level->nextExtent;
38 const int clipmapSizeX = extent.getWidth();
39 const int clipmapSizeY = extent.getHeight();
41 const int west = (origin.x + (update.getWest() - extent.west)) % clipmapSizeX;
42 const int east = (origin.x + (update.getEast() - extent.west)) % clipmapSizeX;
43 const int south = (origin.y + (update.getSouth() - extent.south)) % clipmapSizeY;
44 const int north = (origin.y + (update.getNorth() - extent.south)) % clipmapSizeY;
46 if (east < west && north < south) {
48 ClipmapUpdate bottomLeftUpdate(
52 extent.west + (clipmapSizeX - origin[0] - 1),
53 extent.south + (clipmapSizeY - origin[1] - 1));
55 ClipmapUpdate bottomRightUpdate(
57 extent.west + clipmapSizeX - origin[0],
60 extent.south + (clipmapSizeY - origin[1] - 1));
62 ClipmapUpdate topLeftUpdate(
65 extent.south + clipmapSizeY - origin[1],
66 extent.west + (clipmapSizeX - origin[0] - 1),
69 ClipmapUpdate topRightUpdate(
71 extent.west + clipmapSizeX - origin[0],
72 extent.south + clipmapSizeY - origin[1],
76 results.push_back(bottomLeftUpdate);
77 results.push_back(bottomRightUpdate);
78 results.push_back(topLeftUpdate);
79 results.push_back(topRightUpdate);
80 }
else if (east < west) {
82 ClipmapUpdate leftUpdate(
86 extent.west + (clipmapSizeX - origin[0] - 1),
89 ClipmapUpdate rightUpdate(
91 extent.west + clipmapSizeX - origin[0],
96 results.push_back(leftUpdate);
97 results.push_back(rightUpdate);
98 }
else if (north < south) {
100 ClipmapUpdate bottomUpdate(
105 extent.south + (clipmapSizeY - origin[1] - 1));
107 ClipmapUpdate topUpdate(
110 extent.south + clipmapSizeY - origin[1],
114 results.push_back(bottomUpdate);
115 results.push_back(topUpdate);
118 results.push_back(update);
122Cogs::ClipmapUpdate Cogs::ClipmapUpdate::intersectUpdates(
const ClipmapUpdate & first,
const ClipmapUpdate & second)
124 const int west = std::max(first.getWest(), second.getWest());
125 const int south = std::max(first.getSouth(), second.getSouth());
126 const int east = std::min(first.getEast(), second.getEast());
127 const int north = std::min(first.getNorth(), second.getNorth());
129 return ClipmapUpdate(first.getLevel(), west, south, east, north);