Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How would I implement undo in an OpenGL ES painting application on the iPhone?

I'm using Apple's sample application GLPaint as a basis for an OpenGL ES painting application, but I can't figure out how to implement undo functionality within it.

I don't want to take images of every stroke and store them. Is there any way of using different frame buffer objects to implement undo? Do you have other suggestions for better ways of doing this?

like image 329
Bazooka Avatar asked Aug 13 '10 05:08

Bazooka


2 Answers

Use vertex buffer objects (VBO) to render your content. On every new stroke copy the last VBO to some least recently used (LRU) list. If your LRU is full, delete the least recently used VBO. To restore (undo) the last stroke just use the most recently used VBO of the LRU and render it.

VBO: http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

LRU: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used

like image 104
Lars Schneider Avatar answered Oct 07 '22 04:10

Lars Schneider


I would recommend using NSUndoManager to store a list of the actual drawing actions undertaken by the user (draw line from here to here using this paintbrush, etc.). If stored as a list of x, y coordinates for vector drawing, along with all other metadata required to recreate that part of the drawing, you won't be using anywhere near as much memory as storing images, vertex buffer objects, or framebuffer objects.

In fact, if you store these drawing steps in a Core Data database, you can almost get undo / redo for free. See my answer here for more.

like image 38
Brad Larson Avatar answered Oct 07 '22 04:10

Brad Larson