载入中...
搜索中...
未找到
TerrainGrassAdapter.cpp
浏览该文件的文档.
3#include "graphics/Grass.h"
4#include "image/ImageData.h"
5#include "procgen/PointSet.h"
6namespace eve::procgen {
7namespace {
8Result<int> bake(graphics::GrassField& field, const PointSet& points, const std::string& asset, float width,
9 float height, const image::ImageData* image) {
10 if (asset.empty())
12 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain.grass: asset selector required"));
13 std::vector<graphics::grass::Point> roots;
14 for (int i = 0; i < points.getCount(); ++i) {
15 if (points.getStringAttribute(i, "asset", "") != asset) continue;
16 const auto& point = points.points()[size_t(i)];
17 if (point.id == 0 || point.scaleX != point.scaleZ || point.scaleX <= 0.001F)
20 "terrain.grass: stable ID and equal positive horizontal X/Z scales above 0.001 required"));
21 graphics::grass::Point root;
22 root.position = {point.x, point.y, point.z};
23 root.scale = point.scaleY;
24 root.widthScale = point.scaleX;
25 root.id = uint32_t((point.id ^ (point.id >> 32)) & 0xffffffu);
26 root.tint = {point.colorR, point.colorG, point.colorB};
27 roots.push_back(root);
28 }
29 return image ? field.bakeTexturedPoints(roots, width, height, *image) : field.bakePoints(roots, width, height);
30}
31} // namespace
32Result<int> bakeTerrainGrass(graphics::GrassField& field, const PointSet& points, const std::string& asset, float width,
33 float height) {
34 return bake(field, points, asset, width, height, nullptr);
35}
36Result<int> bakeTerrainGrassImage(graphics::GrassField& field, const PointSet& points, const std::string& asset,
37 float width, float height, const image::ImageData& image) {
38 return bake(field, points, asset, width, height, &image);
39}
41 float width, float height, const image::ImageData& albedo,
44 if (asset.empty())
46 "terrain.grass: asset selector required"));
47 std::vector<graphics::grass::Point> roots;
48 for (int i = 0; i < points.getCount(); ++i) {
49 if (points.getStringAttribute(i, "asset", "") != asset) continue;
50 const auto& point = points.points()[size_t(i)];
51 if (point.id == 0 || point.scaleX != point.scaleZ || point.scaleX <= 0.001F)
54 "terrain.grass: stable ID and equal positive horizontal X/Z scales above 0.001 required"));
56 root.position = {point.x, point.y, point.z}; root.scale = point.scaleY; root.widthScale = point.scaleX;
57 root.id = uint32_t((point.id ^ (point.id >> 32)) & 0xffffffu);
58 root.tint = {point.colorR, point.colorG, point.colorB}; roots.push_back(root);
59 }
60 return field.bakeFoliagePoints(roots, width, height, albedo, normal, mask, settings);
61}
62void exposeTerrainGrassAdapter(ssq::Table& table) {
63 table.addFunc("bakeTerrainGrassFoliage", [vm = table.getHandle()](graphics::GrassField* field,
64 const PointSet* points, std::string asset, float width, float height, const image::ImageData* albedo,
67 auto result = field && points && albedo && normal && mask && settings
68 ? bakeTerrainGrassFoliage(*field, *points, asset, width, height, *albedo, *normal, *mask, *settings)
69 : Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
70 "terrain.grass: field, points, maps and settings required"));
71 return eve::script::projectResult(vm, std::move(result), [](int n) { return eve::Value(n); });
72 });
73 table.addFunc("bakeTerrainGrassImage", [vm = table.getHandle()](graphics::GrassField* field, const PointSet* points,
74 std::string asset, float width, float height,
75 const image::ImageData* image) {
76 auto result = field && points && image
77 ? bakeTerrainGrassImage(*field, *points, asset, width, height, *image)
79 "terrain.grass: field, points and image required"));
80 return eve::script::projectResult(vm, std::move(result), [](int n) { return eve::Value(n); });
81 });
82 table.addFunc("bakeTerrainGrass", [vm = table.getHandle()](graphics::GrassField* field, const PointSet* points,
83 std::string asset, float width, float height) {
84 auto result = field && points
85 ? bakeTerrainGrass(*field, *points, asset, width, height)
87 "terrain.grass: field and points required"));
88 return eve::script::projectResult(vm, std::move(result), [](int n) { return eve::Value(n); });
89 });
90}
91} // namespace eve::procgen
int root
Definition AnimSmr.cpp:119
int mask
graphics::Texture * albedo
HSQUIRRELVM vm
Definition ECS.cpp:20
vk::UniqueImage image
glm::vec3 n
Definition Grass.cpp:63
std::uint32_t height
std::uint32_t width
Texture * normal
std::string error
Definition Package.cpp:60
std::shared_ptr< const std::vector< glm::vec2 > > points
The single Squirrel projection for common Result, Status and Value.
TerrainThermalSettings settings
glm::vec3 point
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
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 failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
Dense grass + sparse dark tufts on a mesh. Caller owns GrassField*; GPU Mesh / Shader / Texture are o...
Definition Grass.h:193
Represents raw pixel data.
Definition ImageData.h:38
Script-friendly collection of attributed 3D samples.
Definition PointSet.h:59
eve::Diagnostic Diagnostic
eve::Result< T > Result
const EditorValue * field(const EditorValue &value, const char *name)
void exposeTerrainGrassAdapter(ssq::Table &table)
Register full-host grass adapter; VM-thread only, no retained table reference.
Result< int > bakeTerrainGrassImage(graphics::GrassField &field, const PointSet &points, const std::string &asset, float width, float height, const image::ImageData &image)
Upload an asset group using one original static RGBA8 texture instead of the built-in atlas....
Result< int > bakeTerrainGrass(graphics::GrassField &field, const PointSet &points, const std::string &asset, float width, float height)
Upload one asset group from generated points into a grass field using its built-in atlas....
Result< int > bakeTerrainGrassFoliage(graphics::GrassField &field, const PointSet &points, const std::string &asset, float width, float height, const image::ImageData &albedo, const image::ImageData &normal, const image::ImageData &mask, const graphics::grass::GrassFoliageSettings &settings)
Upload a Pcg-style static foliage surface with albedo, normal and packed mask maps.
std::unordered_map< std::string, SkillDefinition > & table()
Definition Skill.cpp:65
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
DiagnosticCode
Stable machine-readable diagnostic codes.
Definition Diagnostic.h:47
Pcg-style static foliage surface controls packed into the grass shader profile. Values are copied dur...
Definition Grass.h:40
Point public API.
Definition Grass.h:74