diff --git a/pandatool/src/maxegg/maxEgg.cxx b/pandatool/src/maxegg/maxEgg.cxx index 88a90232e0..c6439d56cf 100755 --- a/pandatool/src/maxegg/maxEgg.cxx +++ b/pandatool/src/maxegg/maxEgg.cxx @@ -538,10 +538,16 @@ void MaxEggPlugin::DoExport() { } UINT mask = MB_OK; - if (bad > 0) mask |= MB_ICONEXCLAMATION; - else mask |= MB_ICONINFORMATION; - MessageBox(hMaxEggParams, status.str().c_str(), "Panda3D Export results", mask); + if (good == 0 && bad == 0) { + mask |= MB_ICONEXCLAMATION; + MessageBox(hMaxEggParams, "Nothing to export!", "Panda3D Export results", mask); + } else { + if (bad > 0) mask |= MB_ICONEXCLAMATION; + else mask |= MB_ICONINFORMATION; + + MessageBox(hMaxEggParams, status.str().c_str(), "Panda3D Export results", mask); + } int pviewed = 0; if (pview && good > 0) { diff --git a/pandatool/src/maxegg/maxOptionsDialog.cxx b/pandatool/src/maxegg/maxOptionsDialog.cxx index 46ad865bdc..a20eea1c33 100644 --- a/pandatool/src/maxegg/maxOptionsDialog.cxx +++ b/pandatool/src/maxegg/maxOptionsDialog.cxx @@ -237,6 +237,8 @@ MaxEggOptions::MaxEggOptions() { _path_replace = new PathReplace; _path_replace->_path_store = PS_relative; _export_whole_scene = true; + _export_all_frames = true; + _successful = false; } BOOL CALLBACK MaxOptionsDialogProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) @@ -419,7 +421,6 @@ MaxOptionsDialog::MaxOptionsDialog() : _max_frame(0), _checked(true), _choosing_nodes(false), - _successful(false), _prev_type(AT_model) { } @@ -431,7 +432,7 @@ MaxOptionsDialog::~MaxOptionsDialog () void MaxOptionsDialog::UpdateUI(HWND hWnd) { int typeButton = IDC_MODEL; - int anim_exp = _start_frame == INT_MIN ? IDC_EXP_ALL_FRAMES : IDC_EXP_SEL_FRAMES; + int anim_exp = _export_all_frames ? IDC_EXP_ALL_FRAMES : IDC_EXP_SEL_FRAMES; int model_exp = _export_whole_scene ? IDC_EXPORT_ALL : IDC_EXPORT_SELECTED; switch (_anim_type) { @@ -553,6 +554,7 @@ bool MaxOptionsDialog::UpdateFromUI(HWND hWnd) { _anim_type = newAnimType; _double_sided = IsDlgButtonChecked(hWnd, IDC_CHECK1); _export_whole_scene = IsDlgButtonChecked(hWnd, IDC_EXPORT_ALL); + _export_all_frames = IsDlgButtonChecked(hWnd, IDC_EXP_ALL_FRAMES); return true; } @@ -607,6 +609,7 @@ IOResult MaxOptionsDialog::Save(ISave *isave) { ChunkSave(isave, CHUNK_DBL_SIDED, _double_sided); ChunkSave(isave, CHUNK_EGG_CHECKED, _checked); ChunkSave(isave, CHUNK_EXPORT_FULL, _export_whole_scene); + ChunkSave(isave, CHUNK_ALL_FRAMES, _export_all_frames); isave->BeginChunk(CHUNK_NODE_LIST); for (int i = 0; i < _node_list.size(); i++) ChunkSave(isave, CHUNK_NODE_HANDLE, _node_list[i]); @@ -628,6 +631,7 @@ IOResult MaxOptionsDialog::Load(ILoad *iload) { case CHUNK_DBL_SIDED: _double_sided = ChunkLoadBool(iload); break; case CHUNK_EGG_CHECKED: _checked = ChunkLoadBool(iload); break; case CHUNK_EXPORT_FULL: _export_whole_scene = ChunkLoadBool(iload); break; + case CHUNK_ALL_FRAMES: _export_all_frames = ChunkLoadBool(iload); break; case CHUNK_NODE_LIST: res = iload->OpenChunk(); while (res == IO_OK) { diff --git a/pandatool/src/maxegg/maxOptionsDialog.h b/pandatool/src/maxegg/maxOptionsDialog.h index 709c476742..ad6d1c2c7b 100644 --- a/pandatool/src/maxegg/maxOptionsDialog.h +++ b/pandatool/src/maxegg/maxOptionsDialog.h @@ -29,6 +29,7 @@ extern HINSTANCE hInstance; #define CHUNK_FILENAME 0x1106 #define CHUNK_SHORTNAME 0x1107 #define CHUNK_EXPORT_FULL 0x1108 +#define CHUNK_ALL_FRAMES 0x1109 #define CHUNK_NODE_LIST 0x1200 #define CHUNK_NODE_HANDLE 0x1201 @@ -61,7 +62,9 @@ struct MaxEggOptions int _start_frame; int _end_frame; bool _double_sided; + bool _successful; bool _export_whole_scene; + bool _export_all_frames; char _file_name[2048]; char _short_name[256]; PT(PathReplace) _path_replace; @@ -76,7 +79,6 @@ class MaxOptionsDialog : public MaxEggOptions int _min_frame, _max_frame; bool _checked; bool _choosing_nodes; - bool _successful; MaxEggOptions::Anim_Type _prev_type; MaxOptionsDialog(); diff --git a/pandatool/src/maxegg/maxToEggConverter.cxx b/pandatool/src/maxegg/maxToEggConverter.cxx index 2a4a2e52de..5928de2553 100755 --- a/pandatool/src/maxegg/maxToEggConverter.cxx +++ b/pandatool/src/maxegg/maxToEggConverter.cxx @@ -75,11 +75,15 @@ bool MaxToEggConverter::convert(MaxEggOptions *options) { int start_frame = anim_range.Start()/GetTicksPerFrame(); int end_frame = anim_range.End()/GetTicksPerFrame(); - if (_options->_start_frame < start_frame) _options->_start_frame = start_frame; - if (_options->_start_frame > end_frame) _options->_start_frame = end_frame; - if (_options->_end_frame < start_frame) _options->_end_frame = start_frame; - if (_options->_end_frame > end_frame) _options->_end_frame = end_frame; - if (_options->_end_frame < _options->_start_frame) _options->_end_frame = _options->_start_frame; + if (!_options->_export_all_frames) { + if (_options->_start_frame < start_frame) _options->_start_frame = start_frame; + if (_options->_start_frame > end_frame) _options->_start_frame = end_frame; + if (_options->_end_frame < start_frame) _options->_end_frame = start_frame; + if (_options->_end_frame > end_frame) _options->_end_frame = end_frame; + if (_options->_end_frame < _options->_start_frame) _options->_end_frame = _options->_start_frame; + start_frame = _options->_start_frame; + end_frame = _options->_end_frame; + } int frame_inc = 1; int output_frame_rate = GetFrameRate(); @@ -116,7 +120,7 @@ bool MaxToEggConverter::convert(MaxEggOptions *options) { break; case AC_both: - + // both: Put a model and its animation into the same egg file. _options->_anim_type = MaxEggOptions::AT_model; if (!convert_char_model()) { all_ok = false; @@ -136,7 +140,9 @@ bool MaxToEggConverter::convert(MaxEggOptions *options) { _egg_data->recompute_tangent_binormal_auto(); _egg_data->remove_unused_vertices(true); } - + + _options->_successful = all_ok; + if (all_ok) { Filename fn = Filename::from_os_specific(_options->_file_name); return _egg_data->write_egg(fn);