Partially revert change to BVH render tree update method
Leaves in the bug fixes, but reverts the change to the update method. Turns out the new update method of getting the scenarios was causing problems, I will need to consult with reduz on the best way of getting access to the scenarios for a single update per frame. Doing multiple updates isn't terrible but it should be nicer to get a single update working, as it should be more efficient, and give a single point for pairing callbacks.
This commit is contained in:
parent
6d5daac3e4
commit
2527067c4d
3 changed files with 1 additions and 26 deletions
|
@ -104,7 +104,6 @@ void VisualServerRaster::draw(bool p_swap_buffers, double frame_step) {
|
|||
VSG::rasterizer->begin_frame(frame_step);
|
||||
|
||||
VSG::scene->update_dirty_instances(); //update scene stuff
|
||||
VSG::scene->update_scenarios(); // render tree collision detection (pairing)
|
||||
|
||||
VSG::viewport->draw_viewports();
|
||||
VSG::scene->render_probes();
|
||||
|
|
|
@ -3578,47 +3578,24 @@ void VisualServerScene::_update_dirty_instance(Instance *p_instance) {
|
|||
p_instance->update_materials = false;
|
||||
}
|
||||
|
||||
void VisualServerScene::update_scenarios() {
|
||||
// go through all scenarios and update BVH in each
|
||||
if (!_use_bvh) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<RID> owned;
|
||||
scenario_owner.get_owned_list(&owned);
|
||||
|
||||
for (List<RID>::Element *E = owned.front(); E; E = E->next()) {
|
||||
RID rid = E->get();
|
||||
Scenario *scenario = scenario_owner.get(rid);
|
||||
|
||||
scenario->sps->update();
|
||||
}
|
||||
}
|
||||
|
||||
void VisualServerScene::update_dirty_instances() {
|
||||
|
||||
VSG::storage->update_dirty_resources();
|
||||
|
||||
// only define this if you run into problems with missed pairing collisions for debugging
|
||||
//#define GODOT_RENDER_SPS_EXTRA_COLLISION_CHECKS
|
||||
#ifdef GODOT_RENDER_SPS_EXTRA_COLLISION_CHECKS
|
||||
// this is just to get access to scenario so we can update the spatial partitioning scheme
|
||||
Scenario *scenario = nullptr;
|
||||
if (_instance_update_list.first()) {
|
||||
scenario = _instance_update_list.first()->self()->scenario;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (_instance_update_list.first()) {
|
||||
|
||||
_update_dirty_instance(_instance_update_list.first()->self());
|
||||
}
|
||||
|
||||
#ifdef GODOT_RENDER_SPS_EXTRA_COLLISION_CHECKS
|
||||
if (scenario) {
|
||||
scenario->sps->update_collisions();
|
||||
scenario->sps->update();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool VisualServerScene::free(RID p_rid) {
|
||||
|
|
|
@ -554,7 +554,6 @@ public:
|
|||
void render_camera(RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas);
|
||||
void render_camera(Ref<ARVRInterface> &p_interface, ARVRInterface::Eyes p_eye, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas);
|
||||
void update_dirty_instances();
|
||||
void update_scenarios();
|
||||
|
||||
//probes
|
||||
struct GIProbeDataHeader {
|
||||
|
|
Loading…
Reference in a new issue