{"id":409,"date":"2010-02-10T11:13:38","date_gmt":"2010-02-10T17:13:38","guid":{"rendered":"http:\/\/www.tamarziv.com\/itp\/?p=409"},"modified":"2010-02-10T11:15:07","modified_gmt":"2010-02-10T17:15:07","slug":"w03-orbitalbrush","status":"publish","type":"post","link":"https:\/\/www.tamarziv.com\/itp\/w03-orbitalbrush\/","title":{"rendered":"W03-OrbitalBrush"},"content":{"rendered":"<p><a href='http:\/\/itp.nyu.edu\/~tz346\/PxP\/w03\/PxP_W03-orbitalBrush.zip' >OrbitalBrush Source<\/a> | <a href='http:\/\/itp.nyu.edu\/~tz346\/PxP\/w03\/OrbitalBrush.app.zip'  target='new'>Download the app<\/a><\/p>\n<p><img src='http:\/\/www.tamarziv.com\/itp\/wp-content\/themes\/tma\/images\/uploads\/orbitBrush.jpg' alt='PXP'  width=650><br \/>\n<\/br><br \/>\nThis app is a simple manipulation of <a href=\"http:\/\/itp.nyu.edu\/pixels\/s10\/Class_2\/PxP-Paint-Pixels.zip\" target='new'>PxP Paint Pixels<\/a>. The brush itself is a gradient, determined by the distance of the pixels within the brush from the location of the mouse, the brush itself is then offset from the mouse location and orbits around it, in order to do so, I have moved it to the draw loop. The arrow keys mapped to control the brush size.<\/p>\n<p><\/br><br \/>\n<\/br><\/p>\n<div class=\"codecolorer-container cpp default\" style=\"overflow:auto;white-space:nowrap;width:648px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/>115<br \/>116<br \/>117<br \/>118<br \/>119<br \/>120<br \/>121<br \/>122<br \/>123<br \/>124<br \/>125<br \/>126<br \/>127<br \/>128<br \/>129<br \/><\/div><\/td><td><div class=\"cpp codecolorer\"><span class=\"coMULTI\">\/*&nbsp; &nbsp; &nbsp; ITP Pixel by Pixel <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Paint pixels<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; drag mouse to paint<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Danny Rozin 2010<br \/>\n*\/<\/span><br \/>\n<br \/>\n<span class=\"co2\">#include &quot;testApp.h&quot;<\/span><br \/>\n<span class=\"kw4\">int<\/span> R<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span>,G<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span>,B<span class=\"sy1\">=<\/span><span class=\"nu0\">0<\/span>, brushSize <span class=\"sy1\">=<\/span><span class=\"nu0\">20<\/span>, percent <span class=\"sy1\">=<\/span> <span class=\"nu0\">550<\/span><span class=\"sy4\">;<\/span> <span class=\"kw4\">float<\/span> theta <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span> &nbsp;<br \/>\n<span class=\"co1\">\/\/************** Everything you want to happen once in the begining, but don't draw anything to the creen here a it will not work ****************<\/span><br \/>\n<br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">setup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>&nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; ofBackground<span class=\"br0\">&#40;<\/span><span class=\"nu0\">255<\/span>,<span class=\"nu0\">255<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ background color <\/span><br \/>\n&nbsp; &nbsp; ofSetFrameRate<span class=\"br0\">&#40;<\/span><span class=\"nu0\">30<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> &nbsp;<br \/>\n&nbsp; &nbsp; width <span class=\"sy1\">=<\/span> ofGetWidth<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; height <span class=\"sy1\">=<\/span> ofGetHeight<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; ourTexture <span class=\"sy1\">=<\/span> <span class=\"sy2\">*<\/span> <span class=\"kw3\">new<\/span> ofTexture<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ create an ofTexture to hold our image info<\/span><br \/>\n&nbsp; &nbsp; ourTexture.<span class=\"me1\">allocate<\/span><span class=\"br0\">&#40;<\/span>width, height, GL_RGB<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ allocate memory for the ofTextue (This is RGB no Alpha)<\/span><br \/>\n&nbsp; &nbsp; ourPixels <span class=\"sy1\">=<\/span> <span class=\"kw3\">new<\/span> <span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">char<\/span><span class=\"br0\">&#91;<\/span>width<span class=\"sy2\">*<\/span>height<span class=\"sy2\">*<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ create a pixel array to keep our processed pixel data (RGB, no Alpha).<\/span><br \/>\n&nbsp; &nbsp; ofEnableAlphaBlending<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ turn on alpha blending<\/span><br \/>\n&nbsp; &nbsp; ofEnableSmoothing<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/******************This time we put most of the interesting stuff into the mouseDragged method cause we want to paint only when we drag************<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">mouseDragged<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> x, <span class=\"kw4\">int<\/span> y, <span class=\"kw4\">int<\/span> button<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; <br \/>\n<span class=\"kw4\">float<\/span> mouseXOff <span class=\"sy1\">=<\/span> mouseX<span class=\"sy2\">+<\/span><span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>ofRadToDeg<span class=\"br0\">&#40;<\/span>theta<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <span class=\"kw4\">float<\/span> mouseYOff <span class=\"sy1\">=<\/span> mouseY<span class=\"sy2\">+<\/span><span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>ofRadToDeg<span class=\"br0\">&#40;<\/span>theta<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <br \/>\n<span class=\"co1\">\/\/&nbsp; R+=ofRandom(-10,10);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ let the R,G,B values wonder arround randomly...<\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; R=ofClamp(R,0,255); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ but make sure they are still 0- 255<\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; <\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; G+=ofRandom(-10,10);<\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; G=ofClamp(G,0,255);<\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; <\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; B+=ofRandom(-10,10);<\/span><br \/>\n<span class=\"co1\">\/\/&nbsp; B=ofClamp(B,0,255);<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; ofEnableSmoothing<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> colorOffset <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> x<span class=\"sy1\">=<\/span>mouseXOff<span class=\"sy2\">-<\/span>brushSize<span class=\"sy4\">;<\/span>x<span class=\"sy1\">&lt;<\/span> mouseXOff<span class=\"sy2\">+<\/span>brushSize<span class=\"sy4\">;<\/span>x<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ repeat loop of 50 x 50 pixels around the mouse<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> y<span class=\"sy1\">=<\/span>mouseYOff<span class=\"sy2\">-<\/span>brushSize<span class=\"sy4\">;<\/span>y<span class=\"sy1\">&lt;<\/span> mouseYOff<span class=\"sy2\">+<\/span>brushSize<span class=\"sy4\">;<\/span>y<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ if (ofRandom(0,1000) &gt; percent){ <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>x<span class=\"sy1\">&gt;<\/span><span class=\"nu0\">0<\/span> &nbsp;<span class=\"sy3\">&amp;&amp;<\/span> y<span class=\"sy1\">&gt;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy3\">&amp;&amp;<\/span> y<span class=\"sy1\">&lt;<\/span> height<span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ check that we are not accessing pixels outside the bounds of our array &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>ofDist<span class=\"br0\">&#40;<\/span>x,y,mouseXOff,mouseYOff<span class=\"br0\">&#41;<\/span><span class=\"sy1\">&lt;<\/span> brushSize<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ constrict the brush to a circle by checking that the pixel is not more than... <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw4\">int<\/span> colorOffset <span class=\"sy1\">=<\/span> ofMap<span class=\"br0\">&#40;<\/span>ofDist<span class=\"br0\">&#40;<\/span>x,y,mouseXOff,mouseYOff<span class=\"br0\">&#41;<\/span>,<span class=\"nu0\">0<\/span>,brushSize,<span class=\"nu0\">0<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; R<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span><span class=\"sy2\">-<\/span>colorOffset<span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ let the R,G,B values wonder arround randomly...<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; R<span class=\"sy1\">=<\/span>ofClamp<span class=\"br0\">&#40;<\/span>R,<span class=\"nu0\">10<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ but make sure they are still 0- 255<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; G<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span><span class=\"sy2\">-<\/span>colorOffset<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; G<span class=\"sy1\">=<\/span>ofClamp<span class=\"br0\">&#40;<\/span>G,<span class=\"nu0\">10<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span><span class=\"sy2\">-<\/span>colorOffset<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B<span class=\"sy1\">=<\/span>ofClamp<span class=\"br0\">&#40;<\/span>B,<span class=\"nu0\">10<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ourSetPixel<span class=\"br0\">&#40;<\/span>x,y,R,G,B,width,ourPixels<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <span class=\"br0\">&#125;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/&nbsp; brushSize away from the mouse &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/} <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> &nbsp; <br \/>\n<br \/>\n&nbsp; &nbsp; <br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"co1\">\/\/********************************************* Code in draw() execute every frame, &nbsp;**********************************************************<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">draw<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw4\">float<\/span> offset <span class=\"sy1\">=<\/span> <span class=\"nu0\">2<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">float<\/span> mouseXOff <span class=\"sy1\">=<\/span> mouseX<span class=\"sy2\">+<\/span>offset<span class=\"sy2\">*<\/span>brushSize<span class=\"sy2\">*<\/span><span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>ofRadToDeg<span class=\"br0\">&#40;<\/span>theta<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <span class=\"kw4\">float<\/span> mouseYOff <span class=\"sy1\">=<\/span> mouseY<span class=\"sy2\">+<\/span>offset<span class=\"sy2\">*<\/span>brushSize<span class=\"sy2\">*<\/span><span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>ofRadToDeg<span class=\"br0\">&#40;<\/span>theta<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <br \/>\n<br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> colorOffset <span class=\"sy1\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> x<span class=\"sy1\">=<\/span>mouseXOff<span class=\"sy2\">-<\/span>brushSize<span class=\"sy4\">;<\/span>x<span class=\"sy1\">&lt;<\/span> mouseXOff<span class=\"sy2\">+<\/span>brushSize<span class=\"sy4\">;<\/span>x<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ repeat loop of 50 x 50 pixels around the mouse<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> y<span class=\"sy1\">=<\/span>mouseYOff<span class=\"sy2\">-<\/span>brushSize<span class=\"sy4\">;<\/span>y<span class=\"sy1\">&lt;<\/span> mouseYOff<span class=\"sy2\">+<\/span>brushSize<span class=\"sy4\">;<\/span>y<span class=\"sy2\">++<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ if (ofRandom(0,1000) &gt; percent){ <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>x<span class=\"sy1\">&gt;<\/span><span class=\"nu0\">0<\/span> &nbsp;<span class=\"sy3\">&amp;&amp;<\/span> y<span class=\"sy1\">&gt;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy3\">&amp;&amp;<\/span> y<span class=\"sy1\">&lt;<\/span> height<span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ check that we are not accessing pixels outside the bounds of our array &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>ofDist<span class=\"br0\">&#40;<\/span>x,y,mouseXOff,mouseYOff<span class=\"br0\">&#41;<\/span><span class=\"sy1\">&lt;<\/span> brushSize<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ constrict the brush to a circle by checking that the pixel is not more than... <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw4\">int<\/span> colorOffset <span class=\"sy1\">=<\/span> ofMap<span class=\"br0\">&#40;<\/span>ofDist<span class=\"br0\">&#40;<\/span>x,y,mouseXOff,mouseYOff<span class=\"br0\">&#41;<\/span>,<span class=\"nu0\">0<\/span>,brushSize,<span class=\"nu0\">0<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; R<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span><span class=\"sy2\">-<\/span>colorOffset<span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ let the R,G,B values wonder arround randomly...<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; R<span class=\"sy1\">=<\/span>ofClamp<span class=\"br0\">&#40;<\/span>R,<span class=\"nu0\">0<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ but make sure they are still 0- 255<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; G<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span><span class=\"sy2\">-<\/span>colorOffset<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; G<span class=\"sy1\">=<\/span>ofClamp<span class=\"br0\">&#40;<\/span>G,<span class=\"nu0\">0<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B<span class=\"sy1\">=<\/span><span class=\"nu0\">255<\/span><span class=\"sy2\">-<\/span>colorOffset<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B<span class=\"sy1\">=<\/span>ofClamp<span class=\"br0\">&#40;<\/span>B,<span class=\"nu0\">0<\/span>,<span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ourSetPixel<span class=\"br0\">&#40;<\/span>x,y,R,G,B,width,ourPixels<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> <span class=\"br0\">&#125;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/&nbsp; brushSize away from the mouse &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/} <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> theta<span class=\"sy2\">+<\/span><span class=\"sy1\">=<\/span> <span class=\"nu16\">0.0001<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> &nbsp; <br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <br \/>\n<br \/>\n&nbsp; &nbsp; <br \/>\n<br \/>\n&nbsp; &nbsp; ourTexture.<span class=\"me1\">loadData<\/span><span class=\"br0\">&#40;<\/span>ourPixels, width, height, GL_RGB<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ This loads the pixels array into the OF texture<\/span><br \/>\n&nbsp; &nbsp; ourTexture.<span class=\"me1\">draw<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span>,<span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ this draws the texture to the screen<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">printf<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;percent = %i <span class=\"es1\">\\n<\/span>&quot;<\/span>, percent<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ prints our variable to the console<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; ofEllipse<span class=\"br0\">&#40;<\/span>mouseXOff, mouseYOff, <span class=\"nu0\">10<\/span>, <span class=\"nu0\">10<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"co1\">\/\/********************** &nbsp;Pixel by Pixel course method that sets a pixel RGB in an x, y position in a pixel array ***********************<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">ourSetPixel<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> horizontal,<span class=\"kw4\">int<\/span> vertical,<span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">char<\/span> R,<span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">char<\/span> G,<span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">char<\/span> B,<span class=\"kw4\">int<\/span> arrayWidth, <span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">char<\/span> pixels<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> thisPixel <span class=\"sy1\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"sy2\">*<\/span><span class=\"br0\">&#40;<\/span>arrayWidth <span class=\"sy2\">*<\/span> vertical <span class=\"sy2\">+<\/span>horizontal<span class=\"br0\">&#41;<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; pixels<span class=\"br0\">&#91;<\/span>thisPixel<span class=\"br0\">&#93;<\/span><span class=\"sy1\">=<\/span>R<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; pixels<span class=\"br0\">&#91;<\/span>thisPixel<span class=\"sy2\">+<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">=<\/span>G<span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; pixels<span class=\"br0\">&#91;<\/span>thisPixel<span class=\"sy2\">+<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">=<\/span>B<span class=\"sy4\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"co1\">\/\/--------------------------------------------------------------<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">keyPressed<\/span> &nbsp;<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> key<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>key <span class=\"sy1\">==<\/span> &nbsp;OF_KEY_UP<span class=\"br0\">&#41;<\/span> brushSize<span class=\"sy2\">++<\/span><span class=\"sy4\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>key <span class=\"sy1\">==<\/span> &nbsp;OF_KEY_DOWN<span class=\"br0\">&#41;<\/span> brushSize<span class=\"sy2\">--<\/span><span class=\"sy4\">;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">update<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">mouseMoved<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> x, <span class=\"kw4\">int<\/span> y <span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">keyReleased<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> key<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">mousePressed<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> x, <span class=\"kw4\">int<\/span> y, <span class=\"kw4\">int<\/span> button<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw4\">void<\/span> testApp<span class=\"sy4\">::<\/span><span class=\"me2\">mouseReleased<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>&nbsp; <span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n","protected":false},"excerpt":{"rendered":"<p>This app is a simple manipulation of <a href=\"http:\/\/itp.nyu.edu\/pixels\/s10\/Class_2\/PxP-Paint-Pixels.zip\" target='new'>PxP Paint Pixels<\/a>. The brush itself is a gradient, determined by the distance of the pixels within the brush from the location of the mouse, the brush itself is then offset from the mouse location and orbits around it, in order to do so, I have moved it to the draw loop. The arrow keys mapped to control the brush size.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[12],"tags":[],"class_list":["post-409","post","type-post","status-publish","format-standard","hentry","category-pxp"],"_links":{"self":[{"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/posts\/409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/comments?post=409"}],"version-history":[{"count":4,"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/posts\/409\/revisions"}],"predecessor-version":[{"id":413,"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/posts\/409\/revisions\/413"}],"wp:attachment":[{"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/media?parent=409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/categories?post=409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tamarziv.com\/itp\/wp-json\/wp\/v2\/tags?post=409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}