diff --git a/panda/src/tinydisplay/clip.cxx b/panda/src/tinydisplay/clip.cxx index f2c6baa4ba..25c0fc207c 100644 --- a/panda/src/tinydisplay/clip.cxx +++ b/panda/src/tinydisplay/clip.cxx @@ -27,7 +27,7 @@ void gl_transform_to_viewport(GLContext *c,GLVertex *v) + c->viewport.trans.v[2] ); // Add the z-bias, if any. Be careful not to overflow the int. - int z = v->zp.z + (c->zbias << (ZB_POINT_Z_FRAC_BITS + 4)); + int z = v->zp.z + c->zbias; if (z < v->zp.z && c->zbias > 0) { v->zp.z = INT_MAX; } else if (z > v->zp.z && c->zbias < 0) { diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index 1c4c30d67f..f2056e2488 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -22,6 +22,7 @@ #include "directionalLight.h" #include "spotlight.h" #include "depthWriteAttrib.h" +#include "depthBiasAttrib.h" #include "depthOffsetAttrib.h" #include "colorWriteAttrib.h" #include "alphaTestAttrib.h" @@ -94,6 +95,7 @@ reset() { _inv_state_mask.clear_bit(ColorAttrib::get_class_slot()); _inv_state_mask.clear_bit(ColorScaleAttrib::get_class_slot()); _inv_state_mask.clear_bit(CullFaceAttrib::get_class_slot()); + _inv_state_mask.clear_bit(DepthBiasAttrib::get_class_slot()); _inv_state_mask.clear_bit(DepthOffsetAttrib::get_class_slot()); _inv_state_mask.clear_bit(RenderModeAttrib::get_class_slot()); _inv_state_mask.clear_bit(RescaleNormalAttrib::get_class_slot()); @@ -1579,11 +1581,15 @@ set_state_and_transform(const RenderState *target, _state_mask.set_bit(cull_face_slot); } + int depth_bias_slot = DepthBiasAttrib::get_class_slot(); int depth_offset_slot = DepthOffsetAttrib::get_class_slot(); - if (_target_rs->get_attrib(depth_offset_slot) != _state_rs->get_attrib(depth_offset_slot) || + if (_target_rs->get_attrib(depth_bias_slot) != _state_rs->get_attrib(depth_bias_slot) || + _target_rs->get_attrib(depth_offset_slot) != _state_rs->get_attrib(depth_offset_slot) || + !_state_mask.get_bit(depth_bias_slot) || !_state_mask.get_bit(depth_offset_slot)) { // PStatTimer timer(_draw_set_state_depth_offset_pcollector); - do_issue_depth_offset(); + do_issue_depth_bias(); + _state_mask.set_bit(depth_bias_slot); _state_mask.set_bit(depth_offset_slot); } @@ -2110,10 +2116,19 @@ do_issue_rescale_normal() { * */ void TinyGraphicsStateGuardian:: -do_issue_depth_offset() { - const DepthOffsetAttrib *target_depth_offset = DCAST(DepthOffsetAttrib, _target_rs->get_attrib_def(DepthOffsetAttrib::get_class_slot())); +do_issue_depth_bias() { + const DepthOffsetAttrib *target_depth_offset; + _target_rs->get_attrib_def(target_depth_offset); int offset = target_depth_offset->get_offset(); - _c->zbias = offset; + + const DepthBiasAttrib *target_depth_bias; + if (_target_rs->get_attrib(target_depth_bias)) { + PN_stdfloat constant_factor = target_depth_bias->get_constant_factor(); + + _c->zbias = (int)(((PN_stdfloat)offset - constant_factor) * (1 << (ZB_POINT_Z_FRAC_BITS + 4))); + } else { + _c->zbias = offset << (ZB_POINT_Z_FRAC_BITS + 4); + } PN_stdfloat dr_near = 0.0f; PN_stdfloat dr_far = 1.0f; diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.h b/panda/src/tinydisplay/tinyGraphicsStateGuardian.h index 3a7d3374c0..003f6fa6a5 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.h +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.h @@ -102,7 +102,7 @@ private: void do_issue_render_mode(); void do_issue_cull_face(); void do_issue_rescale_normal(); - void do_issue_depth_offset(); + void do_issue_depth_bias(); void do_issue_material(); void do_issue_texture(); void do_issue_scissor();