diff options
Diffstat (limited to 'dev/a1_textrain')
-rw-r--r-- | dev/a1_textrain/a1_textrain.pde | 371 |
1 files changed, 208 insertions, 163 deletions
diff --git a/dev/a1_textrain/a1_textrain.pde b/dev/a1_textrain/a1_textrain.pde index 1acde87..2db8c36 100644 --- a/dev/a1_textrain/a1_textrain.pde +++ b/dev/a1_textrain/a1_textrain.pde @@ -1,163 +1,208 @@ -/* - * CSci-4611 Assignment #1 Text Rain - */ - - -/* Note: if Processing's video library does not support your particular combination of webcam and - operating system, then the Sketch may hang in the setup() routine when the list of available - image capture devices is requestd with "Capture.list()". If this happens, you can skip all of - the camera initilization code and just run in movie mode by setting the following global - variable to true. - - If you having trouble accessing the cameara on a mac laptop due to a security issue. Some - students found this post helpful: - https://github.com/processing/processing-video/issues/134#issuecomment-664778394 - */ -boolean forceMovieMode = false; - -// Global vars used to access video frames from either a live camera or a prerecorded movie file -import processing.video.*; -String[] cameraModes; -Capture cameraDevice; -Movie inputMovie; -boolean initialized = false; - - -// Both modes of input (live camera and movie) will update this same variable with the lastest -// pixel data each frame. Use this variable to access the new pixel data each frame! -PImage inputImage; - - - -// Called automatically by Processing, once when the program starts up -void setup() { - size(1280, 720); - inputImage = createImage(width, height, RGB); - - if (!forceMovieMode) { - println("Querying avaialble camera modes."); - cameraModes = Capture.list(); - println("Found " + cameraModes.length + " camera modes."); - for (int i=0; i<cameraModes.length; i++) { - println(" " + i + ". " + cameraModes[i]); - } - // if no cameras were detected, then run in offline mode - if (cameraModes.length == 0) { - println("Starting movie mode automatically since no cameras were detected."); - initializeMovieMode(); - } - else { - println("Press a number key in the Processing window to select the desired camera mode."); - } - } -} - - - -// Called automatically by Processing, once per frame -void draw() { - // start each frame by clearing the screen - background(0); - - if (!initialized) { - // IF NOT INITIALIZED, DRAW THE INPUT SELECTION MENU - drawMenuScreen(); - } - else { - // IF WE REACH THIS POINT, WE'RE PAST THE MENU AND THE INPUT MODE HAS BEEN INITIALIZED - - - // GET THE NEXT FRAME OF INPUT DATA FROM LIVE CAMERA OR MOVIE - if ((cameraDevice != null) && (cameraDevice.available())) { - // Get image data from cameara and copy it over to the inputImage variable - cameraDevice.read(); - inputImage.copy(cameraDevice, 0,0,cameraDevice.width,cameraDevice.height, 0,0,inputImage.width,inputImage.height); - } - else if ((inputMovie != null) && (inputMovie.available())) { - // Get image data from the movie file and copy it over to the inputImage variable - inputMovie.read(); - inputImage.copy(inputMovie, 0,0,inputMovie.width,inputMovie.height, 0,0,inputImage.width,inputImage.height); - } - - - // DRAW THE INPUTIMAGE ACROSS THE ENTIRE SCREEN - // Note, this is like clearing the screen with an image. It will cover up anything drawn before this point. - // So, draw your text rain after this! - set(0, 0, inputImage); - - - // DRAW THE TEXT RAIN, ETC. - // TODO: Much of your implementation code should go here. At this point, the latest pixel data from the - // live camera or movie file will have been copied over to the inputImage variable. So, if you access - // the pixel data from the inputImage variable, your code should always work, no matter which mode you run in. - - - - } -} - - -// Called automatically by Processing once per frame -void keyPressed() { - if (!initialized) { - // CHECK FOR A NUMBER KEY PRESS ON THE MENU SCREEN - if ((key >= '0') && (key <= '9')) { - int input = key - '0'; - if (input == 0) { - initializeMovieMode(); - } - else if ((input >= 1) && (input <= 9)) { - initializeLiveCameraMode(input); - } - } - } - else { - // CHECK FOR KEYPRESSES DURING NORMAL OPERATION - // TODO: Fill in your code to handle keypresses here.. - if (key == CODED) { - if (keyCode == UP) { - // up arrow key pressed - } - else if (keyCode == DOWN) { - // down arrow key pressed - } - } - else if (key == ' ') { - // spacebar pressed - } - } -} - - - -// Loads a movie from a file to simulate camera input. -void initializeMovieMode() { - String movieFile = "TextRainInput.mov"; - println("Simulating camera input using movie file: " + movieFile); - inputMovie = new Movie(this, movieFile); - inputMovie.loop(); - initialized = true; -} - - -// Starts up a webcam to use for input. -void initializeLiveCameraMode(int cameraMode) { - println("Activating camera mode #" + cameraMode + ": " + cameraModes[cameraMode-1]); - cameraDevice = new Capture(this, cameraModes[cameraMode-1]); - cameraDevice.start(); - initialized = true; -} - - -// Draws a quick text-based menu to the screen -void drawMenuScreen() { - int y=10; - text("Press a number key to select an input mode", 20, y); - y += 40; - text("O: Offline mode, test with TextRainInput.mov movie file instead of live camera feed.", 20, y); - y += 40; - for (int i = 0; i < min(9,cameraModes.length); i++) { - text(i+1 + ": " + cameraModes[i], 20, y); - y += 40; - } -} +/*
+ * CSci-4611 Assignment #1 Text Rain
+ */
+
+
+/* Note: if Processing's video library does not support your particular combination of webcam and
+ operating system, then the Sketch may hang in the setup() routine when the list of available
+ image capture devices is requestd with "Capture.list()". If this happens, you can skip all of
+ the camera initilization code and just run in movie mode by setting the following global
+ variable to true.
+
+ If you having trouble accessing the cameara on a mac laptop due to a security issue. Some
+ students found this post helpful:
+ https://github.com/processing/processing-video/issues/134#issuecomment-664778394
+ */
+boolean forceMovieMode = false;
+
+// Global vars used to access video frames from either a live camera or a prerecorded movie file
+import processing.video.*;
+String[] cameraModes;
+Capture cameraDevice;
+Movie inputMovie;
+boolean initialized = false;
+int threshhold = 128;
+
+
+// Both modes of input (live camera and movie) will update this same variable with the lastest
+// pixel data each frame. Use this variable to access the new pixel data each frame!
+PImage inputImage;
+PFont f;
+
+
+// Called automatically by Processing, once when the program starts up
+void setup() {
+ size(1280, 720);
+ inputImage = createImage(width, height, RGB);
+ y = new int [width * height];
+ for (int k=0;k<y.length;k++)
+ y[k] = int(random(0,720));
+ f = createFont("Arial",16,true);
+
+ if (!forceMovieMode) {
+ println("Querying avaialble camera modes.");
+ cameraModes = Capture.list();
+ println("Found " + cameraModes.length + " camera modes.");
+ for (int i=0; i<cameraModes.length; i++) {
+ println(" " + i + ". " + cameraModes[i]);
+ }
+ // if no cameras were detected, then run in offline mode
+ if (cameraModes.length == 0) {
+ println("Starting movie mode automatically since no cameras were detected.");
+ initializeMovieMode();
+ }
+ else {
+ println("Press a number key in the Processing window to select the desired camera mode.");
+ }
+ }
+}
+boolean debug;
+
+int [] y;
+// Called automatically by Processing, once per frame
+void draw() {
+ // start each frame by clearing the screen
+ background(0);
+ textFont(f);
+
+ if (!initialized) {
+ // IF NOT INITIALIZED, DRAW THE INPUT SELECTION MENU
+ drawMenuScreen();
+ }
+ else {
+ // IF WE REACH THIS POINT, WE'RE PAST THE MENU AND THE INPUT MODE HAS BEEN INITIALIZED
+
+ // GET THE NEXT FRAME OF INPUT DATA FROM LIVE CAMERA OR MOVIE
+ if ((cameraDevice != null) && (cameraDevice.available())) {
+ // Get image data from cameara and copy it over to the inputImage variable
+ cameraDevice.read();
+ inputImage.copy(cameraDevice, 0,0,cameraDevice.width,cameraDevice.height, 0,0,inputImage.width,inputImage.height);
+ }
+ else if ((inputMovie != null) && (inputMovie.available())) {
+ // Get image data from the movie file and copy it over to the inputImage variable
+ inputMovie.read();
+ inputImage.copy(inputMovie, 0,0,inputMovie.width,inputMovie.height, 0,0,inputImage.width,inputImage.height);
+ }
+ // DRAW THE INPUTIMAGE ACROSS THE ENTIRE SCREEN
+ // Note, this is like clearing the screen with an image. It will cover up anything drawn before this point.
+ // So, draw your text rain after this!
+ inputImage.filter(GRAY);
+ set(0, 0, inputImage);
+ loadPixels();
+ //Debug toggle
+ if (debug) {
+ for (int k=0; k<pixels.length;k++) {
+ if (red(pixels[k]) < threshhold) {
+ pixels[k]=color(0);
+ } else {
+ pixels[k]=color(255);
+ }
+ }
+ } //<>//
+ updatePixels();
+
+ int x=0;
+
+ // DRAW THE TEXT RAIN, ETC.
+ // TODO: Much of your implementation code should go here. At this point, the latest pixel data from the
+ // live camera or movie file will have been copied over to the inputImage variable. So, if you access
+ // the pixel data from the inputImage variable, your code should always work, no matter which mode you run in.
+ //String message = "TEXT AND THINGS AND TEXT AND THINGS";
+ String message = "Let's go for a drive / And see the town tonight / There's nothing to do / But I don't mind when I'm with you";
+
+ for(int i=0; i < message.length(); i++){
+ fill(255, 0, 0);
+
+ int rainlength = int(random(1,5));
+ x += 11;
+ y[x] = (y[x]+rainlength)%inputImage.height;
+ if (red(pixels[x+y[x]*inputImage.width]) < threshhold) {
+ y[x] = (y[x]-rainlength*2)%inputImage.height;
+ if (y[x] <= 0)
+ y[x]=1;
+ if (y[x] >= inputImage.height)
+ y[x]=inputImage.height-1;
+ }
+ text(message.charAt(i),x,y[x]);
+ }
+
+
+ }
+}
+
+
+// Called automatically by Processing once per frame
+void keyPressed() {
+ if (!initialized) {
+ // CHECK FOR A NUMBER KEY PRESS ON THE MENU SCREEN
+ if ((key >= '0') && (key <= '9')) {
+ int input = key - '0';
+ if (input == 0) {
+ initializeMovieMode();
+ }
+ else if ((input >= 1) && (input <= 9)) {
+ initializeLiveCameraMode(input);
+ }
+ }
+ }
+ else {
+ // CHECK FOR KEYPRESSES DURING NORMAL OPERATION
+ // TODO: Fill in your code to handle keypresses here..
+ if (key == CODED) {
+ if (keyCode == UP) {
+ // up arrow key pressed
+ threshhold+=5;
+ if (threshhold > 255)
+ threshhold=255;
+ println("New threshhold: ",threshhold);
+ }
+ else if (keyCode == DOWN) {
+ // down arrow key pressed
+ println("DOWN");
+ threshhold-=5;
+ if (threshhold < 0)
+ threshhold=5;
+ println("New threshhold: ",threshhold);
+ }
+ }
+ else if (key == ' ') {
+ // spacebar pressed
+ println("DEBUG TOGGLED");
+ debug = !debug;
+ }
+ }
+}
+
+
+
+// Loads a movie from a file to simulate camera input.
+void initializeMovieMode() {
+ String movieFile = "TextRainInput.mov";
+ println("Simulating camera input using movie file: " + movieFile);
+ inputMovie = new Movie(this, movieFile);
+ inputMovie.loop();
+ initialized = true;
+}
+
+
+// Starts up a webcam to use for input.
+void initializeLiveCameraMode(int cameraMode) {
+ println("Activating camera mode #" + cameraMode + ": " + cameraModes[cameraMode-1]);
+ cameraDevice = new Capture(this, cameraModes[cameraMode-1]);
+ cameraDevice.start();
+ initialized = true;
+}
+
+
+// Draws a quick text-based menu to the screen
+void drawMenuScreen() {
+ int y=10;
+ text("Press a number key to select an input mode", 20, y);
+ y += 40;
+ text("O: Offline mode, test with TextRainInput.mov movie file instead of live camera feed.", 20, y);
+ y += 40;
+ for (int i = 0; i < min(9,cameraModes.length); i++) {
+ text(i+1 + ": " + cameraModes[i], 20, y);
+ y += 40;
+ }
+}
|