载入中...
搜索中...
未找到
BuildingFx.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5// 建筑放置渲染桥(可选模块):监听 building::PlacementWorld 的实例,
6// 按 BuildingDefinition.renderMode 生成 / 同步 / 销毁 Renderable2D 或 Renderable3D,
7// 并提供鬼影预览 + 占地光标 + 网格可视化。
8// 纯逻辑(building)与渲染解耦:本模块依赖 building / graphics / ECS,不反向依赖。
9
10#include "common/Module.h"
11#include "common/Result.h"
12
13#include <cstdint>
14#include <functional>
15#include <string>
16#include <unordered_map>
17#include <utility>
18#include <vector>
19
20namespace eve::building {
21struct BuildingDefinition;
22class Ghost;
23class PlacementWorld;
24class PlacementSession;
25struct PlacedBuilding;
26}
27
28namespace eve::graphics {
29class Graphics;
30class Mesh;
31class Renderable2D;
32class Renderable3D;
33}
34
35namespace eve::buildingfx {
36
39
42public:
45 float x = 0.f;
46 float y = 0.f;
48 bool operator==(const CurveControlPoint &) const = default;
49 };
52 std::vector<float> positions;
53 std::vector<float> normals;
54 std::vector<float> uvs;
55 std::vector<uint32_t> indices;
56 int sampleCount = 0;
57 float length = 0.f;
58 };
61 float x = 0.f;
62 float y = 0.f;
63 float z = 0.f;
64 float normalX = 0.f;
65 float normalY = 1.f;
66 float normalZ = 0.f;
67 };
69 using MeshResolver = std::function<graphics::Mesh *(const std::string &resourceId)>;
71 BuildingFx() = default;
72 ~BuildingFx() override = default;
73
75 bool attach(building::PlacementWorld *world);
76 bool detach(building::PlacementWorld *world);
77 bool isAttached(building::PlacementWorld *world) const;
78 int getAttachedCount() const;
79
82 int getVisualCount(building::PlacementWorld *world) const;
84 void setMeshResolver(MeshResolver resolver) { meshResolver_ = std::move(resolver); }
86 void clearMeshResolver() { meshResolver_ = {}; }
88 std::string getVisualVariant(building::PlacementWorld *world, int instanceId) const;
90 std::string getVisualResource(building::PlacementWorld *world, int instanceId) const;
92 std::string getVisualFallbackReason(building::PlacementWorld *world, int instanceId) const;
94 void setLevelVisibilityMode(building::PlacementWorld *world, const std::string &mode);
96 std::string getLevelVisibilityMode(building::PlacementWorld *world) const;
98 bool isVisualVisible(building::PlacementWorld *world, int instanceId) const;
100 int getCurveGroupCount(building::PlacementWorld *world) const;
102 int getContinuousCurveVisualCount(building::PlacementWorld *world) const;
104 std::string getCurveVisualFallbackReason(building::PlacementWorld *world,
105 int instanceId) const;
106
117 [[nodiscard]] static eve::Result<CurveMeshData>
118 buildEdgeCurveMesh(const building::PlacementWorld &world,
119 const std::vector<CurveControlPoint> &controlPoints, int subdivisions,
120 float width, float height, float elevation = 0.f);
122 [[nodiscard]] static eve::Result<CurveMeshData>
123 buildSurfaceCurveMesh(const std::vector<CurveSurfaceSample> &samples, float width,
124 float height);
125
135 [[nodiscard]] static eve::Result<CurveMeshData>
136 buildEdgeCurveGroupMeshForInstance(const building::PlacementWorld &world, int instanceId,
137 float width, float height, float elevation = 0.f);
138
140 [[nodiscard]] eve::Result<void> updateEdgeCurvePreview(
141 building::PlacementWorld *world, const std::string &buildingId,
142 const std::vector<CurveControlPoint> &controlPoints, int subdivisions, int level = 0);
152 [[nodiscard]] eve::Result<void> updateEdgeCurveSurfacePreview(
154 int subdivisions, const std::string &surfaceName);
156 CurvePreviewUpdateStatus updateEdgeCurveSurfacePreviewStatus(
158 int subdivisions, const std::string &surfaceName);
160 void clearEdgeCurvePreview(building::PlacementWorld *world);
162 bool hasEdgeCurvePreview(building::PlacementWorld *world) const;
164 std::string getEdgeCurvePreviewFallbackReason(building::PlacementWorld *world) const;
166 std::string getEdgeCurvePreviewSurfaceId(building::PlacementWorld *world) const;
168 std::uint64_t getEdgeCurvePreviewSurfaceRevision(building::PlacementWorld *world) const;
169
171 void updateGhost(building::PlacementWorld *world, building::Ghost *ghost);
172 void hideGhost(building::PlacementWorld *world);
176 void clearAreaPreview(building::PlacementWorld *world);
177 int getAreaPreviewCount(building::PlacementWorld *world) const;
178 bool getAreaPreviewAccepted(building::PlacementWorld *world, int index) const;
179
180 void setGridVisible(building::PlacementWorld *world, bool visible);
181 bool getGridVisible(building::PlacementWorld *world) const;
183 void drawGrid2D(building::PlacementWorld *world, graphics::Graphics *gfx);
185 void drawGrid3D(building::PlacementWorld *world, graphics::Graphics *gfx, float height = 0.f);
186
187private:
188 struct Visual {
189 graphics::Renderable2D *r2d = nullptr;
190 graphics::Renderable3D *r3d = nullptr;
191 std::string topologyVariant;
192 std::string resourceId;
193 std::string fallbackReason;
194 int topologyMask = 0;
195 };
196
197 struct WorldState {
199 enum class LevelVisibility { All, Active, ActiveAndBelow };
201 struct HeatCell {
202 int x = 0;
203 int y = 0;
204 bool accepted = false;
205 };
207 struct CurveVisual {
208 graphics::Renderable3D *renderable = nullptr;
211 std::vector<CurveControlPoint> controlPoints;
212 std::vector<int> memberIds;
213 int subdivisions = 0;
214 float width = 0.f;
215 float height = 0.f;
216 float elevation = 0.f;
217 std::string surfaceId;
218 std::uint64_t surfaceRevision = 0;
219 std::string fallbackReason;
220 bool active = false;
221 };
222 std::unordered_map<int, Visual> visuals;
223 std::unordered_map<std::uint64_t, CurveVisual> curveVisuals;
224 CurveVisual curvePreview;
225 LevelVisibility levelVisibility = LevelVisibility::All;
226 Visual ghost;
227 Visual cursor;
228 std::string ghostBuildingId;
229 bool gridVisible = false;
230 std::vector<graphics::Renderable3D *> gridLines;
231 int gridLineCount = -1;
232 std::vector<HeatCell> heatCells;
233 std::vector<graphics::Renderable3D *> heatCells3d;
234 };
235
236 bool is3d(const building::BuildingDefinition &def) const;
237 void createVisual(WorldState &st, const building::BuildingDefinition &def,
239 Visual &v, float alpha);
240 void updateVisual(const building::BuildingDefinition &def,
242 Visual &v);
243 void destroyVisual(Visual &v);
244 void destroyAll(WorldState &st);
245
246 graphics::Mesh *cubeMesh(graphics::Graphics *gfx);
247 void rebuildGridLines(WorldState &st, building::PlacementWorld *world,
248 graphics::Graphics *gfx, float height);
249 void setVisible(Visual &v, bool visible);
250 void destroyHeatmap(WorldState &st);
251 void syncCurveVisuals(WorldState &st, building::PlacementWorld *world);
252 [[nodiscard]] eve::Result<void> presentCurvePreview(
253 WorldState &state, CurveMeshData mesh, std::vector<CurveControlPoint> controls,
254 int subdivisions, float width, float height, float elevation,
255 std::string surfaceId = {}, std::uint64_t surfaceRevision = 0);
256
257 std::unordered_map<building::PlacementWorld *, WorldState> states_;
258 graphics::Mesh *cubeMesh_ = nullptr;
259 MeshResolver meshResolver_;
260};
261
262} // namespace eve::buildingfx
bool & active
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float length
Definition CaveMesh.cpp:94
#define EVENGINE_API_WORLD
Definition Export.h:109
float v
float elevation
std::uint32_t height
std::uint32_t width
int level
World3D * world
Mesh * mesh
Move-only, checked operation results for the common layer.
std::size_t cursor
std::optional< InteractionSession > session
Definition Tactics.cpp:39
std::vector< TileLayer::Tileset::Visual > visuals
bool visible
uint32_t index
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
EVENGINE_API_WORLD public API.
Definition Ghost.h:16
EVENGINE_API_WORLD public API.
格子型建筑放置世界(脚本可直接操作)。
EVENGINE_API_WORLD public API.
Definition BuildingFx.h:41
std::function< graphics::Mesh *(const std::string &resourceId)> MeshResolver
Resolve a stable visual resource id to a borrowed graphics mesh.
Definition BuildingFx.h:69
void setMeshResolver(MeshResolver resolver)
Install the synchronous mesh resolver used by visual3d mesh metadata. @lifetime Returned meshes remai...
Definition BuildingFx.h:84
~BuildingFx() override=default
void clearMeshResolver()
Remove the mesh resolver; configured resources fall back to the primitive cube.
Definition BuildingFx.h:86
GPU mesh handle (+ optional CPU morph targets).
Definition Mesh.h:25
Default renderable entity for declarative 2D sprites / solid quads.
EVENGINE_API_BACKENDS public API.
建筑放置模块入口:定义 / 放置世界 / 鬼影 / 变更事件的脚本绑定点。 设计文档:docs/dev/建筑放置系统设计.md
Definition Building.cpp:7
CurvePreviewUpdateStatus
Script-safe outcome of refreshing a custom-surface curve preview.
Definition BuildingFx.h:38
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
建筑模板(进程级注册表中的定义)。
已放置的建筑实例。
One cubic Bezier control point in logical grid-vertex coordinates.
Definition BuildingFx.h:44
bool operator==(const CurveControlPoint &) const =default
Operator ==.
Owning backend-neutral indexed extrusion generated along an edge curve.
Definition BuildingFx.h:51
One committed world-space centerline frame for terrain-conforming extrusion.
Definition BuildingFx.h:60
std::vector< CurveControlPoint > controlPoints
Definition BuildingFx.h:211