diff --git a/panda/src/pgraph/drawMaskAttrib.I b/panda/src/pgraph/drawMaskAttrib.I new file mode 100644 index 0000000000..4ed6bf23a3 --- /dev/null +++ b/panda/src/pgraph/drawMaskAttrib.I @@ -0,0 +1,92 @@ +// Filename: drawMaskAttrib.I +// Created by: drose (28Sep05) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::Constructor +// Access: Protected +// Description: Use DrawMaskAttrib::make() to construct a new +// DrawMaskAttrib object. +//////////////////////////////////////////////////////////////////// +INLINE DrawMaskAttrib:: +DrawMaskAttrib(DrawMask new_mask, DrawMask bits_to_change) : + _new_mask(new_mask & bits_to_change), + _bits_to_change(bits_to_change) +{ +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::Copy Constructor +// Access: Protected +// Description: Use DrawMaskAttrib::make() to construct a new +// DrawMaskAttrib object. +//////////////////////////////////////////////////////////////////// +INLINE DrawMaskAttrib:: +DrawMaskAttrib(const DrawMaskAttrib ©) : + _new_mask(copy._new_mask), + _bits_to_change(copy._bits_to_change) +{ +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::make_hide +// Access: Published, Static +// Description: Constructs a new DrawMaskAttrib that removes the +// indicated draw bits from the visibility mask. That +// is, it makes any nodes invisible to cameras that have +// any bits in common with draw_mask. This is similar +// to (but not quite identical to) +// NodePath.hide(draw_mask). +//////////////////////////////////////////////////////////////////// +INLINE CPT(RenderAttrib) DrawMaskAttrib:: +make_hide(DrawMask draw_mask) { + return make(DrawMask::all_off(), draw_mask); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::make_show +// Access: Published, Static +// Description: Constructs a new DrawMaskAttrib that adds the +// indicated draw bits to the visibility mask. That +// is, it makes any nodes visible to cameras that have +// any bits in common with draw_mask. This is similar +// to (but not quite identical to) +// NodePath.show(draw_mask). +//////////////////////////////////////////////////////////////////// +INLINE CPT(RenderAttrib) DrawMaskAttrib:: +make_show(DrawMask draw_mask) { + return make(draw_mask, draw_mask); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::get_new_mask +// Access: Published +// Description: Returns the new DrawMask that will be set after the +// attrib has been applied. +//////////////////////////////////////////////////////////////////// +INLINE DrawMask DrawMaskAttrib:: +get_new_mask() const { + return _new_mask; +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::get_bits_to_change +// Access: Published +// Description: Returns the set of bits that will be allowed to be +// changed by this DrawMaskAttrib. +//////////////////////////////////////////////////////////////////// +INLINE DrawMask DrawMaskAttrib:: +get_bits_to_change() const { + return _bits_to_change; +} diff --git a/panda/src/pgraph/drawMaskAttrib.cxx b/panda/src/pgraph/drawMaskAttrib.cxx new file mode 100644 index 0000000000..cbcf0cf498 --- /dev/null +++ b/panda/src/pgraph/drawMaskAttrib.cxx @@ -0,0 +1,226 @@ +// Filename: drawMaskAttrib.cxx +// Created by: drose (28Sep05) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "drawMaskAttrib.h" +#include "dcast.h" +#include "bamReader.h" +#include "bamWriter.h" +#include "datagram.h" +#include "datagramIterator.h" +#include "cullTraverser.h" +#include "config_pgraph.h" + +TypeHandle DrawMaskAttrib::_type_handle; + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::make +// Access: Published, Static +// Description: Constructs a new DrawMaskAttrib that changes the +// bits_to_change bits in the current DrawMask to the +// values of the corresponding bits in new_mask. Only +// those bits in common with bits_to_change are +// affected. +//////////////////////////////////////////////////////////////////// +CPT(RenderAttrib) DrawMaskAttrib:: +make(DrawMask new_mask, DrawMask bits_to_change) { + DrawMaskAttrib *attrib = new DrawMaskAttrib(new_mask, bits_to_change); + return return_new(attrib); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::output +// Access: Public, Virtual +// Description: +//////////////////////////////////////////////////////////////////// +void DrawMaskAttrib:: +output(ostream &out) const { + out << get_type() << ":" << get_new_mask() << "/" << get_bits_to_change(); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::compare_to_impl +// Access: Protected, Virtual +// Description: Intended to be overridden by derived DrawMaskAttrib +// types to return a unique number indicating whether +// this DrawMaskAttrib is equivalent to the other one. +// +// This should return 0 if the two DrawMaskAttrib objects +// are equivalent, a number less than zero if this one +// should be sorted before the other one, and a number +// greater than zero otherwise. +// +// This will only be called with two DrawMaskAttrib +// objects whose get_type() functions return the same. +//////////////////////////////////////////////////////////////////// +int DrawMaskAttrib:: +compare_to_impl(const RenderAttrib *other) const { + const DrawMaskAttrib *ta; + DCAST_INTO_R(ta, other, 0); + + int compare = get_new_mask().compare_to(ta->get_new_mask()); + if (compare != 0) { + return compare; + } + compare = get_bits_to_change().compare_to(ta->get_bits_to_change()); + return compare; +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::compose_impl +// Access: Protected, Virtual +// Description: Intended to be overridden by derived RenderAttrib +// types to specify how two consecutive RenderAttrib +// objects of the same type interact. +// +// This should return the result of applying the other +// RenderAttrib to a node in the scene graph below this +// RenderAttrib, which was already applied. In most +// cases, the result is the same as the other +// RenderAttrib (that is, a subsequent RenderAttrib +// completely replaces the preceding one). On the other +// hand, some kinds of RenderAttrib (for instance, +// ColorTransformAttrib) might combine in meaningful +// ways. +//////////////////////////////////////////////////////////////////// +CPT(RenderAttrib) DrawMaskAttrib:: +compose_impl(const RenderAttrib *other) const { + const DrawMaskAttrib *ta; + DCAST_INTO_R(ta, other, 0); + + DrawMask mask = get_new_mask(); + mask = (mask & ~ta->get_bits_to_change()) | ta->get_new_mask(); + + DrawMaskAttrib *attrib = new DrawMaskAttrib(mask, DrawMask::all_on()); + return return_new(attrib); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::make_default_impl +// Access: Protected, Virtual +// Description: Intended to be overridden by derived DrawMaskAttrib +// types to specify what the default property for a +// DrawMaskAttrib of this type should be. +// +// This should return a newly-allocated DrawMaskAttrib of +// the same type that corresponds to whatever the +// standard default for this kind of DrawMaskAttrib is. +//////////////////////////////////////////////////////////////////// +RenderAttrib *DrawMaskAttrib:: +make_default_impl() const { + return new DrawMaskAttrib(DrawMask::all_on(), DrawMask::all_on()); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::store_into_slot +// Access: Public, Virtual +// Description: Stores this attrib into the appropriate slot of +// an object of class AttribSlots. +//////////////////////////////////////////////////////////////////// +void DrawMaskAttrib:: +store_into_slot(AttribSlots *) const { + // There's no need to store a DrawMaskAttrib at the moment, since it + // doesn't actually change any rendering state. +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::has_cull_callback +// Access: Public, Virtual +// Description: Should be overridden by derived classes to return +// true if cull_callback() has been defined. Otherwise, +// returns false to indicate cull_callback() does not +// need to be called for this node during the cull +// traversal. +//////////////////////////////////////////////////////////////////// +bool DrawMaskAttrib:: +has_cull_callback() const { + return (_new_mask != DrawMask::all_on()); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::cull_callback +// Access: Public, Virtual +// Description: If has_cull_callback() returns true, this function +// will be called during the cull traversal to perform +// any additional operations that should be performed at +// cull time. +// +// This is called each time the RenderAttrib is +// discovered applied to a Geom in the traversal. It +// should return true if the Geom is visible, false if +// it should be omitted. +//////////////////////////////////////////////////////////////////// +bool DrawMaskAttrib:: +cull_callback(CullTraverser *trav, const CullTraverserData &) const { + return (trav->get_camera_mask() & _new_mask) != 0; +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::register_with_read_factory +// Access: Public, Static +// Description: Tells the BamReader how to create objects of type +// DrawMaskAttrib. +//////////////////////////////////////////////////////////////////// +void DrawMaskAttrib:: +register_with_read_factory() { + BamReader::get_factory()->register_factory(get_class_type(), make_from_bam); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::write_datagram +// Access: Public, Virtual +// Description: Writes the contents of this object to the datagram +// for shipping out to a Bam file. +//////////////////////////////////////////////////////////////////// +void DrawMaskAttrib:: +write_datagram(BamWriter *manager, Datagram &dg) { + RenderAttrib::write_datagram(manager, dg); + + dg.add_uint32(_new_mask.get_word()); + dg.add_uint32(_bits_to_change.get_word()); +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::make_from_bam +// Access: Protected, Static +// Description: This function is called by the BamReader's factory +// when a new object of type DrawMaskAttrib is encountered +// in the Bam file. It should create the DrawMaskAttrib +// and extract its information from the file. +//////////////////////////////////////////////////////////////////// +TypedWritable *DrawMaskAttrib:: +make_from_bam(const FactoryParams ¶ms) { + DrawMaskAttrib *attrib = new DrawMaskAttrib(0, 0); + DatagramIterator scan; + BamReader *manager; + + parse_params(params, scan, manager); + attrib->fillin(scan, manager); + + return attrib; +} + +//////////////////////////////////////////////////////////////////// +// Function: DrawMaskAttrib::fillin +// Access: Protected +// Description: This internal function is called by make_from_bam to +// read in all of the relevant data from the BamFile for +// the new DrawMaskAttrib. +//////////////////////////////////////////////////////////////////// +void DrawMaskAttrib:: +fillin(DatagramIterator &scan, BamReader *manager) { + RenderAttrib::fillin(scan, manager); + + _new_mask.set_word(scan.get_uint32()); + _bits_to_change.set_word(scan.get_uint32()); +} diff --git a/panda/src/pgraph/drawMaskAttrib.h b/panda/src/pgraph/drawMaskAttrib.h new file mode 100644 index 0000000000..ce225f495c --- /dev/null +++ b/panda/src/pgraph/drawMaskAttrib.h @@ -0,0 +1,98 @@ +// Filename: drawMaskAttrib.h +// Created by: drose (28Sep05) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef DRAWMASKATTRIB_H +#define DRAWMASKATTRIB_H + +#include "pandabase.h" + +#include "renderAttrib.h" +#include "drawMask.h" + +class FactoryParams; + +//////////////////////////////////////////////////////////////////// +// Class : DrawMaskAttrib +// Description : This attrib can be used to control the visibility of +// certain Geoms from certain cameras. It is similar in +// principle to the PandaNode::set_draw_mask() +// interface, except it does not cause an early prune in +// the cull traversal; thus, it can be used to show a +// node even though its parent has been hidden (if the +// parent was hidden using the same interface). +// +// It is mainly useful for unusual circumstances in +// which the visibility of a node is not easy to +// determine from examining the static hierarchy of the +// graph. +//////////////////////////////////////////////////////////////////// +class EXPCL_PANDA_PGRAPH DrawMaskAttrib : public RenderAttrib { +protected: + INLINE DrawMaskAttrib(DrawMask new_mask, DrawMask bits_to_change); + INLINE DrawMaskAttrib(const DrawMaskAttrib ©); + +PUBLISHED: + INLINE static CPT(RenderAttrib) make_hide(DrawMask draw_mask = DrawMask::all_on()); + INLINE static CPT(RenderAttrib) make_show(DrawMask draw_mask = DrawMask::all_on()); + static CPT(RenderAttrib) make(DrawMask new_mask, DrawMask bits_to_change); + + INLINE DrawMask get_new_mask() const; + INLINE DrawMask get_bits_to_change() const; + +public: + virtual void output(ostream &out) const; + virtual void store_into_slot(AttribSlots *slots) const; + + virtual bool has_cull_callback() const; + virtual bool cull_callback(CullTraverser *trav, const CullTraverserData &data) const; + +protected: + virtual int compare_to_impl(const RenderAttrib *other) const; + virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; + virtual RenderAttrib *make_default_impl() const; + +private: + DrawMask _new_mask; + DrawMask _bits_to_change; + +public: + static void register_with_read_factory(); + virtual void write_datagram(BamWriter *manager, Datagram &dg); + +protected: + static TypedWritable *make_from_bam(const FactoryParams ¶ms); + void fillin(DatagramIterator &scan, BamReader *manager); + +public: + static TypeHandle get_class_type() { + return _type_handle; + } + static void init_type() { + RenderAttrib::init_type(); + register_type(_type_handle, "DrawMaskAttrib", + RenderAttrib::get_class_type()); + } + virtual TypeHandle get_type() const { + return get_class_type(); + } + virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + +private: + static TypeHandle _type_handle; +}; + +#include "drawMaskAttrib.I" + +#endif +