open_toontown_panda3d/panda/src/pgraph/portalNode.I

277 lines
10 KiB
Plaintext
Executable File

// Filename: portalNode.I
// Created by: masad (13May04)
//
////////////////////////////////////////////////////////////////////
//
// 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: PortalNode::set_portal_mask
// Access: Published
// Description: Simultaneously sets both the "from" and "into"
// PortalMask values to the same thing.
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::
set_portal_mask(PortalMask mask) {
set_from_portal_mask(mask);
set_into_portal_mask(mask);
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_from_portal_mask
// Access: Published
// Description: Sets the "from" PortalMask. In order for a
// portal to be detected from this object into
// another object, the intersection of this object's
// "from" mask and the other object's "into" mask must
// be nonzero.
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::
set_from_portal_mask(PortalMask mask) {
_from_portal_mask = mask;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_into_portal_mask
// Access: Published
// Description: Sets the "into" PortalMask. In order for a
// portal to be detected from another object into
// this object, the intersection of the other object's
// "from" mask and this object's "into" mask must be
// nonzero.
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::
set_into_portal_mask(PortalMask mask) {
_into_portal_mask = mask;
// We mark the bound stale when this changes, not because the actual
// bounding volume changes, but rather because we piggyback the
// computing of the _net_portal_mask on the bounding volume.
mark_bounds_stale();
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_from_portal_mask
// Access: Published
// Description: Returns the current "from" PortalMask. In order for
// a portal to be detected from this object into
// another object, the intersection of this object's
// "from" mask and the other object's "into" mask must
// be nonzero.
////////////////////////////////////////////////////////////////////
INLINE PortalMask PortalNode::
get_from_portal_mask() const {
return _from_portal_mask;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_into_portal_mask
// Access: Published
// Description: Returns the current "into" PortalMask. In order for
// a portal to be detected from another object into
// this object, the intersection of the other object's
// "from" mask and this object's "into" mask must be
// nonzero.
////////////////////////////////////////////////////////////////////
INLINE PortalMask PortalNode::
get_into_portal_mask() const {
return _into_portal_mask;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_portal_geom
// Access: Published
// Description: Sets the state of the "portal geom" flag for this
// PortalNode. Normally, this is false; when this is
// set true, the PortalSolids in this node will test
// for portals with actual renderable geometry, in
// addition to whatever PortalSolids may be indicated
// by the from_portal_mask.
//
// Setting this to true causes this to test *all*
// GeomNodes for portals. It is an all-or-none
// thing; there is no way to portal with only some
// GeomNodes, as GeomNodes have no into_portal_mask.
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::
set_portal_geom(bool flag) {
if (flag) {
_flags |= F_portal_geom;
} else {
_flags &= ~F_portal_geom;
}
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_portal_geom
// Access: Published
// Description: Returns the current state of the portal_geom flag.
// See set_portal_geom().
////////////////////////////////////////////////////////////////////
INLINE bool PortalNode::
get_portal_geom() const {
return (_flags & F_portal_geom) != 0;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::clear_vertices
// Access: Published
// Description: Resets the vertices of the portal to the empty list.
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::
clear_vertices() {
_vertices.clear();
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::add_vertex
// Access: Published
// Description: Adds a new vertex to the portal polygon. The
// vertices should be defined in a counterclockwise
// orientation when viewing through the portal.
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::
add_vertex(const LPoint3f &vertex) {
_vertices.push_back(vertex);
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_num_vertices
// Access: Published
// Description: Returns the number of vertices in the portal polygon.
////////////////////////////////////////////////////////////////////
INLINE int PortalNode::
get_num_vertices() const {
return _vertices.size();
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_vertex
// Access: Published
// Description: Returns the nth vertex of the portal polygon.
////////////////////////////////////////////////////////////////////
INLINE const LPoint3f &PortalNode::
get_vertex(int n) const {
nassertr(n >= 0 && n < (int)_vertices.size(), LPoint3f::zero());
return _vertices[n];
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_cell_in
// Access: Published
// Description: Sets the cell that this portal belongs to
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::set_cell_in(const NodePath &cell) {
_cell_in = cell;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_cell_in
// Access: Published
// Description: Sets the cell that this portal belongs to
////////////////////////////////////////////////////////////////////
INLINE NodePath PortalNode::get_cell_in() const {
return _cell_in;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_cell_out
// Access: Published
// Description: Sets the cell that this portal leads out to
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::set_cell_out(const NodePath &cell) {
_cell_out = cell;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_cell_out
// Access: Published
// Description: Sets the cell that this portal leads out to
////////////////////////////////////////////////////////////////////
INLINE NodePath PortalNode::get_cell_out() const {
return _cell_out;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_clip_plane
// Access: Published
// Description: this is set if the portal will clip against its
// left and right planes
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::set_clip_plane(bool value) {
_clip_plane = value;
if (_clip_plane) {
enable_clipping_planes();
}
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::is_clip_plane
// Access: Published
// Description: Is this portal clipping against its left-right planes
////////////////////////////////////////////////////////////////////
INLINE bool PortalNode::is_clip_plane() {
return _clip_plane;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_visible
// Access: Published
// Description: this is set if the portal is facing camera
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::set_visible(bool value) {
_visible = value;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::is_visible
// Access: Published
// Description: Is this portal facing the camera
////////////////////////////////////////////////////////////////////
INLINE bool PortalNode::is_visible() {
return _visible;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_open
// Access: Published
// Description: Python sets this based on curent camera zone
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::set_open(bool value) {
_open = value;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::is_open
// Access: Published
// Description: Is this portal open from current camera zone
////////////////////////////////////////////////////////////////////
INLINE bool PortalNode::is_open() {
return _open;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::set_max_depth
// Access: Published
// Description: Set the maximum depth this portal will be visible at
////////////////////////////////////////////////////////////////////
INLINE void PortalNode::set_max_depth(int value) {
_max_depth = value;
}
////////////////////////////////////////////////////////////////////
// Function: PortalNode::get_max_depth
// Access: Published
// Description: Returns the maximum depth this portal will be visible at
////////////////////////////////////////////////////////////////////
INLINE int PortalNode::get_max_depth() {
return _max_depth;
}