Add stencil buffer clear.

This commit is contained in:
aignacio_sf 2006-12-13 19:27:51 +00:00
parent 038ab01257
commit 6ec87e2506
4 changed files with 138 additions and 1 deletions

View File

@ -53,6 +53,9 @@ PUBLISHED:
SRS_back_stencil_pass_z_fail_operation, SRS_back_stencil_pass_z_fail_operation,
SRS_back_stencil_pass_z_pass_operation, SRS_back_stencil_pass_z_pass_operation,
SRS_clear,
SRS_clear_value,
SRS_total, SRS_total,
SRS_first = 0, SRS_first = 0,

View File

@ -5336,6 +5336,10 @@ do_issue_stencil() {
stencil_render_states -> set_stencil_render_state (true, StencilRenderStates::SRS_read_mask, stencil -> get_render_state (StencilAttrib::SRS_read_mask)); stencil_render_states -> set_stencil_render_state (true, StencilRenderStates::SRS_read_mask, stencil -> get_render_state (StencilAttrib::SRS_read_mask));
stencil_render_states -> set_stencil_render_state (true, StencilRenderStates::SRS_write_mask, stencil -> get_render_state (StencilAttrib::SRS_write_mask)); stencil_render_states -> set_stencil_render_state (true, StencilRenderStates::SRS_write_mask, stencil -> get_render_state (StencilAttrib::SRS_write_mask));
} }
if (stencil -> get_render_state (StencilAttrib::SRS_clear)) {
_d3d_device->Clear(0, NULL, D3DCLEAR_STENCIL, 0, 0.0f, stencil -> get_render_state (StencilAttrib::SRS_clear_value));
}
} }
else { else {

View File

@ -46,6 +46,9 @@ stencil_render_state_name_array [StencilAttrib::SRS_total] =
"SRS_back_stencil_fail_operation", "SRS_back_stencil_fail_operation",
"SRS_back_stencil_pass_z_fail_operation", "SRS_back_stencil_pass_z_fail_operation",
"SRS_back_stencil_pass_z_pass_operation", "SRS_back_stencil_pass_z_pass_operation",
"SRS_clear",
"SRS_clear_value",
}; };
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -73,6 +76,9 @@ StencilAttrib() {
_stencil_render_states [SRS_back_stencil_fail_operation] = SO_keep; _stencil_render_states [SRS_back_stencil_fail_operation] = SO_keep;
_stencil_render_states [SRS_back_stencil_pass_z_fail_operation] = SO_keep; _stencil_render_states [SRS_back_stencil_pass_z_fail_operation] = SO_keep;
_stencil_render_states [SRS_back_stencil_pass_z_pass_operation] = SO_keep; _stencil_render_states [SRS_back_stencil_pass_z_pass_operation] = SO_keep;
_stencil_render_states [SRS_clear] = 0;
_stencil_render_states [SRS_clear_value] = 0;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -170,6 +176,97 @@ make_2_sided(
return return_new(attrib); return return_new(attrib);
} }
////////////////////////////////////////////////////////////////////
// Function: StencilAttrib::make
// Access: Published, Static
// Description: Constructs a front face StencilAttrib.
////////////////////////////////////////////////////////////////////
CPT(RenderAttrib) StencilAttrib::
make_with_clear(
unsigned int front_enable,
unsigned int front_comparison_function,
unsigned int stencil_fail_operation,
unsigned int stencil_pass_z_fail_operation,
unsigned int front_stencil_pass_z_pass_operation,
unsigned int reference,
unsigned int read_mask,
unsigned int write_mask,
unsigned int clear,
unsigned int clear_value)
{
StencilAttrib *attrib = new StencilAttrib;
attrib->_stencil_render_states [SRS_front_enable] = front_enable;
attrib->_stencil_render_states [SRS_back_enable] = 0;
attrib->_stencil_render_states [SRS_front_comparison_function] = front_comparison_function;
attrib->_stencil_render_states [SRS_front_stencil_fail_operation] = stencil_fail_operation;
attrib->_stencil_render_states [SRS_front_stencil_pass_z_fail_operation] = stencil_pass_z_fail_operation;
attrib->_stencil_render_states [SRS_front_stencil_pass_z_pass_operation] = front_stencil_pass_z_pass_operation;
attrib->_stencil_render_states [SRS_reference] = reference;
attrib->_stencil_render_states [SRS_read_mask] = read_mask;
attrib->_stencil_render_states [SRS_write_mask] = write_mask;
attrib->_stencil_render_states [SRS_back_comparison_function] = SCF_always;
attrib->_stencil_render_states [SRS_back_stencil_fail_operation] = SO_keep;
attrib->_stencil_render_states [SRS_back_stencil_pass_z_fail_operation] = SO_keep;
attrib->_stencil_render_states [SRS_back_stencil_pass_z_pass_operation] = SO_keep;
attrib->_stencil_render_states [SRS_clear] = clear;
attrib->_stencil_render_states [SRS_clear_value] = clear_value;
return return_new(attrib);
}
////////////////////////////////////////////////////////////////////
// Function: StencilAttrib::make_2_sided
// Access: Published, Static
// Description: Constructs a two-sided StencilAttrib.
////////////////////////////////////////////////////////////////////
CPT(RenderAttrib) StencilAttrib::
make_2_sided_with_clear(
unsigned int front_enable,
unsigned int back_enable,
unsigned int front_comparison_function,
unsigned int stencil_fail_operation,
unsigned int stencil_pass_z_fail_operation,
unsigned int front_stencil_pass_z_pass_operation,
unsigned int reference,
unsigned int read_mask,
unsigned int write_mask,
unsigned int back_comparison_function,
unsigned int back_stencil_fail_operation,
unsigned int back_stencil_pass_z_fail_operation,
unsigned int back_stencil_pass_z_pass_operation,
unsigned int clear,
unsigned int clear_value)
{
StencilAttrib *attrib = new StencilAttrib;
attrib->_stencil_render_states [SRS_front_enable] = front_enable;
attrib->_stencil_render_states [SRS_back_enable] = back_enable;
attrib->_stencil_render_states [SRS_front_comparison_function] = front_comparison_function;
attrib->_stencil_render_states [SRS_front_stencil_fail_operation] = stencil_fail_operation;
attrib->_stencil_render_states [SRS_front_stencil_pass_z_fail_operation] = stencil_pass_z_fail_operation;
attrib->_stencil_render_states [SRS_front_stencil_pass_z_pass_operation] = front_stencil_pass_z_pass_operation;
attrib->_stencil_render_states [SRS_reference] = reference;
attrib->_stencil_render_states [SRS_read_mask] = read_mask;
attrib->_stencil_render_states [SRS_write_mask] = write_mask;
attrib->_stencil_render_states [SRS_back_comparison_function] = back_comparison_function;
attrib->_stencil_render_states [SRS_back_stencil_fail_operation] = back_stencil_fail_operation;
attrib->_stencil_render_states [SRS_back_stencil_pass_z_fail_operation] = back_stencil_pass_z_fail_operation;
attrib->_stencil_render_states [SRS_back_stencil_pass_z_pass_operation] = back_stencil_pass_z_pass_operation;
attrib->_stencil_render_states [SRS_clear] = clear;
attrib->_stencil_render_states [SRS_clear_value] = clear_value;
return return_new(attrib);
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: StencilAttrib::output // Function: StencilAttrib::output
// Access: Public, Virtual // Access: Public, Virtual

View File

@ -34,6 +34,7 @@ class FactoryParams;
// get_supports_two_sided_stencil. // get_supports_two_sided_stencil.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
class EXPCL_PANDA StencilAttrib : public RenderAttrib { class EXPCL_PANDA StencilAttrib : public RenderAttrib {
private: private:
StencilAttrib(); StencilAttrib();
@ -59,6 +60,9 @@ PUBLISHED:
SRS_back_stencil_pass_z_fail_operation, SRS_back_stencil_pass_z_fail_operation,
SRS_back_stencil_pass_z_pass_operation, SRS_back_stencil_pass_z_pass_operation,
SRS_clear,
SRS_clear_value,
SRS_total, SRS_total,
SRS_first = 0, SRS_first = 0,
@ -120,6 +124,35 @@ PUBLISHED:
unsigned int back_stencil_pass_z_fail_operation, unsigned int back_stencil_pass_z_fail_operation,
unsigned int back_stencil_pass_z_pass_operation); unsigned int back_stencil_pass_z_pass_operation);
static CPT(RenderAttrib) make_with_clear(
unsigned int front_enable,
unsigned int front_comparison_function,
unsigned int stencil_fail_operation,
unsigned int stencil_pass_z_fail_operation,
unsigned int front_stencil_pass_z_pass_operation,
unsigned int reference,
unsigned int read_mask,
unsigned int write_mask,
unsigned int clear,
unsigned int clear_value);
static CPT(RenderAttrib) make_2_sided_with_clear(
unsigned int front_enable,
unsigned int back_enable,
unsigned int front_comparison_function,
unsigned int stencil_fail_operation,
unsigned int stencil_pass_z_fail_operation,
unsigned int front_stencil_pass_z_pass_operation,
unsigned int reference,
unsigned int read_mask,
unsigned int write_mask,
unsigned int back_comparison_function,
unsigned int back_stencil_fail_operation,
unsigned int back_stencil_pass_z_fail_operation,
unsigned int back_stencil_pass_z_pass_operation,
unsigned int clear,
unsigned int clear_value);
INLINE unsigned int get_render_state (unsigned int render_state_identifier) const; INLINE unsigned int get_render_state (unsigned int render_state_identifier) const;
public: public: