<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description></description><title>openFrameworks, a C++ toolkit for creative coding</title><generator>Tumblr (3.0; @openframeworks-blog)</generator><link>http://blog.openframeworks.cc/</link><item><title>Donations</title><description>&lt;p&gt;Today we are opening the openFrameworks
&lt;a href="http://openframeworks.cc/donations"&gt;donations&lt;/a&gt; page!&lt;/p&gt;

&lt;p&gt;For years we’ve developed openFrameworks through the voluntary, non-paid
contributions of many people around the world.&lt;/p&gt;

&lt;p&gt;These contributions are often part of the process of people using openFrameworks for their work or practice. As they discover bugs or need new features, they contribute these changes back to openFrameworks, benefiting the community and project as whole.&lt;/p&gt;

&lt;p&gt;This workflow has worked fairly well for openFrameworks up to this point.  However it means that the growth of the project is limited by the particular interests and available time of contributors and has meant that some areas of the project have fallen behind.&lt;/p&gt;

&lt;p&gt;We are opening up the donations page to fund some of these areas and to help OF continue forward in a more sustainable way. Your donations will contribute to the following:&lt;/p&gt;

&lt;h2&gt;Documentation&lt;/h2&gt;

&lt;p&gt;Documentation is one of the main areas that has been behind the rest of the project. We think that it could be that the users who are confident enough to contribute to the openFrameworks codebase don’t rely as much on the the documentation and the people who do rely on it and run into unclear or missing documentation usually don’t feel confident enough to contribute to it.&lt;/p&gt;

&lt;p&gt;We’ve organized documentation sprints which has been helpful in the short term, but it doesn’t take long for the documentation to begin to drift out of sync with this codebase and as it is an area where there isn’t active ongoing contributions we believe it needs us to take a different approach.&lt;/p&gt;

&lt;p&gt;With financial contributions from individuals, companies and institutions we would be able to fund a team, over the long term to work on the documentation, make sure it was up to date with the API and provide good examples and tutorials for all areas of the project.&lt;/p&gt;

&lt;h2&gt;Infrastructure&lt;/h2&gt;

&lt;p&gt;As the openFrameworks project has grown we are relying on wide range of services and infrastructure to keep the project running. We have a distributed build system, continuous integration services ( CI ) that allow us to check that changes don’t break the codebase and a tool for compiling all the libraries for the many different platforms OF supports ( Apothecary ).&lt;/p&gt;

&lt;p&gt;There is also a lot of work that needs to be done not directly related to using OF itself, like maintaining the forum, updating the CI or fixing the multiple servers we use when something breaks, as well as keeping them up to date. Maintaining these services and development systems is something we’ve been doing up until now unpaid, but the amount of time it requires isn’t sustainable to continue in the long term.&lt;/p&gt;

&lt;h2&gt;Diversity&lt;/h2&gt;

&lt;p&gt;Making openFrameworks more accessible and the community of users more diverse is another big goal of the project that we think we can really improve if we have a significant and ongoing financial contribution.&lt;/p&gt;

&lt;p&gt;Until now we’ve been relying on a community of contributors who had enough free time to work on the project but we&amp;rsquo;ve come to realize that because of very different factors like for example, wages inequality, it is much harder for some people like women, people of color or people living in developing countries to work without being paid in their free time. By being able to pay for some contributions we expect to help overcome that barrier and increase range of people contributing and shaping the future of openFrameworks.&lt;/p&gt;

&lt;h2&gt;A more sustainable model&lt;/h2&gt;

&lt;p&gt;Opening up the donations page is only a first step. We are currently working on the outline for a more sustainable model for openFrameworks, which would allow the project to get broader, institutional level funding. Individual donations in the meantime will help immensely with us moving quicker towards our goals, offloading work onto a more diverse group of contributors and help achieve more regular, higher quality and better documented releases.&lt;/p&gt;

&lt;h2&gt;To donate&lt;/h2&gt;

&lt;p&gt;If you have used openFrameworks in your personal practice, or you represent a studio or company that has used openFrameworks in your work and you would like to financially support the project, please do so now at the donations link below.&lt;/p&gt;

&lt;p&gt;Thanks for your &lt;a href="http://openframeworks.cc/donations"&gt;support&lt;/a&gt;!&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/173672074899</link><guid>http://blog.openframeworks.cc/post/173672074899</guid><pubDate>Mon, 07 May 2018 10:51:03 -0400</pubDate><category>openframeworks</category><category>donations</category><category>diversity</category><category>financial support</category></item><item><title>glm</title><description>&lt;h2&gt;OpenGL Mathematics&lt;/h2&gt;

&lt;p&gt;OpenGL Mathematics &lt;a href="https://glm.g-truc.net/0.9.8/index.html"&gt;GLM&lt;/a&gt; has become the defacto standard for graphics vector math in C++ in the latest years. It&amp;rsquo;s syntax mimics that of glsl so working with it while working with OpenGL, shaders&amp;hellip; makes things easier cause the syntax is almost the same across the different languages.&lt;/p&gt;

&lt;p&gt;openFrmaeworks, since version 0.10 uses GLM as it&amp;rsquo;s default vector math library in the core and although old projects using ofVec* classes should work with minimal changes, if you are starting a new project we recomend to use GLM instead.&lt;/p&gt;

&lt;h3&gt;Namespace&lt;/h3&gt;

&lt;p&gt;GLM classes and functions are in the &lt;code&gt;glm&lt;/code&gt; namespace so to use them you need to either prefix them with &lt;code&gt;glm::&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v(2.f, 2.f, 2.f);
float l = glm::length(v);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or in your &lt;code&gt;.cpp&lt;/code&gt; files import the &lt;code&gt;glm&lt;/code&gt; namespace at the very beginning:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using namespace glm;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then use the classes and functions without prefix:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vec3 v(2.f, 2.f, 2.f);
float l = length(v);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Functions not methods&lt;/h3&gt;

&lt;p&gt;GLM classes like vectors, matrices or quaternions don&amp;rsquo;t have methods. Instead glm uses functions to operate on those classes so if you want to for example normalize a vector you would do:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v(2.f, 2.f, 2.f);
glm::vec3 n = glm::normalize(v);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The only exceptions to this rule are operators which you don&amp;rsquo;t use directly but instead allow to do arithmetic operations so you can do things like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v1(1.f, 1.f, 1.f);
glm::vec3 v2(2.f, 2.f, 2.f);
glm::vec3 v3 = v1 + v2;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Warning&lt;/h3&gt;

&lt;p&gt;GLM vector have a static &lt;code&gt;length&lt;/code&gt; function which returns the dimension of the vector type, so &lt;code&gt;glm::vec2::length()&lt;/code&gt; returns 2, &lt;code&gt;glm::vec3::length()&lt;/code&gt; returns 3&amp;hellip;&lt;/p&gt;

&lt;p&gt;Because C++ allows to call static methods on instances of that class you can make the &lt;strong&gt;error&lt;/strong&gt; of calling:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v(2.f, 2.f, 2.f);
float length = v.length();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To try and get the length of the vector instead of the number of dimensions of the type. The correct way of doing that would be:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v(2.f, 2.f, 2.f);
float length = glm::length(v);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mostly when porting old code form ofVec to glm, because ofVec included such a method, it&amp;rsquo;s easy to try and call that function which will compile without errors but won&amp;rsquo;t do what you expect.&lt;/p&gt;

&lt;p&gt;When doing that, most modern compilers should show a warning because of calling a static method on an instance instead of a class, so be on the look for those when porting old code to GLM.&lt;/p&gt;

&lt;h3&gt;Type strictness&lt;/h3&gt;

&lt;p&gt;glm has a strict type system, similar to how things work in glsl, meaning that you can&amp;rsquo;t autoconvert from one type to another automatically as it was the case with ofVectorMath.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec2 v2(2.f, 2.f);
glm::vec3 v3 = v2;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Won&amp;rsquo;t work anymore, you need to do now:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v3 = glm::vec3(v2, 0.f);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or in the oposite case:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v3(2.f, 2.f, 2.f);
glm::vec2 v2 = glm::vec2(v3)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;or even:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec2 v2(v3)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Constants&lt;/h3&gt;

&lt;p&gt;GLM has some useful constants but the way to use them might be a little bit weird at first. The main problem comes from the fact that this constants are defined as templated functions so to call them you need to specify the type as in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;float p = glm::pi&amp;lt;float&amp;gt;();
double dp = glm::pi&amp;lt;double&amp;gt;();
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Multiplication order&lt;/h3&gt;

&lt;p&gt;Finally, if you are used to the old openFrameworks vector math classes you would multiply vector and matrices like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ofVec3 v;
ofVec3f projected = v * model * view * projection;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with glm as in glsl the multiplication order is the oposite so now you would do:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glm::vec3 v;
glm::vec3 projected = projection * view * model * v;
&lt;/code&gt;&lt;/pre&gt;</description><link>http://blog.openframeworks.cc/post/173546759884</link><guid>http://blog.openframeworks.cc/post/173546759884</guid><pubDate>Thu, 03 May 2018 11:08:36 -0400</pubDate><category>openframeworks</category><category>glm</category><category>graphics</category><category>vector math</category><category>math</category><category>opengl</category></item><item><title>Android refactoring</title><description>&lt;p&gt;Many OpenFrameworks Android apps are composed from a single activity, which derives from OFActivity and allow you to draw GL content in a canvas. This fits most cases. However, sometimes you need multiple activities, some with GL drawing and some without. OpenFrameworks Android supports such cases.&lt;/p&gt;

&lt;h2&gt;Add application initialization code&lt;/h2&gt;

&lt;p&gt;We can distinguish between application initialization and gl initialization. There are two methods in main.cpp, one for each. In most cases, there’s nothing to do in ‘ofAndroidApplicationInit’, and in ‘ofAndroidActivityInit’ we initialize the ofApp class.&lt;/p&gt;

&lt;p&gt;‘ofAndroidApplicationInit’ allow you to do some initialization when the cpp side is created, even if the first activity is not a gl activity (for example, a completely native splash activity).&lt;/p&gt;

&lt;p&gt;‘ofAndroidActivityInit’ is called when the gl canvas is initialized. This happens when the first OFActivity is created. Notice that if a second OFActivity is created on top of it, the canvas is recycled and this initialization code is not called again. However, if all OFActivites are destroyed, the canvas is indeed destroyed so when a new OFActivity is created, ‘ofAndroidActivityInit’ will be called again.  The default implementation for this method instantiates the ofApp class, but you can add more code to it as needed.&lt;/p&gt;

&lt;p&gt;Note that due to current architectural constraints, all activities share a single ofApp class and a single canvas. You cannot switch to different ofApp classes for drawing different activities as OpenFrameworks cannot currently hold multiple instances of the ofApp class in memory. It is up to you to signal the cpp side when a different activity is shown (when onResume is called on that activity), and perform different update/draw code to draw different content on the canvas.&lt;/p&gt;

&lt;h2&gt;Customizing the Android activity&lt;/h2&gt;

&lt;p&gt;OpenFrameworks supplies a base activity called OFActivity when the following conditions suits the project:&lt;/p&gt;

