载入中...
搜索中...
未找到
TerrainCurveTexture.cpp
浏览该文件的文档.
2
4#include "image/ImageData.h"
7
8#include <algorithm>
9#include <simplesquirrel/simplesquirrel.hpp>
10
11namespace eve::procgen {
13 if (output.getWidth() <= 0 || output.getHeight() != 1 || !raster_detail::validRaster(curve) ||
14 curve.getHeight() != 1)
16 DiagnosticCode::InvalidArgument, "terrain.curveTexture: non-empty one-row image and curve required"));
17 const auto sampleCurve = [&curve](double t) {
18 return raster_detail::sample(curve, std::clamp(t, 0.0, 1.0), 0.0);
19 };
20 const double atZero = sampleCurve(0);
21 double minimum = atZero, maximum = atZero;
22 image::ImageData candidate(output.getWidth(), 1, output.getFormat());
23 for (int x = 1; x < output.getWidth(); ++x) {
24 const double value = sampleCurve(double(x) / output.getWidth());
27 DiagnosticCode::InvalidArgument, "terrain.curveTexture: curve output is not representable"));
28 minimum = std::min(minimum, value);
29 maximum = std::max(maximum, value);
30 candidate.setPixel(x, 0, image::ImageData::Colorf{float(value), 0, 0, 0});
31 }
32 output.adopt(candidate);
34 TerrainCurveTextureReceipt{float(minimum), float(maximum), output.getWidth()});
35}
36
37void exposeTerrainCurveTexture(ssq::Table& table) {
38 table.addFunc("bakeTerrainCurveTexture", [vm = table.getHandle()](image::ImageData* output,
39 const Heightmap* curve) {
40 auto result = output && curve
41 ? bakeTerrainCurveTexture(*output, *curve)
42 : Result<TerrainCurveTextureReceipt>::failure(Diagnostic::error(
43 DiagnosticCode::InvalidArgument, "bakeTerrainCurveTexture requires output and curve"));
44 return eve::script::projectResult(vm, std::move(result), [](const TerrainCurveTextureReceipt& receipt) {
45 return eve::Value(eve::Value::Object{{"minimum", eve::Value(receipt.minimum)},
46 {"maximum", eve::Value(receipt.maximum)},
47 {"writtenPixels", eve::Value(receipt.writtenPixels)}});
48 });
49 });
50}
51} // namespace eve::procgen
double value
float x
Definition AnimClip.cpp:738
std::string output
HSQUIRRELVM vm
Definition ECS.cpp:20
float maximum[3]
float minimum[3]
float t
The single Squirrel projection for common Result, Status and Value.
Heightmap curve
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Represents raw pixel data.
Definition ImageData.h:38
void setPixel(int x, int y, const Colorf &p)
Sets the pixel at location (x,y).
medialoader::Colorf Colorf
Definition ImageData.h:41
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
int getHeight() const
Returns the height.
Definition Heightmap.cpp:17
double sample(const Heightmap &map, double u, double v)
Sample.
bool validRaster(const Heightmap &map)
Valid raster.
bool isRepresentable(double value)
True when representable.
void exposeTerrainCurveTexture(ssq::Table &table)
Register the Pcg terrain curve texture adapter; VM-thread only.
Result< TerrainCurveTextureReceipt > bakeTerrainCurveTexture(image::ImageData &output, const Heightmap &curve)
Bake a sampled one-row curve into an existing one-row image with Pcg's exact pixel-coordinate contrac...
Range and write count returned by Pcg AnimationCurve texture baking.