2010-08-13 12 views
9

Estoy usando la aplicación de muestra GLPaint de Apple como base para una aplicación de pintura OpenGL ES, pero no entiendo cómo implementar la funcionalidad deshacer dentro de ella.¿Cómo implementaría deshacer en una aplicación de pintura OpenGL ES en el iPhone?

No quiero tomar imágenes de cada trazo y almacenarlas. ¿Hay alguna forma de utilizar diferentes objetos de frame buffer para implementar deshacer? ¿Tiene otras sugerencias para mejores formas de hacer esto?

Respuesta

9

Utilice objetos de búfer de vértice (VBO) para representar su contenido. En cada nuevo trazo, copie el último VBO a alguna lista de uso reciente (LRU). Si su LRU está lleno, elimine el VBO utilizado menos recientemente. Para restaurar (deshacer) el último trazo, simplemente use el VBO utilizado más recientemente del LRU y renderícelo.

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

+0

¿Podría proporcionarnos algún código de muestra sobre cómo implementar esto? – antalkerekes

+1

Agitar para deshacer :-) ¿Esto funciona para usted? https://github.com/larsxschneider/Undo-in-OpenGL-ES –

+0

Funciona perfectamente, muchas gracias! Estaré en contacto para mostrarte lo que hice con él. Bounty bien merecido. – antalkerekes

6

yo recomendaría usar NSUndoManager para almacenar una lista de las acciones de dibujo reales llevadas a cabo por el usuario (dibujar la línea de aquí hasta aquí usando este pincel, etc. .). Si se almacena como una lista de coordenadas x, y para el dibujo vectorial, junto con todos los demás metadatos necesarios para recrear esa parte del dibujo, no utilizará en ningún lugar tanta memoria como almacenar imágenes, objetos de búfer de vértice u objetos de framebuffer .

De hecho, si almacena estos pasos de dibujo en una base de datos Core Data, casi puede deshacer/rehacer de forma gratuita. Ver mi respuesta here para más.

+1

Guardando todos los pasos y luego redibujándolos -último paso (deshacer) puede ser muy lento cuando tienes muchos pasos para volver a dibujar, ¿me falta algo? –

+0

Yo sugeriría almacenar una imagen en bruto cada 10 o más puntos de verificación para que no tenga que volver a dibujar los últimos 100 pasos o algo loco – jjxtra

-1

O se puede utilizar NSUndoManager, clase proporcionada por el IOS

O puede guardar el estado actual del área de la pantalla por:

CGContextRef current = UIGraphicsGetCurrentContext(); 

Usted puede tener una matriz como la pila con objetos de imagen de la pantalla y en deshacer acción puede extraer valor de la pila y de cada valor de inserción de cambio en la pila.

+0

El solicitante está buscando una solución que involucre OpenGL ES, y estados gráficos como usted describe solo el trabajo para Gráficos básicos. No aplicarían aquí. –

Cuestiones relacionadas