tinydisplay: Support DepthBiasAttrib (const offset only)

This commit is contained in:
rdb 2026-01-28 16:47:05 +01:00
parent c0bf7e075c
commit df7aa557ec
3 changed files with 22 additions and 7 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -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();