open_toontown_panda3d/panda/src/egg2pg/egg_parametrics.cxx

131 lines
4.3 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 egg_parametrics.cxx
* @author drose
* @date 2003-10-13
*/
#include "egg_parametrics.h"
#include "config_egg2pg.h"
/**
* Returns a new NurbsSurfaceEvaluator that's filled in with the values from
* the given EggSurface (and transformed by the indicated matrix), or NULL if
* the object is invalid. If there is vertex color, it will be applied to
* values 0 - 3 of the extended vertex values.
*/
PT(NurbsSurfaceEvaluator)
make_nurbs_surface(EggNurbsSurface *egg_surface, const LMatrix4d &mat) {
if (egg_surface->get_u_order() < 1 || egg_surface->get_u_order() > 4) {
egg2pg_cat.error()
<< "Invalid NURBSSurface U order for " << egg_surface->get_name() << ": "
<< egg_surface->get_u_order() << "\n";
return nullptr;
}
if (egg_surface->get_v_order() < 1 || egg_surface->get_v_order() > 4) {
egg2pg_cat.error()
<< "Invalid NURBSSurface V order for " << egg_surface->get_name() << ": "
<< egg_surface->get_v_order() << "\n";
return nullptr;
}
PT(NurbsSurfaceEvaluator) nurbs = new NurbsSurfaceEvaluator;
nurbs->set_u_order(egg_surface->get_u_order());
nurbs->set_v_order(egg_surface->get_v_order());
int num_u_vertices = egg_surface->get_num_u_cvs();
int num_v_vertices = egg_surface->get_num_v_cvs();
nurbs->reset(num_u_vertices, num_v_vertices);
for (int ui = 0; ui < num_u_vertices; ui++) {
for (int vi = 0; vi < num_v_vertices; vi++) {
int i = egg_surface->get_vertex_index(ui, vi);
EggVertex *egg_vertex = egg_surface->get_vertex(i);
nurbs->set_vertex(ui, vi, LCAST(PN_stdfloat, egg_vertex->get_pos4() * mat));
LColor color = egg_vertex->get_color();
nurbs->set_extended_vertices(ui, vi, 0, color.get_data(), 4);
}
}
int num_u_knots = egg_surface->get_num_u_knots();
if (num_u_knots != nurbs->get_num_u_knots()) {
egg2pg_cat.error()
<< "Invalid NURBSSurface number of U knots for "
<< egg_surface->get_name() << ": got " << num_u_knots
<< " knots, expected " << nurbs->get_num_u_knots() << "\n";
return nullptr;
}
int num_v_knots = egg_surface->get_num_v_knots();
if (num_v_knots != nurbs->get_num_v_knots()) {
egg2pg_cat.error()
<< "Invalid NURBSSurface number of U knots for "
<< egg_surface->get_name() << ": got " << num_v_knots
<< " knots, expected " << nurbs->get_num_v_knots() << "\n";
return nullptr;
}
int i;
for (i = 0; i < num_u_knots; i++) {
nurbs->set_u_knot(i, egg_surface->get_u_knot(i));
}
for (i = 0; i < num_v_knots; i++) {
nurbs->set_v_knot(i, egg_surface->get_v_knot(i));
}
return nurbs;
}
/**
* Returns a new NurbsCurveEvaluator that's filled in with the values from the
* given EggCurve (and transformed by the indicated matrix), or NULL if the
* object is invalid. If there is vertex color, it will be applied to values
* 0 - 3 of the extended vertex values.
*/
PT(NurbsCurveEvaluator)
make_nurbs_curve(EggNurbsCurve *egg_curve, const LMatrix4d &mat) {
if (egg_curve->get_order() < 1 || egg_curve->get_order() > 4) {
egg2pg_cat.error()
<< "Invalid NURBSCurve order for " << egg_curve->get_name() << ": "
<< egg_curve->get_order() << "\n";
return nullptr;
}
PT(NurbsCurveEvaluator) nurbs = new NurbsCurveEvaluator;
nurbs->set_order(egg_curve->get_order());
nurbs->reset(egg_curve->size());
EggPrimitive::const_iterator pi;
int vi = 0;
for (pi = egg_curve->begin(); pi != egg_curve->end(); ++pi) {
EggVertex *egg_vertex = (*pi);
nurbs->set_vertex(vi, LCAST(PN_stdfloat, egg_vertex->get_pos4() * mat));
LColor color = egg_vertex->get_color();
nurbs->set_extended_vertices(vi, 0, color.get_data(), 4);
vi++;
}
int num_knots = egg_curve->get_num_knots();
if (num_knots != nurbs->get_num_knots()) {
egg2pg_cat.error()
<< "Invalid NURBSCurve number of knots for "
<< egg_curve->get_name() << ": got " << num_knots
<< " knots, expected " << nurbs->get_num_knots() << "\n";
return nullptr;
}
for (int i = 0; i < num_knots; i++) {
nurbs->set_knot(i, egg_curve->get_knot(i));
}
return nurbs;
}