[Devlog] Vircon32: Creando mi propia consola

carra

#719 Muy avanzado eso! De momento esta es mi "gestión de paquetes" :rofl:

// start include guard
#ifndef MAPCOLLISIONS_H
#define MAPCOLLISIONS_H

// ensure dependencies are present
#ifndef BOX_H
  #error "library box.h needs to be included before this one"
#endif

#ifndef TILEMAP_H
  #error "library tilemap.h needs to be included before this one"
#endif

#720 Sí, realmente debería ser aleatorio. Pero quiero asegurarme de que sea muy fácil de seguir. Creo que bastante tiene la gente con averiguar cómo hacer un juego de Vircon. Y además, si no lo supiera yo antes no os podría preparar el ejemplo :wink:

Sawi

¿Cuál es el tamaño ideal máximo de una textura en Vircon32?

Hoy no puedo ponerme a programar, pero estoy dándole vueltas al coco.

No sé si intentar gestionar todos los sprites del juego desde una textura grande ( no van a ser muchos) y definir diferentes regiones o meter varias texturas.

¿Quizás es más cómodo lo de una única textura grande por lo que veo en los ejemplos básicos?

1 respuesta
carra

#722 Las texturas pueden ser de hasta 1024 x 1024 pixels. Si te cabe todo en una genial, no tienes que estar cambiando texturas en el código. Si no, yo lo que hago es separarlo por partes "grandes". Por ejemplo, una para el gameplay y otra para otras cosas (título, menús...).

Por cierto te recuerdo que existe el editor de regiones si no las quieres definir a mano.

2 1 respuesta
Sawi

#723 Posiblemente lo haga a mano, estoy viendo como referencia el código de Tutorial-Shooter y posíblemente divida así mis texturas, una grande para el fondo, y en la otra los gameobjects. 👍

1 respuesta
carra

#724 No me parece mala idea. Estoy intrigado, a ver qué idea habrás tenido jeje

1 respuesta
Sawi

#725 Pues ya he empezado. Vas a flipar con el spaghetti code que te estoy montando 😂

Alguien tiene que ser el pionero que haga las cosas en modo cutre en Vircon32 😎

1 1 respuesta
carra

#726 Bueno publicar el código tampoco es obligatorio jejeje. De momento con que funcione nos vale 😉

1
1 mes después
carra

Bueno me he tomado bastante descanso estas semanas. Acabé saturado con las 2 jams, la charla, la librería de colisiones, el ejemplo para mi jam y otras cosas en poco tiempo. Este sábado di la segunda parte de la charla, y ya de momento no tengo más compromisos. La subiré a YouTube cuando me pasen la grabación.

Además estoy empezando a traducir las especificaciones de la consola al español. Ya está subido el primer documento.

10
7 días después
carra

Ya hay disponibles 3 documentos de la especificación en español: los de definiciones, arquitectura y CPU.

Por otro lado, a petición de un par de personas en Discord, he creado también una bios alternativa que arranca directamente sin mostrar el logo de la consola. Es una bios pensada para programadores, que suelen tener que hacer muchas pequeñas pruebas rápidas. Con esta bios pueden hacerlo sin tener que esperar a la animación del logo cada vez.

Podéis hacer que el emulador use esta bios editando el archivo Settings.xml.

5
8 días después
carra

Subido el 4º documento de especificación en español: la GPU. También he hecho alguna pequeña corrección y mejora en el documento en inglés.

Además de esto, se han interesado un par de personas en programar la consola en ensamblador. Me estuvieron preguntando algunas cosas así que estoy empezando a plantear una futura guía de programación en assembler.

6
carra

Noticias varias de fin de año jaja. Por un lado sigo con la traducción de las specs, ya está disponible en español la del chip de sonido (parte 5).

En cuanto a ports del emulador hay una noticia buena y una mala. La buena es que gracias al trabajo de Chandler Kluser ahora se puede usar Vircon32 en Arch Linux. Hizo un paquete AUR para el emulador, así que para quien tenga un gestor como yay bastaría este comando para compilar e instalar:

yay -S vircon32-desktop-emulator-git

La mala noticia es que el iMac que me venían prestando ya no lo voy a tener disponible, así que en futuras versiones ya no voy a poder crear binarios para Mac ni tampoco testear que las cosas funcionen ahí. Bueno, al menos ya había versiones hechas que se siguen pudiendo usar...

2 3 respuestas
Jastro

#731 no paras de hacer cosas eh?

Al final vircon va a estar en todos lados

1 1 respuesta
carra

#732 Esa es la idea! :smiley: Me gustaría que sea lo más universal posible.

Y porque no tengo los medios, que si no ya estaría preparando versiones para móvil, una versión hardware FPGA, un backend de LLVM para hacer compiladores... Todo eso ya para cuando no tenga que trabajar jaja

1
r2d2rigo

#731 illo montante una pipeline en el cloud y automatizar las builds de macOS.

