diff src/iris/theme_float.c @ 116:a578bf9b2851 trunk

[svn] - iris vis plugin port
author nenolod
date Tue, 24 Oct 2006 21:25:31 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iris/theme_float.c	Tue Oct 24 21:25:31 2006 -0700
@@ -0,0 +1,367 @@
+/*  Iris - visualization plugin for XMMS
+ *  Copyright (C) 2000-2002 Cédric DELFOSSE (cdelfosse@free.fr)
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* New Theme created by Ron Lockwood-Childs
+ * Looks best when alpha blending is OFF
+ */
+
+/* $Id: theme_float.c,v 1.1 2002/10/27 19:21:06 cedric Exp $ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+#include <GL/gl.h>
+#include <audacious/configdb.h>
+#include "iris.h"
+
+#define HISTORY_SIZE 16
+#define HALF_BOX   0.15
+#define HALF_BOX_Y (HALF_BOX * 2)
+#define FAR_LEFT   -3.0
+#define FAR_BACK   -3.0
+#define BOTTOM     -2.6
+
+
+typedef struct
+{
+    GLfloat xc;
+    GLfloat yc;
+    GLfloat zc;
+} triple;
+
+static struct
+{
+  int wave_speed;
+  gfloat num_blocks;
+}
+conf_private, conf_private_new;
+
+static config_theme conf = {
+  NULL,
+  &conf_private
+};
+
+static config_theme conf_new = {
+  NULL,
+  &conf_private_new
+};
+
+
+static GLfloat get_x_angle (void);
+static void draw_one_frame (gboolean);
+static gfloat speed_to_phase(int speed);
+static void config_read (ConfigDb *, char *);
+static void config_write (ConfigDb *, char *);
+static void config_default (void);
+static void config_create (GtkWidget *);
+
+
+static char float_numblocks[] = "float_numblocks";
+static char float_wavespeed[] = "float_wavespeed";
+
+
+iris_theme theme_float = {
+  "Floaters",
+  "A spectrum of floating blocks (alpha blend off for best effect)",
+  "Ron Lockwood-Childs",
+  "float",
+  &conf,
+  &conf_new,
+  sizeof (conf_private),
+  config_read,
+  config_write,
+  config_default,
+  config_create,
+  NULL,
+  NULL,
+  NULL,
+  get_x_angle,
+  draw_one_frame,
+};
+
+static GLfloat data2[NUM_BANDS][HISTORY_SIZE];	// previous freq band data
+static GLfloat phase[HISTORY_SIZE];	// previous angle data
+
+static GLfloat
+get_x_angle ()
+{
+  return (10.0 + (int) (80.0 * rand () / (RAND_MAX + 1.0)));
+}
+
+static void
+draw_one_frame (gboolean beat)
+{
+  int t1, t2;			// loop vars
+  GLfloat red, green, blue;
+  GLfloat y_color = 0.0;
+  triple ulf, urf, llf, lrf, ulb, urb, llb, lrb;
+  GLfloat basis[NUM_BANDS];
+  int box_height;
+  int i;
+
+  /* shift all data when a new datarow arrives */
+  for (t2 = (HISTORY_SIZE-1); t2 > 0; t2--)
+  {
+        for (t1 = 0; t1 < NUM_BANDS; t1++)
+        {
+            data2[t1][t2] = data2[t1][t2-1];
+        }
+        phase[t2] = phase[t2-1];
+  }
+  for (t1 = 0; t1 < NUM_BANDS; t1++)
+  {
+      data2[t1][0] = datas.data1[t1];
+      phase[0] = phase[1] + speed_to_phase(conf_private.wave_speed);
+  }
+
+  glBegin (GL_QUADS);
+
+  for (t2 = (HISTORY_SIZE-1); t2 >= 0; t2--)
+  {
+      for (t1 = 0; t1 < NUM_BANDS; t1++)
+	  {
+          basis[t1] = BOTTOM + sin( phase[t2] + (speed_to_phase(conf_private.wave_speed) * t1));
+          box_height = (int)ceilf( data2[t1][t2] * conf_private.num_blocks );
+
+          for (i = 0; i < box_height; i++)
+          {
+              if (i < (box_height-1))
+              {
+                  y_color = (GLfloat)i * (1.0 / (GLfloat)conf_private.num_blocks);
+              }
+              else
+              {
+                  y_color = data2[t1][t2];
+              }
+	          get_color (&red, &green, &blue, &y_color);	// box color
+	          glColor4f (red / 2.0f, green / 2.0f, blue / 2.0f, 0.5f);
+
+              ulf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX;
+              ulf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y;
+              ulf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX;
+
+              urf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX;
+              urf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y;
+              urf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX;
+
+              lrf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX;
+              lrf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y;
+              lrf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX;
+
+              llf.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX;
+              llf.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y;
+              llf.zc = (FAR_BACK + t2 * HALF_BOX * 3) - HALF_BOX;
+
+              ulb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX;
+              ulb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y;
+              ulb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX;
+
+              urb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX;
+              urb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) + HALF_BOX_Y;
+              urb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX;
+
+              lrb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) + HALF_BOX;
+              lrb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y;
+              lrb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX;
+
+              llb.xc = FAR_LEFT + (HALF_BOX * 3 * t1) - HALF_BOX;
+              llb.yc = basis[t1] + (HALF_BOX_Y * 3 * i) - HALF_BOX_Y;
+              llb.zc = (FAR_BACK + t2 * HALF_BOX * 3) + HALF_BOX;
+
+	          // now start drawin'
+	          // start with the front, then left, back, right, finally the top
+
+	          // "front"
+	          glVertex3f (ulf.xc, ulf.yc, ulf.zc);	// "top-left"
+
+	          glVertex3f (urf.xc, urf.yc, urf.zc);	// "top-right"
+
+	          glVertex3f (lrf.xc, lrf.yc, lrf.zc);	// "bottom-right"
+
+	          glVertex3f (llf.xc, llf.yc, llf.zc);	// "bottom-left"
+
+	          // "back"
+	          glVertex3f (ulb.xc, ulb.yc, ulb.zc);	// "top-left"
+
+	          glVertex3f (urb.xc, urb.yc, urb.zc);	// "top-right"
+
+	          glVertex3f (lrb.xc, lrb.yc, lrb.zc);	// "bottom-right"
+
+	          glVertex3f (llb.xc, llb.yc, llb.zc);	// "bottom-left"
+
+	          // "left"
+              glVertex3f( llb.xc, llb.yc, llb.zc);    // "bottom-in"
+
+              glVertex3f( llf.xc, llf.yc, llf.zc);    // "bottom-out"
+
+              glVertex3f( ulf.xc, ulf.yc, ulf.zc);    // "top-out"
+
+              glVertex3f( ulb.xc, ulb.yc, ulb.zc);    // "top-in"
+
+              // "top"
+              glVertex3f( ulb.xc, ulb.yc, ulb.zc);    // "left-in"
+
+              glVertex3f( ulf.xc, ulf.yc, ulf.zc);    // "left-out"
+
+              glVertex3f( urf.xc, urf.yc, urf.zc);    // "right-out"
+
+              glVertex3f( urb.xc, urb.yc, urb.zc);    // "right-in"
+
+              // "right"
+              glVertex3f( urb.xc, urb.yc, urb.zc);    // "top-in"
+
+              glVertex3f( urf.xc, urf.yc, urf.zc);    // "top-out"
+
+              glVertex3f( lrf.xc, lrf.yc, lrf.zc);    // "bottom-out"
+
+              glVertex3f( lrb.xc, lrb.yc, lrb.zc);    // "bottom-in"
+
+              // "bottom"
+              glVertex3f( lrb.xc, lrb.yc, lrb.zc);    // "right-in"
+
+              glVertex3f( lrf.xc, lrf.yc, lrf.zc);    // "right-out"
+
+              glVertex3f( llf.xc, llf.yc, llf.zc);    // "left-out"
+
+              glVertex3f( llb.xc, llb.yc, llb.zc);    // "left-in"
+          }
+      }
+  }
+
+  glEnd ();
+
+}
+
+
+static void
+config_read (ConfigDb * db, char *section_name)
+{
+  bmp_cfg_db_get_float (db, section_name, float_numblocks, &conf_private.num_blocks);
+  bmp_cfg_db_get_int (db, section_name, float_wavespeed, &conf_private.wave_speed);
+}
+
+
+static void
+config_write (ConfigDb * db, char *section_name)
+{
+  bmp_cfg_db_set_float (db, section_name, float_numblocks, conf_private.num_blocks);
+  bmp_cfg_db_set_int (db, section_name, float_wavespeed, conf_private.wave_speed);
+}
+
+
+static void
+config_default ()
+{
+  conf_private.num_blocks = 8.0;
+  conf_private.wave_speed = 4;
+}
+
+
+static void
+blocks_changed (GtkAdjustment * adj)
+{
+  conf_private_new.num_blocks = (int) adj->value;
+}
+
+
+// speeds: pi/8, pi/12, pi/16, pi/20, pi/24, pi/28, pi/32,0
+static gfloat speed_to_phase(int speed)
+{
+  gfloat phase;
+
+  if (speed == 0)
+  {
+    phase = 0;
+  }
+  else
+  {
+    phase = M_PI_4/(9-speed);
+  }
+
+  return phase;
+}
+
+static void
+speed_changed (GtkWidget *menuitem, gpointer data)
+{
+  conf_private_new.wave_speed = GPOINTER_TO_INT(data);
+}
+
+
+
+static void
+config_create (GtkWidget * vbox)
+{
+  GtkWidget *hbox;
+  GtkWidget *label;
+  GtkObject *adjustment;
+  GtkWidget *hscale;
+  GtkWidget *menu;
+  GtkWidget *menuitem;
+  GtkWidget *optionmenu;
+  gchar *speeds[8] = {"0","1","2","3","4","5","6","7"};
+  int i;
+
+  memcpy (&conf_private_new, &conf_private, sizeof (conf_private));
+
+  /* number blocks */
+  hbox = gtk_hbox_new (FALSE, 2);
+  gtk_widget_show (hbox);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4);
+
+  label = gtk_label_new ("Max number blocks per stack");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4);
+
+  adjustment =
+    gtk_adjustment_new (conf_private_new.num_blocks, 4, 8, 1, 2, 0);
+  hscale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
+  gtk_scale_set_digits (GTK_SCALE (hscale), 0);
+  gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 25);
+  gtk_box_pack_start (GTK_BOX (hbox), hscale, FALSE, FALSE, 4);
+  gtk_widget_show (hscale);
+  gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
+		      GTK_SIGNAL_FUNC (blocks_changed), NULL);
+
+  /* set wave speed */
+  hbox = gtk_hbox_new (FALSE, 2);
+  gtk_widget_show (hbox);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4);
+
+  label = gtk_label_new ("Wave speed");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 4);
+
+  menu = gtk_menu_new ();
+  for (i=0; i<8; i++)
+  {
+    menuitem =  gtk_menu_item_new_with_label(speeds[i]);
+    gtk_menu_append(GTK_MENU(menu), menuitem);
+    gtk_widget_show (menuitem);
+    gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+           GTK_SIGNAL_FUNC (speed_changed), GINT_TO_POINTER(i));
+  }
+  optionmenu = gtk_option_menu_new();
+  gtk_menu_set_active(GTK_MENU(menu), conf_private.wave_speed);
+  gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu);
+  gtk_box_pack_start (GTK_BOX (hbox), optionmenu, FALSE, FALSE, 4);
+  gtk_widget_show (optionmenu);
+
+}