# HG changeset patch # User John Tsiombikas # Date 1396248107 -10800 # Node ID fdece14403fff608f27db8192f20cd1c62387db8 # Parent 0c35763254806ff55bdfc29af3aa8e1d327ae45f max gui diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/maxgoat.rc Binary file exporters/maxgoat/maxgoat.rc has changed diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/maxgoat.vcxproj --- a/exporters/maxgoat/maxgoat.vcxproj Sun Mar 30 08:53:33 2014 +0300 +++ b/exporters/maxgoat/maxgoat.vcxproj Mon Mar 31 09:41:47 2014 +0300 @@ -100,7 +100,7 @@ Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;MAXGOAT_EXPORTS;%(PreprocessorDefinitions);BUILD_MAXPLUGIN 4996;4244 - $(SolutionDir)\src + $(SolutionDir)\src;$(ProjectDir) Windows @@ -140,7 +140,7 @@ true WIN32;NDEBUG;_WINDOWS;_USRDLL;MAXGOAT_EXPORTS;%(PreprocessorDefinitions) 4996;4244 - $(SolutionDir)\src + $(SolutionDir)\src;$(ProjectDir) Windows @@ -155,12 +155,22 @@ + + + + + + + + + + diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/maxgoat.vcxproj.filters --- a/exporters/maxgoat/maxgoat.vcxproj.filters Sun Mar 30 08:53:33 2014 +0300 +++ b/exporters/maxgoat/maxgoat.vcxproj.filters Mon Mar 31 09:41:47 2014 +0300 @@ -13,10 +13,26 @@ src + + src + src + + src + + + src + + + + + + + + \ No newline at end of file diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/msglogo3d.bmp Binary file exporters/maxgoat/msglogo3d.bmp has changed diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/resource.h Binary file exporters/maxgoat/resource.h has changed diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/src/logger.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporters/maxgoat/src/logger.cc Mon Mar 31 09:41:47 2014 +0300 @@ -0,0 +1,31 @@ +#include +#include +#include "logger.h" + +static FILE *logfile; + +bool maxlog_open(const char *fname) +{ + if(!(logfile = fopen(fname, "wb"))) { + return false; + } + setvbuf(logfile, 0, _IONBF, 0); + return true; +} + +void maxlog_close() +{ + if(logfile) { + fclose(logfile); + } +} + +void maxlog(const char *fmt, ...) +{ + if(!logfile) return; + + va_list ap; + va_start(ap, fmt); + vfprintf(logfile, fmt, ap); + va_end(ap); +} \ No newline at end of file diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/src/logger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporters/maxgoat/src/logger.h Mon Mar 31 09:41:47 2014 +0300 @@ -0,0 +1,8 @@ +#ifndef MAXLOGGER_H_ +#define MAXLOGGER_H_ + +bool maxlog_open(const char *fname); +void maxlog_close(); +void maxlog(const char *fmt, ...); + +#endif /* MAXLOGGER_H_ */ \ No newline at end of file diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/src/maxgoat.cc --- a/exporters/maxgoat/src/maxgoat.cc Sun Mar 30 08:53:33 2014 +0300 +++ b/exporters/maxgoat/src/maxgoat.cc Mon Mar 31 09:41:47 2014 +0300 @@ -15,6 +15,8 @@ #include "goat3d.h" #include "minwin.h" #include "config.h" +#include "logger.h" +#include "resource.h" #pragma comment (lib, "core.lib") @@ -32,8 +34,7 @@ #define VERSION(major, minor) \ ((major) * 100 + ((minor) < 10 ? (minor) * 10 : (minor))) -static FILE *logfile; -static HINSTANCE hinst; +HINSTANCE hinst; class GoatExporter : public SceneExport { private: @@ -116,10 +117,45 @@ MessageBoxA(win, "Goat3D exporter plugin", "About this plugin", 0); } +static INT_PTR CALLBACK handle_dlg_events(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam) +{ + switch(msg) { + case WM_INITDIALOG: + CheckDlgButton(win, IDC_GOAT_NODES, 1); + CheckDlgButton(win, IDC_GOAT_MESHES, 1); + CheckDlgButton(win, IDC_GOAT_LIGHTS, 1); + CheckDlgButton(win, IDC_GOAT_CAMERAS, 1); + break; + + case WM_COMMAND: + switch(LOWORD(wparam)) { + case IDOK: + EndDialog(win, 1); + break; + + case IDCANCEL: + EndDialog(win, 0); + break; + + default: + return 0; + } + break; + + default: + return 0; + } + + return 1; +} + int GoatExporter::DoExport(const MCHAR *name, ExpInterface *eiface, Interface *iface, BOOL non_interactive, DWORD opt) { - mw_test(); + if(!DialogBox(hinst, MAKEINTRESOURCE(IDD_GOAT_SCE), 0, handle_dlg_events)) { + maxlog("canceled!\n"); + return IMPEXP_CANCEL; + } mtlmap.clear(); nodemap.clear(); @@ -127,9 +163,9 @@ char fname[512]; wcstombs(fname, name, sizeof fname - 1); - fprintf(logfile, "Exporting Goat3D Scene (text) file: %s\n", fname); + maxlog("Exporting Goat3D Scene (text) file: %s\n", fname); if(!(igame = GetIGameInterface())) { - fprintf(logfile, "failed to get the igame interface\n"); + maxlog("failed to get the igame interface\n"); return IMPEXP_FAIL; } IGameConversionManager *cm = GetConversionManager(); @@ -451,18 +487,13 @@ SHGetFolderPathA(0, CSIDL_PERSONAL, 0, 0, path); strcat(path, "/testexp.log"); - if((logfile = fopen(path, "w"))) { - setvbuf(logfile, 0, _IONBF, 0); - } + maxlog_open(path); return TRUE; } __declspec(dllexport) int LibShutdown() { - if(logfile) { - fclose(logfile); - logfile = 0; - } + maxlog_close(); return TRUE; } diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/src/minwin.cc --- a/exporters/maxgoat/src/minwin.cc Sun Mar 30 08:53:33 2014 +0300 +++ b/exporters/maxgoat/src/minwin.cc Mon Mar 31 09:41:47 2014 +0300 @@ -1,6 +1,7 @@ #include #include #include "minwin.h" +#include "logger.h" #define GOATSCE_WCLASS "goatsce-window" @@ -14,48 +15,89 @@ }; static void init(); +static MinWidget *createwin(MinWidget *parent, const char *cls, const char *name, + unsigned int style, int x, int y, int xsz, int ysz); static LRESULT CALLBACK handle_msg(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam); +extern HINSTANCE hinst; // defined in maxgoat.cc + void mw_set_callback(MinWidget *w, MWCallback func, void *cls) { w->cbfunc = func; w->cbcls = cls; } -MinWidget *mw_create_window(MinWidget *parent, const char *name) +MinWidget *mw_create_window(MinWidget *parent, const char *name, int x, int y, int xsz, int ysz) { - MinWidget *w = new MinWidget; - HINSTANCE inst = GetModuleHandle(0); + unsigned int style = WS_OVERLAPPEDWINDOW | WS_VISIBLE; + if(parent) { + style |= WS_CHILD; + } - w->win = CreateWindowA(GOATSCE_WCLASS, "Goat3D Scene export options ...", WS_OVERLAPPED, - CW_USEDEFAULT, CW_USEDEFAULT, 512, 400, parent ? parent->win : 0, 0, inst, 0); - ShowWindow(w->win, 1); + maxlog("creating window: %s\n", name); + MinWidget *w = createwin(parent, GOATSCE_WCLASS, name, style, x, y, xsz, ysz); return w; } MinWidget *mw_create_button(MinWidget *parent, const char *text, int x, int y, int xsz, int ysz) { - MinWidget *bn = new MinWidget; - HINSTANCE inst = GetModuleHandle(0); + unsigned int style = BS_PUSHBUTTON | WS_VISIBLE; + if(parent) { + style |= WS_CHILD; + } - bn->win = CreateWindowA("BUTTON", text, BS_PUSHBUTTON | BS_TEXT, - x, y, xsz, ysz, parent ? parent->win : 0, 0, inst, 0); - ShowWindow(bn->win, 1); + maxlog("creating button: %s\n", text); - return bn; + MinWidget *w = createwin(parent, "BUTTON", text, style, x, y, xsz, ysz); + return w; } -MinWidget *mw_create_checkbox(MinWidget *parent, const char *text, int x, int y, int w, int h, bool checked) +MinWidget *mw_create_checkbox(MinWidget *parent, const char *text, int x, int y, int xsz, int ysz, bool checked) { - return 0; + unsigned int style = BS_CHECKBOX | WS_VISIBLE; + if(parent) { + style |= WS_CHILD; + } + + maxlog("creating checkbox: %s\n", text); + + MinWidget *w = createwin(parent, "CHECKBOX", text, style, x, y, xsz, ysz); + return w; } +static DWORD WINAPI gui_thread_func(void *cls); void mw_test() { - MinWidget *win = mw_create_window(0, "test window!"); - MinWidget *bn = mw_create_button(win, "button!", 100, 100, 300, 80); + init(); + + HANDLE thread = CreateThread(0, 0, gui_thread_func, 0, 0, 0); + //WaitForSingleObject(thread, 5000); +} + +static DWORD WINAPI gui_thread_func(void *cls) +{ + MinWidget *win = mw_create_window(0, "test window!", -1, -1, 400, 400); + MinWidget *bn_ok = mw_create_button(win, "Ok", 50, 100, 150, 40); + MinWidget *bn_cancel = mw_create_button(win, "Cancel", 250, 100, 150, 40); + MinWidget *ck_lights = mw_create_checkbox(win, "Export lights", 20, 20, 250, 40, true); + MinWidget *ck_cameras = mw_create_checkbox(win, "Export cameras", 20, 60, 250, 40, true); + + MSG msg; + while(GetMessage(&msg, win->win, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + DestroyWindow(win->win); + delete bn_ok; + delete bn_cancel; + delete ck_lights; + delete ck_cameras; + delete win; + + return 0; } static void init() @@ -66,18 +108,53 @@ } done_init = true; - HINSTANCE hinst = GetModuleHandle(0); + size_t sz = mbstowcs(0, GOATSCE_WCLASS, 0); + wchar_t *cname = new wchar_t[sz + 1]; + mbstowcs(cname, GOATSCE_WCLASS, sz + 1); - WNDCLASSA wc; + WNDCLASS wc; memset(&wc, 0, sizeof wc); - wc.lpszClassName = GOATSCE_WCLASS; + wc.lpszClassName = cname; wc.hInstance = hinst; wc.lpfnWndProc = handle_msg; wc.style = CS_HREDRAW | CS_VREDRAW; + wc.hbrBackground = (HBRUSH)COLOR_WINDOW; + wc.hCursor = LoadCursor(0, IDC_ARROW); - RegisterClassA(&wc); + RegisterClass(&wc); } +static MinWidget *createwin(MinWidget *parent, const char *cls, const char *name, + unsigned int style, int x, int y, int xsz, int ysz) +{ + init(); + + MinWidget *w = new MinWidget; + + size_t sz = mbstowcs(0, cls, 0); + wchar_t *wcls = new wchar_t[sz + 1]; + mbstowcs(wcls, cls, sz + 1); + + sz = mbstowcs(0, name, 0); + wchar_t *wname = new wchar_t[sz + 1]; + mbstowcs(wname, name, sz + 1); + + if(x <= 0) x = CW_USEDEFAULT; + if(y <= 0) y = CW_USEDEFAULT; + + w->win = CreateWindow(wcls, wname, style, x, y, xsz, ysz, parent ? parent->win : 0, 0, hinst, 0); + + delete [] wcls; + delete [] wname; + + if(!w->win) { + delete w; + return 0; + } + return w; +} + + static LRESULT CALLBACK handle_msg(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam) { switch(msg) { diff -r 0c3576325480 -r fdece14403ff exporters/maxgoat/src/minwin.h --- a/exporters/maxgoat/src/minwin.h Sun Mar 30 08:53:33 2014 +0300 +++ b/exporters/maxgoat/src/minwin.h Mon Mar 31 09:41:47 2014 +0300 @@ -6,9 +6,9 @@ void mw_set_callback(MinWidget *w, MWCallback func, void *cls); -MinWidget *mw_create_window(MinWidget *parent, const char *name); -MinWidget *mw_create_button(MinWidget *parent, const char *text, int x, int y, int w, int h); -MinWidget *mw_create_checkbox(MinWidget *parent, const char *text, int x, int y, int w, int h, bool checked); +MinWidget *mw_create_window(MinWidget *parent, const char *name, int x, int y, int xsz, int ysz); +MinWidget *mw_create_button(MinWidget *parent, const char *text, int x, int y, int xsz, int ysz); +MinWidget *mw_create_checkbox(MinWidget *parent, const char *text, int x, int y, int xsz, int ysz, bool checked); void mw_test();