Add light.shadow_caster and light.shadow_buffer_size

This commit is contained in:
rdb 2016-03-17 15:26:12 +01:00
parent 4ace5b5bc9
commit f68bfab7a9
4 changed files with 39 additions and 15 deletions

View File

@ -3101,7 +3101,7 @@ make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host) {
if (display_cat.is_debug()) {
display_cat.debug()
<< "Constructing shadow buffer for light '" << light->get_name()
<< "', size=" << light->_sb_xsize << "x" << light->_sb_ysize
<< "', size=" << light->_sb_size[0] << "x" << light->_sb_size[1]
<< ", sort=" << light->_sb_sort << "\n";
}
@ -3109,7 +3109,7 @@ make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host) {
FrameBufferProperties fbp;
fbp.set_depth_bits(shadow_depth_bits);
WindowProperties props = WindowProperties::size(light->_sb_xsize, light->_sb_ysize);
WindowProperties props = WindowProperties::size(light->_sb_size[0], light->_sb_size[1]);
int flags = GraphicsPipe::BF_refuse_window;
if (is_point) {
flags |= GraphicsPipe::BF_size_square;
@ -3124,13 +3124,13 @@ make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host) {
// error
PT(Texture) tex = new Texture(light->get_name());
if (is_point) {
if (light->_sb_xsize != light->_sb_ysize) {
if (light->_sb_size[0] != light->_sb_size[1]) {
display_cat.error()
<< "PointLight shadow buffers must have an equal width and height!\n";
}
tex->setup_cube_map(light->_sb_xsize, Texture::T_unsigned_byte, Texture::F_depth_component);
tex->setup_cube_map(light->_sb_size[0], Texture::T_unsigned_byte, Texture::F_depth_component);
} else {
tex->setup_2d_texture(light->_sb_xsize, light->_sb_ysize, Texture::T_unsigned_byte, Texture::F_depth_component);
tex->setup_2d_texture(light->_sb_size[0], light->_sb_size[1], Texture::T_unsigned_byte, Texture::F_depth_component);
}
tex->make_ram_image();
sbuffer->add_render_texture(tex, GraphicsOutput::RTM_bind_or_copy, GraphicsOutput::RTP_depth);

View File

@ -42,12 +42,11 @@ set_shadow_caster(bool caster) {
*/
INLINE void LightLensNode::
set_shadow_caster(bool caster, int buffer_xsize, int buffer_ysize, int buffer_sort) {
if ((_shadow_caster && !caster) || buffer_xsize != _sb_xsize || buffer_ysize != _sb_ysize) {
if ((_shadow_caster && !caster) || buffer_xsize != _sb_size[0] || buffer_ysize != _sb_size[1]) {
clear_shadow_buffers();
}
_shadow_caster = caster;
_sb_xsize = buffer_xsize;
_sb_ysize = buffer_ysize;
_sb_size.set(buffer_xsize, buffer_ysize);
if (buffer_sort != _sb_sort) {
ShadowBuffers::iterator it;
@ -59,6 +58,25 @@ set_shadow_caster(bool caster, int buffer_xsize, int buffer_ysize, int buffer_so
set_active(caster);
}
/**
* Returns the size of the shadow buffer to be created for this light source.
*/
INLINE LVecBase2i LightLensNode::
get_shadow_buffer_size() const {
return _sb_size;
}
/**
* Sets the size of the shadow buffer to be created for this light source.
*/
INLINE void LightLensNode::
set_shadow_buffer_size(const LVecBase2i &size) {
if (size != _sb_size) {
clear_shadow_buffers();
}
_sb_size = size;
}
/**
* Returns the buffer that has been constructed for a given GSG, or NULL if no
* such buffer has (yet) been constructed. This should be used for debugging

View File

@ -31,8 +31,7 @@ LightLensNode(const string &name, Lens *lens) :
{
set_active(false);
_shadow_caster = false;
_sb_xsize = 512;
_sb_ysize = 512;
_sb_size.set(512, 512);
_sb_sort = -10;
// set_initial_state(RenderState::make(ShaderAttrib::make_off(), 1000));
// Backface culling helps eliminating artifacts.
@ -57,8 +56,7 @@ LightLensNode(const LightLensNode &copy) :
Light(copy),
Camera(copy),
_shadow_caster(copy._shadow_caster),
_sb_xsize(copy._sb_xsize),
_sb_ysize(copy._sb_ysize),
_sb_size(copy._sb_size),
_sb_sort(-10)
{
}
@ -126,8 +124,8 @@ write_datagram(BamWriter *manager, Datagram &dg) {
Light::write_datagram(manager, dg);
dg.add_bool(_shadow_caster);
dg.add_int32(_sb_xsize);
dg.add_int32(_sb_ysize);
dg.add_int32(_sb_size[0]);
dg.add_int32(_sb_size[1]);
dg.add_int32(_sb_sort);
}

View File

@ -38,14 +38,22 @@ PUBLISHED:
INLINE void set_shadow_caster(bool caster);
INLINE void set_shadow_caster(bool caster, int buffer_xsize, int buffer_ysize, int sort = -10);
INLINE LVecBase2i get_shadow_buffer_size() const;
INLINE void set_shadow_buffer_size(const LVecBase2i &size);
INLINE GraphicsOutputBase *get_shadow_buffer(GraphicsStateGuardianBase *gsg);
PUBLISHED:
MAKE_PROPERTY(shadow_caster, is_shadow_caster);
MAKE_PROPERTY(shadow_buffer_size, get_shadow_buffer_size, set_shadow_buffer_size);
protected:
LightLensNode(const LightLensNode &copy);
void clear_shadow_buffers();
LVecBase2i _sb_size;
bool _shadow_caster;
int _sb_xsize, _sb_ysize, _sb_sort;
int _sb_sort;
// This is really a map of GSG -> GraphicsOutput.
typedef pmap<PT(GraphicsStateGuardianBase), PT(GraphicsOutputBase) > ShadowBuffers;