mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
add dxf2egg
This commit is contained in:
parent
d3a101d447
commit
01776f36c2
19
pandatool/src/dxfegg/Sources.pp
Normal file
19
pandatool/src/dxfegg/Sources.pp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#begin ss_lib_target
|
||||||
|
#define TARGET dxfegg
|
||||||
|
#define LOCAL_LIBS converter dxf pandatoolbase
|
||||||
|
#define OTHER_LIBS \
|
||||||
|
egg:c event:c pandaegg:m \
|
||||||
|
mathutil:c linmath:c putil:c express:c panda:m \
|
||||||
|
interrogatedb:c dconfig:c dtoolconfig:m \
|
||||||
|
dtoolutil:c dtoolbase:c dtool:m
|
||||||
|
#define UNIX_SYS_LIBS \
|
||||||
|
m
|
||||||
|
|
||||||
|
#define SOURCES \
|
||||||
|
dxfToEggConverter.cxx dxfToEggConverter.h \
|
||||||
|
dxfToEggLayer.cxx dxfToEggLayer.h
|
||||||
|
|
||||||
|
#define INSTALL_HEADERS \
|
||||||
|
dxfToEggConverter.h dxfToEggLayer.h
|
||||||
|
|
||||||
|
#end ss_lib_target
|
163
pandatool/src/dxfegg/dxfToEggConverter.cxx
Normal file
163
pandatool/src/dxfegg/dxfToEggConverter.cxx
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
// Filename: dxfToEggConverter.cxx
|
||||||
|
// Created by: drose (04May04)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// PANDA 3D SOFTWARE
|
||||||
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||||
|
//
|
||||||
|
// All use of this software is subject to the terms of the Panda 3d
|
||||||
|
// Software license. You should have received a copy of this license
|
||||||
|
// along with this source code; you will also find a current copy of
|
||||||
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||||
|
//
|
||||||
|
// To contact the maintainers of this program write to
|
||||||
|
// panda3d-general@lists.sourceforge.net .
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "dxfToEggConverter.h"
|
||||||
|
#include "dxfToEggLayer.h"
|
||||||
|
#include "eggData.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
DXFToEggConverter::
|
||||||
|
DXFToEggConverter() {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::Copy Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
DXFToEggConverter::
|
||||||
|
DXFToEggConverter(const DXFToEggConverter ©) :
|
||||||
|
SomethingToEggConverter(copy)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::Destructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
DXFToEggConverter::
|
||||||
|
~DXFToEggConverter() {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::make_copy
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Allocates and returns a new copy of the converter.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
SomethingToEggConverter *DXFToEggConverter::
|
||||||
|
make_copy() {
|
||||||
|
return new DXFToEggConverter(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::get_name
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Returns the English name of the file type this
|
||||||
|
// converter supports.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
string DXFToEggConverter::
|
||||||
|
get_name() const {
|
||||||
|
return "DXF";
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::get_extension
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Returns the common extension of the file type this
|
||||||
|
// converter supports.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
string DXFToEggConverter::
|
||||||
|
get_extension() const {
|
||||||
|
return "dxf";
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::convert_file
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Handles the reading of the input file and converting
|
||||||
|
// it to egg. Returns true if successful, false
|
||||||
|
// otherwise.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool DXFToEggConverter::
|
||||||
|
convert_file(const Filename &filename) {
|
||||||
|
_error = false;
|
||||||
|
|
||||||
|
process(filename);
|
||||||
|
return !_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::new_layer
|
||||||
|
// Access: Protected, Virtual
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
DXFLayer *DXFToEggConverter::
|
||||||
|
new_layer(const string &name) {
|
||||||
|
return new DXFToEggLayer(name, &get_egg_data());
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::done_entity
|
||||||
|
// Access: Protected, Virtual
|
||||||
|
// Description: If the entity is a polygon, creates the corresponding
|
||||||
|
// egg polygon.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void DXFToEggConverter::
|
||||||
|
done_entity() {
|
||||||
|
if (_entity == EN_polyline) {
|
||||||
|
// A Polyline is either an unclosed series of connected line
|
||||||
|
// segments, or a closed polygon of arbitrary complexity.
|
||||||
|
|
||||||
|
if ((_flags & PF_3d) == 0) {
|
||||||
|
// it's a 2-d polygon; convert it to 3-d coordinates.
|
||||||
|
ocs_2_wcs();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_flags & PF_closed) {
|
||||||
|
// it's closed; create a polygon.
|
||||||
|
nassertv(_layer!=NULL);
|
||||||
|
((DXFToEggLayer *)_layer)->add_polygon(this);
|
||||||
|
} else {
|
||||||
|
// It's open; create a series of line segments.
|
||||||
|
nassertv(_layer!=NULL);
|
||||||
|
((DXFToEggLayer *)_layer)->add_line(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (_entity == EN_3dface) {
|
||||||
|
// DXF can also represent a polygon as a 3DFace. This might be
|
||||||
|
// either a quad or a triangle (if two of the vertices are the
|
||||||
|
// same). We'll add the vertices to our list of vertices and then
|
||||||
|
// define the polygon.
|
||||||
|
_verts.clear();
|
||||||
|
_verts.push_back(DXFVertex(_p));
|
||||||
|
_verts.push_back(DXFVertex(_q));
|
||||||
|
_verts.push_back(DXFVertex(_r));
|
||||||
|
_verts.push_back(DXFVertex(_s));
|
||||||
|
|
||||||
|
nassertv(_layer!=NULL);
|
||||||
|
((DXFToEggLayer *)_layer)->add_polygon(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggConverter::done_entity
|
||||||
|
// Access: Protected, Virtual
|
||||||
|
// Description: A hook for user code, if desired. This function is
|
||||||
|
// called when some unexpected error occurs while
|
||||||
|
// reading the DXF file.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void DXFToEggConverter::
|
||||||
|
error() {
|
||||||
|
_error = true;
|
||||||
|
}
|
55
pandatool/src/dxfegg/dxfToEggConverter.h
Normal file
55
pandatool/src/dxfegg/dxfToEggConverter.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// Filename: DXFToEggConverter.h
|
||||||
|
// Created by: drose (04May04)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// PANDA 3D SOFTWARE
|
||||||
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||||
|
//
|
||||||
|
// All use of this software is subject to the terms of the Panda 3d
|
||||||
|
// Software license. You should have received a copy of this license
|
||||||
|
// along with this source code; you will also find a current copy of
|
||||||
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||||
|
//
|
||||||
|
// To contact the maintainers of this program write to
|
||||||
|
// panda3d-general@lists.sourceforge.net .
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef DXFTOEGGCONVERTER_H
|
||||||
|
#define DXFTOEGGCONVERTER_H
|
||||||
|
|
||||||
|
#include "pandatoolbase.h"
|
||||||
|
|
||||||
|
#include "somethingToEggConverter.h"
|
||||||
|
#include "dxfFile.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : DXFToEggConverter
|
||||||
|
// Description : This class supervises the construction of an EggData
|
||||||
|
// structure from a DXF file.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class DXFToEggConverter : public SomethingToEggConverter, public DXFFile {
|
||||||
|
public:
|
||||||
|
DXFToEggConverter();
|
||||||
|
DXFToEggConverter(const DXFToEggConverter ©);
|
||||||
|
~DXFToEggConverter();
|
||||||
|
|
||||||
|
virtual SomethingToEggConverter *make_copy();
|
||||||
|
|
||||||
|
virtual string get_name() const;
|
||||||
|
virtual string get_extension() const;
|
||||||
|
|
||||||
|
virtual bool convert_file(const Filename &filename);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual DXFLayer *new_layer(const string &name);
|
||||||
|
virtual void done_entity();
|
||||||
|
virtual void error();
|
||||||
|
|
||||||
|
bool _error;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
116
pandatool/src/dxfegg/dxfToEggLayer.cxx
Normal file
116
pandatool/src/dxfegg/dxfToEggLayer.cxx
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// Filename: dxfToEggLayer.cxx
|
||||||
|
// Created by: drose (04May04)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// PANDA 3D SOFTWARE
|
||||||
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||||
|
//
|
||||||
|
// All use of this software is subject to the terms of the Panda 3d
|
||||||
|
// Software license. You should have received a copy of this license
|
||||||
|
// along with this source code; you will also find a current copy of
|
||||||
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||||
|
//
|
||||||
|
// To contact the maintainers of this program write to
|
||||||
|
// panda3d-general@lists.sourceforge.net .
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "dxfToEggLayer.h"
|
||||||
|
#include "dxfToEggConverter.h"
|
||||||
|
|
||||||
|
#include "dxfFile.h"
|
||||||
|
#include "eggGroup.h"
|
||||||
|
#include "eggPolygon.h"
|
||||||
|
#include "eggLine.h"
|
||||||
|
#include "eggVertex.h"
|
||||||
|
#include "eggVertexPool.h"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggLayer::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
DXFToEggLayer::
|
||||||
|
DXFToEggLayer(const string &name, EggGroupNode *parent) : DXFLayer(name) {
|
||||||
|
_group = new EggGroup(name);
|
||||||
|
parent->add_child(_group);
|
||||||
|
_vpool = new EggVertexPool(name);
|
||||||
|
_group->add_child(_vpool);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggLayer::add_polygon
|
||||||
|
// Access: Public
|
||||||
|
// Description: Given that done_entity() has just been called and that
|
||||||
|
// the current entity represents a polygon, adds the
|
||||||
|
// corresponding polygon to the layer's EggGroup and
|
||||||
|
// vertex pool.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void DXFToEggLayer::
|
||||||
|
add_polygon(const DXFToEggConverter *entity) {
|
||||||
|
EggPolygon *poly = new EggPolygon;
|
||||||
|
_group->add_child(poly);
|
||||||
|
|
||||||
|
const DXFFile::Color &color = entity->get_color();
|
||||||
|
poly->set_color(Colorf(color.r, color.g, color.b, 1.0));
|
||||||
|
|
||||||
|
// A polyline's vertices are stored in the attached vector by dxf.C.
|
||||||
|
// They were defined in the DXF file using a series of "VERTEX"
|
||||||
|
// entries.
|
||||||
|
|
||||||
|
// For a 3dface, the vertices are defined explicitly as part of the
|
||||||
|
// entity; but in this case, they were added to the vector before
|
||||||
|
// add_polygon() was called.
|
||||||
|
|
||||||
|
DXFVertices::const_iterator vi;
|
||||||
|
for (vi = entity->_verts.begin();
|
||||||
|
vi != entity->_verts.end();
|
||||||
|
++vi) {
|
||||||
|
poly->add_vertex(add_vertex(*vi));
|
||||||
|
}
|
||||||
|
|
||||||
|
poly->cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggLayer::add_line
|
||||||
|
// Access: Public
|
||||||
|
// Description: Similar to add_polygon(), but adds a set of point
|
||||||
|
// lights instead.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void DXFToEggLayer::
|
||||||
|
add_line(const DXFToEggConverter *entity) {
|
||||||
|
EggLine *line = new EggLine;
|
||||||
|
_group->add_child(line);
|
||||||
|
|
||||||
|
const DXFFile::Color &color = entity->get_color();
|
||||||
|
line->set_color(Colorf(color.r, color.g, color.b, 1.0));
|
||||||
|
|
||||||
|
DXFVertices::const_iterator vi;
|
||||||
|
for (vi = entity->_verts.begin();
|
||||||
|
vi != entity->_verts.end();
|
||||||
|
++vi) {
|
||||||
|
line->add_vertex(add_vertex(*vi));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DXFToEggLayer::add_vertex
|
||||||
|
// Access: Public
|
||||||
|
// Description: Adds a unique vertex to the layer's vertex pool and
|
||||||
|
// returns it. If the vertex was already defined
|
||||||
|
// previously, returns the original definition. This is
|
||||||
|
// designed to share the common vertices within a layer.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
EggVertex *DXFToEggLayer::
|
||||||
|
add_vertex(const DXFVertex &vert) {
|
||||||
|
EggVertex egg_vert;
|
||||||
|
egg_vert.set_pos(vert._p);
|
||||||
|
|
||||||
|
return _vpool->create_unique_vertex(egg_vert);
|
||||||
|
}
|
55
pandatool/src/dxfegg/dxfToEggLayer.h
Normal file
55
pandatool/src/dxfegg/dxfToEggLayer.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// Filename: dxfToEggLayer.h
|
||||||
|
// Created by: drose (04May04)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// PANDA 3D SOFTWARE
|
||||||
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
||||||
|
//
|
||||||
|
// All use of this software is subject to the terms of the Panda 3d
|
||||||
|
// Software license. You should have received a copy of this license
|
||||||
|
// along with this source code; you will also find a current copy of
|
||||||
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
||||||
|
//
|
||||||
|
// To contact the maintainers of this program write to
|
||||||
|
// panda3d-general@lists.sourceforge.net .
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef DXFTOEGGLAYER_H
|
||||||
|
#define DXFTOEGGLAYER_H
|
||||||
|
|
||||||
|
#include "pandatoolbase.h"
|
||||||
|
|
||||||
|
#include "dxfLayer.h"
|
||||||
|
#include "eggVertexPool.h"
|
||||||
|
#include "eggGroup.h"
|
||||||
|
#include "pointerTo.h"
|
||||||
|
|
||||||
|
class EggGroupNode;
|
||||||
|
class EggVertex;
|
||||||
|
class DXFVertex;
|
||||||
|
class DXFToEggConverter;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : DXFToEggLayer
|
||||||
|
// Description : The specialization of DXFLayer used by
|
||||||
|
// DXFToEggConverter. It contains a pointer to an
|
||||||
|
// EggGroup and a vertex pool; these are used to build
|
||||||
|
// up polygons grouped by layer in the egg file as each
|
||||||
|
// polygon is read from the DXF file.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class DXFToEggLayer : public DXFLayer {
|
||||||
|
public:
|
||||||
|
DXFToEggLayer(const string &name, EggGroupNode *parent);
|
||||||
|
|
||||||
|
void add_polygon(const DXFToEggConverter *entity);
|
||||||
|
void add_line(const DXFToEggConverter *entity);
|
||||||
|
EggVertex *add_vertex(const DXFVertex &vertex);
|
||||||
|
|
||||||
|
PT(EggVertexPool) _vpool;
|
||||||
|
PT(EggGroup) _group;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user