载入中...
搜索中...
未找到
Voxel.cpp
浏览该文件的文档.
1#include "voxel/Voxel.h"
2
3#include "voxel/FaceDir.h"
4
5#include "data/ByteData.h"
6#include "graphics/Graphics.h"
8
9#include <simplesquirrel/simplesquirrel.hpp>
10#include <squirrel.h>
11
12#include <functional>
13
14namespace eve::voxel {
15namespace {
16
18SQInteger sqSetVoxelByName(HSQUIRRELVM vm) {
19 const SQInteger n = sq_gettop(vm);
20 if (n < 5 || n > 6) return sq_throwerror(vm, "wrong number of parameters");
21 VoxelWorld* world = nullptr;
22 if (SQ_FAILED(sq_getinstanceup(vm, 1, reinterpret_cast<SQUserPointer*>(&world), nullptr)) ||
23 !world)
24 return sq_throwerror(vm, "invalid VoxelWorld");
25 SQInteger wx = 0, wy = 0, wz = 0, orientation = 0;
26 const SQChar* name = nullptr;
27 if (SQ_FAILED(sq_getinteger(vm, 2, &wx)) || SQ_FAILED(sq_getinteger(vm, 3, &wy)) ||
28 SQ_FAILED(sq_getinteger(vm, 4, &wz)) || SQ_FAILED(sq_getstring(vm, 5, &name)))
29 return sq_throwerror(vm, "setVoxelByName expects (x, y, z, name [, orientation])");
30 if (n >= 6 && SQ_FAILED(sq_getinteger(vm, 6, &orientation)))
31 return sq_throwerror(vm, "setVoxelByName orientation must be an integer");
32 world->setVoxelByName(static_cast<int>(wx), static_cast<int>(wy), static_cast<int>(wz),
33 name ? name : "", static_cast<int>(orientation));
34 return 0;
35}
36
38SQInteger sqStreamAround(HSQUIRRELVM vm) {
39 const SQInteger n = sq_gettop(vm);
40 if (n < 5 || n > 6) return sq_throwerror(vm, "wrong number of parameters");
41 VoxelWorld *world = nullptr;
42 if (SQ_FAILED(sq_getinstanceup(vm, 1, reinterpret_cast<SQUserPointer *>(&world), nullptr)) ||
43 !world)
44 return sq_throwerror(vm, "invalid VoxelWorld");
45 SQInteger cx = 0, cy = 0, cz = 0, radius = 0, maxCreates = 0;
46 if (SQ_FAILED(sq_getinteger(vm, 2, &cx)) || SQ_FAILED(sq_getinteger(vm, 3, &cy)) ||
47 SQ_FAILED(sq_getinteger(vm, 4, &cz)) || SQ_FAILED(sq_getinteger(vm, 5, &radius)))
48 return sq_throwerror(vm, "streamAround expects (cx, cy, cz, radius [, maxCreates])");
49 if (n >= 6 && SQ_FAILED(sq_getinteger(vm, 6, &maxCreates)))
50 return sq_throwerror(vm, "streamAround maxCreates must be an integer");
51 const StreamStats stats =
52 world->streamAround(int(cx), int(cy), int(cz), int(radius), {}, int(maxCreates));
53 sq_pushinteger(vm, stats.created);
54 return 1;
55}
56
57} // namespace
58
60
62
64 return types ? new VoxelWorld(*types) : new VoxelWorld();
65}
66
67void Voxel::expose(ssq::Table &table) {
68 auto cls = table.addClass(name, Voxel::create, false);
69 expose(cls);
70
71 auto cubeTypes = table.addClass<CubeTypeRegistry>(
72 "VoxelCubeTypes", std::function<CubeTypeRegistry *()>(
73 []() -> CubeTypeRegistry * { return new CubeTypeRegistry(); }),
74 true);
75 cubeTypes.addFunc("loadFromJson",
76 std::function<int(CubeTypeRegistry *, const std::string &)>(
77 [](CubeTypeRegistry *r, const std::string &json) {
78 return r->loadFromJson(json, nullptr);
79 }));
80 cubeTypes.addFunc("count", &CubeTypeRegistry::count);
81 cubeTypes.addFunc("variantCount", &CubeTypeRegistry::variantCount);
82 cubeTypes.addFunc("clear", &CubeTypeRegistry::clear);
83
84 auto world = table.addClass<VoxelWorld>(
85 "VoxelWorld", std::function<VoxelWorld *()>([]() -> VoxelWorld * { return nullptr; }), true);
86 world.addFunc("hasChunk", &VoxelWorld::hasChunk);
87 world.addFunc("removeChunk", &VoxelWorld::removeChunk);
88 world.addFunc("unloadChunksOutside", &VoxelWorld::unloadChunksOutside);
89 world.addFunc("setStreamCacheChunks", &VoxelWorld::setStreamCacheChunks);
90 world.addFunc("getStreamCacheChunks", &VoxelWorld::getStreamCacheChunks);
91 {
92 HSQUIRRELVM vm = table.getHandle();
93 sq_pushobject(vm, world.getRaw());
94 sq_pushstring(vm, "streamAround", -1);
95 sq_newclosure(vm, sqStreamAround, 0);
96 sq_setparamscheck(vm, -5, _SC("xiiii|i"));
97 sq_newslot(vm, -3, SQFalse);
98 sq_poptop(vm);
99 }
100 world.addFunc(
101 "setTerrain",
102 std::function<void(VoxelWorld *, int, int, int, int, float, float, float)>(
103 [](VoxelWorld *w, int seed, int top, int sub, int stone, float baseHeight,
104 float amplitude, float scale) {
105 if (!w) return;
106 w->setTerrainParams(uint32_t(seed), uint8_t(top), uint8_t(sub), uint8_t(stone),
107 baseHeight, amplitude, scale);
108 }));
109 world.addFunc("setTerrainParam", &VoxelWorld::setTerrainParam);
110 world.addFunc("terrainHeightAt", &VoxelWorld::terrainHeightAt);
111 world.addFunc(
112 "loadTerrainAsset",
113 std::function<bool(VoxelWorld *, data::ByteData *, float, float)>(
114 [](VoxelWorld *w, data::ByteData *bytes, float offset, float scale) {
115 return w && w->loadTerrainAsset(bytes, offset, scale);
116 }));
117 world.addFunc(
118 "streamTerrainAssetAround",
119 std::function<int(VoxelWorld *, int, int, int, int)>(
120 [](VoxelWorld *w, int wx, int wz, int radius, int maxLoads) {
121 return w ? w->streamTerrainAssetAround(wx, wz, radius, maxLoads).loaded : 0;
122 }));
123 world.addFunc(
124 "setTerrainAssetMaterials",
125 std::function<void(VoxelWorld *, int, int, int, int, int)>(
126 [](VoxelWorld *w, int vegetation, int sand, int snow, int alpine, int riverbed) {
127 if (w) w->setTerrainAssetMaterials(uint8_t(vegetation), uint8_t(sand),
128 uint8_t(snow), uint8_t(alpine),
129 uint8_t(riverbed));
130 }));
131 world.addFunc("getTerrainAssetResidentCount", &VoxelWorld::getTerrainAssetResidentCount);
132 world.addFunc("disableTerrain", &VoxelWorld::disableTerrain);
133 world.addFunc("saveWorld", &VoxelWorld::saveWorld);
134 world.addFunc("loadWorld", &VoxelWorld::loadWorld);
135 world.addFunc("clear", &VoxelWorld::clear);
136 world.addFunc("getChunkCount", &VoxelWorld::getChunkCount);
137 world.addFunc("getRevision", &VoxelWorld::getRevision);
138 world.addFunc("getDirtyCount", &VoxelWorld::getDirtyCount);
139 world.addFunc("getInflightStreamCount", &VoxelWorld::getInflightStreamCount);
140 world.addFunc("remeshDirty",
141 std::function<int(VoxelWorld *)>([](VoxelWorld *w) -> int {
142 return w ? w->remeshDirty() : 0;
143 }));
144 world.addFunc("getVoxel", &VoxelWorld::getVoxel);
145 world.addFunc("setVoxel", &VoxelWorld::setVoxel);
146 // C++ default args are not visible to Squirrel; accept 4 or 5 parameters.
147 {
148 HSQUIRRELVM vm = table.getHandle();
149 sq_pushobject(vm, world.getRaw());
150 sq_pushstring(vm, "setVoxelByName", -1);
151 sq_newclosure(vm, sqSetVoxelByName, 0);
152 sq_setparamscheck(vm, -5, _SC("xiiis|i"));
153 sq_newslot(vm, -3, SQFalse);
154 sq_poptop(vm);
155 }
156 world.addFunc("getCubeTypeName", &VoxelWorld::getCubeTypeName);
157 world.addFunc("getCubeTypeTex", &VoxelWorld::getCubeTypeTex);
158 world.addFunc(
159 "raycast",
160 std::function<bool(VoxelWorld *, float, float, float, float, float, float, float)>(
161 [](VoxelWorld *w, float ox, float oy, float oz, float dx, float dy, float dz,
162 float maxDist) -> bool {
163 return w && w->raycastScript(ox, oy, oz, dx, dy, dz, maxDist);
164 }));
165 world.addFunc("lastRaycastHit", &VoxelWorld::lastRaycastHit);
166 world.addFunc("getRaycastHitX", &VoxelWorld::lastRaycastHitX);
167 world.addFunc("getRaycastHitY", &VoxelWorld::lastRaycastHitY);
168 world.addFunc("getRaycastHitZ", &VoxelWorld::lastRaycastHitZ);
169 world.addFunc("getRaycastPrevX", &VoxelWorld::lastRaycastPrevX);
170 world.addFunc("getRaycastPrevY", &VoxelWorld::lastRaycastPrevY);
171 world.addFunc("getRaycastPrevZ", &VoxelWorld::lastRaycastPrevZ);
172 world.addFunc("getRaycastFaceX", &VoxelWorld::lastRaycastFaceX);
173 world.addFunc("getRaycastFaceY", &VoxelWorld::lastRaycastFaceY);
174 world.addFunc("getRaycastFaceZ", &VoxelWorld::lastRaycastFaceZ);
175 world.addFunc("getVisibleBatchCount", &VoxelWorld::getVisibleBatchCount);
176 world.addFunc("getVisibleChunkCount", &VoxelWorld::getVisibleChunkCount);
177 world.addFunc("getVisibleRectCount", &VoxelWorld::getVisibleRectCount);
178 world.addFunc(
179 "selectVisible",
180 std::function<void(VoxelWorld *, float, float, float, float, float, float, float, float,
181 float, float, float, float, float, float, float, float, float, float,
182 float, float, bool)>(
183 [](VoxelWorld *w, float m0, float m1, float m2, float m3, float m4, float m5, float m6,
184 float m7, float m8, float m9, float m10, float m11, float m12, float m13, float m14,
185 float m15, float eyeX, float eyeY, float eyeZ, float viewRange, bool faceCull) {
186 if (!w) return;
187 float vp[16] = {m0, m1, m2, m3, m4, m5, m6, m7,
188 m8, m9, m10, m11, m12, m13, m14, m15};
189 w->selectVisible(vp, eyeX, eyeY, eyeZ, viewRange, faceCull);
190 }));
191 world.addFunc("drawVisible", &VoxelWorld::drawVisible);
192}
193
194void Voxel::expose(ssq::Class &cls) {
195 cls.addFunc("getChunkSize", &Voxel::getChunkSize);
196 cls.addFunc("newCubeTypes", &Voxel::newCubeTypes);
197 cls.addFunc("newWorld", std::function<VoxelWorld *(Voxel *)>(
198 [](Voxel *m) -> VoxelWorld * { return m->newWorld(nullptr); }));
199 cls.addFunc("newWorldWithTypes",
200 std::function<VoxelWorld *(Voxel *, CubeTypeRegistry *)>(
201 [](Voxel *m, CubeTypeRegistry *types) -> VoxelWorld * {
202 return m->newWorld(types);
203 }));
204}
205
206} // namespace eve::voxel
SQInteger top
float w
Definition AnimClip.cpp:738
float cx
Definition CardTypes.cpp:33
float cy
Definition CardTypes.cpp:34
struct SQVM * HSQUIRRELVM
HSQUIRRELVM vm
Definition ECS.cpp:20
HSQOBJECT cls
Definition ECS.cpp:21
glm::vec3 n
Definition Grass.cpp:63
double r
size_t offset
std::array< float, 3 > scale
std::uint64_t bytes
std::string name
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:26
OnnxTransferStats stats
Definition OnnxGpgpu.cpp:56
World3D * world
float radius
std::uint32_t seed
Definition PointSet.cpp:807
float dz
float dy
float dx
double oy
double ox
float m[16]
float wz
float wx
float wy
EVENGINE_API_DOMAINS public API.
int variantCount() const
类型总数(含方向变体,不含空气占位)。
int count() const
命名的方块类型数量(不含方向变体)。
Sparse chunk map + visibility selection (frustum + distance + face orientation). Meshing is neighbor-...
Definition VoxelWorld.h:60
int lastRaycastHitY() const
Last raycast hit y.
Definition VoxelWorld.h:242
data::ByteData * saveWorld() const
Script-facing wrappers around serialize/deserialize.
int terrainHeightAt(int wx, int wz) const
Terrain height (world blocks) at a column for the configured seed.
int getTerrainAssetResidentCount() const
Returns the terrain asset resident count.
Definition VoxelWorld.h:155
uint8_t getCubeTypeTex(int wx, int wy, int wz, const std::string &faceDir) const
该体素在某面方向上的纹理 id(faceDir 如 "posX"/"+y"/"negZ")。
int lastRaycastHitZ() const
Last raycast hit z.
Definition VoxelWorld.h:244
uint8_t getVoxel(int wx, int wy, int wz) const
World-space voxel get/set. Air (0) never allocates a chunk; a border edit also invalidates the adjace...
void drawVisible(graphics::Graphics *gfx, graphics::Texture *atlas, int tilesPerRow=16)
Issue Graphics::drawVoxelFaceInstances for every visible batch. Requires begin3DFrame + setMesh3DView...
bool lastRaycastHit() const
Last raycast hit.
Definition VoxelWorld.h:238
int getVisibleChunkCount() const
Script accessors for the last selectVisible result.
Definition VoxelWorld.h:205
int lastRaycastHitX() const
Last raycast hit x.
Definition VoxelWorld.h:240
void setVoxel(int wx, int wy, int wz, uint8_t texId)
Sets the voxel.
int getVisibleBatchCount() const
Returns the visible batch count.
Definition VoxelWorld.h:200
int getChunkCount() const
Returns the chunk count.
Definition VoxelWorld.h:83
int getDirtyCount() const
Number of chunks whose mesh is stale.
int lastRaycastFaceX() const
Last raycast face x.
Definition VoxelWorld.h:252
int lastRaycastPrevY() const
Last raycast prev y.
Definition VoxelWorld.h:248
int lastRaycastFaceZ() const
Last raycast face z.
Definition VoxelWorld.h:256
uint64_t getRevision() const
Monotonic content revision incremented by voxel/chunk mutations.
Definition VoxelWorld.h:85
std::string getCubeTypeName(int wx, int wy, int wz) const
该体素所属方块类型名(未注册或空气返回空串)。
bool loadWorld(data::ByteData *bytes)
Loads world.
void disableTerrain()
Disables terrain.
int lastRaycastPrevX() const
Last raycast prev x.
Definition VoxelWorld.h:246
int getInflightStreamCount() const
Terrain jobs still running (not yet inserted into the world).
void removeChunk(int cx, int cy, int cz)
Removes chunk.
bool hasChunk(int cx, int cy, int cz) const
True when chunk.
int lastRaycastFaceY() const
Last raycast face y.
Definition VoxelWorld.h:254
int getVisibleRectCount() const
Returns the visible rect count.
void setStreamCacheChunks(int extraChunks)
Extra chunk radius kept after leaving the stream sphere. streamAround still creates only inside radiu...
int lastRaycastPrevZ() const
Last raycast prev z.
Definition VoxelWorld.h:250
int unloadChunksOutside(int centerX, int centerY, int centerZ, int radiusChunks)
Streaming eviction: drop chunks whose center is farther than radiusChunks chunk units from (centerX,...
void setTerrainParam(const std::string &key, float value)
细粒度地形参数配置(脚本用)。key 支持: seed/top/sub/stone/sand/base/amplitude/scale(=frequency)/ octaves/lacunarity/g...
int getStreamCacheChunks() const
Returns the stream cache chunks.
Definition VoxelWorld.h:102
High-performance voxel rendering module.
Definition Voxel.h:31
Voxel()=default
Voxel.
CubeTypeRegistry * newCubeTypes()
返回一个新的方块类型注册表(由调用者持有 / 脚本持有)。
Definition Voxel.cpp:61
int getChunkSize() const
Returns the chunk size.
Definition Voxel.h:40
VoxelWorld * newWorld(const CubeTypeRegistry *types=nullptr)
创建世界;内部拷贝注册表(传 nullptr 表示空注册表,类型 id 即纹理 id)。
Definition Voxel.cpp:63
std::unordered_map< std::string, SkillDefinition > & table()
Definition Skill.cpp:65
方块类型定义:名字、各面图集纹理、方向性、组合声明。 方向性方块在注册时按 orientation 绕 Y 轴展开成多个"具体类型"变体, 每个变体持有旋转后的各面纹理;渲染端只消费纹理 id,不接触 ...
Definition Chunk.h:12