Panda3D
egg_parametrics.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file egg_parametrics.cxx
10  * @author drose
11  * @date 2003-10-13
12  */
13 
14 #include "egg_parametrics.h"
15 #include "config_egg2pg.h"
16 
17 /**
18  * Returns a new NurbsSurfaceEvaluator that's filled in with the values from
19  * the given EggSurface (and transformed by the indicated matrix), or NULL if
20  * the object is invalid. If there is vertex color, it will be applied to
21  * values 0 - 3 of the extended vertex values.
22  */
24 make_nurbs_surface(EggNurbsSurface *egg_surface, const LMatrix4d &mat) {
25  if (egg_surface->get_u_order() < 1 || egg_surface->get_u_order() > 4) {
26  egg2pg_cat.error()
27  << "Invalid NURBSSurface U order for " << egg_surface->get_name() << ": "
28  << egg_surface->get_u_order() << "\n";
29  return nullptr;
30  }
31 
32  if (egg_surface->get_v_order() < 1 || egg_surface->get_v_order() > 4) {
33  egg2pg_cat.error()
34  << "Invalid NURBSSurface V order for " << egg_surface->get_name() << ": "
35  << egg_surface->get_v_order() << "\n";
36  return nullptr;
37  }
38 
40 
41  nurbs->set_u_order(egg_surface->get_u_order());
42  nurbs->set_v_order(egg_surface->get_v_order());
43 
44  int num_u_vertices = egg_surface->get_num_u_cvs();
45  int num_v_vertices = egg_surface->get_num_v_cvs();
46  nurbs->reset(num_u_vertices, num_v_vertices);
47  for (int ui = 0; ui < num_u_vertices; ui++) {
48  for (int vi = 0; vi < num_v_vertices; vi++) {
49  int i = egg_surface->get_vertex_index(ui, vi);
50  EggVertex *egg_vertex = egg_surface->get_vertex(i);
51  nurbs->set_vertex(ui, vi, LCAST(PN_stdfloat, egg_vertex->get_pos4() * mat));
52 
53  LColor color = egg_vertex->get_color();
54  nurbs->set_extended_vertices(ui, vi, 0, color.get_data(), 4);
55  }
56  }
57 
58  int num_u_knots = egg_surface->get_num_u_knots();
59  if (num_u_knots != nurbs->get_num_u_knots()) {
60  egg2pg_cat.error()
61  << "Invalid NURBSSurface number of U knots for "
62  << egg_surface->get_name() << ": got " << num_u_knots
63  << " knots, expected " << nurbs->get_num_u_knots() << "\n";
64  return nullptr;
65  }
66 
67  int num_v_knots = egg_surface->get_num_v_knots();
68  if (num_v_knots != nurbs->get_num_v_knots()) {
69  egg2pg_cat.error()
70  << "Invalid NURBSSurface number of U knots for "
71  << egg_surface->get_name() << ": got " << num_v_knots
72  << " knots, expected " << nurbs->get_num_v_knots() << "\n";
73  return nullptr;
74  }
75 
76  int i;
77  for (i = 0; i < num_u_knots; i++) {
78  nurbs->set_u_knot(i, egg_surface->get_u_knot(i));
79  }
80  for (i = 0; i < num_v_knots; i++) {
81  nurbs->set_v_knot(i, egg_surface->get_v_knot(i));
82  }
83 
84  return nurbs;
85 }
86 
87 /**
88  * Returns a new NurbsCurveEvaluator that's filled in with the values from the
89  * given EggCurve (and transformed by the indicated matrix), or NULL if the
90  * object is invalid. If there is vertex color, it will be applied to values
91  * 0 - 3 of the extended vertex values.
92  */
94 make_nurbs_curve(EggNurbsCurve *egg_curve, const LMatrix4d &mat) {
95  if (egg_curve->get_order() < 1 || egg_curve->get_order() > 4) {
96  egg2pg_cat.error()
97  << "Invalid NURBSCurve order for " << egg_curve->get_name() << ": "
98  << egg_curve->get_order() << "\n";
99  return nullptr;
100  }
101 
103  nurbs->set_order(egg_curve->get_order());
104 
105  nurbs->reset(egg_curve->size());
106  EggPrimitive::const_iterator pi;
107  int vi = 0;
108  for (pi = egg_curve->begin(); pi != egg_curve->end(); ++pi) {
109  EggVertex *egg_vertex = (*pi);
110  nurbs->set_vertex(vi, LCAST(PN_stdfloat, egg_vertex->get_pos4() * mat));
111  LColor color = egg_vertex->get_color();
112  nurbs->set_extended_vertices(vi, 0, color.get_data(), 4);
113  vi++;
114  }
115 
116  int num_knots = egg_curve->get_num_knots();
117  if (num_knots != nurbs->get_num_knots()) {
118  egg2pg_cat.error()
119  << "Invalid NURBSCurve number of knots for "
120  << egg_curve->get_name() << ": got " << num_knots
121  << " knots, expected " << nurbs->get_num_knots() << "\n";
122  return nullptr;
123  }
124 
125  for (int i = 0; i < num_knots; i++) {
126  nurbs->set_knot(i, egg_curve->get_knot(i));
127  }
128 
129  return nurbs;
130 }
get_num_v_knots
Returns the number of knots in the V direction.
get_order
Returns the order of the curve.
Definition: eggNurbsCurve.h:55
get_num_u_knots
Returns the number of knots in the U direction.
int get_num_u_cvs() const
Returns the number of control vertices that should be present in the U direction.
This class is an abstraction for evaluating NURBS curves.
get_v_knot
Returns the nth knot value defined in the V direction.
int get_vertex_index(int ui, int vi) const
Returns the index number within the EggPrimitive's list of the control vertex at position ui,...
This class is an abstraction for evaluating NURBS surfaces.
LColor get_color() const
Returns the color set on this particular attribute.
Definition: eggAttributes.I:91
get_vertex
Returns a particular index based on its index number.
Definition: eggPrimitive.h:187
int get_num_v_cvs() const
Returns the number of control vertices that should be present in the V direction.
get_num_knots
Returns the number of knots.
Definition: eggNurbsCurve.h:51
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
int get_u_order() const
Returns the order of the surface in the U direction.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Any one-, two-, three-, or four-component vertex, possibly with attributes such as a normal.
Definition: eggVertex.h:39
A parametric NURBS curve.
Definition: eggNurbsCurve.h:26
int get_v_order() const
Returns the order of the surface in the V direction.
get_knot
Returns the nth knot value defined.
Definition: eggNurbsCurve.h:51
PT(NurbsSurfaceEvaluator) make_nurbs_surface(EggNurbsSurface *egg_surface
Returns a new NurbsSurfaceEvaluator that's filled in with the values from the given EggSurface (and t...
get_u_knot
Returns the nth knot value defined in the U direction.
A parametric NURBS surface.
LPoint4d get_pos4() const
This is always valid, regardless of the value of get_num_dimensions.
Definition: eggVertex.I:145