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 */
24make_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 */
94make_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}
LColor get_color() const
Returns the color set on this particular attribute.
Definition: eggAttributes.I:91
A parametric NURBS curve.
Definition: eggNurbsCurve.h:26
get_order
Returns the order of the curve.
Definition: eggNurbsCurve.h:55
get_num_knots
Returns the number of knots.
Definition: eggNurbsCurve.h:51
get_knot
Returns the nth knot value defined.
Definition: eggNurbsCurve.h:51
A parametric NURBS surface.
int get_u_order() const
Returns the order of the surface in the U direction.
get_num_u_knots
Returns the number of knots in the U 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,...
int get_v_order() const
Returns the order of the surface in the V direction.
get_v_knot
Returns the nth knot value defined in the V direction.
int get_num_v_cvs() const
Returns the number of control vertices that should be present in the V direction.
get_u_knot
Returns the nth knot value defined in the U direction.
int get_num_u_cvs() const
Returns the number of control vertices that should be present in the U direction.
get_num_v_knots
Returns the number of knots in the V direction.
get_vertex
Returns a particular index based on its index number.
Definition: eggPrimitive.h:187
Any one-, two-, three-, or four-component vertex, possibly with attributes such as a normal.
Definition: eggVertex.h:39
LPoint4d get_pos4() const
This is always valid, regardless of the value of get_num_dimensions.
Definition: eggVertex.I:145
This class is an abstraction for evaluating NURBS curves.
This class is an abstraction for evaluating NURBS surfaces.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
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...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.