Commit 2ad1dac0 authored by Tobias Zehntner's avatar Tobias Zehntner

Update readme, add license, remove oF

parent 88abea07
This diff is collapsed.
***Skyline*** (2014) by Tobias Zehntner
=======
# Skyline (2014)
Code for Skyline (2014): LED strip controlled through Arduino and indirectly openFrameworks
Artwork by [Tobias Zehntner](http://www.tobiaszehntner.art)
This is the code for my work Skyline (2014). An LED strip controlled by Arduino, with values calculated by openFrameworks. The Arduino cycles through keyframes, putting out the color to the LED strip by fading between keyframes. Check my [website](http://www.tobiaszehntner.com) for details.
- Year: 2014
- License: [APGL-3.0](https://www.gnu.org/licenses/agpl.html)
- [Documentation](http://www.tobiaszehntner.art/work/skyline)
##openFrameworks
### Description
LED strip controlled through Arduino and indirectly openFrameworks
This is the code for my work Skyline (2014). An LED strip controlled by Arduino, with values calculated by openFrameworks. The Arduino cycles through keyframes, putting out the color to the LED strip by fading between keyframes. Check my [website](http://www.tobiaszehntner.art) for details.
#### openFrameworks
The code for openFrameworks reads out the RGB values of each pixel from a keyframe (vertically), and writes it as output, including information on how many pixels and how many keyframes there are. Copy/paste the readout to Arduino. Place keyframes named as <####.jpg> in the `bin` folder of your openFrameworks app directory.
##Arduino
The code in the Arduino file takes the RGB values of the keyframes, calculates the color between them as time passes, and sends them to each RGB LED pixel on the strip.
\ No newline at end of file
#### Arduino
The code in the Arduino file takes the RGB values of the keyframes, calculates the color between them as time passes, and sends them to each RGB LED pixel on the strip.
/*
*
* Written By Linas Vepstas November 1991
*/
#define COPY_THREE_WORDS(A,B) { \
struct three_words { int a, b, c, }; \
*(struct three_words *) (A) = *(struct three_words *) (B); \
}
#define COPY_FOUR_WORDS(A,B) { \
struct four_words { int a, b, c, d, }; \
*(struct four_words *) (A) = *(struct four_words *) (B); \
}
/* ============================================================= */
/*
* extrude.h
*
* FUNCTION:
* prototypes for privately used subroutines for the tubing library
*
* HISTORY:
* Linas Vepstas 1991
*/
#include "port.h" /* for gleDouble */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
/* ============================================================ */
/*
* Provides choice of calling subroutine, vs. invoking macro.
* Basically, inlines the source, or not.
* Trades performance for executable size.
*/
#define INLINE_INTERSECT
#ifdef INLINE_INTERSECT
#define INNERSECT(sect,p,n,v1,v2) { INTERSECT(sect,p,n,v1,v2); }
#else
#define INNERSECT(sect,p,n,v1,v2) intersect(sect,p,n,v1,v2)
#endif /* INLINE_INTERSECT */
/* ============================================================ */
/* The folowing defines give a kludgy way of accessing the qmesh primitive */
/*
#define bgntmesh _emu_qmesh_bgnqmesh
#define endtmesh _emu_qmesh_endqmesh
#define c3f _emu_qmesh_c3f
#define n3f _emu_qmesh_n3f
#define v3f _emu_qmesh_v3f
*/
/* ============================================================ */
extern void up_sanity_check (gleDouble up[3], /* up vector for contour */
int npoints, /* numpoints in poly-line */
gleDouble point_array[][3]); /* polyline */
extern void draw_raw_style_end_cap (int ncp, /* number of contour points */
gleDouble contour[][2], /* 2D contour */
gleDouble zval, /* where to draw cap */
int frontwards); /* front or back cap */
extern void draw_round_style_cap_callback (int iloop,
double cap[][3],
float face_color[3],
gleDouble cut_vector[3],
gleDouble bisect_vector[3],
double norms[][3],
int frontwards);
extern void draw_angle_style_front_cap (int ncp,
gleDouble bi[3],
gleDouble point_array[][3]);
extern void extrusion_raw_join (int ncp, /* number of contour points */
gleDouble contour[][2], /* 2D contour */
gleDouble cont_normal[][2],/* 2D contour normal vecs */
gleDouble up[3], /* up vector for contour */
int npoints, /* numpoints in poly-line */
gleDouble point_array[][3], /* polyline */
float color_array[][3], /* color of polyline */
gleDouble xform_array[][2][3]); /* 2D contour xforms */
extern void extrusion_round_or_cut_join (int ncp, /* number of contour points */
gleDouble contour[][2], /* 2D contour */
gleDouble cont_normal[][2],/* 2D contour normal vecs */
gleDouble up[3], /* up vector for contour */
int npoints, /* numpoints in poly-line */
gleDouble point_array[][3], /* polyline */
float color_array[][3], /* color of polyline */
gleDouble xform_array[][2][3]); /* 2D contour xforms */
extern void extrusion_angle_join (int ncp, /* number of contour points */
gleDouble contour[][2], /* 2D contour */
gleDouble cont_normal[][2],/* 2D contour normal vecs */
gleDouble up[3], /* up vector for contour */
int npoints, /* numpoints in poly-line */
gleDouble point_array[][3], /* polyline */
float color_array[][3], /* color of polyline */
gleDouble xform_array[][2][3]); /* 2D contour xforms */
/* -------------------------- end of file -------------------------------- */
#ifndef __glsmap_h__
#define __glsmap_h__
/* Copyright (c) Mark J. Kilgard, 1998. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#if defined(_WIN32)
/* Try hard to avoid including <windows.h> to avoid name space pollution,
but Win32's <GL/gl.h> needs APIENTRY and WINGDIAPI defined properly. */
# if 0
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# else
/* XXX This is from Win32's <windef.h> */
# ifndef APIENTRY
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
# define APIENTRY __stdcall
# else
# define APIENTRY
# endif
# endif
# ifndef CALLBACK
/* XXX This is from Win32's <winnt.h> */
# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
# define CALLBACK __stdcall
# else
# define CALLBACK
# endif
# endif
/* XXX This is from Win32's <wingdi.h> and <winnt.h> */
# ifndef WINGDIAPI
# define WINGDIAPI __declspec(dllimport)
# endif
/* XXX This is from Win32's <ctype.h> */
# ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
# define _WCHAR_T_DEFINED
# endif
# endif
#pragma warning (disable:4244) /* Disable bogus conversion warnings. */
#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
#endif /* _WIN32 */
#include <OpenGL/gl.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
SMAP_CLEAR_SMAP_TEXTURE = 0x1,
SMAP_GENERATE_VIEW_MIPMAPS = 0x2,
SMAP_GENERATE_SMAP_MIPMAPS = 0x4,
SMAP_GENERATE_MIPMAPS = 0x6 /* both of above */
} SphereMapFlags;
/* Cube view enumerants. */
enum {
SMAP_FRONT = 0,
SMAP_TOP = 1,
SMAP_BOTTOM = 2,
SMAP_LEFT = 3,
SMAP_RIGHT = 4,
SMAP_BACK = 5
};
typedef struct _SphereMap SphereMap;
extern SphereMap *smapCreateSphereMap(SphereMap *shareSmap);
extern void smapDestroySphereMap(SphereMap *smap);
extern void smapConfigureSphereMapMesh(SphereMap *smap, int steps, int rings, int edgeExtend);
extern void smapSetSphereMapTexObj(SphereMap *smap, GLuint texobj);
extern void smapSetViewTexObj(SphereMap *smap, GLuint texobj);
extern void smapSetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
extern void smapGetSphereMapTexObj(SphereMap *smap, GLuint *texobj);
extern void smapGetViewTexObj(SphereMap *smap, GLuint *texobj);
extern void smapGetViewTexObjs(SphereMap *smap, GLuint texobjs[6]);
extern void smapSetFlags(SphereMap *smap, SphereMapFlags flags);
extern void smapGetFlags(SphereMap *smap, SphereMapFlags *flags);
extern void smapSetViewOrigin(SphereMap *smap, GLint x, GLint y);
extern void smapSetSphereMapOrigin(SphereMap *smap, GLint x, GLint y);
extern void smapGetViewOrigin(SphereMap *smap, GLint *x, GLint *y);
extern void smapGetSphereMapOrigin(SphereMap *smap, GLint *x, GLint *y);
extern void smapSetEye(SphereMap *smap, GLfloat eyex, GLfloat eyey, GLfloat eyez);
extern void smapSetEyeVector(SphereMap *smap, GLfloat *eye);
extern void smapSetUp(SphereMap *smap, GLfloat upx, GLfloat upy, GLfloat upz);
extern void smapSetUpVector(SphereMap *smap, GLfloat *up);
extern void smapSetObject(SphereMap *smap, GLfloat objx, GLfloat objy, GLfloat objz);
extern void smapSetObjectVector(SphereMap *smap, GLfloat *obj);
extern void smapGetEye(SphereMap *smap, GLfloat *eyex, GLfloat *eyey, GLfloat *eyez);
extern void smapGetEyeVector(SphereMap *smap, GLfloat *eye);
extern void smapGetUp(SphereMap *smap, GLfloat *upx, GLfloat *upy, GLfloat *upz);
extern void smapGetUpVector(SphereMap *smap, GLfloat *up);
extern void smapGetObject(SphereMap *smap, GLfloat *objx, GLfloat *objy, GLfloat *objz);
extern void smapGetObjectVector(SphereMap *smap, GLfloat *obj);
extern void smapSetNearFar(SphereMap *smap, GLfloat viewNear, GLfloat viewFar);
extern void smapGetNearFar(SphereMap *smap, GLfloat *viewNear, GLfloat *viewFar);
extern void smapSetSphereMapTexDim(SphereMap *smap, GLsizei texdim);
extern void smapSetViewTexDim(SphereMap *smap, GLsizei texdim);
extern void smapGetSphereMapTexDim(SphereMap *smap, GLsizei *texdim);
extern void smapGetViewTexDim(SphereMap *smap, GLsizei *texdim);
extern void smapSetContextData(SphereMap *smap, void *context);
extern void smapGetContextData(SphereMap *smap, void **context);
extern void smapSetPositionLightsFunc(SphereMap *smap, void (*positionLights)(int view, void *context));
extern void smapSetDrawViewFunc(SphereMap *smap, void (*drawView)(int view, void *context));
extern void smapGetPositionLightsFunc(SphereMap *smap, void (**positionLights)(int view, void *context));
extern void smapGetDrawViewFunc(SphereMap *smap, void (**drawView)(int view, void *context));
extern void smapGenViewTex(SphereMap *smap, int view);
extern void smapGenViewTexs(SphereMap *smap);
extern void smapGenSphereMapFromViewTexs(SphereMap *smap);
extern void smapGenSphereMap(SphereMap *smap);
extern void smapGenSphereMapWithOneViewTex(SphereMap *smap);
extern int smapRvecToSt(float rvec[3], float st[2]);
extern void smapStToRvec(float *st, float *rvec);
#ifdef __cplusplus
}
#endif
#endif /* __glsmap_h__ */
#ifndef __glsmapint_h__
#define __glsmapint_h__
/* Copyright (c) Mark J. Kilgard, 1998. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#include "glsmap.h"
enum { X = 0, Y = 1, Z = 2 };
#define INITFACE(mesh) \
int steps = mesh->steps; \
int sqsteps = mesh->steps * mesh->steps
#define FACE(side,y,x) \
mesh->face[(side)*sqsteps + (y)*steps + (x)]
#define FACExy(side,i,j) \
(&FACE(side,i,j).x)
#define FACEst(side,i,j) \
(&FACE(side,i,j).s)
#define INITBACK(mesh) \
int allrings = mesh->rings + mesh->edgeExtend; \
int ringedspokes = allrings * mesh->steps
#define BACK(edge,ring,spoke) \
mesh->back[(edge)*ringedspokes + (ring)*mesh->steps + (spoke)]
#define BACKxy(edge,ring,spoke) \
(&BACK(edge,ring,spoke).x)
#define BACKst(edge,ring,spoke) \
(&BACK(edge,ring,spoke).s)
typedef struct _STXY {
GLfloat s, t;
GLfloat x, y;
} STXY;
typedef struct _SphereMapMesh {
int refcnt;
int steps;
int rings;
int edgeExtend;
STXY *face;
STXY *back;
} SphereMapMesh;
struct _SphereMap {
/* Shared sphere map mesh vertex data. */
SphereMapMesh *mesh;
/* Texture object ids. */
GLuint smapTexObj;
GLuint viewTexObjs[6];
GLuint viewTexObj;
/* Flags */
SphereMapFlags flags;
/* Texture dimensions must be a power of two. */
int viewTexDim; /* view texture dimension */
int smapTexDim; /* sphere map texture dimension */
/* Viewport origins for view and sphere map rendering. */
int viewOrigin[2];
int smapOrigin[2];
/* Viewing vectors. */
GLfloat eye[3];
GLfloat up[3];
GLfloat obj[3];
/* Projection parameters. */
GLfloat viewNear;
GLfloat viewFar;
/* Rendering callbacks. */
void (*positionLights)(int view, void *context);
void (*drawView)(int view, void *context);
/* Application specified callback data. */
void *context;
};
/* Library internal routines. */
extern void __smapDrawSphereMapMeshSide(SphereMapMesh *mesh, int side);
extern void __smapDrawSphereMapMeshBack(SphereMapMesh *mesh);
extern void __smapValidateSphereMapMesh(SphereMapMesh *mesh);
#endif /* __glsmapint_h__ */
#ifndef __glutbitmap_h__
#define __glutbitmap_h__
/* Copyright (c) Mark J. Kilgard, 1994. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#include "glut.h"
typedef struct {
const GLsizei width;
const GLsizei height;
const GLfloat xorig;
const GLfloat yorig;
const GLfloat advance;
const GLubyte *bitmap;
} BitmapCharRec, *BitmapCharPtr;
typedef struct {
const char *name;
const int num_chars;
const int first;
const BitmapCharRec * const *ch;
} BitmapFontRec, *BitmapFontPtr;
typedef void *GLUTbitmapFont;
#endif /* __glutbitmap_h__ */
#ifndef __glutf90_h__
#define __glutf90_h__
/* Copyright (c) Mark J. Kilgard & Willam F. Mitchell, 1998. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
/* This header provides the binding interface for William Mitchell's
f90gl Fortran 90 GLUT binding. Other GLUT language bindings
can and should use this interace. */
/* I appreciate the guidance from William Mitchell
(mitchell@cam.nist.gov) in developing this friend interface
for use by the f90gl package. See ../../README.fortran */
#include <GLUT/glut.h>
#ifndef GLUTCALLBACK
#define GLUTCALLBACK
#endif
#ifndef APIENTRY
#define APIENTRY
#endif
/* Which callback enumerants for the __glutSetFCB/__glutGetFCB routines. */
/* NOTE These values are part of a binary interface for the f90gl Fortran
90 binding and so must NOT changes (additions are allowed). */
/* GLUTwindow callbacks. */
#define GLUT_FCB_DISPLAY 0 /* GLUTdisplayFCB */
#define GLUT_FCB_RESHAPE 1 /* GLUTreshapeFCB */
#define GLUT_FCB_MOUSE 2 /* GLUTmouseFCB */
#define GLUT_FCB_MOTION 3 /* GLUTmotionFCB */
#define GLUT_FCB_PASSIVE 4 /* GLUTpassiveFCB */
#define GLUT_FCB_ENTRY 5 /* GLUTentryFCB */
#define GLUT_FCB_KEYBOARD 6 /* GLUTkeyboardFCB */
#define GLUT_FCB_KEYBOARD_UP 7 /* GLUTkeyboardFCB */
#define GLUT_FCB_WINDOW_STATUS 8 /* GLUTwindowStatusFCB */
#define GLUT_FCB_VISIBILITY 9 /* GLUTvisibilityFCB */
#define GLUT_FCB_SPECIAL 10 /* GLUTspecialFCB */
#define GLUT_FCB_SPECIAL_UP 11 /* GLUTspecialFCB */
#define GLUT_FCB_BUTTON_BOX 12 /* GLUTbuttonBoxFCB */
#define GLUT_FCB_DIALS 13 /* GLUTdialsFCB */
#define GLUT_FCB_SPACE_MOTION 14 /* GLUTspaceMotionFCB */
#define GLUT_FCB_SPACE_ROTATE 15 /* GLUTspaceRotateFCB */
#define GLUT_FCB_SPACE_BUTTON 16 /* GLUTspaceButtonFCB */
#define GLUT_FCB_TABLET_MOTION 17 /* GLUTtabletMotionFCB */
#define GLUT_FCB_TABLET_BUTTON 18 /* GLUTtabletButtonFCB */
#define GLUT_FCB_JOYSTICK 19 /* GLUTjoystickFCB */
#define GLUT_FCB_WMCLOSE 20 /* GLUTwmcloseFCB */
/* Non-GLUTwindow callbacks. */
#define GLUT_FCB_OVERLAY_DISPLAY 100 /* GLUTdisplayFCB */
#define GLUT_FCB_SELECT 101 /* GLUTselectFCB */
#define GLUT_FCB_TIMER 102 /* GLUTtimerFCB */
/* GLUT Fortran callback function types. */
typedef void (GLUTCALLBACK *GLUTdisplayFCB) (void);
typedef void (GLUTCALLBACK *GLUTwmcloseFCB) (void);
typedef void (GLUTCALLBACK *GLUTreshapeFCB) (int *, int *);
/* NOTE the pressed key is int, not unsigned char for Fortran! */
typedef void (GLUTCALLBACK *GLUTkeyboardFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTmouseFCB) (int *, int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTmotionFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTpassiveFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTentryFCB) (int *);
typedef void (GLUTCALLBACK *GLUTwindowStatusFCB) (int *);
typedef void (GLUTCALLBACK *GLUTvisibilityFCB) (int *);
typedef void (GLUTCALLBACK *GLUTspecialFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTbuttonBoxFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTdialsFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTspaceMotionFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTspaceRotateFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTspaceButtonFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTtabletMotionFCB) (int *, int *);
typedef void (GLUTCALLBACK *GLUTtabletButtonFCB) (int *, int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTjoystickFCB) (unsigned int *buttonMask, int *x, int *y, int *z);
typedef void (GLUTCALLBACK *GLUTselectFCB) (int *);
typedef void (GLUTCALLBACK *GLUTtimerFCB) (int *);
typedef void (GLUTCALLBACK *GLUTmenuStateFCB) (int *); /* DEPRICATED. */
typedef void (GLUTCALLBACK *GLUTmenuStatusFCB) (int *, int *, int *);
typedef void (GLUTCALLBACK *GLUTidleFCB) (void);
/* Functions that set and return Fortran callback functions. */
extern void* APIENTRY __glutGetFCB(int which);
extern void APIENTRY __glutSetFCB(int which, void *func);
#endif /* __glutf90_h__ */
#ifndef __glutstroke_h__
#define __glutstroke_h__
/* Copyright (c) Mark J. Kilgard, 1994. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#if defined(_WIN32)
#pragma warning (disable:4244) /* disable bogus conversion warnings */
#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
#endif
typedef struct {
float x;
float y;
} CoordRec, *CoordPtr;
typedef struct {
int num_coords;
const CoordRec *coord;
} StrokeRec, *StrokePtr;
typedef struct {
int num_strokes;
const StrokeRec *stroke;
float center;
float right;
} StrokeCharRec, *StrokeCharPtr;
typedef struct {
const char *name;
int num_chars;
const StrokeCharRec *ch;
float top;
float bottom;
} StrokeFontRec, *StrokeFontPtr;
typedef void *GLUTstrokeFont;
#endif /* __glutstroke_h__ */
/*
* gutil.h
*
* FUNCTION:
* Provide utilities that allow rotation to occur
* around any axis.
*
* HISTORY:
* created by Linas Vepstas 1990
* added single & double precision, June 1991, Linas Vepstas
*/
#ifndef __GUTIL_H__
#define __GUTIL_H__
#ifdef __GUTIL_DOUBLE
#define gutDouble double
#else
#define gutDouble float
#endif
#ifdef _NO_PROTO /* NO ANSI C PROTOTYPING */
/* Rotation Utilities */
extern void rot_axis_f ();
extern void rot_about_axis_f ();
extern void rot_omega_f ();
extern void urot_axis_f ();
extern void urot_about_axis_f ();
extern void urot_omega_f ();
/* double-precision versions */
extern void rot_axis_d ();
extern void rot_about_axis_d ();
extern void rot_omega_d ();
extern void urot_axis_d ();
extern void urot_about_axis_d ();
extern void urot_omega_d ();