#include "ofApp.h"
void ofApp::setup(){
ofSetWindowTitle("Multiband Noise Example");
ofSetVerticalSync(true);
setupMultibandNoiseDemo();
}
void ofApp::update(){
updateMultibandNoiseDemo();
}
void ofApp::draw(){
ofBackgroundGradient( ofColor(240), ofColor(180), OF_GRADIENT_CIRCULAR);
renderMultibandNoiseDemo();
}
void ofApp::setupMultibandNoiseDemo(){
nNoiseStrips = 8;
sliderGroup.resize(nNoiseStrips);
noiseDataStripGroup.resize(nNoiseStrips);
originX = 100;
originY = 100;
float stripWidth = 300;
float stripHeight = 35;
float yMargin = 5;
float stripXPos = originX;
float stripYPos = originY;
float noiseStep = 0.001;
float noiseAmounts[8] = {0,0,0, 0.82,0.59,0.41, 0.06,0.17};
for (int i=0; i<nNoiseStrips; i++){
noiseDataStripGroup[i].x = stripXPos;
noiseDataStripGroup[i].y = stripYPos;
noiseDataStripGroup[i].width = stripWidth;
noiseDataStripGroup[i].height = stripHeight;
noiseDataStripGroup[i].noiseStep = noiseStep;
noiseStep *= 2.0;
for (int j=0; j< NOISE_DATA_STRIP_LENGTH; j++){
noiseDataStripGroup[i].data[j] = 1.0;
}
float sliderX = stripXPos+stripWidth+yMargin;
float sliderAmount = noiseAmounts[i];
sliderGroup[i].setup(sliderX, stripYPos, 16,stripHeight, 0.00, 1.0, sliderAmount, true,true);
stripYPos += stripHeight + yMargin;
}
}
void ofApp::updateMultibandNoiseDemo(){
for (int i=0; i<nNoiseStrips; i++){
float *data = (float *)noiseDataStripGroup[i].data;
for (int j=(NOISE_DATA_STRIP_LENGTH-1); j>0; j--){
data[j] = data[j-1];
}
float noiseStep = noiseDataStripGroup[i].noiseStep;
float t = (ofGetElapsedTimeMillis()/10.0 + i) * noiseStep;
data[0] = ofNoise(t);
}
float normalizationFactor = 0;
for (int i=0; i<nNoiseStrips; i++){
float weight = sliderGroup[i].getValue();
normalizationFactor += weight;
}
if (normalizationFactor == 0){
normalizationFactor = 1.0;
}
for (int j=0; j<NOISE_DATA_STRIP_LENGTH; j++){
float sumj = 0;
for (int i=0; i<nNoiseStrips; i++){
float val = noiseDataStripGroup[i].data[j];
float weight = sliderGroup[i].getValue();
sumj += (weight * val);
}
summedNoiseData[j] = sumj / normalizationFactor;
}
}
void ofApp::renderMultibandNoiseDemo(){
float stackBottom = 0;
for (int i=0; i<nNoiseStrips; i++){
float x = noiseDataStripGroup[i].x;
float y = noiseDataStripGroup[i].y;
float w = noiseDataStripGroup[i].width;
float h = noiseDataStripGroup[i].height;
stackBottom = y+h;
float noiseStep = noiseDataStripGroup[i].noiseStep;
float *data = (float *) (noiseDataStripGroup[i].data);
render1DNoiseStrip (x,y, w,h, noiseStep, data);
}
render1DNoiseStrip(originX, stackBottom+125, 300,100, 0, (float *)summedNoiseData);
string multiBandText = "ofNoise() creates a signal that varies \n";
multiBandText += "smoothly between 0 and 1. More 'organic' \n";
multiBandText += "noise can be made by adding multiple \n";
multiBandText += "'octaves' of noise. The strip below shows \n";
multiBandText += "the sum of the above streams, weighted by \n";
multiBandText += "the values in their corresponding sliders. \n";
ofSetColor(0,0,0);
ofDrawBitmapString(multiBandText, originX, stackBottom+33);
ofDrawBitmapString("ofNoise()", originX+1, stackBottom+33);
ofDrawBitmapString("Noise Step", originX-46, originY-5);
ofDrawBitmapString("Weights", originX+300+5, originY-5);
}
void ofApp::render1DNoiseStrip (float x, float y, float width, float height, float dt, float *data){
ofPushMatrix();
ofDisableSmoothing();
ofEnableAlphaBlending();
ofTranslate(x, y, 0);
ofFill();
ofSetColor(0,0,0, 10);
ofDrawRectangle(0,0, width+4, height+2);
ofDrawRectangle(0,0, width+2, height+4);
ofFill();
ofSetColor(255,255,255);
ofDrawRectangle(0,0, width, height);
ofEnableSmoothing();
ofFill();
ofSetColor(190);
ofBeginShape();
ofVertex(width, height);
for (int i=0; i<NOISE_DATA_STRIP_LENGTH; i++){
float px = ofMap(i, 0,(NOISE_DATA_STRIP_LENGTH-1), width,0);
float py = height * data[i];
ofVertex(px,py);
}
ofVertex(0, height);
ofEndShape(true);
ofNoFill();
ofSetColor(255,0,0);
ofBeginShape();
for (int i=0; i<NOISE_DATA_STRIP_LENGTH; i++){
float px = ofMap(i, 0,(NOISE_DATA_STRIP_LENGTH-1), width,0);
float py = height * data[i];
ofVertex(px,py);
}
ofEndShape(false);
ofDisableSmoothing();
ofNoFill();
ofSetColor(0,0,0);
ofDrawRectangle(0,0, width, height);
if (dt > 0){
ofSetColor(0,0,0);
string label = ofToString(dt);
ofDrawBitmapString(label, -46, height/2+6);
}
ofPopMatrix();
}
void ofApp::keyPressed(int key){
}
void ofApp::keyReleased(int key){
}
void ofApp::mouseMoved(int x, int y){
}
void ofApp::mouseDragged(int x, int y, int button){
}
void ofApp::mousePressed(int x, int y, int button){
}
void ofApp::mouseReleased(int x, int y, int button){
}
void ofApp::mouseEntered(int x, int y){
}
void ofApp::mouseExited(int x, int y){
}
void ofApp::windowResized(int w, int h){
}
void ofApp::gotMessage(ofMessage msg){
}
void ofApp::dragEvent(ofDragInfo dragInfo){
}
Comments