Browse Source

Updated stencil interface.

aignacio_sf 19 years ago
parent
commit
64ac1f8510

+ 0 - 7
panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx

@@ -4012,13 +4012,6 @@ do_issue_stencil() {
   stencil_render_states = this -> _stencil_render_states;
   stencil_render_states = this -> _stencil_render_states;
   if (stencil && stencil_render_states) {
   if (stencil && stencil_render_states) {
 
 
-#ifndef NDEBUG
-    // DEBUG ONLY
-    if (stencil -> _pre) {
-      dxgsg8_cat.error() << "Invalid StencilAttrib\n";
-    }
-#endif
-
     // DEBUG
     // DEBUG
     if (false) {
     if (false) {
       dxgsg8_cat.debug() << "STENCIL STATE CHANGE\n";
       dxgsg8_cat.debug() << "STENCIL STATE CHANGE\n";

+ 0 - 7
panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx

@@ -5142,13 +5142,6 @@ do_issue_stencil() {
   stencil_render_states = this -> _stencil_render_states;
   stencil_render_states = this -> _stencil_render_states;
   if (stencil && stencil_render_states) {
   if (stencil && stencil_render_states) {
 
 
-#ifndef NDEBUG
-    // DEBUG ONLY
-    if (stencil -> _pre) {
-      dxgsg9_cat.error() << "Invalid StencilAttrib\n";
-    }
-#endif
-
     // DEBUG
     // DEBUG
     if (false) {
     if (false) {
       dxgsg9_cat.debug() << "STENCIL STATE CHANGE\n";
       dxgsg9_cat.debug() << "STENCIL STATE CHANGE\n";

+ 0 - 7
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -7369,13 +7369,6 @@ do_issue_stencil() {
   stencil_render_states = this -> _stencil_render_states;
   stencil_render_states = this -> _stencil_render_states;
   if (stencil && stencil_render_states) {
   if (stencil && stencil_render_states) {
 
 
-#ifndef NDEBUG
-    // DEBUG ONLY
-    if (stencil -> _pre) {
-      GLCAT.error() << "Invalid StencilAttrib\n";
-    }
-#endif
-
     // DEBUG
     // DEBUG
     if (false) {
     if (false) {
       GLCAT.debug() << "STENCIL STATE CHANGE\n";
       GLCAT.debug() << "STENCIL STATE CHANGE\n";

+ 1 - 1
panda/src/pgraph/attribSlots.cxx

@@ -51,7 +51,7 @@ initialize_defvals() {
   _defvals._rescale_normal = DCAST(RescaleNormalAttrib,RescaleNormalAttrib::make_default());
   _defvals._rescale_normal = DCAST(RescaleNormalAttrib,RescaleNormalAttrib::make_default());
   _defvals._shade_model    = DCAST(ShadeModelAttrib,ShadeModelAttrib::make(ShadeModelAttrib::M_smooth));
   _defvals._shade_model    = DCAST(ShadeModelAttrib,ShadeModelAttrib::make(ShadeModelAttrib::M_smooth));
   _defvals._shader         = DCAST(ShaderAttrib,ShaderAttrib::make_off());
   _defvals._shader         = DCAST(ShaderAttrib,ShaderAttrib::make_off());
-  _defvals._stencil        = DCAST(StencilAttrib,StencilAttrib::make());
+  _defvals._stencil        = DCAST(StencilAttrib,StencilAttrib::make_off());
   _defvals._tex_gen        = DCAST(TexGenAttrib,TexGenAttrib::make());
   _defvals._tex_gen        = DCAST(TexGenAttrib,TexGenAttrib::make());
   _defvals._tex_matrix     = DCAST(TexMatrixAttrib,TexMatrixAttrib::make());
   _defvals._tex_matrix     = DCAST(TexMatrixAttrib,TexMatrixAttrib::make());
   _defvals._texture        = DCAST(TextureAttrib,TextureAttrib::make_all_off());
   _defvals._texture        = DCAST(TextureAttrib,TextureAttrib::make_all_off());

+ 0 - 46
panda/src/pgraph/stencilAttrib.I

@@ -16,52 +16,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-
-////////////////////////////////////////////////////////////////////
-//     Function: StencilAttrib::Constructor
-//       Access: Private
-//  Description: Use StencilAttrib::make() to construct a new
-//               StencilAttrib object.
-////////////////////////////////////////////////////////////////////
-INLINE StencilAttrib::
-StencilAttrib() {
-
-  _stencil_render_states [SRS_front_enable] = 0;
-  _stencil_render_states [SRS_back_enable] = 0;
-
-  _stencil_render_states [SRS_front_comparison_function] = SCF_always;
-  _stencil_render_states [SRS_front_stencil_fail_operation] = SO_keep;
-  _stencil_render_states [SRS_front_stencil_pass_z_fail_operation] = SO_keep;
-  _stencil_render_states [SRS_front_stencil_pass_z_pass_operation] = SO_keep;
-
-  _stencil_render_states [SRS_reference] = 0;
-  _stencil_render_states [SRS_read_mask] = ~0;
-  _stencil_render_states [SRS_write_mask] = ~0;
-
-  _stencil_render_states [SRS_back_comparison_function] = SCF_always;
-  _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_pass_operation] = SO_keep;
-
-  _pre = false;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: StencilAttrib::set_render_state
-//       Access: Published
-//  Description: Sets the render state.
-////////////////////////////////////////////////////////////////////
-INLINE void StencilAttrib::
-set_render_state(unsigned int render_state_identifier, unsigned int render_state) {
-  if (_pre) {
-    _stencil_render_states [render_state_identifier] = render_state;
-  }
-  else {
-    // ERROR: set_render_state can only be called with a pre_make StencilAttrib
-    printf ("ERROR: set_render_state can only be called with a StencilAttrib.make_begin\n");
-  }
-}
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: StencilAttrib::get_render_state
 //     Function: StencilAttrib::get_render_state
 //       Access: Published
 //       Access: Published

+ 94 - 25
panda/src/pgraph/stencilAttrib.cxx

@@ -49,53 +49,122 @@ stencil_render_state_name_array [StencilAttrib::SRS_total] =
 };
 };
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: StencilAttrib::make_begin
+//     Function: StencilAttrib::Constructor
+//       Access: Private
+//  Description: Use StencilAttrib::make() to construct a new
+//               StencilAttrib object.
+////////////////////////////////////////////////////////////////////
+StencilAttrib::
+StencilAttrib() {
+
+  _stencil_render_states [SRS_front_enable] = 0;
+  _stencil_render_states [SRS_back_enable] = 0;
+
+  _stencil_render_states [SRS_front_comparison_function] = SCF_always;
+  _stencil_render_states [SRS_front_stencil_fail_operation] = SO_keep;
+  _stencil_render_states [SRS_front_stencil_pass_z_fail_operation] = SO_keep;
+  _stencil_render_states [SRS_front_stencil_pass_z_pass_operation] = SO_keep;
+
+  _stencil_render_states [SRS_reference] = 0;
+  _stencil_render_states [SRS_read_mask] = ~0;
+  _stencil_render_states [SRS_write_mask] = ~0;
+
+  _stencil_render_states [SRS_back_comparison_function] = SCF_always;
+  _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_pass_operation] = SO_keep;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: StencilAttrib::make_off
 //       Access: Published, Static
 //       Access: Published, Static
-//  Description: Constructs a new default and writable StencilAttrib.
-//               set_render_state can be called.
+//  Description: Constructs a front face StencilAttrib.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 CPT(RenderAttrib) StencilAttrib::
 CPT(RenderAttrib) StencilAttrib::
-make_begin() {
+make_off()
+{
   StencilAttrib *attrib = new StencilAttrib;
   StencilAttrib *attrib = new StencilAttrib;
-  attrib -> _pre = true;
-
-  CPT(RenderAttrib) pt_attrib = attrib;
 
 
-  return pt_attrib;
+  return return_new(attrib);
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: StencilAttrib::make
 //     Function: StencilAttrib::make
 //       Access: Published, Static
 //       Access: Published, Static
-//  Description: Constructs a new default read-only StencilAttrib.
-//               set_render_state can not be called on the created
-//               object.
+//  Description: Constructs a front face StencilAttrib.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 CPT(RenderAttrib) StencilAttrib::
 CPT(RenderAttrib) StencilAttrib::
-make() {
+make(
+  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)
+{
   StencilAttrib *attrib = new StencilAttrib;
   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;
+
   return return_new(attrib);
   return return_new(attrib);
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: StencilAttrib::make_end
-//       Access: Published
-//  Description: Constructs a final read-only StencilAttrib object
-//               from an existing StencilAttrib.
+//     Function: StencilAttrib::make_2_sided
+//       Access: Published, Static
+//  Description: Constructs a two-sided StencilAttrib.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 CPT(RenderAttrib) StencilAttrib::
 CPT(RenderAttrib) StencilAttrib::
-make_end() {
-
+make_2_sided(
+  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)
+{
   StencilAttrib *attrib = new StencilAttrib;
   StencilAttrib *attrib = new StencilAttrib;
-  StencilAttrib *original_attrib;
 
 
-  original_attrib = this;
+  attrib->_stencil_render_states [SRS_front_enable] = front_enable;
+  attrib->_stencil_render_states [SRS_back_enable] = back_enable;
 
 
-  int index;
-  for (index = 0; index < SRS_total; index++) {
-    attrib -> _stencil_render_states [index] =
-      original_attrib -> _stencil_render_states [index];
-  }
+  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;
 
 
   return return_new(attrib);
   return return_new(attrib);
 }
 }

+ 33 - 7
panda/src/pgraph/stencilAttrib.h

@@ -31,7 +31,7 @@ class FactoryParams;
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 class EXPCL_PANDA StencilAttrib : public RenderAttrib {
 class EXPCL_PANDA StencilAttrib : public RenderAttrib {
 private:
 private:
-  INLINE StencilAttrib();
+  StencilAttrib();
 
 
 PUBLISHED:
 PUBLISHED:
 
 
@@ -84,10 +84,38 @@ PUBLISHED:
     SO_decrement_saturate,
     SO_decrement_saturate,
   };
   };
 
 
-  static CPT(RenderAttrib) make_begin();
-  static CPT(RenderAttrib) make();
-  CPT(RenderAttrib) make_end();
-  INLINE void set_render_state (unsigned int render_state_identifier, unsigned int render_state);
+  enum StencilMask
+  {
+    SM_default = ~0,
+  };
+
+  static CPT(RenderAttrib) make_off();
+
+  static CPT(RenderAttrib) make(
+    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);
+
+  static CPT(RenderAttrib) make_2_sided(
+    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);
+
   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:
@@ -102,8 +130,6 @@ protected:
 
 
 private:
 private:
   unsigned int _stencil_render_states [SRS_total];
   unsigned int _stencil_render_states [SRS_total];
-public:
-  bool _pre;
 
 
 public:
 public:
   static void register_with_read_factory();
   static void register_with_read_factory();