1 1 respuesta
willy_chaos

#731 y montarte un hackintosh en una VM?

la verdad es que cada vez que entro en el hilo veo el currazo y sinceramente... envidia sana de tener tanto conocimiento

1 1 respuesta
carra

#734 #735 Pues supongo que alguno de esos métodos podría funcionar, aunque la verdad ni idea de cómo se harían jeje. Ya lo intentaré mirar con más tiempo, de momento tampoco me es urgente.

carra

Estoy echando un vistazo al renderer de SDL2 para ver si Vircon32 se podría implementarse con él. Si no me equivoco (aún tengo que probarlo), parece que permite el dibujo básico de quads con textura, y que soporta modulación de color y diferentes modos de mezclado.

Esto podría hacer que el núcleo libretro de Vircon32 funcione en muchos más aparatos, porque las consolas de emulación baratas no suelen soportar OpenGL. Eso sí, no sé si con esta opción el rendimiento permitirá jugar bien.

Además parece que las cosas se están activando de nuevo para llevar Vircon32 a las builds automáticas de libretro. Hace un par de días subieron este video presentando un poco la consola.

A raíz de eso alguna web va poniendo algún artículo sobre la consola, como este (web italiana, pero os la pongo con el traductor).

3 2 respuestas
Jastro

#737 felicidades! estas cogiendo mucha repercusión :D

Dentro de poco, debido al exito desapareces del foro xD

1 1 respuesta
r2d2rigo

#737 yo te recomiendo que no te metas en el render basico de SDL2, es un cristo tremendo para el poco beneficio que creo que te daria.

1 respuesta
carra

#738 Jajaja esperaré a su máxima fama, y entonces ya abandono :stuck_out_tongue_closed_eyes:

#739 Es que en mi caso podría ser sencillo de hacer. El módulo gráfico lo tengo separado, lo único que hago es dibujar rectángulos, y las coordenadas ya vienen calculadas de la consola. Al menos haré algunas pruebas.

carra

Ya están traducidas al español las partes 6 (chips controladores) y 7 (resto de chips de la consola) de la especificación. Ya sólo faltan 2 más.

También he estado haciendo algunos experimentos con el renderer genérico de SDL2. Pude llegar a hacer esta prueba de concepto. Soportaría rotación y escalado, texturas, blending modes y modulación de color, así que parece que sí se podría implementar Vircon32 de esta forma.

Lo malo es que no veo una manera de usar este sistema para hacer un core libretro con gráficos SDL. Todos los cores que he visto, o bien usan librerías 3D (OpenGL/DirectX/Vulkan, es decir, lo que yo estaba haciendo ya), o bien dibujan los píxeles manualmente. Así que en principio para Retroarch no lo usaría. Pero sí podría ser interesante hacer una versión de mi emulador que no requiera OpenGL.

Por cierto, hubo también una persona en Discord que se ofreció para crear builds de Mac si actualizo versiones.

6
8 días después
carra

Por fin, toda la especificación de la consola está ya disponible en la lengua de Cervantes. Ya he añadido las partes que faltaban: 8 (elementos externos) y 9 (formatos de archivo). Con esto ya me puedo olvidar de las specs, podría salir algún retoque pero ya serían temas menores. Aún no tengo muy claro el planning que seguiré a partir de ahora, tengo varios frentes abiertos y aún no he recuperado la motivación al 100%.

Lo más inmediato será hacer algún video para YouTube, sobre todo el de la 2ª jam. Ya os adelanto que en adelante el canal lo voy a enfocar más en el inglés. No puedo estar haciendo los videos en 2 idiomas, y en español la mayoría estáis siguiendo ya las novedades por aquí.

5 1 respuesta
thenanox

#742 quizas es un pelin offtopic, pero solo decirte que el tema de la motivacion yo no se como lo haces, pero eres un ejemplo. no se si te ayudara pero al menos queria comentartelo

todos somos humanos y siempre caemos por momentos. ademas, mas alla de la chorrada de blue monday, estas fechas suelen ser malas.

yo creo que vas por el buen camino.

PD: moverte a ingles es lo mejor, pero es cierto que la lengua de cervantes te ayudara tambien con la comunidad sudamericana, asi que veo bien al menos lo que no son videos mantener los dos

1 respuesta
carra
#743thenanox:

quizas es un pelin offtopic, pero solo decirte que el tema de la motivacion yo no se como lo haces, pero eres un ejemplo. no se si te ayudara pero al menos queria comentartelo

Eso siempre ayuda! Gracias :) Pues a veces me tengo que obligar, pero la cosa es tener costumbre de tratar de sacar las cosas adelante. Aunque sea sólo un poquito cada día. Pero también es muy importante saber elegir a lo que dedicarse.

Llega un día en que te das cuenta que necesitas elegir. En el tiempo que tienes en esta vida es imposible que vayas a hacer todo lo que te gustaría. Vas a tener que ser muy selectivo, y eso significa que vas a tener que renunciar a proyectos e ideas muy buenas para poder quedarte solo con los 3 o 4 mejores. Porque más que eso no vas a poder manejar si tienes una vida normal (trabajo, etc).

