载入中...
搜索中...
未找到
VirtualGeometry.cpp
浏览该文件的文档.
3
4#include "common/Exception.h"
5#include "common/Module.h"
6#include "graphics/Graphics.h"
7
8#include <simplesquirrel/simplesquirrel.hpp>
9
10#include <functional>
11#include <string>
12
13namespace eve::virtualgeometry {
14namespace {
15
16std::string currentGraphicsBackend() {
17 auto *gfx = eve::ModuleManager::getInstance<eve::graphics::Graphics>("Graphics");
18 if (!gfx) gfx = eve::graphics::Graphics::create();
19 if (!gfx) return {};
20 return gfx->getBackendName();
21}
22
23} // namespace
24
26
28#ifdef EVENGINE_WEBGPU
29 return false; // virtual geometry currently requires the Vulkan backend.
30#else
31 return currentGraphicsBackend() == "vulkan";
32#endif
33}
34
36#ifdef EVENGINE_WEBGPU
37 throw Exception("VirtualGeometry.newRenderer: requires vulkan Graphics backend");
38#else
39 if (currentGraphicsBackend() != "vulkan")
40 throw Exception("VirtualGeometry.newRenderer: requires vulkan Graphics backend");
41 return new VirtualGeometryRenderer();
42#endif
43}
44
45void VirtualGeometry::expose(ssq::Table &table) {
46 auto cls = table.addClass(name, VirtualGeometry::create, false);
47 expose(cls);
48
49 auto renderer = table.addClass<VirtualGeometryRenderer>(
50 "VirtualGeometryRenderer",
51 std::function<VirtualGeometryRenderer *()>([]() -> VirtualGeometryRenderer * {
52 return nullptr;
53 }),
54 true);
55 renderer.addFunc("buildIcosphere", &VirtualGeometryRenderer::buildIcosphere);
56 renderer.addFunc("setViewport", &VirtualGeometryRenderer::setViewport);
57 renderer.addFunc("setCameraSimple", &VirtualGeometryRenderer::setCameraSimple);
58 renderer.addFunc("setModelYaw", &VirtualGeometryRenderer::setModelYaw);
59 renderer.addFunc("update", &VirtualGeometryRenderer::update);
60 renderer.addFunc("resolve", &VirtualGeometryRenderer::resolveByteData);
61 renderer.addFunc("getViewWidth", &VirtualGeometryRenderer::getViewWidth);
62 renderer.addFunc("getViewHeight", &VirtualGeometryRenderer::getViewHeight);
63 renderer.addFunc("isReady", &VirtualGeometryRenderer::isReady);
64 renderer.addFunc("getClusterCount", &VirtualGeometryRenderer::getClusterCount);
65 renderer.addFunc("getVisibleCount", &VirtualGeometryRenderer::getVisibleCount);
66 renderer.addFunc("getTotalTriangleCount", &VirtualGeometryRenderer::getTotalTriangleCount);
67 renderer.addFunc("getLodLevel", &VirtualGeometryRenderer::getLodLevel);
68 renderer.addFunc("getMaxLodLevel", &VirtualGeometryRenderer::getMaxLodLevel);
69}
70
71void VirtualGeometry::expose(ssq::Class &cls) {
72 cls.addFunc("getName", &VirtualGeometry::getName);
73 cls.addFunc("isAvailable", &VirtualGeometry::isAvailable);
74 cls.addFunc("newRenderer", &VirtualGeometry::newRenderer);
75}
76
77} // namespace eve::virtualgeometry
HSQOBJECT cls
Definition ECS.cpp:21
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
const char * name
Definition RockMesh.cpp:21
virtual std::string getName() const =0
A virtual-geometry renderer: preprocesses a mesh into a cluster DAG, uploads it to the GPU,...
bool buildIcosphere(int subdiv)
Convenience: procedural unit icosphere, subdiv subdivision levels.
void setViewport(int width, int height, float fovYDeg, float errorPx=1.0f)
int update()
Run cull + raster; returns the number of visible clusters.
void setModelYaw(float yaw)
Spin the virtualized model about Y by yaw radians each frame.
void setCameraSimple(float camX, float camY, float camZ, float nearZ=0.1f, float farZ=100.f)
Script-friendly: identity view (camera looking down -Z) + perspective.
eve::data::ByteData * resolveByteData()
Resolve into a heap ByteData (RGBA) for scripting/display.
Virtual-geometry module — Nanite-style virtualized geometry rendering on top of the active Graphics b...
bool isAvailable() const
True when the active Graphics backend can run virtual geometry.
VirtualGeometryRenderer * newRenderer()
Create a virtual-geometry renderer (holds GPU buffers).