mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 22:39:18 +02:00
add cpu-side submodel structure for ray testing
This commit is contained in:
@@ -37,6 +37,7 @@
|
||||
#include <fmt/chrono.h>
|
||||
#include <fmt/format.h>
|
||||
|
||||
#include "rt_model.h"
|
||||
#include "tinyexr.h"
|
||||
|
||||
bool NvRenderer::Init(GLFWwindow *Window) {
|
||||
@@ -71,8 +72,8 @@ bool NvRenderer::Init(GLFWwindow *Window) {
|
||||
InitResourceRegistry();
|
||||
|
||||
RegisterTexture("noise_2d_ldr",
|
||||
GetTextureManager()->FetchTexture(
|
||||
"textures/noise/LDR_RGB1_0", GL_RGBA, 0, false));
|
||||
GetTextureManager()->FetchTexture("textures/noise/LDR_RGB1_0",
|
||||
GL_RGBA, 0, false));
|
||||
|
||||
m_imgui_renderer = std::make_shared<NvImguiRenderer>(this);
|
||||
m_gbuffer = std::make_shared<NvGbuffer>(this);
|
||||
@@ -374,6 +375,22 @@ bool NvRenderer::Render() {
|
||||
m_backend->GetDevice()->executeCommandList(command_list_sky);
|
||||
}
|
||||
|
||||
{
|
||||
glm::dvec2 const mousepos =
|
||||
glm::dvec2(2., -2.) *
|
||||
(static_cast<glm::dvec2>(Global.cursor_pos) /
|
||||
static_cast<glm::dvec2>(Global.window_size) -
|
||||
.5);
|
||||
m_mouse_ro = pass.m_origin;
|
||||
glm::dvec4 mouse_rd_norm =
|
||||
inverse(projection) * glm::dvec4(mousepos, 1., 1.);
|
||||
mouse_rd_norm /= mouse_rd_norm.w;
|
||||
m_mouse_rd =
|
||||
normalize(inverse(transform) * glm::dvec4(mouse_rd_norm.xyz, 0.));
|
||||
}
|
||||
|
||||
m_picked_submodel = nullptr;
|
||||
|
||||
if (!m_pause_animations) {
|
||||
Animate(pass.m_origin, pass.m_draw_range, pass.m_frame_index);
|
||||
}
|
||||
@@ -729,10 +746,9 @@ void NvRenderer::SwapBuffers() {
|
||||
m_backend->GetDevice()->runGarbageCollection();
|
||||
}
|
||||
|
||||
float NvRenderer::Framerate() {
|
||||
|
||||
return 1000.f / (Timer::subsystem.mainloop_total.average());
|
||||
//return 0.0f;
|
||||
float NvRenderer::Framerate() {
|
||||
return 1000.f / (Timer::subsystem.mainloop_total.average());
|
||||
// return 0.0f;
|
||||
}
|
||||
|
||||
gfx::geometrybank_handle NvRenderer::Create_Bank() {
|
||||
@@ -1061,12 +1077,14 @@ ITexture const &NvRenderer::Texture(texture_handle const Texture) const {
|
||||
}
|
||||
|
||||
void NvRenderer::Pick_Control_Callback(
|
||||
std::function<void(TSubModel const *, const glm::vec2)> Callback) {}
|
||||
std::function<void(TSubModel const *, const glm::vec2)> Callback) {
|
||||
Callback(m_picked_submodel, {});
|
||||
}
|
||||
|
||||
void NvRenderer::Pick_Node_Callback(
|
||||
std::function<void(scene::basic_node *)> Callback) {}
|
||||
|
||||
TSubModel const *NvRenderer::Pick_Control() const { return nullptr; }
|
||||
TSubModel const *NvRenderer::Pick_Control() const { return m_picked_submodel; }
|
||||
|
||||
scene::basic_node const *NvRenderer::Pick_Node() const { return nullptr; }
|
||||
|
||||
@@ -1217,6 +1235,17 @@ void NvRenderer::MakeScreenshot() {
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<Rt::IRtModel> NvRenderer::GetRtModel(TModel3d const *model) {
|
||||
if (!model) {
|
||||
return nullptr;
|
||||
}
|
||||
auto &entry = rt_models[model];
|
||||
if (!entry) {
|
||||
entry = Rt::CreateRtModel(model, this);
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
MaConfig *NvRenderer::Config() {
|
||||
NvRenderer *me = dynamic_cast<NvRenderer *>(GfxRenderer.get());
|
||||
return me ? me->GetConfig() : nullptr;
|
||||
@@ -1873,6 +1902,10 @@ void NvRenderer::Animate(DynObj &instance, const glm::dvec3 &origin,
|
||||
if (render_kabina) {
|
||||
Animate(instance.m_renderable_kabina, instance.m_dynamic->mdKabina,
|
||||
material, instance.m_distance, dynamic_transform, frame);
|
||||
if (auto const rt_model = GetRtModel(instance.m_dynamic->mdKabina)) {
|
||||
m_picked_submodel = rt_model->Intersect(instance.m_renderable_kabina,
|
||||
m_mouse_ro, m_mouse_rd);
|
||||
}
|
||||
}
|
||||
|
||||
if (instance.m_dynamic->btnOn) instance.m_dynamic->TurnOff();
|
||||
|
||||
Reference in New Issue
Block a user