historical/toontown-classic.git/panda/include/portalClipper.I

207 lines
4.9 KiB
Text
Raw Normal View History

2024-01-16 11:20:27 -06:00
/**
* 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."
*
* @file portalClipper.I
* @author masad
* @date 2004-05-04
*/
/**
*
*/
INLINE PortalClipper::Point::
Point() {
}
/**
*
*/
INLINE PortalClipper::Point::
Point(const LVecBase3 &point, const LColor &color) :
_point(point[0], point[1], point[2]),
_color(color)
{
}
/**
*
*/
INLINE PortalClipper::Point::
Point(const PortalClipper::Point &copy) :
_point(copy._point),
_color(copy._color)
{
}
/**
*
*/
INLINE void PortalClipper::Point::
operator = (const PortalClipper::Point &copy) {
_point = copy._point;
_color = copy._color;
}
/**
* Moves the pen to the given point without drawing a line. When followed by
* draw_to(), this marks the first point of a line segment; when followed by
* move_to() or create(), this creates a single point.
*/
INLINE void PortalClipper::
move_to(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z) {
move_to(LVertex(x, y, z));
}
/**
* Draws a line segment from the pen's last position (the last call to move_to
* or draw_to) to the indicated point. move_to() and draw_to() only update
* tables; the actual drawing is performed when create() is called.
*/
INLINE void PortalClipper::
draw_to(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z) {
draw_to(LVertex(x, y, z));
}
/**
* Draw the current camera frustum in white color
*
*/
INLINE void PortalClipper::
draw_camera_frustum() {
_color = LColor(1,1,1,1);
draw_hexahedron(_view_frustum);
}
/**
* Set the current view frustum that is being calculated by the portal clipper
*
*/
INLINE void PortalClipper::
set_reduced_frustum(BoundingHexahedron *frustum) {
_reduced_frustum = frustum;
}
/**
* Return the reduced frustum
*/
INLINE BoundingHexahedron *PortalClipper::
get_reduced_frustum() const {
return _reduced_frustum;
}
/**
* Set the clip state of the current portal node This is done to remember the
* state for the child portal nodes
*
*/
INLINE void PortalClipper::
set_clip_state(const RenderState* clip_state) {
_clip_state = clip_state;
}
/**
* Returns the stored clip state
*/
INLINE const RenderState *PortalClipper::
get_clip_state() const {
return _clip_state;
}
/**
* Set the current viewport that is being used by the portal clipper
*
*/
INLINE void PortalClipper::
set_reduced_viewport(const LPoint2& min, const LPoint2& max) {
_reduced_viewport_min = min;
_reduced_viewport_max = max;
}
/**
* Return the reduced viewport
*/
INLINE void PortalClipper::
get_reduced_viewport(LPoint2& min, LPoint2& max) const {
min = _reduced_viewport_min;
max = _reduced_viewport_max;
}
/**
* checks if the portal plane (in camera space) is facing the camera's near
* plane
*/
INLINE bool PortalClipper::
is_facing_view(const LPlane &portal_plane) {
portal_cat.debug() << "portal plane check value: " << portal_plane[3] << "\n";
return (portal_plane[3] > 0);
}
/**
* checks if portal_node is within the view frustum. If so, then the portal
* is worth considering. This is a 2nd level test to weed out most of the
* portals
*/
INLINE bool PortalClipper::
is_whole_portal_in_view(const LMatrix4 &cmat) {
// I am about to xform this gbv, so lets make a copy
const BoundingVolume *bv = _portal_node->get_bounds();
BoundingVolume *cbv = bv->make_copy();
GeometricBoundingVolume *gbv = DCAST(GeometricBoundingVolume, cbv);
// trasform it to camera space
gbv->xform(cmat);
int result = _reduced_frustum->contains(gbv);
portal_cat.spam() << "1st level test if portal: " << *_reduced_frustum << " is in view " << result << std::endl;
return (result != 0);
}
/**
* checks if any of the _coords is within the view frustum. If so, then the
* portal is facing the camera. 2nd level test to make sure this portal is
* worth visiting
*/
/*
INLINE bool PortalClipper::
is_partial_portal_in_view() {
int result = 0;
// check if any of the _coords in tested frustum
for (int j=0; j<_num_vert; ++j) {
result |= _reduced_frustum->contains(_coords[j]);
}
portal_cat.spam() << "frustum: " << *_reduced_frustum << " contains(coord) result = " << result << endl;
return (result != 0);
}
*/
/**
* Given the x and z, solve for y: from the plane
*/
/*
INLINE PN_stdfloat PortalClipper::
get_plane_depth(PN_stdfloat x, PN_stdfloat z, LPlane *portal_plane) {
PN_stdfloat y = 0.0;
// Plane equation: Ax + By + Cz + D = 0 y = (Ax + Cz + D) -B
portal_cat.spam() << *portal_plane << endl;
portal_cat.spam() << portal_plane->_v.v._0 << " " << portal_plane->_v.v._1 << " "
<< portal_plane->_v.v._2 << " " << portal_plane->_v.v._3 << endl;
if (portal_plane->_v.v._1 != 0.0) {
y = (((portal_plane->_v.v._0*x)+(portal_plane->_v.v._2*z)+portal_plane->_v.v._3)
/ -(portal_plane->_v.v._1));
}
return y;
}
*/