historical/toontown-classic.git/panda/include/qtessSurface.h
2024-01-16 11:20:27 -06:00

112 lines
3.6 KiB
C++

/**
* 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 qtessSurface.h
* @author drose
* @date 2003-10-13
*/
#ifndef QTESSSURFACE_H
#define QTESSSURFACE_H
#include "pandatoolbase.h"
#include "isoPlacer.h"
#include "eggNurbsSurface.h"
#include "eggGroup.h"
#include "eggVertex.h"
#include "nurbsSurfaceEvaluator.h"
#include "nurbsSurfaceResult.h"
#include "referenceCount.h"
#include "pointerTo.h"
/**
* A reference to an EggNurbsSurface in the egg file, and its parameters as
* set by the user input file and as computed in relation to the other
* surfaces.
*/
class QtessSurface : public ReferenceCount {
public:
QtessSurface(EggNurbsSurface *egg_surface);
INLINE const std::string &get_name() const;
INLINE bool is_valid() const;
INLINE void set_importance(double importance2);
INLINE void set_match_u(QtessSurface **match_u, bool match_u_to_u);
INLINE void set_match_v(QtessSurface **match_v, bool match_v_to_v);
INLINE void set_min_u(int min_u);
INLINE void set_min_v(int min_v);
INLINE double count_patches() const;
INLINE int count_tris() const;
double get_score(double ratio);
int tesselate();
int write_qtess_parameter(std::ostream &out);
void omit();
void tesselate_uv(int u, int v, bool autoplace, double ratio);
void tesselate_specific(const pvector<double> &u_list,
const pvector<double> &v_list);
void tesselate_per_isoparam(double pi, bool autoplace, double ratio);
void tesselate_per_score(double pi, bool autoplace, double ratio);
void tesselate_auto(int u, int v, double ratio);
private:
void record_vertex_extras();
INLINE int get_joint_membership_index(EggGroup *joint);
INLINE int get_dxyz_index(const std::string &morph_name);
INLINE int get_drgba_index(const std::string &morph_name);
void apply_match();
PT(EggGroup) do_uniform_tesselate(int &tris) const;
PT(EggVertex) evaluate_vertex(double u, double v) const;
PT(EggNurbsSurface) _egg_surface;
PT(NurbsSurfaceEvaluator) _nurbs;
PT(NurbsSurfaceResult) _nurbs_result;
bool _has_vertex_color;
// Mapping arbitrary attributes to integer extended dimension values, so we
// can hang arbitrary data in the extra dimensional space of the surface.
int _next_d;
typedef std::map<EggGroup *, int> JointTable;
JointTable _joint_table;
typedef std::map<std::string, int> MorphTable;
MorphTable _dxyz_table;
MorphTable _drgba_table;
int _num_u, _num_v;
int _tess_u, _tess_v;
pvector<double> _iso_u, _iso_v; // If nonempty, isoparams at which to tess.
// _importance is the relative importance of the surface along either axis;
// _importance2 is this number squared, which is the value set by
// set_importance().
double _importance;
double _importance2;
// _match_u and _match_v indicate which surface we must match exactly for
// tesselation in U or V. This helps get edges to line up properly. They
// are indirect pointers because we go through the surfaces in one pass, and
// might need to fill in the correct value later.
QtessSurface **_match_u, **_match_v;
bool _match_u_to_u, _match_v_to_v;
// _min_u and _min_v specify a mininum number of quads below which we should
// not attempt to subdivide the surface in either dimension. This is
// intended to prevent degenerate cases like knife-fingers.
int _min_u, _min_v;
IsoPlacer _u_placer, _v_placer;
bool _got_scores;
};
#include "qtessSurface.I"
#endif