&lt;p&gt;1) The first activity is this activity, meaning, the first activity in the application shows a gl canvas.
2) You want your activity to inherit from regular Android Activity class.&lt;/p&gt;

&lt;p&gt;However, OpenFrameworks allows for more complicated scenarios, like having the first activity initializing the cpp side, but not the gl drawing (the first activity doesn’t draw gl at all, for example, a simple splash activity) or inheriting your activities from other classes, for example AppCompatActivity.&lt;/p&gt;

&lt;p&gt;In order to achieve one or both the objectives above, you need to notify OpenFrameworks yourself on certain events, just like the original OFActivity does it:&lt;/p&gt;

&lt;p&gt;In ANY activity in the application:&lt;/p&gt;

&lt;p&gt;1) Whenever ANY activity is created OR resumed, you need to notify OpenFrameworks about it by calling OFAndroidLifeCycle.setActivity with this activity.
2) On the first activity created, you need to call OFAndroidLifeCycle.init() in order to initialize the cpp side. If this activity SHOULD NOT draw GL, you should call it with the parameter false in order to postpone canvas initialization.&lt;/p&gt;

&lt;p&gt;In gl drawing activities:&lt;/p&gt;

&lt;p&gt;1) in onCreate, call OFAndroidLifeCycle.glCreate()
2) in onResume, call OFAndroidLifeCycle.glResume()
3) in onPause, call OFAndroidLifeCycle.glPause()
4) in onDestroy, call OFAndroidLifeCycle.glDestroy()&lt;/p&gt;

&lt;p&gt;You can look at the original OFActivity as a reference, and there’s also a detailed example with multiple activities in the android examples folder, called androidMultiOFActivityExample.&lt;/p&gt;

&lt;p&gt;Tal Lavi &amp;amp; Artem Pyatishev.&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/173449496854</link><guid>http://blog.openframeworks.cc/post/173449496854</guid><pubDate>Mon, 30 Apr 2018 10:02:01 -0400</pubDate><category>openframeworks</category><category>android</category></item><item><title>OpenGL new features</title><description>&lt;h2&gt;Transform feedback&lt;/h2&gt;

&lt;p&gt;Transform feedback is a relatively new feature in opengl (present since 4.3 and so not available in macos). It allows to store the output of a vertex, geometry or tessellation shader into a buffer object.&lt;/p&gt;

&lt;p&gt;For example we can draw a sphere in an ofVboMesh, draw it using a vertex shader that deforms the vertices using a noise function and get the result in a new buffer, then we can assign that buffer to an ofVbo for drawing.&lt;/p&gt;

&lt;p&gt;This allows to do expensive transformations in the GPU only once, store them and then draw them instead of having to do the calculations every frame.&lt;/p&gt;

&lt;p&gt;It also allows to do several steps of vertex shaders for example or to generate geometry with a geometry shader and then use a different vertex shader to draw&amp;hellip;&lt;/p&gt;

&lt;p&gt;The download for 0.10.0 for windows and linux, includes an example explaining how to use it in gl/tranformFeedbackExample&lt;/p&gt;

&lt;p&gt;That example generates a mesh with a certain number of points but without setting them at all then draws the mesh using a shader with a transform feedback which modifies the poitns to distribute them along the surface of a semi-sphere uniformly and sets each vertex color depending on their position.&lt;/p&gt;

&lt;p&gt;The resulting buffer is assigned to a vbo and drawn later in the draw function without having to calculate the positions every frame.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://78.media.tumblr.com/1ce7517833c171e6124b56b232f37c88/tumblr_inline_p7owlswMBc1sbgmkt_540.gif" alt=""/&gt;&lt;/p&gt;

&lt;h2&gt;GL debug callback&lt;/h2&gt;

&lt;p&gt;OpenGL provides an extension (promoted to core in 4.3, which again means it won’t work in macos) that allows to debug the context for errors.&lt;/p&gt;

&lt;p&gt;In OF 0.10.0 you can now call:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ofEnableGLDebugLog()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And if any error or any other internal message happens you&amp;rsquo;ll get a debug trace in the console. You can even set a breakpoint while debugging inside ofGLUtils.cpp in the function gl_debug_callback to know which call is producing the message. Once the breakpoint is set the debugger will stop whenever a message happens and you can see in the stacktrace the original in your code that is triggering it.&lt;/p&gt;

&lt;p&gt;This is useful to debug obscure GL bugs like buffers not correctly bound or similar problems which are really hard to debug usually.&lt;/p&gt;

&lt;p&gt;To disable the logging you can call:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ofDisableGLDebugLog()
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Custom materials extensions&lt;/h2&gt;

&lt;p&gt;ofMaterial, when used with opengl version 3 or more runs internally a glsl program that calculates the phong shading per fragment using all the lights enabled at that moment.&lt;/p&gt;

