aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/widgets/sa.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/sa.cpp')
-rw-r--r--Src/Wasabi/api/skin/widgets/sa.cpp735
1 files changed, 735 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/sa.cpp b/Src/Wasabi/api/skin/widgets/sa.cpp
new file mode 100644
index 00000000..ff2c72fc
--- /dev/null
+++ b/Src/Wasabi/api/skin/widgets/sa.cpp
@@ -0,0 +1,735 @@
+#include <precomp.h>
+#include <api/wnd/popup.h>
+#include <api/script/script.h>
+#include <api/script/scriptmgr.h>
+#include <math.h>
+#include <api/skin/skinparse.h>
+#include "sa.h"
+#include <api/core/api_core.h>
+#include <tataki/canvas/bltcanvas.h>
+#include "resource.h"
+#include "../Agave/Language/api_language.h"
+
+const wchar_t visXuiStr[] = L"Vis"; // This is the xml tag
+char visXuiSvcName[] = "Vis xui object"; // this is the name of the xuiservice
+
+
+// {9149C445-3C30-4e04-8433-5A518ED0FDDE}
+const GUID uioptions_guid =
+ { 0x9149c445, 0x3c30, 0x4e04, { 0x84, 0x33, 0x5a, 0x51, 0x8e, 0xd0, 0xfd, 0xde } };
+
+unsigned char ppal[] = {
+#ifdef CLASSIC
+ 0,0,0, // color 0 = black
+ 75,72,80, // color 1 = grey for dots
+ 255,55,16, // color 2 = top of spec
+ 255,55,16, // 3
+ 255,80,0, // 4
+ 255,80,0, // 5
+ 239,112,0, // 6
+ 239,112,0, // 7
+ 255,168,32, // 8
+ 255,168,32, // 9
+ 176,255,47, // 10
+ 176,255,47, // 11
+ 47,239,0, // 12
+ 47,239,0, // 13
+ 48,160,0, // 14
+ 48,160,0, // 15
+ 32,128,0, // 16
+ 32,128,0, // 17 = bottom of spec
+ 255,255,255, // 18 = osc 1
+ 214,214,222, // 19 = osc 2 (slightly dimmer)
+ 181,189,189, // 20 = osc 3
+ 160,170,175, // 21 = osc 4
+ 148,156,165, // 22 = osc 4
+ 150, 150, 150, // 23 = analyzer peak dots
+#else
+ 0,0,0, // color 0 = black
+ 24,33,41, // color 1 = grey for dots
+ 239,49,16, // color 2 = top of spec
+ 206,41,16, // 3
+ 214,90,0, // 4
+ 214,102,0, // 5
+ 214,115,0, // 6
+ 198,123,8, // 7
+ 222,165,24, // 8
+ 214,181,33, // 9
+ 189,222,41, // 10
+ 148,222,33, // 11
+ 41,206,16, // 12
+ 50,190,16, // 13
+ 57,181,16, // 14
+ 49,156,8, // 15
+ 41,148,0, // 16
+ 24,132,8, // 17
+ 255,255,255, // 18 = osc 1
+ 214,214,222, // 19 = osc 2 (slightly dimmer)
+ 181,189,189, // 20 = osc 3
+ 160,170,175, // 21 = osc 4
+ 148,156,165, // 22 = osc 4
+ 150, 150, 150, // 23 = analyzer peak
+#endif
+};
+
+#define CHANNEL_LEFT 1
+#define CHANNEL_RIGHT 2
+
+XMLParamPair SAWnd::params[] = {
+ {SA_SETCOLORALLBANDS, L"COLORALLBANDS"},
+ {SA_SETCOLORBAND1, L"COLORBAND1"},
+ {SA_SETCOLORBAND2, L"COLORBAND2"},
+ {SA_SETCOLORBAND3, L"COLORBAND3"},
+ {SA_SETCOLORBAND4, L"COLORBAND4"},
+ {SA_SETCOLORBAND5, L"COLORBAND5"},
+ {SA_SETCOLORBAND6, L"COLORBAND6"},
+ {SA_SETCOLORBAND7, L"COLORBAND7"},
+ {SA_SETCOLORBAND8, L"COLORBAND8"},
+ {SA_SETCOLORBAND9, L"COLORBAND9"},
+ {SA_SETCOLORBAND10, L"COLORBAND10"},
+ {SA_SETCOLORBAND11, L"COLORBAND11"},
+ {SA_SETCOLORBAND12, L"COLORBAND12"},
+ {SA_SETCOLORBAND13, L"COLORBAND13"},
+ {SA_SETCOLORBAND14, L"COLORBAND14"},
+ {SA_SETCOLORBAND15, L"COLORBAND15"},
+ {SA_SETCOLORBAND16, L"COLORBAND16"},
+ {SA_SETCOLORBANDPEAK, L"COLORBANDPEAK"},
+ {SA_SETCOLORALLOSC, L"COLORALLOSC"},
+ {SA_SETCOLOROSC1, L"COLOROSC1"},
+ {SA_SETCOLOROSC2, L"COLOROSC2"},
+ {SA_SETCOLOROSC3, L"COLOROSC3"},
+ {SA_SETCOLOROSC4, L"COLOROSC4"},
+ {SA_SETCOLOROSC5, L"COLOROSC5"},
+ {SA_SETCHANNEL, L"CHANNEL"},
+ {SA_SETFLIPH, L"FLIPH"},
+ {SA_SETFLIPV, L"FLIPV"},
+ {SA_SETMODE, L"MODE"},
+ {SA_SETGAMMA, L"GAMMAGROUP"},
+ {SA_SETFALLOFF, L"FALLOFF"},
+ {SA_SETPEAKFALLOFF, L"PEAKFALLOFF"},
+ {SA_SETBANDWIDTH, L"BANDWIDTH"},
+ {SA_FPS, L"FPS"},
+ {SA_COLORING, L"COLORING"},
+ {SA_PEAKS, L"PEAKS"},
+ {SA_OSCDRAWSTYLE, L"OSCSTYLE"},
+};
+
+SAWnd::SAWnd()
+{
+ filtergroup = SA_PARENT::getFiltersGroup();
+
+ getScriptObject()->vcpu_setInterface(visGuid, (void *)static_cast<SAWnd *>(this));
+ getScriptObject()->vcpu_setClassName(L"Vis");
+ getScriptObject()->vcpu_setController(visController);
+
+ char *p = (char *)&ppal;
+ for (int i=0;i<72;i++) {
+ palette[i] = ((*p)<<16) + ((*(p+1))<<8) + *(p+2);
+ p += 3;
+ }
+
+ setRealtime(1);
+ startQuickPaint();
+
+ config_sa=-1; // default value
+#ifdef WASABI_COMPILE_CONFIG
+ {
+ CfgItem *ci=WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid);
+ if(ci) {
+ config_sa=ci->getDataAsInt(L"Spectrum analyzer mode");
+ viewer_addViewItem(ci->getDependencyPtr());
+ }
+ }
+ saveconfsa=0;
+#endif
+
+ flip_v = 0;
+ flip_h = 0;
+ channel = CHANNEL_LEFT | CHANNEL_RIGHT;
+ off = 0;
+
+ config_safalloff=2;
+ config_sa_peak_falloff=1;
+ config_safire=4;
+ config_sa_peaks=1;
+
+ memset(bx, 0, sizeof(bx));
+ memset(t_bx, 0, sizeof(t_bx));
+ memset(t_vx, 0, sizeof(t_vx));
+
+ xuihandle = newXuiHandle();
+ CreateXMLParameters(xuihandle);
+}
+
+void SAWnd::CreateXMLParameters(int master_handle)
+{
+ //SA_PARENT::CreateXMLParameters(master_handle);
+ int numParams = sizeof(params) / sizeof(params[0]);
+ hintNumberOfParams(xuihandle, numParams);
+ for (int i = 0;i < numParams;i++)
+ addParam(xuihandle, params[i], XUI_ATTRIBUTE_IMPLIED);
+}
+
+int SAWnd::onInit() {
+ SA_PARENT::onInit();
+#ifdef WASABI_COMPILE_CONFIG
+ if(config_sa==-1) {
+ Layout *pl=getGuiObject()->guiobject_getParentLayout();
+ if (pl->getParentContainer()) {
+ confsaname.printf(L"%s/%s/%s/config_sa",WASABI_API_SKIN->getSkinName(),pl->getParentContainer()->getName(),pl->getName());
+ config_sa=WASABI_API_CONFIG->getIntPrivate(confsaname,1);
+ saveconfsa=1;
+ }
+ }
+#endif
+ return 1;
+}
+
+SAWnd::~SAWnd()
+{
+#ifdef WASABI_COMPILE_CONFIG
+ if(saveconfsa)
+ WASABI_API_CONFIG->setIntPrivate(confsaname,config_sa);
+#endif
+}
+
+int SAWnd::setXuiParam(int _xuihandle, int attrid, const wchar_t *pname, const wchar_t *str) {
+ if (_xuihandle != xuihandle) return SA_PARENT::setXuiParam(_xuihandle, attrid, pname, str);
+ switch (attrid) {
+ case SA_SETCOLORALLBANDS:
+ setBandColor(-1, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND1:
+ setBandColor(15, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND2:
+ setBandColor(14, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND3:
+ setBandColor(13, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND4:
+ setBandColor(12, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND5:
+ setBandColor(11, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND6:
+ setBandColor(10, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND7:
+ setBandColor(9, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND8:
+ setBandColor(8, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND9:
+ setBandColor(7, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND10:
+ setBandColor(6, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND11:
+ setBandColor(5, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND12:
+ setBandColor(4, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND13:
+ setBandColor(3, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND14:
+ setBandColor(2, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND15:
+ setBandColor(1, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBAND16:
+ setBandColor(0, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORBANDPEAK:
+ setPeakColor(SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLORALLOSC:
+ setOscColor(-1, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLOROSC1:
+ setOscColor(0, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLOROSC2:
+ setOscColor(1, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLOROSC3:
+ setOscColor(2, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLOROSC4:
+ setOscColor(3, SkinParser::parseColor(str));
+ break;
+ case SA_SETCOLOROSC5:
+ setOscColor(4, SkinParser::parseColor(str));
+ break;
+ case SA_SETCHANNEL:
+ setChannel(WTOI(str));
+ break;
+ case SA_SETFLIPH:
+ setFlipH(WTOI(str));
+ break;
+ case SA_SETFLIPV:
+ setFlipV(WTOI(str));
+ break;
+ case SA_SETMODE:
+ setMode(WTOI(str));
+ break;
+ case SA_SETGAMMA:
+ filtergroup = str;
+ break;
+ case SA_SETFALLOFF:
+ config_safalloff = WTOI(str);
+ break;
+ case SA_SETPEAKFALLOFF:
+ config_sa_peak_falloff=WTOI(str);
+ break;
+ case SA_SETBANDWIDTH:
+ if (WCSCASEEQLSAFE(str, L"wide"))
+ config_safire &= (~32);
+ else if (WCSCASEEQLSAFE(str, L"thin"))
+ config_safire |= 32;
+ break;
+ case SA_FPS:
+ {
+ int fps = WTOI(str);
+ if (fps)
+ setSpeed(1000/fps);
+ }
+ break;
+ case SA_COLORING:
+ if (WCSCASEEQLSAFE(str, L"fire"))
+ config_safire = (config_safire&~3) | 1;
+ else if (WCSCASEEQLSAFE(str, L"normal"))
+ config_safire = (config_safire&~3) | 0;
+ else if (WCSCASEEQLSAFE(str, L"line"))
+ config_safire = (config_safire&~3) | 2;
+ break;
+ case SA_PEAKS:
+ if (str && WTOI(str))
+ config_sa_peaks=1;
+ else
+ config_sa_peaks=0;
+ break;
+ case SA_OSCDRAWSTYLE:
+ if (WCSCASEEQLSAFE(str, L"dots"))
+ config_safire = (config_safire & ~(3<<2)) | 0;
+ else if (WCSCASEEQLSAFE(str, L"solid"))
+ config_safire = (config_safire & ~(3<<2)) | 4;
+ else if (WCSCASEEQLSAFE(str, L"lines"))
+ config_safire = (config_safire & ~(3<<2)) | 8;
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+void SAWnd::setChannel(int c) {
+ channel = c;
+}
+
+void SAWnd::setFlipH(int v) {
+ if (v == flip_h) return;
+ flip_h = v;
+ invalidate();
+}
+
+void SAWnd::setFlipV(int v) {
+ if (v == flip_v) return;
+ flip_v = v;
+ invalidate();
+}
+
+void SAWnd::setBandColor(int band, ARGB32 col) {
+ if (band == -1) {
+ for (int i=0;i<16;i++)
+ palette[i+2] = RGBTOBGR(col);
+ } else
+ palette[band+2] = RGBTOBGR(col);
+}
+
+void SAWnd::setOscColor(int n, ARGB32 col) {
+ if (n == -1) {
+ for (int i=0;i<4;i++)
+ palette[i+18] = RGBTOBGR(col);
+ } else
+ palette[n+18] = RGBTOBGR(col);
+}
+
+void SAWnd::setPeakColor(ARGB32 col) {
+ palette[23] = RGBTOBGR(col);
+}
+
+#define SA_BLEND(c) (palette[c] | 0xFF000000) //(alpha << 24))
+
+int SAWnd::onQuickPaint(BltCanvas *bc, int w, int h, int newone) {
+ if(!isVisible()) return 0;
+
+#ifdef WASABI_COMPILE_MEDIACORE
+ int x;
+ int fo[5] = {3, 6, 12, 16, 32 };
+ float pfo[5]={1.05f,1.1f,1.2f,1.4f,1.6f};
+
+ specData=(int *)bc->getBits();
+ if (newone || !config_sa)
+ MEMSET(specData,0,76*16*4*4);
+
+ if(!config_sa) {
+ if (!off) {
+ off = 1;
+ return 1;
+ }
+ return 0;
+ }
+
+ off = 0;
+
+ char visdata[576*2*2] = {0};
+ unsigned char *values=(unsigned char *)visdata;
+ int ret=WASABI_API_MEDIACORE->core_getVisData(0,visdata,sizeof(visdata));
+ if (!ret) {
+ MEMSET(visdata,0,sizeof(visdata));
+ } else if (ret == 75*2) {
+ if (config_sa==2) values+=75;
+ } else {
+ if(config_sa==1) {
+ register int v;
+ for(int x=0;x<75;x++) {
+ v=values[x]+values[576+x];
+ v>>=4;
+ values[x]=v;
+ }
+ }
+ if (config_sa==2) {
+ values+=576*2;
+ register int v;
+ register char *blah=(char *)values;
+ for(int x=0;x<75;x++) {
+ v=blah[x*4]+blah[576+(x*4)];
+ v>>=4;
+ blah[x]=v;
+ }
+ }
+ }
+
+// int ws=(config_windowshade&&config_mw_open);
+// int s = (config_dsize&&config_mw_open)?1:0;
+
+ int dbx = fo[max(min(config_safalloff,4),0)];
+ float spfo=pfo[max(min(config_sa_peak_falloff,4),0)];
+
+ MEMSET(specData,0,76*16*4*4);
+
+ {
+ {
+ if (config_sa == 2)
+ {
+ int *gmem = specData;
+ {
+ int lv=-1;
+ if (((config_safire>>2)&3)==0) for (x = 0; x < 75; x ++)
+ {
+ register int v; register char c;
+ v = (((int) ((signed char *)values)[x])) + 8;
+ if (v < 0) v = 0 ; if (v > 15) v = 15; c = v/2-4; if (c < 0) c = -c; c += 18;
+ gmem[v*76*2] = SA_BLEND(c);
+ gmem++;
+ }
+ else if (((config_safire>>2)&3)==1) for (x = 0; x < 75; x ++)
+ {
+ register int v,t; register char c;
+ v = (((int) ((signed char *)values)[x])) + 8;
+ if (v < 0) v = 0 ; if (v > 15) v = 15; c = v/2-4; if (c < 0) c = -c; c += 18;
+ if (lv == -1) lv=v;
+ t=lv;
+ lv=v;
+ if (v >= t) while (v >= t) gmem[v--*76*2] = SA_BLEND(c);
+ else while (v < t) gmem[v++*76*2] = SA_BLEND(c);
+ gmem++;
+ }
+ else if (((config_safire>>2)&3)==2) for (x = 0; x < 75; x ++) // solid
+ {
+ register int v; register char c;
+ v = (((int) ((signed char *)values)[x])) + 8;
+ if (v < 0) v = 0 ; if (v > 15) v = 15; c = v/2-4; if (c < 0) c = -c; c += 18;
+ if (v > 7) while (v > 7) gmem[v--*76*2] = SA_BLEND(c);
+ else while (v <= 7) gmem[v++*76*2] = SA_BLEND(c);
+ gmem++;
+ }
+ }
+ }
+ else
+ {
+ for (x = 0; x < 75; x ++)
+ {
+ register int y,v,t;
+#ifndef CLASSIC
+ t=x&~3;
+#else
+ t=x-(x%6);
+#endif
+ if (!(config_safire&32))
+ {
+ int a=values[t],b=values[t+1],c=values[t+2],d=values[t+3];
+#ifndef CLASSIC
+ v = a+b+c+d;//-min(a,min(b,min(c,d)));
+ v/=4;
+#else
+ v = a+b+c+d+(int)values[t+4]+(int)values[t+5];//-min(a,min(b,min(c,d)));
+ v/=6;
+#endif
+ }
+ else v = (((int)values[x]));
+ if (v > 15) v = 15;
+ if ((v<<4) < bx[x]) v = (bx[x]-=dbx)>>4;
+ else bx[x] = v<<4;
+ if (bx[x] < 0) bx[x] = 0;
+ if (v < 0) v = 0;
+ int *gmem = specData + 76*2*15 + x;
+ if ((config_safire&3)==1) t = v+2;
+ else if ((config_safire&3)==2) t=17-(v);
+ else t = 17;
+
+ if (t_bx[x] <= v*256) {
+ t_bx[x]=v*256;
+ t_vx[x]=3.0f;
+ }
+#ifndef CLASSIC
+ if ((config_safire&32 || (x&3)!=3))
+ {
+ if ((config_safire&3)!=2) for (y = 0; y < v; y ++)
+ {
+ *gmem = SA_BLEND(t-y);
+ gmem -= 76*2;
+ }
+ else for (y = 0; y < v; y ++)
+ {
+ *gmem = SA_BLEND(t);
+ gmem -= 76*2;
+ }
+#else
+ if ((config_safire&32 || (!(x&1) && (x%6) < 4)))
+ {
+ if ((config_safire&3)!=2) for (y = 0; y < v/2; y ++)
+ {
+ *gmem = SA_BLEND(t-y*2);
+ gmem -= 76*2*2;
+ }
+ else for (y = 0; y < v/2; y ++)
+ {
+ *gmem = SA_BLEND(t);
+ gmem -= 76*2*2;
+ }
+#endif
+#ifndef CLASSIC
+ if (config_sa_peaks && t_bx[x]/256 >= 0 && t_bx[x]/256 <= 15)
+ {
+ specData[76*2*15 - (t_bx[x]/256)*76*2 + x]=SA_BLEND(23);
+ }
+#endif
+ }
+ t_bx[x] -= (int)t_vx[x];
+ t_vx[x] *= spfo;
+ if (t_bx[x] < 0) t_bx[x]=0;
+ }
+ }
+ }
+ }
+
+ if (flip_v)
+ bc->vflip(2);
+ if (flip_h)
+ bc->hflip(2);
+
+ invalidated = 1; // rerun filter
+
+#endif //mediacore
+
+ return 1;
+}
+
+int SAWnd::onLeftButtonDown(int x, int y) {
+ SA_PARENT::onLeftButtonDown(x, y);
+ if (!WASABI_API_MAKI->vcpu_getComplete()) {
+ nextMode();
+#ifdef WASABI_COMPILE_CONFIG
+ CfgItem *ci=WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid);
+ if(ci) ci->setDataAsInt(L"Spectrum analyzer mode",config_sa);
+#endif
+ }
+ return 1;
+}
+
+void SAWnd::nextMode() {
+ config_sa++;
+ if(config_sa>2) config_sa=0;
+}
+
+void SAWnd::setMode(int mode) {
+ config_sa=mode;
+ if(config_sa>2) config_sa=0;
+}
+
+int SAWnd::getMode() {
+ return config_sa;
+}
+
+int SAWnd::onRightButtonUp(int x, int y)
+{
+ SA_PARENT::onRightButtonUp(x, y);
+
+ PopupMenu menu (this);
+ menu.addCommand(WASABI_API_LNGSTRINGW(IDS_NO_VISUALISATION)/*"No visualization"*/, 0, config_sa==0, FALSE);
+ menu.addCommand(WASABI_API_LNGSTRINGW(IDS_SPECTRUM_ANALYZER)/*L"Spectrum analyzer"*/, 1, config_sa==1, FALSE);
+ menu.addCommand(WASABI_API_LNGSTRINGW(IDS_OSCILLOSCOPE)/*L"Oscilloscope"*/, 2, config_sa==2, FALSE);
+
+ clientToScreen(&x, &y);
+
+ int ret = menu.popAtXY(x,y);
+#ifdef WASABI_COMPILE_CONFIG
+ if(ret>=0)
+ {
+ config_sa=ret;
+ CfgItem *ci=WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid);
+ if(ci) ci->setDataAsInt(L"Spectrum analyzer mode",config_sa);
+ }
+#endif
+
+ WASABI_API_MAKI->vcpu_setComplete();
+ return 1;
+}
+
+int SAWnd::getPreferences(int what) {
+ switch (what) {
+ case SUGGESTED_W: return 76;
+ case SUGGESTED_H: return 16;
+ }
+ return SA_PARENT::getPreferences(what);
+}
+
+void SAWnd::getQuickPaintSize(int *w, int *h) {
+ if (w) *w = 76*2;
+ if (h) *h = 16*2;
+}
+
+void SAWnd::getQuickPaintSource(RECT *r) {
+ ASSERT(r != NULL);
+ r->left = 0;
+ r->top = 0;
+ r->right = 72;
+ r->bottom = 16;
+}
+
+int SAWnd::viewer_onEvent(api_dependent *item, const GUID *classguid, int event, intptr_t param, void *ptr, size_t ptrlen) {
+#ifdef WASABI_COMPILE_CONFIG
+ if(event==CfgItem::Event_ATTRIBUTE_CHANGED && ptr && STRCASEEQLSAFE((const char *)ptr, "Spectrum analyzer mode")) {
+ CfgItem *ci=WASABI_API_CONFIG->config_getCfgItemByGuid(uioptions_guid);
+ if(ci) config_sa=ci->getDataAsInt((const wchar_t *)ptr);
+ }
+#endif
+ return 1;
+}
+
+VisScriptController _visController;
+VisScriptController *visController = &_visController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct VisScriptController::exportedFunction[] = {
+ {L"onFrame", 0, (void*)SAWnd::script_onFrame },
+ {L"setRealtime", 1, (void*)SAWnd::script_setRealtime },
+ {L"getRealtime", 0, (void*)SAWnd::script_getRealtime },
+ {L"setMode", 1, (void*)SAWnd::script_vcpu_setMode},
+ {L"getMode", 0, (void*)SAWnd::script_vcpu_getMode},
+ {L"nextMode", 0, (void*)SAWnd::script_vcpu_nextMode},
+};
+
+// --------------------------------------------------------
+const wchar_t *VisScriptController::getClassName() {
+ return L"Vis";
+}
+
+const wchar_t *VisScriptController::getAncestorClassName() {
+ return L"GuiObject";
+}
+
+ScriptObject *VisScriptController::instantiate() {
+ SAWnd *sa = new SAWnd;
+ ASSERT(sa != NULL);
+ return sa->getScriptObject();
+}
+
+void VisScriptController::destroy(ScriptObject *o) {
+ SAWnd *sa = static_cast<SAWnd *>(o->vcpu_getInterface(visGuid));
+ ASSERT(sa != NULL);
+ delete sa;
+}
+
+void *VisScriptController::encapsulate(ScriptObject *o) {
+ return NULL; // no encapsulation for vis yet
+}
+
+void VisScriptController::deencapsulate(void *o) {
+}
+
+int VisScriptController::getNumFunctions() {
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *VisScriptController::getExportedFunctions() {
+ return exportedFunction;
+}
+
+GUID VisScriptController::getClassGuid() {
+ return visGuid;
+}
+
+// -----------------------------------------------------------------------
+scriptVar SAWnd::script_onFrame(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT;
+ PROCESS_HOOKS0(o, visController);
+ SCRIPT_FUNCTION_CHECKABORTEVENT;
+ SCRIPT_EXEC_EVENT0(o);
+}
+
+scriptVar SAWnd::script_setRealtime(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar s) {
+ SCRIPT_FUNCTION_INIT
+ ASSERT(SOM::isNumeric(&s));
+ SAWnd *sa = static_cast<SAWnd*>(o->vcpu_getInterface(visGuid));
+ if (sa) sa->setRealtime(SOM::makeInt(&s));
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar SAWnd::script_getRealtime(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT
+ SAWnd *sa = static_cast<SAWnd*>(o->vcpu_getInterface(visGuid));
+ if (sa) return MAKE_SCRIPT_INT(sa->getRealtime());
+ return MAKE_SCRIPT_INT(0);
+}
+
+scriptVar SAWnd::script_vcpu_setMode(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar a) {
+ SCRIPT_FUNCTION_INIT
+ ASSERT(SOM::isNumeric(&a));
+ SAWnd *sa = static_cast<SAWnd*>(o->vcpu_getInterface(visGuid));
+ if (sa) sa->setMode(SOM::makeInt(&a));
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar SAWnd::script_vcpu_getMode(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT
+ SAWnd *sa = static_cast<SAWnd*>(o->vcpu_getInterface(visGuid));
+ if (sa) return MAKE_SCRIPT_INT(sa->getMode());
+ return MAKE_SCRIPT_INT(0);
+}
+
+scriptVar SAWnd::script_vcpu_nextMode(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT
+ SAWnd *sa = static_cast<SAWnd*>(o->vcpu_getInterface(visGuid));
+ if (sa) sa->nextMode();
+ RETURN_SCRIPT_VOID;
+}