new object flag: not visible in main camera

This commit is contained in:
Turánszki János
2023-09-29 09:14:27 +02:00
parent ae1db0542b
commit be5b87b300
6 changed files with 56 additions and 44 deletions
+21 -1
View File
@@ -365,7 +365,7 @@ void ObjectWindow::Create(EditorComponent* _editor)
AddWidget(&navmeshCheckBox);
foregroundCheckBox.Create("Foreground: ");
foregroundCheckBox.SetTooltip("Set object to be rendered in the foreground. This is useful for first person hands or weapons.");
foregroundCheckBox.SetTooltip("Set object to be rendered in the foreground.\nThis is useful for first person hands or weapons, so that they not clip into walls and other objects.");
foregroundCheckBox.SetSize(XMFLOAT2(hei, hei));
foregroundCheckBox.SetPos(XMFLOAT2(x, y += step));
foregroundCheckBox.SetCheck(true);
@@ -382,6 +382,24 @@ void ObjectWindow::Create(EditorComponent* _editor)
});
AddWidget(&foregroundCheckBox);
notVisibleInMainCameraCheckBox.Create("Not visible in main camera: ");
notVisibleInMainCameraCheckBox.SetTooltip("Set object to be not rendered in the main camera.\nThis is useful for first person character model, as the character will still be rendered in reflections and shadows.");
notVisibleInMainCameraCheckBox.SetSize(XMFLOAT2(hei, hei));
notVisibleInMainCameraCheckBox.SetPos(XMFLOAT2(x, y += step));
notVisibleInMainCameraCheckBox.SetCheck(true);
notVisibleInMainCameraCheckBox.OnClick([&](wi::gui::EventArgs args) {
wi::scene::Scene& scene = editor->GetCurrentScene();
for (auto& x : editor->translator.selected)
{
ObjectComponent* object = scene.objects.GetComponent(x.entity);
if (object != nullptr)
{
object->SetNotVisibleInMainCamera(args.bValue);
}
}
});
AddWidget(&notVisibleInMainCameraCheckBox);
ditherSlider.Create(0, 1, 0, 1000, "Transparency: ");
ditherSlider.SetTooltip("Adjust transparency of the object. Opaque materials will use dithered transparency in this case!");
ditherSlider.SetSize(XMFLOAT2(wid, hei));
@@ -691,6 +709,7 @@ void ObjectWindow::SetEntity(Entity entity)
renderableCheckBox.SetCheck(object->IsRenderable());
shadowCheckBox.SetCheck(object->IsCastingShadow());
foregroundCheckBox.SetCheck(object->IsForeground());
notVisibleInMainCameraCheckBox.SetCheck(object->IsNotVisibleInMainCamera());
navmeshCheckBox.SetCheck(object->filterMask & wi::enums::FILTER_NAVIGATION_MESH);
cascadeMaskSlider.SetValue((float)object->cascadeMask);
ditherSlider.SetValue(object->GetTransparency());
@@ -767,6 +786,7 @@ void ObjectWindow::ResizeLayout()
add_right(renderableCheckBox);
add_right(shadowCheckBox);
add_right(foregroundCheckBox);
add_right(notVisibleInMainCameraCheckBox);
add_right(navmeshCheckBox);
add(ditherSlider);
add(cascadeMaskSlider);
+1
View File
@@ -15,6 +15,7 @@ public:
wi::gui::CheckBox shadowCheckBox;
wi::gui::CheckBox navmeshCheckBox;
wi::gui::CheckBox foregroundCheckBox;
wi::gui::CheckBox notVisibleInMainCameraCheckBox;
wi::gui::Slider ditherSlider;
wi::gui::Slider cascadeMaskSlider;
wi::gui::Slider lodSlider;
+13 -34
View File
@@ -792,8 +792,9 @@ namespace wi
wi::renderer::DRAWSCENE_IMPOSTOR |
wi::renderer::DRAWSCENE_HAIRPARTICLE |
wi::renderer::DRAWSCENE_TESSELLATION |
wi::renderer::DRAWSCENE_OCCLUSIONCULLING
;
wi::renderer::DRAWSCENE_OCCLUSIONCULLING |
wi::renderer::DRAWSCENE_MAINCAMERA
;
// Main camera depth prepass + occlusion culling:
cmd = device->BeginCommandList();
@@ -849,7 +850,8 @@ namespace wi
RENDERPASS_PREPASS,
cmd,
wi::renderer::DRAWSCENE_OPAQUE |
wi::renderer::DRAWSCENE_FOREGROUND_ONLY
wi::renderer::DRAWSCENE_FOREGROUND_ONLY |
wi::renderer::DRAWSCENE_MAINCAMERA
);
// Regular:
@@ -1077,23 +1079,10 @@ namespace wi
Viewport vp;
vp.width = (float)depthBuffer_Reflection.GetDesc().width;
vp.height = (float)depthBuffer_Reflection.GetDesc().height;
// Foreground:
vp.min_depth = 1 - foreground_depth_range;
vp.max_depth = 1;
device->BindViewports(1, &vp, cmd);
wi::renderer::DrawScene(
visibility_reflection,
RENDERPASS_PREPASS,
cmd,
wi::renderer::DRAWSCENE_OPAQUE |
wi::renderer::DRAWSCENE_FOREGROUND_ONLY
);
// Regular:
vp.min_depth = 0;
vp.max_depth = 1;
device->BindViewports(1, &vp, cmd);
wi::renderer::DrawScene(
visibility_reflection,
RENDERPASS_PREPASS,
@@ -1174,23 +1163,10 @@ namespace wi
Viewport vp;
vp.width = (float)depthBuffer_Reflection.GetDesc().width;
vp.height = (float)depthBuffer_Reflection.GetDesc().height;
// Foreground:
vp.min_depth = 1 - foreground_depth_range;
vp.max_depth = 1;
device->BindViewports(1, &vp, cmd);
wi::renderer::DrawScene(
visibility_reflection,
RENDERPASS_MAIN,
cmd,
wi::renderer::DRAWSCENE_OPAQUE |
wi::renderer::DRAWSCENE_FOREGROUND_ONLY
);
// Regular:
vp.min_depth = 0;
vp.max_depth = 1;
device->BindViewports(1, &vp, cmd);
wi::renderer::DrawScene(
visibility_reflection,
RENDERPASS_MAIN,
@@ -1419,7 +1395,8 @@ namespace wi
RENDERPASS_MAIN,
cmd,
wi::renderer::DRAWSCENE_OPAQUE |
wi::renderer::DRAWSCENE_FOREGROUND_ONLY
wi::renderer::DRAWSCENE_FOREGROUND_ONLY |
wi::renderer::DRAWSCENE_MAINCAMERA
);
// Regular:
@@ -1869,7 +1846,8 @@ namespace wi
RENDERPASS_MAIN,
cmd,
wi::renderer::DRAWSCENE_TRANSPARENT |
wi::renderer::DRAWSCENE_FOREGROUND_ONLY
wi::renderer::DRAWSCENE_FOREGROUND_ONLY |
wi::renderer::DRAWSCENE_MAINCAMERA
);
// Regular:
@@ -1884,7 +1862,8 @@ namespace wi
wi::renderer::DRAWSCENE_OCCLUSIONCULLING |
wi::renderer::DRAWSCENE_HAIRPARTICLE |
wi::renderer::DRAWSCENE_TESSELLATION |
wi::renderer::DRAWSCENE_OCEAN
wi::renderer::DRAWSCENE_OCEAN |
wi::renderer::DRAWSCENE_MAINCAMERA
);
device->EventEnd(cmd);
+15 -9
View File
@@ -5696,6 +5696,7 @@ void DrawScene(
const bool ocean = flags & DRAWSCENE_OCEAN;
const bool skip_planar_reflection_objects = flags & DRAWSCENE_SKIP_PLANAR_REFLECTION_OBJECTS;
const bool foreground_only = flags & DRAWSCENE_FOREGROUND_ONLY;
const bool maincamera = flags & DRAWSCENE_MAINCAMERA;
device->EventBegin("DrawScene", cmd);
device->BindShadingRate(ShadingRate::RATE_1X1, cmd);
@@ -5734,15 +5735,20 @@ void DrawScene(
continue;
const ObjectComponent& object = vis.scene->objects[instanceIndex];
if (object.IsRenderable() && object.IsForeground() == foreground_only && (object.GetFilterMask() & filterMask))
{
const float distance = wi::math::Distance(vis.camera->Eye, object.center);
if (distance > object.fadeDistance + object.radius)
{
continue;
}
renderQueue.add(object.mesh_index, instanceIndex, distance, object.sort_bits);
}
if (!object.IsRenderable())
continue;
if (foreground_only && !object.IsForeground())
continue;
if (maincamera && object.IsNotVisibleInMainCamera())
continue;
if ((object.GetFilterMask() & filterMask) == 0)
continue;
const float distance = wi::math::Distance(vis.camera->Eye, object.center);
if (distance > object.fadeDistance + object.radius)
continue;
renderQueue.add(object.mesh_index, instanceIndex, distance, object.sort_bits);
}
if (!renderQueue.empty())
{
+1
View File
@@ -208,6 +208,7 @@ namespace wi::renderer
DRAWSCENE_OCEAN = 1 << 6, // include ocean
DRAWSCENE_SKIP_PLANAR_REFLECTION_OBJECTS = 1 << 7, // don't draw subsets which have planar reflection material
DRAWSCENE_FOREGROUND_ONLY = 1 << 8, // only include objects that are tagged as foreground
DRAWSCENE_MAINCAMERA = 1 << 9, // If this is active, then ObjectComponent with SetNotVisibleInMainCamera(true) won't be drawn
};
// Draw the world from a camera. You must call BindCameraCB() at least once in this frame prior to this
+5
View File
@@ -666,6 +666,7 @@ namespace wi::scene
LIGHTMAP_RENDER_REQUEST = 1 << 5,
LIGHTMAP_DISABLE_BLOCK_COMPRESSION = 1 << 6,
FOREGROUND = 1 << 7,
NOT_VISIBLE_IN_MAIN_CAMERA = 1 << 8,
};
uint32_t _flags = RENDERABLE | CAST_SHADOW;
@@ -704,7 +705,10 @@ namespace wi::scene
inline void SetRequestPlanarReflection(bool value) { if (value) { _flags |= REQUEST_PLANAR_REFLECTION; } else { _flags &= ~REQUEST_PLANAR_REFLECTION; } }
inline void SetLightmapRenderRequest(bool value) { if (value) { _flags |= LIGHTMAP_RENDER_REQUEST; } else { _flags &= ~LIGHTMAP_RENDER_REQUEST; } }
inline void SetLightmapDisableBlockCompression(bool value) { if (value) { _flags |= LIGHTMAP_DISABLE_BLOCK_COMPRESSION; } else { _flags &= ~LIGHTMAP_DISABLE_BLOCK_COMPRESSION; } }
// Foreground object will be rendered in front of regular objects
inline void SetForeground(bool value) { if (value) { _flags |= FOREGROUND; } else { _flags &= ~FOREGROUND; } }
// With this you can disable object rendering for main camera (DRAWSCENE_MAINCAMERA)
inline void SetNotVisibleInMainCamera(bool value) { if (value) { _flags |= NOT_VISIBLE_IN_MAIN_CAMERA; } else { _flags &= ~NOT_VISIBLE_IN_MAIN_CAMERA; } }
inline bool IsRenderable() const { return _flags & RENDERABLE; }
inline bool IsCastingShadow() const { return _flags & CAST_SHADOW; }
@@ -713,6 +717,7 @@ namespace wi::scene
inline bool IsLightmapRenderRequested() const { return _flags & LIGHTMAP_RENDER_REQUEST; }
inline bool IsLightmapDisableBlockCompression() const { return _flags & LIGHTMAP_DISABLE_BLOCK_COMPRESSION; }
inline bool IsForeground() const { return _flags & FOREGROUND; }
inline bool IsNotVisibleInMainCamera() const { return _flags & NOT_VISIBLE_IN_MAIN_CAMERA; }
inline float GetTransparency() const { return 1 - color.w; }
inline uint32_t GetFilterMask() const { return filterMask | filterMaskDynamic; }