&lt;p&gt;Sometimes we want to change the behaviour of that shader. To do so, since 0.10.0 you can setup a material using &lt;code&gt;ofMaterialSettings&lt;/code&gt; and there specify a function which will be called after the lighting has been calculated. It receives the final color of the fragment as parameter and returns the modified color which will be the final color assign to that fragment:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vec4 postFragment(vec4 localColor){
   return localColor;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That function has access to all the uniforms and varyings available in the fragment shader but we can also specify additional uniforms by using &lt;code&gt;customUniforms&lt;/code&gt; in &lt;code&gt;ofMaterialSettings&lt;/code&gt; and then &lt;code&gt;setCustomUniform*&lt;/code&gt; while we use the material.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s more information in the header of &lt;code&gt;ofMaterial&lt;/code&gt; and soon in the online docs in the OF site&lt;/p&gt;

&lt;p&gt;Arturo&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/173258830179</link><guid>http://blog.openframeworks.cc/post/173258830179</guid><pubDate>Tue, 24 Apr 2018 09:27:52 -0400</pubDate></item><item><title>Events</title><description>&lt;h2&gt;ofEventListener&lt;/h2&gt;

&lt;p&gt;Up until now listening to an event in OF looked something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ofAddListener(ofEvents().mouseMovedEvent, this, &amp;amp;MyClass::mouseMoved);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And removing the listener:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ofRemoveListener(ofEvents().mouseMovedEvent, this, &amp;amp;MyClass::mouseMoved);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That has several problems mainly if we want to add a class to listen to a mouse event we would be tempted to do something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;br/&gt;class CircleMovingWithMouse{
public:
  CircleMovingWithMouse(){
    ofAddListener(ofEvents().mouseMovedEvent, this, CircleMovingWithMouse::mouseMoved);
  }

  ~CircleMovingWithMouse(){
    ofRemveListener(ofEvents().mouse, this, &amp;amp;CircleMovingWtihMouse::mouseMoved);
  }
...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So when creating an instance of that class it would listen to the mouse and when the object is destroyed it’ll remove itself as a listener so there’s no calls once the object has been destroyed, otherwise we would get a crash.&lt;/p&gt;

&lt;p&gt;The problem with this is if we do something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void ofApp::setup(){
  CircleMovingWithMouse circle;
  circles.push_back(circle);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The circle won’t receive the events anymore cause the copy won’t be listening to events anymore and the original will be destroyed as soon as we go out of setup.&lt;/p&gt;

&lt;p&gt;Even worse if we try to put this class in a vector as before but register the event after we add it like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void ofApp::setup(){
  for(int i = 0; i&amp;lt;10; i++){
    CircleMovingWithMouse circle;
    circles.push_back(circle);
    circles.back().registerEvents()
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The vector will move it&amp;rsquo;s objects in memory when it runs out of contiguous memory which will make the address for our objects stored in the event invalid so we will likely get a segmentation fault and the application will crash.&lt;/p&gt;

&lt;p&gt;By the rule of 3 (the rule of 5 since c++11) &lt;a href="https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)"&gt;https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)&lt;/a&gt; when we add a destructor as we did above we should also implement a copy constructor and equal operator.&lt;/p&gt;

&lt;p&gt;Doing so would solve our problem if in the copy constructor we re-add the new copy as a listener as well. But introducing a copy constructor is error prone since from now on we’ll need to copy every new member we add to the class.&lt;/p&gt;

&lt;p&gt;To solve this issues in 0.10 we’ve introduced a new way to listen to events: ofEventListener. Now to listen to an event the preferred method is something like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;br/&gt;class CircleMovingWithMouse{
private:
  ofEventListener listener;

public:
  CircleMovingWithMouse(){
    listener = ofEvents().mouseMovedEvent.newListener(this, &amp;amp;CircleMovingWithMouse::mouseMoved);
  }

}

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The listener will now auto unregister itself when the object is destroyed so there&amp;rsquo;s no need for a explicit destructor. Also ofEventListener forbids to copy (or even move) an instance of a class containing it so if you now try to put a class listening to an event into a vector you&amp;rsquo;ll get a compiler error.&lt;/p&gt;

&lt;p&gt;You can still work around it by creating your copy/move constructors and equal operator but at least the error happens at compile instead of at run time.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s still not recommended to implement copy constructors since it&amp;rsquo;s really error prone and difficult to maintain. Instead if you want for example a collection of objects that listen to an event like the above you can put them in a collection that won&amp;rsquo;t move it&amp;rsquo;s elements in memory as a vector does, like a &lt;code&gt;list&lt;/code&gt; or a &lt;code&gt;deque&lt;/code&gt; and create them using &lt;code&gt;emplace_back&lt;/code&gt;instead of &lt;code&gt;push_back&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;std::list&amp;lt;CircleMovingWtihMouse&amp;gt; circles;

objects.emplace_back(); // This crreates a new object in the list
objects.back().doSomething();  //This calls a method on the last element added to the list
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There&amp;rsquo;s some limitations to this collections, for example you won&amp;rsquo;t be able to access a random position on a &lt;code&gt;list&lt;/code&gt;, only to iterate thorough all it&amp;rsquo;s elements as in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for(CircleMovingWtihMouse &amp;amp; o: objects){
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And you won&amp;rsquo;t be able to remove a random position of a &lt;code&gt;deque&lt;/code&gt; containing listeners cause it would need to move it&amp;rsquo;s elements in memory and the ofEventListener forbids that to avoid illegal memory accesses.&lt;/p&gt;

&lt;p&gt;Another way to work around this is to wrap the objects in a smart pointer before putting them in a vector but be aware that doing so allocates every object in non contiguous locations in the heap so some of the advantages of using a vector are lost.&lt;/p&gt;

&lt;p&gt;In general this new way of using events won&amp;rsquo;t let you do anything that might crash or have an undefined behaviour.&lt;/p&gt;

&lt;p&gt;If you need to add more than one listener to a class you can also use &lt;code&gt;ofEventListeners&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CircleMovingWithMouse{
private:
  ofEventListeners listeners;

public:
  CircleMovingWithMouse(){
    listeners.push(ofEvents().mouseMovedEvent.newListener(this, &amp;amp;CircleMovingWithMouse::mouseMoved);
    listeners.push(ofEvents().mousePressedEvent.newListener(this, &amp;amp;CircleMovingWithMouse::mousePressed);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Key events&lt;/h2&gt;

&lt;p&gt;Key event arguments now carry much more information than before. Until now a key event was just an integer with the ascii for the pressed key but from 0.10.0 and in line with our effort to support UTF8 across the core it now looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ofKeyEventArgs{
public: 
    /// For special keys, one of OF_KEY_* (@see ofConstants.h). For all other keys, the Unicode code point you'd expect if this key combo (including modifier keys that may be down) was pressed in a text editor (same as codepoint).
    int key;
    /// The keycode returned by the windowing system, independent of any modifier keys or keyboard layout settings. For ofAppGLFWWindow this value is one of GLFW_KEY_* (@see glfw3.h) - typically, ASCII representation of the symbol on the physical key, so A key always returns 0x41 even if shift, alt, ctrl are down.
    int keycode;
    /// The raw scan code returned by the keyboard, OS and hardware specific.
    int scancode;
    /// The Unicode code point you'd expect if this key combo (including modifier keys) was pressed in a text editor, or 0 for non-printable characters.
    uint32_t codepoint;
    /// If this is a repeat event
    bool isRepeat;
    /// Key modifiers
    int modifiers = 0;

    bool hasModifier(int modifier){
        return modifiers &amp;amp; modifier;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can keep using &lt;code&gt;ofKeyEventArgs::key&lt;/code&gt; as before but if you want to listen for keypresses to create a text you should use &lt;code&gt;ofKeyEventArgs::codepoint&lt;/code&gt; which holds the utf8 code of the key except in the case of special keys like &lt;code&gt;OF_KEY_SHIFT&lt;/code&gt;, &lt;code&gt;OF_KEY_CONTROL&lt;/code&gt;, &amp;hellip; where it&amp;rsquo;s equal to 0.&lt;/p&gt;

&lt;p&gt;Also when you receive a key event you can also check if a modifier is pressed at the same time using &lt;code&gt;ofKeyEventArgs::hasModifier()&lt;/code&gt; as in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void MyClass::keyPressed(ofKeyEventArgs &amp;amp; key){
    if(key.hasModifier(OF_KEY_CONTROL) &amp;amp;&amp;amp; key.codepoint==`a`){
         ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;hasModifier()&lt;/code&gt; also exists for mouse events so you can query it when a mouse event happens as in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void MyClass::mousePressed(ofMouseEventArgs &amp;amp; mouse){
    if(mouse.hasModifier(OF_KEY_CONTROL) &amp;amp;&amp;amp; mouse.button = OF_MOUSE_LEFT){
         ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The callbacks in ofApp are still the simple ones that just receive the &lt;code&gt;int key&lt;/code&gt; for key events and the position x and y and mouse button for mouse events but you can easily change them to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void ofApp::mousePressed(ofMouseEventArgs &amp;amp; mouse){
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and it&amp;rsquo;ll just work without having to explicitly listen to that event. For any other class but applicaiton instances started with &lt;code&gt;ofRunApp&lt;/code&gt; you&amp;rsquo;ll need to register an event using &lt;code&gt;newListener&lt;/code&gt; (or &lt;code&gt;ofAddListener&lt;/code&gt; / &lt;code&gt;ofRemoveListener&lt;/code&gt;)&lt;/p&gt;

&lt;h2&gt;Lambda functions&lt;/h2&gt;

&lt;p&gt;And finally since 0.10.0 you&amp;rsquo;ll be able to use lambda functions to listen to events instead of having to create a specific method as in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class MyClass{
private:
    ofEventListener listener;

public:
    MyClass(){
        listener = ofEvents().mousePressed.newListener([this]{
            std::cout &amp;lt;&amp;lt; mouse.pos &amp;lt;&amp;lt; std::endl;
        });
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Again since we are using ofEventListener the listener will be unsubscribed automatically when destroyed.&lt;/p&gt;

&lt;p&gt;Lambdas can only be used with &lt;code&gt;newListener&lt;/code&gt; and not with &lt;code&gt;ofAddListener&lt;/code&gt; / &lt;code&gt;ofRemoveListener&lt;/code&gt; for this reason.&lt;/p&gt;

&lt;p&gt;Arturo&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/173223240829</link><guid>http://blog.openframeworks.cc/post/173223240829</guid><pubDate>Mon, 23 Apr 2018 07:48:15 -0400</pubDate></item><item><title>UTF8 support</title><description>&lt;p&gt;In 0.10.0 there’s (finally) full support for UTF8 both as utilities to manipulate strings but also in ofTruetypefont.&lt;/p&gt;&lt;h2&gt;String manipulation&lt;/h2&gt;&lt;p&gt;Some of this utilities where already introduced in 0.9.0 but there&amp;rsquo;s some more now and the API has been cleaned to make it more consistent.&lt;/p&gt;&lt;p&gt;All this functions start as &lt;code&gt;ofUTF8*&lt;/code&gt; and if you want to do something with text which might have characters other than ascci, because UTF8 has variable length characters you should be using this functions instead of the corresponding string methods. for example instead of doing:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
str.insert(pos, chr);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to insert a character you should be using:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
ofUTF8Insert(str, pos, chr)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or when creating a string from keypresses:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
ofUTF8Append(str, key);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;there&amp;rsquo;s also &lt;code&gt;ofUTF8Substring&lt;/code&gt;, &lt;code&gt;ofUTF8ToString&lt;/code&gt; and &lt;code&gt;ofUTF8Length&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Also to iterate over a string don&amp;rsquo;t iterate over it&amp;rsquo;s characters but use:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
for(uint32_t &amp;amp; c: ofUTF8Iterator(str)){
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;ofTrueTypeFont alphabets&lt;/h2&gt;&lt;p&gt;To load a true type font in 0.10 you can now do:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
ofTrueTypeFontSettings settings("EmojiSymbols-Regular.ttf", 64);
settings.antialiased = true;
settings.dpi = 72;
settings.direction = OF_TTF_LEFT_TO_RIGHT;
settings.addRanges(ofAlphabet::Emoji);
ttf.load(settings);
...

ttf.drawString("🍱 🍲 🍳 🍴 🍵 🍶 🍷 🍸 🍹 🍺", 20, 100);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;which looks like:
&lt;/p&gt;&lt;figure class="tmblr-full" data-orig-height="120" data-orig-width="540" data-orig-src="https://78.media.tumblr.com/a81b37711a32117c70024a5a4abe7f5c/tumblr_inline_p7g3mshC9G1sbgmkt_540.png"&gt;&lt;img src="https://78.media.tumblr.com/e6142be7f691273cdea6872341ac6c9f/tumblr_inline_p7hh72uzJJ1sbgmkt_540.png" alt="" data-orig-height="120" data-orig-width="540" data-orig-src="https://78.media.tumblr.com/a81b37711a32117c70024a5a4abe7f5c/tumblr_inline_p7g3mshC9G1sbgmkt_540.png"/&gt;&lt;/figure&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Or:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ofTrueTypeFontSettings settings("Noto Sans CJK JP", 32);
settings.antialiased = true;
settings.dpi = 72;
settings.direction = OF_TTF_LEFT_TO_RIGHT;
settings.addRanges(ofAlphabet::Japanese);
ttf.load(settings);
...
ttf.drawString(
"色はにほへど　散りぬるを\n\
我が世たれぞ　常ならむ\n\
有為の奥山　　今日越えて\n\
浅き夢見じ　　酔ひもせず", 20, 60);
&lt;/code&gt;&lt;/pre&gt;&lt;figure data-orig-width="441" data-orig-height="305" class="tmblr-full"&gt;&lt;img src="https://78.media.tumblr.com/e456e65c1ccc528c37b6fd7060e7fdb8/tumblr_inline_p7h9o6wbmf1sbgmkt_540.png" alt="image" data-orig-width="441" data-orig-height="305"/&gt;&lt;/figure&gt;&lt;p&gt;This one using a font installed in the system by it&amp;rsquo;s name.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;You can setup a font with any unicode range and it&amp;rsquo;ll preload those characters in a texture so it&amp;rsquo;s faster to draw them.&lt;/p&gt;&lt;p&gt;Instead of having to figure out each unicode range there&amp;rsquo;s a set of predefined alphabets that you can pass to addRanges, right now:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
ofAlphabet::Emoji;
ofAlphabet::Japanese;
ofAlphabet::Chinese;
ofAlphabet::Korean;
ofAlphabet::Arabic;
ofAlphabet::Devanagari;
ofAlphabet::Latin;
ofAlphabet::Greek;
ofAlphabet::Cyrillic;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let us know if any of them is wrong or you want us to add any that is missing!&lt;/p&gt;&lt;p&gt;There&amp;rsquo;s still one thing that is not working yet, ligatures, some alphabets like arabic join some combinations of characters, that&amp;rsquo;s still not working but there&amp;rsquo;s tools that you can use to reshape the text and paste it into you OF code (like: &lt;a href="http://mpcabd.xyz/python-arabic-text-reshaper/"&gt;http://mpcabd.xyz/python-arabic-text-reshaper/&lt;/a&gt;). We&amp;rsquo;ll try to figure this one out for next release&lt;/p&gt;&lt;p&gt;Arturo&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;ps: Thanks to Hiroshi Matoba for his help with the Japanese example and figuring out a couple of missing characters in the Japanese alphabet&lt;br/&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/173122543219</link><guid>http://blog.openframeworks.cc/post/173122543219</guid><pubDate>Fri, 20 Apr 2018 05:23:44 -0400</pubDate></item><item><title>ofxGui new features</title><description>&lt;p&gt;The first post in the series about the new features in the 0.10.0 release, is going to be a short one about the gui.&lt;/p&gt;

&lt;h2&gt;Color picker&lt;/h2&gt;

&lt;p&gt;Up until 0.9.8 editing colors in the gui could only be done by adjusting the different rgb values using individual sliders which was not very intuitive:&lt;/p&gt;

&lt;p&gt;In 0.10.0 it looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://78.media.tumblr.com/0c2380f2114160c0d2a28acf33b8a18b/tumblr_inline_p7diy7NBVE1sbgmkt_540.gif" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;The new color picker is based on &lt;a href="https://github.com/julapy/ofxColorPicker"&gt;ofxColorPicker&lt;/a&gt; by Lukasz Karluk adapted to work with ofxGui and ofParameter&lt;/p&gt;

&lt;h2&gt;Text fields&lt;/h2&gt;

&lt;p&gt;In 0.10.0 ofxGui will add a text field for any &lt;code&gt;ofParameter&lt;/code&gt; or you can create it manually using &lt;code&gt;ofxInputField&lt;/code&gt;.
&lt;img src="https://78.media.tumblr.com/94326685206eb2e5d02264c550d5c5d0/tumblr_inline_p7djm2RWdI1sbgmkt_540.gif" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;This new control is based on the original &lt;a href="%5Bhttps://github.com/fx-lange/ofxInputField%5D(https://github.com/fx-lange/ofxInputField)"&gt;ofxInputField&lt;/a&gt; by Felix Lange with additions to better support selection, utf8 and clipboard.&lt;/p&gt;

&lt;p&gt;Additionally any slider can be turned into an input field temporarily by right clicking on it, allowing for much more precise input.
&lt;img src="https://78.media.tumblr.com/5f29fcf332519c0600f520758af2b1b7/tumblr_inline_p7djuqPwFj1sbgmkt_540.gif" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Apart from this, one can now add an &lt;code&gt;ofParameter&amp;lt;void&amp;gt;&lt;/code&gt; in a parameter group to get a button, add listeners to the save and load buttons to override the default save and load behavior:&lt;/p&gt;

&lt;pre&gt;&lt;code class="cpp"&gt;panel.savePressedE.addListener([this]{
    // custom save

    return true; // to mark the event as attended 
                 // so the gui doesn't do the default save
});

panel.loadPressedE.addListener([this]{
    // custom load

    return true; // to mark the event as attended 
                 // so the gui doesn't do the default load
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Also specifying a &amp;ldquo;.json&amp;rdquo; file when creating a panel instead of an &amp;ldquo;.xml&amp;rdquo; will load and save from json.&lt;/p&gt;

&lt;p&gt;Arturo&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/173058400594</link><guid>http://blog.openframeworks.cc/post/173058400594</guid><pubDate>Wed, 18 Apr 2018 05:50:23 -0400</pubDate><category>openframeworks</category><category>0.10.0</category><category>gui</category><category>ofxGui</category></item><item><title>2015/2016 Community Survey</title><description>&lt;p&gt;Hi all,&lt;/p&gt;&lt;p&gt;The annual community survey is live! This survey helps us get information about how people are using openFrameworks, who our community is, and how we can best continue development and support.&lt;/p&gt;&lt;p&gt;It’s helpful to hear from everyone who’s using OF &amp;ndash; so if you’re a total beginner, a longtime expert, a community organizer, a programmer, a student, etc &amp;ndash; all opinions are appreciated! If you’ve filled out the survey in past years, we’d love for you to complete this year’s too.&lt;/p&gt;&lt;p&gt;The survey is published in several languages; feel free to fill out the survey in the language of your choice and the results will be aggregated together.&lt;/p&gt;&lt;p&gt;&lt;b&gt;SURVEY IN ENGLISH:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://goo.gl/forms/TnjXZE4Egr"&gt;http://goo.gl/forms/TnjXZE4Egr&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ENCUESTA EN ESPAÑOL:&lt;br/&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://goo.gl/forms/FIWczPbe0h"&gt;http://goo.gl/forms/FIWczPbe0h&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;SONDAGE EN FRANÇAIS:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://goo.gl/forms/uV2sH2gS2R"&gt;http://goo.gl/forms/uV2sH2gS2R&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;UMFRAGE AUF DEUTSCH:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://goo.gl/forms/JDhT9rquPJ"&gt;http://goo.gl/forms/JDhT9rquPJ&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;日本語での調査:&lt;br/&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://goo.gl/forms/e5zxj6TWNF"&gt;http://goo.gl/forms/e5zxj6TWNF&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;在中国调查:&lt;br/&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://goo.gl/forms/cf7LH7dvkF"&gt;http://goo.gl/forms/cf7LH7dvkF&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Thanks from the OF team!&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/136405669239</link><guid>http://blog.openframeworks.cc/post/136405669239</guid><pubDate>Fri, 01 Jan 2016 15:30:05 -0500</pubDate></item><item><title>openFrameworks 0.9.0: ofThreadChannel, UTF-8 and ofSoundBuffer</title><description>&lt;p&gt;&lt;a href="http://blog.openframeworks.cc/post/133076054194/openframeworks-090-major-changes"&gt;OF 0.9.0 Overview Part 1 - Major Changes&lt;/a&gt;&lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133400454159/openframeworks-090-opengl-45"&gt;OF 0.9.0 Overview Part 2 - OpenGL 4.5&lt;/a&gt;&lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133404337264/openframeworks-090-multi-window-and-ofmainloop"&gt;OF 0.9.0 Overview Part 3 - Multi-window and ofMainLoop&lt;/a&gt; &lt;br/&gt;OF 0.9.0 Overview Part 4 - ofThreadChannel and UTF-8 support &lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;h4&gt;ofThreadChannel&lt;/h4&gt;

&lt;p&gt;Multi-threaded applications are more and more common given that most computers and devices have more than one CPU.&lt;/p&gt;

&lt;p&gt;Threading is useful if we have a process-intensive task that we don&amp;rsquo;t want to interfere with the main thread&amp;rsquo;s task which is usually drawing at 60fps. Threading provides a way to continue drawing quickly and allowing process-intensive tasks to continue in the background. Once a background task is complete, the data or result can be accessed from the main thread.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The traditional way of communicating threads in OF has been through some kind of lock before accessing shared memory between the main thread and a thread that does some kind of auxiliary work. This can be error prone since it is really easy to forget locking in the correct places and cause application crashes or lock more than necessary and cause deadlocks that freeze the application.&lt;/p&gt;

&lt;p&gt;OF 0.9.0 comes with a new class, ofThreadChannel, that makes inter thread communication much easier without having to explicitly  use mutexes or similar. You can think of a channel as a way to send information from one thread to another. Instead of having 2 threads that try to access to the same data now we have threads that access their own data and send it as a message to each other when they are done processing the data or when there&amp;rsquo;s new data to process.&lt;/p&gt;

&lt;p&gt;Channels are thread safe so all this happens without us having to use any kind of lock in our code. Additionally the worker thread can sleep until there&amp;rsquo;s new data to be processed by calling ofThreadChannel::receive which will use 0% CPU while there&amp;rsquo;s no data to process and only wake up when there&amp;rsquo;s something to do.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s some examples showing how to use ofThreadChannel in examples/utils/threadChannelExample which shows some generic usage of this new class or examples/gl/threadedPixelBufferExample which shows how to download pixels from the GPU using a buffer object in a different thread. ofxThreadedImageLoader&amp;rsquo;s code is also a good example of how to use ofThreadChannel to send jobs to a worker thread and get the result back in the main thread. In all this examples there&amp;rsquo;s no explicit locking any more which makes multi threading programming way easier and less error prone.&lt;/p&gt;

&lt;p&gt;The idea of a channel is inspired by similar utilities in some modern languages like 

&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Rust: &lt;a href="https://doc.rust-lang.org/std/sync/mpsc/"&gt;https://doc.rust-lang.org/std/sync/mpsc/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go: &lt;a href="http://guzalexander.com/2013/12/06/golang-channels-tutorial.html"&gt;http://guzalexander.com/2013/12/06/golang-channels-tutorial.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clojure: &lt;a href="http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html"&gt;http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

And others, all languages, with multi-threading as a central part of their design.

&lt;h4&gt;UTF-8 Support&lt;/h4&gt;

&lt;p&gt;As part of the removal of Poco we&amp;rsquo;ve introduced a minimal, header only library, utf8cpp. utf8cpp allows to iterate a string containing UTF-8. In 0.9.0 there&amp;rsquo;s a new class: ofUTF8Iterator which uses this library to provide an easy way to iterate over every utf-8 codepoint in a glyph.&lt;/p&gt;

&lt;p&gt;UTF-8 is a variable length encoding which means that in a UTF-8 string we can&amp;rsquo;t do something like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;for(auto &amp;amp; c: str){
    //do something with c
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;or &lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;for(int i=0; i&amp;lt;str.size(); i++){
    char c = str[i];
    //do something with c
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and expect c to be a correct UTF-8 codepoint since every character can be 1 byte, 2 bytes and even 4 bytes long depending to the alphabet it belongs.&lt;/p&gt;

&lt;p&gt;ofUTF8Iterator wraps a string and allows to retrieve the correct codepoints from it like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;for(auto &amp;amp; c: ofUTF8Iterator(str)){
    //do something with c
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is already used by OF internally to do some string manipulations like ofToLower and in the next release will allow to add support for full UTF-8 in ofTruetypefont which already lives as a pull request waiting to be merged after 0.9.0 is released: openframeworks/openFrameworks#3992&lt;/p&gt;

&lt;p&gt;Another useful UTF-8 function in OF 0.9.0 that complements ofUTF8Iterator is ofAppendUTF8, which allows to append a UTF8 codepoint to an std::string. For example if you get a character from the keyboard callback other than the limited latin 1 range you can&amp;rsquo;t add it to a string by appending it as a character, ofAppendUTF8 allows to append any character from any alphabet by doing:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;ofAppendUTF8(str,key)
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;ofSoundBuffer&lt;/h4&gt;

&lt;p&gt;ofSoundBuffer is part of a refactoring of the sound system that allows to simplify the callback for sound streams by passing an object instead of several parameters. It provides some basic operations over an audio buffer which make it easier to work with audio. It&amp;rsquo;s supposed to be the basis for other utils and addons which work with audio in OF. You can think of ofSoundBuffer as the equivalent to ofPixels for working with audio.&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/133404738514</link><guid>http://blog.openframeworks.cc/post/133404738514</guid><pubDate>Tue, 17 Nov 2015 10:27:39 -0500</pubDate></item><item><title>openFrameworks 0.9.0: Multi-window and ofMainLoop</title><description>&lt;p&gt;&lt;a href="http://blog.openframeworks.cc/post/133076054194/openframeworks-090-major-changes"&gt;OF 0.9.0 Overview Part 1 - Major Changes&lt;/a&gt;&lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133400454159/openframeworks-090-opengl-45"&gt;OF 0.9.0 Overview Part 2 - OpenGL 4.5&lt;/a&gt;&lt;br/&gt;OF 0.9.0 Overview Part 3 - Multi-window and ofMainLoop &lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133404738514/openframeworks-090-ofthreadchannel-utf-8-and"&gt;OF 0.9.0 Overview Part 4 - ofThreadChannel and UTF-8 support&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3&gt;Multi-window support&lt;/h3&gt;

&lt;p&gt;OF 0.9.0 now natively supports  several windows per application. To use more than one window, instead of the traditional main.cpp entry:&lt;/p&gt;

&lt;!-- more --&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;int main( ){
        ofSetupOpenGL(1024,768,OF_WINDOW);
        ofRunApp(new ofApp());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can do something like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;int main( ){
        ofGLWindowSettings settings;
        settings.width = 600;
        settings.height = 600;
        settings.setPosition(ofVec2f(300,0));
        auto mainWindow = ofCreateWindow(settings);

        settings.width = 300;
        settings.height = 300;
        settings.setPosition(ofVec2f(0,0));
        auto guiWindow = ofCreateWindow(settings);

        auto mainApp = make_shared&amp;lt;ofApp&amp;gt;();
        auto guiApp = make_shared&amp;lt;GuiApp&amp;gt;();

        ofRunApp(guiWindow, guiApp);
        ofRunApp(mainWindow, mainApp);
        ofRunMainLoop();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Where ofApp is the main app as we&amp;rsquo;ve always had, GuiApp is a second ofBaseApp class and each of them is run on a different window with:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;    ofRunApp(guiWindow, guiApp);
    ofRunApp(mainWindow, mainApp);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once we&amp;rsquo;ve created both app objects and windows and told OF in which window we want each app object to run we start the main loop by calling:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;    ofRunMainLoop();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There&amp;rsquo;s several types of window settings classes depending on the platform and the type of window we want to use, this new object allows to specify things like the position and size of the window, GL version and others depending on the type of window. Each window class has it&amp;rsquo;s own settings object which specifies different settings. For example, with ofGLFWWindowSettings we can specify if the window starts as an icon, has decorations, or in which monitor it should be created.&lt;/p&gt;

&lt;p&gt;Every call to ofCreateWindow, returns a sharedptr to a window, is recommended when using several windows, to keep the instance accessible so we can query things like width, height, position or in general any property of each window. The usual way to do was with function calls like, ofGetWidth, ofGetHeight, ofGetWindowPosition, which still work and if you use 2 applications the returned values will belong to the window to which that application was associated in main. Even with that when looking at code it can be confusing to understand which window ofGetWidth() is refering to in each call when we have more than one window. If we keep a copy of the sharedptr for each window and pass it around or have some kind of singleton in our application that allows us to access it then we can call for example mainWindow-&amp;gt;getWidth() instead of only ofGetWidth which makes the code easier to maintain and understand later&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s more details about how to use this new features in &lt;code&gt;examples/events/multiWindowExample and examples/events/multiWindowOneAppExample&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;ofMainLoop&lt;/h4&gt;

&lt;p&gt;ofMainLoop takes care now of holding every window in the system and of the loop logic unless the underlying system provides a loop already (like is the case with Android and iOS).&lt;/p&gt;

&lt;p&gt;By default OF will create an ofMainLoop singleton, which is the only singleton or static variable in the whole graphics engine and holds every window which in turn hold a renderer each. &lt;/p&gt;

&lt;p&gt;Optionally and right now only as a experimental API one can avoid completely any singleton, even the main loop, by creating explicitly one or more ofMainLoop and windows in main, each main loop can potentially even run in a different thread as long as no global calls are made. The global calls are everything in ofGraphics, of3dGraphics and every object draw and bind.&lt;/p&gt;

&lt;p&gt;Draw calls like &lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;ofDrawCircle(10,10,100);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;would become&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;gl.drawCircle(10,10,100);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Where gl is a renderer usually hold by a window and drawing and binding objects would be done through that same renderer like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;&lt;code&gt;gl.bind(texture);
gl.draw(vboWithTexCoords);
gl.unbind(texture)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There&amp;rsquo;s an example of how to do this in our github repository in apps/devApps/explicitRendererExample.&lt;/p&gt;

&lt;p&gt;These changes, although still in a experimental phase as a public API are used internally by the OF core, and prepare OF to work with the new graphics APIs to come, like Vulkan, that will substitute OpenGL in the future and which will be oriented towards multi-threaded applications.&lt;/p&gt;

&lt;p&gt;This also allows some advanced usage of OF, for example by compiling it as a shared library and loading it multiple times from the same process without having problems that the use of singletons and static variables would cause and in general makes OF more flexible as a library.&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/133404337264</link><guid>http://blog.openframeworks.cc/post/133404337264</guid><pubDate>Tue, 17 Nov 2015 10:17:59 -0500</pubDate></item><item><title>openFrameworks 0.9.0: openGL 4.5</title><description>&lt;p&gt;&lt;a href="http://blog.openframeworks.cc/post/133076054194/openframeworks-090-major-changes"&gt;OF 0.9.0 Overview Part 1 - Major Changes&lt;/a&gt;&lt;br/&gt;OF 0.9.0 Overview Part 2 - OpenGL 4.5&lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133404337264/openframeworks-090-multi-window-and-ofmainloop"&gt;OF 0.9.0 Overview Part 3 - Multi-window and ofMainLoop&lt;/a&gt; &lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133404738514/openframeworks-090-ofthreadchannel-utf-8-and"&gt;OF 0.9.0 Overview Part 4 - ofThreadChannel and UTF-8 support&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;With openFrameworks 0.8.0, about 2 years ago, we introduced the programmable renderer which started migrating OF from the fixed pipeline onto the newer OpenGL 3 API with support for OpenGL 3.2. With this release, we attempt to fully embrace the simpler and powerful features that became available with the latest OpenGL versions, all the way up to OpenGL 4.5.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Apart from performance optimizations and code cleanups, we have added features like on-the-fly mipmap generation to ofTexture, and for ofFbo, the ability to bind and render to multiple render targets at the same time. ofFbo now also supports MSAA filtering (a.k.a. multisampling) more robustly.
Another feature is the ability to create meshes with arbitrary vertex attributes using ofVbo. This gives advanced users all the flexibility they need to get the correct in&amp;rsquo;s and out&amp;rsquo;s to their shaders. Speaking of ofShaders, these now will now let you know (with some code context and line numbers in the oF console) where compilation failed, if an error was detected.&lt;/p&gt;

&lt;p&gt;We have also simplified the way you choose the OpenGL version you want to use for your app: &lt;/p&gt;

&lt;pre class="prettyprint"&gt;
// main.cpp (openFrameworks 0.8.4)
int main( ){
        ofSetupOpenGL(1024,768,OF_WINDOW);
        ofRunApp(new ofApp());
}

// main.cpp (openFrameworks 0.9)
int main(){
    ofGLWindowSettings settings;
    settings.setGLVersion(4,5); /// &amp;lt; select your GL Version here
    ofCreateWindow(settings); ///&amp;lt; create your window here
    ofRunApp(new ofApp());
}
&lt;/pre&gt;

&lt;p&gt;The old method of creating a simple window with the default settings still works, but we&amp;rsquo;ve removed the old way of choosing the programmable renderer, now you just need to specify which version of OpenGL to use and OF will use the programmable renderer internally if you choose anything higher than 3.0&lt;/p&gt;

&lt;h3&gt;ofBufferObject&lt;/h3&gt;

&lt;p&gt;An example for this is how we now deal with ofVbo data internally: it&amp;rsquo;s all backed by a new object, ofBufferObject, a thin wrapper around GPU held data.&lt;/p&gt;

&lt;p&gt;An ofBufferObject is an object oriented wrapper of an OpenGL buffer and allows to reserve memory in the GPU for lots of different purposes. ofBufferObject uses the named buffers API which allows to upload data and map GPU buffers i in memory space without having to bind them to any spècific target. This API makes the usage of GL buffers much cleaner since it avoids the use of global state in most cases which is something we are aiming for in all the rendering pipeline. Although this API is only really available since OpenGL 4.5 for lower versions of OpenGL we emulate it so you don&amp;rsquo;t have to deal with the different bindings of GL buffers until it&amp;rsquo;s really necessary.&lt;/p&gt;

&lt;p&gt;An ofBufferObject is in principle just memory in the GPU but depending how it&amp;rsquo;s bound it can serve very different purposes. There&amp;rsquo;s a few examples in the gl section that show how it can be used.&lt;/p&gt;

&lt;p&gt;pixelBufferExample and threadedPixelBufferExample show how to use ofBufferObject as a PBO (pixel buffer object), which allows to upload or download pixels information to and from the GPU in an asynchronous manner and even in a different thread leaving the CPU free for other tasks while the data is being uploaded or downloaded. This is really useful for things like recording the screen or faster playback of videos or image sequences.&lt;/p&gt;

&lt;p&gt;The computeShaderExample, which will only work with openGL 4.3 (so not in osx yet) shows the usage of compute shaders but also uses an ofBufferObject to pass data about a particle system from the compute shader where the positions, forces and interactions between each particle are calculated to a vbo where the same buffer is used to draw the particles. In this case the buffer is bound to 2 different targets one as a shader storage buffer (SSBO) and later as a vertex buffer object.&lt;/p&gt;

&lt;p&gt;The textureBufferInstancedExample shows how to use a texture backed by an ofBuffer, in openGL terminology a TBO (texture buffer object) to send information about position and rotation to a shader. This is handy in lower openGL versions where SSBO are still not supported to send more data than we can usually upload in a uniform.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s only a few examples but ofBufferObject can be used form many other things, we&amp;rsquo;ve tried to mantain the original OpenGL syntax as much as possible in it&amp;rsquo;s methods so any OpenGL reference can be easily translated to using this object but also introduced some higher level utils that make it&amp;rsquo;s usage much simpler than the original OpenGL API.&lt;/p&gt;

&lt;p&gt;For example a buffer object can be mapped to a memory address so we can read or write data from or to the GPU memory. In the OF object we can map that memory with any type, for example if we have a vertex object we can map the buffer as ofVec3f like:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
ofBufferObject buffer;
// uplaod some vertices to the buffer
// probably through a vbo
ofVec3f * data = buffer.map&amp;lt;ofVec3f&amp;gt;(GL_WRITE_ONLY);
// do something with the data, usually copy a vector
// or some other data into it
&lt;/pre&gt;

&lt;p&gt;Or we can wrap the mapped memory into an ofPixels which allows to use the high level operations that ofPixels provides over data in the GPU.&lt;/p&gt;

&lt;p&gt;The core also uses internally ofBufferObject in different places, for example ofVbo is now backed by this object or all the save screen facilities in OF like ofSaveScreen or ofSaveFrame now use ofBufferObjects to make reading back from the graphics card much faster.&lt;/p&gt;

&lt;h3&gt;Shader based lights and materials on OpenGL 3+&lt;/h3&gt;

&lt;p&gt;With the introduction of the programmable renderer around 2 years ago, one of the things that we lost when using OpenGL 3 was support for lights and materials since there&amp;rsquo;s no standard implementation in OpenGL 3+ and instead shaders are needed for material and lighting calculations.&lt;/p&gt;

&lt;p&gt;OF 0.9.0 introduces some custom shaders that do phong shading per-fragment (as opposed to the per-vertex lighting you&amp;rsquo;ll get with the fixed pipeline). The usage is fully compatible with previous versions, any application using ofMaterial and ofLight will keep working the same when switching to OpenGL 3+ but with better quality lighting.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s also support for a new type of light, area lights, that allows to create a rectangular source that emits light equally in all it&amp;rsquo;s area. There&amp;rsquo;s an example of how to use it in examples/gl/areaLightExample&lt;/p&gt;

&lt;p&gt;In the future we will extend materials and lighting support so they may be extended and used with custom lighting shaders.&lt;/p&gt;

&lt;p&gt;If you want to use your own lighting shaders you can still use ofLight.  When using the Programmable renderer, ofLight is a data container for the light transformation (an ofNode) and contains properties that you are able to send to your own shaders.&lt;/p&gt;

&lt;p&gt;A new useful function for lighting calculations is ofGetCurrentNormalMatrix() which returns the current normal matrix which is usually needed to calculate lighting. &lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/133400454159</link><guid>http://blog.openframeworks.cc/post/133400454159</guid><pubDate>Tue, 17 Nov 2015 08:34:16 -0500</pubDate></item><item><title>openFrameworks 0.9.0: major changes</title><description>&lt;p&gt;OF 0.9.0 Overview Part 1 - Major Changes&lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133400454159/openframeworks-090-opengl-45"&gt;OF 0.9.0 Overview Part 2 - OpenGL 4.5&lt;/a&gt;&lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133404337264/openframeworks-090-multi-window-and-ofmainloop"&gt;OF 0.9.0 Overview Part 3 - Multi-window and ofMainLoop&lt;/a&gt; &lt;br/&gt;&lt;a href="http://blog.openframeworks.cc/post/133404738514/openframeworks-090-ofthreadchannel-utf-8-and"&gt;OF 0.9.0 Overview Part 4 - ofThreadChannel and UTF-8 support&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;figure class="tmblr-full" data-orig-height="724" data-orig-width="1374"&gt;&lt;img src="http://i.imgur.com/F9rZ1W2.png" data-orig-height="664" data-orig-width="1088" alt="image"/&gt;&lt;/figure&gt;&lt;p&gt;This is one of the biggest openFrameworks releases to date, and will  probably be one of the biggest ever as we move to a more regular release cycle.&lt;/p&gt;&lt;p&gt;Some stats: The previous version, 0.8.4, was released September 19, 2014, and the last major version bump 0.8.0 was released August 9, 2013. The 0.9.0 Milestone shows 190+ closed issues, 115+ closed PRs, and almost 3000 commits since the last release. Development has been lead by Arturo Castro (arturoc), with contributions from approximately 100 people.&lt;/p&gt;&lt;p&gt;This post dives into more of the details around the release – we’ll be doing a series of posts with different details.  This one covers major changes to the core of OF as well as a list of everyone who was involved.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2&gt;&lt;b&gt;Major updates: C++11 support, removal of Poco&lt;/b&gt;&lt;/h2&gt;&lt;p&gt;With C++11 to C++14 support for all platforms, the C++ standard library now or in the near future will provide all the core features we used from Poco. Features that are still not part of C++14 are temporarily provided via boost::filesystem. The Poco libraries still come packaged with OF to retain backwards compatibility for anybody who is using the Poco libraries directly.&lt;/p&gt;&lt;p&gt;openFrameworks 0.9.0 now has support for C++11 in every platform and we’ve begun to adapt the core to support several patterns that are introduced in C++11 and make the usage and syntax easier.&lt;/p&gt;&lt;p&gt;As an example of the integration of C++11 in openFrameworks we have now support for iterators in every collection in the core and most addons.&lt;/p&gt;&lt;p&gt;Iterators are not a new thing in C++ but their syntax was really cumbersome before the C++11 standard. The new standard introduces range-based for loops which makes iterators much easier to use than before. This kind of for loops avoid any indices to iterate over a  collection with a syntax that is really clean and friendly.&lt;/p&gt;&lt;p&gt;For example this is how you would go through every line and every pixel in an image in OF 0.8.4 and before and in OF 0.9.0:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
ofPixels pixels;

// pre 0.9.0
for(int y=1;y&amp;lt;h;y++){
    for(int x=0;x&amp;lt;w;x++){
        pixels[x*3+y*w*3]; // red channel on an rgb image
        if(y&amp;gt;0){
            pixels[x*3+(y-1)*w*3]; 
            // get the pixel 1 line above this one
        }
    }
}

// 0.9.0
for(auto line: pixels.getLines()){
    for(auto pixel: line.getPixels()){
        pixel[0]; // red channel on any image
        if(line.getLineNum()&amp;gt;0){
            auto pixelAbove =  pixel - pixels.getWidth();  
            // get the pixel 1 line above this one
        }
    }
}
&lt;/pre&gt;

&lt;p&gt;The new version, by not using indices, makes the syntax clearer and less error prone. Also in the new version if we change for example the number of channels in the ofPixels, the for loop keeps working the same, since we are not iterating any more over bytes in an array but over pixels in an image no matter how many channels each pixel has.&lt;br/&gt;&lt;/p&gt;&lt;p&gt;A similar syntax can be used with every collection in OF now, like ofBuffer to iterate over lines in a text buffer, ofDirectory to iterate over every entry in a directory, ofxSvg to iterate over every path in an svg…&lt;/p&gt;&lt;p&gt;There’s more C++11 features in the core and in next releases we’ll integrate others, like for example allowing lambda functions as listeners for events which is already working as a pull request and will be merged in the core soon.&lt;/p&gt;&lt;h2&gt;New platforms&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Emscripten&lt;/b&gt;:
Emscripten allows openFrameworks applications to be run in a web browser.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Raspberry Pi 2&lt;/b&gt;:
The Raspberry Pi2 is now supported and set as the default variant for arm7.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;64 bits: &lt;/b&gt; 64 bit support for Mac/Windows/iOS
openFrameworks now supports 64-bit compilation on OS X, iOS, Windows (and linux which was already supported). Supporting this architecture meant removing 32-bit only QuickTime video playback and capture code, and substituting it with AVFoundation in OSX and Direct show in Windows.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;openFrameworks is now compatible with the Apple Store requirements for all iOS applications to support 64bit.&lt;/p&gt;&lt;h2&gt;Developer Notes&lt;/h2&gt;&lt;p&gt;&lt;b&gt;New Library build process via Apothecary&lt;/b&gt;&lt;/p&gt;&lt;p&gt;One of the hard parts of getting started with C++ is building libraries. One reason OF was created was to make libraries more accessible, and allow people to easily work with different kinds of media. In order to accomplish this, we precompile libraries and distribute them for all the platforms we use. But as the number of platforms has increased the number of libraries we need to compile has also increased, which means that when we want to update a library we have to carefully recompile it for all the different platforms.&lt;/p&gt;&lt;p&gt;To automate this process, in 2013 Dan Wilcox developed a tool called Apothecary, with the support of the Frank-Ratchye STUDIO for Creative Inquiry at CMU. Apothecary allows us to keep track of all the different repositories, build flags, and patches we make to different libraries in order to get them all building and running for different platforms. When we need to update a library to get the latest features, there’s less repetitive work, and we don’t need to track down the one person who knew how to build that library.&lt;/p&gt;&lt;p&gt;With 0.9.0 we’ve integrated Apothecary into the OF workflow by writing “formulas” (shell scripts) that describe how to build all the libraries that OF uses on every platform.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Continuous Integration&lt;/b&gt;&lt;/p&gt;&lt;p&gt;During the 0.9.0 release cycle we’ve stated to add some continuous integration to our workflow. Every time that there’s a new commit or someone sends a pull request the whole core is compiled in all the platforms we support except for linux arm and emscripten by now. We also test that the empty example and the all addons example keep compiling and run some tests that ensure that things keep working as they should with the new code.&lt;/p&gt;&lt;p&gt;By now we have tests for the filesystem classes and utilities, for ofPixels and for the string manipulation functions but we’ll keep adding more unit tests in the future.&lt;/p&gt;&lt;p&gt;This makes the openFrameworks core and official addons much more stable and at all times we can know that the master branch is working in all platforms or will keep working if we merge a pull request.&lt;/p&gt;&lt;p&gt;With time we receive more and more contributions from different people so having unit tests and knowing that everything will keep running after merging some contribution already helps making it easier to accept all the pull requests that we receive.&lt;/p&gt;&lt;h2&gt;Community Notes&lt;/h2&gt;&lt;p&gt;&lt;b&gt;ofxaddons.com &lt;/b&gt;&lt;br/&gt;While ofxAddons is on a different cycle than the openFrameworks codebase, some big changes have happened since the last release. Most importantly, it loads a lot faster and is much easier to navigate. All these changes were made by James Hughes (jamezilla) earlier this year.&lt;/p&gt;&lt;p&gt;&lt;b&gt;ofBook project&lt;/b&gt;
&lt;br/&gt;The ofBook project started in early 2014, and had its first private preview in January 2015. After the release of 0.9.0 we are also working to release ofBook. It’s huge group effort lead by a few dozen people, starting with organizational efforts, brainstorming, and writing, and most recently a lot of editing.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Contributors to the ofBook project&lt;/b&gt;
&lt;i&gt;Abe Pazos, Abraham Avnisan, Adam Carlucci, Andy Clymer, Arturo Castro, Blair Neal, Brannon Dorsey, Brett Peterson, Caitlin Morris, Christoph Buchner, Christopher Baker, Daniel Rosser, Elburz Sorkhabi, Eva Schindling, Eve Weinberg, Gerben Neven, Golan Levin, Hyeongbin Kim, Ishac Bertran, Jane Friedhoff, Jason Alderman, jeffro-, Joel Gethin Lewis, Jonas Jongejan, Josh Nimoy, Joshua Nimoy, Joshua Noble, kavinhan, Kayla Lewis, Lionel Radisson, Lukasz Karluk, Marcus Russi, Matt Felsen, Matthew Hollings, Memo Akten, Michael Hadley, Mimi Son &amp;amp; Elliot Woods (Kimchi and Chips), Nuno Martins, Omer Shapira, Patricio Gonzalez Vivo, Phoenix Perry, Pierre Proske, Pierre Thirion, Rachel Uwa, Riccardo Canalicchio, Roy Macdonald, Rui Pereira, Serkan Sökmen, Tega Brain, Tobias Zehntner, Todd Thille, tpltnt, Zach Lieberman
For the official credits see &lt;a href="http://openframeworks.cc/ofBook/chapters/foreword.html#credits"&gt;http://openframeworks.cc/ofBook/chapters/foreword.html#credits&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Contributors to 0.9.0 openframeworks.cc&lt;/b&gt;
&lt;i&gt;Aaron Waterhouse, Adriano D.G., Andrew McWilliams, Antoine Villeret, Arturo Castro, Basheer Subei, Caitlin Morris, Cameron Browning, Christoph Mauerhofer, Christopher Baker, Constantine Tarasenkov, David Newbury, Davide Prati, edapx, Giuseppe Torre, Giuseppe, Hector Lee, Isaac Lemus, Jason Van Cleave, jbl0ndie, Johnty Wang, Jordan Shaw, Kyle McDonald, Lauren McCarthy, lilive, Nick Devereaux, Peter Dave Hello, Sarah Howorka, Theo Watson, Tobias Zehntner, tpltnt, Zach Lieberman&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Contributors to 0.9.0 code base&lt;/b&gt;
&lt;i&gt;Aaron Freedman, Abhi, Adam Carlucci, AmnonOwed, Andreas Müller, Andy Duplain, Arthur Carabott, Arturo Castro, Bo Brinkman, Cameron Browning, Carsten Schwede, Charles Veasey, Christoph Buchner, Christoph Mauerhofer, Christopher Baker, Constantine Tarasenkov, Daan de Lange, Damian Stewart, Damien Lespiau, Dan Moore, Dan Wilcox, Daniel Rosser, Darío Hereñú, dmytroshp, Dominic Amato, elaye, Elie Zananiri, Elliot Woods, eranws, Felix Dubrownik, Felix Lange, Gal Sasson, Gorka Cortazar, Graham Reeves, Grégory DAVID, hardmanko, Hubris, Ingo Randolf, ISHII 2bit, Jakob Schindegger, jamet, Jason Knight, Jason Van Cleave, Jean-Pierre Mouilleseaux, Johan Bichel Lindegaard, Jonas Jongejan, Jonathan Dahan, Joshua Noble, Julian Adenauer, kentaroid, Kevin Pouget, Kojo Kumah, Kyle McDonald, Lennart Melzer, Liam Staskawicz, Lorenzo Mancini, Lukasz Karluk, László Kustra, Léo Colombaro, manish-juneja, Marcel Ruegenberg, Mark Hintz, Matt Felsen, Mattijs Kneppers, Memo Akten, Michael Hadley, Michael Hansen, Nick Hardeman, noyanc, nykwil, Patrick Fürst, Pelayo Méndez, Petros Kataras, Philip Whitfield, Piotr Tarasewicz, random, rezaali, Riccardo Canalicchio, Robert Xiao, Sam Taylor, Sergio Basurco, skimon, Stefano, Sterling Crispin, Tal Lavi, Theo Watson, Thomas Geissl, Tim Gfrerer, Timon Skerutsch, Timothy Scaffidi, Tom Butterworth, tpltnt, Trent Brooks, Tristan Fisher, Valentino Dell'Aica, Vincent Donnefort, wronex, Zach Lieberman&lt;/i&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/133076054194</link><guid>http://blog.openframeworks.cc/post/133076054194</guid><pubDate>Thu, 12 Nov 2015 12:22:13 -0500</pubDate></item><item><title>2014 Survey Results</title><description>&lt;p&gt;At the end of 2014, we released our second community survey, asking for input from anyone working with openFrameworks, at any level of experience and involvement.  Thanks to the help of a number of translators, we were able to release this year&amp;rsquo;s survey in five languages (English, Japanese, Spanish, Chinese, and Russian).  We&amp;rsquo;re excited to have received 570+ responses across the languages, and are grateful for the thoughtful and thorough responses which enable us to continue working towards strengthening openFrameworks as both a tool and a community.&lt;/p&gt;&lt;!-- more --&gt;
&lt;p&gt;The survey was a mix of long-form responses and binary / multiple-choice questions.  The results of the non-long-form questions (and a few long-form questions, condensed!) are shown below; these graphs represent a merged total across all languages unless noted otherwise.&lt;/p&gt;
&lt;p&gt;[Note: though the survey was conducted in multiple languages, this analysis is currently being written only in English! If you&amp;rsquo;d like to translate this post or help with the translation of the long-form questions, please get in touch by &lt;a href="mailto:of@openframeworks.cc"&gt;email&lt;/a&gt; or &lt;a href="http://twitter.com/openframeworks"&gt;twitter&lt;/a&gt;.]&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DEMOGRAPHICS&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;English was the dominant language of response in the survey; however 170+ respondents answered to the non-English-language surveys.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;


&lt;p&gt;&lt;br/&gt; In fact, 36 primary languages were represented across the respondents of the survey.  Shown here are languages with more than 10 respondents:&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;An even greater number of languages was indicated as the primary language of between 1 and 10 community members.  &lt;/p&gt;
&lt;p&gt;&lt;br/&gt; 1 to 5 community members use as their primary language: Alsacian, Arabic, Bulgarian, Cantonese, Danish, Finnish, Hebrew, Hindi, Hungarian, Indonesian, Norwegian, Polish, Romanian, Shqip, Slovak, Tamil, Thai, Urdu, or Vietnamese.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt; 5 to 10 community members speak Greek, Korean, Russian, Swedish, or Turkish as their primary language.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt; This diversity is also reflected in the home / working location of community members worldwide.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;(More detailed view of Europe / North Africa)&lt;/i&gt;&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;


&lt;p&gt;The community respondents identified predominantly as male (nearly 95%), with female and non-binary gender identities a distinct minority.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;img src="" alt="image"/&gt;

&lt;p&gt;&lt;br/&gt; Among the respondents, the greatest distribution was in the 26-35 year range, with a handful of responses in the &amp;gt;60 and &amp;lt;18 range.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;br/&gt; Interestingly, a disproportionately large number of the respondents in the 18-21 year range answered to the Japanese language survey or indicated Japanese as a primary language; over 15 percent of Japanese respondents are in the youngest age category as compared to about 2 percent in other languages.  &lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Asking community members to label themselves by multiple choice (though understandably a challenge!) reveals a wide range of identities across developers, artists, and other professions. Common write-in answers include interaction designers, game developers, and engineers.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;


&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;OPENFRAMEWORKS USE AND EXPERIENCE&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The survey responses indicate a balanced range of experience in openFrameworks consistent with last year&amp;rsquo;s survey. The slight bias towards more experienced users seems to reflect &amp;ndash; as also corroborated through anecdotal evidence &amp;ndash;  that a lot of beginners or students don&amp;rsquo;t feel that they&amp;rsquo;re qualified to take the survey. (Note for the future: beginner feedback is equally important; everyone is qualified!)&lt;/p&gt;&lt;img src="" alt="image"/&gt;
&lt;p&gt;Interactives and graphics programming are the most common uses for OF, followed closely by computer vision. Game development, while not originally a multiple choice option, was a significant write-in answer.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The majority of the openFrameworks community has not learned OF in any formal academic program.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;However, a relatively large percentage of the community is either teaching OF in school or has taught at workshops.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;One of the most interesting results of this question (have you taught OF?) was that a significant number of people, at least 60 respondents, mentioned that although they haven&amp;rsquo;t taught OF in a classroom or workshop setting, they teach &amp;ldquo;at lunch to colleagues&amp;rdquo; or &amp;ldquo;in [their] dorm room to friends&amp;rdquo; or &amp;ldquo;to [their] children&amp;rdquo;. This reveals a wonderful and personal networked means of sharing OF outside of traditional academic communities, and we&amp;rsquo;d like to continue encouraging and supporting this form of community development as much as possible.&lt;/p&gt;
&lt;p&gt;Among the survey respondents, a majority indicate that they use openFrameworks for some portion of their income-generating work:&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;OPERATING SYSTEMS / DEVELOPMENT ENVIRONMENTS&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Across the total sum of languages, MacOSX remains the most commonly used operating system. Raspberry Pi and various mobile platforms show a significant increase in use since last year&amp;rsquo;s survey.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Each survey language reveals slightly different trends in operating system preference; OS percentage by language is shown below.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;


&lt;p&gt;For OF users on OSX, XCode is the dominant IDE to near exclusivity.&lt;/p&gt;
&lt;p&gt;Windows users show a slight preference for Visual Studio over Code::Blocks:&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Linux users responded with a much wider range of preferred development tools.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;OPENFRAMEWORKS RESOURCES&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Most of the community indicates that they&amp;rsquo;ve been able to successfully work with addons, though a large number indicate either struggle or complete inability to work with an addon.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;


&lt;p&gt;Based on multiple choice response, the most common use of the documentation is as a syntax reference, with a large section of users also aiming to use the documentation as a resource to find unknown functions.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The forum is the leading place for OF users to look for help with questions, closely followed by other online resources like StackOverflow.  Posting questions on Twitter was another common write-in answer, especially among the Japanese-language community.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The survey included a number of long-form response questions about peoples&amp;rsquo; challenges and successes using and learning openFrameworks. These longer answers individually are helpful in determining what steps might be most helpful moving forward.  Here, these answers are distilled into word clouds for easier parsing.  Note: these word clouds only take into account the English language responses to the survey (again, any interest in translating or providing similar processing of the non-English results is absolutely welcome!).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;What is your ideal reference page?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Many people indicated that having examples on a reference page would be helpful, pointing to sites like processing.org and some of the existing openFrameworks documentation that contains simple examples alongside the syntax documentation.&lt;/p&gt;&lt;img src="" alt="image"/&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;What is the worst thing about using OF?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Many people here point to the documentation as incomplete or sometimes difficult to use. This is a work in progress and individual feedback on suggested improvements to the documentation are helpful as we continue to work on it! A number of survey respondents also indicated that they&amp;rsquo;d be interested in contributing in some way to development, and documentation is a great place for people to jump in, as sometimes beginners can be even better at making comprehensive documentation than advanced users.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;What is/was the most challenging part of learning OF?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Challenges with C++ in general and specific IDEs (such as XCode) make up the majority of responses about learning challenges, as well as the previously mentioned gaps in documentation.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;What is/was the most helpful thing for learning OF?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Community members point to the packaged examples as a hugely helpful resource while learning, and a number of people also called out the &amp;ldquo;Getting Started&amp;rdquo; tutorials on the documentation site as a helpful starting place.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ldquo;What is the best thing about OF?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re happy that, in addition to the toolkit being &amp;ldquo;powerful / easy / fast&amp;rdquo;, many people list the community around openFrameworks as one of their favorite things about it.&lt;/p&gt;
&lt;img src="" alt="image"/&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;THANK YOU / 谢谢 / ありがとう / спасибо / GRACIAS&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;ndash; &amp;ndash; &amp;ndash;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Many thanks to everyone who took the time to provide this information for us! We&amp;rsquo;re grateful that you&amp;rsquo;re working with us to keep building this tool and community. &lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be in touch with a bunch of you who&amp;rsquo;ve indicated interest in getting involved, either through making documentation, coming to meetups, being involved through Google School of Code, and other means.  For anyone who&amp;rsquo;s interested in helping out or getting involved in any way, please get in touch! You can reach us on Twitter &lt;a href="http://twitter.com/openframeworks"&gt;@openframeworks&lt;/a&gt; or by joining the &lt;a href="http://dev.openframeworks.cc/listinfo.cgi/of-dev-openframeworks.cc" title="of-dev list"&gt;of-dev list &lt;/a&gt;and following information about development and documentation needs.&lt;/p&gt;
&lt;p&gt;Thanks - we&amp;rsquo;re looking forward to getting to know you more!&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/108919370109</link><guid>http://blog.openframeworks.cc/post/108919370109</guid><pubDate>Fri, 23 Jan 2015 10:38:00 -0500</pubDate><category>community</category><category>survey</category></item><item><title>2014 Community Survey!</title><description>&lt;p&gt;&lt;span&gt;Hi OF community,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Every so often, we like to get some information from you that helps us learn more about what openFrameworks is used for, who&amp;rsquo;s using it, and how we can continue developing and making things simpler, friendlier, and more robust to use.  The results from &lt;a href="http://blog.openframeworks.cc/post/60000217684/of-2013-survey-results" title="2013 Survey Results" target="_blank"&gt;last year&amp;rsquo;s survey&lt;/a&gt; were really insightful, and the community grows and changes every year, so we&amp;rsquo;d love to get your input again and continue to learn.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re about to download openFrameworks for the first time &amp;ndash; if you&amp;rsquo;ve been using it for a decade &amp;ndash; if you don&amp;rsquo;t write code yourself but you&amp;rsquo;re interested in it, or work with people who do &amp;ndash; we want your responses! &lt;/p&gt;
&lt;p&gt;This year, we&amp;rsquo;re publishing the survey in several languages to better reflect our community demographics.  Feel free to take the survey in your preferred language (or let us know in the comments of the survey if there&amp;rsquo;s another language we should be including!):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SURVEY IN ENGLISH&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/forms/d/1bOqDDfGdvM_I3ZJKze2g77YRMrth_21S278rSLgA7JU/viewform"&gt;https://docs.google.com/forms/d/1bOqDDfGdvM_I3ZJKze2g77YRMrth_21S278rSLgA7JU/viewform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在中国调查&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/forms/d/1d4TDuFCjDHEn8Z8n6ngWkFlKPPma9wYQkkkHZGCfqlc/viewform"&gt;https://docs.google.com/forms/d/1d4TDuFCjDHEn8Z8n6ngWkFlKPPma9wYQkkkHZGCfqlc/viewform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日本語での調査&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/forms/d/1hb8PUjN6e-NBxdSTrXn7hOhaVrJ_IBus62AyNCJwm3o/viewform"&gt;https://docs.google.com/forms/d/1hb8PUjN6e-NBxdSTrXn7hOhaVrJ_IBus62AyNCJwm3o/viewform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ENCUESTA EN ESPAÑOL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/forms/d/15MNxP3XbEpZiTw8httTgLRHdVMHCkfwbuBNfVzMSNOM/viewform"&gt;https://docs.google.com/forms/d/15MNxP3XbEpZiTw8httTgLRHdVMHCkfwbuBNfVzMSNOM/viewform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Опрос на русском языке&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/forms/d/1jry2-YJquHX15rbS3BnR2VksSWSJ11n9992Dx2aDOx8/viewform"&gt;https://docs.google.com/forms/d/1jry2-YJquHX15rbS3BnR2VksSWSJ11n9992Dx2aDOx8/viewform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;thanks / 谢谢 / ありがとう / спасибо / gracias,&lt;/p&gt;
&lt;p&gt;the OF team&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/104672042124</link><guid>http://blog.openframeworks.cc/post/104672042124</guid><pubDate>Mon, 08 Dec 2014 09:03:00 -0500</pubDate><category>survey</category><category>community</category></item><item><title>Help us test the OF 0.8.1 RC2 release candidate</title><description>&lt;p&gt;zips are here: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_android_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_android_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_osx_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_osx_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_ios_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_ios_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_vs_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_vs_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_win_cb_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_win_cb_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linuxarmv7l_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linuxarmv7l_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linuxarmv6l_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linuxarmv6l_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linux64_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linux64_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linux_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC2/of_v0.8.1-RC2_linux_release.tar.gz&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/80188522068</link><guid>http://blog.openframeworks.cc/post/80188522068</guid><pubDate>Thu, 20 Mar 2014 15:59:18 -0400</pubDate></item><item><title>Participate in Google Summer of Code!</title><description>&lt;p&gt;&lt;br/&gt;&lt;figure class="tmblr-full" data-orig-height="84" data-orig-width="500" data-orig-src="https://78.media.tumblr.com/a8eb3fb3f4139c1b6684ab3e370d627f/tumblr_inline_n2gj50RFt61sbgmkt.png"&gt;&lt;img alt="image" src="https://78.media.tumblr.com/3503e35373646fcaf1b7628183ebcffc/tumblr_inline_p7h8ybOMnj1sbgmkt_540.png" data-orig-height="84" data-orig-width="500" data-orig-src="https://78.media.tumblr.com/a8eb3fb3f4139c1b6684ab3e370d627f/tumblr_inline_n2gj50RFt61sbgmkt.png"/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.google-melange.com/gsoc/homepage/google/gsoc2014" target="_blank"&gt;&lt;br/&gt;Google Summer of Code&lt;/a&gt; is a program that offers student developers $5000 stipends and mentorship to write code for various open source projects. openFrameworks is participating in GSOC 2014 under the umbrella of the &lt;a href="http://processing.org"&gt;Processing Foundation&lt;/a&gt;. We are looking for students interested in working on &lt;a href="http://ofxaddons.com/" target="_blank"&gt;ofxaddons.com&lt;/a&gt;, the OF project generator, an OF testing framework, or other ideas you come up with! &lt;/p&gt;
&lt;div&gt;If you are interested in participating, learn more by reading the &lt;a href="http://www.google-melange.com/document/show/gsoc_program/google/gsoc2014/help_page" target="_blank"&gt;GSOC FAQ&lt;/a&gt; and &lt;a href="https://github.com/openframeworks/openFrameworks/wiki/GSoC-2014-Ideas" target="_blank"&gt;OF Ideas List&lt;/a&gt;, then &lt;a href="http://www.google-melange.com/gsoc/org2/google/gsoc2014/processing" target="_blank"&gt;submit your application via the Processing Foundation&lt;/a&gt;. Be sure to include ATTN: OPENFRAMEWORKS in your application so we know it is an OF application.
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Note that undergrad, grad, and phd students are eligible, as well as students graduating in May. See information on eligibility &lt;a href="http://www.google-melange.com/gsoc/document/show/gsoc_program/google/gsoc2014/help_page#2._Whos_eligible_to_participate_as_a"&gt;here&lt;/a&gt;. &lt;strong&gt;The deadline is Friday, March 21 at 19:00 UTC.&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://forum.openframeworks.cc/t/google-summer-of-code-2014-paid-student-internships/15031"&gt;Post questions and learn more on the of forum!&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><link>http://blog.openframeworks.cc/post/79893295516</link><guid>http://blog.openframeworks.cc/post/79893295516</guid><pubDate>Mon, 17 Mar 2014 15:51:00 -0400</pubDate></item><item><title>Help us test the 0.8.1 Release!</title><description>&lt;p&gt;We are working on getting the 0.8.1 release out the door. &lt;/p&gt;
&lt;p&gt;As part of that we put out a Release Candidate for public testing.&lt;/p&gt;
&lt;p&gt;It would be great if people could download the zips for the platforms they use and see if they notice any issues.&lt;/p&gt;
&lt;p&gt;What would also be really helpful, is if you could try running existing projects with 0.8.1 RC1 to see if issues arise. That seems to be a really good way to find potential bugs / regressions.&lt;/p&gt;
&lt;p&gt;Here is a issue tracking problems with the example projects:&lt;br/&gt;&lt;a href="https://github.com/openframeworks/openFrameworks/issues/2841"&gt;https://github.com/openframeworks/openFrameworks/issues/2841&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And another issue for problems with the release packages:&lt;br/&gt;&lt;a href="https://github.com/openframeworks/openFrameworks/issues/2849"&gt;https://github.com/openframeworks/openFrameworks/issues/2849&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please reply to both with issues you notice from the RC1 zips.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_android_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_android_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_osx_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_osx_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_ios_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_ios_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_vs_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_vs_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_win_cb_release.zip"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_win_cb_release.zip&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linuxarmv7l_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linuxarmv7l_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linuxarmv6l_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linuxarmv6l_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linux64_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linux64_release.tar.gz&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linux_release.tar.gz"&gt;http://www.openframeworks.cc/versions/v0.8.1-RC1/of_v0.8.1-RC1_linux_release.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There will be another Release Candidate on Friday. &lt;br/&gt;Then hopefully a public release a few days later.&lt;/p&gt;
&lt;p&gt;Thank you for helping test the 0.8.1 release!&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/79490368458</link><guid>http://blog.openframeworks.cc/post/79490368458</guid><pubDate>Thu, 13 Mar 2014 17:21:00 -0400</pubDate></item><item><title>OFPlugin: A helpful tool for easily including addons in XCode </title><description>&lt;p class="p1"&gt;OFPlugin, made by Adam Carlucci, is an openFrameworks plugin for XCode 5 that adds OF addons to open projects.  Using addons in XCode can be a complicated process because of the need to add in unique file paths and frameworks.  OFPlugin automates this process, making it easy to include addons in existing XCode projects.&lt;/p&gt;

&lt;p class="p1"&gt;Source code and a link for a pre-compiled version is available on Github: &lt;a href="https://github.com/admsyn/OFPlugin"&gt;https://github.com/admsyn/OFPlugin&lt;/a&gt;&lt;/p&gt;

&lt;p class="p1"&gt;There are a number of nice tips and tricks in the demo video below.&lt;/p&gt;
&lt;p&gt;&lt;iframe frameborder="0" height="375" src="//player.vimeo.com/video/79061998" width="500"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/79061998"&gt;OFPlugin demo&lt;/a&gt; from &lt;a href="http://vimeo.com/admsyn"&gt;Adam Carlucci&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And some extra bonus features demonstrated in a follow-up video:&lt;/p&gt;
&lt;p&gt;&lt;iframe frameborder="0" height="375" src="//player.vimeo.com/video/79167885" width="500"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/79167885"&gt;OFPlugin bonus features&lt;/a&gt; from &lt;a href="http://vimeo.com/admsyn"&gt;Adam Carlucci&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;p class="p1"&gt;The plugin automates the following steps for including addons, normally done manually:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;span&gt;Find a group named “addons”&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Add src and libs folders&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Go through each of the added folders and remove them if they’ve got names like “windows” “win” “linux” etc&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Add source files, static libs and frameworks to all targets in the open project&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;Add and / or clone any dependency addons that an addon claims to need (in &lt;a href="http://addons_config.mk/"&gt;&lt;span class="s1"&gt;addons_config.mk&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Add any header search paths necessary to USER_HEADER_SEARCH_PATHS&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p class="p1"&gt;Because the plugin parses addons_config.mk, addon writers should include that file in their addons to make sure that they&amp;rsquo;re compatible!&lt;/p&gt;
&lt;p class="p1"&gt;Addons can also be added at the start of a project with the Project Generator, but OFPlugin makes it possible to include addons mid-project without breaking workflow.  Note: i&lt;span&gt;n theory it&amp;rsquo;ll work on Xcode 4 as well as Xcode 5, but garbage collection will need to be enabled when building the plugin.&lt;/span&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/66870513236</link><guid>http://blog.openframeworks.cc/post/66870513236</guid><pubDate>Wed, 13 Nov 2013 08:32:00 -0500</pubDate></item><item><title>XinCheJian "Getting Started in OF" workshops, Shanghai!</title><description>&lt;p&gt;Attention Shanghai residents and travelers - hackerspace &lt;a href="http://xinchejian.com/"&gt;XinCheJian&lt;/a&gt; is running a series of workshops and meetups for anyone in Shanghai looking to get started with openFrameworks.  A series of structured workshops (led by Yinan Zhang and Sven Travis) have already started, supported by ongoing biweekly openFrameworks meetups.  Some photos from the first workshop on 18 September are below!  The next major workshop is scheduled for the week of 21-26 October &amp;ndash; see XinCheJian&amp;rsquo;s &lt;a href="http://xinchejian.com/"&gt;website&lt;/a&gt; for more details about the workshop and meetups.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://78.media.tumblr.com/67d75b21f51af04366a1ef0aba62b617/tumblr_inline_mu7ui2plFY1qe95tj.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://78.media.tumblr.com/dffa99024e92fdeb6bd69d6849035477/tumblr_inline_mu7uiae0TK1qe95tj.jpg"/&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/63211189738</link><guid>http://blog.openframeworks.cc/post/63211189738</guid><pubDate>Sat, 05 Oct 2013 18:06:36 -0400</pubDate><category>offline education workshop meetup</category></item><item><title>Public NYC openFrameworks workshop series</title><description>&lt;p&gt;An 8-week Intro to openFrameworks series is starting this Saturday (7 Sept) through dorkShop, a workshop program coordinated by students and faculty at Parsons the New School for Design.  Sessions will be held Thursday nights and Saturdays.&lt;/p&gt;
&lt;p&gt;dorkShop is hosted in the MFA Design and Technology Lab at Parsons (6 E. 16th St, NY), but workshops are free and open to the general public (RSVP required).&lt;/p&gt;
&lt;p&gt;More information and registration for the first session are available here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dorkshop01.eventbrite.com/"&gt;http://dorkshop01.eventbrite.com/&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.openframeworks.cc/post/60378404432</link><guid>http://blog.openframeworks.cc/post/60378404432</guid><pubDate>Thu, 05 Sep 2013 15:06:53 -0400</pubDate><category>offline</category><category>education</category><category>workshop</category></item></channel></rss>
