Dentro de la DCJAM 2016, hay una segunda entrada que se corresponde a un trabajo del grupo español Jumble! Devs , llamado DreamCrawler!!
Es una demo técnica en 3D en que controlamos a un robot en una especie de laberinto 3D. Según nos comentan, es su primer desarrollo Dreamcastero y querían probar las capacidades de la consola. Están muy satisfechos, y seguro que nos sorprenderán en un futuro cercano!!
La forma de trabajar con los modelos en la demo es muy simple, funciona de la siguiente manera:
1. El diseñador modela en Blender y hace las texturas en Gimp. Exporta un fichero OBJ con la malla y un PNG con la textura.
2. Usando el conversor de recursos convierte los ficheros OBJ y PNG a los que soporta el motor de la demo. Como es una demo muy simple, los formatos también lo son.
Para las texturas, guardamos el ancho, alto y la información de color (como un fichero TGA). Para las mallas, guardamos el número de vértices, sus posiciones, sus coordenadas de textura, sus vectores normales y los índices de cada triangulo.
Y los métodos que implementan la conversión son MeshToStaticModel() para los modelos y ImageToRaw() para las texturas.
3. Una vez ya en el motor, cargamos los modelos y texturas desde el sistema de archivos. El método de carga es el mismo que el de exportación pero a la inversa: leemos desde el sistema de archivos (CD-ROM, o si usasemos dc-load podríamos cargar directamente por LAN o serie!) en lugar de escribir.
Para las texturas, leemos su ancho y alto y reservamos espacio en memoria para cargar los datos de color, y espacio en la memoria del PVR para cargar la textura. Cargamos la textura en RAM y la copiamos a la VRAM.
Para las mallas, leemos el número de elementos y reservamos memoria para almacenar cada uno de sus componentes: triángulos, coordenadas de textura, vectores normales e índices. Leemos los bloques que corresponden a cada uno, y ya estamos listos para mandar los datos al PVR para que los dibuje.
El código de la carga de recursos está aquí, y las funciones que se encargan son resources_load_texture() y resources_load_mesh():
Aunque tal y como está no tiene prácticamente nada, es una base para ir añadiendo mejoras como:
· Cargar animaciones de escala, posición y rotación.
· Cargar huesos para hacer animación esqueletal.
· Optimizar las estructuras de datos para reducir el espacio a costa de la precisión y acelerar la carga desde el CD.
· Guardar las texturas comprimidas en PVRTC para utilizar la mínima VRAM posible.
· Y muchas más cosas que pueden ir surgiendo durante el desarrollo
Espero que te haya sido útil, si tienes cualquier duda no dudes en preguntar!!