载入中...
搜索中...
未找到
TerrainImageAdapter.cpp
浏览该文件的文档.
23 if (value.getWidth() <= 0 || value.getHeight() <= 0 || !value.getData() || !value.getPixelGetFunction() ||
39 const auto a = sample(x0, y0), b = sample(x0 + 1, y0), c = sample(x0, y0 + 1), d = sample(x0 + 1, y0 + 1);
43 return {blend(a.r,b.r,c.r,d.r), blend(a.g,b.g,c.g,d.g), blend(a.b,b.b,c.b,d.b), blend(a.a,b.a,c.a,d.a)};
73 const double dx = (heights.height(xr, z) - heights.height(xl, z)) / ((xr - xl) * spacingX + (xr == xl));
74 const double dz = (heights.height(x, zf) - heights.height(x, zb)) / ((zf - zb) * spacingZ + (zf == zb));
147 const float values[] = {settings.tileSizeX, settings.tileSizeZ, settings.offsetX, settings.offsetZ,
163 return invalid("terrain.gtsPackedLayers: readable textures and finite normalized settings required");
165 if (impl_->layers.size() >= 8) return invalid("terrain.gtsPackedLayers: at most eight layers supported");
176 const int width = splatmap.getWidth(), height = splatmap.getHeight(), count = splatmap.getLayerCount();
180 const double values[]{cameraX, cameraY, cameraZ, tessellationMultiplier, originX, originY, originZ,
182 if (!layers.impl_ || layers.impl_->layers.size() != static_cast<std::size_t>(count) || count < 1 ||
184 !std::all_of(std::begin(values), std::end(values), [](double value) { return std::isfinite(value); }) ||
186 return invalid("terrain.gtsLayerDisplacement: matching splat, layers, heights and finite settings required");
230int GtsPackedLayerSet::getLayerCount() const noexcept { return impl_ ? static_cast<int>(impl_->layers.size()) : 0; }
238 const int width = splatmap.getWidth(), height = splatmap.getHeight(), count = splatmap.getLayerCount();
239 auto rasterMatches = [&](const Heightmap& map) { return validRaster(map) && map.getWidth() == width && map.getHeight() == height; };
240 auto imageMatches = [&](const image::ImageData& image) { return validImage(image, true) && image.getWidth() == width && image.getHeight() == height; };
241 if (!layers.impl_ || layers.impl_->layers.size() != static_cast<std::size_t>(count) || count < 1 || count > 8 ||
274 changed += oldA.r!=r||oldA.g!=g||oldA.b!=b; changed += oldN.r!=outN.r||oldN.g!=outN.g||oldN.b!=ao||oldN.a!=smooth;
276 nextAlbedo.setPixel(x,y,outA); nextNormal.setPixel(x,y,outN); nextGeo.setHeight(x,y,geo); nextDetail.setHeight(x,y,detail);
286 !output.getPixelSetFunction() || palette.colors_.size() != static_cast<std::size_t>(splatmap.getLayerCount()))
287 return raster_detail::invalid("terrain.splatAlbedo: matching writable image, splatmap and palette required");
304Result<int> generateGtsGlobalBlendDistance(Heightmap& output, const Heightmap& heights, double cameraX,
310 output.getHeight() != heights.getHeight() || !std::isfinite(cameraX) || !std::isfinite(cameraY) ||
313 !std::isfinite(originY) || !std::isfinite(originZ) || !std::isfinite(spacingX) || spacingX <= 0 ||
315 return invalid("terrain.gtsGlobalBlend: matching rasters and finite camera/profile settings required");
337 output.getWidth() != globalBlendDistance.getWidth() || output.getHeight() != globalBlendDistance.getHeight() ||
341 return invalid("terrain.gtsColorMap: matching images, normalized blend and finite settings required");
363Result<int> bakeGtsMacroVariationAlbedo(image::ImageData& output, const image::ImageData& variationMap,
373 return invalid("terrain.gtsMacroVariation: readable images and finite profile settings required");
379 const float a = repeatBilinear(variationMap, px * settings.sizeA / 1000.0, pz * settings.sizeA / 1000.0).r;
380 const float b = repeatBilinear(variationMap, px * settings.sizeB / 10000.0, pz * settings.sizeB / 10000.0).r;
412 settings.farNormalStrength < 0 || !std::isfinite(settings.nearScale) || settings.nearScale <= 0 ||
415 return invalid("terrain.gtsGeological: matching outputs, rasters, textures and finite settings required");
424 const auto nearColor = repeatBilinear(geoAlbedo, 0, vertical / settings.nearScale + settings.nearOffset);
425 const auto farColor = repeatBilinear(geoAlbedo, 0, vertical / settings.farScale + settings.farOffset);
426 const auto nearNormal = repeatBilinear(geoNormal, 0, vertical / settings.nearScale + settings.nearOffset);
468 if (!validImage(albedo, true) || !validImage(packedNormal, true) || packedNormal.getWidth() != width ||
469 packedNormal.getHeight() != height || !rasterMatches(detailGreyscale) || !rasterMatches(layerStrength) ||
470 !rasterMatches(globalBlendDistance) || !validImage(detailNormal) || !std::isfinite(settings.nearTiling) ||
476 return invalid("terrain.gtsDetail: matching outputs, rasters, texture and finite settings required");
488 const auto nearSample = repeatBilinear(detailNormal, px / settings.nearTiling, pz / settings.nearTiling);
489 const auto farSample = repeatBilinear(detailNormal, px / settings.farTiling, pz / settings.farTiling);
504 const float combinedZ = std::sqrt(1 - std::clamp(combinedX * combinedX + combinedY * combinedY, 0.0F, 1.0F));
505 const float length = std::sqrt(combinedX * combinedX + combinedY * combinedY + combinedZ * combinedZ);
526 if (!validImage(output, true) || !validImage(snowAlbedo) || !validImage(snowMask) || !validRaster(heights) ||
528 !std::isfinite(originX) || !std::isfinite(originZ) || !std::isfinite(spacingX) || spacingX <= 0 ||
531 !std::isfinite(snow.slopeBlend) || snow.slopeBlend < 0 || !std::isfinite(snow.scale) || snow.scale <= 0 ||
533 (detailGreyscale && (!validRaster(*detailGreyscale) || detailGreyscale->getWidth() != output.getWidth() ||
537 return invalid("terrain.gtsWeather: finite matching images, heights and profile settings required");
552 const float slope = std::clamp(std::pow(std::abs(normalY), snow.slopeBlend * slopeAge) * 4, 0.0F, 1.0F);
587 return std::all_of(values.begin(), values.end(), [](float value) { return std::isfinite(value); });
591 tessellation.getWidth() != width || tessellation.getHeight() != height || !matches(normalOutput) ||
592 !matches(maskOutput) || !validImage(snowNormal) || !validImage(snowMask) || !validImage(rainData) ||
595 !std::isfinite(snow.normalStrength) || snow.normalStrength < 0 || !finiteArray(snow.maskRemapMin) ||
596 !finiteArray(snow.maskRemapMax) || !std::isfinite(snow.heightContrast) || snow.heightContrast < 0 ||
603 return invalid("terrain.gtsWeatherPbr: finite matching outputs, textures and profile settings required");
606 if (!std::isfinite(albedoSnow.scale) || albedoSnow.scale <= 0 || !std::isfinite(albedoSnow.minimumHeight) ||
611 !std::isfinite(albedoRain.maximumHeight) || albedoRain.maximumHeight < albedoRain.minimumHeight)
639 Vec3 normal = normalize({baseTangent.x * tangent.x + baseTangent.y * bitangent.x + baseTangent.z * terrain.x,
654 channels[i] = snow.maskRemapMin[i] + channels[i] * (snow.maskRemapMax[i] - snow.maskRemapMin[i]);
659 const float slope = std::clamp(std::pow(std::abs(terrain.y), snow.slopeBlend * slopeAge) * 4, 0.0F, 1.0F);
669 const float slopeLod = std::clamp(std::pow(std::abs(terrain.y), snow.slopeBlend) * 4, 0.0F, 1.0F);
685 Vec3 rainN{yd * strength, -xd * yd * strength, 1 + (xd - 1) * std::clamp(strength, 0.0F, 1.0F)};
695 const Vec3 finalTangent{dot(finalWorld, tangent), dot(finalWorld, bitangent), dot(finalWorld, terrain)};
699 if (!std::isfinite(nextEncoded.r) || !std::isfinite(nextEncoded.g) || !std::isfinite(nextEncoded.b) ||
704 changed += encoded.r != nextEncoded.r || encoded.g != nextEncoded.g || encoded.b != nextEncoded.b;
716Result<int> generateTerrainImageMaskFromImage(Heightmap& target, const Heightmap& input, const image::ImageData& image,
721 if (!validRaster(target) || !validRaster(input) || !validRaster(curve) || target.getWidth() != input.getWidth() ||
747 if (activeChannels > 15 || !validImage(output, true) || !validImage(red) || !validImage(green) ||
814 auto snow = table.addClass("GtsSnowSurfaceSettings", ssq::Class::Ctor<GtsSnowSurfaceSettings()>());
835 auto rain = table.addClass("GtsRainSurfaceSettings", ssq::Class::Ctor<GtsRainSurfaceSettings()>());
844 auto colorMap = table.addClass("GtsColorMapSettings", ssq::Class::Ctor<GtsColorMapSettings()>());
849 auto variation = table.addClass("GtsMacroVariationSettings", ssq::Class::Ctor<GtsMacroVariationSettings()>());
855 auto geological = table.addClass("GtsGeologicalSettings", ssq::Class::Ctor<GtsGeologicalSettings()>());
866 auto detail = table.addClass("GtsDetailNormalSettings", ssq::Class::Ctor<GtsDetailNormalSettings()>());
873 auto palette = table.addClass("TerrainSplatPalette", ssq::Class::Ctor<TerrainSplatPalette()>());
874 palette.addFunc("addColor", [vm = table.getHandle()](TerrainSplatPalette* self, float r, float g, float b,
876 return eve::script::projectResult(vm, self->addColor(r, g, b, a), [](int n) { return eve::Value(n); });
878 palette.addFunc("getColorCount", [](const TerrainSplatPalette* self) { return self->getColorCount(); });
879 auto packedSettings = table.addClass("GtsPackedLayerSettings", ssq::Class::Ctor<GtsPackedLayerSettings()>());
882 packedSettings.addVar("tileSizeX", &GtsPackedLayerSettings::tileSizeX); packedSettings.addVar("tileSizeZ", &GtsPackedLayerSettings::tileSizeZ);
883 packedSettings.addVar("offsetX", &GtsPackedLayerSettings::offsetX); packedSettings.addVar("offsetZ", &GtsPackedLayerSettings::offsetZ);
886 packedSettings.addVar("tintR", &GtsPackedLayerSettings::tintR); packedSettings.addVar("tintG", &GtsPackedLayerSettings::tintG);
887 packedSettings.addVar("tintB", &GtsPackedLayerSettings::tintB); packedSettings.addVar("normalStrength", &GtsPackedLayerSettings::normalStrength);
888 packedSettings.addVar("aoMin", &GtsPackedLayerSettings::aoMin); packedSettings.addVar("smoothnessMin", &GtsPackedLayerSettings::smoothnessMin);
889 packedSettings.addVar("aoMax", &GtsPackedLayerSettings::aoMax); packedSettings.addVar("smoothnessMax", &GtsPackedLayerSettings::smoothnessMax);
890 packedSettings.addVar("geoAmount", &GtsPackedLayerSettings::geoAmount); packedSettings.addVar("detailAmount", &GtsPackedLayerSettings::detailAmount);
895 packedSettings.addVar("displacementBrightness", &GtsPackedLayerSettings::displacementBrightness);
898 auto packedLayers = table.addClass("GtsPackedLayerSet", ssq::Class::Ctor<GtsPackedLayerSet()>());
899 packedLayers.addFunc("addLayer", [vm = table.getHandle()](GtsPackedLayerSet* self, const image::ImageData* albedo,
905 packedLayers.addFunc("getLayerCount", [](const GtsPackedLayerSet* self) { return self->getLayerCount(); });
909 auto result = output && splatmap && paletteValue ? bakeTerrainSplatAlbedo(*output, *splatmap, *paletteValue)
1004 auto result = albedo && normal && heights && strength && blend && geoAlbedo && geoNormal && settings
1029 auto result = output && heights && snowAlbedo && snowMask && snowSettings && rainSettings && detailGreyscale
1043 auto result = normalOutput && maskOutput && displacement && tessellation && heights && snowNormal &&
std::map< std::string, std::vector< Key >, std::less<> > channels
Definition AnimCurveLibrary.cpp:19
The single Squirrel projection for common Result, Status and Value.
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
void getPixel(int x, int y, Colorf &c) const
Gets the pixel at location (x,y).
Definition ImageData.cpp:535
void setPixel(int x, int y, const Colorf &p)
Sets the pixel at location (x,y).
Definition ImageData.cpp:484
void adopt(eve::Resource &replacement) override
Replace this instance's pixels with replacement's (cache reload). The replacement is drained; its des...
Definition ImageData.cpp:62
Owning ordered GTS packed albedo/height and normal/AO/smoothness texture layers.
Definition TerrainImageAdapter.h:83
int getLayerCount() const noexcept
Return the number of owned packed layers.
Definition TerrainImageAdapter.cpp:230
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
Ordered linear RGBA colors used to visualize terrain splat layers.
Definition TerrainImageAdapter.h:59
Result< int > addColor(float red, float green, float blue, float alpha=1)
Append one finite normalized layer color and return the palette size.
Definition TerrainImageAdapter.cpp:132
Owning normalized terrain texture-layer weights with atomic mutation. Layers share one finite width/h...
Definition TerrainSplatmap.h:20
int getHeight() const noexcept
Current splat height, or zero before initialization.
Definition TerrainSplatmap.cpp:113
int getLayerCount() const noexcept
Current layer count, or zero before initialization.
Definition TerrainSplatmap.cpp:114
Result< float > sample(int layer, int x, int y) const
Return one layer weight, or a structured range/precondition failure.
Definition TerrainSplatmap.cpp:91
int getWidth() const noexcept
Current splat width, or zero before initialization.
Definition TerrainSplatmap.cpp:112
Definition EvpackPointGraphLoader.h:12
Result< int > bakeGtsColorMapAlbedo(image::ImageData &output, const image::ImageData &colorMap, const Heightmap &globalBlendDistance, const GtsColorMapSettings &settings)
Blend the GTS terrain colormap into an existing albedo before weather layers.
Definition TerrainImageAdapter.cpp:331
Result< int > placePcgMaskMapTileInto(image::ImageData &output, const image::ImageData &tile, int destinationX, int destinationY, int destinationWidth, int destinationHeight)
Scale and copy one Pcg local mask-map result into a combined atlas rectangle.
Definition TerrainImageAdapter.cpp:773
Result< int > generateGtsGlobalBlendDistance(Heightmap &output, const Heightmap &heights, double cameraX, double cameraY, double cameraZ, double blendDistance, double blendRange, double originX, double originY, double originZ, double spacingX, double spacingZ)
Generate GTS camera-distance near/far blend values for a terrain raster.
Definition TerrainImageAdapter.cpp:304
Result< int > combinePcgMaskMapChannels(image::ImageData &output, const image::ImageData &red, const image::ImageData &green, const image::ImageData &blue, const image::ImageData &alpha, std::uint32_t activeChannels)
Combine Pcg Mask Map Export channel rasters into one RGBA image.
Definition TerrainImageAdapter.cpp:744
Result< int > generateTerrainImageMask(Heightmap &target, const Heightmap &input, const Heightmap &red, const Heightmap &green, const Heightmap &blue, const Heightmap &alpha, const Heightmap &curve, const TerrainImageMaskSettings &s, TerrainMaskBlend mode)
Generate the reference image-mask filter from borrowed RGBA scalar planes.
Definition TerrainImageMask.cpp:20
TerrainMaskBlend
Ordered scalar-mask arithmetic; intermediate values are not clamped.
Definition TerrainStamp.h:9
Result< int > bakeGtsGeologicalSurface(image::ImageData &albedo, image::ImageData &packedNormal, const Heightmap &heights, const Heightmap &layerStrength, const Heightmap &globalBlendDistance, const image::ImageData &geoAlbedo, const image::ImageData &geoNormal, const GtsGeologicalSettings &settings, double originY)
Bake the GTS near/far height-axis geological color and tangent normal overlay atomically.
Definition TerrainImageAdapter.cpp:393
Result< int > bakeGtsWeatherAlbedo(image::ImageData &output, const Heightmap &heights, const image::ImageData &snowAlbedo, const image::ImageData &snowMask, const GtsSnowSurfaceSettings &snow, const GtsRainSurfaceSettings &rain, double originX, double originZ, double spacingX, double spacingZ, const Heightmap *detailGreyscale)
Bake the GTS snow and rain albedo branches over an existing terrain image.
Definition TerrainImageAdapter.cpp:519
Result< int > generateTerrainImageMaskFromImage(Heightmap &target, const Heightmap &input, const image::ImageData &image, const Heightmap &curve, const TerrainImageMaskSettings &settings, TerrainMaskBlend mode)
Read a borrowed ImageData into scalar RGBA planes and apply the image-mask kernel atomically.
Definition TerrainImageAdapter.cpp:716
Result< int > bakeGtsPackedLayerDisplacement(Heightmap &displacement, Heightmap &tessellation, const Heightmap &heights, const TerrainSplatmap &splatmap, const GtsPackedLayerSet &layers, double cameraX, double cameraY, double cameraZ, double tessellationMultiplier, double originX, double originY, double originZ, double spacingX, double spacingZ)
Bake GTS planar top-four layer displacement and tessellation with its camera cutoff.
Definition TerrainImageAdapter.cpp:170
Result< int > bakeGtsPackedLayers(image::ImageData &albedo, image::ImageData &packedNormal, Heightmap &geoStrength, Heightmap &detailStrength, const Heightmap &heights, const TerrainSplatmap &splatmap, const GtsPackedLayerSet &layers, double originX, double originY, double originZ, double spacingX, double spacingZ)
Bake planar, stochastic or triplanar GTS packed layers using one normalized splatmap.
Definition TerrainImageAdapter.cpp:232
void exposeTerrainImageAdapter(ssq::Table &table)
Register the full-host ImageData adapter; VM-thread only, no retained table reference.
Definition TerrainImageAdapter.cpp:813
Result< int > bakeGtsWeatherPbr(image::ImageData &normalOutput, image::ImageData &maskOutput, Heightmap &displacement, Heightmap &tessellation, const Heightmap &heights, const image::ImageData &snowNormal, const image::ImageData &snowMask, const image::ImageData &rainData, const GtsSnowSurfaceSettings &snow, const GtsRainSurfaceSettings &rain, double timeSeconds, double originX, double originZ, double spacingX, double spacingZ)
Bake GTS snow/rain world normals, packed mask, displacement and tessellation atomically.
Definition TerrainImageAdapter.cpp:575
Result< int > bakeTerrainSplatAlbedo(image::ImageData &output, const TerrainSplatmap &splatmap, const TerrainSplatPalette &palette)
Blend every splat layer color into a borrowed ImageData atomically.
Definition TerrainImageAdapter.cpp:282
Result< int > bakeGtsDetailSurface(image::ImageData &albedo, image::ImageData &packedNormal, Heightmap &detailGreyscale, const Heightmap &layerStrength, const Heightmap &globalBlendDistance, const image::ImageData &detailNormal, const GtsDetailNormalSettings &settings, double originX, double originZ, double spacingX, double spacingZ)
Bake GTS near/far detail normals, albedo micro-shadowing and snow-detail influence atomically.
Definition TerrainImageAdapter.cpp:457
TerrainImageFilter
Reference image selection modes; MaximumRgb is not luminance.
Definition TerrainImageMask.h:8
Result< int > bakeGtsMacroVariationAlbedo(image::ImageData &output, const image::ImageData &variationMap, const GtsMacroVariationSettings &settings, double originX, double originZ, double spacingX, double spacingZ)
Apply GTS three-scale repeating macro variation after weather layers.
Definition TerrainImageAdapter.cpp:363
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Definition SquirrelBinding.cpp:470
WidgetDesc grid(int columns, std::vector< WidgetDesc > children, std::string id)
Fixed-column grid; children are placed in source order.
Definition Widget.cpp:687
Definition Container.h:602
GTS terrain colormap controls from GTSColorMapSettings.
Definition TerrainImageAdapter.h:39
float farIntensity
Definition TerrainImageAdapter.h:40
float nearIntensity
Definition TerrainImageAdapter.h:40
float colorIntensity
Definition TerrainImageAdapter.h:40
float alphaIntensity
Definition TerrainImageAdapter.h:40
GTS near/far detail-normal controls from GTSDetailSettings.
Definition TerrainImageAdapter.h:54
float nearTiling
Definition TerrainImageAdapter.h:56
float farStrength
Definition TerrainImageAdapter.h:56
bool objectSpace
Definition TerrainImageAdapter.h:55
float nearStrength
Definition TerrainImageAdapter.h:56
GTS height-axis geological overlay controls from GTSGeoSettings.
Definition TerrainImageAdapter.h:48
float nearStrength
Definition TerrainImageAdapter.h:50
float farNormalStrength
Definition TerrainImageAdapter.h:51
float nearNormalStrength
Definition TerrainImageAdapter.h:50
float farStrength
Definition TerrainImageAdapter.h:51
GTS three-scale macro color variation controls from GTSVariationSettings.
Definition TerrainImageAdapter.h:43
bool objectSpace
Definition TerrainImageAdapter.h:45
float intensity
Definition TerrainImageAdapter.h:44
image::ImageData albedoHeight
Definition TerrainImageAdapter.cpp:15
image::ImageData normalMask
Definition TerrainImageAdapter.cpp:16
GtsPackedLayerSettings settings
Definition TerrainImageAdapter.cpp:17
std::vector< Layer > layers
Definition TerrainImageAdapter.cpp:19
One GTS packed texture-array layer's planar sampling and material controls.
Definition TerrainImageAdapter.h:71
float heightContrast
Definition TerrainImageAdapter.h:78
float triPlanarSizeZ
Definition TerrainImageAdapter.h:74
float smoothnessMin
Definition TerrainImageAdapter.h:76
float smoothnessMax
Definition TerrainImageAdapter.h:76
float heightBrightness
Definition TerrainImageAdapter.h:78
float tessellationAmount
Definition TerrainImageAdapter.h:80
float triPlanarSizeX
Definition TerrainImageAdapter.h:74
float displacementContrast
Definition TerrainImageAdapter.h:79
float detailAmount
Definition TerrainImageAdapter.h:77
float heightIncrease
Definition TerrainImageAdapter.h:78
float displacementBrightness
Definition TerrainImageAdapter.h:79
float normalStrength
Definition TerrainImageAdapter.h:75
float displacementIncrease
Definition TerrainImageAdapter.h:79
GTS rain albedo controls copied from GTSRainSettings.
Definition TerrainImageAdapter.h:33
float minimumHeight
Definition TerrainImageAdapter.h:35
float maximumHeight
Definition TerrainImageAdapter.h:35
GTS snow albedo controls copied from GTSSnowSettings.
Definition TerrainImageAdapter.h:18
std::array< float, 4 > maskRemapMax
Definition TerrainImageAdapter.h:23
void setMaskRemapMin(float r, float g, float b, float a)
Set finite packed snow-mask remap minima in RGBA order.
Definition TerrainImageAdapter.h:28
float tessellationAmount
Definition TerrainImageAdapter.h:26
float heightBrightness
Definition TerrainImageAdapter.h:24
std::array< float, 4 > maskRemapMin
Definition TerrainImageAdapter.h:23
float heightIncrease
Definition TerrainImageAdapter.h:24
float normalStrength
Definition TerrainImageAdapter.h:22
float displacementBrightness
Definition TerrainImageAdapter.h:25
void setMaskRemapMax(float r, float g, float b, float a)
Set finite packed snow-mask remap maxima in RGBA order.
Definition TerrainImageAdapter.h:30
float minimumHeight
Definition TerrainImageAdapter.h:20
float displacementIncrease
Definition TerrainImageAdapter.h:25
float heightContrast
Definition TerrainImageAdapter.h:24
float displacementContrast
Definition TerrainImageAdapter.h:25
Small owning image product; raw pixels stay out of JSON metadata.
Definition GeneratedArtifact.h:119
Image UV transform and color-selection settings, rotation in radians.
Definition TerrainImageMask.h:10