[Devlog] Vircon32: Creando mi propia consola

carra

Este será (de momento) el último tutorial de efectos gráficos. Más que ser un efecto, lo que muestro es una manera de dibujar polígonos en 3D en una consola que sólo puede hacer 2D. Por las limitaciones de Vircon, esta técnica sólo permite hacer polígonos planos sombreados, pero sin texturar.

Antes de que nadie se ilusione, la consola no va a dar para mucho en cuanto a dibujar polígonos (en el ejemplo el uso de CPU llega al 90%). Aunque también es cierto que el código no está muy optimizado, pero he preferido escribir un código más claro y fácil de leer.

Este es el enlace al código en GitHub.

5 1 respuesta
AikonCWD

#301 qué bonito!

aunque a poco que se pueda pintar en pantalla, siempre se podrá hacer fake-3d. A ver quien es el valiente que se anima a ello.

1 2 respuestas
carra

#302 Sí, aunque por mucho que se optimize no creo que se llegue a hacer más que algo tipo StarFox (el de SNES). Hay otras técnicas que se adaptan mejor a esta consola pero ya las cubriré en su momento.

1 respuesta
eondev

#303 #302 Yo he estado leyendo bastante sobre raycasting, uso de z-map y otras técnicas para proyectar pseudo-3D (quería combinar varias técnicas como el uso de fov para dar prespectiva según el ángulo de cámara, lo que da una sensación de profundidad que no te da un motor poligonal y raycasting).

Lo bueno es que se necesitan muy pocos recursos y aprendes mucho, y usando un lab (que es como lo veo) como vircon32 para trastear es lo ideal.

Una de las pocas dudas que tuve viendo la documentación es por qué limitar la máquina a 9Mhz. Son suficientes para hacer una máquina para juegos retro pero: por qué esa velocidad de reloj y no otra más alta (digamos.. 50-100 mhz). Porq el target de tipo de juego lo hace innecesario? (Entendiendo además que hay un chip de vídeo dedicado como en las consolas)

Y otro tema, hablando de memoria y a falta de ver la implementación de la API de vídeo, hay un conjunto de comandos/instrucciones para el chip de vídeo así como lo hay de la CPU no? No he visto documentación detallada como lo hay de la CPU. La implementación de funciones custom/shaders es algo muy complejo?

Funciona directamente abstrayendo opengl o realmente hay una emulación real del chip gráfico y de todo su pipeline?

Son preguntas por pura curiosidad, la verdad. Me parece una pasada todo lo relacionado al proyecto xD.

1 1 respuesta
carra

#304 Pues te contesto por partes. Sí, va a haber una documentación completa del chip de video y de los demás. Pero aún no la he escrito. Tengo muchas cosas entre manos, a ver si llego a ello! Pero sí, cada sistema de la consola está modelado como su propio chip. Aunque no llegan a un nivel tan bajo como la CPU. El chip gráfico por ejemplo, está pensado para que se implemente con librerías modernas tipo OpenGL/DirectX/Vulkan pero de forma muy simple y dando bastante libertad de cómo hacerlo. Por eso se limita a operaciones muy básicas como dibujar imágenes y no baja al nivel de cómo se debe manejar cada pixel, cómo se debe implementar el buffer de pantalla, o cuál debe ser el timing para las operaciones de dibujo. Si exigiera en cambio poder tener acceso directo a la memoria de video, estas cosas sí deberían tenerse en cuenta y la consola se volvería más compleja.

En cuanto a la velocidad de CPU, hay 2 motivos para que esté limitada. El principal es rendimiento. Mi equipo es potente (Core i7, 16GB RAM, etc) y el límite que pude alcanzar en mis pruebas fue de unos 43.5 MHz. Si se quiere poder ejecutar Vircon en Raspberrys o móviles ese rendimiento hay que bajarlo bastante más. De todas formas, a diferencia de otras CPUs, en Vircon cualquier instrucción se realiza en ún único ciclo (incluso las operaciones trigonométricas o los accesos a memoria), con lo cual hay más potencia de lo que puede parecer.

El otro motivo es que Vircon32 pretende ser una consola orientada al 2D. Se van a poder hacer juegos completos con técnicas pseudo-3D (por ejemplo Raycasting u scaling) pero esta consola tampoco pretende enfocarse en ello. Para hacer experimentos de este tipo ya existen sistemas como Pico8 y TIC80, y Vircon aunque lo permite está más enfocada en ser muy accesible (es decir, lo más simple posible) y dar buen soporte a juegos. Por eso características como los 4 pads, 7 botones, memory card, etc.

1 1 respuesta
eondev

#305 Sí, entendía que al hacerse cálculos complejos en un solo ciclo 9 Mhz daban de sí, pero tenía curiosidad de por qué. Veo que emular un modelado de hardware completo es costoso.

Lo que me gusta como dices que al ser tan accesible y simple en diseño puedes hacer cosillas sin una curva alta de aprendizaje y además con la sensación romántica de estar haciendo algo artesanal.

#305carra:

El chip gráfico por ejemplo, está pensado para que se implemente con librerías modernas tipo OpenGL/DirectX/Vulkan pero de forma muy simple y dando bastante libertad de cómo hacerlo. Por eso se limita a operaciones muy básicas como dibujar imágenes y no baja al nivel de cómo se debe manejar cada pixel, cómo se debe implementar el buffer de pantalla, o cuál debe ser el timing para las operaciones de dibujo.

Esto no lo he llegado a entender. Te refieres a implementación por tu parte de cara al host, ¿no? Entiendo que si es así, el uso de shaders sencillos no es posible que sean pasados directamente al host, o si?

1 respuesta
carra

#306 A ver si te sé responder. Digamos que en términos de video y audio, Vircon32 sigue un modelo de alto nivel, donde los conceptos que se manejan son texturas, regiones, operaciones... en lugar de definir todo a un nivel muy bajo y trabajar directamente con pixels, colores, memoria, etc. Al trabajar a un nivel más alto no se necesita definir ni aprender tantos elementos ni tantos procesos. Es una manera de simplificar, pero aún así permite tener los gráficos y sonidos que los juegos necesiten. Si usáramos un modelo de más bajo nivel habría más flexibilidad a la hora de usar todo tipo de efectos y hacks, pero eso tiene un costo que puede ser elevado. Para mi como creador del proyecto, para quien quiera aprender a hacer juegos y para quien pueda estar interesado en crear sus propios emuladores o herramientas.

Lo que comentas sobre shaders no lo he entendido del todo. En los gráficos de Vircon32 no hay ningún tipo de shader. De hecho ni siquiera mi emulador implementa nada usando shaders: lo hace todo con la pipeline antigua de OpenGL, porque para esto no son necesarios. Además centrarse en APIs más antiguas también garantiza que incluso en equipos más viejos o en sistemas embebidos se podría usar algo tipo OpenGL ES para implementarlo. Aunque también hay la opción de usar shaders si se prefiere, claro.

2 1 respuesta
eondev

#307 me ha quedado todo claro. Gracias por el pedazo trabajo! (se me había olvidado responder lol)

1 respuesta
carra

#308 No pasa nada, gracias a ti por interesarte :thumbsup:

Acabo de subir la nueva versión del emulador, tanto en la web como en itch.io. Esta versión ya tiene los iconos y las propiedades de los ejecutables, y además viene con los atajos de teclado que habíamos dicho. Y el emulador en sí ya se llama Vircon32.exe.

1
carra

Acabo de actualizar la web para que se muestren también los últimos tutoriales que he ido creando. También le he puesto ya al canal de youtube la URL personalizada (https://www.youtube.com/c/Vircon32).

Por otra parte estoy trabajando en la nueva versión del compilador, que añade un par de características más del lenguaje C. Mi intención es poder publicarlo antes de anunciar la jam, para hacerlo todo un poco más accesible. También tendré que actualizar la guía del compilador.

4
Ridote

Imagino que no te pones todos los días pero, por curiosidad, si tuvieras que coger y hacer una media de horas semanales que le echas a la vircon, cuántas horas dirías que le echas? Te lo estás currando un huevo, mucho ánimo.

1 1 respuesta
carra

#311 Gracias tío! Pues ha habido semanas que bastante, es lo que tiene no tener hijos ni pareja, y llegar a una edad que ya no se sale como antes con los amigos (niños y otras cosas). También el tener un curro que me deja cierto tiempo por las tardes... Y bueno no hace falta decir que todo lo de la pandemia también me ha hecho poder dedicarle más horas. Pero vamos que al final también perreo bastante como todo el mundo jaja. Lo que pasa es que después de perrear un rato me suelo poner otro rato a hacer algo.

1 1 respuesta
Ridote

#312 bueh pero teniendo ya curro si te pones y curras tiene un meritazo, no te quites mérito. Y más si no abandonas por cualquier otra chorrada, que la gente(yo) en cuanto se complica un poco el proyecto o se aburre cambia a otra cosa.

1
carra

Ayer ya terminé la nueva versión del compilador e hice algunas pruebas, tiene buena pinta. Esta tarde intentaré hacer una buena batería de pruebas (por suerte ya voy teniendo bastante software para compilar) y actualizar las guías, y ya podré subir la nueva versión. Cuando lo haga os explicaré las novedades que trae. Y el plan es que una vez hecho eso ya crearé la jam en itch.io y lo moveré un poco por si conseguimos que se apunte alguien más :grin:

1
thenanox

oka, yo procurare ser firme a mi compromiso, aunque empiezo a tener que saber que dia podria ser porque los planes acechan

1 1 respuesta
carra

#315 La idea es ponerla del 11 al 20 de marzo. Son 10 días, e incluye 2 fines de semana

1
carra

Nueva versión del compilador de C

Ahora sí. Ya lo he subido a la web junto con su código fuente.
También están actualizadas las guías del compilador, en español y en inglés.

Hay varias novedades importantes:

  • Ya se pueden usar enumerados
    Muy útil, ya que no hay implementadas constantes. Además es una manera más fácil de definir las texturas y sonidos del juego, que siempre tienen IDs consecutivas, en vez de hacer 20 #defines.
  • He añadido switch, case y default
    Antes la selección de escenas o máquinas de estados las hacía encadenando if-else, porque no había otra cosa. Ahora quedará mejor.
  • También he puesto etiquetas y goto
    En teoría no se deberían usar pero ya que C los soporta, pues por si acaso. Podría haber situaciones en las que simplifique el flujo.
  • Las estructuras y arrays ya se pueden inicializar con listas
    Ya podemos declarar los típicos arrays: int[ 3 ] Array = { 1, 2, 3 }; También viene bien para estructuras o datos compuestos como vectores. Esto va a ahorrar muchas líneas de código.
  • Las estructuras y uniones se pueden autoreferenciar
    Ahora se podría hacer la típica estructura de nodo para una lista, que contiene un puntero al nodo siguiente. Aún así recordad que no tenemos por ahora funciones de memoria dinámica (malloc/free).
  • He actualizado los includes
    No es la gran cosa pero he incluido un par de funciones nuevas: en video para extraer las componentes R/G/B/A de un color, y en audio para poder manejar el volumen global (y no canal por canal), que es algo que se me había quedado en el tintero hasta ahora.

Bufff. Me voy a ir a tomarme un descanso por hoy :sweat_smile:

4 1 respuesta
r2d2rigo

#317 podrias hacer alguna herramienta que generase un .h a partir del XML de recursos? Por tener las IDs un poco mas tipadas que lo que hay ahora.

1 respuesta
carra

#318 Sí, no sería muy difícil. De hecho herramientas de este tipo las podría crear cualquiera (no solo yo). Lo que no sé es si merecería la pena, al fin y al cabo no te va a ahorrar más que unos pocos segundos a no ser que tengas una gran cantidad de texturas o sonidos. Otra cosa es que ya nos metiéramos a generar más cosas, como por ejemplo el script make o alguna otra, a lo mejor entonces le vería más utilidad. Pero vamos todo sería verlo

1 respuesta
r2d2rigo

#319 ahora me voy a ver obligado a hacerlo yo 🤷‍♂️

1 1 respuesta
Traber

#320 En c# espero

1 respuesta
r2d2rigo

#321 .NET 6 que es la LTS, hombre!

1
r2d2rigo

Doblepost para decir que dicho y hecho: https://github.com/r2d2rigo/resgen-vc32

Release aqui: https://github.com/r2d2rigo/resgen-vc32/releases/tag/v1.0.0

Espero que os sea de utilidad!

2 1 respuesta
carra

#323 Madre mía que rapidez jeje.

Lo acabo de probar, me ha hecho instalar el runtime de .Net 6, como dice el Readme, y después de eso ya funciona. Le he metido el XML más tocho que tengo, que es el de Triple Bubble (12 texturas y 29 sonidos), y parece que funciona bien :thumbsup:

Os recuerdo también que si ya usáis el compilador nuevo, ahora podríais hacer estas definiciones simplemente así:

enum GameTextures
{
    TextureA,
    TextureB,
    ...
};
carra

Pues la herramienta que se programó r2d2rigo me dio una idea. Al crear un juego una de las partes más pesadas de hacer es definir las regiones dentro de cada textura. Si se pudiera hacer un editor decente para crearlas visualmente se podría ahorrar bastante tiempo. Me he puesto a hacer algunas pruebas en .Net y este es el concepto que manejo de momento.

Aún no tengo del todo claro que vaya a poder hacer esto: necesito modificar el control que muestra la imagen para que no lo suavice, y ver si se podría dibujar encima el rectángulo de la región y editarlo con el ratón. Si ya se pudiera hacer zoom y panning, mejor aún. Quizá haya un control de este tipo ya hecho por algún lado?

4
carra

Vale ya he visto como hacerlo, no era tan complicado :grin:
Estaría guapo que me de tiempo a tenerla acabada para la jam, pero no lo puedo prometer

carra

Hoy o mañana voy a dejar creada la jam en itch.io (lo anunciaré en el hilo de la jam). Pero antes de eso quería crear un nuevo video de presentación para la web. El que había era ya muy antiguo y todavía decía que no había ningún juego terminado cuando ya hay 3 :unamused:

Así cuando la gente venga a visitar la web desde la jam les damos un poco de hype jaja

5
thenanox

la verdad que no se agradece lo suficiente todo el trabajo que haces (bueno en la taberna te ponemos a parir :p)

que lo lleves solo me parece algo que requiere de una dedicacion brutal. ole

1 1 respuesta
carra
#328thenanox:

(bueno en la taberna te ponemos a parir :p)

Ya, estoy aguantando pero cualquier día me echáis a patadas :rofl::sweat_smile:

Pero gracias tío, la verdad es que se agradece bastante ver interés y apoyo. Yo empecé este proyecto porque a mí me gusta mucho y seguiré con la consola aún si yo fuera el único que la usa, pero también es verdad que si me lo tomara solo así se perdería mucho. Si fuera solo para mi me lo podría tomar con un ritmo más tranquilo, no hacer tanta documentación o tutoriales... pero lo bonito de estas cosas es cuando se llega a formar una pequeña comunidad. Por eso, cuando veo interés sí me gusta intentar ir un poco más allá aunque me sea más sacrificado a veces. Y si he prometido hacer algo me gusta intentar cumplirlo, porque si no demuestro interés yo tampoco tienen por qué hacerlo los demás.

2
carra

Ya que va faltando menos para la jam os cuento que lo que estoy haciendo estos días es tratar de tener un par de cosas terminadas para antes de que empiece. Parece que me puede dar tiempo si me lo curro. Por un lado está el editor visual de regiones para las texturas que os enseñé. Lo estoy haciendo en .Net muy básico: versión 2012, Windows forms. Con esto, aunque solo sería para Windows, quizá haya opciones de que sea portable usando Mono (lo desconozco).

Por otro lado también estoy escribiendo una guía sencilla sobre el lenguaje C. Siempre a nivel básico y orientada a lo que se hace en la consola claro, si alguien quiere aprender todo C es mejor que busque tutoriales completos. Pero puede ayudar a gente como Aikon que quiera hacer algo en la consola pero el no conocer el lenguaje C les puede echar para atrás.

2 1 respuesta