En esto sí se cumple eso de "menos es más".

8
carra

Al fin he conseguido hacer el video sobre la segunda jam (en inglés, con subtítulos en español). Como hay pocos juegos aprovecho también para hablar de cosas que ha hecho la comunidad, aunque ya las comenté por aquí en su día.

5 1 respuesta
Sawi

#745 uhhh, esta tarde lo veo jaja.

1
13 días después
carra

Acabo de crear una nueva versión de las herramientas de desarrollo de la consola.

El compilador cambia muy poco, pero el ensamblador ha recibido varias cosas. Antes el ensamblador era más limitado, y estaba pensado más que nada para dar servicio al compilador. Pero como ha habido gente interesada en escribir programas directamente en assembler, lo he ampliado con varias cosas.

Ahora tiene un preprocesador, con lo cual soporta directivas varias:
%include --> para separar el proyecto en varios archivos
%define --> sustituye al viejo define, y permite algunas cosas más
%ifdef, %ifndef, %else, %endif --> para ensamblar condicionalmente
%error, %warning --> permite mensajes personalizados

Además ahora ya se reconocen los valores true/false, y en las cadenas pueden escaparse caracteres con sus códigos en hexadecimal. Por ejemplo: "\x41" == "A".

Lo siguiente que quiero hacer es escribir una pequeña guía de programación en ensamblador, y con eso ya voy a considerar terminada la parte del ensamblador para centrarme en otras áreas (salvo posibles bugs, como siempre).

5
carra

Me he comprado esta consola, una Anbernic RG552. Parece una máquina decente para emular retro. Voy a intentar meterle el emulador de Vircon32, y así me puedo crear una "versión portátil" de la consola.

En principio tiene todo lo necesario: la pantalla es panorámica, soporta OpenGL y puede usar tanto Android como Linux. Trastearé un poco a ver si puedo compilar mi núcleo de libretro, porque aunque ya tengo versiones Windows, Linux y Mac, el Android ni lo he tocado nunca hasta ahora.

8
carra

Listo, he podido portar e instalar el núcleo libretro de Vircon32 en esta consola. No puedo postear videos directamente aquí, pero le podéis echar un ojo al video que he colgado en Twitter:

Con esto no sólo tengo ya la primera versión "física" de Vircon32, sino que ya se puede jugar también en Android :smiley:.

También he actualizado el repo para que el script CMake permita compilar para Android. Y ya puestos he creado una versión donde os podéis descargar el núcleo directamente para varios sistemas. Lo tenéis aquí.

EDIT: Gracias a gente de Discord ahora también funciona en MacOS, iOS y tvOS.

9
carra

He estado trabajando en tratar de optimizar mi núcleo libretro, porque ahora mismo en consolas portátiles (como mi Anbernic) algunos juegos se pueden ralentizar. Pero ha pasado algo extraño que no soy capaz de resolver. Lo escribo aquí por si alguien sabe lo que pasa.

Estoy usando OpenGL ES 3 bajo Android. De momento el núcleo de Vircon32 funciona básicamente dibujando quads con textura de uno en uno. Para ello estoy usando 2 Vertex Buffers (VBOs): uno para las posiciones de los vértices y otro para las coordenadas de las texturas. Si defino estos buffers con el tamaño necesario para dibujar un quad, la definición de cada VBO queda así:

// reservar memoria en la GPU para el VBO
glBindBuffer( GL_ARRAY_BUFFER, VBOPositions );

glBufferData
(
    GL_ARRAY_BUFFER,
    8 * sizeof( GLfloat ),
    QuadPositionCoords,
    GL_DYNAMIC_DRAW
);

// definir el formato para las posiciones de vertices
glVertexAttribPointer
(
    PositionsLocation,  // location (0-based index) within the shader program
    2,                  // 2 components per vertex (x,y)
    GL_FLOAT,           // each component is of type GLfloat
    GL_FALSE,           // do not normalize values (convert directly to fixed-point)
    0,                  // no gap between values (adjacent in memory)
    nullptr             // pointer to the array
);

glEnableVertexAttribArray( PositionsLocation );

Después los buffers se modifican usando glBufferSubData cuando es necesario y todo funciona bien.

Sin embargo, si trato de reservar más espacio en esos VBOs (por ejemplo cambiando ambos buffers a 20 * 8 * sizeof(GLfloat)) ¡ahora los juegos se ralentizan! Y tened en cuenta que ese ha sido el ÚNICO cambio. El tamaño extra no lo he usado todavía, y esto no es ni siquiera un tamaño muy grande para un buffer de OpenGL. Llevo horas intentando ver lo que pasa, así que si alguien tiene una idea, toda ayuda es bienvenida.

3 1 respuesta

Usuarios habituales