载入中...
搜索中...
未找到
HouseGen.cpp
浏览该文件的文档.
2
4#include "graphics/Graphics.h"
5#include "model3d/Model3D.h"
6
7#include <simplesquirrel/simplesquirrel.hpp>
8
9#include <functional>
10#include <cstdlib>
11#include <utility>
12
13namespace eve::housegen {
14
15eve::Result<void> HouseGen::loadComponentsFromJson(const std::string &json) { return library_.loadFromJson(json); }
17 return library_.loadFromFile(filename);
18}
19void HouseGen::clearComponents() { library_.clear(); }
20int HouseGen::getComponentCount() const { return library_.count(); }
21HouseRequest HouseGen::newRequest() const { return {}; }
22HouseLayout HouseGen::newLayout() const { return {}; }
24 HouseGenerator generator(library_);
25 return generator.generate(request, layout);
26}
27
28void exposeHouseGeneration(ssq::Table &table) {
29 const HSQUIRRELVM vm = table.getHandle();
30 auto cls = table.addClass<HouseGen>("HouseGen", std::function<HouseGen *()>([] { return new HouseGen(); }), true);
32 auto request = table.addClass<HouseRequest>("HouseRequest", std::function<HouseRequest *()>([] { return new HouseRequest(); }), true);
33 request.addFunc("setSeed", [](HouseRequest *r, int v) { r->seed = uint32_t(v); });
34 request.addFunc("setPlot", [](HouseRequest *r, int w, int d) { r->width = w; r->depth = d; });
35 request.addFunc("setFloors", [](HouseRequest *r, int v) { r->floors = v; });
36 request.addFunc("setModuleSize", [](HouseRequest *r, float v) { r->moduleSize = v; });
37 request.addFunc("setFloorHeight", [](HouseRequest *r, float v) { r->floorHeight = v; });
38 request.addFunc("setStyle", [](HouseRequest *r, const std::string &v) { r->style = v; });
39 request.addFunc("setFootprint", [](HouseRequest *r, const std::string &v) { r->footprint = v; });
40 request.addFunc("setRoof", [](HouseRequest *r, const std::string &v) { r->roof = v; });
41 request.addFunc("setEntrance", [](HouseRequest *r, const std::string &v) { r->entrance = v; });
42 request.addFunc("setRequiredRooms", [](HouseRequest *r, const std::string &csv) {
43 r->requiredRooms.clear();
44 std::string current;
45 for (const char c : csv) {
46 if (c == ',') {
47 if (!current.empty()) r->requiredRooms.push_back(current);
48 current.clear();
49 } else {
50 current.push_back(c);
51 }
52 }
53 if (!current.empty()) r->requiredRooms.push_back(current);
54 });
55 request.addFunc("setPerimeter", [](HouseRequest *r, const std::string &csv) {
56 r->perimeter.clear();
57 std::string segment;
58 for (size_t i = 0; i <= csv.size(); ++i) {
59 if (i == csv.size() || csv[i] == ';') {
60 const size_t comma = segment.find(',');
61 if (comma != std::string::npos)
62 r->perimeter.push_back({float(std::atof(segment.substr(0, comma).c_str())),
63 float(std::atof(segment.substr(comma + 1).c_str()))});
64 segment.clear();
65 } else {
66 segment.push_back(csv[i]);
67 }
68 }
69 });
70 auto layout = table.addClass<HouseLayout>("HouseLayout", std::function<HouseLayout *()>([] { return new HouseLayout(); }), true);
71 layout.addFunc("toJson", &HouseLayout::toJson);
72 layout.addFunc("fromJson", [vm](HouseLayout *value, const std::string &json) {
73 if (!value)
76 "layout receiver must not be null", "layout", {},
77 "housegen.squirrel")));
78 return eve::script::projectResult(vm, value->fromJson(json));
79 });
80 layout.addFunc("getInstanceCount", [](HouseLayout *v) { return int(v->instances.size()); });
81 layout.addFunc("getInstanceComponentId", [](HouseLayout *v, int i) {
82 return (v && i >= 0 && i < int(v->instances.size())) ? v->instances[i].componentId : std::string();
83 });
84 layout.addFunc("getInstanceX", [](HouseLayout *v, int i) {
85 return (v && i >= 0 && i < int(v->instances.size())) ? v->instances[i].x : 0;
86 });
87 layout.addFunc("getInstanceY", [](HouseLayout *v, int i) {
88 return (v && i >= 0 && i < int(v->instances.size())) ? v->instances[i].y : 0;
89 });
90 layout.addFunc("getInstanceZ", [](HouseLayout *v, int i) {
91 return (v && i >= 0 && i < int(v->instances.size())) ? v->instances[i].z : 0;
92 });
93 layout.addFunc("getInstanceRotationDeg", [](HouseLayout *v, int i) {
94 return (v && i >= 0 && i < int(v->instances.size())) ? v->instances[i].rotationDeg : 0;
95 });
96 layout.addFunc("getFloorHeight", [](HouseLayout *v) { return v ? v->floorHeight : 3.f; });
97 layout.addFunc("getFootprintStyle", [](HouseLayout *v) { return v ? v->footprintStyle : std::string(); });
98 layout.addFunc("getRoofStyle", [](HouseLayout *v) { return v ? v->roofStyle : std::string(); });
99 layout.addFunc("getRoomCount", [](HouseLayout *v) { return v ? int(v->rooms.size()) : 0; });
100 layout.addFunc("getDiagnosticCount", [](HouseLayout *v) { return int(v->diagnostics.size()); });
101 layout.addFunc("writeFootprintGrid", [vm](HouseLayout *value, procgen::Grid2D *output) {
102 if (!value || !output)
105 "layout and output grid are required",
106 "writeFootprintGrid", {}, "housegen.squirrel")));
107 return eve::script::projectResult(vm, value->writeFootprintGrid(*output));
108 });
109 layout.addFunc("writeComponentPoints", [vm](HouseLayout *value, procgen::PointSet *output) {
110 if (!value || !output)
113 "layout and output point set are required",
114 "writeComponentPoints", {}, "housegen.squirrel")));
115 return eve::script::projectResult(vm, value->writeComponentPoints(*output));
116 });
117}
119 model3d::Model3D &models) const {
120 auto result = layout.instantiate(gfx, models, library_);
122 : eve::Result<void>::failure(result.status());
123}
124
125void HouseGen::expose(ssq::Class &cls) {
126 const HSQUIRRELVM vm = cls.getHandle();
127 cls.addFunc("loadComponentsFromJson", [vm](HouseGen *value, const std::string &json) {
128 if (!value)
131 "HouseGen receiver must not be null", "housegen",
132 {}, "housegen.squirrel")));
133 return eve::script::projectResult(vm, value->loadComponentsFromJson(json));
134 });
135 cls.addFunc("loadComponentsFromFile", [vm](HouseGen *value, const std::string &filename) {
136 if (!value)
139 "HouseGen receiver must not be null", "housegen",
140 {}, "housegen.squirrel")));
141 return eve::script::projectResult(vm, value->loadComponentsFromFile(filename));
142 });
143 cls.addFunc("clearComponents", &HouseGen::clearComponents);
144 cls.addFunc("getComponentCount", &HouseGen::getComponentCount);
145 cls.addFunc("newRequest", &HouseGen::newRequest);
146 cls.addFunc("newLayout", &HouseGen::newLayout);
147 cls.addFunc("generate", [vm](HouseGen *value, HouseRequest *request, HouseLayout *layout) {
148 if (!value || !request || !layout)
151 "HouseGen, request and layout are required",
152 "generate", {}, "housegen.squirrel")));
153 return eve::script::projectResult(vm, value->generate(*request, *layout));
154 });
155 cls.addFunc("instantiate", [vm](HouseGen *value, HouseLayout *layout, graphics::Graphics *gfx,
156 model3d::Model3D *models) {
157 if (!value || !layout || !gfx || !models)
160 "HouseGen, layout, graphics and model3d are required",
161 "instantiate", {}, "housegen.squirrel")));
162 return eve::script::projectResult(vm, value->instantiate(*layout, *gfx, *models));
163 });
164}
165
166} // namespace eve::housegen
double value
float w
Definition AnimClip.cpp:738
std::string output
struct SQVM * HSQUIRRELVM
HSQUIRRELVM vm
Definition ECS.cpp:20
HSQOBJECT cls
Definition ECS.cpp:21
std::string layout
const GltfImportRequest & request
double r
float v
std::int32_t c
float d
double current
The single Squirrel projection for common Result, Status and Value.
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
bool ok() const noexcept
Whether this result represents a non-failure outcome.
Definition Result.h:480
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
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
eve::Result< void > loadFromJson(std::string_view json)
从 JSON / 文件加载组件。
eve::Result< void > loadFromFile(std::string_view filename)
程序化房屋生成模块(eve.HouseGen):组件库 + 布局生成。
Definition HouseGen.h:15
eve::Result< void > instantiate(const HouseLayout &layout, graphics::Graphics &gfx, model3d::Model3D &models) const
Instantiate a generated layout through the current component library.
Definition HouseGen.cpp:118
int getComponentCount() const
组件数量。
Definition HouseGen.cpp:20
eve::Result< void > loadComponentsFromJson(const std::string &json)
从 JSON / 文件加载房屋组件库。
Definition HouseGen.cpp:15
void clearComponents()
清空组件库。
Definition HouseGen.cpp:19
static void expose(ssq::Class &cls)
Definition HouseGen.cpp:125
eve::Result< void > generate(const HouseRequest &request, HouseLayout &layout)
按请求生成布局;失败返回结构化诊断。
Definition HouseGen.cpp:23
eve::Result< void > loadComponentsFromFile(const std::string &filename)
Definition HouseGen.cpp:16
HouseLayout newLayout() const
Definition HouseGen.cpp:22
HouseRequest newRequest() const
工厂:生成请求 / 布局。
Definition HouseGen.cpp:21
布局生成器:把 HouseRequest 解析为 HouseLayout(组件库驱动)。
eve::Result< void > generate(const HouseRequest &request, HouseLayout &out) const
生成布局;失败时不修改输出布局并返回结构化诊断。
一次生成的房屋布局:实例 + 房间 + 元信息,可 JSON 序列化 / 实例化。
Definition HouseLayout.h:23
std::string toJson() const
Serialize or restore the eve.house-layout version 1 JSON schema.
Resource module for decoding 3D models via medialoader (Assimp). Produces ModelData; GPU upload is gr...
Definition Model3D.h:43
Intermediate 2D generation result. cells store semantic ids (see Semantic.h), not tile GIDs — convert...
Definition Grid2D.h:36
Script-friendly collection of attributed 3D samples.
Definition PointSet.h:59
void exposeHouseGeneration(ssq::Table &table)
Register the procgen-owned house generation compatibility API.
Definition HouseGen.cpp:28
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
一次房屋生成请求(参数集)。