Actualizado README con documentación de la segunda práctica

parent 5e994976
# Índice
1. [Primera práctica](#primera-práctica)
2. [Segunda práctica](#segunda-práctica)
# Primera práctica
## Descripción de solución al segundo problema planteado
Dado a que con GLFW solo se puede registrar como _callback_ funciones C y no métidos de clase, la clase `PAG::Renderer` debe de seguir el patrón **Singleton**.
De esta manera, se pueden poner como *callback* funciones C que obtienen el singleton y llaman al metodo indicado.
De esta manera, se pueden poner como *callback* funciones C que obtienen el singleton y llaman al método indicado.
Por ejemplo:
```cpp
......@@ -40,3 +45,127 @@ y los métodos públicos "getInstance()", "initCallbacks()" y "refrescarVentana(
}
</code></pre>
</details>
# Segunda práctica
## Explicación de los cambios realizados
### 1. Renderer
Se han encapsulado todas las llamadas a métodos de OpenGL como métodos del singleton `Renderer`.
![
Diagrama UML de la clase PAG::Renderer.
Se muestra que es un singleton con el método estatico getInstance()
y los métodos clear(), setClearColor() y setViewport()
](img/pr2/1_renderer_uml.png)
<details>
<summary>Código plantuml del diagrama</summary>
<pre><code>@startuml
set separator ::
class PAG::Renderer <<singleton>> {
{static} + getInstance() : Renderer &
+ clear()
+ setClearColor(rgb : float[3])
+ setViewport(width : int, height : int)
}
@enduml
</code><pre>
</details>
### 2. GUI y ventanas
Se han encapsulado la inicialización, renderizado y finalización de ImGui en el singleton `GUI`.
Este singleton mantiene una lista de `Ventana`, una interfaz con el método abstracto `render()`.
Cada vez que se renderiza se llama este método en todas las ventanas.
Las clases que implementan `Ventana` son `VentanaLog` y `VentanaColor`
![
Diagrama UML de las clases PAG::GUI, PAG::Ventana, PAG::VentanaLog y PAG::VentanaColor.
Se muestra que GUI es un singleton y una agregación de la clase abstracta Ventana.
Se muestra que las clases VentanaLog y VentanaColor implementan Ventana.
](img/pr2/2_gui_uml.png)
<details>
<summary>Código plantuml del diagrama</summary>
<pre><code>@startuml
set separator ::
class PAG::GUI <<singleton>> {
+ addVentana(Ventana)
+ render()
}
abstract class PAG::Ventana {
{abstract} + render()
}
PAG::GUI o-- PAG::Ventana
class PAG::VentanaLog {
+ render()
}
PAG::Ventana <|-- PAG::VentanaLog
class PAG::VentanaColor {
+ render()
}
PAG::Ventana <|-- PAG::VentanaColor
@enduml
</code></pre>
</details>
## 3. Color listener
Para que el color de fondo de la pantalla (controlado por `Renderer`) cambie dependiendo de `VentanaColor` se ha seguido el patrón observador.
La gestión de este patrón la realiza completamente la clase abstracta `Ventana`, las clases que heredan de ella solo tienen que llamar el método `notifyListeners()` para avisar a todos los subscriptores.
Los subscriptores han de implementar la interfaz `Ventana::Listeners` y apuntarse a la ventana que desean observar con el método `addListener()`. Cuando ocurra una notificación la ventana llamará al método `wakeUp` de los listeners pasándole una referencia a si misma.
Los observadores pueden ver qué subtipo de ventana le ha notificado usando `dynamic_cast`.
![
Diagrama UML de las clases Ventana, Ventana::Listener, VentanaColor y Renderer.
Se muestra que Ventana tiene el método público addListener() y el método protegido notifyListeners().
Se muestra que Ventana es una agregación de Ventana::Listener, que Renderer implementa Ventana::listener y que VentanaColor hereda de Ventana.
](img/pr2/3_listener_uml.png)
<details>
<summary>Código plantuml del diagrama</summary>
<pre><code>@startuml
set separator ::
abstract class PAG::Ventana {
+ addListener()
---
# notifyListeners()
}
abstract class PAG::Ventana::Listener {
{abstract} + wakeUp(ventana : Ventana &)
}
PAG::Ventana o-right- PAG::Ventana::Listener
class PAG::VentanaColor {
+ getColor() : float[3]
}
PAG::Ventana <|-- PAG::VentanaColor
class PAG::Renderer {
+ wakeUp(ventana : Ventana&)
}
PAG::Ventana::Listener <|-- PAG::Renderer
@enduml
</code></pre>
</details>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment