Batch of lightmapper fixes and minor improvements
- Fix objects with no material being considered as fully transparent by the lightmapper. - Added "environment_min_light" property: gives artistic control over the shadow color. - Fixed "Custom Color" environment mode, it was ignored before. - Added "interior" property to BakedLightmapData: controls whether dynamic capture objects receive environment light or not. - Automatically update dynamic capture objects when the capture data changes (also works for "energy" which used to require object movement to trigger the update). - Added "use_in_baked_light" property to GridMap: controls whether the GridMap will be included in BakedLightmap bakes. - Set "flush zero" and "denormal zero" mode for SSE2 instructions in the Embree raycaster. According to Embree docs it should give a performance improvement.
This commit is contained in:
@ -514,6 +514,8 @@ public:
|
||||
virtual int lightmap_capture_get_octree_cell_subdiv(RID p_capture) const = 0;
|
||||
virtual void lightmap_capture_set_energy(RID p_capture, float p_energy) = 0;
|
||||
virtual float lightmap_capture_get_energy(RID p_capture) const = 0;
|
||||
virtual void lightmap_capture_set_interior(RID p_capture, bool p_interior) = 0;
|
||||
virtual bool lightmap_capture_is_interior(RID p_capture) const = 0;
|
||||
virtual const PoolVector<LightmapCaptureOctree> *lightmap_capture_get_octree_ptr(RID p_capture) const = 0;
|
||||
|
||||
/* PARTICLES */
|
||||
|
||||
@ -396,6 +396,9 @@ public:
|
||||
BIND2(lightmap_capture_set_energy, RID, float)
|
||||
BIND1RC(float, lightmap_capture_get_energy, RID)
|
||||
|
||||
BIND2(lightmap_capture_set_interior, RID, bool)
|
||||
BIND1RC(bool, lightmap_capture_is_interior, RID)
|
||||
|
||||
/* PARTICLES */
|
||||
|
||||
BIND0R(RID, particles_create)
|
||||
|
||||
@ -1085,6 +1085,13 @@ void VisualServerScene::_update_instance(Instance *p_instance) {
|
||||
VSG::storage->particles_set_emission_transform(p_instance->base, p_instance->transform);
|
||||
}
|
||||
|
||||
if (p_instance->base_type == VS::INSTANCE_LIGHTMAP_CAPTURE) {
|
||||
InstanceLightmapCaptureData *capture = static_cast<InstanceLightmapCaptureData *>(p_instance->base_data);
|
||||
for (List<InstanceLightmapCaptureData::PairInfo>::Element *E = capture->geometries.front(); E; E = E->next()) {
|
||||
_instance_queue_update(E->get().geometry, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (p_instance->aabb.has_no_surface()) {
|
||||
return;
|
||||
}
|
||||
@ -1441,6 +1448,7 @@ void VisualServerScene::_update_instance_lightmap_captures(Instance *p_instance)
|
||||
for (int i = 0; i < 12; i++)
|
||||
new (&p_instance->lightmap_capture_data.ptrw()[i]) Color;
|
||||
|
||||
bool interior = true;
|
||||
//this could use some sort of blending..
|
||||
for (List<Instance *>::Element *E = geom->lightmap_captures.front(); E; E = E->next()) {
|
||||
const PoolVector<RasterizerStorage::LightmapCaptureOctree> *octree = VSG::storage->lightmap_capture_get_octree_ptr(E->get()->base);
|
||||
@ -1456,6 +1464,7 @@ void VisualServerScene::_update_instance_lightmap_captures(Instance *p_instance)
|
||||
Vector3 pos = to_cell_xform.xform(p_instance->transform.origin);
|
||||
|
||||
const float capture_energy = VSG::storage->lightmap_capture_get_energy(E->get()->base);
|
||||
interior = interior && VSG::storage->lightmap_capture_is_interior(E->get()->base);
|
||||
|
||||
for (int i = 0; i < 12; i++) {
|
||||
|
||||
@ -1467,6 +1476,7 @@ void VisualServerScene::_update_instance_lightmap_captures(Instance *p_instance)
|
||||
p_instance->lightmap_capture_data.write[i] += capture;
|
||||
}
|
||||
}
|
||||
p_instance->lightmap_capture_data.write[0].a = interior ? 0.0f : 1.0f;
|
||||
}
|
||||
|
||||
bool VisualServerScene::_light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_shadow_atlas, Scenario *p_scenario) {
|
||||
|
||||
@ -330,6 +330,8 @@ public:
|
||||
FUNC1RC(int, lightmap_capture_get_octree_cell_subdiv, RID)
|
||||
FUNC2(lightmap_capture_set_energy, RID, float)
|
||||
FUNC1RC(float, lightmap_capture_get_energy, RID)
|
||||
FUNC2(lightmap_capture_set_interior, RID, bool)
|
||||
FUNC1RC(bool, lightmap_capture_is_interior, RID)
|
||||
|
||||
/* PARTICLES */
|
||||
|
||||
|
||||
@ -1830,6 +1830,8 @@ void VisualServer::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("lightmap_capture_get_octree", "capture"), &VisualServer::lightmap_capture_get_octree);
|
||||
ClassDB::bind_method(D_METHOD("lightmap_capture_set_energy", "capture", "energy"), &VisualServer::lightmap_capture_set_energy);
|
||||
ClassDB::bind_method(D_METHOD("lightmap_capture_get_energy", "capture"), &VisualServer::lightmap_capture_get_energy);
|
||||
ClassDB::bind_method(D_METHOD("lightmap_capture_set_interior", "capture", "interior"), &VisualServer::lightmap_capture_set_interior);
|
||||
ClassDB::bind_method(D_METHOD("lightmap_capture_is_interior", "capture"), &VisualServer::lightmap_capture_is_interior);
|
||||
#endif
|
||||
ClassDB::bind_method(D_METHOD("particles_create"), &VisualServer::particles_create);
|
||||
ClassDB::bind_method(D_METHOD("particles_set_emitting", "particles", "emitting"), &VisualServer::particles_set_emitting);
|
||||
|
||||
@ -558,6 +558,8 @@ public:
|
||||
virtual PoolVector<uint8_t> lightmap_capture_get_octree(RID p_capture) const = 0;
|
||||
virtual void lightmap_capture_set_energy(RID p_capture, float p_energy) = 0;
|
||||
virtual float lightmap_capture_get_energy(RID p_capture) const = 0;
|
||||
virtual void lightmap_capture_set_interior(RID p_capture, bool p_interior) = 0;
|
||||
virtual bool lightmap_capture_is_interior(RID p_capture) const = 0;
|
||||
|
||||
/* PARTICLES API */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user