载入中...
搜索中...
未找到
Voxel.cpp
浏览该文件的文档.
1#include "voxel/Voxel.h"
2
3#include "voxel/FaceDir.h"
4
5#include "data/ByteData.h"
7
8#include <simplesquirrel/simplesquirrel.hpp>
9
10#include <functional>
11
12namespace eve::voxel {
13
15
17
19 return types ? new VoxelWorld(*types) : new VoxelWorld();
20}
21
22void Voxel::expose(ssq::Table &table) {
23 auto cls = table.addClass(name, Voxel::create, false);
24 expose(cls);
25
26 auto cubeTypes = table.addClass<CubeTypeRegistry>(
27 "VoxelCubeTypes", std::function<CubeTypeRegistry *()>(
28 []() -> CubeTypeRegistry * { return new CubeTypeRegistry(); }),
29 true);
30 cubeTypes.addFunc("loadFromJson",
31 std::function<int(CubeTypeRegistry *, const std::string &)>(
32 [](CubeTypeRegistry *r, const std::string &json) {
33 return r->loadFromJson(json, nullptr);
34 }));
35 cubeTypes.addFunc("count", &CubeTypeRegistry::count);
36 cubeTypes.addFunc("variantCount", &CubeTypeRegistry::variantCount);
37 cubeTypes.addFunc("clear", &CubeTypeRegistry::clear);
38
39 auto world = table.addClass<VoxelWorld>(
40 "VoxelWorld", std::function<VoxelWorld *()>([]() -> VoxelWorld * { return nullptr; }), true);
41 world.addFunc("hasChunk", &VoxelWorld::hasChunk);
42 world.addFunc("removeChunk", &VoxelWorld::removeChunk);
43 world.addFunc("unloadChunksOutside", &VoxelWorld::unloadChunksOutside);
44 world.addFunc(
45 "streamAround",
46 std::function<int(VoxelWorld *, int, int, int, int)>(
47 [](VoxelWorld *w, int cx, int cy, int cz, int radius) -> int {
48 return w ? w->streamAround(cx, cy, cz, radius).created : 0;
49 }));
50 world.addFunc(
51 "setTerrain",
52 std::function<void(VoxelWorld *, int, int, int, int, float, float, float)>(
53 [](VoxelWorld *w, int seed, int top, int sub, int stone, float baseHeight,
54 float amplitude, float scale) {
55 if (!w) return;
56 w->setTerrainParams(uint32_t(seed), uint8_t(top), uint8_t(sub), uint8_t(stone),
57 baseHeight, amplitude, scale);
58 }));
59 world.addFunc("terrainHeightAt", &VoxelWorld::terrainHeightAt);
60 world.addFunc("disableTerrain", &VoxelWorld::disableTerrain);
61 world.addFunc("saveWorld", &VoxelWorld::saveWorld);
62 world.addFunc("loadWorld", &VoxelWorld::loadWorld);
63 world.addFunc("clear", &VoxelWorld::clear);
64 world.addFunc("getChunkCount", &VoxelWorld::getChunkCount);
65 world.addFunc("remeshDirty",
66 std::function<int(VoxelWorld *)>([](VoxelWorld *w) -> int {
67 return w ? w->remeshDirty() : 0;
68 }));
69 world.addFunc("getVoxel", &VoxelWorld::getVoxel);
70 world.addFunc("setVoxel", &VoxelWorld::setVoxel);
71 world.addFunc("setVoxelByName", &VoxelWorld::setVoxelByName);
72 world.addFunc("getCubeTypeName", &VoxelWorld::getCubeTypeName);
73 world.addFunc("getCubeTypeTex", &VoxelWorld::getCubeTypeTex);
74 world.addFunc(
75 "raycast",
76 std::function<bool(VoxelWorld *, float, float, float, float, float, float, float)>(
77 [](VoxelWorld *w, float ox, float oy, float oz, float dx, float dy, float dz,
78 float maxDist) -> bool {
79 return w && w->raycastScript(ox, oy, oz, dx, dy, dz, maxDist);
80 }));
81 world.addFunc("lastRaycastHit", &VoxelWorld::lastRaycastHit);
82 world.addFunc("getRaycastHitX", &VoxelWorld::lastRaycastHitX);
83 world.addFunc("getRaycastHitY", &VoxelWorld::lastRaycastHitY);
84 world.addFunc("getRaycastHitZ", &VoxelWorld::lastRaycastHitZ);
85 world.addFunc("getRaycastPrevX", &VoxelWorld::lastRaycastPrevX);
86 world.addFunc("getRaycastPrevY", &VoxelWorld::lastRaycastPrevY);
87 world.addFunc("getRaycastPrevZ", &VoxelWorld::lastRaycastPrevZ);
88 world.addFunc("getRaycastFaceX", &VoxelWorld::lastRaycastFaceX);
89 world.addFunc("getRaycastFaceY", &VoxelWorld::lastRaycastFaceY);
90 world.addFunc("getRaycastFaceZ", &VoxelWorld::lastRaycastFaceZ);
91 world.addFunc("getVisibleBatchCount", &VoxelWorld::getVisibleBatchCount);
92 world.addFunc("getVisibleChunkCount", &VoxelWorld::getVisibleChunkCount);
93 world.addFunc("getVisibleRectCount", &VoxelWorld::getVisibleRectCount);
94 world.addFunc(
95 "selectVisible",
96 std::function<void(VoxelWorld *, float, float, float, float, float, float, float, float,
97 float, float, float, float, float, float, float, float, float, float,
98 float, float, bool)>(
99 [](VoxelWorld *w, float m0, float m1, float m2, float m3, float m4, float m5, float m6,
100 float m7, float m8, float m9, float m10, float m11, float m12, float m13, float m14,
101 float m15, float eyeX, float eyeY, float eyeZ, float viewRange, bool faceCull) {
102 if (!w) return;
103 float vp[16] = {m0, m1, m2, m3, m4, m5, m6, m7,
104 m8, m9, m10, m11, m12, m13, m14, m15};
105 w->selectVisible(vp, eyeX, eyeY, eyeZ, viewRange, faceCull);
106 }));
107 world.addFunc("drawVisible", &VoxelWorld::drawVisible);
108}
109
110void Voxel::expose(ssq::Class &cls) {
111 cls.addFunc("getChunkSize", &Voxel::getChunkSize);
112 cls.addFunc("newCubeTypes", &Voxel::newCubeTypes);
113 cls.addFunc("newWorld", std::function<VoxelWorld *(Voxel *)>(
114 [](Voxel *m) -> VoxelWorld * { return m->newWorld(nullptr); }));
115 cls.addFunc("newWorldWithTypes",
116 std::function<VoxelWorld *(Voxel *, CubeTypeRegistry *)>(
117 [](Voxel *m, CubeTypeRegistry *types) -> VoxelWorld * {
118 return m->newWorld(types);
119 }));
120}
121
122} // namespace eve::voxel
float cx
Definition CardTypes.cpp:31
float cy
Definition CardTypes.cpp:32
uint32_t seed
HSQOBJECT cls
Definition ECS.cpp:21
int w
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
const char * name
Definition RockMesh.cpp:21
float scale
Definition TreeMesh.cpp:122
float m[16]
int variantCount() const
类型总数(含方向变体,不含空气占位)。
int count() const
命名的方块类型数量(不含方向变体)。
Sparse chunk map + visibility selection (frustum + distance + face orientation). Meshing is neighbor-...
Definition VoxelWorld.h:52
int lastRaycastHitY() const
Definition VoxelWorld.h:161
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.
void setVoxelByName(int wx, int wy, int wz, const std::string &name, int orientation=0)
按方块名 + orientation(0..3) 设置体素;内部解析为具体类型 id 后写 Chunk。 未注册的名字按空气(0)处理。
uint8_t getCubeTypeTex(int wx, int wy, int wz, const std::string &faceDir) const
该体素在某面方向上的纹理 id(faceDir 如 "posX"/"+y"/"negZ")。
int lastRaycastHitZ() const
Definition VoxelWorld.h:162
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...
bool lastRaycastHit() const
Definition VoxelWorld.h:159
int getVisibleChunkCount() const
Script accessors for the last selectVisible result.
Definition VoxelWorld.h:132
int lastRaycastHitX() const
Definition VoxelWorld.h:160
void drawVisible(graphics::IGraphics3D *gfx, graphics::Texture *atlas, int tilesPerRow=16)
Issue Graphics::drawVoxelFaceInstances for every visible batch. Requires begin3DFrame + setMesh3DView...
void setVoxel(int wx, int wy, int wz, uint8_t texId)
int getVisibleBatchCount() const
Definition VoxelWorld.h:128
int getChunkCount() const
Definition VoxelWorld.h:65
int lastRaycastFaceX() const
Definition VoxelWorld.h:166
int lastRaycastPrevY() const
Definition VoxelWorld.h:164
int lastRaycastFaceZ() const
Definition VoxelWorld.h:168
std::string getCubeTypeName(int wx, int wy, int wz) const
该体素所属方块类型名(未注册或空气返回空串)。
bool loadWorld(data::ByteData *bytes)
int lastRaycastPrevX() const
Definition VoxelWorld.h:163
void removeChunk(int cx, int cy, int cz)
bool hasChunk(int cx, int cy, int cz) const
int lastRaycastFaceY() const
Definition VoxelWorld.h:167
int getVisibleRectCount() const
int lastRaycastPrevZ() const
Definition VoxelWorld.h:165
int unloadChunksOutside(int centerX, int centerY, int centerZ, int radiusChunks)
Streaming eviction: drop chunks whose center is farther than radiusChunks chunk units from (centerX,...
High-performance voxel rendering module.
Definition Voxel.h:29
CubeTypeRegistry * newCubeTypes()
返回一个新的方块类型注册表(由调用者持有 / 脚本持有)。
Definition Voxel.cpp:16
int getChunkSize() const
Definition Voxel.h:35
VoxelWorld * newWorld(const CubeTypeRegistry *types=nullptr)
创建世界;内部拷贝注册表(传 nullptr 表示空注册表,类型 id 即纹理 id)。
Definition Voxel.cpp:18
方块类型定义:名字、各面图集纹理、方向性、组合声明。 方向性方块在注册时按 orientation 绕 Y 轴展开成多个"具体类型"变体, 每个变体持有旋转后的各面纹理;渲染端只消费纹理 id,不接触 ...
Definition Chunk.h:12