37 if (_tags !=
nullptr && _tags != tags) {
38 nout <<
"Multiple Tags fields in effect on the same polygons.\n";
42 IffId type = lwo_ptags->_tag_type;
44 bool inserted = _ptags.insert(PTags::value_type(type, lwo_ptags)).second;
46 nout <<
"Multiple polygon tags on the same polygons of type "
50 if (type ==
IffId(
"SURF")) {
51 _surf_ptags = lwo_ptags;
63 IffId map_type = lwo_vmad->_map_type;
64 const string &name = lwo_vmad->_name;
67 if (map_type ==
IffId(
"TXUV")) {
69 _txuv.insert(VMad::value_type(name, lwo_vmad)).second;
76 nout <<
"Multiple discontinous vertex maps on the same polygons of type "
77 << map_type <<
" named " << name <<
"\n";
87 if (_surf_ptags ==
nullptr) {
92 if (!_surf_ptags->
has_tag(polygon_index)) {
97 int tag_index = _surf_ptags->
get_tag(polygon_index);
98 if (_tags ==
nullptr || tag_index < 0 ||
101 nout <<
"Invalid polygon tag index " << tag_index <<
"\n";
105 string tag = _tags->
get_tag(tag_index);
109 if (surface ==
nullptr) {
110 nout <<
"Unknown surface " << tag <<
"\n";
128get_uv(
const string &uv_name,
int pi,
int vi, LPoint2 &uv)
const {
129 VMad::const_iterator ni = _txuv.find(uv_name);
130 if (ni == _txuv.end()) {
135 if (vmad->_dimension != 2) {
136 nout <<
"Unexpected dimension of " << vmad->_dimension
137 <<
" for discontinuous UV map " << uv_name <<
"\n";
145 PTA_stdfloat value = vmad->
get_value(pi, vi);
147 uv.set(value[0], value[1]);
160 if (_polygons->_polygon_type ==
IffId(
"CURV")) {
161 nout <<
"Ignoring Catmull-Rom splines.\n";
163 }
else if (_polygons->_polygon_type ==
IffId(
"PTCH")) {
164 nout <<
"Treating subdivision patches as ordinary polygons.\n";
167 }
else if (_polygons->_polygon_type ==
IffId(
"MBAL")) {
168 nout <<
"Ignoring metaballs.\n";
170 }
else if (_polygons->_polygon_type ==
IffId(
"BONE")) {
171 nout <<
"Ignoring bones.\n";
173 }
else if (_polygons->_polygon_type ==
IffId(
"FACE")) {
177 nout <<
"Ignoring unknown geometry type " << _polygons->_polygon_type
187 nassertv(_points->_layer->_egg_group !=
nullptr);
188 nassertv(_egg_group !=
nullptr);
189 _points->_layer->_egg_group->steal_children(*_egg_group);
198 PN_stdfloat smooth_angle = -1.0;
200 int num_polygons = _polygons->get_num_polygons();
201 for (
int pindex = 0; pindex < num_polygons; pindex++) {
205 bool is_valid =
true;
208 const LwoPoints *points = _points->_points;
218 if (poly->_vertices.size() == 1) {
227 vector_PT_EggVertex egg_vertices;
229 int num_vertices = poly->_vertices.size();
230 for (
int vi = num_vertices; vi > 0; vi--) {
231 int vindex = poly->_vertices[vi % num_vertices];
232 if (vindex < 0 || vindex >= num_points) {
233 nout <<
"Invalid vertex index " << vindex <<
" in polygon.\n";
237 LPoint3d pos = LCAST(
double, points->
get_point(vindex));
238 egg_vertex->set_pos(pos);
244 if (
get_uv(uv_name, pindex, vindex, uv)) {
247 egg_vertex->set_uv(LCAST(
double, uv));
249 }
else if (_points->
get_uv(uv_name, vindex, uv)) {
252 egg_vertex->set_uv(LCAST(
double, uv));
256 egg_vertices.push_back(egg_vertex);
261 if (surface !=
nullptr) {
266 vector_PT_EggVertex::const_iterator evi;
267 for (evi = egg_vertices.begin(); evi != egg_vertices.end(); ++evi) {
270 egg_prim->add_vertex(new_vertex);
274 _egg_group->add_child(egg_prim.p());
279 if (smooth_angle > 0.0) {
280 _egg_group->recompute_vertex_normals(rad_2_deg(smooth_angle), cs);
282 _egg_group->recompute_polygon_normals(cs);
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bool get_uv(const std::string &uv_name, int n, LPoint2 &uv) const
Returns true if there is a UV of the indicated name associated with the given vertex,...
void make_egg()
Creates the egg structures associated with this Lightwave object.
bool get_uv(const std::string &uv_name, int pi, int vi, LPoint2 &uv) const
Returns true if there is a UV of the indicated name associated with the given vertex of the indicated...
void connect_egg()
Connects all the egg structures together.
void add_vmad(const LwoDiscontinuousVertexMap *lwo_vmad)
Associates the indicated DiscontinousVertexMap with the polygons.
CLwoSurface * get_surface(int polygon_index) const
Returns the surface associated with the given polygon, or NULL if no surface is associated.
void add_ptags(const LwoPolygonTags *lwo_ptags, const LwoTags *tags)
Associates the indicated PolygonTags and Tags with the polygons in this chunk.
This class is a wrapper around LwoSurface and stores additional information useful during the convers...
bool has_named_uvs() const
Returns true if the surface is set up to reference UV's stored on the vertices, by name (as opposed t...
const std::string & get_uv_name() const
Returns the name of the set of UV's that are associated with this surface, if has_named_uvs() is true...
void apply_properties(EggPrimitive *egg_prim, vector_PT_EggVertex &egg_vertices, PN_stdfloat &smooth_angle)
Applies the color, texture, etc.
get_coordinate_system
Returns the coordinate system in which the egg file is defined.
The main glue of the egg hierarchy, this corresponds to the <Group>, <Instance>, and <Joint> type nod...
A single point, or a collection of points as defined by a single <PointLight> entry.
A base class for any of a number of kinds of geometry primitives: polygons, point lights,...
A collection of vertices.
EggVertex * create_unique_vertex(const EggVertex ©)
Creates a new vertex in the pool that is a copy of the indicated one and returns it.
Any one-, two-, three-, or four-component vertex, possibly with attributes such as a normal.
A four-byte chunk ID appearing in an "IFF" file.
A mapping of floating-point values per integer index.
bool has_value(int polygon_index, int vertex_index) const
Returns true if the map has a value associated with the given index, false otherwise.
PTA_stdfloat get_value(int polygon_index, int vertex_index) const
Returns the mapping value associated with the given index, or an empty PTA_stdfloat if there is no ma...
An array of points that will be referenced by later chunks.
int get_num_points() const
Returns the number of points of this group.
const LPoint3 & get_point(int n) const
Returns the nth point of this group.
CLwoSurface * get_surface(const std::string &name) const
Returns a pointer to the surface definition with the given name, or NULL if there is no such surface.
EggData * get_egg_data()
Returns the EggData structure.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.