mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 17:35:34 -04:00
Added ability to convert maya cameras to locators
This commit is contained in:
parent
ef6e88c8be
commit
b16972bd23
@ -101,6 +101,7 @@ MayaToEggConverter(const string &program_name) :
|
|||||||
_keep_all_uvsets = false;
|
_keep_all_uvsets = false;
|
||||||
_round_uvs = false;
|
_round_uvs = false;
|
||||||
_legacy_shader = false;
|
_legacy_shader = false;
|
||||||
|
_convert_cameras = false;
|
||||||
|
|
||||||
_transform_type = TT_model;
|
_transform_type = TT_model;
|
||||||
}
|
}
|
||||||
@ -126,6 +127,7 @@ MayaToEggConverter(const MayaToEggConverter ©) :
|
|||||||
_respect_maya_double_sided(copy._respect_maya_double_sided),
|
_respect_maya_double_sided(copy._respect_maya_double_sided),
|
||||||
_always_show_vertex_color(copy._always_show_vertex_color),
|
_always_show_vertex_color(copy._always_show_vertex_color),
|
||||||
_keep_all_uvsets(copy._keep_all_uvsets),
|
_keep_all_uvsets(copy._keep_all_uvsets),
|
||||||
|
_convert_cameras(copy._convert_cameras),
|
||||||
_round_uvs(copy._round_uvs),
|
_round_uvs(copy._round_uvs),
|
||||||
_legacy_shader(copy._legacy_shader),
|
_legacy_shader(copy._legacy_shader),
|
||||||
_transform_type(copy._transform_type)
|
_transform_type(copy._transform_type)
|
||||||
@ -830,6 +832,9 @@ convert_hierarchy(EggGroupNode *egg_root) {
|
|||||||
if (_keep_all_uvsets) {
|
if (_keep_all_uvsets) {
|
||||||
mayaegg_cat.info() << "will keep_all_uvsets" << endl;
|
mayaegg_cat.info() << "will keep_all_uvsets" << endl;
|
||||||
}
|
}
|
||||||
|
if (_convert_cameras) {
|
||||||
|
mayaegg_cat.info() << "will convert camera nodes to locators" << endl;
|
||||||
|
}
|
||||||
// give some feedback about whether special options are on
|
// give some feedback about whether special options are on
|
||||||
if (_legacy_shader) {
|
if (_legacy_shader) {
|
||||||
mayaegg_cat.info() << "will disable modern Phong shader path. using legacy" << endl;
|
mayaegg_cat.info() << "will disable modern Phong shader path. using legacy" << endl;
|
||||||
@ -904,33 +909,56 @@ process_model_node(MayaNodeDesc *node_desc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (dag_path.hasFn(MFn::kCamera)) {
|
} else if (dag_path.hasFn(MFn::kCamera)) {
|
||||||
if (mayaegg_cat.is_debug()) {
|
if (_convert_cameras) {
|
||||||
mayaegg_cat.debug()
|
MFnCamera camera (dag_path, &status);
|
||||||
<< "Ignoring camera node " << path
|
if ( !status ) {
|
||||||
<< "\n";
|
status.perror("MFnCamera constructor");
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
MFnCamera camera (dag_path, &status);
|
|
||||||
if ( !status ) {
|
|
||||||
status.perror("MFnCamera constructor");
|
|
||||||
mayaegg_cat.error() << "camera extraction failed" << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract some interesting Camera data
|
// Extract some interesting Camera data
|
||||||
if (mayaegg_cat.is_spam()) {
|
if (mayaegg_cat.is_spam()) {
|
||||||
MPoint eyePoint = camera.eyePoint(MSpace::kWorld);
|
MPoint eyePoint = camera.eyePoint(MSpace::kWorld);
|
||||||
mayaegg_cat.spam() << " eyePoint: " << eyePoint.x << " "
|
mayaegg_cat.spam() << " eyePoint: " << eyePoint.x << " "
|
||||||
<< eyePoint.y << " " << eyePoint.z << endl;
|
<< eyePoint.y << " " << eyePoint.z << endl;
|
||||||
mayaegg_cat.spam() << " upDirection: "
|
mayaegg_cat.spam() << " upDirection: "
|
||||||
<< camera.upDirection(MSpace::kWorld) << endl;
|
<< camera.upDirection(MSpace::kWorld) << endl;
|
||||||
mayaegg_cat.spam() << " viewDirection: "
|
mayaegg_cat.spam() << " viewDirection: "
|
||||||
<< camera.viewDirection(MSpace::kWorld) << endl;
|
<< camera.viewDirection(MSpace::kWorld) << endl;
|
||||||
mayaegg_cat.spam() << " aspectRatio: " << camera.aspectRatio() << endl;
|
mayaegg_cat.spam() << " aspectRatio: " << camera.aspectRatio() << endl;
|
||||||
mayaegg_cat.spam() << " horizontalFilmAperture: "
|
mayaegg_cat.spam() << " horizontalFilmAperture: "
|
||||||
<< camera.horizontalFilmAperture() << endl;
|
<< camera.horizontalFilmAperture() << endl;
|
||||||
mayaegg_cat.spam() << " verticalFilmAperture: "
|
mayaegg_cat.spam() << " verticalFilmAperture: "
|
||||||
<< camera.verticalFilmAperture() << endl;
|
<< camera.verticalFilmAperture() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
EggGroup *egg_group = _tree.get_egg_group(node_desc);
|
||||||
|
|
||||||
|
if (mayaegg_cat.is_debug()) {
|
||||||
|
mayaegg_cat.warning()
|
||||||
|
<< "Saving camera nodes as a locator: " << path << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node_desc->is_tagged()) {
|
||||||
|
// Presumably, the camera's position has some meaning to the
|
||||||
|
// end-user, so we will implicitly tag it with the DCS flag so it
|
||||||
|
// won't get flattened out.
|
||||||
|
if (_animation_convert != AC_model) {
|
||||||
|
// For now, don't set the DCS flag on cameras within
|
||||||
|
// character models, since egg-optchar doesn't understand
|
||||||
|
// this. Perhaps there's no reason to ever change this, since
|
||||||
|
// cameras within character models may not be meaningful.
|
||||||
|
egg_group->set_dcs_type(EggGroup::DC_net);
|
||||||
|
}
|
||||||
|
get_transform(node_desc, dag_path, egg_group);
|
||||||
|
make_camera_locator(dag_path, dag_node, egg_group);
|
||||||
|
} else {
|
||||||
|
if (mayaegg_cat.is_debug()) {
|
||||||
|
mayaegg_cat.debug()
|
||||||
|
<< "Ignoring camera node " << path
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (dag_path.hasFn(MFn::kLight)) {
|
} else if (dag_path.hasFn(MFn::kLight)) {
|
||||||
@ -2259,6 +2287,49 @@ make_locator(const MDagPath &dag_path, const MFnDagNode &dag_node,
|
|||||||
egg_group->add_translate3d(p3d);
|
egg_group->add_translate3d(p3d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: MayaToEggConverter::make_locator
|
||||||
|
// Access: Private
|
||||||
|
// Description: Locators are used in Maya to indicate a particular
|
||||||
|
// position in space to the user or the modeler. We
|
||||||
|
// represent that in egg with an ordinary Group node,
|
||||||
|
// which we transform by the locator's position, so that
|
||||||
|
// the indicated point becomes the origin at this node
|
||||||
|
// and below.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void MayaToEggConverter::
|
||||||
|
make_camera_locator(const MDagPath &dag_path, const MFnDagNode &dag_node,
|
||||||
|
EggGroup *egg_group) {
|
||||||
|
MStatus status;
|
||||||
|
|
||||||
|
unsigned int num_children = dag_node.childCount();
|
||||||
|
MObject locator;
|
||||||
|
bool found_camera = false;
|
||||||
|
for (unsigned int ci = 0; ci < num_children && !found_camera; ci++) {
|
||||||
|
locator = dag_node.child(ci);
|
||||||
|
found_camera = (locator.apiType() == MFn::kCamera);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found_camera) {
|
||||||
|
mayaegg_cat.error()
|
||||||
|
<< "Couldn't find camera"
|
||||||
|
<< dag_path.fullPathName().asChar() << "\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MFnCamera camera (dag_path, &status);
|
||||||
|
if ( !status ) {
|
||||||
|
status.perror("MFnCamera constructor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MPoint eyePoint = camera.eyePoint(MSpace::kWorld);
|
||||||
|
LPoint3d p3d (eyePoint.x, eyePoint.y, eyePoint.z);
|
||||||
|
|
||||||
|
// Now convert the locator point into the group's space.
|
||||||
|
p3d = p3d * egg_group->get_node_frame_inv();
|
||||||
|
|
||||||
|
egg_group->add_translate3d(p3d);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: MayaToEggConverter::get_vertex_weights
|
// Function: MayaToEggConverter::get_vertex_weights
|
||||||
|
@ -139,6 +139,8 @@ private:
|
|||||||
MayaShader *default_shader = NULL);
|
MayaShader *default_shader = NULL);
|
||||||
void make_locator(const MDagPath &dag_path, const MFnDagNode &dag_node,
|
void make_locator(const MDagPath &dag_path, const MFnDagNode &dag_node,
|
||||||
EggGroup *egg_group);
|
EggGroup *egg_group);
|
||||||
|
void make_camera_locator(const MDagPath &dag_path, const MFnDagNode &dag_node,
|
||||||
|
EggGroup *egg_group);
|
||||||
bool get_vertex_weights(const MDagPath &dag_path, const MFnMesh &mesh,
|
bool get_vertex_weights(const MDagPath &dag_path, const MFnMesh &mesh,
|
||||||
pvector<EggGroup *> &joints, MFloatArray &weights);
|
pvector<EggGroup *> &joints, MFloatArray &weights);
|
||||||
bool get_vertex_weights(const MDagPath &dag_path, const MFnNurbsSurface &surface,
|
bool get_vertex_weights(const MDagPath &dag_path, const MFnNurbsSurface &surface,
|
||||||
@ -191,6 +193,7 @@ public:
|
|||||||
bool _respect_maya_double_sided;
|
bool _respect_maya_double_sided;
|
||||||
bool _always_show_vertex_color;
|
bool _always_show_vertex_color;
|
||||||
bool _keep_all_uvsets;
|
bool _keep_all_uvsets;
|
||||||
|
bool _convert_cameras;
|
||||||
bool _round_uvs;
|
bool _round_uvs;
|
||||||
bool _legacy_shader;
|
bool _legacy_shader;
|
||||||
|
|
||||||
|
@ -102,6 +102,11 @@ MayaToEgg() :
|
|||||||
"this setting locally.",
|
"this setting locally.",
|
||||||
&MayaToEgg::dispatch_none, &_suppress_vertex_color);
|
&MayaToEgg::dispatch_none, &_suppress_vertex_color);
|
||||||
|
|
||||||
|
add_option
|
||||||
|
("convert-cameras", "", 0,
|
||||||
|
"Convert all camera nodes to locators. Will preserve position and rotation.",
|
||||||
|
&MayaToEgg::dispatch_none, &_convert_cameras);
|
||||||
|
|
||||||
add_option
|
add_option
|
||||||
("keep-uvs", "", 0,
|
("keep-uvs", "", 0,
|
||||||
"Convert all UV sets on all vertices, even those that do not appear "
|
"Convert all UV sets on all vertices, even those that do not appear "
|
||||||
@ -242,6 +247,7 @@ run() {
|
|||||||
converter._respect_maya_double_sided = _respect_maya_double_sided;
|
converter._respect_maya_double_sided = _respect_maya_double_sided;
|
||||||
converter._always_show_vertex_color = !_suppress_vertex_color;
|
converter._always_show_vertex_color = !_suppress_vertex_color;
|
||||||
converter._keep_all_uvsets = _keep_all_uvsets;
|
converter._keep_all_uvsets = _keep_all_uvsets;
|
||||||
|
converter._convert_cameras = _convert_cameras;
|
||||||
converter._round_uvs = _round_uvs;
|
converter._round_uvs = _round_uvs;
|
||||||
converter._transform_type = _transform_type;
|
converter._transform_type = _transform_type;
|
||||||
converter._legacy_shader = _legacy_shader;
|
converter._legacy_shader = _legacy_shader;
|
||||||
|
@ -38,6 +38,7 @@ protected:
|
|||||||
bool _respect_maya_double_sided;
|
bool _respect_maya_double_sided;
|
||||||
bool _suppress_vertex_color;
|
bool _suppress_vertex_color;
|
||||||
bool _keep_all_uvsets;
|
bool _keep_all_uvsets;
|
||||||
|
bool _convert_cameras;
|
||||||
bool _round_uvs;
|
bool _round_uvs;
|
||||||
bool _legacy_shader;
|
bool _legacy_shader;
|
||||||
bool _legacy_copytex;
|
bool _legacy_copytex;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user