From 24e353be91cffffc8d2562d5d1d32bb738c842bf Mon Sep 17 00:00:00 2001 From: mrgoil Date: Sat, 18 Aug 2007 20:33:15 +0000 Subject: [PATCH] * Trigger Controller * cynosure.js update git-svn-id: svn://dyne.org/rastasoft/freej/trunk@900 383723c8-4afa-0310-b8a8-b1afb83214fc --- doc/scripting/Controller.js | 18 +++ scripts/cynosure.js | 222 +++++++++++++++--------------------- src/Makefile.am | 1 + src/include/jsparser_data.h | 5 + src/include/trigger_ctrl.h | 46 ++++++++ src/jsparser.cpp | 5 + src/trigger_ctrl.cpp | 91 +++++++++++++++ 7 files changed, 255 insertions(+), 133 deletions(-) create mode 100644 src/include/trigger_ctrl.h create mode 100644 src/trigger_ctrl.cpp diff --git a/doc/scripting/Controller.js b/doc/scripting/Controller.js index 53105ec9..e745dd9d 100644 --- a/doc/scripting/Controller.js +++ b/doc/scripting/Controller.js @@ -224,4 +224,22 @@ JoystickController.prototype.hatmotion = function (which, hat, value); */ JoystickController.prototype.button = function (which, button, state); +////////////////////////////// +// Trigger Controller +/** The TriggerController constructor creates a trigger controller + @class The Trigger Controller holds callbacks to javascript. You can use the frame callback to process various stuff, instead using run(). + + @constructor + @base Controller + @returns a new TriggerController +*/ +function TriggerController() { }; +TriggerController.prototype = new Controller(); + +/** This will be called each frame. + Don't waste too much time here! + + @type void +*/ +TriggerController.prototype.frame = function (); diff --git a/scripts/cynosure.js b/scripts/cynosure.js index 7b92affe..c5735053 100644 --- a/scripts/cynosure.js +++ b/scripts/cynosure.js @@ -1,3 +1,22 @@ +/* FreeJ example scripts + * (c) Copyright 2005 Christoph Rudorff aka MrGoil + * + * This source code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * This source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * Please refer to the GNU Public License for more details. + * + * You should have received a copy of the GNU Public License along with + * this source code; if not, write to: + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + /* This is an example script by Mr.Goil how to to Cynosure @@ -7,24 +26,80 @@ $Id: $ curColor = 0; curBase = curColor; shadowWidth = 2 ; //get_integer_resource ("shadowWidth", "Integer"); -elevation = 10; // get_integer_resource ("elevation", "Integer"); +elevation = 10; //get_integer_resource ("elevation", "Integer"); sway = 30; //get_integer_resource ("sway", "Integer"); tweak = 20; //get_integer_resource ("tweak", "Integer"); gridSize = 10; //get_integer_resource ("gridSize", "Integer"); timeLeft = 0; ncolors = 8; //get_integer_resource ("colors", "Colors"); iterations = 100; //get_integer_resource ("iterations", "Iterations"); -MINCELLSIZE = 50; -MINRECTSIZE = 16; +MINCELLSIZE = 64; +MINRECTSIZE = 24; THRESHOLD = 100; colors = new Array(0xa03000ff, 0x006000ff, 0x336000ff, 0x00ff00ff, 0xc20000ff, 0x0000c0ff, 0xc0c0c0ff, 0x30f0f0ff, 0x00ff90ff); -// should come from freej - how about resize event? +width=200; height=600; +width=1024; height=768; +width=800; height=800; width=400; height=300; geo = new GeometryLayer(); add_layer(geo); -Draw(); + +trigger = new TriggerController(); +register_controller(trigger); +trigger.frame = function() { Draw(); }; + +kbd = new KeyboardController(); +register_controller(kbd); +kbd.released_q = function() { quit(); } +kbd.released_x = function() { Draw(); } + +mc = new MidiController(); // ('descr') +register_controller(mc); +ret = mc.connect_from(0, 20, 0); + +mc.event_ctrl = function (ch, func, value) { + switch (ch) { + case 0: + switch (func) { + case 2: + shadowWidth = value; + break; + case 3: + elevation = value; + break; + case 4: + sway = value; + break; + } + break; + case 1: + switch (func) { + case 2: + tweak = value+1; + break; + case 3: + gridSize = value/4 +1; + break; + case 4: + iterations = value*2; + } + break; + case 2: + switch (func) { + case 2: + MINRECTSIZE = value; + break; + case 3: + MINCELLSIZE = value; + break; + case 4: + THRESHOLD = value; + break; + } + } +} function integer(i) { if (i>0) @@ -33,19 +108,15 @@ function integer(i) { return Math.ceil(i) } +var i = 0; function Draw() { -//debug("draw color3=" + colors[3]); - var i = 0; - while (1) { - if (iterations > 0 && ++i >= iterations) { + for (j=0; j<10; j++) { + if ((iterations > 0) && (++i >= iterations)) { i = 0; // clearScreen - geo.rectangle_fill(0,0,width,height,0); -//debug("clear\n"); - } - paint(); -//debug("loop" + i + "col2:" + colors[2]); - run(0.01); - } + geo.rectangle_fill(0,0,width,height,0x000000FF); + } + paint(); + } } function paint() { @@ -108,23 +179,18 @@ function paint() { curY + elevation + curHeight, 0x00000060); - /* Draw the edge */ + /* Draw the edge */ if (shadowWidth > 0) geo.rectangle_fill(curX + shadowWidth, curY + shadowWidth, curX + shadowWidth + curWidth, curY + shadowWidth + curHeight, 0x000000ff); - //XFillRectangle(dpy, window, fg_gc, curX, curY, curWidth, curHeight); - //geo.rectangle_fill(curX, curY, curX+curWidth, curY+curHeight, fg_gc); - geo.rectangle_fill(curX, curY, curX+curWidth, curY+curHeight, fg_gc); + geo.rectangle_fill(curX, curY, curX+curWidth, curY+curHeight, fg_gc) /* Draw a 1-pixel black border around the rectangle */ - //XeDrawRectangle(dpy, window, bg_gc, curX, curY, curWidth, curHeight); geo.rectangle(curX, curY, curX+curWidth, curY+curHeight, 0x00000000); - //debug("j=" + j + " color = " + fg_gc); } -//debug("i=" + i); } } @@ -176,114 +242,4 @@ function genNewColor() { } -quit(); -/* -REGISTER_CLASS("Layer", -REGISTER_CLASS("ParticleLayer", -REGISTER_CLASS("GeometryLayer", -REGISTER_CLASS("VScrollLayer", -REGISTER_CLASS("ImageLayer", -REGISTER_CLASS("CamLayer", -REGISTER_CLASS("MovieLayer", -REGISTER_CLASS("MovieLayer", -REGISTER_CLASS("TextLayer", -REGISTER_CLASS("Effect", -JS(cafudda) { -JS(pause) { -JS(quit) { -JS(rem_layer) { -JS(add_layer) { -JS(list_layers) { -JS(layer_list_effects) { -JS(fullscreen) { -JS(set_resolution) { -JS(stream_start) { -JS(stream_stop) { -JS(freej_scandir) { -JS(freej_echo) { -JS(freej_strstr) { -JS(debug) { -JS(rand) { -JS(srand) { -JS(layer_constructor) { -JS(effect_constructor) { -JS(entry_down) { -JS(entry_up) { -JS(entry_move) { -JS(layer_set_blit) { -JS(layer_get_blit) { -JS(layer_get_name) { -JS(layer_get_filename) { -JS(layer_set_position) { -JS(layer_get_x_position) { -JS(layer_get_y_position) { -JS(layer_set_blit_value) { -JS(layer_get_blit_value) { -JS(layer_activate) { -JS(layer_deactivate) { -JS(layer_add_effect) { -JS(layer_rem_effect) { -JS(layer_rotate) { -JS(layer_zoom) { -JS(layer_spin) { -JS_CONSTRUCTOR("GeometryLayer",geometry_layer_constructor,GeoLayer); -JS(geometry_layer_clear) { -JS(geometry_layer_pixel) { -JS(geometry_layer_hline) { -JS(geometry_layer_vline) { -JS(geometry_layer_rectangle) { -JS(geometry_layer_rectangle_fill) { -JS(geometry_layer_line) { -JS(geometry_layer_aaline) { -JS(geometry_layer_circle) { -JS(geometry_layer_aacircle) { -JS(geometry_layer_circle_fill) { -JS(geometry_layer_ellipse) { -JS(geometry_layer_aaellipse) { -JS(geometry_layer_ellipse_fill) { -JS(geometry_layer_pie) { -JS(geometry_layer_pie_fill) { -JS(geometry_layer_trigon) { -JS(geometry_layer_aatrigon) { -JS(geometry_layer_trigon_fill) { -JS_CONSTRUCTOR("ParticleLayer",particle_layer_constructor,GenLayer); -JS(particle_layer_blossom) { -JS_CONSTRUCTOR("ImageLayer",image_layer_constructor,ImageLayer); -JS(image_layer_open) { -JS_CONSTRUCTOR("VScrollLayer",vscroll_layer_constructor,ScrollLayer); -JS(vscroll_layer_append) { -JS(vscroll_layer_speed) { -JS(vscroll_layer_linespace) { -JS(vscroll_layer_kerning) { -JS_CONSTRUCTOR("V4lLayer",v4l_layer_constructor,V4lGrabber); -JS(v4l_layer_chan) { -JS(v4l_layer_freq) { -JS(v4l_layer_band) { -JS_CONSTRUCTOR("AviLayer",avi_layer_constructor,AviLayer); -JS(avi_layer_forward) { -JS(avi_layer_rewind) { -JS(avi_layer_mark_in) { -JS(avi_layer_mark_in_now) { -JS(avi_layer_mark_out) { -JS(avi_layer_mark_out_now) { -JS(avi_layer_getpos) { -JS(avi_layer_setpos) { -JS(avi_layer_pause) { -JS_CONSTRUCTOR("TxtLayer",txt_layer_constructor,TxtLayer); -JS(txt_layer_print) { -JS(txt_layer_size) { -JS(txt_layer_font) { -JS(txt_layer_advance) { -JS(txt_layer_blink) { -JS(txt_layer_blink_on) { -JS(txt_layer_blink_off) { -JS_CONSTRUCTOR("VideoLayer",video_layer_constructor,VideoLayer); -JS(video_layer_seek) { -JS(video_layer_forward) { -JS(video_layer_rewind) { -JS(video_layer_mark_in) { -JS(video_layer_mark_out) { -JS(video_layer_pause) { - -*/ diff --git a/src/Makefile.am b/src/Makefile.am index f11a3b49..521b382b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -77,6 +77,7 @@ freej_SOURCES = \ kbd_ctrl.cpp \ joy_ctrl.cpp \ midi_ctrl.cpp \ + trigger_ctrl.cpp \ \ audio_input.cpp \ \ diff --git a/src/include/jsparser_data.h b/src/include/jsparser_data.h index d18b8e2f..816bff3d 100644 --- a/src/include/jsparser_data.h +++ b/src/include/jsparser_data.h @@ -74,6 +74,7 @@ JS(js_joy_ctrl_constructor); #ifdef WITH_MIDI JS(js_midi_ctrl_constructor); #endif +JS(js_trigger_ctrl_constructor); // encoder constructor #ifdef WITH_OGGTHEORA @@ -108,6 +109,10 @@ extern JSClass js_midi_ctrl_class; extern JSFunctionSpec js_midi_ctrl_methods[]; #endif +// Trigger Controller +extern JSClass js_trigger_ctrl_class; +extern JSFunctionSpec js_trigger_ctrl_methods[]; + // ParticleLayer extern JSClass particle_layer_class; extern JSFunctionSpec particle_layer_methods[]; diff --git a/src/include/trigger_ctrl.h b/src/include/trigger_ctrl.h new file mode 100644 index 00000000..5eb79baa --- /dev/null +++ b/src/include/trigger_ctrl.h @@ -0,0 +1,46 @@ +/* FreeJ + * (c) Copyright 2001-2007 Denis Roio aka jaromil + * + * This source code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * This source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * Please refer to the GNU Public License for more details. + * + * You should have received a copy of the GNU Public License along with + * this source code; if not, write to: + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#ifndef __TRIGGER_CTRL_H__ +#define __TRIGGER_CTRL_H__ + +#include + +#include + +class TriggerCtrl : Controller { + + public: + TriggerCtrl(); + ~TriggerCtrl(); + + int peep(Context *env); + bool init(JSContext *env, JSObject *obj); + int poll(Context *env); + + private: + + JSContext *jsenv; + JSObject *jsobj; + + int _poll(Context *env); + +}; + +#endif diff --git a/src/jsparser.cpp b/src/jsparser.cpp index bf44d078..9f9827db 100644 --- a/src/jsparser.cpp +++ b/src/jsparser.cpp @@ -186,6 +186,11 @@ void JsParser::init() { js_joy_ctrl_constructor, js_joy_ctrl_methods); + REGISTER_CLASS("TriggerController", + js_trigger_ctrl_class, + js_trigger_ctrl_constructor, + js_trigger_ctrl_methods); + #ifdef WITH_OGGTHEORA // encoder class REGISTER_CLASS("VideoEncoder", diff --git a/src/trigger_ctrl.cpp b/src/trigger_ctrl.cpp new file mode 100644 index 00000000..cfdadf5b --- /dev/null +++ b/src/trigger_ctrl.cpp @@ -0,0 +1,91 @@ +/* FreeJ + * (c) Copyright 2001-2007 Denis Roio aka jaromil + * + * This source code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * This source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * Please refer to the GNU Public License for more details. + * + * You should have received a copy of the GNU Public License along with + * this source code; if not, write to: + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * "$Id: trigger_ctrl.cpp 881 2007-08-02 01:06:11Z mrgoil $" + * + */ + + +// I used a Logitech WingMan here. It got 2 joys and 7 Buttons + +#include + +#include + +#include + +#include +#include + + +#include // javascript + +JS(js_trigger_ctrl_constructor); + +DECLARE_CLASS("TriggerController",js_trigger_ctrl_class, js_trigger_ctrl_constructor); + +JSFunctionSpec js_trigger_ctrl_methods[] = { {0} }; // all dynamic methods + + + +TriggerCtrl::TriggerCtrl() + :Controller() { + set_name("Trigger"); +} + +TriggerCtrl::~TriggerCtrl() { +} + +bool TriggerCtrl::init(JSContext *env, JSObject *obj) { + func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__); + jsenv = env; + jsobj = obj; + + initialized = true; + return(true); +} + +int TriggerCtrl::peep(Context *env) { + poll(env); +} + +int TriggerCtrl::poll(Context *env) { + jsval ret; + JS_CallFunctionName(jsenv, jsobj, "frame", 0, NULL, &ret); + return(1); +} + +JS(js_trigger_ctrl_constructor) { + func("%u:%s:%s",__LINE__,__FILE__,__FUNCTION__); + + TriggerCtrl *trigger = new TriggerCtrl(); + + // assign instance into javascript object + if( ! JS_SetPrivate(cx, obj, (void*)trigger) ) { + error("failed assigning trigger controller to javascript"); + delete trigger; return JS_FALSE; + } + + // initialize with javascript context + if(! trigger->init(cx, obj) ) { + error("failed initializing trigger controller"); + delete trigger; return JS_FALSE; + } + + *rval = OBJECT_TO_JSVAL(obj); + return JS_TRUE; +}